@particle-academy/fancy-cms-ui 0.0.1-dev.0 → 0.0.1-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/document/reduce.ts","../src/editor/state.ts","../src/editor/useEditor.ts","../src/document/types.ts","../src/render/css.ts","../src/react/registry.tsx","../src/react/RenderNode.tsx","../src/react/CmsPage.tsx","../src/editor/Canvas.tsx","../src/editor/LayersPanel.tsx","../src/editor/Inspector.tsx","../src/editor/Editor.tsx"],"names":["useReducer","useCallback","useMemo","jsx","Fragment","useRef","useState","useLayoutEffect","jsxs","useEffect"],"mappings":";;;;;;;;AAkBO,SAAS,UAAA,CAAW,KAAc,MAAA,EAA+B;AACtE,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,OAAO,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,OAAO,GAAA,CAAI,KAAA,CAAM,EAAE,CAAC,EAAE,MAAA,CAAO,CAAC,CAAA,KAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EACpF;AACA,EAAA,MAAM,MAAc,EAAC;AACrB,EAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACvC,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACtB,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,EAAQ,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACrC;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,GAAQ,EAAA,GAAK,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,GAAQ,IAAI,CAAE,CAAA;AACvE,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,aAAA,CAAc,KAAc,EAAA,EAAsB;AAChE,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,MAAM,KAAA,GAAkB,CAAC,EAAE,CAAA;AAC3B,EAAA,OAAO,MAAM,MAAA,EAAQ;AACnB,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,EAAI;AAC1B,IAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AAC5C,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC3B,MAAA,IAAI,CAAA,CAAE,WAAW,OAAA,EAAS;AACxB,QAAA,GAAA,CAAI,KAAK,OAAO,CAAA;AAChB,QAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,SAAA,CAAU,GAAA,EAAc,EAAA,EAAY,KAAA,EAA+B;AAC1E,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACzB,EAAA,OAAO;AAAA,IACL,GAAG,GAAA;AAAA,IACH,KAAA,EAAO,EAAE,GAAG,GAAA,CAAI,KAAA,EAAO,CAAC,EAAE,GAAG,EAAE,GAAG,IAAA,EAAM,GAAG,OAAM,EAAE;AAAA,IACnD,GAAA,EAAK,IAAI,GAAA,GAAM;AAAA,GACjB;AACF;AAEO,SAAS,MAAA,CAAO,GAAA,EAAc,EAAA,EAAY,IAAA,GAAsB,EAAC,EAAY;AAClF,EAAA,MAAM,OAAA,GAAU,CAAC,MAAA,KAA4B;AAC3C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,MAAM,CAAA;AAC3B,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,QAAQ,GAAG,CAAA;AAAG,IACZ,KAAK,aAAA,EAAe;AAClB,MAAA,IAAI,GAAA,CAAI,MAAM,EAAA,CAAG,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,QAAQ,wBAAwB,CAAA;AAClE,MAAA,IAAI,EAAA,CAAG,IAAA,CAAK,MAAA,KAAW,IAAA,IAAQ,CAAC,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,IAAA,CAAK,MAAM,CAAA,EAAG,OAAO,QAAQ,kBAAkB,CAAA;AAC5F,MAAA,OAAO;AAAA,QACL,GAAG,GAAA;AAAA,QACH,KAAA,EAAO,EAAE,GAAG,GAAA,CAAI,KAAA,EAAO,CAAC,EAAA,CAAG,IAAA,CAAK,EAAE,GAAG,EAAA,CAAG,IAAA,EAAK;AAAA,QAC7C,QAAA,EAAU,EAAA,CAAG,IAAA,CAAK,MAAA,KAAW,IAAA,GAAO,CAAC,GAAG,GAAA,CAAI,QAAA,EAAU,EAAA,CAAG,IAAA,CAAK,EAAE,IAAI,GAAA,CAAI,QAAA;AAAA,QACxE,GAAA,EAAK,IAAI,GAAA,GAAM;AAAA,OACjB;AAAA,IACF;AAAA,IAEA,KAAK,aAAA,EAAe;AAClB,MAAA,IAAI,CAAC,IAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,EAAG,OAAO,QAAQ,gBAAgB,CAAA;AACtD,MAAA,MAAM,IAAA,mBAAO,IAAI,GAAA,CAAY,CAAC,EAAA,CAAG,EAAA,EAAI,GAAG,aAAA,CAAc,GAAA,EAAK,EAAA,CAAG,EAAE,CAAC,CAAC,CAAA;AAClE,MAAA,MAAM,QAA8B,EAAC;AACrC,MAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACvC,QAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,QAAS,EAAE,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAAA,MAC7C;AACA,MAAA,OAAO;AAAA,QACL,GAAG,GAAA;AAAA,QACH,KAAA;AAAA,QACA,QAAA,EAAU,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,MAAM,CAAC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,QACjD,GAAA,EAAK,IAAI,GAAA,GAAM;AAAA,OACjB;AAAA,IACF;AAAA,IAEA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,OAAA,CAAQ,gBAAgB,CAAA;AAC1C,MAAA,IAAI,GAAG,MAAA,KAAW,EAAA,CAAG,EAAA,EAAI,OAAO,QAAQ,gCAAgC,CAAA;AACxE,MAAA,IAAI,EAAA,CAAG,MAAA,KAAW,IAAA,IAAQ,CAAC,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,MAAM,CAAA,EAAG,OAAO,OAAA,CAAQ,sBAAsB,CAAA;AACtF,MAAA,IAAI,EAAA,CAAG,MAAA,KAAW,IAAA,IAAQ,aAAA,CAAc,GAAA,EAAK,EAAA,CAAG,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,CAAG,MAAM,CAAA,EAAG;AACvE,QAAA,OAAO,QAAQ,2BAA2B,CAAA;AAAA,MAC5C;AACA,MAAA,MAAM,MAAA,GAAS,KAAK,MAAA,KAAW,IAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,GAAG,MAAA,KAAW,IAAA;AAC7B,MAAA,IAAI,WAAW,GAAA,CAAI,QAAA;AACnB,MAAA,IAAI,MAAA,IAAU,CAAC,MAAA,EAAQ,QAAA,GAAW,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAA,CAAG,EAAE,CAAA;AAAA,WAAA,IAC3D,CAAC,UAAU,MAAA,EAAQ,QAAA,GAAW,CAAC,GAAG,QAAA,EAAU,GAAG,EAAE,CAAA;AAC1D,MAAA,OAAO;AAAA,QACL,GAAG,GAAA;AAAA,QACH,OAAO,EAAE,GAAG,IAAI,KAAA,EAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,MAAA,EAAQ,EAAA,CAAG,QAAQ,KAAA,EAAO,EAAA,CAAG,OAAM,EAAE;AAAA,QAChF,QAAA;AAAA,QACA,GAAA,EAAK,IAAI,GAAA,GAAM;AAAA,OACjB;AAAA,IACF;AAAA,IAEA,KAAK,WAAA,EAAa;AAChB,MAAA,IAAI,CAAC,IAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,EAAG,OAAO,QAAQ,gBAAgB,CAAA;AACtD,MAAA,OAAO,SAAA,CAAU,GAAA,EAAK,EAAA,CAAG,EAAA,EAAI;AAAA,QAC3B,KAAA,EAAO,EAAE,GAAG,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,CAAG,KAAA,EAAO,GAAG,EAAA,CAAG,KAAA;AAAM,OAClD,CAAA;AAAA,IACH;AAAA,IAEA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,OAAA,CAAQ,gBAAgB,CAAA;AAC1C,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,UAAU,KAAK,EAAC;AAC3C,MAAA,OAAO,SAAA,CAAU,GAAA,EAAK,EAAA,CAAG,EAAA,EAAI;AAAA,QAC3B,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,OAAO,CAAC,EAAA,CAAG,UAAU,GAAG,EAAE,GAAG,IAAA,EAAM,GAAG,EAAA,CAAG,OAAM;AAAE,OACnE,CAAA;AAAA,IACH;AAAA,IAEA,KAAK,iBAAA,EAAmB;AACtB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,OAAA,CAAQ,gBAAgB,CAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,IAAe,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM,EAAE;AACzE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,UAAU,KAAK,EAAC;AACrC,MAAA,OAAO,SAAA,CAAU,GAAA,EAAK,EAAA,CAAG,EAAA,EAAI;AAAA,QAC3B,WAAA,EAAa,EAAE,GAAG,IAAA,EAAM,CAAC,EAAA,CAAG,UAAU,GAAG,EAAE,GAAG,IAAA,EAAM,GAAG,EAAA,CAAG,OAAM;AAAE,OACnE,CAAA;AAAA,IACH;AAAA,IAEA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,OAAA,CAAQ,gBAAgB,CAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,EAAC;AACjC,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAA,CAAG,IAAA,CAAK,EAAE,CAAA;AACrD,MAAA,OAAO,SAAA,CAAU,GAAA,EAAK,EAAA,CAAG,EAAA,EAAI;AAAA,QAC3B,YAAY,GAAA,IAAO,CAAA,GAAI,KAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAO,CAAA,KAAM,GAAA,GAAM,EAAA,CAAG,OAAO,CAAE,CAAA,GAAI,CAAC,GAAG,IAAA,EAAM,GAAG,IAAI;AAAA,OACzF,CAAA;AAAA,IACH;AAAA,IAEA,KAAK,kBAAA,EAAoB;AACvB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,OAAA,CAAQ,gBAAgB,CAAA;AAC1C,MAAA,OAAO,SAAA,CAAU,GAAA,EAAK,EAAA,CAAG,EAAA,EAAI;AAAA,QAC3B,UAAA,EAAA,CAAa,IAAA,CAAK,UAAA,IAAc,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAA,CAAG,MAAM;AAAA,OACrE,CAAA;AAAA,IACH;AAAA,IAEA,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,OAAA,CAAQ,gBAAgB,CAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,IAAW,EAAC;AAC9B,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,EAAA,CAAG,MAAA,KAAW,IAAA,EAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,EAAA,CAAG,KAAK,CAAA;AAAA,WAAA,IAC7D,EAAA,CAAG,SAAS,IAAA,CAAK,MAAA,YAAkB,CAAC,GAAG,IAAA,EAAM,EAAA,CAAG,MAAM,CAAA;AAAA,WAC1D,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,KAAM,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,MAAA,GAAU,CAAE,CAAA;AACnE,MAAA,OAAO,UAAU,GAAA,EAAK,EAAA,CAAG,EAAA,EAAI,EAAE,SAAS,CAAA;AAAA,IAC1C;AAAA,IAEA,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,GAAG,GAAA,EAAK,IAAA,EAAM,EAAE,GAAG,GAAA,CAAI,IAAA,EAAM,GAAG,GAAG,KAAA,EAAM,EAAG,GAAA,EAAK,GAAA,CAAI,MAAM,CAAA,EAAE;AAAA,IAExE,KAAK,WAAA;AACH,MAAA,OAAO,EAAE,GAAG,GAAA,EAAK,KAAA,EAAO,EAAE,GAAG,GAAA,CAAI,KAAA,EAAO,GAAG,GAAG,KAAA,EAAM,EAAG,GAAA,EAAK,GAAA,CAAI,MAAM,CAAA,EAAE;AAAA,IAE1E,KAAK,kBAAA,EAAoB;AACvB,MAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA;AACpC,MAAA,MAAM,IAAA,GACJ,EAAA,CAAG,KAAA,CAAM,MAAA,KAAW,IAAI,QAAA,CAAS,MAAA,IAAU,EAAA,CAAG,KAAA,CAAM,MAAM,CAAC,EAAA,KAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAC,CAAA;AACnF,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,OAAA,CAAQ,mDAAmD,CAAA;AAC7E,MAAA,OAAO,EAAE,GAAG,GAAA,EAAK,QAAA,EAAU,CAAC,GAAG,EAAA,CAAG,KAAK,CAAA,EAAG,GAAA,EAAK,GAAA,CAAI,GAAA,GAAM,CAAA,EAAE;AAAA,IAC7D;AAAA,IAEA;AACE,MAAA,OAAO,OAAA,CAAQ,CAAA,YAAA,EAAgB,EAAA,CAAc,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA;AAEvD;AC7JO,SAAS,WAAW,GAAA,EAA2B;AACpD,EAAA,OAAO,EAAE,KAAK,IAAA,EAAM,IAAI,MAAA,EAAQ,EAAC,EAAG,SAAA,EAAW,IAAA,EAAK;AACtD;AAEO,SAAS,YAAA,CAAa,OAAoB,MAAA,EAAmC;AAClF,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,OAAO,EAAE,CAAA;AACxC,MAAA,IAAI,IAAA,KAAS,KAAA,CAAM,GAAA,EAAK,OAAO,KAAA;AAC/B,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,GAAA,EAAK,IAAA;AAAA,QACL,IAAA,EAAM,CAAC,GAAG,KAAA,CAAM,IAAA,EAAM,MAAM,GAAG,CAAA,CAAE,KAAA,CAAM,IAAc,CAAA;AAAA,QACrD,QAAQ;AAAC,OACX;AAAA,IACF;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACpC,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AAC7C,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,GAAA,EAAK,IAAA;AAAA,QACL,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,QAC5B,QAAQ,CAAC,KAAA,CAAM,GAAA,EAAK,GAAG,MAAM,MAAM;AAAA,OACrC;AAAA,IACF;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACtC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAC3B,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,GAAA,EAAK,IAAA;AAAA,QACL,MAAM,CAAC,GAAG,KAAA,CAAM,IAAA,EAAM,MAAM,GAAG,CAAA;AAAA,QAC/B,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,CAAC;AAAA,OAC9B;AAAA,IACF;AAAA,IACA,KAAK,QAAA;AACH,MAAA,OAAO,KAAA,CAAM,SAAA,KAAc,MAAA,CAAO,EAAA,GAAK,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,SAAA,EAAW,MAAA,CAAO,EAAA,EAAG;AAAA,IAClF,KAAK,SAAA;AACH,MAAA,OAAO,KAAA,CAAM,GAAA,KAAQ,MAAA,CAAO,GAAA,GAAM,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,GAAA,EAAK,MAAA,CAAO,GAAA,EAAK,MAAA,EAAQ,EAAC,EAAE;AAAA,IACpF;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;;;ACnDO,SAAS,UAAU,UAAA,EAAgC;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIA,gBAAA,CAAW,YAAA,EAAc,YAAY,UAAU,CAAA;AACzE,EAAA,MAAM,KAAA,GAAQC,iBAAA,CAAY,CAAC,EAAA,KAAe,QAAA,CAAS,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA;AAC7E,EAAA,MAAM,IAAA,GAAOA,iBAAA,CAAY,MAAM,QAAA,CAAS,EAAE,MAAM,MAAA,EAAQ,CAAA,EAAG,EAAE,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAOA,iBAAA,CAAY,MAAM,QAAA,CAAS,EAAE,MAAM,MAAA,EAAQ,CAAA,EAAG,EAAE,CAAA;AAC7D,EAAA,MAAM,MAAA,GAASA,iBAAA,CAAY,CAAC,EAAA,KAAsB,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA;AACtF,EAAA,MAAM,OAAA,GAAUA,iBAAA,CAAY,CAAC,GAAA,KAAiB,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,CAAA,EAAG,EAAE,CAAA;AAEpF,EAAA,OAAOC,aAAA;AAAA,IACL,OAAO;AAAA,MACL,KAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,MAC7B,OAAA,EAAS,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS;AAAA,KACjC,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,QAAQ,OAAO;AAAA,GAC5C;AACF;;;ACfO,SAAS,UAAU,CAAA,EAA0B;AAClD,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,MAAM,IAAA,IAAQ,OAAQ,EAAc,KAAA,KAAU,QAAA;AAChF;AAqJO,IAAM,mBAAA,GAA8C;AAAA,EACzD,IAAA,EAAM,CAAA;AAAA,EACN,EAAA,EAAI,GAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;;;AC/JA,IAAM,WAAA,GAAc,CAAC,EAAA,KAAuB,CAAA,WAAA,EAAc,EAAE,CAAA,EAAA,CAAA;AAE5D,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,EAAG,IAAI,IAAI,CAAA,CAAA;AAChC;AAEA,SAAS,UAAU,IAAA,EAAwB;AACzC,EAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,MAAA;AAC5B,EAAA,IAAI,IAAA,KAAS,OAAO,OAAO,MAAA;AAC3B,EAAA,OAAO,YAAY,IAAI,CAAA;AACzB;AAEA,IAAM,KAAA,GAAgC;AAAA,EACpC,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AACA,IAAM,OAAA,GAAkC;AAAA,EACtC,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAGA,SAAS,WAAW,KAAA,EAAoD;AACtE,EAAA,MAAM,IAA4B,EAAC;AACnC,EAAA,IAAI,MAAM,OAAA,EAAS,CAAA,CAAE,SAAS,CAAA,GAAI,WAAA,CAAY,MAAM,OAAO,CAAA;AAC3D,EAAA,IAAI,MAAM,MAAA,EAAQ,CAAA,CAAE,QAAQ,CAAA,GAAI,WAAA,CAAY,MAAM,MAAM,CAAA;AACxD,EAAA,IAAI,MAAM,MAAA,EAAQ,CAAA,CAAE,eAAe,CAAA,GAAI,WAAA,CAAY,MAAM,MAAM,CAAA;AAC/D,EAAA,IAAI,MAAM,UAAA,KAAe,MAAA,EAAW,CAAA,CAAE,YAAY,IAAI,KAAA,CAAM,UAAA;AAC5D,EAAA,IAAI,MAAM,KAAA,KAAU,MAAA,EAAW,CAAA,CAAE,OAAO,IAAI,KAAA,CAAM,KAAA;AAClD,EAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW,CAAA,CAAE,SAAS,CAAA,GAAI,MAAA,CAAO,MAAM,OAAO,CAAA;AACpE,EAAA,IAAI,MAAM,UAAA,KAAe,MAAA,EAAW,CAAA,CAAE,aAAa,IAAI,KAAA,CAAM,UAAA;AAC7D,EAAA,IAAI,MAAM,QAAA,EAAU,CAAA,CAAE,WAAW,CAAA,GAAI,WAAA,CAAY,MAAM,QAAQ,CAAA;AAC/D,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW,CAAA,CAAE,aAAa,CAAA,GAAI,MAAA,CAAO,MAAM,UAAU,CAAA;AAC9E,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW,CAAA,CAAE,aAAa,CAAA,GAAI,MAAA,CAAO,MAAM,UAAU,CAAA;AAC9E,EAAA,IAAI,MAAM,SAAA,KAAc,MAAA,EAAW,CAAA,CAAE,YAAY,IAAI,KAAA,CAAM,SAAA;AAC3D,EAAA,IAAI,MAAM,aAAA,EAAe,CAAA,CAAE,gBAAgB,CAAA,GAAI,WAAA,CAAY,MAAM,aAAa,CAAA;AAC9E,EAAA,IAAI,MAAM,MAAA,KAAW,MAAA,EAAW,CAAA,CAAE,QAAQ,IAAI,KAAA,CAAM,MAAA;AACpD,EAAA,IAAI,MAAM,SAAA,KAAc,MAAA,EAAW,CAAA,CAAE,YAAY,IAAI,KAAA,CAAM,SAAA;AAC3D,EAAA,IAAI,MAAM,SAAA,KAAc,MAAA,EAAW,CAAA,CAAE,WAAW,IAAI,KAAA,CAAM,SAAA;AAC1D,EAAA,IAAI,MAAM,MAAA,KAAW,MAAA,EAAW,CAAA,CAAE,QAAQ,IAAI,KAAA,CAAM,MAAA;AACpD,EAAA,IAAI,MAAM,GAAA,EAAK,CAAA,CAAE,KAAK,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AAC/C,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,CAAA,CAAE,aAAa,IAAI,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA;AAC9E,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,CAAA,CAAE,iBAAiB,IAAI,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,IAAK,KAAA,CAAM,OAAA;AACxF,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,YAAY,IAAA,EAAoC;AACvD,EAAA,MAAM,IAA4B,EAAC;AACnC,EAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS;AAC3B,IAAA,CAAA,CAAE,SAAS,CAAA,GAAI,MAAA;AACf,IAAA,CAAA,CAAE,gBAAgB,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,IAAa,QAAA;AAAA,EACrD,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,KAAW,MAAA,EAAQ;AACjC,IAAA,CAAA,CAAE,SAAS,CAAA,GAAI,MAAA;AACf,IAAA,CAAA,CAAE,uBAAuB,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,KAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA,MAAA,CAAA;AAAA,EACrE,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,KAAW,MAAA,EAAQ;AACjC,IAAA,CAAA,CAAE,UAAU,CAAA,GAAI,UAAA;AAAA,EAClB;AACA,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,eAAA,CAAgB,GAAyB,UAAA,EAA6C;AAC7F,EAAA,MAAM,IAA4B,EAAC;AACnC,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,CAAA,CAAE,UAAU,CAAA,GAAI,UAAA;AAChB,IAAA,IAAI,EAAE,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA,GAAI,WAAA,CAAY,EAAE,IAAI,CAAA;AAC1C,IAAA,IAAI,EAAE,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA,GAAI,WAAA,CAAY,EAAE,KAAK,CAAA;AAC7C,IAAA,IAAI,EAAE,GAAA,EAAK,CAAA,CAAE,KAAK,CAAA,GAAI,WAAA,CAAY,EAAE,GAAG,CAAA;AACvC,IAAA,IAAI,EAAE,MAAA,EAAQ,CAAA,CAAE,QAAQ,CAAA,GAAI,WAAA,CAAY,EAAE,MAAM,CAAA;AAChD,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,CAAA,CAAE,MAAM,CAAA,GAAI,KAAA;AACZ,MAAA,UAAA,CAAW,KAAK,kBAAkB,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,CAAA,CAAE,KAAK,CAAA,GAAI,KAAA;AACX,MAAA,UAAA,CAAW,KAAK,kBAAkB,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,WAAW,MAAA,EAAQ,CAAA,CAAE,WAAW,CAAA,GAAI,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,EAAE,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA,GAAI,SAAA,CAAU,EAAE,KAAK,CAAA;AAC3C,EAAA,IAAI,EAAE,MAAA,EAAQ,CAAA,CAAE,QAAQ,CAAA,GAAI,SAAA,CAAU,EAAE,MAAM,CAAA;AAC9C,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,YAAA,CAAa,KAAc,IAAA,EAAqB;AACvD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,EAAM,OAAO,KAAA;AACjC,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AACpC,EAAA,OAAO,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,MAAA,IAAa,OAAO,MAAA,KAAW,MAAA;AACrE;AAEA,SAAS,aAAA,CAAc,QAAA,EAAkB,KAAA,EAA+B,MAAA,EAAwB;AAC9F,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,EAAE,IAAA,EAAK;AACtC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC/B,EAAA,MAAM,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,GAAG,MAAM,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,MAAM,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACxE,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,QAAQ,CAAA;AAAA,EAAO,IAAI;AAAA,EAAK,MAAM,CAAA,CAAA,CAAA;AACnD;AAGO,SAAS,WAAW,GAAA,EAAsB;AAC/C,EAAA,MAAM,YAAA,GAAe,mBAAA;AACrB,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,KAAK,CAAA,CAAE,MAAK,EAAG;AAC9C,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACzB,IAAA,MAAM,QAAA,GAAW,YAAY,EAAE,CAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA;AAGzC,IAAA,MAAM,IAAA,GAA+B;AAAA,MACnC,GAAG,YAAY,IAAI,CAAA;AAAA,MACnB,GAAI,KAAK,WAAA,GAAc,eAAA,CAAgB,KAAK,WAAA,CAAY,IAAA,EAAM,UAAU,CAAA,GAAI,EAAC;AAAA,MAC7E,GAAG,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,IAAI;AAAA,KAC/B;AACA,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,QAAA,EAAU,IAAA,EAAM,EAAE,CAAA;AACjD,IAAA,IAAI,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAGlC,IAAA,KAAA,MAAW,EAAA,IAAM,IAAI,WAAA,EAAa;AAChC,MAAA,IAAI,OAAO,MAAA,EAAQ;AACnB,MAAA,MAAM,EAAA,GAAK,aAAa,EAAE,CAAA;AAC1B,MAAA,IAAI,OAAO,MAAA,EAAW;AACtB,MAAA,MAAM,KAAA,GAAgC;AAAA,QACpC,GAAI,IAAA,CAAK,WAAA,GAAc,EAAE,CAAA,GAAI,eAAA,CAAgB,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA,EAAI,UAAU,CAAA,GAAI,EAAC;AAAA,QACnF,GAAI,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,GAAI,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,EAAE,CAAE,CAAA,GAAI;AAAC,OACtD;AACA,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,QAAA,EAAU,KAAA,EAAO,IAAI,CAAA;AACjD,MAAA,IAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,CAAA,mBAAA,EAAsB,EAAE,CAAA;AAAA,EAAU,KAAK;AAAA,CAAA,CAAK,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA,CAAO,SAAS,IAAA,GAAO,EAAA,CAAA;AACvD;AC3IA,SAAS,QAAQ,CAAA,EAAoC;AACnD,EAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,IAAA,EAAM,OAAO,EAAA;AAC1C,EAAA,IAAI,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,EAAA;AACzB,EAAA,OAAO,OAAO,CAAC,CAAA;AACjB;AAGO,IAAM,eAAA,GAAmC;AAAA,EAC9C,OAAA,EAAS,CAAC,EAAE,QAAA,EAAS,KAAM,QAAA;AAAA,EAC3B,KAAA,EAAO,CAAC,EAAE,QAAA,EAAS,KAAM,QAAA;AAAA,EACzB,IAAA,EAAM,CAAC,EAAE,QAAA,EAAS,KAAM,QAAA;AAAA,EACxB,KAAA,EAAO,CAAC,EAAE,QAAA,EAAS,KAAM,QAAA;AAAA,EACzB,KAAA,EAAO,CAAC,EAAE,QAAA,EAAS,KAAM,QAAA;AAAA,EACzB,IAAA,EAAM,CAAC,EAAE,IAAA,OAAW,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC9C,KAAA,EAAO,CAAC,EAAE,IAAA,EAAK,qBACbC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,MAC3B,GAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,MAC3B,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,OAAA;AAAQ;AAAA;AAGnF,CAAA;ACvBO,SAAS,WAAW,EAAE,GAAA,EAAK,EAAA,EAAI,QAAA,GAAW,iBAAgB,EAAyC;AACxG,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACzB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,OAAO,UAAA,CAAW,GAAA,EAAK,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,qBACpCA,cAAAA,CAAC,UAAA,EAAA,EAA0B,KAAU,EAAA,EAAI,KAAA,CAAM,IAAI,QAAA,EAAA,EAAlC,KAAA,CAAM,EAAgD,CACxE,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,QAAA,GAAW,QAAA,CAAS,EAAE,IAAA,EAAM,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAA,GAAO,IAAA;AAExF,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,UAAA,EAAU,IAAA,CAAK,EAAA,EAAI,iBAAA,EAAiB,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,IAAA,GAAO,MAAA,EAChE,QAAA,EAAA,KAAA,EACH,CAAA;AAEJ;ACnBO,SAAS,OAAA,CAAQ;AAAA,EACtB,GAAA;AAAA,EACA,QAAA,GAAW,eAAA;AAAA,EACX,aAAA,GAAgB;AAClB,CAAA,EAA+B;AAC7B,EAAA,uCACGC,cAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,aAAA,mBAAgBD,eAAC,OAAA,EAAA,EAAM,iBAAA,EAAgB,IAAI,QAAA,EAAA,UAAA,CAAW,GAAG,GAAE,CAAA,GAAW,IAAA;AAAA,IACtE,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,qBACjBA,cAAAA,CAAC,UAAA,EAAA,EAAoB,GAAA,EAAU,EAAA,EAAQ,QAAA,EAAA,EAAtB,EAA0C,CAC5D;AAAA,GAAA,EACH,CAAA;AAEJ;ACKO,SAAS,OAAO,EAAE,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,OAAM,EAA8B;AACrF,EAAA,MAAM,GAAA,GAAME,aAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIC,eAAqB,IAAI,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAOD,aAAmE,IAAI,CAAA;AAEpF,EAAAE,qBAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,SAAA,EAAW;AACvB,MAAA,MAAA,CAAO,IAAI,CAAA;AACX,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAK,IAAA,CAAK,aAAA,CAAc,cAAc,SAAA,CAAU,SAAS,CAAC,CAAA,EAAA,CAAI,CAAA;AACpE,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAA,CAAO,IAAI,CAAA;AACX,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,IAAA,MAAM,QAAA,GAAW,KAAK,qBAAA,EAAsB;AAC5C,IAAA,MAAA,CAAO;AAAA,MACL,CAAA,EAAG,CAAA,CAAE,IAAA,GAAO,QAAA,CAAS,OAAO,IAAA,CAAK,UAAA;AAAA,MACjC,CAAA,EAAG,CAAA,CAAE,GAAA,GAAM,QAAA,CAAS,MAAM,IAAA,CAAK,SAAA;AAAA,MAC/B,GAAG,CAAA,CAAE,KAAA;AAAA,MACL,GAAG,CAAA,CAAE;AAAA,KACN,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,SAAA,EAAW,GAAG,CAAC,CAAA;AAEnB,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAuC;AAC1D,IAAA,MAAM,MAAA,GAAU,CAAA,CAAE,MAAA,CAAuB,OAAA,CAAQ,YAAY,CAAA;AAC7D,IAAA,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,UAAU,IAAI,IAAI,CAAA;AAAA,EAC1D,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAyC;AAClE,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,SAAS,GAAG,WAAA,EAAa,IAAA;AAC7C,IAAA,MAAM,IAAA,GAAO,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,OAAO,EAAE,IAAA,KAAS,QAAA,GAAW,CAAA,CAAE,IAAA,CAAK,KAAA,GAAQ,CAAA;AACxE,IAAA,MAAM,GAAA,GAAM,CAAA,IAAK,CAAA,CAAE,GAAA,IAAO,OAAO,EAAE,GAAA,KAAQ,QAAA,GAAW,CAAA,CAAE,GAAA,CAAI,KAAA,GAAQ,CAAA;AACpE,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI;AACvD,IAAA,CAAA,CAAE,aAAA,CAAc,iBAAA,CAAkB,CAAA,CAAE,SAAS,CAAA;AAC7C,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAyC;AAClE,IAAA,MAAM,IAAI,IAAA,CAAK,OAAA;AACf,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,SAAA,EAAW;AACtB,IAAA,KAAA,CAAM;AAAA,MACJ,CAAA,EAAG,iBAAA;AAAA,MACH,EAAA,EAAI,SAAA;AAAA,MACJ,UAAA,EAAY,MAAA;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,CAAA,CAAE,CAAA,EAAG,MAAM,IAAA,EAAK;AAAA,QAClE,GAAA,EAAK,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,GAAA,IAAO,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,CAAA,CAAE,CAAA,EAAG,MAAM,IAAA;AAAK;AAClE,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,OAAA,GAAyB;AAAA,IAC7B,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AACA,EAAA,MAAM,UAAyB,GAAA,GAC3B;AAAA,IACE,QAAA,EAAU,UAAA;AAAA,IACV,MAAM,GAAA,CAAI,CAAA;AAAA,IACV,KAAK,GAAA,CAAI,CAAA;AAAA,IACT,OAAO,GAAA,CAAI,CAAA;AAAA,IACX,QAAQ,GAAA,CAAI,CAAA;AAAA,IACZ,OAAA,EAAS,mBAAA;AAAA,IACT,aAAA,EAAe,EAAA;AAAA,IACf,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf,GACA,EAAE,OAAA,EAAS,MAAA,EAAO;AAEtB,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAU,OAAA,EAAS,WAAA,EAAa,OAAO,OAAA,EAC1C,QAAA,EAAA;AAAA,oBAAAL,cAAAA,CAAC,WAAQ,GAAA,EAAU,CAAA;AAAA,oBACnBA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAe,iBAAA;AAAA,QACf,aAAA,EAAe,iBAAA;AAAA,QACf,WAAA,EAAa,eAAA;AAAA,QACb,KAAA,EAAO;AAAA;AAAA;AACT,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,MAAM,CAAA;AACvC;ACnHO,SAAS,WAAA,CAAY,EAAE,GAAA,EAAK,SAAA,EAAW,UAAS,EAAmC;AACxF,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,CAAA,EAAG,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,yBAAwB,EAC3F,QAAA,EAAA,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,qBACjBA,cAAAA,CAAC,QAAA,EAAA,EAAkB,GAAA,EAAU,EAAA,EAAQ,KAAA,EAAO,CAAA,EAAG,SAAA,EAAsB,QAAA,EAAA,EAAtD,EAA0E,CAC1F,CAAA,EACH,CAAA;AAEJ;AAOA,SAAS,SAAS,EAAE,GAAA,EAAK,IAAI,KAAA,EAAO,SAAA,EAAW,UAAS,EAAuC;AAC7F,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACzB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,WAAW,SAAA,KAAc,EAAA;AAC/B,EAAA,uBACEK,eAAAA,CAACJ,cAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAI,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,CAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,OAAA;AAAA,UACT,KAAA,EAAO,MAAA;AAAA,UACP,SAAA,EAAW,MAAA;AAAA,UACX,MAAA,EAAQ,MAAA;AAAA,UACR,YAAA,EAAc,CAAA;AAAA,UACd,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,SAAA;AAAA,UACT,WAAA,EAAa,IAAI,KAAA,GAAQ,EAAA;AAAA,UACzB,UAAA,EAAY,WAAW,SAAA,GAAY,aAAA;AAAA,UACnC,KAAA,EAAO,WAAW,SAAA,GAAY,SAAA;AAAA,UAC9B,IAAA,EAAM;AAAA,SACR;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAL,cAAAA,CAAC,UAAK,KAAA,EAAO,EAAE,SAAS,GAAA,EAAI,EAAI,eAAK,IAAA,EAAK,CAAA;AAAA,UAAO,QAAA;AAAA,UAAI;AAAA;AAAA;AAAA,KACvD;AAAA,IACC,WAAW,GAAA,EAAK,EAAE,EAAE,GAAA,CAAI,CAAC,0BACxBA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,GAAA;AAAA,QACA,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,OAAO,KAAA,GAAQ,CAAA;AAAA,QACf,SAAA;AAAA,QACA;AAAA,OAAA;AAAA,MALK,KAAA,CAAM;AAAA,KAOd;AAAA,GAAA,EACH,CAAA;AAEJ;ACrDA,IAAM,KAAA,GAAuB;AAAA,EAC3B,OAAA,EAAS,OAAA;AAAA,EACT,QAAA,EAAU,EAAA;AAAA,EACV,aAAA,EAAe,WAAA;AAAA,EACf,aAAA,EAAe,QAAA;AAAA,EACf,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AACA,IAAM,KAAA,GAAuB;AAAA,EAC3B,KAAA,EAAO,MAAA;AAAA,EACP,SAAA,EAAW,YAAA;AAAA,EACX,OAAA,EAAS,SAAA;AAAA,EACT,YAAA,EAAc,CAAA;AAAA,EACd,MAAA,EAAQ,mBAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAGO,SAAS,SAAA,CAAU,EAAE,GAAA,EAAK,SAAA,EAAW,OAAM,EAAiC;AACjF,EAAA,MAAM,IAAA,GAAO,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,GAAI,IAAA;AAChD,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,uBAAA,EAAyB,QAAA,EAAU,EAAA,IAAM,QAAA,EAAA,4BAAA,EAElG,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA;AACrB,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAChB,KAAA,CAAM,EAAE,CAAA,EAAG,WAAA,EAAa,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAA;AAClE,EAAA,MAAM,UAAU,CAAC,GAAA,EAAa,UAC5B,KAAA,CAAM,EAAE,GAAG,WAAA,EAAa,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,OAAO,EAAE,CAAC,GAAG,GAAG,KAAA,IAAS,CAAA;AAEhE,EAAA,uBACEK,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,YAAY,uBAAA,EAAyB,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,cAAa,EACxH,QAAA,EAAA;AAAA,oBAAAL,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,SAAA,EAAU,EAAI,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK,CAAA;AAAA,oBAC5EA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,YAAA,EAAc,CAAA,EAAE,EAAI,eAAK,EAAA,EAAG,CAAA;AAAA,IAEzE,KAAK,IAAA,KAAS,MAAA,mBACbK,eAAAA,CAAAJ,qBAAA,EACE,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,KAAA,EAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,sBAC5BA,cAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAO,EAAE,GAAG,OAAO,SAAA,EAAW,EAAA,EAAI,QAAQ,UAAA,EAAW;AAAA,UACrD,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA,CAAM,YAAY,QAAA,GAAW,IAAA,CAAK,MAAM,OAAA,GAAU,EAAA;AAAA,UACrE,UAAU,CAAC,CAAA,KAAM,QAAQ,SAAA,EAAW,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA;AACpD,KAAA,EACF,CAAA,GACE,IAAA;AAAA,IAEH,KAAK,IAAA,KAAS,OAAA,mBACbK,eAAAA,CAAAJ,qBAAA,EACE,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,KAAA,EAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,sBAC3BA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,QAAA,GAAW,IAAA,CAAK,MAAM,GAAA,GAAM,EAAA;AAAA,UAC7D,UAAU,CAAC,CAAA,KAAM,QAAQ,KAAA,EAAO,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA;AAChD,KAAA,EACF,CAAA,GACE,IAAA;AAAA,oBAEJA,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,OAAO,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,oBAC/BA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA;AAAA,QACP,WAAA,EAAY,kCAAA;AAAA,QACZ,KAAA,EAAO,EAAE,UAAA,IAAc,EAAA;AAAA,QACvB,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO;AAAA;AAAA,KAC1D;AAAA,oBAEAA,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,OAAO,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,oBAC/BA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA;AAAA,QACP,WAAA,EAAY,SAAA;AAAA,QACZ,KAAA,EAAO,EAAE,KAAA,IAAS,EAAA;AAAA,QAClB,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO;AAAA;AAAA,KACrD;AAAA,oBAEAA,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,OAAO,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,oBACnCA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,CAAA,CAAE,QAAA,EAAU,KAAA,IAAS,EAAA;AAAA,QAC5B,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,UAAU,EAAE,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAA,IAAK,GAAG,IAAA,EAAM,IAAA,IAAQ;AAAA;AAAA,KAC5F;AAAA,oBAEAA,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,OAAO,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,oBACjCA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,CAAA,CAAE,OAAA,EAAS,KAAA,IAAS,EAAA;AAAA,QAC3B,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,SAAS,EAAE,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAA,IAAK,GAAG,IAAA,EAAM,IAAA,IAAQ;AAAA;AAAA,KAC3F;AAAA,oBAEAA,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,OAAO,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,oBAC5BA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,KAAA;AAAA,QACL,GAAA,EAAI,GAAA;AAAA,QACJ,GAAA,EAAI,GAAA;AAAA,QACJ,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,EAAE,OAAA,IAAW,EAAA;AAAA,QACpB,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,OAAA,EAAS,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAG;AAAA;AAAA;AAC/D,GAAA,EACF,CAAA;AAEJ;ACnGO,SAAS,MAAA,CAAO,EAAE,YAAA,EAAc,QAAA,EAAS,EAA8B;AAC5E,EAAA,MAAM,EAAA,GAAK,UAAU,YAAY,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQE,aAAO,IAAI,CAAA;AAEzB,EAAAI,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,GAAW,EAAA,CAAG,MAAM,GAAG,CAAA;AAAA,EACzB,GAAG,CAAC,EAAA,CAAG,KAAA,CAAM,GAAA,EAAK,QAAQ,CAAC,CAAA;AAE3B,EAAA,MAAM,KAAA,GAAuB;AAAA,IAC3B,OAAA,EAAS,MAAA;AAAA,IACT,mBAAA,EAAqB,iBAAA;AAAA,IACrB,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW,CAAA;AAAA,IACX,UAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,mBAAA;AAAA,IACR,YAAA,EAAc,EAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,KAAA,EACV,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,WAAA,EAAa,mBAAA,EAAqB,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,SAAA,EAAW,CAAA,EAAE,EACrG,QAAA,EAAA;AAAA,sBAAAL,cAAAA,CAAC,WAAQ,EAAA,EAAQ,CAAA;AAAA,sBACjBA,cAAAA,CAAC,WAAA,EAAA,EAAY,GAAA,EAAK,EAAA,CAAG,KAAA,CAAM,GAAA,EAAK,SAAA,EAAW,EAAA,CAAG,KAAA,CAAM,SAAA,EAAW,QAAA,EAAU,GAAG,MAAA,EAAQ;AAAA,KAAA,EACtF,CAAA;AAAA,oBACAA,cAAAA,CAAC,MAAA,EAAA,EAAO,GAAA,EAAK,EAAA,CAAG,MAAM,GAAA,EAAK,SAAA,EAAW,EAAA,CAAG,KAAA,CAAM,WAAW,QAAA,EAAU,EAAA,CAAG,MAAA,EAAQ,KAAA,EAAO,GAAG,KAAA,EAAO,CAAA;AAAA,oBAChGA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAY,mBAAA,EAAqB,SAAA,EAAW,CAAA,EAAE,EAC1D,QAAA,kBAAAA,cAAAA,CAAC,aAAU,GAAA,EAAK,EAAA,CAAG,KAAA,CAAM,GAAA,EAAK,SAAA,EAAW,EAAA,CAAG,MAAM,SAAA,EAAW,KAAA,EAAO,EAAA,CAAG,KAAA,EAAO,CAAA,EAChF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,OAAA,CAAQ,EAAE,EAAA,EAAG,EAAoC;AACxD,EAAA,MAAM,GAAA,GAAqB;AAAA,IACzB,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,EAAA;AAAA,IACV,OAAA,EAAS,UAAA;AAAA,IACT,YAAA,EAAc,CAAA;AAAA,IACd,MAAA,EAAQ,mBAAA;AAAA,IACR,UAAA,EAAY,MAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,uBACEK,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,GAAA,EAAK,CAAA;AAAA,QACL,OAAA,EAAS,CAAA;AAAA,QACT,YAAA,EAAc,mBAAA;AAAA,QACd,UAAA,EAAY;AAAA,OACd;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAL,cAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,OAAO,EAAE,GAAG,KAAK,OAAA,EAAS,EAAA,CAAG,UAAU,CAAA,GAAI,GAAA,IAAO,QAAA,EAAU,CAAC,GAAG,OAAA,EAAS,OAAA,EAAS,EAAA,CAAG,IAAA,EAAM,QAAA,EAAA,MAAA,EAEjH,CAAA;AAAA,wBACAA,eAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,KAAA,EAAO,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,EAAA,CAAG,UAAU,CAAA,GAAI,GAAA,IAAO,QAAA,EAAU,CAAC,GAAG,OAAA,EAAS,OAAA,EAAS,EAAA,CAAG,IAAA,EAAM,QAAA,EAAA,MAAA,EAEjH;AAAA;AAAA;AAAA,GACF;AAEJ","file":"editor.cjs","sourcesContent":["/**\n * The pure, total reducer. `reduce(doc, op)` returns a new document; an invalid\n * op is a **logged no-op** (returns the same doc, `seq` unchanged). That single\n * property is what makes undo, revisions, collaboration, and agent edits all\n * flow through one spine.\n *\n * Ordering: top-level order is the canonical `sections` array; child order is\n * the fractional `order` field among siblings (see `fractional.ts`).\n */\nimport type { Action, Node, NodeId, PageDoc, StyleProps } from \"./types\";\nimport type { PageOp } from \"./ops\";\n\nexport interface ReduceOptions {\n /** Called when an op can't apply. Default: silent. */\n onInvalid?: (op: PageOp, reason: string) => void;\n}\n\n/** Children of a node (or top-level when `parent` is null), in order. */\nexport function childrenOf(doc: PageDoc, parent: NodeId | null): Node[] {\n if (parent === null) {\n return doc.sections.map((id) => doc.nodes[id]).filter((n): n is Node => Boolean(n));\n }\n const out: Node[] = [];\n for (const id of Object.keys(doc.nodes)) {\n const n = doc.nodes[id]!;\n if (n.parent === parent) out.push(n);\n }\n out.sort((a, b) => (a.order < b.order ? -1 : a.order > b.order ? 1 : 0));\n return out;\n}\n\n/** Every transitive descendant id of `id` (excludes `id`). */\nexport function descendantIds(doc: PageDoc, id: NodeId): NodeId[] {\n const out: NodeId[] = [];\n const stack: NodeId[] = [id];\n while (stack.length) {\n const current = stack.pop()!;\n for (const childId of Object.keys(doc.nodes)) {\n const n = doc.nodes[childId]!;\n if (n.parent === current) {\n out.push(childId);\n stack.push(childId);\n }\n }\n }\n return out;\n}\n\nfunction patchNode(doc: PageDoc, id: NodeId, patch: Partial<Node>): PageDoc {\n const node = doc.nodes[id]!;\n return {\n ...doc,\n nodes: { ...doc.nodes, [id]: { ...node, ...patch } },\n seq: doc.seq + 1,\n };\n}\n\nexport function reduce(doc: PageDoc, op: PageOp, opts: ReduceOptions = {}): PageDoc {\n const invalid = (reason: string): PageDoc => {\n opts.onInvalid?.(op, reason);\n return doc;\n };\n\n switch (op.t) {\n case \"insert_node\": {\n if (doc.nodes[op.node.id]) return invalid(\"node id already exists\");\n if (op.node.parent !== null && !doc.nodes[op.node.parent]) return invalid(\"parent not found\");\n return {\n ...doc,\n nodes: { ...doc.nodes, [op.node.id]: op.node },\n sections: op.node.parent === null ? [...doc.sections, op.node.id] : doc.sections,\n seq: doc.seq + 1,\n };\n }\n\n case \"remove_node\": {\n if (!doc.nodes[op.id]) return invalid(\"node not found\");\n const dead = new Set<NodeId>([op.id, ...descendantIds(doc, op.id)]);\n const nodes: Record<NodeId, Node> = {};\n for (const id of Object.keys(doc.nodes)) {\n if (!dead.has(id)) nodes[id] = doc.nodes[id]!;\n }\n return {\n ...doc,\n nodes,\n sections: doc.sections.filter((s) => !dead.has(s)),\n seq: doc.seq + 1,\n };\n }\n\n case \"move_node\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n if (op.parent === op.id) return invalid(\"cannot parent a node to itself\");\n if (op.parent !== null && !doc.nodes[op.parent]) return invalid(\"new parent not found\");\n if (op.parent !== null && descendantIds(doc, op.id).includes(op.parent)) {\n return invalid(\"move would create a cycle\");\n }\n const wasTop = node.parent === null;\n const nowTop = op.parent === null;\n let sections = doc.sections;\n if (wasTop && !nowTop) sections = sections.filter((s) => s !== op.id);\n else if (!wasTop && nowTop) sections = [...sections, op.id];\n return {\n ...doc,\n nodes: { ...doc.nodes, [op.id]: { ...node, parent: op.parent, order: op.order } },\n sections,\n seq: doc.seq + 1,\n };\n }\n\n case \"set_props\": {\n if (!doc.nodes[op.id]) return invalid(\"node not found\");\n return patchNode(doc, op.id, {\n props: { ...doc.nodes[op.id]!.props, ...op.patch } as unknown as Node[\"props\"],\n });\n }\n\n case \"set_style\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n const prev = node.style[op.breakpoint] ?? {};\n return patchNode(doc, op.id, {\n style: { ...node.style, [op.breakpoint]: { ...prev, ...op.patch } } as Node[\"style\"],\n });\n }\n\n case \"set_constraints\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n const base = node.constraints ?? { base: { width: \"hug\", height: \"hug\" } };\n const prev = base[op.breakpoint] ?? {};\n return patchNode(doc, op.id, {\n constraints: { ...base, [op.breakpoint]: { ...prev, ...op.patch } } as Node[\"constraints\"],\n });\n }\n\n case \"set_animation\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n const list = node.animations ?? [];\n const idx = list.findIndex((a) => a.id === op.anim.id);\n return patchNode(doc, op.id, {\n animations: idx >= 0 ? list.map((a, i) => (i === idx ? op.anim : a)) : [...list, op.anim],\n });\n }\n\n case \"remove_animation\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n return patchNode(doc, op.id, {\n animations: (node.animations ?? []).filter((a) => a.id !== op.animId),\n });\n }\n\n case \"set_action\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n const list = node.actions ?? [];\n let actions: Action[];\n if (op.action === null) actions = list.filter((_, i) => i !== op.index);\n else if (op.index >= list.length) actions = [...list, op.action];\n else actions = list.map((a, i) => (i === op.index ? op.action! : a));\n return patchNode(doc, op.id, { actions });\n }\n\n case \"set_meta\":\n return { ...doc, meta: { ...doc.meta, ...op.patch }, seq: doc.seq + 1 };\n\n case \"set_theme\":\n return { ...doc, theme: { ...doc.theme, ...op.patch }, seq: doc.seq + 1 };\n\n case \"reorder_sections\": {\n const current = new Set(doc.sections);\n const same =\n op.order.length === doc.sections.length && op.order.every((id) => current.has(id));\n if (!same) return invalid(\"reorder must be a permutation of current sections\");\n return { ...doc, sections: [...op.order], seq: doc.seq + 1 };\n }\n\n default:\n return invalid(`unknown op \"${(op as PageOp).t}\"`);\n }\n}\n\n/** Apply a sequence of ops, threading the document. */\nexport function reduceAll(doc: PageDoc, ops: PageOp[], opts?: ReduceOptions): PageDoc {\n return ops.reduce((d, op) => reduce(d, op, opts), doc);\n}\n\n/**\n * Inverse op(s) for undo, computed against the **pre-op** document. Structural\n * ops invert cleanly; merge-style ops (`set_props`/`set_style`/`set_constraints`)\n * restore the previous values of the touched keys (keys that did not previously\n * exist can't be deleted via a merge — a known Phase-0 limitation).\n */\nexport function invert(doc: PageDoc, op: PageOp): PageOp[] {\n switch (op.t) {\n case \"insert_node\":\n return [{ t: \"remove_node\", id: op.node.id }];\n\n case \"remove_node\": {\n const node = doc.nodes[op.id];\n if (!node) return [];\n // Re-insert the subtree parent-first, then restore section order.\n const ids = [op.id, ...descendantIds(doc, op.id)];\n const inserts: PageOp[] = ids.map((id) => ({ t: \"insert_node\", node: doc.nodes[id]! }));\n if (node.parent === null) inserts.push({ t: \"reorder_sections\", order: [...doc.sections] });\n return inserts;\n }\n\n case \"move_node\": {\n const node = doc.nodes[op.id];\n if (!node) return [];\n const back: PageOp[] = [{ t: \"move_node\", id: op.id, parent: node.parent, order: node.order }];\n if (node.parent === null) back.push({ t: \"reorder_sections\", order: [...doc.sections] });\n return back;\n }\n\n case \"set_props\": {\n const node = doc.nodes[op.id];\n if (!node) return [];\n const prev: Record<string, unknown> = {};\n for (const k of Object.keys(op.patch)) prev[k] = node.props[k];\n return [{ t: \"set_props\", id: op.id, patch: prev }];\n }\n\n case \"set_style\": {\n const node = doc.nodes[op.id];\n if (!node) return [];\n const prevBp = (node.style[op.breakpoint] ?? {}) as Record<string, unknown>;\n const prev: Partial<StyleProps> = {};\n for (const k of Object.keys(op.patch)) (prev as Record<string, unknown>)[k] = prevBp[k];\n return [{ t: \"set_style\", id: op.id, breakpoint: op.breakpoint, patch: prev }];\n }\n\n case \"set_meta\":\n return [{ t: \"set_meta\", patch: pick(doc.meta, Object.keys(op.patch)) }];\n\n case \"set_theme\":\n return [{ t: \"set_theme\", patch: pick(doc.theme, Object.keys(op.patch)) }];\n\n case \"reorder_sections\":\n return [{ t: \"reorder_sections\", order: [...doc.sections] }];\n\n default:\n return [];\n }\n}\n\nfunction pick<T extends object>(obj: T, keys: string[]): Partial<T> {\n const out: Partial<T> = {};\n for (const k of keys) (out as Record<string, unknown>)[k] = (obj as Record<string, unknown>)[k];\n return out;\n}\n","/**\n * Editor state engine — pure and framework-agnostic so it's unit-testable.\n * `useEditor` wraps this with `useReducer`. Undo/redo uses document snapshots\n * (simple + robust); the op-level `invert` in the spine is for collab/op-stream\n * undo.\n */\nimport type { PageDoc } from \"../document/types\";\nimport type { PageOp } from \"../document/ops\";\nimport { reduce } from \"../document/reduce\";\n\nexport interface EditorState {\n doc: PageDoc;\n past: PageDoc[];\n future: PageDoc[];\n selection: string | null;\n}\n\nexport type EditorAction =\n | { type: \"apply\"; op: PageOp }\n | { type: \"undo\" }\n | { type: \"redo\" }\n | { type: \"select\"; id: string | null }\n | { type: \"replace\"; doc: PageDoc };\n\nconst HISTORY_LIMIT = 100;\n\nexport function initEditor(doc: PageDoc): EditorState {\n return { doc, past: [], future: [], selection: null };\n}\n\nexport function editorReduce(state: EditorState, action: EditorAction): EditorState {\n switch (action.type) {\n case \"apply\": {\n const next = reduce(state.doc, action.op);\n if (next === state.doc) return state; // invalid op → no-op, no history entry\n return {\n ...state,\n doc: next,\n past: [...state.past, state.doc].slice(-HISTORY_LIMIT),\n future: [],\n };\n }\n case \"undo\": {\n if (state.past.length === 0) return state;\n const prev = state.past[state.past.length - 1]!;\n return {\n ...state,\n doc: prev,\n past: state.past.slice(0, -1),\n future: [state.doc, ...state.future],\n };\n }\n case \"redo\": {\n if (state.future.length === 0) return state;\n const next = state.future[0]!;\n return {\n ...state,\n doc: next,\n past: [...state.past, state.doc],\n future: state.future.slice(1),\n };\n }\n case \"select\":\n return state.selection === action.id ? state : { ...state, selection: action.id };\n case \"replace\":\n return state.doc === action.doc ? state : { ...state, doc: action.doc, future: [] };\n default:\n return state;\n }\n}\n","import { useCallback, useMemo, useReducer } from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport type { PageOp } from \"../document/ops\";\nimport { editorReduce, initEditor, type EditorState } from \"./state\";\n\nexport interface EditorApi {\n state: EditorState;\n /** Dispatch a mutation through the op-spine (records an undo snapshot). */\n apply: (op: PageOp) => void;\n undo: () => void;\n redo: () => void;\n select: (id: string | null) => void;\n /** Replace the document wholesale (e.g. a controlled `value` change). */\n replace: (doc: PageDoc) => void;\n canUndo: boolean;\n canRedo: boolean;\n}\n\nexport function useEditor(initialDoc: PageDoc): EditorApi {\n const [state, dispatch] = useReducer(editorReduce, initialDoc, initEditor);\n const apply = useCallback((op: PageOp) => dispatch({ type: \"apply\", op }), []);\n const undo = useCallback(() => dispatch({ type: \"undo\" }), []);\n const redo = useCallback(() => dispatch({ type: \"redo\" }), []);\n const select = useCallback((id: string | null) => dispatch({ type: \"select\", id }), []);\n const replace = useCallback((doc: PageDoc) => dispatch({ type: \"replace\", doc }), []);\n\n return useMemo(\n () => ({\n state,\n apply,\n undo,\n redo,\n select,\n replace,\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n }),\n [state, apply, undo, redo, select, replace],\n );\n}\n","/**\n * Stages document model — see `fancy-ui/docs/fancy-cms.md` §4.\n *\n * A page is a vertical stack of full-bleed **sections**; inside each, **layers**\n * are positioned by constraints (free + bold stays responsive), with stack/grid\n * containers where structure is wanted. Nodes live in a **flat map** keyed by id\n * (Figma-style) so ops target a stable identity and collab merges stay clean.\n */\n\nexport type NodeId = string;\n\nexport type ScrollMode = \"snap\" | \"smooth\";\n\n/** Ordered, mobile-first. Convention: `\"base\" | \"md\" | \"lg\"`. */\nexport type Breakpoint = string;\n\nexport type Json = string | number | boolean | null | Json[] | { [key: string]: Json };\n\n/** A literal value OR a binding into the page's data context (`{ $bind: \"profile.coins\" }`). */\nexport interface Binding {\n $bind: string;\n}\nexport type Bound<T> = T | Binding;\n\nexport function isBinding(v: unknown): v is Binding {\n return typeof v === \"object\" && v !== null && typeof (v as Binding).$bind === \"string\";\n}\n\n// ── Sizing ────────────────────────────────────────────────────────────────\n\nexport type LengthUnit = \"px\" | \"%\" | \"vw\" | \"vh\" | \"rem\" | \"fr\";\nexport interface Length {\n value: number;\n unit: LengthUnit;\n}\nexport type SizeMode = Length | \"fill\" | \"hug\";\n\nexport interface Constraints {\n /** Pinned offsets within a `free` parent (null = unpinned). */\n left?: Length | null;\n right?: Length | null;\n top?: Length | null;\n bottom?: Length | null;\n centerX?: boolean;\n centerY?: boolean;\n width: SizeMode;\n height: SizeMode;\n}\n\nexport type LayoutMode = \"free\" | \"stack\" | \"grid\";\n\n// ── Style (compiles deterministically to CSS in both emitters) ──────────────\n\nexport interface StyleProps {\n // box\n padding?: Length;\n margin?: Length;\n radius?: Length;\n // color / surface\n background?: string; // color | gradient | url(...)\n color?: string;\n opacity?: number;\n // typography\n fontFamily?: string;\n fontSize?: Length;\n fontWeight?: number;\n lineHeight?: number;\n textAlign?: \"left\" | \"center\" | \"right\" | \"justify\";\n letterSpacing?: Length;\n // border / shadow / effects (static)\n border?: string;\n boxShadow?: string;\n transform?: string;\n filter?: string;\n // container knobs (when layout = stack | grid)\n gap?: Length;\n direction?: \"row\" | \"column\";\n columns?: number;\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n justify?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\";\n}\n\n/** Per-breakpoint overrides; `base` is required, others cascade mobile-first. */\nexport type PerBreakpoint<T> = { base: T } & Partial<Record<Breakpoint, Partial<T>>>;\n\n// ── Animation (typed for Phase 2; ignored by the static CSS emitter) ────────\n\nexport type AnimDriver = \"enter\" | \"scroll\" | \"loop\" | \"hover\" | \"click\" | \"drag\";\nexport interface Keyframe {\n at: number; // 0..1\n props: Record<string, number | string>;\n}\nexport interface Anim {\n id: string;\n driver: AnimDriver;\n keyframes: Keyframe[];\n range?: { start: number; end: number };\n ease?: string;\n duration?: number;\n delay?: number;\n stagger?: number;\n once?: boolean;\n emit?: \"css\" | \"js\";\n}\n\n// ── Actions (typed for Phase 3/4) ───────────────────────────────────────────\n\nexport type ActionEvent = \"click\" | \"submit\" | \"change\" | \"load\" | \"timer\" | \"scroll-into\" | \"hover\";\nexport type ActionHandler =\n | { kind: \"navigate\"; href: Bound<string> }\n | { kind: \"submitForm\"; endpoint: string; method?: \"post\" | \"put\" }\n | { kind: \"mutate\"; target: string; value: Bound<Json> }\n | { kind: \"callEndpoint\"; endpoint: string; method?: string }\n | { kind: \"runFlow\"; flow: string }\n | { kind: \"openModal\"; node: NodeId }\n | { kind: \"openDrawer\"; node: NodeId }\n | { kind: \"playTimeline\"; section: NodeId }\n | { kind: \"toggleNode\"; node: NodeId };\nexport interface Action {\n on: ActionEvent;\n do: ActionHandler;\n}\n\n// ── Nodes & document ────────────────────────────────────────────────────────\n\nexport interface Node {\n id: NodeId;\n /** Addon key: `section | text | image | shape | stack | grid | frame | <addon>`. */\n type: string;\n /** `null` = a top-level section. */\n parent: NodeId | null;\n /** Fractional index — collab-safe ordering among siblings. */\n order: string;\n /** Addon-specific props; any value may be a {@link Binding}. */\n props: Record<string, Bound<Json>>;\n /** How this node arranges its children. */\n layout?: LayoutMode;\n /** How this node positions itself within its parent. */\n constraints?: PerBreakpoint<Constraints>;\n style: PerBreakpoint<StyleProps>;\n animations?: Anim[];\n actions?: Action[];\n /** Repeater: render this node once per item of a bound array. */\n repeat?: { each: Binding; as: string };\n /** Derived from the addon manifest — interactive/3rd-party ⇒ hydration island. */\n island?: boolean;\n}\n\nexport interface ThemeTokens {\n name?: string;\n [key: string]: Json | undefined;\n}\n\nexport interface PageMeta {\n title: string;\n slug: string;\n scrollMode: ScrollMode;\n seo?: Record<string, string>;\n}\n\nexport interface PageDoc {\n id: string;\n /** Op counter — collab ordering + revision checkpoints. */\n seq: number;\n meta: PageMeta;\n theme: ThemeTokens;\n /** Ordered, mobile-first. */\n breakpoints: Breakpoint[];\n /** Top-level section order. */\n sections: NodeId[];\n /** Flat map — not a nested tree. */\n nodes: Record<NodeId, Node>;\n}\n\n/** Default breakpoint → min-width (px) map. `base` has no media query. */\nexport const DEFAULT_BREAKPOINTS: Record<string, number> = {\n base: 0,\n md: 768,\n lg: 1024,\n};\n\n/** A minimal empty document. */\nexport function emptyDoc(id: string, slug = \"/\"): PageDoc {\n return {\n id,\n seq: 0,\n meta: { title: \"Untitled\", slug, scrollMode: \"smooth\" },\n theme: { name: \"default\" },\n breakpoints: [\"base\", \"md\", \"lg\"],\n sections: [],\n nodes: {},\n };\n}\n","/**\n * The JS style → CSS emitter (one half of the dual-emitter pair; the PHP\n * `particle-academy/fancy-cms` mirrors it byte-for-byte). Output is\n * **deterministic**: declarations are sorted, selectors and media blocks use a\n * fixed format, and nodes are emitted in sorted-id order — so the parity harness\n * can diff the two engines' CSS exactly.\n *\n * Phase 0 covers the static subset (layout / constraints / style). Motion lands\n * in Phase 2.\n */\nimport {\n DEFAULT_BREAKPOINTS,\n type Constraints,\n type Length,\n type Node,\n type PageDoc,\n type SizeMode,\n type StyleProps,\n} from \"../document/types\";\n\nconst selectorFor = (id: string): string => `[data-cms=\"${id}\"]`;\n\nfunction lengthToCss(len: Length): string {\n return `${len.value}${len.unit}`;\n}\n\nfunction sizeToCss(size: SizeMode): string {\n if (size === \"fill\") return \"100%\";\n if (size === \"hug\") return \"auto\";\n return lengthToCss(size);\n}\n\nconst ALIGN: Record<string, string> = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n stretch: \"stretch\",\n};\nconst JUSTIFY: Record<string, string> = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n between: \"space-between\",\n around: \"space-around\",\n};\n\n/** Map StyleProps → CSS declarations (property → value). */\nfunction styleDecls(style: Partial<StyleProps>): Record<string, string> {\n const d: Record<string, string> = {};\n if (style.padding) d[\"padding\"] = lengthToCss(style.padding);\n if (style.margin) d[\"margin\"] = lengthToCss(style.margin);\n if (style.radius) d[\"border-radius\"] = lengthToCss(style.radius);\n if (style.background !== undefined) d[\"background\"] = style.background;\n if (style.color !== undefined) d[\"color\"] = style.color;\n if (style.opacity !== undefined) d[\"opacity\"] = String(style.opacity);\n if (style.fontFamily !== undefined) d[\"font-family\"] = style.fontFamily;\n if (style.fontSize) d[\"font-size\"] = lengthToCss(style.fontSize);\n if (style.fontWeight !== undefined) d[\"font-weight\"] = String(style.fontWeight);\n if (style.lineHeight !== undefined) d[\"line-height\"] = String(style.lineHeight);\n if (style.textAlign !== undefined) d[\"text-align\"] = style.textAlign;\n if (style.letterSpacing) d[\"letter-spacing\"] = lengthToCss(style.letterSpacing);\n if (style.border !== undefined) d[\"border\"] = style.border;\n if (style.boxShadow !== undefined) d[\"box-shadow\"] = style.boxShadow;\n if (style.transform !== undefined) d[\"transform\"] = style.transform;\n if (style.filter !== undefined) d[\"filter\"] = style.filter;\n if (style.gap) d[\"gap\"] = lengthToCss(style.gap);\n if (style.align !== undefined) d[\"align-items\"] = ALIGN[style.align] ?? style.align;\n if (style.justify !== undefined) d[\"justify-content\"] = JUSTIFY[style.justify] ?? style.justify;\n return d;\n}\n\n/** Container behaviour from `node.layout`. */\nfunction layoutDecls(node: Node): Record<string, string> {\n const d: Record<string, string> = {};\n if (node.layout === \"stack\") {\n d[\"display\"] = \"flex\";\n d[\"flex-direction\"] = node.style.base.direction ?? \"column\";\n } else if (node.layout === \"grid\") {\n d[\"display\"] = \"grid\";\n d[\"grid-template-columns\"] = `repeat(${node.style.base.columns ?? 1}, 1fr)`;\n } else if (node.layout === \"free\") {\n d[\"position\"] = \"relative\";\n }\n return d;\n}\n\n/** Self-positioning from constraints (absolute pins only inside a `free` parent). */\nfunction constraintDecls(c: Partial<Constraints>, parentFree: boolean): Record<string, string> {\n const d: Record<string, string> = {};\n const transforms: string[] = [];\n if (parentFree) {\n d[\"position\"] = \"absolute\";\n if (c.left) d[\"left\"] = lengthToCss(c.left);\n if (c.right) d[\"right\"] = lengthToCss(c.right);\n if (c.top) d[\"top\"] = lengthToCss(c.top);\n if (c.bottom) d[\"bottom\"] = lengthToCss(c.bottom);\n if (c.centerX) {\n d[\"left\"] = \"50%\";\n transforms.push(\"translateX(-50%)\");\n }\n if (c.centerY) {\n d[\"top\"] = \"50%\";\n transforms.push(\"translateY(-50%)\");\n }\n if (transforms.length) d[\"transform\"] = transforms.join(\" \");\n }\n if (c.width) d[\"width\"] = sizeToCss(c.width);\n if (c.height) d[\"height\"] = sizeToCss(c.height);\n return d;\n}\n\nfunction isParentFree(doc: PageDoc, node: Node): boolean {\n if (node.parent === null) return false; // sections stack in the page flow\n const parent = doc.nodes[node.parent];\n return !parent || parent.layout === undefined || parent.layout === \"free\";\n}\n\nfunction serializeRule(selector: string, decls: Record<string, string>, indent: string): string {\n const props = Object.keys(decls).sort();\n if (props.length === 0) return \"\";\n const body = props.map((p) => `${indent} ${p}: ${decls[p]};`).join(\"\\n\");\n return `${indent}${selector} {\\n${body}\\n${indent}}`;\n}\n\n/** Emit the full stylesheet for a document. Deterministic. */\nexport function emitDocCss(doc: PageDoc): string {\n const breakpointPx = DEFAULT_BREAKPOINTS;\n const blocks: string[] = [];\n\n for (const id of Object.keys(doc.nodes).sort()) {\n const node = doc.nodes[id]!;\n const selector = selectorFor(id);\n const parentFree = isParentFree(doc, node);\n\n // base = style.base + layout + constraints.base\n const base: Record<string, string> = {\n ...layoutDecls(node),\n ...(node.constraints ? constraintDecls(node.constraints.base, parentFree) : {}),\n ...styleDecls(node.style.base),\n };\n const baseRule = serializeRule(selector, base, \"\");\n if (baseRule) blocks.push(baseRule);\n\n // per-breakpoint overrides (mobile-first, in doc order, skipping base)\n for (const bp of doc.breakpoints) {\n if (bp === \"base\") continue;\n const px = breakpointPx[bp];\n if (px === undefined) continue;\n const decls: Record<string, string> = {\n ...(node.constraints?.[bp] ? constraintDecls(node.constraints[bp]!, parentFree) : {}),\n ...(node.style[bp] ? styleDecls(node.style[bp]!) : {}),\n };\n const inner = serializeRule(selector, decls, \" \");\n if (inner) blocks.push(`@media (min-width: ${px}px) {\\n${inner}\\n}`);\n }\n }\n\n return blocks.join(\"\\n\\n\") + (blocks.length ? \"\\n\" : \"\");\n}\n","import type { ReactNode } from \"react\";\nimport { isBinding, type Bound, type Json, type Node, type PageDoc } from \"../document/types\";\n\nexport interface ElementContext {\n node: Node;\n doc: PageDoc;\n /** Pre-rendered child nodes, in order. */\n children: ReactNode;\n}\n\n/**\n * Renders the INNER content of a node. The outer `[data-cms]` wrapper is added\n * by {@link RenderNode}, so a renderer only returns what goes inside.\n */\nexport type ElementRenderer = (ctx: ElementContext) => ReactNode;\n\nexport type ElementRegistry = Record<string, ElementRenderer>;\n\n/** Resolve a literal prop to a string (bindings resolve in Phase 3). */\nfunction literal(v: Bound<Json> | undefined): string {\n if (v === undefined || v === null) return \"\";\n if (isBinding(v)) return \"\";\n return String(v);\n}\n\n/** Built-in native elements. Containers render their children; leaves render content. */\nexport const defaultRegistry: ElementRegistry = {\n section: ({ children }) => children,\n stack: ({ children }) => children,\n grid: ({ children }) => children,\n frame: ({ children }) => children,\n shape: ({ children }) => children,\n text: ({ node }) => literal(node.props.content),\n image: ({ node }) => (\n <img\n src={literal(node.props.src)}\n alt={literal(node.props.alt)}\n style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\", display: \"block\" }}\n />\n ),\n};\n","import type { ReactElement } from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport { childrenOf } from \"../document/reduce\";\nimport { defaultRegistry, type ElementRegistry } from \"./registry\";\n\nexport interface RenderNodeProps {\n doc: PageDoc;\n id: string;\n registry?: ElementRegistry;\n}\n\n/**\n * Render one node (and its subtree) to a `[data-cms]`-tagged element. The CSS\n * emitted by `emitDocCss` targets these `data-cms` handles. Interactive /\n * 3rd-party **islands** with no registered renderer become an empty, sized\n * placeholder the host hydrates client-side — mirroring the PHP renderer.\n */\nexport function RenderNode({ doc, id, registry = defaultRegistry }: RenderNodeProps): ReactElement | null {\n const node = doc.nodes[id];\n if (!node) return null;\n\n const kids = childrenOf(doc, id).map((child) => (\n <RenderNode key={child.id} doc={doc} id={child.id} registry={registry} />\n ));\n\n const renderer = registry[node.type];\n const inner = renderer ? renderer({ node, doc, children: kids }) : node.island ? null : kids;\n\n return (\n <div data-cms={node.id} data-cms-island={node.island ? node.type : undefined}>\n {inner}\n </div>\n );\n}\n","import { Fragment, type ReactElement } from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport { emitDocCss } from \"../render/css\";\nimport { RenderNode } from \"./RenderNode\";\nimport { defaultRegistry, type ElementRegistry } from \"./registry\";\n\nexport interface CmsPageProps {\n doc: PageDoc;\n registry?: ElementRegistry;\n /** Inject the compiled stylesheet. Set false when the host emits CSS itself. */\n includeStyles?: boolean;\n}\n\n/** Render a full page document: the compiled stylesheet + every section. */\nexport function CmsPage({\n doc,\n registry = defaultRegistry,\n includeStyles = true,\n}: CmsPageProps): ReactElement {\n return (\n <Fragment>\n {includeStyles ? <style data-cms-styles=\"\">{emitDocCss(doc)}</style> : null}\n {doc.sections.map((id) => (\n <RenderNode key={id} doc={doc} id={id} registry={registry} />\n ))}\n </Fragment>\n );\n}\n","import {\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n} from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport type { PageOp } from \"../document/ops\";\nimport { CmsPage } from \"../react/CmsPage\";\n\nexport interface CanvasProps {\n doc: PageDoc;\n selection: string | null;\n onSelect: (id: string | null) => void;\n apply: (op: PageOp) => void;\n}\n\ninterface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/**\n * The edit surface: renders the live page and overlays a selection box. Click to\n * select; drag the box to move (px constraints). Phase 1 cut: free-parent\n * move + resize handles, stack/grid reordering, and snapping come next.\n */\nexport function Canvas({ doc, selection, onSelect, apply }: CanvasProps): ReactElement {\n const ref = useRef<HTMLDivElement>(null);\n const [box, setBox] = useState<Box | null>(null);\n const drag = useRef<{ x: number; y: number; left: number; top: number } | null>(null);\n\n useLayoutEffect(() => {\n const root = ref.current;\n if (!root || !selection) {\n setBox(null);\n return;\n }\n const el = root.querySelector(`[data-cms=\"${cssEscape(selection)}\"]`);\n if (!el) {\n setBox(null);\n return;\n }\n const r = el.getBoundingClientRect();\n const rootRect = root.getBoundingClientRect();\n setBox({\n x: r.left - rootRect.left + root.scrollLeft,\n y: r.top - rootRect.top + root.scrollTop,\n w: r.width,\n h: r.height,\n });\n }, [selection, doc]);\n\n const handleClick = (e: ReactMouseEvent<HTMLDivElement>) => {\n const target = (e.target as HTMLElement).closest(\"[data-cms]\");\n onSelect(target ? target.getAttribute(\"data-cms\") : null);\n };\n\n const handlePointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!selection) return;\n const c = doc.nodes[selection]?.constraints?.base;\n const left = c && c.left && typeof c.left === \"object\" ? c.left.value : 0;\n const top = c && c.top && typeof c.top === \"object\" ? c.top.value : 0;\n drag.current = { x: e.clientX, y: e.clientY, left, top };\n e.currentTarget.setPointerCapture(e.pointerId);\n e.stopPropagation();\n };\n\n const handlePointerMove = (e: ReactPointerEvent<HTMLDivElement>) => {\n const d = drag.current;\n if (!d || !selection) return;\n apply({\n t: \"set_constraints\",\n id: selection,\n breakpoint: \"base\",\n patch: {\n left: { value: Math.round(d.left + (e.clientX - d.x)), unit: \"px\" },\n top: { value: Math.round(d.top + (e.clientY - d.y)), unit: \"px\" },\n },\n });\n };\n\n const handlePointerUp = () => {\n drag.current = null;\n };\n\n const surface: CSSProperties = {\n position: \"relative\",\n overflow: \"auto\",\n height: \"100%\",\n background: \"#f8fafc\",\n };\n const overlay: CSSProperties = box\n ? {\n position: \"absolute\",\n left: box.x,\n top: box.y,\n width: box.w,\n height: box.h,\n outline: \"2px solid #8b5cf6\",\n outlineOffset: -1,\n cursor: \"move\",\n touchAction: \"none\",\n }\n : { display: \"none\" };\n\n return (\n <div ref={ref} onClick={handleClick} style={surface}>\n <CmsPage doc={doc} />\n <div\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={overlay}\n />\n </div>\n );\n}\n\nfunction cssEscape(value: string): string {\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n","import { Fragment, type ReactElement } from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport { childrenOf } from \"../document/reduce\";\n\nexport interface LayersPanelProps {\n doc: PageDoc;\n selection: string | null;\n onSelect: (id: string) => void;\n}\n\n/** The section/layer tree. Click a row to select. */\nexport function LayersPanel({ doc, selection, onSelect }: LayersPanelProps): ReactElement {\n return (\n <div style={{ overflow: \"auto\", padding: 8, fontSize: 13, fontFamily: \"system-ui, sans-serif\" }}>\n {doc.sections.map((id) => (\n <LayerRow key={id} doc={doc} id={id} depth={0} selection={selection} onSelect={onSelect} />\n ))}\n </div>\n );\n}\n\ninterface LayerRowProps extends LayersPanelProps {\n id: string;\n depth: number;\n}\n\nfunction LayerRow({ doc, id, depth, selection, onSelect }: LayerRowProps): ReactElement | null {\n const node = doc.nodes[id];\n if (!node) return null;\n const selected = selection === id;\n return (\n <Fragment>\n <button\n type=\"button\"\n onClick={() => onSelect(id)}\n style={{\n display: \"block\",\n width: \"100%\",\n textAlign: \"left\",\n border: \"none\",\n borderRadius: 6,\n cursor: \"pointer\",\n padding: \"4px 8px\",\n paddingLeft: 8 + depth * 14,\n background: selected ? \"#ede9fe\" : \"transparent\",\n color: selected ? \"#5b21b6\" : \"#334155\",\n font: \"inherit\",\n }}\n >\n <span style={{ opacity: 0.6 }}>{node.type}</span> · {id}\n </button>\n {childrenOf(doc, id).map((child) => (\n <LayerRow\n key={child.id}\n doc={doc}\n id={child.id}\n depth={depth + 1}\n selection={selection}\n onSelect={onSelect}\n />\n ))}\n </Fragment>\n );\n}\n","import type { CSSProperties, ReactElement } from \"react\";\nimport type { PageDoc, StyleProps } from \"../document/types\";\nimport type { PageOp } from \"../document/ops\";\n\nexport interface InspectorProps {\n doc: PageDoc;\n selection: string | null;\n apply: (op: PageOp) => void;\n}\n\nconst label: CSSProperties = {\n display: \"block\",\n fontSize: 11,\n textTransform: \"uppercase\",\n letterSpacing: \"0.04em\",\n color: \"#94a3b8\",\n margin: \"10px 0 4px\",\n};\nconst input: CSSProperties = {\n width: \"100%\",\n boxSizing: \"border-box\",\n padding: \"6px 8px\",\n borderRadius: 6,\n border: \"1px solid #e2e8f0\",\n font: \"inherit\",\n fontSize: 13,\n};\n\n/** Contextual property editor for the selected node. Every change is one op. */\nexport function Inspector({ doc, selection, apply }: InspectorProps): ReactElement {\n const node = selection ? doc.nodes[selection] : null;\n if (!node) {\n return (\n <div style={{ padding: 16, color: \"#94a3b8\", fontFamily: \"system-ui, sans-serif\", fontSize: 13 }}>\n Select an element to edit.\n </div>\n );\n }\n\n const s = node.style.base;\n const setStyle = (patch: Partial<StyleProps>) =>\n apply({ t: \"set_style\", id: node.id, breakpoint: \"base\", patch });\n const setProp = (key: string, value: unknown) =>\n apply({ t: \"set_props\", id: node.id, patch: { [key]: value } });\n\n return (\n <div style={{ overflow: \"auto\", padding: 16, fontFamily: \"system-ui, sans-serif\", height: \"100%\", boxSizing: \"border-box\" }}>\n <div style={{ fontSize: 13, fontWeight: 600, color: \"#0f172a\" }}>{node.type}</div>\n <div style={{ fontSize: 11, color: \"#94a3b8\", marginBottom: 8 }}>{node.id}</div>\n\n {node.type === \"text\" ? (\n <>\n <label style={label}>Content</label>\n <textarea\n style={{ ...input, minHeight: 64, resize: \"vertical\" }}\n value={typeof node.props.content === \"string\" ? node.props.content : \"\"}\n onChange={(e) => setProp(\"content\", e.target.value)}\n />\n </>\n ) : null}\n\n {node.type === \"image\" ? (\n <>\n <label style={label}>Source</label>\n <input\n style={input}\n value={typeof node.props.src === \"string\" ? node.props.src : \"\"}\n onChange={(e) => setProp(\"src\", e.target.value)}\n />\n </>\n ) : null}\n\n <label style={label}>Background</label>\n <input\n style={input}\n placeholder=\"#ffffff | gradient | url(…)\"\n value={s.background ?? \"\"}\n onChange={(e) => setStyle({ background: e.target.value })}\n />\n\n <label style={label}>Text color</label>\n <input\n style={input}\n placeholder=\"#0f172a\"\n value={s.color ?? \"\"}\n onChange={(e) => setStyle({ color: e.target.value })}\n />\n\n <label style={label}>Font size (px)</label>\n <input\n type=\"number\"\n style={input}\n value={s.fontSize?.value ?? \"\"}\n onChange={(e) => setStyle({ fontSize: { value: Number(e.target.value) || 0, unit: \"px\" } })}\n />\n\n <label style={label}>Padding (px)</label>\n <input\n type=\"number\"\n style={input}\n value={s.padding?.value ?? \"\"}\n onChange={(e) => setStyle({ padding: { value: Number(e.target.value) || 0, unit: \"px\" } })}\n />\n\n <label style={label}>Opacity</label>\n <input\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n max=\"1\"\n style={input}\n value={s.opacity ?? \"\"}\n onChange={(e) => setStyle({ opacity: Number(e.target.value) })}\n />\n </div>\n );\n}\n","import { useEffect, useRef, type CSSProperties, type ReactElement } from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport { useEditor, type EditorApi } from \"./useEditor\";\nimport { Canvas } from \"./Canvas\";\nimport { LayersPanel } from \"./LayersPanel\";\nimport { Inspector } from \"./Inspector\";\n\nexport interface EditorProps {\n /** Initial document; edits are surfaced via {@link EditorProps.onChange}. */\n defaultValue: PageDoc;\n onChange?: (doc: PageDoc) => void;\n}\n\n/**\n * The fancy-cms editor: layers · canvas · inspector over the op-spine. Phase 1\n * cut — chrome is plain markup for now; it graduates to react-fancy next.\n */\nexport function Editor({ defaultValue, onChange }: EditorProps): ReactElement {\n const ed = useEditor(defaultValue);\n const first = useRef(true);\n\n useEffect(() => {\n if (first.current) {\n first.current = false;\n return;\n }\n onChange?.(ed.state.doc);\n }, [ed.state.doc, onChange]);\n\n const shell: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"220px 1fr 300px\",\n height: \"100%\",\n minHeight: 0,\n background: \"#fff\",\n color: \"#0f172a\",\n border: \"1px solid #e2e8f0\",\n borderRadius: 12,\n overflow: \"hidden\",\n };\n\n return (\n <div style={shell}>\n <div style={{ borderRight: \"1px solid #e2e8f0\", display: \"flex\", flexDirection: \"column\", minHeight: 0 }}>\n <Toolbar ed={ed} />\n <LayersPanel doc={ed.state.doc} selection={ed.state.selection} onSelect={ed.select} />\n </div>\n <Canvas doc={ed.state.doc} selection={ed.state.selection} onSelect={ed.select} apply={ed.apply} />\n <div style={{ borderLeft: \"1px solid #e2e8f0\", minHeight: 0 }}>\n <Inspector doc={ed.state.doc} selection={ed.state.selection} apply={ed.apply} />\n </div>\n </div>\n );\n}\n\nfunction Toolbar({ ed }: { ed: EditorApi }): ReactElement {\n const btn: CSSProperties = {\n font: \"inherit\",\n fontSize: 12,\n padding: \"4px 10px\",\n borderRadius: 6,\n border: \"1px solid #e2e8f0\",\n background: \"#fff\",\n cursor: \"pointer\",\n };\n return (\n <div\n style={{\n display: \"flex\",\n gap: 6,\n padding: 8,\n borderBottom: \"1px solid #e2e8f0\",\n fontFamily: \"system-ui, sans-serif\",\n }}\n >\n <button type=\"button\" style={{ ...btn, opacity: ed.canUndo ? 1 : 0.4 }} disabled={!ed.canUndo} onClick={ed.undo}>\n Undo\n </button>\n <button type=\"button\" style={{ ...btn, opacity: ed.canRedo ? 1 : 0.4 }} disabled={!ed.canRedo} onClick={ed.redo}>\n Redo\n </button>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/document/reduce.ts","../src/editor/state.ts","../src/editor/useEditor.ts","../src/document/types.ts","../src/render/css.ts","../src/react/registry.tsx","../src/react/RenderNode.tsx","../src/react/CmsPage.tsx","../src/editor/Canvas.tsx","../src/editor/LayersPanel.tsx","../src/editor/Inspector.tsx","../src/editor/Editor.tsx","../src/editor/EditablePage.tsx"],"names":["useReducer","useCallback","useMemo","jsx","Fragment","useRef","useState","useLayoutEffect","jsxs","useEffect","cssEscape"],"mappings":"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","file":"editor.cjs","sourcesContent":["/**\n * The pure, total reducer. `reduce(doc, op)` returns a new document; an invalid\n * op is a **logged no-op** (returns the same doc, `seq` unchanged). That single\n * property is what makes undo, revisions, collaboration, and agent edits all\n * flow through one spine.\n *\n * Ordering: top-level order is the canonical `sections` array; child order is\n * the fractional `order` field among siblings (see `fractional.ts`).\n */\nimport type { Action, Node, NodeId, PageDoc, StyleProps } from \"./types\";\nimport type { PageOp } from \"./ops\";\n\nexport interface ReduceOptions {\n /** Called when an op can't apply. Default: silent. */\n onInvalid?: (op: PageOp, reason: string) => void;\n}\n\n/** Children of a node (or top-level when `parent` is null), in order. */\nexport function childrenOf(doc: PageDoc, parent: NodeId | null): Node[] {\n if (parent === null) {\n return doc.sections.map((id) => doc.nodes[id]).filter((n): n is Node => Boolean(n));\n }\n const out: Node[] = [];\n for (const id of Object.keys(doc.nodes)) {\n const n = doc.nodes[id]!;\n if (n.parent === parent) out.push(n);\n }\n out.sort((a, b) => (a.order < b.order ? -1 : a.order > b.order ? 1 : 0));\n return out;\n}\n\n/** Every transitive descendant id of `id` (excludes `id`). */\nexport function descendantIds(doc: PageDoc, id: NodeId): NodeId[] {\n const out: NodeId[] = [];\n const stack: NodeId[] = [id];\n while (stack.length) {\n const current = stack.pop()!;\n for (const childId of Object.keys(doc.nodes)) {\n const n = doc.nodes[childId]!;\n if (n.parent === current) {\n out.push(childId);\n stack.push(childId);\n }\n }\n }\n return out;\n}\n\nfunction patchNode(doc: PageDoc, id: NodeId, patch: Partial<Node>): PageDoc {\n const node = doc.nodes[id]!;\n return {\n ...doc,\n nodes: { ...doc.nodes, [id]: { ...node, ...patch } },\n seq: doc.seq + 1,\n };\n}\n\nexport function reduce(doc: PageDoc, op: PageOp, opts: ReduceOptions = {}): PageDoc {\n const invalid = (reason: string): PageDoc => {\n opts.onInvalid?.(op, reason);\n return doc;\n };\n\n switch (op.t) {\n case \"insert_node\": {\n if (doc.nodes[op.node.id]) return invalid(\"node id already exists\");\n if (op.node.parent !== null && !doc.nodes[op.node.parent]) return invalid(\"parent not found\");\n return {\n ...doc,\n nodes: { ...doc.nodes, [op.node.id]: op.node },\n sections: op.node.parent === null ? [...doc.sections, op.node.id] : doc.sections,\n seq: doc.seq + 1,\n };\n }\n\n case \"remove_node\": {\n if (!doc.nodes[op.id]) return invalid(\"node not found\");\n const dead = new Set<NodeId>([op.id, ...descendantIds(doc, op.id)]);\n const nodes: Record<NodeId, Node> = {};\n for (const id of Object.keys(doc.nodes)) {\n if (!dead.has(id)) nodes[id] = doc.nodes[id]!;\n }\n return {\n ...doc,\n nodes,\n sections: doc.sections.filter((s) => !dead.has(s)),\n seq: doc.seq + 1,\n };\n }\n\n case \"move_node\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n if (op.parent === op.id) return invalid(\"cannot parent a node to itself\");\n if (op.parent !== null && !doc.nodes[op.parent]) return invalid(\"new parent not found\");\n if (op.parent !== null && descendantIds(doc, op.id).includes(op.parent)) {\n return invalid(\"move would create a cycle\");\n }\n const wasTop = node.parent === null;\n const nowTop = op.parent === null;\n let sections = doc.sections;\n if (wasTop && !nowTop) sections = sections.filter((s) => s !== op.id);\n else if (!wasTop && nowTop) sections = [...sections, op.id];\n return {\n ...doc,\n nodes: { ...doc.nodes, [op.id]: { ...node, parent: op.parent, order: op.order } },\n sections,\n seq: doc.seq + 1,\n };\n }\n\n case \"set_props\": {\n if (!doc.nodes[op.id]) return invalid(\"node not found\");\n return patchNode(doc, op.id, {\n props: { ...doc.nodes[op.id]!.props, ...op.patch } as unknown as Node[\"props\"],\n });\n }\n\n case \"set_style\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n const prev = node.style[op.breakpoint] ?? {};\n return patchNode(doc, op.id, {\n style: { ...node.style, [op.breakpoint]: { ...prev, ...op.patch } } as Node[\"style\"],\n });\n }\n\n case \"set_constraints\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n const base = node.constraints ?? { base: { width: \"hug\", height: \"hug\" } };\n const prev = base[op.breakpoint] ?? {};\n return patchNode(doc, op.id, {\n constraints: { ...base, [op.breakpoint]: { ...prev, ...op.patch } } as Node[\"constraints\"],\n });\n }\n\n case \"set_animation\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n const list = node.animations ?? [];\n const idx = list.findIndex((a) => a.id === op.anim.id);\n return patchNode(doc, op.id, {\n animations: idx >= 0 ? list.map((a, i) => (i === idx ? op.anim : a)) : [...list, op.anim],\n });\n }\n\n case \"remove_animation\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n return patchNode(doc, op.id, {\n animations: (node.animations ?? []).filter((a) => a.id !== op.animId),\n });\n }\n\n case \"set_action\": {\n const node = doc.nodes[op.id];\n if (!node) return invalid(\"node not found\");\n const list = node.actions ?? [];\n let actions: Action[];\n if (op.action === null) actions = list.filter((_, i) => i !== op.index);\n else if (op.index >= list.length) actions = [...list, op.action];\n else actions = list.map((a, i) => (i === op.index ? op.action! : a));\n return patchNode(doc, op.id, { actions });\n }\n\n case \"set_meta\":\n return { ...doc, meta: { ...doc.meta, ...op.patch }, seq: doc.seq + 1 };\n\n case \"set_theme\":\n return { ...doc, theme: { ...doc.theme, ...op.patch }, seq: doc.seq + 1 };\n\n case \"reorder_sections\": {\n const current = new Set(doc.sections);\n const same =\n op.order.length === doc.sections.length && op.order.every((id) => current.has(id));\n if (!same) return invalid(\"reorder must be a permutation of current sections\");\n return { ...doc, sections: [...op.order], seq: doc.seq + 1 };\n }\n\n default:\n return invalid(`unknown op \"${(op as PageOp).t}\"`);\n }\n}\n\n/** Apply a sequence of ops, threading the document. */\nexport function reduceAll(doc: PageDoc, ops: PageOp[], opts?: ReduceOptions): PageDoc {\n return ops.reduce((d, op) => reduce(d, op, opts), doc);\n}\n\n/**\n * Inverse op(s) for undo, computed against the **pre-op** document. Structural\n * ops invert cleanly; merge-style ops (`set_props`/`set_style`/`set_constraints`)\n * restore the previous values of the touched keys (keys that did not previously\n * exist can't be deleted via a merge — a known Phase-0 limitation).\n */\nexport function invert(doc: PageDoc, op: PageOp): PageOp[] {\n switch (op.t) {\n case \"insert_node\":\n return [{ t: \"remove_node\", id: op.node.id }];\n\n case \"remove_node\": {\n const node = doc.nodes[op.id];\n if (!node) return [];\n // Re-insert the subtree parent-first, then restore section order.\n const ids = [op.id, ...descendantIds(doc, op.id)];\n const inserts: PageOp[] = ids.map((id) => ({ t: \"insert_node\", node: doc.nodes[id]! }));\n if (node.parent === null) inserts.push({ t: \"reorder_sections\", order: [...doc.sections] });\n return inserts;\n }\n\n case \"move_node\": {\n const node = doc.nodes[op.id];\n if (!node) return [];\n const back: PageOp[] = [{ t: \"move_node\", id: op.id, parent: node.parent, order: node.order }];\n if (node.parent === null) back.push({ t: \"reorder_sections\", order: [...doc.sections] });\n return back;\n }\n\n case \"set_props\": {\n const node = doc.nodes[op.id];\n if (!node) return [];\n const prev: Record<string, unknown> = {};\n for (const k of Object.keys(op.patch)) prev[k] = node.props[k];\n return [{ t: \"set_props\", id: op.id, patch: prev }];\n }\n\n case \"set_style\": {\n const node = doc.nodes[op.id];\n if (!node) return [];\n const prevBp = (node.style[op.breakpoint] ?? {}) as Record<string, unknown>;\n const prev: Partial<StyleProps> = {};\n for (const k of Object.keys(op.patch)) (prev as Record<string, unknown>)[k] = prevBp[k];\n return [{ t: \"set_style\", id: op.id, breakpoint: op.breakpoint, patch: prev }];\n }\n\n case \"set_meta\":\n return [{ t: \"set_meta\", patch: pick(doc.meta, Object.keys(op.patch)) }];\n\n case \"set_theme\":\n return [{ t: \"set_theme\", patch: pick(doc.theme, Object.keys(op.patch)) }];\n\n case \"reorder_sections\":\n return [{ t: \"reorder_sections\", order: [...doc.sections] }];\n\n default:\n return [];\n }\n}\n\nfunction pick<T extends object>(obj: T, keys: string[]): Partial<T> {\n const out: Partial<T> = {};\n for (const k of keys) (out as Record<string, unknown>)[k] = (obj as Record<string, unknown>)[k];\n return out;\n}\n","/**\n * Editor state engine — pure and framework-agnostic so it's unit-testable.\n * `useEditor` wraps this with `useReducer`. Undo/redo uses document snapshots\n * (simple + robust); the op-level `invert` in the spine is for collab/op-stream\n * undo.\n */\nimport type { PageDoc } from \"../document/types\";\nimport type { PageOp } from \"../document/ops\";\nimport { reduce } from \"../document/reduce\";\n\nexport interface EditorState {\n doc: PageDoc;\n past: PageDoc[];\n future: PageDoc[];\n selection: string | null;\n}\n\nexport type EditorAction =\n | { type: \"apply\"; op: PageOp }\n | { type: \"undo\" }\n | { type: \"redo\" }\n | { type: \"select\"; id: string | null }\n | { type: \"replace\"; doc: PageDoc };\n\nconst HISTORY_LIMIT = 100;\n\nexport function initEditor(doc: PageDoc): EditorState {\n return { doc, past: [], future: [], selection: null };\n}\n\nexport function editorReduce(state: EditorState, action: EditorAction): EditorState {\n switch (action.type) {\n case \"apply\": {\n const next = reduce(state.doc, action.op);\n if (next === state.doc) return state; // invalid op → no-op, no history entry\n return {\n ...state,\n doc: next,\n past: [...state.past, state.doc].slice(-HISTORY_LIMIT),\n future: [],\n };\n }\n case \"undo\": {\n if (state.past.length === 0) return state;\n const prev = state.past[state.past.length - 1]!;\n return {\n ...state,\n doc: prev,\n past: state.past.slice(0, -1),\n future: [state.doc, ...state.future],\n };\n }\n case \"redo\": {\n if (state.future.length === 0) return state;\n const next = state.future[0]!;\n return {\n ...state,\n doc: next,\n past: [...state.past, state.doc],\n future: state.future.slice(1),\n };\n }\n case \"select\":\n return state.selection === action.id ? state : { ...state, selection: action.id };\n case \"replace\":\n return state.doc === action.doc ? state : { ...state, doc: action.doc, future: [] };\n default:\n return state;\n }\n}\n","import { useCallback, useMemo, useReducer } from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport type { PageOp } from \"../document/ops\";\nimport { editorReduce, initEditor, type EditorState } from \"./state\";\n\nexport interface EditorApi {\n state: EditorState;\n /** Dispatch a mutation through the op-spine (records an undo snapshot). */\n apply: (op: PageOp) => void;\n undo: () => void;\n redo: () => void;\n select: (id: string | null) => void;\n /** Replace the document wholesale (e.g. a controlled `value` change). */\n replace: (doc: PageDoc) => void;\n canUndo: boolean;\n canRedo: boolean;\n}\n\nexport function useEditor(initialDoc: PageDoc): EditorApi {\n const [state, dispatch] = useReducer(editorReduce, initialDoc, initEditor);\n const apply = useCallback((op: PageOp) => dispatch({ type: \"apply\", op }), []);\n const undo = useCallback(() => dispatch({ type: \"undo\" }), []);\n const redo = useCallback(() => dispatch({ type: \"redo\" }), []);\n const select = useCallback((id: string | null) => dispatch({ type: \"select\", id }), []);\n const replace = useCallback((doc: PageDoc) => dispatch({ type: \"replace\", doc }), []);\n\n return useMemo(\n () => ({\n state,\n apply,\n undo,\n redo,\n select,\n replace,\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n }),\n [state, apply, undo, redo, select, replace],\n );\n}\n","/**\n * Stages document model — see `fancy-ui/docs/fancy-cms.md` §4.\n *\n * A page is a vertical stack of full-bleed **sections**; inside each, **layers**\n * are positioned by constraints (free + bold stays responsive), with stack/grid\n * containers where structure is wanted. Nodes live in a **flat map** keyed by id\n * (Figma-style) so ops target a stable identity and collab merges stay clean.\n */\n\nexport type NodeId = string;\n\nexport type ScrollMode = \"snap\" | \"smooth\";\n\n/** Ordered, mobile-first. Convention: `\"base\" | \"md\" | \"lg\"`. */\nexport type Breakpoint = string;\n\nexport type Json = string | number | boolean | null | Json[] | { [key: string]: Json };\n\n/** A literal value OR a binding into the page's data context (`{ $bind: \"profile.coins\" }`). */\nexport interface Binding {\n $bind: string;\n}\nexport type Bound<T> = T | Binding;\n\nexport function isBinding(v: unknown): v is Binding {\n return typeof v === \"object\" && v !== null && typeof (v as Binding).$bind === \"string\";\n}\n\n// ── Sizing ────────────────────────────────────────────────────────────────\n\nexport type LengthUnit = \"px\" | \"%\" | \"vw\" | \"vh\" | \"rem\" | \"fr\";\nexport interface Length {\n value: number;\n unit: LengthUnit;\n}\nexport type SizeMode = Length | \"fill\" | \"hug\";\n\nexport interface Constraints {\n /** Pinned offsets within a `free` parent (null = unpinned). */\n left?: Length | null;\n right?: Length | null;\n top?: Length | null;\n bottom?: Length | null;\n centerX?: boolean;\n centerY?: boolean;\n width: SizeMode;\n height: SizeMode;\n}\n\nexport type LayoutMode = \"free\" | \"stack\" | \"grid\";\n\n// ── Style (compiles deterministically to CSS in both emitters) ──────────────\n\nexport interface StyleProps {\n // box\n padding?: Length;\n margin?: Length;\n radius?: Length;\n // color / surface\n background?: string; // color | gradient | url(...)\n color?: string;\n opacity?: number;\n // typography\n fontFamily?: string;\n fontSize?: Length;\n fontWeight?: number;\n lineHeight?: number;\n textAlign?: \"left\" | \"center\" | \"right\" | \"justify\";\n letterSpacing?: Length;\n // border / shadow / effects (static)\n border?: string;\n boxShadow?: string;\n transform?: string;\n filter?: string;\n // container knobs (when layout = stack | grid)\n gap?: Length;\n direction?: \"row\" | \"column\";\n columns?: number;\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n justify?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\";\n}\n\n/** Per-breakpoint overrides; `base` is required, others cascade mobile-first. */\nexport type PerBreakpoint<T> = { base: T } & Partial<Record<Breakpoint, Partial<T>>>;\n\n// ── Animation (typed for Phase 2; ignored by the static CSS emitter) ────────\n\nexport type AnimDriver = \"enter\" | \"scroll\" | \"loop\" | \"hover\" | \"click\" | \"drag\";\nexport interface Keyframe {\n at: number; // 0..1\n props: Record<string, number | string>;\n}\nexport interface Anim {\n id: string;\n driver: AnimDriver;\n keyframes: Keyframe[];\n range?: { start: number; end: number };\n ease?: string;\n duration?: number;\n delay?: number;\n stagger?: number;\n once?: boolean;\n emit?: \"css\" | \"js\";\n}\n\n// ── Actions (typed for Phase 3/4) ───────────────────────────────────────────\n\nexport type ActionEvent = \"click\" | \"submit\" | \"change\" | \"load\" | \"timer\" | \"scroll-into\" | \"hover\";\nexport type ActionHandler =\n | { kind: \"navigate\"; href: Bound<string> }\n | { kind: \"submitForm\"; endpoint: string; method?: \"post\" | \"put\" }\n | { kind: \"mutate\"; target: string; value: Bound<Json> }\n | { kind: \"callEndpoint\"; endpoint: string; method?: string }\n | { kind: \"runFlow\"; flow: string }\n | { kind: \"openModal\"; node: NodeId }\n | { kind: \"openDrawer\"; node: NodeId }\n | { kind: \"playTimeline\"; section: NodeId }\n | { kind: \"toggleNode\"; node: NodeId };\nexport interface Action {\n on: ActionEvent;\n do: ActionHandler;\n}\n\n// ── Nodes & document ────────────────────────────────────────────────────────\n\nexport interface Node {\n id: NodeId;\n /** Addon key: `section | text | image | shape | stack | grid | frame | <addon>`. */\n type: string;\n /** `null` = a top-level section. */\n parent: NodeId | null;\n /** Fractional index — collab-safe ordering among siblings. */\n order: string;\n /** Addon-specific props; any value may be a {@link Binding}. */\n props: Record<string, Bound<Json>>;\n /** How this node arranges its children. */\n layout?: LayoutMode;\n /** How this node positions itself within its parent. */\n constraints?: PerBreakpoint<Constraints>;\n style: PerBreakpoint<StyleProps>;\n animations?: Anim[];\n actions?: Action[];\n /** Repeater: render this node once per item of a bound array. */\n repeat?: { each: Binding; as: string };\n /**\n * Host CSS class(es) applied to the node's element. The migration enabler:\n * reuse the host site's existing stylesheet for pixel-perfect reproduction\n * instead of re-deriving every rule through {@link StyleProps}.\n */\n className?: string;\n /** Derived from the addon manifest — interactive/3rd-party ⇒ hydration island. */\n island?: boolean;\n}\n\nexport interface ThemeTokens {\n name?: string;\n [key: string]: Json | undefined;\n}\n\nexport interface PageMeta {\n title: string;\n slug: string;\n scrollMode: ScrollMode;\n seo?: Record<string, string>;\n}\n\nexport interface PageDoc {\n id: string;\n /** Op counter — collab ordering + revision checkpoints. */\n seq: number;\n meta: PageMeta;\n theme: ThemeTokens;\n /** Ordered, mobile-first. */\n breakpoints: Breakpoint[];\n /** Top-level section order. */\n sections: NodeId[];\n /** Flat map — not a nested tree. */\n nodes: Record<NodeId, Node>;\n}\n\n/** Default breakpoint → min-width (px) map. `base` has no media query. */\nexport const DEFAULT_BREAKPOINTS: Record<string, number> = {\n base: 0,\n md: 768,\n lg: 1024,\n};\n\n/** A minimal empty document. */\nexport function emptyDoc(id: string, slug = \"/\"): PageDoc {\n return {\n id,\n seq: 0,\n meta: { title: \"Untitled\", slug, scrollMode: \"smooth\" },\n theme: { name: \"default\" },\n breakpoints: [\"base\", \"md\", \"lg\"],\n sections: [],\n nodes: {},\n };\n}\n","/**\n * The JS style → CSS emitter (one half of the dual-emitter pair; the PHP\n * `particle-academy/fancy-cms` mirrors it byte-for-byte). Output is\n * **deterministic**: declarations are sorted, selectors and media blocks use a\n * fixed format, and nodes are emitted in sorted-id order — so the parity harness\n * can diff the two engines' CSS exactly.\n *\n * Phase 0 covers the static subset (layout / constraints / style). Motion lands\n * in Phase 2.\n */\nimport {\n DEFAULT_BREAKPOINTS,\n type Constraints,\n type Length,\n type Node,\n type PageDoc,\n type SizeMode,\n type StyleProps,\n} from \"../document/types\";\n\nconst selectorFor = (id: string): string => `[data-cms=\"${id}\"]`;\n\nfunction lengthToCss(len: Length): string {\n return `${len.value}${len.unit}`;\n}\n\nfunction sizeToCss(size: SizeMode): string {\n if (size === \"fill\") return \"100%\";\n if (size === \"hug\") return \"auto\";\n return lengthToCss(size);\n}\n\nconst ALIGN: Record<string, string> = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n stretch: \"stretch\",\n};\nconst JUSTIFY: Record<string, string> = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n between: \"space-between\",\n around: \"space-around\",\n};\n\n/** Map StyleProps → CSS declarations (property → value). */\nfunction styleDecls(style: Partial<StyleProps>): Record<string, string> {\n const d: Record<string, string> = {};\n if (style.padding) d[\"padding\"] = lengthToCss(style.padding);\n if (style.margin) d[\"margin\"] = lengthToCss(style.margin);\n if (style.radius) d[\"border-radius\"] = lengthToCss(style.radius);\n if (style.background !== undefined) d[\"background\"] = style.background;\n if (style.color !== undefined) d[\"color\"] = style.color;\n if (style.opacity !== undefined) d[\"opacity\"] = String(style.opacity);\n if (style.fontFamily !== undefined) d[\"font-family\"] = style.fontFamily;\n if (style.fontSize) d[\"font-size\"] = lengthToCss(style.fontSize);\n if (style.fontWeight !== undefined) d[\"font-weight\"] = String(style.fontWeight);\n if (style.lineHeight !== undefined) d[\"line-height\"] = String(style.lineHeight);\n if (style.textAlign !== undefined) d[\"text-align\"] = style.textAlign;\n if (style.letterSpacing) d[\"letter-spacing\"] = lengthToCss(style.letterSpacing);\n if (style.border !== undefined) d[\"border\"] = style.border;\n if (style.boxShadow !== undefined) d[\"box-shadow\"] = style.boxShadow;\n if (style.transform !== undefined) d[\"transform\"] = style.transform;\n if (style.filter !== undefined) d[\"filter\"] = style.filter;\n if (style.gap) d[\"gap\"] = lengthToCss(style.gap);\n if (style.align !== undefined) d[\"align-items\"] = ALIGN[style.align] ?? style.align;\n if (style.justify !== undefined) d[\"justify-content\"] = JUSTIFY[style.justify] ?? style.justify;\n return d;\n}\n\n/** Container behaviour from `node.layout`. */\nfunction layoutDecls(node: Node): Record<string, string> {\n const d: Record<string, string> = {};\n if (node.layout === \"stack\") {\n d[\"display\"] = \"flex\";\n d[\"flex-direction\"] = node.style.base.direction ?? \"column\";\n } else if (node.layout === \"grid\") {\n d[\"display\"] = \"grid\";\n d[\"grid-template-columns\"] = `repeat(${node.style.base.columns ?? 1}, 1fr)`;\n } else if (node.layout === \"free\") {\n d[\"position\"] = \"relative\";\n }\n return d;\n}\n\n/** Self-positioning from constraints (absolute pins only inside a `free` parent). */\nfunction constraintDecls(c: Partial<Constraints>, parentFree: boolean): Record<string, string> {\n const d: Record<string, string> = {};\n const transforms: string[] = [];\n if (parentFree) {\n d[\"position\"] = \"absolute\";\n if (c.left) d[\"left\"] = lengthToCss(c.left);\n if (c.right) d[\"right\"] = lengthToCss(c.right);\n if (c.top) d[\"top\"] = lengthToCss(c.top);\n if (c.bottom) d[\"bottom\"] = lengthToCss(c.bottom);\n if (c.centerX) {\n d[\"left\"] = \"50%\";\n transforms.push(\"translateX(-50%)\");\n }\n if (c.centerY) {\n d[\"top\"] = \"50%\";\n transforms.push(\"translateY(-50%)\");\n }\n if (transforms.length) d[\"transform\"] = transforms.join(\" \");\n }\n if (c.width) d[\"width\"] = sizeToCss(c.width);\n if (c.height) d[\"height\"] = sizeToCss(c.height);\n return d;\n}\n\nfunction isParentFree(doc: PageDoc, node: Node): boolean {\n if (node.parent === null) return false; // sections stack in the page flow\n const parent = doc.nodes[node.parent];\n return !parent || parent.layout === undefined || parent.layout === \"free\";\n}\n\nfunction serializeRule(selector: string, decls: Record<string, string>, indent: string): string {\n const props = Object.keys(decls).sort();\n if (props.length === 0) return \"\";\n const body = props.map((p) => `${indent} ${p}: ${decls[p]};`).join(\"\\n\");\n return `${indent}${selector} {\\n${body}\\n${indent}}`;\n}\n\n/** Emit the full stylesheet for a document. Deterministic. */\nexport function emitDocCss(doc: PageDoc): string {\n const breakpointPx = DEFAULT_BREAKPOINTS;\n const blocks: string[] = [];\n\n for (const id of Object.keys(doc.nodes).sort()) {\n const node = doc.nodes[id]!;\n const selector = selectorFor(id);\n const parentFree = isParentFree(doc, node);\n\n // base = style.base + layout + constraints.base\n const base: Record<string, string> = {\n ...layoutDecls(node),\n ...(node.constraints ? constraintDecls(node.constraints.base, parentFree) : {}),\n ...styleDecls(node.style.base),\n };\n const baseRule = serializeRule(selector, base, \"\");\n if (baseRule) blocks.push(baseRule);\n\n // per-breakpoint overrides (mobile-first, in doc order, skipping base)\n for (const bp of doc.breakpoints) {\n if (bp === \"base\") continue;\n const px = breakpointPx[bp];\n if (px === undefined) continue;\n const decls: Record<string, string> = {\n ...(node.constraints?.[bp] ? constraintDecls(node.constraints[bp]!, parentFree) : {}),\n ...(node.style[bp] ? styleDecls(node.style[bp]!) : {}),\n };\n const inner = serializeRule(selector, decls, \" \");\n if (inner) blocks.push(`@media (min-width: ${px}px) {\\n${inner}\\n}`);\n }\n }\n\n return blocks.join(\"\\n\\n\") + (blocks.length ? \"\\n\" : \"\");\n}\n","import type { ReactNode } from \"react\";\nimport { isBinding, type Bound, type Json, type Node, type PageDoc } from \"../document/types\";\n\nexport interface ElementContext {\n node: Node;\n doc: PageDoc;\n /** Pre-rendered child nodes, in order. */\n children: ReactNode;\n}\n\n/**\n * Renders the INNER content of a node. The outer `[data-cms]` wrapper is added\n * by {@link RenderNode}, so a renderer only returns what goes inside.\n */\nexport type ElementRenderer = (ctx: ElementContext) => ReactNode;\n\nexport type ElementRegistry = Record<string, ElementRenderer>;\n\n/** Resolve a literal prop to a string (bindings resolve in Phase 3). */\nfunction literal(v: Bound<Json> | undefined): string {\n if (v === undefined || v === null) return \"\";\n if (isBinding(v)) return \"\";\n return String(v);\n}\n\n/** Built-in native elements. Containers render their children; leaves render content. */\nexport const defaultRegistry: ElementRegistry = {\n section: ({ children }) => children,\n stack: ({ children }) => children,\n grid: ({ children }) => children,\n frame: ({ children }) => children,\n shape: ({ children }) => children,\n text: ({ node }) => literal(node.props.content),\n image: ({ node }) => (\n <img\n src={literal(node.props.src)}\n alt={literal(node.props.alt)}\n style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\", display: \"block\" }}\n />\n ),\n};\n","import type { ReactElement } from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport { childrenOf } from \"../document/reduce\";\nimport { defaultRegistry, type ElementRegistry } from \"./registry\";\n\nexport interface RenderNodeProps {\n doc: PageDoc;\n id: string;\n registry?: ElementRegistry;\n}\n\n/**\n * Render one node (and its subtree) to a `[data-cms]`-tagged element. The CSS\n * emitted by `emitDocCss` targets these `data-cms` handles. Interactive /\n * 3rd-party **islands** with no registered renderer become an empty, sized\n * placeholder the host hydrates client-side — mirroring the PHP renderer.\n */\nexport function RenderNode({ doc, id, registry = defaultRegistry }: RenderNodeProps): ReactElement | null {\n const node = doc.nodes[id];\n if (!node) return null;\n\n const kids = childrenOf(doc, id).map((child) => (\n <RenderNode key={child.id} doc={doc} id={child.id} registry={registry} />\n ));\n\n const renderer = registry[node.type];\n const inner = renderer ? renderer({ node, doc, children: kids }) : node.island ? null : kids;\n\n return (\n <div\n data-cms={node.id}\n data-cms-island={node.island ? node.type : undefined}\n className={node.className}\n >\n {inner}\n </div>\n );\n}\n","import { Fragment, type ReactElement } from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport { emitDocCss } from \"../render/css\";\nimport { RenderNode } from \"./RenderNode\";\nimport { defaultRegistry, type ElementRegistry } from \"./registry\";\n\nexport interface CmsPageProps {\n doc: PageDoc;\n registry?: ElementRegistry;\n /** Inject the compiled stylesheet. Set false when the host emits CSS itself. */\n includeStyles?: boolean;\n}\n\n/** Render a full page document: the compiled stylesheet + every section. */\nexport function CmsPage({\n doc,\n registry = defaultRegistry,\n includeStyles = true,\n}: CmsPageProps): ReactElement {\n return (\n <Fragment>\n {includeStyles ? <style data-cms-styles=\"\">{emitDocCss(doc)}</style> : null}\n {doc.sections.map((id) => (\n <RenderNode key={id} doc={doc} id={id} registry={registry} />\n ))}\n </Fragment>\n );\n}\n","import {\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n} from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport type { PageOp } from \"../document/ops\";\nimport { CmsPage } from \"../react/CmsPage\";\n\nexport interface CanvasProps {\n doc: PageDoc;\n selection: string | null;\n onSelect: (id: string | null) => void;\n apply: (op: PageOp) => void;\n}\n\ninterface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/**\n * The edit surface: renders the live page and overlays a selection box. Click to\n * select; drag the box to move (px constraints). Phase 1 cut: free-parent\n * move + resize handles, stack/grid reordering, and snapping come next.\n */\nexport function Canvas({ doc, selection, onSelect, apply }: CanvasProps): ReactElement {\n const ref = useRef<HTMLDivElement>(null);\n const [box, setBox] = useState<Box | null>(null);\n const drag = useRef<{ x: number; y: number; left: number; top: number } | null>(null);\n\n useLayoutEffect(() => {\n const root = ref.current;\n if (!root || !selection) {\n setBox(null);\n return;\n }\n const el = root.querySelector(`[data-cms=\"${cssEscape(selection)}\"]`);\n if (!el) {\n setBox(null);\n return;\n }\n const r = el.getBoundingClientRect();\n const rootRect = root.getBoundingClientRect();\n setBox({\n x: r.left - rootRect.left + root.scrollLeft,\n y: r.top - rootRect.top + root.scrollTop,\n w: r.width,\n h: r.height,\n });\n }, [selection, doc]);\n\n const handleClick = (e: ReactMouseEvent<HTMLDivElement>) => {\n const target = (e.target as HTMLElement).closest(\"[data-cms]\");\n onSelect(target ? target.getAttribute(\"data-cms\") : null);\n };\n\n const handlePointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!selection) return;\n const c = doc.nodes[selection]?.constraints?.base;\n const left = c && c.left && typeof c.left === \"object\" ? c.left.value : 0;\n const top = c && c.top && typeof c.top === \"object\" ? c.top.value : 0;\n drag.current = { x: e.clientX, y: e.clientY, left, top };\n e.currentTarget.setPointerCapture(e.pointerId);\n e.stopPropagation();\n };\n\n const handlePointerMove = (e: ReactPointerEvent<HTMLDivElement>) => {\n const d = drag.current;\n if (!d || !selection) return;\n apply({\n t: \"set_constraints\",\n id: selection,\n breakpoint: \"base\",\n patch: {\n left: { value: Math.round(d.left + (e.clientX - d.x)), unit: \"px\" },\n top: { value: Math.round(d.top + (e.clientY - d.y)), unit: \"px\" },\n },\n });\n };\n\n const handlePointerUp = () => {\n drag.current = null;\n };\n\n const surface: CSSProperties = {\n position: \"relative\",\n overflow: \"auto\",\n height: \"100%\",\n background: \"#f8fafc\",\n };\n const overlay: CSSProperties = box\n ? {\n position: \"absolute\",\n left: box.x,\n top: box.y,\n width: box.w,\n height: box.h,\n outline: \"2px solid #8b5cf6\",\n outlineOffset: -1,\n cursor: \"move\",\n touchAction: \"none\",\n }\n : { display: \"none\" };\n\n return (\n <div ref={ref} onClick={handleClick} style={surface}>\n <CmsPage doc={doc} />\n <div\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={overlay}\n />\n </div>\n );\n}\n\nfunction cssEscape(value: string): string {\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n","import { Fragment, type ReactElement } from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport { childrenOf } from \"../document/reduce\";\n\nexport interface LayersPanelProps {\n doc: PageDoc;\n selection: string | null;\n onSelect: (id: string) => void;\n}\n\n/** The section/layer tree. Click a row to select. */\nexport function LayersPanel({ doc, selection, onSelect }: LayersPanelProps): ReactElement {\n return (\n <div style={{ overflow: \"auto\", padding: 8, fontSize: 13, fontFamily: \"system-ui, sans-serif\" }}>\n {doc.sections.map((id) => (\n <LayerRow key={id} doc={doc} id={id} depth={0} selection={selection} onSelect={onSelect} />\n ))}\n </div>\n );\n}\n\ninterface LayerRowProps extends LayersPanelProps {\n id: string;\n depth: number;\n}\n\nfunction LayerRow({ doc, id, depth, selection, onSelect }: LayerRowProps): ReactElement | null {\n const node = doc.nodes[id];\n if (!node) return null;\n const selected = selection === id;\n return (\n <Fragment>\n <button\n type=\"button\"\n onClick={() => onSelect(id)}\n style={{\n display: \"block\",\n width: \"100%\",\n textAlign: \"left\",\n border: \"none\",\n borderRadius: 6,\n cursor: \"pointer\",\n padding: \"4px 8px\",\n paddingLeft: 8 + depth * 14,\n background: selected ? \"#ede9fe\" : \"transparent\",\n color: selected ? \"#5b21b6\" : \"#334155\",\n font: \"inherit\",\n }}\n >\n <span style={{ opacity: 0.6 }}>{node.type}</span> · {id}\n </button>\n {childrenOf(doc, id).map((child) => (\n <LayerRow\n key={child.id}\n doc={doc}\n id={child.id}\n depth={depth + 1}\n selection={selection}\n onSelect={onSelect}\n />\n ))}\n </Fragment>\n );\n}\n","import type { CSSProperties, ReactElement } from \"react\";\nimport type { PageDoc, StyleProps } from \"../document/types\";\nimport type { PageOp } from \"../document/ops\";\n\nexport interface InspectorProps {\n doc: PageDoc;\n selection: string | null;\n apply: (op: PageOp) => void;\n}\n\nconst label: CSSProperties = {\n display: \"block\",\n fontSize: 11,\n textTransform: \"uppercase\",\n letterSpacing: \"0.04em\",\n color: \"#94a3b8\",\n margin: \"10px 0 4px\",\n};\nconst input: CSSProperties = {\n width: \"100%\",\n boxSizing: \"border-box\",\n padding: \"6px 8px\",\n borderRadius: 6,\n border: \"1px solid #e2e8f0\",\n font: \"inherit\",\n fontSize: 13,\n};\n\n/** Contextual property editor for the selected node. Every change is one op. */\nexport function Inspector({ doc, selection, apply }: InspectorProps): ReactElement {\n const node = selection ? doc.nodes[selection] : null;\n if (!node) {\n return (\n <div style={{ padding: 16, color: \"#94a3b8\", fontFamily: \"system-ui, sans-serif\", fontSize: 13 }}>\n Select an element to edit.\n </div>\n );\n }\n\n const s = node.style.base;\n const setStyle = (patch: Partial<StyleProps>) =>\n apply({ t: \"set_style\", id: node.id, breakpoint: \"base\", patch });\n const setProp = (key: string, value: unknown) =>\n apply({ t: \"set_props\", id: node.id, patch: { [key]: value } });\n\n return (\n <div style={{ overflow: \"auto\", padding: 16, fontFamily: \"system-ui, sans-serif\", height: \"100%\", boxSizing: \"border-box\" }}>\n <div style={{ fontSize: 13, fontWeight: 600, color: \"#0f172a\" }}>{node.type}</div>\n <div style={{ fontSize: 11, color: \"#94a3b8\", marginBottom: 8 }}>{node.id}</div>\n\n {node.type === \"text\" ? (\n <>\n <label style={label}>Content</label>\n <textarea\n style={{ ...input, minHeight: 64, resize: \"vertical\" }}\n value={typeof node.props.content === \"string\" ? node.props.content : \"\"}\n onChange={(e) => setProp(\"content\", e.target.value)}\n />\n </>\n ) : null}\n\n {node.type === \"image\" ? (\n <>\n <label style={label}>Source</label>\n <input\n style={input}\n value={typeof node.props.src === \"string\" ? node.props.src : \"\"}\n onChange={(e) => setProp(\"src\", e.target.value)}\n />\n </>\n ) : null}\n\n <label style={label}>Background</label>\n <input\n style={input}\n placeholder=\"#ffffff | gradient | url(…)\"\n value={s.background ?? \"\"}\n onChange={(e) => setStyle({ background: e.target.value })}\n />\n\n <label style={label}>Text color</label>\n <input\n style={input}\n placeholder=\"#0f172a\"\n value={s.color ?? \"\"}\n onChange={(e) => setStyle({ color: e.target.value })}\n />\n\n <label style={label}>Font size (px)</label>\n <input\n type=\"number\"\n style={input}\n value={s.fontSize?.value ?? \"\"}\n onChange={(e) => setStyle({ fontSize: { value: Number(e.target.value) || 0, unit: \"px\" } })}\n />\n\n <label style={label}>Padding (px)</label>\n <input\n type=\"number\"\n style={input}\n value={s.padding?.value ?? \"\"}\n onChange={(e) => setStyle({ padding: { value: Number(e.target.value) || 0, unit: \"px\" } })}\n />\n\n <label style={label}>Opacity</label>\n <input\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n max=\"1\"\n style={input}\n value={s.opacity ?? \"\"}\n onChange={(e) => setStyle({ opacity: Number(e.target.value) })}\n />\n </div>\n );\n}\n","import { useEffect, useRef, type CSSProperties, type ReactElement } from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport { useEditor, type EditorApi } from \"./useEditor\";\nimport { Canvas } from \"./Canvas\";\nimport { LayersPanel } from \"./LayersPanel\";\nimport { Inspector } from \"./Inspector\";\n\nexport interface EditorProps {\n /** Initial document; edits are surfaced via {@link EditorProps.onChange}. */\n defaultValue: PageDoc;\n onChange?: (doc: PageDoc) => void;\n}\n\n/**\n * The fancy-cms editor: layers · canvas · inspector over the op-spine. Phase 1\n * cut — chrome is plain markup for now; it graduates to react-fancy next.\n */\nexport function Editor({ defaultValue, onChange }: EditorProps): ReactElement {\n const ed = useEditor(defaultValue);\n const first = useRef(true);\n\n useEffect(() => {\n if (first.current) {\n first.current = false;\n return;\n }\n onChange?.(ed.state.doc);\n }, [ed.state.doc, onChange]);\n\n const shell: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"220px 1fr 300px\",\n height: \"100%\",\n minHeight: 0,\n background: \"#fff\",\n color: \"#0f172a\",\n border: \"1px solid #e2e8f0\",\n borderRadius: 12,\n overflow: \"hidden\",\n };\n\n return (\n <div style={shell}>\n <div style={{ borderRight: \"1px solid #e2e8f0\", display: \"flex\", flexDirection: \"column\", minHeight: 0 }}>\n <Toolbar ed={ed} />\n <LayersPanel doc={ed.state.doc} selection={ed.state.selection} onSelect={ed.select} />\n </div>\n <Canvas doc={ed.state.doc} selection={ed.state.selection} onSelect={ed.select} apply={ed.apply} />\n <div style={{ borderLeft: \"1px solid #e2e8f0\", minHeight: 0 }}>\n <Inspector doc={ed.state.doc} selection={ed.state.selection} apply={ed.apply} />\n </div>\n </div>\n );\n}\n\nfunction Toolbar({ ed }: { ed: EditorApi }): ReactElement {\n const btn: CSSProperties = {\n font: \"inherit\",\n fontSize: 12,\n padding: \"4px 10px\",\n borderRadius: 6,\n border: \"1px solid #e2e8f0\",\n background: \"#fff\",\n cursor: \"pointer\",\n };\n return (\n <div\n style={{\n display: \"flex\",\n gap: 6,\n padding: 8,\n borderBottom: \"1px solid #e2e8f0\",\n fontFamily: \"system-ui, sans-serif\",\n }}\n >\n <button type=\"button\" style={{ ...btn, opacity: ed.canUndo ? 1 : 0.4 }} disabled={!ed.canUndo} onClick={ed.undo}>\n Undo\n </button>\n <button type=\"button\" style={{ ...btn, opacity: ed.canRedo ? 1 : 0.4 }} disabled={!ed.canRedo} onClick={ed.redo}>\n Redo\n </button>\n </div>\n );\n}\n","import {\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport type { PageDoc } from \"../document/types\";\nimport { CmsPage } from \"../react/CmsPage\";\nimport { defaultRegistry, type ElementRegistry } from \"../react/registry\";\nimport { useEditor } from \"./useEditor\";\nimport { Inspector } from \"./Inspector\";\n\nexport interface EditablePageProps {\n /** Seeded document (read-only demo: edits are in-memory, never persisted). */\n doc: PageDoc;\n registry?: ElementRegistry;\n /** Start in EditMode. */\n defaultEditing?: boolean;\n /** Slot for the fancy-motion timeline dock (mounted at the bottom in EditMode). */\n timelineDock?: ReactNode;\n}\n\ninterface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/**\n * Inline EditMode over a live, seeded CMS page — the sandbox's \"the site IS the\n * demo\" surface. The page renders normally (CmsPage); toggling EditMode reveals\n * selection + an inspector, and (when provided) the fancy-motion timeline dock\n * at the bottom. Read-only: edits live in memory, never saved.\n */\nexport function EditablePage({\n doc,\n registry = defaultRegistry,\n defaultEditing = false,\n timelineDock,\n}: EditablePageProps): ReactElement {\n const ed = useEditor(doc);\n const [editing, setEditing] = useState(defaultEditing);\n const pageRef = useRef<HTMLDivElement>(null);\n const [box, setBox] = useState<Box | null>(null);\n const { selection } = ed.state;\n\n useLayoutEffect(() => {\n if (!editing || !selection || !pageRef.current) {\n setBox(null);\n return;\n }\n const update = () => {\n const el = pageRef.current?.querySelector(`[data-cms=\"${cssEscape(selection)}\"]`);\n if (!el) return setBox(null);\n const r = el.getBoundingClientRect();\n setBox({ x: r.left, y: r.top, w: r.width, h: r.height });\n };\n update();\n window.addEventListener(\"scroll\", update, { passive: true });\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"scroll\", update);\n window.removeEventListener(\"resize\", update);\n };\n }, [editing, selection, ed.state.doc]);\n\n const onClickCapture = (e: ReactMouseEvent<HTMLDivElement>) => {\n if (!editing) return;\n const el = (e.target as HTMLElement).closest(\"[data-cms]\");\n if (el) {\n e.preventDefault();\n e.stopPropagation();\n ed.select(el.getAttribute(\"data-cms\"));\n }\n };\n\n const outline: CSSProperties | null = box\n ? {\n position: \"fixed\",\n left: box.x,\n top: box.y,\n width: box.w,\n height: box.h,\n outline: \"2px solid #8b5cf6\",\n outlineOffset: -1,\n pointerEvents: \"none\",\n zIndex: 2147483000,\n }\n : null;\n\n return (\n <div style={{ position: \"relative\" }}>\n <div ref={pageRef} onClickCapture={onClickCapture}>\n <CmsPage doc={ed.state.doc} registry={registry} />\n </div>\n\n {editing && outline ? <div style={outline} /> : null}\n\n <EditBar\n editing={editing}\n onToggle={() => setEditing((v) => !v)}\n canUndo={ed.canUndo}\n canRedo={ed.canRedo}\n onUndo={ed.undo}\n onRedo={ed.redo}\n hasDock={Boolean(timelineDock)}\n />\n\n {editing && selection ? (\n <aside style={inspectorPanel}>\n <Inspector doc={ed.state.doc} selection={selection} apply={ed.apply} />\n </aside>\n ) : null}\n\n {editing && timelineDock ? <div style={dockSlot}>{timelineDock}</div> : null}\n </div>\n );\n}\n\nconst inspectorPanel: CSSProperties = {\n position: \"fixed\",\n top: 56,\n right: 12,\n bottom: 12,\n width: 300,\n background: \"#fff\",\n border: \"1px solid #e2e8f0\",\n borderRadius: 12,\n boxShadow: \"0 10px 30px -10px rgba(0,0,0,0.25)\",\n overflow: \"auto\",\n zIndex: 2147483001,\n};\n\nconst dockSlot: CSSProperties = {\n position: \"fixed\",\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 2147483000,\n};\n\nfunction EditBar({\n editing,\n onToggle,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n hasDock,\n}: {\n editing: boolean;\n onToggle: () => void;\n canUndo: boolean;\n canRedo: boolean;\n onUndo: () => void;\n onRedo: () => void;\n hasDock: boolean;\n}): ReactElement {\n const bar: CSSProperties = {\n position: \"fixed\",\n top: 12,\n right: 12,\n display: \"flex\",\n gap: 6,\n alignItems: \"center\",\n padding: 6,\n background: \"#0f172a\",\n color: \"#fff\",\n borderRadius: 999,\n boxShadow: \"0 8px 24px -8px rgba(0,0,0,0.4)\",\n zIndex: 2147483002,\n fontFamily: \"system-ui, sans-serif\",\n fontSize: 12,\n };\n const btn: CSSProperties = {\n font: \"inherit\",\n border: \"none\",\n background: \"transparent\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: \"4px 8px\",\n borderRadius: 999,\n };\n return (\n <div style={bar}>\n <button type=\"button\" style={{ ...btn, background: editing ? \"#8b5cf6\" : \"transparent\" }} onClick={onToggle}>\n {editing ? \"● Editing\" : \"Edit\"}\n </button>\n {editing ? (\n <>\n <button type=\"button\" style={{ ...btn, opacity: canUndo ? 1 : 0.4 }} disabled={!canUndo} onClick={onUndo}>\n ↶\n </button>\n <button type=\"button\" style={{ ...btn, opacity: canRedo ? 1 : 0.4 }} disabled={!canRedo} onClick={onRedo}>\n ↷\n </button>\n {!hasDock ? <span style={{ opacity: 0.5, paddingRight: 6 }}>timeline: fancy-motion →</span> : null}\n </>\n ) : null}\n </div>\n );\n}\n\nfunction cssEscape(value: string): string {\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n"]}
package/dist/editor.d.cts CHANGED
@@ -1,6 +1,7 @@
1
- import { ReactElement } from 'react';
2
- import { P as PageDoc } from './types-DKCl14aV.cjs';
3
- import { P as PageOp } from './ops-DWgJjAbX.cjs';
1
+ import { ReactElement, ReactNode } from 'react';
2
+ import { P as PageDoc } from './types-CpfPEq3V.cjs';
3
+ import { a as ElementRegistry } from './registry-Bk7GN1rA.cjs';
4
+ import { P as PageOp } from './ops-C_s0FGeV.cjs';
4
5
 
5
6
  interface EditorProps {
6
7
  /** Initial document; edits are surfaced via {@link EditorProps.onChange}. */
@@ -13,6 +14,23 @@ interface EditorProps {
13
14
  */
14
15
  declare function Editor({ defaultValue, onChange }: EditorProps): ReactElement;
15
16
 
17
+ interface EditablePageProps {
18
+ /** Seeded document (read-only demo: edits are in-memory, never persisted). */
19
+ doc: PageDoc;
20
+ registry?: ElementRegistry;
21
+ /** Start in EditMode. */
22
+ defaultEditing?: boolean;
23
+ /** Slot for the fancy-motion timeline dock (mounted at the bottom in EditMode). */
24
+ timelineDock?: ReactNode;
25
+ }
26
+ /**
27
+ * Inline EditMode over a live, seeded CMS page — the sandbox's "the site IS the
28
+ * demo" surface. The page renders normally (CmsPage); toggling EditMode reveals
29
+ * selection + an inspector, and (when provided) the fancy-motion timeline dock
30
+ * at the bottom. Read-only: edits live in memory, never saved.
31
+ */
32
+ declare function EditablePage({ doc, registry, defaultEditing, timelineDock, }: EditablePageProps): ReactElement;
33
+
16
34
  interface CanvasProps {
17
35
  doc: PageDoc;
18
36
  selection: string | null;
@@ -86,4 +104,4 @@ interface EditorApi {
86
104
  }
87
105
  declare function useEditor(initialDoc: PageDoc): EditorApi;
88
106
 
89
- export { Canvas, type CanvasProps, Editor, type EditorAction, type EditorApi, type EditorProps, type EditorState, Inspector, type InspectorProps, LayersPanel, type LayersPanelProps, editorReduce, initEditor, useEditor };
107
+ export { Canvas, type CanvasProps, EditablePage, type EditablePageProps, Editor, type EditorAction, type EditorApi, type EditorProps, type EditorState, Inspector, type InspectorProps, LayersPanel, type LayersPanelProps, editorReduce, initEditor, useEditor };
package/dist/editor.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { ReactElement } from 'react';
2
- import { P as PageDoc } from './types-DKCl14aV.js';
3
- import { P as PageOp } from './ops-CJenUAsy.js';
1
+ import { ReactElement, ReactNode } from 'react';
2
+ import { P as PageDoc } from './types-CpfPEq3V.js';
3
+ import { a as ElementRegistry } from './registry-Dht9JBLU.js';
4
+ import { P as PageOp } from './ops-nevYkDzK.js';
4
5
 
5
6
  interface EditorProps {
6
7
  /** Initial document; edits are surfaced via {@link EditorProps.onChange}. */
@@ -13,6 +14,23 @@ interface EditorProps {
13
14
  */
14
15
  declare function Editor({ defaultValue, onChange }: EditorProps): ReactElement;
15
16
 
17
+ interface EditablePageProps {
18
+ /** Seeded document (read-only demo: edits are in-memory, never persisted). */
19
+ doc: PageDoc;
20
+ registry?: ElementRegistry;
21
+ /** Start in EditMode. */
22
+ defaultEditing?: boolean;
23
+ /** Slot for the fancy-motion timeline dock (mounted at the bottom in EditMode). */
24
+ timelineDock?: ReactNode;
25
+ }
26
+ /**
27
+ * Inline EditMode over a live, seeded CMS page — the sandbox's "the site IS the
28
+ * demo" surface. The page renders normally (CmsPage); toggling EditMode reveals
29
+ * selection + an inspector, and (when provided) the fancy-motion timeline dock
30
+ * at the bottom. Read-only: edits live in memory, never saved.
31
+ */
32
+ declare function EditablePage({ doc, registry, defaultEditing, timelineDock, }: EditablePageProps): ReactElement;
33
+
16
34
  interface CanvasProps {
17
35
  doc: PageDoc;
18
36
  selection: string | null;
@@ -86,4 +104,4 @@ interface EditorApi {
86
104
  }
87
105
  declare function useEditor(initialDoc: PageDoc): EditorApi;
88
106
 
89
- export { Canvas, type CanvasProps, Editor, type EditorAction, type EditorApi, type EditorProps, type EditorState, Inspector, type InspectorProps, LayersPanel, type LayersPanelProps, editorReduce, initEditor, useEditor };
107
+ export { Canvas, type CanvasProps, EditablePage, type EditablePageProps, Editor, type EditorAction, type EditorApi, type EditorProps, type EditorState, Inspector, type InspectorProps, LayersPanel, type LayersPanelProps, editorReduce, initEditor, useEditor };
package/dist/editor.js CHANGED
@@ -1,5 +1,5 @@
1
- import { CmsPage } from './chunk-MRWUUNJR.js';
2
- import { reduce, childrenOf } from './chunk-NWH2AJLH.js';
1
+ import { CmsPage, defaultRegistry } from './chunk-5PWZGIYZ.js';
2
+ import { reduce, childrenOf } from './chunk-HYHNMW47.js';
3
3
  import { useReducer, useCallback, useMemo, useRef, useState, useLayoutEffect, Fragment, useEffect } from 'react';
4
4
  import { jsxs, jsx, Fragment as Fragment$1 } from 'react/jsx-runtime';
5
5
 
@@ -363,7 +363,142 @@ function Toolbar({ ed }) {
363
363
  }
364
364
  );
365
365
  }
366
+ function EditablePage({
367
+ doc,
368
+ registry = defaultRegistry,
369
+ defaultEditing = false,
370
+ timelineDock
371
+ }) {
372
+ const ed = useEditor(doc);
373
+ const [editing, setEditing] = useState(defaultEditing);
374
+ const pageRef = useRef(null);
375
+ const [box, setBox] = useState(null);
376
+ const { selection } = ed.state;
377
+ useLayoutEffect(() => {
378
+ if (!editing || !selection || !pageRef.current) {
379
+ setBox(null);
380
+ return;
381
+ }
382
+ const update = () => {
383
+ const el = pageRef.current?.querySelector(`[data-cms="${cssEscape2(selection)}"]`);
384
+ if (!el) return setBox(null);
385
+ const r = el.getBoundingClientRect();
386
+ setBox({ x: r.left, y: r.top, w: r.width, h: r.height });
387
+ };
388
+ update();
389
+ window.addEventListener("scroll", update, { passive: true });
390
+ window.addEventListener("resize", update);
391
+ return () => {
392
+ window.removeEventListener("scroll", update);
393
+ window.removeEventListener("resize", update);
394
+ };
395
+ }, [editing, selection, ed.state.doc]);
396
+ const onClickCapture = (e) => {
397
+ if (!editing) return;
398
+ const el = e.target.closest("[data-cms]");
399
+ if (el) {
400
+ e.preventDefault();
401
+ e.stopPropagation();
402
+ ed.select(el.getAttribute("data-cms"));
403
+ }
404
+ };
405
+ const outline = box ? {
406
+ position: "fixed",
407
+ left: box.x,
408
+ top: box.y,
409
+ width: box.w,
410
+ height: box.h,
411
+ outline: "2px solid #8b5cf6",
412
+ outlineOffset: -1,
413
+ pointerEvents: "none",
414
+ zIndex: 2147483e3
415
+ } : null;
416
+ return /* @__PURE__ */ jsxs("div", { style: { position: "relative" }, children: [
417
+ /* @__PURE__ */ jsx("div", { ref: pageRef, onClickCapture, children: /* @__PURE__ */ jsx(CmsPage, { doc: ed.state.doc, registry }) }),
418
+ editing && outline ? /* @__PURE__ */ jsx("div", { style: outline }) : null,
419
+ /* @__PURE__ */ jsx(
420
+ EditBar,
421
+ {
422
+ editing,
423
+ onToggle: () => setEditing((v) => !v),
424
+ canUndo: ed.canUndo,
425
+ canRedo: ed.canRedo,
426
+ onUndo: ed.undo,
427
+ onRedo: ed.redo,
428
+ hasDock: Boolean(timelineDock)
429
+ }
430
+ ),
431
+ editing && selection ? /* @__PURE__ */ jsx("aside", { style: inspectorPanel, children: /* @__PURE__ */ jsx(Inspector, { doc: ed.state.doc, selection, apply: ed.apply }) }) : null,
432
+ editing && timelineDock ? /* @__PURE__ */ jsx("div", { style: dockSlot, children: timelineDock }) : null
433
+ ] });
434
+ }
435
+ var inspectorPanel = {
436
+ position: "fixed",
437
+ top: 56,
438
+ right: 12,
439
+ bottom: 12,
440
+ width: 300,
441
+ background: "#fff",
442
+ border: "1px solid #e2e8f0",
443
+ borderRadius: 12,
444
+ boxShadow: "0 10px 30px -10px rgba(0,0,0,0.25)",
445
+ overflow: "auto",
446
+ zIndex: 2147483001
447
+ };
448
+ var dockSlot = {
449
+ position: "fixed",
450
+ left: 0,
451
+ right: 0,
452
+ bottom: 0,
453
+ zIndex: 2147483e3
454
+ };
455
+ function EditBar({
456
+ editing,
457
+ onToggle,
458
+ canUndo,
459
+ canRedo,
460
+ onUndo,
461
+ onRedo,
462
+ hasDock
463
+ }) {
464
+ const bar = {
465
+ position: "fixed",
466
+ top: 12,
467
+ right: 12,
468
+ display: "flex",
469
+ gap: 6,
470
+ alignItems: "center",
471
+ padding: 6,
472
+ background: "#0f172a",
473
+ color: "#fff",
474
+ borderRadius: 999,
475
+ boxShadow: "0 8px 24px -8px rgba(0,0,0,0.4)",
476
+ zIndex: 2147483002,
477
+ fontFamily: "system-ui, sans-serif",
478
+ fontSize: 12
479
+ };
480
+ const btn = {
481
+ font: "inherit",
482
+ border: "none",
483
+ background: "transparent",
484
+ color: "inherit",
485
+ cursor: "pointer",
486
+ padding: "4px 8px",
487
+ borderRadius: 999
488
+ };
489
+ return /* @__PURE__ */ jsxs("div", { style: bar, children: [
490
+ /* @__PURE__ */ jsx("button", { type: "button", style: { ...btn, background: editing ? "#8b5cf6" : "transparent" }, onClick: onToggle, children: editing ? "\u25CF Editing" : "Edit" }),
491
+ editing ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
492
+ /* @__PURE__ */ jsx("button", { type: "button", style: { ...btn, opacity: canUndo ? 1 : 0.4 }, disabled: !canUndo, onClick: onUndo, children: "\u21B6" }),
493
+ /* @__PURE__ */ jsx("button", { type: "button", style: { ...btn, opacity: canRedo ? 1 : 0.4 }, disabled: !canRedo, onClick: onRedo, children: "\u21B7" }),
494
+ !hasDock ? /* @__PURE__ */ jsx("span", { style: { opacity: 0.5, paddingRight: 6 }, children: "timeline: fancy-motion \u2192" }) : null
495
+ ] }) : null
496
+ ] });
497
+ }
498
+ function cssEscape2(value) {
499
+ return value.replace(/["\\]/g, "\\$&");
500
+ }
366
501
 
367
- export { Canvas, Editor, Inspector, LayersPanel, editorReduce, initEditor, useEditor };
502
+ export { Canvas, EditablePage, Editor, Inspector, LayersPanel, editorReduce, initEditor, useEditor };
368
503
  //# sourceMappingURL=editor.js.map
369
504
  //# sourceMappingURL=editor.js.map