48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
type EnumDefinition = Record<string, string>;
|
|
type EnumBlock = Record<string, EnumDefinition&{_:string}>;
|
|
type RecursiveObject<Obj extends EnumBlock> =
|
|
{
|
|
[F in keyof Obj]:
|
|
{
|
|
[E in keyof Omit<Obj[F], "_">]:RecursiveObject<Obj>
|
|
}
|
|
}
|
|
|
|
function Block<Fields extends EnumBlock>(options:Fields):()=>RecursiveObject<Fields>
|
|
{
|
|
return ()=>{
|
|
const list = [];
|
|
let fieldLookup = {};
|
|
|
|
const proxyOuter = new Proxy(function(){
|
|
return list;
|
|
}, {get(_target, propName){
|
|
fieldLookup = options[propName];
|
|
if(fieldLookup)
|
|
{
|
|
list.push(fieldLookup._);
|
|
}
|
|
return proxyInner
|
|
}});
|
|
|
|
const proxyInner = new Proxy({}, {get(_target, valName){
|
|
list.push(`:${fieldLookup[valName]};`);
|
|
return proxyOuter;
|
|
}});
|
|
return proxyOuter;
|
|
}
|
|
}
|
|
|
|
const styles = Block({
|
|
Pos:{_:"position", Abs:"absolute", Rel:"relative"},
|
|
Display:{_:"display", Flex:"flex", Grid:"grid", None:"none", Block:"block", InlineBlock:"inline-block"}
|
|
});
|
|
|
|
function Sheet<UserClasses extends Record<string, ReturnType<typeof styles>>>(userClasses:UserClasses):{[Class in keyof UserClasses]:string}
|
|
{
|
|
return new Proxy({}, {get(_target, className){}});
|
|
}
|
|
|
|
|
|
console.log(styles().Display.Block.Pos.Abs())
|