tss/main.ts
2025-10-19 20:55:01 -04:00

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())