type ValueSignature = (...args:number[])=>void type EnumDefinition = [property:string, options:Record, values?:Signature]; type EnumBlock = Record>; type RecursiveObject> = { [F in keyof Obj]: Obj[F][2] extends Sig ? ((...args:Parameters)=>RecursiveObject&Array>)&{ [E in keyof Obj[F][1]]:RecursiveObject&Array> } : { [E in keyof Obj[F][1]]:RecursiveObject&Array> } } function Block>(options:Fields):()=>RecursiveObject { return ()=>{ const list = ["@media(min-width:0px){"]; let fieldLookup = {}; const proxyOuter = new Proxy( function(...args) { console.log("outer: core call", ...args) return list; }, { get(_target, propName) { console.log("outer: reading property", propName); const sizeCheck = parseInt(propName) if(sizeCheck) { list.push(`}@media(min-width:${sizeCheck}px){`); return proxyOuter; } fieldLookup = options[propName]; if(fieldLookup) { list.push(fieldLookup[0]); } return proxyInner; } } ); const proxyInner = new Proxy( function(...args) { console.log("inner: core call", ...args) list.push(`:${args.join(" ")};`); return proxyOuter; }, { get(_target, valName) { console.log("inner: reading property", valName); try { list.push(`:${fieldLookup[1][valName]};`); return proxyOuter; } catch(e) { console.warn("someone is trying to stringify a style proxy"); return ()=>"[StyleProxy]"; } } } ); return proxyOuter; } } const styles = Block( { Pos:["position", {Abs:"absolute", Rel:"relative"}], Display:[ "display", {Flex:"flex", Grid:"grid", None:"none", Block:"block", InlineBlock:"inline-block"}], Left:[ "left", {Auto:"auto"}, (left)=>{}] } ); const userDeclaredStyleBlock = styles() .Pos.Abs .Left(10) [512] .Pos.Rel .Left.Auto // internal stringification console.log(userDeclaredStyleBlock().join("")+"}"); function Sheet>>(userClasses:UserClasses):{[Class in keyof UserClasses]:string} { return new Proxy({}, {get(_target, className){}}); }