[{"data":1,"prerenderedAt":247},["ShallowReactive",2],{"$fodmOVux-HmLrWLuwy5cvATLZ9RjYm3fsHI37-r8Qvh0":3},{"newThing":4,"project":5,"cycle":9,"sections":23,"threads":200,"otherDocs":201,"documents":203,"images":206,"archiveItems":244,"links":245},"Schema-driven DevConfigurator — the control panel renders itself from a typed config",{"id":6,"label":7,"liveBase":8},"qmap","Qmap",null,{"id":10,"num":11,"dir":12,"name":13,"title":14,"focus":15,"status":16,"statusNote":8,"created":17,"completed":8,"mode":8,"report":8,"recordless":18,"thumbnail":19,"imageCount":20,"artifactCount":21,"lastActivity":22,"hasPickup":18,"hasInitialPrompt":18},"c18",18,"c18.control-components","control-components","Control Components","Schema-driven configurator for runtime property control","unlisted","2026-03-24",false,"\u002Fcycles\u002Fqmap\u002Fc18-airy-stage.png",9,1,"2026-08-15",[24,38,48,182],{"key":25,"title":26,"empty":18,"ast":27},"why","Why",{"type":28,"children":29},"root",[30],{"type":31,"tag":32,"props":33,"children":34},"element","p",{},[35],{"type":36,"value":37},"text","qmap experiments had ad-hoc control UIs built inline in each ExperimentsApp.vue, and the q-nuxt-layer had two related but disconnected patterns: PropsMachine (flat auto-render, Nuxt-dependent) and DevControls (manual, categorized). We wanted one schema-driven configurator with categories — pass a typed data structure, get a full control panel — reusable across qmap, qflow, and design.",{"key":39,"title":40,"empty":18,"ast":41},"objective","Objective",{"type":28,"children":42},[43],{"type":31,"tag":32,"props":44,"children":45},{},[46],{"type":36,"value":47},"Build a configurator component (Configurator → ConfigCategory → ConfigProperty) that auto-renders a control panel from a categorized schema (toggle, select, color, text, range), plus a qmap config module so tuned values can be exported and frozen into wrapper components.",{"key":49,"title":50,"empty":18,"ast":51},"key-changes","Key Changes",{"type":28,"children":52},[53],{"type":31,"tag":54,"props":55,"children":56},"ul",{},[57],{"type":31,"tag":58,"props":59,"children":60},"li",{},[61,63,70,72],{"type":36,"value":62},"2026-04-16 — Landed in the ",{"type":31,"tag":64,"props":65,"children":67},"code",{"className":66},[],[68],{"type":36,"value":69},"c18-c22",{"type":36,"value":71}," batch commit (work recorded as starting 2026-03-24):\n",{"type":31,"tag":54,"props":73,"children":74},{},[75,88,124,161],{"type":31,"tag":58,"props":76,"children":77},{},[78,80,86],{"type":36,"value":79},"New ",{"type":31,"tag":64,"props":81,"children":83},{"className":82},[],[84],{"type":36,"value":85},"DevConfigurator",{"type":36,"value":87}," component in q-nuxt-layer — takes a categorized schema, auto-renders DevControlSection + DevControl* components; top-level keys are categories, nested keys are typed properties",{"type":31,"tag":58,"props":89,"children":90},{},[91,92,98,100,106,108,114,116,122],{"type":36,"value":79},{"type":31,"tag":64,"props":93,"children":95},{"className":94},[],[96],{"type":36,"value":97},"DevControlToggle",{"type":36,"value":99}," and ",{"type":31,"tag":64,"props":101,"children":103},{"className":102},[],[104],{"type":36,"value":105},"DevControlText",{"type":36,"value":107}," components filling gaps in the existing control set; ",{"type":31,"tag":64,"props":109,"children":111},{"className":110},[],[112],{"type":36,"value":113},"DevControlExport",{"type":36,"value":115}," for live preview + copy of exported config (via optional ",{"type":31,"tag":64,"props":117,"children":119},{"className":118},[],[120],{"type":36,"value":121},"exportFn",{"type":36,"value":123}," prop)",{"type":31,"tag":58,"props":125,"children":126},{},[127,129,135,137,143,145,151,153,159],{"type":36,"value":128},"New qmap ",{"type":31,"tag":64,"props":130,"children":132},{"className":131},[],[133],{"type":36,"value":134},"src\u002Fconfig\u002F",{"type":36,"value":136}," module: ",{"type":31,"tag":64,"props":138,"children":140},{"className":139},[],[141],{"type":36,"value":142},"createQMapConfig",{"type":36,"value":144}," (schema), ",{"type":31,"tag":64,"props":146,"children":148},{"className":147},[],[149],{"type":36,"value":150},"resolveConfig",{"type":36,"value":152}," (flatten to QMap props), ",{"type":31,"tag":64,"props":154,"children":156},{"className":155},[],[157],{"type":36,"value":158},"exportConfigString",{"type":36,"value":160}," (diff-only export — only props that differ from defaults)",{"type":31,"tag":58,"props":162,"children":163},{},[164,166,172,174,180],{"type":36,"value":165},"\"Config Lab\" experiment at ",{"type":31,"tag":64,"props":167,"children":169},{"className":168},[],[170],{"type":36,"value":171},"dev\u002Fexperiments\u002Fc18.control-components\u002F",{"type":36,"value":173}," consuming the layer component via a Vite alias (",{"type":31,"tag":64,"props":175,"children":177},{"className":176},[],[178],{"type":36,"value":179},"@q-nuxt-layer",{"type":36,"value":181},")",{"key":183,"title":184,"empty":18,"ast":185},"outcome","Outcome",{"type":28,"children":186},[187],{"type":31,"tag":32,"props":188,"children":189},{},[190,192,198],{"type":36,"value":191},"Working. Established the wrapper-component workflow: configure visually → export flat props → freeze into a wrapper. The Config Lab experiment became the tuning tool for later wrappers (c19's QMapDataflow rebuild, c21\u002Fc22 session maps), and DevConfigurator became the shared control system in q-nuxt-layer (",{"type":31,"tag":64,"props":193,"children":195},{"className":194},[],[196],{"type":36,"value":197},"components\u002Fdev\u002FConfigurator.vue",{"type":36,"value":199}," + Control* family), used across sister projects.",[],[202],"control-components.md",[204],{"file":202,"title":205},"Components",[207,213,217,221,225,229,233,237,240],{"src":208,"kind":209,"order":11,"caption":210,"capturedAt":211,"route":212},"\u002Fcycles\u002Fqmap\u002Fc18-isometric.png","hero","The 8-actor sample scene, isometric","2026-08-15T23:43:05.086Z","\u002Fexperiments\u002Fc18.control-components\u002F",{"src":214,"kind":209,"order":215,"caption":216,"capturedAt":211,"route":212},"\u002Fcycles\u002Fqmap\u002Fc18-topdown.png",19,"cameraPreset: topdown — one select flips the projection",{"src":218,"kind":209,"order":219,"caption":220,"capturedAt":211,"route":212},"\u002Fcycles\u002Fqmap\u002Fc18-flatland.png",20,"cameraPreset: flatland",{"src":222,"kind":209,"order":223,"caption":224,"capturedAt":211,"route":212},"\u002Fcycles\u002Fqmap\u002Fc18-highlight-all.png",21,"highlightDataflows: all — every flow lit",{"src":226,"kind":209,"order":227,"caption":228,"capturedAt":211,"route":212},"\u002Fcycles\u002Fqmap\u002Fc18-rugs-padded.png",22,"rugPadding cranked — boundaries breathe",{"src":230,"kind":209,"order":231,"caption":232,"capturedAt":211,"route":212},"\u002Fcycles\u002Fqmap\u002Fc18-labels-huge.png",23,"actorLabelScale 2.5 — presentation-size labels",{"src":234,"kind":209,"order":235,"caption":236,"capturedAt":211,"route":212},"\u002Fcycles\u002Fqmap\u002Fc18-tight-stage.png",24,"stagePadding 0 — edge-to-edge composition",{"src":19,"kind":209,"order":238,"caption":239,"capturedAt":211,"route":212},25,"stagePadding 3 — the scene floats",{"src":241,"kind":209,"order":242,"capturedAt":243,"route":212},"\u002Fcycles\u002Fqmap\u002Fc18-control-components.png",4999,"2026-08-15T16:38:19.328Z",[],[246],{"route":212,"href":8},1794599433905]