@realiizlabs/admin 0.14.0 → 0.15.0
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.
- package/LICENSE +21 -0
- package/dist/{Sidebar-Dvrc9_xR.d.cts → Sidebar-Dz_qJOSx.d.cts} +3 -1
- package/dist/{Sidebar-Dvrc9_xR.d.ts → Sidebar-Dz_qJOSx.d.ts} +3 -1
- package/dist/bar/index.cjs +82 -0
- package/dist/bar/index.cjs.map +1 -0
- package/dist/bar/index.d.cts +18 -0
- package/dist/bar/index.d.ts +18 -0
- package/dist/bar/index.js +77 -0
- package/dist/bar/index.js.map +1 -0
- package/dist/shell/index.cjs +60 -38
- package/dist/shell/index.cjs.map +1 -1
- package/dist/shell/index.d.cts +9 -5
- package/dist/shell/index.d.ts +9 -5
- package/dist/shell/index.js +60 -38
- package/dist/shell/index.js.map +1 -1
- package/dist/studio/index.cjs +80 -2
- package/dist/studio/index.cjs.map +1 -1
- package/dist/studio/index.d.cts +32 -1
- package/dist/studio/index.d.ts +32 -1
- package/dist/studio/index.js +78 -3
- package/dist/studio/index.js.map +1 -1
- package/dist/studio-ui/index.cjs +305 -90
- package/dist/studio-ui/index.cjs.map +1 -1
- package/dist/studio-ui/index.d.cts +37 -6
- package/dist/studio-ui/index.d.ts +37 -6
- package/dist/studio-ui/index.js +303 -92
- package/dist/studio-ui/index.js.map +1 -1
- package/dist/version-DMS0azUx.d.cts +3 -0
- package/dist/version-DMS0azUx.d.ts +3 -0
- package/package.json +12 -5
package/dist/shell/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shell/icons.tsx","../../src/shell/Sidebar.tsx","../../src/shell/ThemeToggle.tsx","../../src/shell/AccountMenu.tsx","../../src/shell/TopBar.tsx","../../src/shell/tokens.ts","../../src/shell/AdminShell.tsx","../../src/shell/Button.tsx","../../src/shell/primitives.tsx","../../src/shell/Tabs.tsx"],"names":["jsxs","jsx","useState","useEffect","useRef"],"mappings":";;;;;;AAMA,IAAM,IAAA,GAAgC;AAAA,EACpC,KAAA,EAAO,EAAA;AAAA,EAAI,MAAA,EAAQ,EAAA;AAAA,EAAI,OAAA,EAAS,WAAA;AAAA,EAAa,IAAA,EAAM,MAAA;AAAA,EAAQ,MAAA,EAAQ,cAAA;AAAA,EACnE,WAAA,EAAa,GAAA;AAAA,EAAK,aAAA,EAAe,OAAA;AAAA,EAAS,cAAA,EAAgB,OAAA;AAAA,EAAS,aAAA,EAAe,IAAA;AAAA,EAClF,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA;AACvB,CAAA;AAEO,SAAS,IAAA,CAAK,EAAE,IAAA,EAAK,EAAuB;AACjD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AACH,MAAA,uBAAOA,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,OAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI;AAAA,OAAA,EAAE,CAAA;AAAA,IAC5N,KAAK,OAAA;AACH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,kBAAA,EAAmB,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB;AAAA,OAAA,EAAE,CAAA;AAAA,IAC5G,KAAK,QAAA;AACH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uBAAA,EAAwB;AAAA,OAAA,EAAE,CAAA;AAAA,IAC5G,KAAK,KAAA;AACH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,OAAM,GAAA,EAAI,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iBAAA,EAAkB;AAAA,OAAA,EAAE,CAAA;AAAA,IACtI,KAAK,QAAA;AACH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,yDAAA,EAA0D,CAAA;AAAA,uCAAG,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,KAAA,EAAM,GAAE,KAAA,EAAM;AAAA,OAAA,EAAE,CAAA;AAAA,IAC/H,KAAK,OAAA;AACH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,YAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,GAAE,KAAA,EAAM,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4BAAA,EAA6B,CAAA;AAAA,uCAAG,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,GAAE,KAAA,EAAM,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B;AAAA,OAAA,EAAE,CAAA;AAAA,IACrK,KAAK,UAAA;AAEH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,QAAA,EAAS,CAAA;AAAA,uCAAG,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,uCAAG,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW;AAAA,OAAA,EAAE,CAAA;AAAA,IACvK;AACE,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,kBAAA,EAAmB,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY;AAAA,OAAA,EAAE,CAAA;AAAA;AAE/E;AAEO,SAAS,QAAQ,EAAA,EAAsB;AAC5C,EAAA,MAAM,KAAA,GAAoB,CAAC,MAAA,EAAQ,OAAA,EAAS,UAAU,KAAA,EAAO,QAAA,EAAU,SAAS,UAAU,CAAA;AAC1F,EAAA,OAAQ,KAAA,CAAmB,QAAA,CAAS,EAAE,CAAA,GAAK,EAAA,GAAkB,KAAA;AAC/D;AClBO,IAAM,WAAA,GAAc,kBAAA;AAEpB,SAAS,QAAA,CAAS,IAAA,EAAe,UAAA,EAAoB,QAAA,EAA2B;AACrF,EAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU,OAAO,eAAe,QAAA,IAAY,UAAA,KAAe,GAAG,QAAQ,CAAA,CAAA,CAAA;AACxF,EAAA,OAAO,UAAA,KAAe,KAAK,IAAA,IAAQ,UAAA,CAAW,WAAW,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAC1E;AAEO,SAAS,OAAA,CAAQ,EAAE,KAAA,EAAO,MAAA,GAAS,EAAC,EAAG,UAAA,EAAY,UAAS,EAAmF;AACpJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEhD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA,KAAM,WAAA,eAA0B,IAAI,CAAA;AAAA,IACjF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,OAAO,CAAC,SAAA;AACd,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,WAAA,EAAa,IAAA,GAAO,cAAc,MAAM,CAAA;AAAA,IACtE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAkB;AACpC,IAAA,MAAM,SAAS,CAAC,IAAA,CAAK,YAAY,QAAA,CAAS,IAAA,EAAM,YAAY,QAAQ,CAAA;AACpE,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,uBACEH,eAAAA,CAAC,MAAA,EAAA,EAAmB,SAAA,EAAU,6CAAA,EAA8C,eAAA,EAAc,MAAA,EAAO,KAAA,EAAO,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,KAAK,wBAAmB,aAAA,EAClJ,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAAC,QAAK,IAAA,EAAM,OAAA,CAAQ,KAAK,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA;AAAA,wBAC3CA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,eAAK,KAAA,EAAM;AAAA,OAAA,EAAA,EAFvC,KAAK,EAGhB,CAAA;AAAA,IAEJ;AACA,IAAA,uBACED,eAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QAEC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAA,EAAW,CAAC,kBAAA,EAAoB,MAAA,IAAU,0BAA0B,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,QAC9F,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,QAChC,KAAA,EAAO,SAAA,GAAY,IAAA,CAAK,KAAA,GAAQ,MAAA;AAAA,QAEhC,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAAC,QAAK,IAAA,EAAM,OAAA,CAAQ,KAAK,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA;AAAA,0BAC3CA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,eAAK,KAAA,EAAM;AAAA;AAAA,OAAA;AAAA,MAP3C,IAAA,CAAK;AAAA,KAQZ;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACED,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,CAAC,cAAc,SAAA,IAAa,uBAAuB,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAG,cAAW,kBAAA,EAC3G,QAAA,EAAA;AAAA,oBAAAC,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAmB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,EAAE,CAAA;AAAA,IAEvD,MAAA,CAAO,MAAA,GAAS,CAAA,oBAAKA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,YAAA,EAAW,UAAA,EAAY,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA,EAAE,CAAA;AAAA,oBACxGD,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,sBAAA;AAAA,QACV,OAAA,EAAS,MAAA;AAAA,QACT,YAAA,EAAY,YAAY,mBAAA,GAAsB,qBAAA;AAAA,QAC9C,KAAA,EAAO,YAAY,QAAA,GAAW,UAAA;AAAA,QAE9B,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,OAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,aAAA,EAAY,MAAA,EAAO,KAAA,EAAO,EAAE,WAAW,SAAA,GAAY,gBAAA,GAAmB,MAAA,EAAU,EAC/N,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kBAAiB,CAAA,EAC3B,CAAA;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAoB,QAAA,EAAA,UAAA,EAAQ;AAAA;AAAA;AAAA;AAC9C,GAAA,EACF,CAAA;AAEJ;AC9EO,IAAM,SAAA,GAAY,gBAAA;AAElB,SAAS,QAAA,CAAS,eAAsB,OAAA,EAAsC;AACnF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,eAAgB,YAAY,CAAA;AAEtD,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AACpD,MAAA,IAAI,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,MAAA,WAAiB,MAAM,CAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAa;AACxB,IAAA,QAAA,CAAS,CAAC,CAAA;AACV,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA;AAAA,IAC1C,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AACA,EAAA,OAAO,CAAC,OAAO,GAAG,CAAA;AACpB;AAEO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,QAAA,EAAS,EAAmD;AAC/F,EAAA,uBACEH,gBAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAS,IAAA,EAAK,OAAA,EAAQ,cAAW,OAAA,EAC/C,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,cAAA,EAAc,KAAA,KAAU,OAAA,EAAS,OAAA,EAAS,MAAM,QAAA,CAAS,OAAO,CAAA,EAAG,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,oBAC9FA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,cAAA,EAAc,KAAA,KAAU,MAAA,EAAQ,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,GAAG,QAAA,EAAA,MAAA,EAAI;AAAA,GAAA,EAC7F,CAAA;AAEJ;AC5BO,SAAS,YAAY,IAAA,EAAyB;AACnD,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,EAAM,IAAA,GAAO,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA;AACjD,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAC1C,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAAE,aAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA;AAClE;AAEO,SAAS,WAAW,IAAA,EAAyB;AAClD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAM,IAAA,EAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,IAAK,EAAC;AACjE,EAAA,IAAI,MAAM,MAAA,IAAU,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,CAAE,CAAC,GAAG,WAAA,EAAY;AACrF,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AAChE,EAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,KAAK,WAAA,EAAY;AAC5C;AAEA,IAAM,MAAM,EAAE,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,EAAI,SAAS,WAAA,EAAa,IAAA,EAAM,QAAQ,MAAA,EAAQ,cAAA,EAAgB,aAAa,CAAA,EAAG,aAAA,EAAe,SAAkB,cAAA,EAAgB,OAAA,EAAkB,eAAe,IAAA,EAAK;AACxM,IAAM,UAAA,GAAa,sBAAMA,cAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,GAAA,EAAK,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kDAAA,EAAmD,CAAA,EAAE,CAAA;AACpG,IAAM,UAAU,sBAAMD,eAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,GAAA,EAAK,QAAA,EAAA;AAAA,kBAAAC,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,kBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oGAAA,EAAqG;AAAA,CAAA,EAAE,CAAA;AACnL,IAAM,WAAW,sBAAMD,eAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,GAAA,EAAK,QAAA,EAAA;AAAA,kBAAAC,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI,CAAA;AAAA,kBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB;AAAA,CAAA,EAAE,CAAA;AAErG,IAAM,WAAW,sBAAMD,eAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,GAAA,EAAK,QAAA,EAAA;AAAA,kBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0CAAA,EAA2C,CAAA;AAAA,kBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4CAAA,EAA6C;AAAA,CAAA,EAAE,CAAA;AACjJ,IAAM,UAAU,sBAAMD,eAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,GAAA,EAAK,QAAA,EAAA;AAAA,kBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yCAAA,EAA0C,CAAA;AAAA,kBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB,CAAA;AAAA,kBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW;AAAA,CAAA,EAAE,CAAA;AAEjI,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,IAAA,EAAM,OAAO,OAAA,EAAS,WAAA,EAAa,WAAA,EAAa,QAAA,EAAS,EAU1F;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAOE,aAAuB,IAAI,CAAA;AAExC,EAAAD,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS,QAAA,CAAS,EAAE,MAAc,CAAA,UAAW,KAAK,CAAA;AAAA,IAC9D,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IACvC,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,OAAO,CAAA;AAC9C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,OAAO,CAAA;AACjD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBACEH,gBAAC,KAAA,EAAA,EAAI,GAAA,EAAK,MAAM,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAW,EAC5C,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,WAAA,EAAY,eAAA,EAAc,MAAA,EAAO,eAAA,EAAe,MAAM,YAAA,EAAW,cAAA,EAAe,OAAA,EAAS,MAAM,QAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,GAC7I,QAAA,EAAA,IAAA,CAAK,SAAA,mBAAYA,cAAAA,CAAC,SAAI,GAAA,EAAK,IAAA,CAAK,SAAA,EAAW,GAAA,EAAI,IAAG,SAAA,EAAU,gBAAA,EAAiB,CAAA,GAAK,UAAA,CAAW,IAAI,CAAA,EACpG,CAAA;AAAA,IAEC,wBACCD,eAAAA,CAAC,SAAI,SAAA,EAAU,SAAA,EAAU,MAAK,MAAA,EAC5B,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EAAiB,eAAK,IAAA,EAAM,IAAA,EAAK,IAAK,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,QAC/D,IAAA,CAAK,IAAA,EAAM,IAAA,EAAK,oBAAKA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM;AAAA,OAAA,EACpE,CAAA;AAAA,sBACAD,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAsC,IAAA,EAAK,UAAA,EAAW,iBAAc,MAAA,EACjF,QAAA,EAAA;AAAA,wBAAAC,eAAC,UAAA,EAAA,EAAW,CAAA;AAAA,wBACZA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACVA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAuC,QAAA,EAAA,IAAA,EAAK;AAAA,OAAA,EAC9D,CAAA;AAAA,sBACAD,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAsC,IAAA,EAAK,UAAA,EAAW,iBAAc,MAAA,EACjF,QAAA,EAAA;AAAA,wBAAAC,eAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,wBACTA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,wBACXA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,QAAA,kBAAAA,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAc,QAAA,EAAU,OAAA,EAAS,CAAA,EAAE;AAAA,OAAA,EACjF,CAAA;AAAA,MAAA,CACE,eAAe,QAAA,qBAAaA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EAAe,CAAA;AAAA,MAC3D,WAAA,oBACCD,eAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,WAAA,EAAa,IAAA,EAAK,UAAA,EAAW,SAAA,EAAU,eAAA,EAC9C,QAAA,EAAA;AAAA,wBAAAC,eAAC,QAAA,EAAA,EAAS,CAAA;AAAA,QAAE;AAAA,OAAA,EAEd,CAAA;AAAA,MAED,QAAA,oBACCD,eAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,QAAA,EAAU,IAAA,EAAK,UAAA,EAAW,SAAA,EAAU,eAAA,EAC3C,QAAA,EAAA;AAAA,wBAAAC,eAAC,QAAA,EAAA,EAAS,CAAA;AAAA,QAAE;AAAA,OAAA,EAEd,CAAA;AAAA,sBAEFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,sBAC9BA,cAAAA,CAAC,MAAA,EAAA,EAAK,MAAA,EAAO,MAAA,EAAO,QAAQ,WAAA,EAAa,SAAA,EAAU,kBAAA,EACjD,QAAA,kBAAAD,gBAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,IAAA,EAAK,UAAA,EAAW,WAAU,eAAA,EAC9C,QAAA,EAAA;AAAA,wBAAAC,eAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,QAAE;AAAA,OAAA,EAEb,CAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AC7GO,SAAS,MAAA,CAAO,EAAE,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,WAAA,EAAa,UAAS,EAY/H;AACD,EAAA,uBACED,eAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,WAAA,EAChB,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,QAAA,EAAU,WAAU,kBAAA,EAE1B,QAAA,EAAA;AAAA,MAAA,OAAA,oBAAWC,eAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAS,GAAA,EAAI,EAAA,EAAG,WAAU,iBAAA,EAAkB,CAAA;AAAA,sBAClEA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,sBAChBA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAsB,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EACpD,CAAA;AAAA,IACC,QAAQ,IAAA,oBACPD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,eAAY,aAAA,EAAc,QAAA,EAAA;AAAA,QAAA,gBAAA;AAAA,QAAe,YAAY,IAAI;AAAA,OAAA,EAAE,CAAA;AAAA,sBACjGC,eAAC,WAAA,EAAA,EAAY,IAAA,EAAY,MAAY,KAAA,EAAc,OAAA,EAAkB,WAAA,EAA0B,WAAA,EAA0B,QAAA,EAAoB;AAAA,KAAA,EAC/I;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;ACnBO,IAAM,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AC8BlB,SAAS,UAAA,CAAW;AAAA,EACzB,QAAA;AAAA,EAAU,WAAA,GAAc,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,GAAA;AAAA,EAAK,SAAA;AAAA,EAAW,UAAA;AAAA,EACvE,QAAA,GAAW,QAAA;AAAA,EAAU,WAAA;AAAA,EAAa,WAAA;AAAA,EAAa,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,YAAA,GAAe,OAAA;AAAA,EAAS;AAC7F,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,YAAY,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,IAAQ,IAAI,CAAA;AACpC,EAAA,MAAM,SAAA,GAAY,QAAA,EAAU,IAAA,EAAM,IAAA,EAAK,IAAK,QAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,UAAU,OAAA,IAAW,OAAA;AAEvC,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAW,cAAY,KAAA,EACpC,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,WAAO,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,oBAClBA,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,SAAA;AAAA,QACV,WAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA,EAAU,QAAA;AAAA,QACV,IAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,OAAA,EAAS,QAAA;AAAA,QACT,WAAA,EAAa,WAAA,IAAe,CAAA,EAAG,QAAQ,CAAA,aAAA,CAAA;AAAA,QACvC,aAAa,WAAA,KAAgB,IAAA,GAAO,MAAA,GAAa,WAAA,IAAe,GAAG,QAAQ,CAAA,QAAA,CAAA;AAAA,QAC3E,UAAU,QAAA,KAAa,IAAA,GAAO,MAAA,GAAa,QAAA,IAAY,GAAG,QAAQ,CAAA,KAAA;AAAA;AAAA,KACpE;AAAA,oBACAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA,oBAAWC,eAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,KAAK,MAAA,EAAQ,SAAA,EAAW,YAAwB,QAAA,EAAoB,CAAA;AAAA,sBAChGA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EACd,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAc,QAAA,EAAS,CAAA,EACxC;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACpEO,SAAS,WAAA,CAAY,OAAA,GAAyB,WAAA,EAAa,IAAA,GAAmB,MAAM,KAAA,EAAwB;AACjH,EAAA,OAAO,CAAC,QAAA,EAAU,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAC5F;AAGO,SAAS,WAAA,CAAY,OAAA,GAAyB,WAAA,EAAa,IAAA,GAAmB,IAAA,EAAM;AACzF,EAAA,OAAO,EAAE,SAAA,EAAW,WAAA,CAAY,OAAA,EAAS,IAAI,CAAA,EAAE;AACjD;AAOO,SAAS,MAAA,CAAO,EAAE,OAAA,GAAU,WAAA,EAAa,IAAA,GAAO,IAAA,EAAM,SAAA,EAAW,IAAA,GAAO,QAAA,EAAU,GAAG,IAAA,EAAK,EAAgB;AAC/G,EAAA,uBAAOA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAY,SAAA,EAAW,WAAA,CAAY,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA,EAAI,GAAG,IAAA,EAAM,CAAA;AACzF;AAWO,SAAS,UAAA,CAAW,EAAE,OAAA,GAAU,WAAA,EAAa,IAAA,GAAO,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,GAAG,IAAA,EAAK,EAAoB;AACnI,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,MAAA,EAAQ,UAAU,GAAA,EAAK,YAAA,EAAc,GAAG,IAAA,EAAK,GAAI,IAAA;AAC5E,EAAA,uBACED,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,WAAA,CAAY,SAAS,IAAA,EAAM,SAAS,CAAA,EAAI,GAAG,KAAA,EACtD,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,QAAA,oBAAYC,cAAAA,CAAC,aAAA,EAAA,EAAc,CAAA;AAAA,IAC3B,OAAA,IAAW,CAAC,QAAA,oBAAYA,eAAC,YAAA,EAAA,EAAa;AAAA,GAAA,EACzC,CAAA;AAEJ;AAEO,SAAS,YAAA,GAAe;AAC7B,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,eAAY,MAAA,EAAO,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,WAAU,wBAAA,EACnJ,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,oBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB;AAAA,GAAA,EAC/C,CAAA;AAEJ;AAGO,SAAS,aAAA,GAAgB;AAC9B,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,eAAY,MAAA,EAAO,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,WAAU,UAAA,EACnJ,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,CAAA;AAAA,oBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa;AAAA,GAAA,EAC9C,CAAA;AAEJ;AC3DO,SAAS,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,OAAA,EAAS,WAAU,EAKpE;AACD,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAC,SAAA,EAAW,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAC5D,QAAA,EAAA;AAAA,IAAA,KAAA,oBAASC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAkB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAChD,wBAAQA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAiB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,IAC7C,wBAAQA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAiB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,IAC7C,QAAA;AAAA,IACA,2BAAWA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAoB,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EACzD,CAAA;AAEJ;AAEO,SAAS,WAAW,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,SAAQ,EAE5D;AACD,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,gBAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,OAAA,oBAAWC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAwB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBAC3DA,cAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACV,4BAAYA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAoB,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EAC3D,CAAA;AAAA,IACC,OAAA,oBAAWA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAE,EAAI,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EAClF,CAAA;AAEJ;AAIO,SAAS,WAAW,EAAE,IAAA,GAAO,SAAA,EAAW,QAAA,EAAU,OAAM,EAA6D;AAC1H,EAAA,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAW,oBAAoB,IAAI,CAAA,CAAA,EAAI,OAAe,QAAA,EAAS,CAAA;AAC9E;AAEO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,QAAA,EAAU,QAAO,EAAmE;AACtH,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,QAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACV,QAAA,oBAAYA,cAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAS,CAAA;AAAA,IAC3B,MAAA,oBAAUA,cAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,SAAA,EAAW,EAAA,EAAG,EAAI,QAAA,EAAA,MAAA,EAAO;AAAA,GAAA,EACpD,CAAA;AAEJ;AAQO,SAAS,KAAA,CAAM,EAAE,KAAA,EAAM,EAA0E;AACtG,EAAA,uBACEA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,cAAW,UAAA,EACjC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,qBACdD,eAAAA,CAAC,IAAA,EAAA,EAAW,SAAA,EAAW,CAAA,iBAAA,EAAoB,EAAA,CAAG,KAAK,CAAA,CAAA,EAAI,cAAA,EAAc,EAAA,CAAG,KAAA,KAAU,QAAA,GAAW,MAAA,GAAS,MAAA,EACpG,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,eAAY,MAAA,EAAQ,QAAA,EAAA,EAAA,CAAG,KAAA,KAAU,MAAA,GAAS,WAAM,EAAA,CAAG,KAAA,KAAU,QAAA,GAAW,GAAA,GAAM,IAAI,CAAA,EAAE,CAAA;AAAA,oBACnHD,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EACd,QAAA,EAAA;AAAA,sBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,aAAG,KAAA,EAAM,CAAA;AAAA,MAC1C,EAAA,CAAG,wBAAQA,cAAAA,CAAC,UAAK,SAAA,EAAU,eAAA,EAAiB,aAAG,IAAA,EAAK;AAAA,KAAA,EACvD;AAAA,GAAA,EAAA,EALO,CAMT,CACD,CAAA,EACH,CAAA;AAEJ;ACvDO,SAAS,KAAK,EAAE,OAAA,EAAS,OAAO,QAAA,EAAU,KAAA,GAAQ,YAAW,EAKjE;AACD,EAAA,MAAM,IAAA,GAAOG,aAAuB,IAAI,CAAA;AAExC,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqC;AAClD,IAAA,MAAM,IAAI,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACpD,IAAA,IAAI,IAAI,CAAA,EAAG;AACX,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,EAAE,GAAA,KAAQ,YAAA,EAAc,IAAA,GAAA,CAAQ,CAAA,GAAI,KAAK,OAAA,CAAQ,MAAA;AAAA,SAAA,IAC5C,CAAA,CAAE,QAAQ,WAAA,EAAa,IAAA,GAAA,CAAQ,IAAI,CAAA,GAAI,OAAA,CAAQ,UAAU,OAAA,CAAQ,MAAA;AAAA,SAAA,IACjE,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAQ,IAAA,GAAO,CAAA;AAAA,SAAA,IACzB,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO,IAAA,GAAO,QAAQ,MAAA,GAAS,CAAA;AAAA,SAC7C;AACL,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAK,CAAA;AAC5B,IAAC,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,IAAI,GAA+B,KAAA,EAAM;AAAA,EACnE,CAAA;AAEA,EAAA,uBACEH,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,WAAU,SAAA,EAAU,IAAA,EAAK,SAAA,EAAU,YAAA,EAAY,OAAO,SAAA,EAAW,KAAA,EAC9E,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AAClB,IAAA,MAAM,MAAA,GAAS,EAAE,KAAA,KAAU,KAAA;AAC3B,IAAA,uBACED,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAU,cAAA;AAAA,QACV,eAAA,EAAe,MAAA;AAAA,QACf,QAAA,EAAU,SAAS,CAAA,GAAI,EAAA;AAAA,QACvB,OAAA,EAAS,MAAM,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAA,QAE9B,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,KAAA;AAAA,UACF,EAAE,MAAA,oBAAUA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EAAW,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAAE,CAAA,CAAE;AAAA,WAAA,EAAO;AAAA;AAAA,OAAA;AAAA,MAT9C,CAAA,CAAE;AAAA,KAUT;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ","file":"index.cjs","sourcesContent":["/** Eight stroke icons, 18px, currentColor. Registry ids pick one; unknown ids get `doc`. */\n\nimport type { SVGProps } from \"react\";\n\nexport type IconName = \"home\" | \"posts\" | \"events\" | \"mic\" | \"venues\" | \"users\" | \"settings\" | \"doc\";\n\nconst base: SVGProps<SVGSVGElement> = {\n width: 18, height: 18, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\",\n strokeWidth: 1.7, strokeLinecap: \"round\", strokeLinejoin: \"round\", \"aria-hidden\": true,\n style: { flexShrink: 0 },\n};\n\nexport function Icon({ name }: { name: IconName }) {\n switch (name) {\n case \"home\":\n return <svg {...base}><rect x=\"3\" y=\"3\" width=\"7\" height=\"9\" rx=\"1\" /><rect x=\"14\" y=\"3\" width=\"7\" height=\"5\" rx=\"1\" /><rect x=\"14\" y=\"12\" width=\"7\" height=\"9\" rx=\"1\" /><rect x=\"3\" y=\"16\" width=\"7\" height=\"5\" rx=\"1\" /></svg>;\n case \"posts\":\n return <svg {...base}><path d=\"M6 3h9l4 4v14H6z\" /><path d=\"M15 3v4h4\" /><path d=\"M9 12h7M9 16h7M9 8h3\" /></svg>;\n case \"events\":\n return <svg {...base}><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M8 3v4M16 3v4M3 10h18\" /></svg>;\n case \"mic\":\n return <svg {...base}><rect x=\"9\" y=\"3\" width=\"6\" height=\"11\" rx=\"3\" /><path d=\"M5 11a7 7 0 0 0 14 0\" /><path d=\"M12 18v3M9 21h6\" /></svg>;\n case \"venues\":\n return <svg {...base}><path d=\"M12 21s7-6.2 7-11.5A7 7 0 0 0 5 9.5C5 14.8 12 21 12 21z\" /><circle cx=\"12\" cy=\"9.5\" r=\"2.5\" /></svg>;\n case \"users\":\n return <svg {...base}><circle cx=\"9\" cy=\"8\" r=\"3.5\" /><path d=\"M2.5 20a6.5 6.5 0 0 1 13 0\" /><circle cx=\"17\" cy=\"9\" r=\"2.5\" /><path d=\"M15.5 14.5a5 5 0 0 1 6 5\" /></svg>;\n case \"settings\":\n // Two sliders — the same mark the visibility tracker uses, so Studio and the tracker read as one family.\n return <svg {...base}><path d=\"M4 7h9\" /><circle cx=\"16\" cy=\"7\" r=\"2\" /><path d=\"M19 7h1\" /><path d=\"M4 17h9\" /><circle cx=\"16\" cy=\"17\" r=\"2\" /><path d=\"M19 17h1\" /></svg>;\n default:\n return <svg {...base}><path d=\"M6 3h9l4 4v14H6z\" /><path d=\"M15 3v4h4\" /></svg>;\n }\n}\n\nexport function iconFor(id: string): IconName {\n const known: IconName[] = [\"home\", \"posts\", \"events\", \"mic\", \"venues\", \"users\", \"settings\"];\n return (known as string[]).includes(id) ? (id as IconName) : \"doc\";\n}\n","/**\n * Sidebar — items from the content-type registry (via navFromContentTypes),\n * active by href prefix, collapsible with the state remembered per browser.\n * Plain anchors: the package does not know which router the host uses.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { Icon, iconFor } from \"./icons\";\n\nexport interface NavItem {\n id: string;\n label: string;\n href: string;\n /** Icon id; unknown ids fall back to a document icon. Defaults to `id`. */\n icon?: string;\n /** Shown greyed out and not navigable — a section that is coming but not built yet. */\n disabled?: boolean;\n}\n\nexport const SIDEBAR_KEY = \"rz-admin-sidebar\";\n\nexport function isActive(item: NavItem, activeHref: string, basePath: string): boolean {\n if (item.href === basePath) return activeHref === basePath || activeHref === `${basePath}/`;\n return activeHref === item.href || activeHref.startsWith(`${item.href}/`);\n}\n\nexport function Sidebar({ items, pinned = [], activeHref, basePath }: { items: NavItem[]; pinned?: NavItem[]; activeHref: string; basePath: string }) {\n const [collapsed, setCollapsed] = useState(false);\n\n useEffect(() => {\n try {\n if (window.localStorage.getItem(SIDEBAR_KEY) === \"collapsed\") setCollapsed(true);\n } catch {\n /* storage unavailable */\n }\n }, []);\n\n const toggle = () => {\n const next = !collapsed;\n setCollapsed(next);\n try {\n window.localStorage.setItem(SIDEBAR_KEY, next ? \"collapsed\" : \"open\");\n } catch {\n /* ignore */\n }\n };\n\n const renderItem = (item: NavItem) => {\n const active = !item.disabled && isActive(item, activeHref, basePath);\n if (item.disabled) {\n return (\n <span key={item.id} className=\"rz-sidebar__item rz-sidebar__item--disabled\" aria-disabled=\"true\" title={collapsed ? `${item.label} — coming soon` : \"Coming soon\"}>\n <Icon name={iconFor(item.icon ?? item.id)} />\n <span className=\"rz-sidebar__label\">{item.label}</span>\n </span>\n );\n }\n return (\n <a\n key={item.id}\n href={item.href}\n className={[\"rz-sidebar__item\", active && \"rz-sidebar__item--active\"].filter(Boolean).join(\" \")}\n aria-current={active ? \"page\" : undefined}\n title={collapsed ? item.label : undefined}\n >\n <Icon name={iconFor(item.icon ?? item.id)} />\n <span className=\"rz-sidebar__label\">{item.label}</span>\n </a>\n );\n };\n\n return (\n <aside className={[\"rz-sidebar\", collapsed && \"rz-sidebar--collapsed\"].filter(Boolean).join(\" \")} aria-label=\"Admin navigation\">\n <nav className=\"rz-sidebar__nav\">{items.map(renderItem)}</nav>\n {/* Pinned above Collapse (Settings) so it stays in one place as sections are added, instead of drifting down the list. */}\n {pinned.length > 0 && <nav className=\"rz-sidebar__pinned\" aria-label=\"Settings\">{pinned.map(renderItem)}</nav>}\n <button\n type=\"button\"\n className=\"rz-sidebar__collapse\"\n onClick={toggle}\n aria-label={collapsed ? \"Expand navigation\" : \"Collapse navigation\"}\n title={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" style={{ transform: collapsed ? \"rotate(180deg)\" : undefined }}>\n <path d=\"M15 6l-6 6 6 6\" />\n </svg>\n <span className=\"rz-sidebar__label\">Collapse</span>\n </button>\n </aside>\n );\n}\n","/**\n * Light / dark, remembered per browser. The attribute lives on the .rz-admin\n * root (not <html>) so the host site's own theme is never touched.\n *\n * No flash of the wrong theme: the server renders defaultTheme, and the effect\n * only flips when a stored value differs — a single client-side change, never\n * a mismatch between server HTML and first client render.\n */\n\nimport { useEffect, useState } from \"react\";\n\nexport type Theme = \"light\" | \"dark\";\nexport const THEME_KEY = \"rz-admin-theme\";\n\nexport function useTheme(defaultTheme: Theme = \"light\"): [Theme, (t: Theme) => void] {\n const [theme, setTheme] = useState<Theme>(defaultTheme);\n\n useEffect(() => {\n try {\n const stored = window.localStorage.getItem(THEME_KEY);\n if (stored === \"light\" || stored === \"dark\") setTheme(stored);\n } catch {\n /* storage unavailable */\n }\n }, []);\n\n const set = (t: Theme) => {\n setTheme(t);\n try {\n window.localStorage.setItem(THEME_KEY, t);\n } catch {\n /* ignore */\n }\n };\n return [theme, set];\n}\n\nexport function ThemeToggle({ theme, onChange }: { theme: Theme; onChange: (t: Theme) => void }) {\n return (\n <span className=\"rz-seg\" role=\"group\" aria-label=\"Theme\">\n <button type=\"button\" aria-pressed={theme === \"light\"} onClick={() => onChange(\"light\")}>Light</button>\n <button type=\"button\" aria-pressed={theme === \"dark\"} onClick={() => onChange(\"dark\")}>Dark</button>\n </span>\n );\n}\n","/**\n * Avatar button → menu, tracker-style: a header with who you are, then\n * full-width rows each led by a 14px icon. Sign out is a plain POST form so it\n * works before hydration.\n */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { ThemeToggle, type Theme } from \"./ThemeToggle\";\n\nexport interface ShellUser {\n email: string;\n name?: string | null;\n /** Profile photo; initials show when absent. */\n avatarUrl?: string | null;\n}\n\nexport function firstNameOf(user: ShellUser): string {\n const fromName = user.name?.trim().split(/\\s+/)[0];\n if (fromName) return fromName;\n const local = user.email.split(\"@\")[0] ?? \"\";\n return local ? local.charAt(0).toUpperCase() + local.slice(1) : \"there\";\n}\n\nexport function initialsOf(user: ShellUser): string {\n const parts = user.name?.trim().split(/\\s+/).filter(Boolean) ?? [];\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (user.email[0] ?? \"?\").toUpperCase();\n}\n\nconst ico = { width: 14, height: 14, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\" as const, strokeLinejoin: \"round\" as const, \"aria-hidden\": true };\nconst ShieldIcon = () => <svg {...ico}><path d=\"M12 3l7 3v5c0 5-3.5 8.5-7 10-3.5-1.5-7-5-7-10V6z\" /></svg>;\nconst SunIcon = () => <svg {...ico}><circle cx=\"12\" cy=\"12\" r=\"4\" /><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" /></svg>;\nconst UserIcon = () => <svg {...ico}><circle cx=\"12\" cy=\"8\" r=\"4\" /><path d=\"M4 21a8 8 0 0 1 16 0\" /></svg>;\n// An open book — \"the guide\". Two clean strokes that stay legible at 14px.\nconst HelpIcon = () => <svg {...ico}><path d=\"M2 4h6a4 4 0 0 1 4 4v12a3 3 0 0 0-3-3H2z\" /><path d=\"M22 4h-6a4 4 0 0 0-4 4v12a3 3 0 0 1 3-3h7z\" /></svg>;\nconst OutIcon = () => <svg {...ico}><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" /><path d=\"M16 17l5-5-5-5\" /><path d=\"M21 12H9\" /></svg>;\n\nexport function AccountMenu({ user, role, theme, onTheme, signOutPath, accountHref, helpHref }: {\n user: ShellUser;\n role: string;\n theme: Theme;\n onTheme: (t: Theme) => void;\n signOutPath: string;\n /** The Account page (My Profile · Change Password · Team · Business). Omit to hide the item. */\n accountHref?: string;\n /** The Help center. Omit to hide the item. */\n helpHref?: string;\n}) {\n const [open, setOpen] = useState(false);\n const wrap = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => {\n if (!wrap.current?.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onClick);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n return (\n <div ref={wrap} style={{ position: \"relative\" }}>\n <button type=\"button\" className=\"rz-avatar\" aria-haspopup=\"menu\" aria-expanded={open} aria-label=\"Account menu\" onClick={() => setOpen((v) => !v)}>\n {user.avatarUrl ? <img src={user.avatarUrl} alt=\"\" className=\"rz-avatar__img\" /> : initialsOf(user)}\n </button>\n\n {open && (\n <div className=\"rz-menu\" role=\"menu\">\n <div className=\"rz-menu__who\">\n <div className=\"rz-menu__name\">{user.name?.trim() || user.email}</div>\n {user.name?.trim() && <div className=\"rz-menu__email\">{user.email}</div>}\n </div>\n <div className=\"rz-menu__item rz-menu__item--static\" role=\"menuitem\" aria-disabled=\"true\">\n <ShieldIcon />\n <span>Role</span>\n <span className=\"rz-menu__end rz-pill rz-pill--plain\">{role}</span>\n </div>\n <div className=\"rz-menu__item rz-menu__item--static\" role=\"menuitem\" aria-disabled=\"true\">\n <SunIcon />\n <span>Theme</span>\n <span className=\"rz-menu__end\"><ThemeToggle theme={theme} onChange={onTheme} /></span>\n </div>\n {(accountHref || helpHref) && <div className=\"rz-menu__sep\" />}\n {accountHref && (\n <a href={accountHref} role=\"menuitem\" className=\"rz-menu__item\">\n <UserIcon />\n Account\n </a>\n )}\n {helpHref && (\n <a href={helpHref} role=\"menuitem\" className=\"rz-menu__item\">\n <HelpIcon />\n Help center\n </a>\n )}\n <div className=\"rz-menu__sep\" />\n <form method=\"post\" action={signOutPath} className=\"rz-menu__signout\">\n <button type=\"submit\" role=\"menuitem\" className=\"rz-menu__item\">\n <OutIcon />\n Sign out\n </button>\n </form>\n </div>\n )}\n </div>\n );\n}\n","/** Top bar: brand on the left, greeting + account menu on the right. */\n\nimport { AccountMenu, firstNameOf, type ShellUser } from \"./AccountMenu\";\nimport type { Theme } from \"./ThemeToggle\";\n\nexport function TopBar({ siteName, productName, logoUrl, homeHref, user, role, theme, onTheme, signOutPath, accountHref, helpHref }: {\n siteName: string;\n productName: string;\n logoUrl?: string | null;\n homeHref: string;\n user: ShellUser | null;\n role: string | null;\n theme: Theme;\n onTheme: (t: Theme) => void;\n signOutPath: string;\n accountHref?: string;\n helpHref?: string;\n}) {\n return (\n <header className=\"rz-topbar\">\n <a href={homeHref} className=\"rz-topbar__brand\">\n {/* the site's own mark (usually its favicon); next/image is deliberately not used in the package */}\n {logoUrl && <img src={logoUrl} alt=\"\" className=\"rz-topbar__logo\" />}\n <span>{siteName}</span>\n <span className=\"rz-topbar__product\">{productName}</span>\n </a>\n {user && role && (\n <div className=\"rz-topbar__right\">\n <span className=\"rz-topbar__greeting\" data-testid=\"rz-greeting\">Welcome back, {firstNameOf(user)}</span>\n <AccountMenu user={user} role={role} theme={theme} onTheme={onTheme} signOutPath={signOutPath} accountHref={accountHref} helpHref={helpHref} />\n </div>\n )}\n </header>\n );\n}\n","/**\n * SHELL_CSS — the design system, as one string the shell injects.\n *\n * Palette borrowed from the visibility tracker (Realiiz's back-office look):\n * warm bone/ink with an operative-green signal. Light is the default so every\n * install looks finished; dark is one attribute away. Everything is scoped to\n * `.rz-admin` so a host site's variables never leak in and ours never leak out.\n *\n * A site overrides by redeclaring any variable on `.rz-admin` — e.g.\n * .rz-admin { --signal: #0a58ca; --rz-font: var(--font-inter), sans-serif; }\n *\n * The block at the end maps the forms-ui variables onto these tokens, so\n * ContentForm and MagicLinkForm re-skin without touching their own code.\n */\n\nexport const SHELL_CSS = `\n.rz-admin, .rz-admin[data-theme=\"light\"] {\n /* realiiz.com palette (src/app/globals.css): ink, bone, paper, signal blue, slate, line, amber */\n --ink: #0e1726; --bone: #f7f5f0; --signal: #1f6feb;\n --surface-0: #f7f5f0; --surface-1: #ffffff; --surface-2: #f1eee7; --surface-3: #e8e4da;\n --text-primary: #0e1726; --text-secondary: #5b6678; --text-muted: #8a93a5;\n --signal-dim: #1a63d8; --signal-glow: #5b9bff; --signal-warn: #e0a03b; --series-blue: #1f6feb;\n --border: #d9d4c8; --separator: #e9e5dc;\n --status-up: #15803d; --status-down: #dc2626; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin[data-theme=\"dark\"] { color-scheme: dark; }\n.rz-admin[data-theme=\"dark\"] {\n --ink: #eef0f5; --bone: #1b2334; --signal: #3b82f6;\n --surface-0: #1b2334; --surface-1: #222c42; --surface-2: #29344a; --surface-3: #36415c;\n --text-primary: #eef0f5; --text-secondary: #a2abbf; --text-muted: #77819a;\n --signal-dim: #8db4ff; --signal-glow: #aec9ff; --signal-warn: #eab058; --series-blue: #3b82f6;\n --border: #36415c; --separator: #2c3750;\n --status-up: #4ade80; --status-down: #f87171; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin {\n --rz-font: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n --rz-font-display: var(--rz-font);\n --rz-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;\n --rz-radius: 6px;\n --rz-sidebar: 220px; --rz-sidebar-collapsed: 58px; --rz-topbar: 52px;\n\n /* forms-ui speaks these; map them once so both packages agree */\n --realiiz-form-fg: var(--text-primary); --realiiz-form-muted: var(--text-muted);\n --realiiz-form-border: var(--border); --realiiz-form-accent: var(--signal);\n --realiiz-form-accent-fg: var(--signal-fg); --realiiz-form-danger: var(--status-down);\n --realiiz-form-radius: var(--rz-radius); --realiiz-form-font: var(--rz-font);\n --realiiz-form-focus-ring: 0 0 0 3px color-mix(in srgb, var(--signal) 25%, transparent);\n\n box-sizing: border-box; min-height: 100vh; display: flex; flex-direction: column;\n background: var(--surface-0); color: var(--text-primary);\n font-family: var(--rz-font); font-size: 14px; line-height: 1.45;\n}\n.rz-admin *, .rz-admin *::before, .rz-admin *::after { box-sizing: inherit; }\n.rz-admin a { color: inherit; }\n.rz-admin h1, .rz-admin h2, .rz-admin h3 { font-family: var(--rz-font-display); color: var(--text-primary); margin: 0; }\n.rz-admin .realiiz-form__control { background: var(--surface-0); }\n.rz-admin .realiiz-image { background: var(--surface-0); }\n.rz-admin .realiiz-image__thumb { background: var(--surface-2); }\n.rz-admin[data-theme=\"dark\"] .realiiz-form__control::-webkit-calendar-picker-indicator { filter: invert(1) opacity(.7); }\n.rz-admin .realiiz-form__button { background: var(--surface-1); color: var(--text-primary); }\n.rz-admin .realiiz-form__button--primary { background: var(--signal); color: var(--signal-fg); }\n\n/* ---- frame ---------------------------------------------------------- */\n.rz-topbar { height: var(--rz-topbar); display: flex; align-items: center; gap: 1rem; padding: 0 1.25rem; border-bottom: 1px solid var(--border); background: var(--surface-1); flex-shrink: 0; }\n.rz-topbar__brand { display: flex; align-items: center; gap: .6rem; font-weight: 600; font-size: .9375rem; text-decoration: none; }\n.rz-topbar__logo { height: 22px; width: auto; display: block; }\n.rz-topbar__product { font-weight: 400; color: var(--text-secondary); }\n.rz-topbar__right { margin-left: auto; display: flex; align-items: center; gap: 1rem; }\n.rz-topbar__greeting { color: var(--text-secondary); font-size: .8rem; }\n.rz-body { display: flex; flex: 1; min-height: 0; }\n/* Top bar and sidebar stay put while the content scrolls, so Collapse is always at the bottom-left. */\n.rz-topbar { position: sticky; top: 0; z-index: 20; }\n.rz-sidebar { position: sticky; top: var(--rz-topbar); height: calc(100vh - var(--rz-topbar)); width: var(--rz-sidebar); flex-shrink: 0; border-right: 1px solid var(--border); background: var(--surface-1); display: flex; flex-direction: column; transition: width .15s ease; overflow: hidden; }\n.rz-sidebar--collapsed { width: var(--rz-sidebar-collapsed); }\n.rz-sidebar__nav { padding: .75rem 0; flex: 1; overflow-y: auto; }\n.rz-sidebar__item { display: flex; align-items: center; gap: .65rem; padding: .55rem 1rem; color: var(--text-secondary); text-decoration: none; font-size: .875rem; font-weight: 400; white-space: nowrap; overflow: hidden; }\n.rz-sidebar__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-sidebar__item--active { background: var(--surface-2); color: var(--signal); font-weight: 500; }\n.rz-sidebar__item--disabled, .rz-sidebar__item--disabled:hover { color: var(--text-muted); opacity: .55; background: transparent; cursor: default; }\n.rz-sidebar--collapsed .rz-sidebar__item { justify-content: center; padding: .55rem 0; }\n.rz-sidebar--collapsed .rz-sidebar__label { display: none; }\n.rz-sidebar__pinned { border-top: 1px solid var(--separator); padding: .3rem 0; }\n.rz-sidebar__collapse { display: flex; align-items: center; gap: .7rem; padding: .6rem 1rem; border: 0; border-top: 1px solid var(--separator); background: transparent; color: var(--text-muted); cursor: pointer; font: inherit; font-size: .8rem; text-align: left; }\n.rz-sidebar__collapse:hover { color: var(--text-primary); }\n.rz-sidebar__collapse svg { flex-shrink: 0; }\n.rz-sidebar--collapsed .rz-sidebar__collapse { justify-content: center; padding: .6rem 0; }\n.rz-main { flex: 1; min-width: 0; }\n.rz-content { max-width: 1400px; margin: 0; padding: 28px 32px 80px; }\n.rz-content .realiiz-form { max-width: none; }\n.rz-content .realiiz-form fieldset, .rz-content .realiiz-form__alert, .rz-content .realiiz-form__actions { max-width: 920px; }\n/* The form's save bar pins to the bottom of the content column: bleed out over .rz-content's padding, then pad back in. */\n.rz-content .realiiz-form__bar { position: sticky; bottom: 0; z-index: 10; margin: 24px -32px -80px; padding: 12px 32px; background: var(--surface-1); border-top: 1px solid var(--border); box-shadow: 0 -6px 16px rgba(14,23,38,.05); }\n.rz-content .realiiz-form__status { color: var(--text-muted); }\n.rz-content .realiiz-form__bar[data-dirty] .realiiz-form__status { color: var(--text-primary); font-weight: 500; }\n\n/* ---- primitives ----------------------------------------------------- */\n/* Same metrics as the form's Save button (.realiiz-form__button) so every button in the admin matches. */\n.rz-btn { font-family: inherit; font-weight: 600; border-radius: var(--rz-radius); cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: .4rem; white-space: nowrap; line-height: 1.2; }\n.rz-btn--md { padding: 10px 16px; font-size: 15px; min-height: 40px; }\n.rz-btn--sm { padding: 6px 12px; font-size: 13px; min-height: 32px; }\n.rz-admin .rz-btn--primary, .rz-admin a.rz-btn--primary { background: var(--signal); color: var(--signal-fg); border: 1px solid var(--signal); }\n.rz-admin .rz-btn--secondary, .rz-admin a.rz-btn--secondary { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn--danger, .rz-admin a.rz-btn--danger { background: transparent; color: var(--status-down); border: 1px solid var(--status-down); }\n.rz-admin .rz-btn--ghost, .rz-admin a.rz-btn--ghost { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn:disabled { opacity: .55; cursor: default; }\n.rz-arrow { width: 1.1em; height: 1.1em; flex-shrink: 0; transition: transform .15s ease-out; }\n@media (prefers-reduced-motion: no-preference) {\n .rz-btn:hover .rz-arrow, a:hover .rz-arrow { transform: translate(2px, -2px); }\n .rz-btn:hover .rz-arrow--fwd, a:hover .rz-arrow--fwd { transform: translateX(4px); }\n}\n.rz-card { display: flex; flex-direction: column; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; padding: 18px 20px; }\n.rz-card--narrow { max-width: 760px; }\n.rz-card__title { font-size: .9375rem; font-weight: 600; margin-bottom: .35rem; }\n.rz-card__meta { color: var(--text-muted); font-size: .8rem; }\n.rz-card__actions { display: flex; gap: .5rem; margin-top: auto; padding-top: .9rem; flex-wrap: wrap; }\n.rz-card__note { margin-top: .5rem; }\n.rz-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }\n.rz-pagehead { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }\n.rz-pagehead__eyebrow { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .08em; color: var(--text-muted); margin-bottom: .3rem; }\n.rz-pagehead h1 { font-size: 1.375rem; font-weight: 600; }\n.rz-pagehead__sub { color: var(--text-secondary); font-size: .85rem; margin-top: .25rem; }\n.rz-pill { display: inline-flex; align-items: center; gap: .4rem; white-space: nowrap; font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; padding: .15rem .5rem; border: 1px solid var(--border); border-radius: 999px; color: var(--text-secondary); }\n.rz-pill::before { content: \"\"; width: 7px; height: 7px; border-radius: 50%; background: var(--status-neutral); }\n.rz-pill--up::before { background: var(--status-up); } .rz-pill--warn::before { background: var(--signal-warn); } .rz-pill--down::before { background: var(--status-down); }\n.rz-pill--plain::before { display: none; }\n/* ---- steps tracker ------------------------------------------------- */\n/* Dots on one rail, connectors dot-to-dot, label under each dot; left-aligned like the rest of the page. */\n.rz-steps { list-style: none; margin: 4px 0 22px; padding: 0 0 22px; display: flex; border-bottom: 1px solid var(--separator); }\n.rz-step { flex: 1; position: relative; display: flex; flex-direction: column; align-items: flex-start; text-align: left; gap: 8px; min-width: 0; }\n.rz-step:last-child { flex: 0 0 auto; }\n.rz-step:not(:last-child)::after { content: \"\"; position: absolute; top: 12px; left: 26px; right: 0; height: 2px; background: var(--border); }\n.rz-step--done:not(:last-child)::after { background: var(--status-up); }\n.rz-step__dot { width: 26px; height: 26px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 600; flex-shrink: 0; border: 2px solid var(--border); color: var(--text-muted); background: var(--surface-1); }\n.rz-step--done .rz-step__dot { background: var(--status-up); border-color: var(--status-up); color: #fff; }\n.rz-step--active .rz-step__dot { position: relative; border-color: color-mix(in srgb, var(--signal) 30%, transparent); color: var(--signal); }\n/* A spinning arc over the ring: the step is working, not waiting on you. */\n.rz-step--active .rz-step__dot::after { content: \"\"; position: absolute; inset: -2px; border-radius: 50%; border: 2px solid transparent; border-top-color: var(--signal); animation: rz-spin .9s linear infinite; }\n@media (prefers-reduced-motion: reduce) { .rz-step--active .rz-step__dot::after { animation: none; border-color: var(--signal); } }\n@keyframes rz-spin { to { transform: rotate(360deg); } }\n.rz-step--failed .rz-step__dot { background: var(--status-down); border-color: var(--status-down); color: #fff; }\n.rz-step__text { display: flex; flex-direction: column; gap: 1px; padding-right: 16px; }\n.rz-step__label { font-size: .875rem; font-weight: 500; color: var(--text-secondary); }\n.rz-step--active .rz-step__label, .rz-step--done .rz-step__label { color: var(--text-primary); }\n.rz-step--failed .rz-step__label { color: var(--status-down); }\n.rz-step__note { font-size: .75rem; color: var(--text-muted); }\n@keyframes rz-pulse { 0%, 100% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--signal) 18%, transparent); } 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--signal) 8%, transparent); } }\n.rz-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 20px; }\n.rz-actions__hint { font-size: .8rem; color: var(--text-muted); }\n.rz-notice { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface-1); margin-bottom: 18px; font-size: .9rem; }\n.rz-notice__text { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }\n.rz-status-link { text-decoration: none; }\n.rz-discard { margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--separator); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: .85rem; color: var(--text-secondary); }\n.rz-discard__link { background: none; border: 0; padding: 0; font: inherit; font-size: .85rem; color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.rz-discard__link:hover { color: var(--status-down); }\n.rz-nowrap { white-space: nowrap; }\n.rz-table td.rz-fit, .rz-table th.rz-fit { width: 1%; white-space: nowrap; }\n.rz-empty { border: 1px dashed var(--border); border-radius: 8px; padding: 32px; text-align: center; color: var(--text-secondary); }\n.rz-empty h3 { font-size: 1rem; margin-bottom: .4rem; }\n.rz-table-wrap { width: 100%; }\n.rz-table { width: 100%; border-collapse: collapse; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }\n.rz-table th, .rz-table td { text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--separator); font-size: .875rem; vertical-align: top; }\n.rz-table th { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; color: var(--text-muted); background: var(--surface-2); }\n.rz-table tr:last-child td { border-bottom: 0; }\n.rz-muted { color: var(--text-muted); }\n.rz-alert { border: 1px solid var(--status-down); color: var(--status-down); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n.rz-ok { border: 1px solid var(--status-up); color: var(--signal-dim); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n\n/* ---- account menu --------------------------------------------------- */\n.rz-avatar__img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }\n.rz-tabs { display: flex; gap: .25rem; border-bottom: 1px solid var(--border); margin: 0 0 1.5rem; flex-wrap: wrap; }\n.rz-tabs__tab { padding: .55rem .9rem; font: inherit; font-size: .88rem; color: var(--text-secondary); background: none; border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; cursor: pointer; }\n.rz-tabs__tab:hover { color: var(--text-primary); }\n.rz-tabs__tab[aria-selected=\"true\"] { color: var(--text-primary); border-bottom-color: var(--signal); font-weight: 600; }\n.rz-tabs__tab:focus-visible { outline: 2px solid var(--signal); outline-offset: -2px; border-radius: 4px; }\n.rz-avatar { width: 2rem; height: 2rem; border-radius: 50%; background: var(--surface-3); border: 1px solid var(--border); color: var(--text-primary); font-size: .6875rem; font-weight: 600; letter-spacing: .04em; display: flex; align-items: center; justify-content: center; cursor: pointer; font-family: inherit; padding: 0; overflow: hidden; }\n.rz-menu { position: absolute; right: 0; top: calc(100% + 8px); min-width: 15rem; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; box-shadow: 0 8px 24px rgba(14,23,38,.14); overflow: hidden; z-index: 50; }\n.rz-menu__who { padding: .75rem .9rem; border-bottom: 1px solid var(--border); margin-bottom: .3rem; }\n.rz-menu__name { font-weight: 600; font-size: .875rem; }\n.rz-menu__email { color: var(--text-muted); font-size: .75rem; word-break: break-all; }\n.rz-menu__sep { height: 1px; background: var(--border); margin: .3rem 0; }\n.rz-menu__item { display: flex; align-items: center; gap: .55rem; width: 100%; padding: .45rem .9rem; font: inherit; font-size: .8125rem; color: var(--text-secondary); background: none; border: 0; text-align: left; cursor: pointer; text-decoration: none; }\n.rz-menu__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-menu__item svg { flex-shrink: 0; }\n.rz-menu__item--static { cursor: default; }\n.rz-menu__item--static:hover { background: none; color: var(--text-secondary); }\n.rz-menu__item .rz-menu__end { margin-left: auto; }\n.rz-menu__signout { margin: 0 0 .3rem; }\n.rz-seg { display: inline-flex; border: 1px solid var(--border); border-radius: var(--rz-radius); overflow: hidden; }\n.rz-seg button { font: inherit; font-size: .75rem; padding: .15rem .55rem; line-height: 1.3; background: transparent; color: var(--text-secondary); border: 0; cursor: pointer; }\n.rz-seg button[aria-pressed=\"true\"] { background: var(--surface-3); color: var(--text-primary); }\n\n/* ---- mobile: sidebar becomes a strip under the top bar --------------- */\n@media (max-width: 720px) {\n .rz-body { flex-direction: column; }\n .rz-sidebar, .rz-sidebar--collapsed { width: 100%; border-right: 0; border-bottom: 1px solid var(--border); flex-direction: row; }\n .rz-sidebar__nav { display: flex; padding: .35rem .25rem; overflow-x: auto; }\n .rz-sidebar__item { flex-direction: column; gap: .2rem; font-size: .6875rem; padding: .4rem .6rem; border-radius: 6px; }\n .rz-sidebar--collapsed .rz-sidebar__label { display: block; }\n .rz-sidebar__collapse { display: none; }\n .rz-sidebar__pinned { display: flex; border-top: 0; padding: .35rem .25rem; }\n .rz-topbar__greeting { display: none; }\n .rz-content { padding: 18px 14px 60px; }\n /* The sidebar is a top strip now, so it must not be sticky-height; the topbar stays pinned. */\n .rz-sidebar, .rz-sidebar--collapsed { position: static; height: auto; }\n .rz-sidebar__item--disabled { display: none; }\n /* Save bar: bleed matches the narrower content padding; stack status above the buttons. */\n .rz-content .realiiz-form__bar { margin: 18px -14px -60px; padding: 10px 14px; flex-wrap: wrap; }\n .rz-content .realiiz-form__status { flex-basis: 100%; margin-right: 0; font-size: .8rem; }\n /* Editor toolbar wraps; the Insert group drops its label and left rule to save width. */\n .rz-admin .realiiz-md__head { padding: 5px; }\n .rz-admin .realiiz-md__insert { border-left: 0; padding-left: 0; margin-left: 0; }\n .rz-admin .realiiz-md__lab { display: none; }\n .rz-admin .realiiz-md--fs { padding: 8px; }\n /* Tracker: notes hide, labels shrink, so three steps fit a phone. */\n .rz-step__note { display: none; }\n .rz-step__label { font-size: .8rem; }\n .rz-step:not(:last-child)::after { right: 6px; }\n /* Tables scroll sideways inside their own box instead of stretching the page. */\n .rz-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n .rz-pagehead { align-items: flex-start; flex-direction: column; }\n .rz-notice { flex-direction: column; align-items: flex-start; }\n .rz-card--narrow { max-width: none; }\n}\n\n/* ---- forms extras: markdown editor, chips, gauges, preview prose --------- */\n.rz-admin .realiiz-md { --_md-head: var(--surface-2); --_md-hover: var(--surface-2); --_md-hover-line: var(--signal-glow); --_md-on: color-mix(in srgb, var(--signal) 12%, var(--surface-1)); --_md-tip: var(--ink); }\n.rz-admin .realiiz-md__mode { background: var(--surface-2); }\n.rz-admin .realiiz-md__mode button { color: var(--text-secondary); }\n.rz-admin .realiiz-md__mode button[aria-selected=\"true\"] { background: var(--surface-1); color: var(--text-primary); box-shadow: 0 1px 2px rgba(14,23,38,.12); }\n.rz-admin .realiiz-md__panel, .rz-admin .realiiz-md__tgrid, .rz-admin .realiiz-md--fs, .rz-admin .realiiz-md .realiiz-md__ta, .rz-admin .realiiz-md__preview, .rz-admin .realiiz-md__head button { background: var(--surface-1); }\n.rz-admin .realiiz-md__head { background: var(--surface-2); }\n.rz-admin .realiiz-md__head button { color: var(--text-primary); }\n.rz-admin .realiiz-md__insert button { background: var(--surface-2); color: var(--text-secondary); }\n.rz-admin .realiiz-md__tgcells i { background: var(--surface-1); }\n.rz-admin .realiiz-md__tgcells i.hot { background: color-mix(in srgb, var(--signal) 18%, var(--surface-1)); }\n.rz-admin .realiiz-md__loading { color: var(--text-muted); font-size: .8rem; }\n.rz-admin .realiiz-prose { max-width: 68ch; font-size: 1rem; line-height: 1.65; color: var(--text-primary); }\n.rz-admin .realiiz-prose h1, .rz-admin .realiiz-prose h2, .rz-admin .realiiz-prose h3 { font-family: var(--rz-font-display); line-height: 1.25; margin: 1.4em 0 .5em; }\n.rz-admin .realiiz-prose h2 { font-size: 1.35rem; } .rz-admin .realiiz-prose h3 { font-size: 1.1rem; }\n.rz-admin .realiiz-prose p, .rz-admin .realiiz-prose ul, .rz-admin .realiiz-prose ol, .rz-admin .realiiz-prose blockquote { margin: 0 0 1em; }\n.rz-admin .realiiz-prose a { color: var(--signal); }\n/* The site's prose class picks a slate body color for a light page; on the dark surface that reads as disabled. */\n.rz-admin[data-theme=\"dark\"] .realiiz-prose, .rz-admin[data-theme=\"dark\"] .realiiz-prose :is(p, li, td, th, dd, dt, figcaption, strong, b, em, i, h1, h2, h3, h4, h5, h6) { color: var(--text-primary); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose :is(code, kbd) { color: var(--text-primary); background: var(--surface-3); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose a { color: var(--signal-dim); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose hr { border-color: var(--border); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose blockquote { color: var(--text-secondary); }\n.rz-admin .realiiz-prose blockquote { border-left: 3px solid var(--border); padding-left: 1em; color: var(--text-secondary); }\n.rz-admin .realiiz-prose code { background: var(--surface-2); padding: 0 4px; border-radius: 4px; font-family: var(--rz-font-mono); font-size: .9em; }\n.rz-admin .realiiz-prose pre { background: var(--surface-2); padding: 12px 14px; border-radius: 6px; overflow-x: auto; }\n.rz-admin .realiiz-prose img { max-width: 100%; height: auto; border-radius: 6px; }\n.rz-admin .realiiz-chips { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; min-height: 40px; padding: 5px 8px; background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--rz-radius); }\n.rz-admin .realiiz-chips:focus-within { border-color: var(--signal); box-shadow: var(--realiiz-form-focus-ring); }\n.rz-admin .realiiz-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 4px 2px 9px; background: var(--surface-3); border: 1px solid var(--border); border-radius: 999px; font-size: .8rem; color: var(--text-primary); }\n.rz-admin .realiiz-chip button { font: inherit; line-height: 1; width: 18px; height: 18px; border-radius: 50%; border: 0; background: transparent; color: var(--text-muted); cursor: pointer; }\n.rz-admin .realiiz-chip button:hover { background: var(--status-down); color: #fff; }\n.rz-admin .realiiz-chips__input { flex: 1; min-width: 120px; border: 0; background: transparent; font: inherit; color: inherit; outline: none; padding: 4px; }\n.rz-admin .realiiz-chips__count { margin-left: auto; color: var(--text-muted); font-size: .75rem; font-variant-numeric: tabular-nums; }\n.rz-admin .realiiz-gauge { color: var(--text-muted); }\n.rz-admin .realiiz-gauge__bar { background: var(--surface-3); }\n.rz-admin .realiiz-gauge__zone { background: color-mix(in srgb, var(--status-up) 28%, transparent); }\n.rz-admin .realiiz-gauge__fill { background: var(--text-muted); }\n.rz-admin .realiiz-gauge--ok .realiiz-gauge__fill { background: var(--status-up); } .rz-admin .realiiz-gauge--ok { color: var(--status-up); }\n.rz-admin .realiiz-gauge--over .realiiz-gauge__fill { background: var(--status-down); } .rz-admin .realiiz-gauge--over { color: var(--status-down); }\n`;\n","/**\n * AdminShell — the frame every /admin page renders inside.\n *\n * Pure presentation: the host passes the session, the nav (from the registry)\n * and the current path. No env, no fetch, no router import. Tokens are\n * injected once via <style>; a site overrides them on `.rz-admin`.\n */\n\nimport type { ReactNode } from \"react\";\nimport type { ShellUser } from \"./AccountMenu\";\nimport { Sidebar, type NavItem } from \"./Sidebar\";\nimport { TopBar } from \"./TopBar\";\nimport { useTheme, type Theme } from \"./ThemeToggle\";\nimport { SHELL_CSS } from \"./tokens\";\n\nexport interface AdminShellProps {\n siteName: string;\n /** What the product is called in the top bar, e.g. \"Realiiz Studio\". Default \"Studio\" (shown as \"{siteName} Studio\"). */\n productName?: string;\n logoUrl?: string | null;\n /** null when nobody is signed in (sign-in page, not-configured page). */\n user: ShellUser | null;\n role: string | null;\n nav: NavItem[];\n /** Items pinned above Collapse (Settings), so they stay put as sections are added. */\n pinnedNav?: NavItem[];\n /** The current pathname, for the active nav item. */\n activeHref: string;\n /** Default \"/admin\". */\n basePath?: string;\n /** Default `${basePath}/auth/signout`. */\n signOutPath?: string;\n /** Account page for the avatar menu. Default `${basePath}/account`; null hides the item. */\n accountHref?: string | null;\n /** Help center for the avatar menu. Default `${basePath}/help`; null hides the item. */\n helpHref?: string | null;\n /**\n * The client's own branding (Business tab). `name` replaces siteName in the top bar\n * and `logoUrl` replaces the logo; the product word (\"Studio\") stays.\n */\n branding?: { name?: string | null; logoUrl?: string | null } | null;\n defaultTheme?: Theme;\n children: ReactNode;\n}\n\nexport function AdminShell({\n siteName, productName = \"Studio\", logoUrl, user, role, nav, pinnedNav, activeHref,\n basePath = \"/admin\", signOutPath, accountHref, helpHref, branding, defaultTheme = \"light\", children,\n}: AdminShellProps) {\n const [theme, setTheme] = useTheme(defaultTheme);\n const showNav = Boolean(user && role);\n const shownName = branding?.name?.trim() || siteName;\n const shownLogo = branding?.logoUrl || logoUrl;\n\n return (\n <div className=\"rz-admin\" data-theme={theme}>\n <style>{SHELL_CSS}</style>\n <TopBar\n siteName={shownName}\n productName={productName}\n logoUrl={shownLogo}\n homeHref={basePath}\n user={user}\n role={role}\n theme={theme}\n onTheme={setTheme}\n signOutPath={signOutPath ?? `${basePath}/auth/signout`}\n accountHref={accountHref === null ? undefined : (accountHref ?? `${basePath}/account`)}\n helpHref={helpHref === null ? undefined : (helpHref ?? `${basePath}/help`)}\n />\n <div className=\"rz-body\">\n {showNav && <Sidebar items={nav} pinned={pinnedNav} activeHref={activeHref} basePath={basePath} />}\n <main className=\"rz-main\">\n <div className=\"rz-content\">{children}</div>\n </main>\n </div>\n </div>\n );\n}\n","/**\n * The one source of button styling (the tracker's rule: hand-rolled buttons\n * drift). Classes only — everything resolves to tokens in SHELL_CSS.\n */\n\nimport type { AnchorHTMLAttributes, ButtonHTMLAttributes } from \"react\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\nexport type ButtonSize = \"sm\" | \"md\";\n\nexport function buttonClass(variant: ButtonVariant = \"secondary\", size: ButtonSize = \"md\", extra?: string): string {\n return [\"rz-btn\", `rz-btn--${variant}`, `rz-btn--${size}`, extra].filter(Boolean).join(\" \");\n}\n\n/** Kept for parity with the tracker's API; returns the class string to spread onto an <a>. */\nexport function buttonStyle(variant: ButtonVariant = \"secondary\", size: ButtonSize = \"md\") {\n return { className: buttonClass(variant, size) };\n}\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nexport function Button({ variant = \"secondary\", size = \"md\", className, type = \"button\", ...rest }: ButtonProps) {\n return <button type={type} className={buttonClass(variant, size, className)} {...rest} />;\n}\n\ninterface LinkButtonProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Opens elsewhere (GitHub, the live site): new tab + the outbound arrow that lifts on hover, like realiiz.com. */\n external?: boolean;\n /** Leads onward inside the app (next step): a right arrow that slides on hover, like realiiz.com's CTAs. */\n forward?: boolean;\n}\n\nexport function LinkButton({ variant = \"secondary\", size = \"md\", className, external, forward, children, ...rest }: LinkButtonProps) {\n const extra = external ? { target: \"_blank\", rel: \"noreferrer\", ...rest } : rest;\n return (\n <a className={buttonClass(variant, size, className)} {...extra}>\n {children}\n {external && <OutboundArrow />}\n {forward && !external && <ForwardArrow />}\n </a>\n );\n}\n\nexport function ForwardArrow() {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"rz-arrow rz-arrow--fwd\">\n <path d=\"M5 12h14\" /><path d=\"m13 6 6 6-6 6\" />\n </svg>\n );\n}\n\n/** Drawn, not the ↗ glyph — the glyph sits high in its box and never centers. */\nexport function OutboundArrow() {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"rz-arrow\">\n <path d=\"M7 17 17 7\" /><path d=\"M7 7h10v10\" />\n </svg>\n );\n}\n","/** Card, PageHeader, StatusPill, EmptyState, Steps — the page-level vocabulary. */\n\nimport type { ReactNode } from \"react\";\n\nexport function Card({ title, meta, note, children, actions, className }: {\n title?: ReactNode; meta?: ReactNode;\n /** A short status line under the meta — a pill, a count — kept out of `meta` so long text never pushes the actions around. */\n note?: ReactNode;\n children?: ReactNode; actions?: ReactNode; className?: string;\n}) {\n return (\n <div className={[\"rz-card\", className].filter(Boolean).join(\" \")}>\n {title && <div className=\"rz-card__title\">{title}</div>}\n {meta && <div className=\"rz-card__meta\">{meta}</div>}\n {note && <div className=\"rz-card__note\">{note}</div>}\n {children}\n {actions && <div className=\"rz-card__actions\">{actions}</div>}\n </div>\n );\n}\n\nexport function PageHeader({ eyebrow, title, subtitle, actions }: {\n eyebrow?: ReactNode; title: ReactNode; subtitle?: ReactNode; actions?: ReactNode;\n}) {\n return (\n <div className=\"rz-pagehead\">\n <div>\n {eyebrow && <div className=\"rz-pagehead__eyebrow\">{eyebrow}</div>}\n <h1>{title}</h1>\n {subtitle && <div className=\"rz-pagehead__sub\">{subtitle}</div>}\n </div>\n {actions && <div className=\"rz-card__actions\" style={{ marginTop: 0 }}>{actions}</div>}\n </div>\n );\n}\n\nexport type PillTone = \"up\" | \"warn\" | \"down\" | \"neutral\" | \"plain\";\n\nexport function StatusPill({ tone = \"neutral\", children, title }: { tone?: PillTone; children: ReactNode; title?: string }) {\n return <span className={`rz-pill rz-pill--${tone}`} title={title}>{children}</span>;\n}\n\nexport function EmptyState({ title, children, action }: { title: ReactNode; children?: ReactNode; action?: ReactNode }) {\n return (\n <div className=\"rz-empty\">\n <h3>{title}</h3>\n {children && <div>{children}</div>}\n {action && <div style={{ marginTop: 14 }}>{action}</div>}\n </div>\n );\n}\n\nexport type StepState = \"done\" | \"active\" | \"todo\" | \"failed\";\n\n/**\n * A short horizontal progress tracker: Saved → Checking → Live. One state per\n * step; the active one gets the pulse. Small enough to sit at the top of a card.\n */\nexport function Steps({ steps }: { steps: { label: ReactNode; state: StepState; note?: ReactNode }[] }) {\n return (\n <ol className=\"rz-steps\" aria-label=\"Progress\">\n {steps.map((st, i) => (\n <li key={i} className={`rz-step rz-step--${st.state}`} aria-current={st.state === \"active\" ? \"step\" : undefined}>\n <span className=\"rz-step__dot\" aria-hidden=\"true\">{st.state === \"done\" ? \"✓\" : st.state === \"failed\" ? \"!\" : i + 1}</span>\n <span className=\"rz-step__text\">\n <span className=\"rz-step__label\">{st.label}</span>\n {st.note && <span className=\"rz-step__note\">{st.note}</span>}\n </span>\n </li>\n ))}\n </ol>\n );\n}\n","/**\n * Tabs — which SECTION of this page am I on (Account: My Profile · Change\n * Password · Team · Business). Underlined strip, same as the visibility\n * tracker's: five two-word labels stay on one line where pills would wrap.\n * Not for choosing a value or filtering — that is a segmented control.\n * Keyboard: Left/Right (and Home/End) move between tabs.\n */\n\nimport { useRef, type KeyboardEvent } from \"react\";\n\nexport interface TabOption {\n value: string;\n label: string;\n /** A small marker after the label — a count, an unsaved dot. Keep it short. */\n suffix?: string;\n}\n\nexport function Tabs({ options, value, onChange, label = \"Sections\" }: {\n options: TabOption[];\n value: string;\n onChange: (value: string) => void;\n label?: string;\n}) {\n const list = useRef<HTMLDivElement>(null);\n\n const onKey = (e: KeyboardEvent<HTMLDivElement>) => {\n const i = options.findIndex((o) => o.value === value);\n if (i < 0) return;\n let next = i;\n if (e.key === \"ArrowRight\") next = (i + 1) % options.length;\n else if (e.key === \"ArrowLeft\") next = (i - 1 + options.length) % options.length;\n else if (e.key === \"Home\") next = 0;\n else if (e.key === \"End\") next = options.length - 1;\n else return;\n e.preventDefault();\n onChange(options[next].value);\n (list.current?.children[next] as HTMLElement | undefined)?.focus();\n };\n\n return (\n <div ref={list} className=\"rz-tabs\" role=\"tablist\" aria-label={label} onKeyDown={onKey}>\n {options.map((o) => {\n const active = o.value === value;\n return (\n <button\n key={o.value}\n type=\"button\"\n role=\"tab\"\n className=\"rz-tabs__tab\"\n aria-selected={active}\n tabIndex={active ? 0 : -1}\n onClick={() => onChange(o.value)}\n >\n {o.label}\n {o.suffix && <span className=\"rz-muted\"> {o.suffix}</span>}\n </button>\n );\n })}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/shell/icons.tsx","../../src/shell/Sidebar.tsx","../../src/shell/Button.tsx","../../src/shell/ThemeToggle.tsx","../../src/shell/AccountMenu.tsx","../../src/shell/TopBar.tsx","../../src/shell/tokens.ts","../../src/shell/AdminShell.tsx","../../src/shell/primitives.tsx","../../src/shell/Tabs.tsx"],"names":["jsxs","jsx","useState","useEffect","useRef"],"mappings":";;;;;;AAMA,IAAM,IAAA,GAAgC;AAAA,EACpC,KAAA,EAAO,EAAA;AAAA,EAAI,MAAA,EAAQ,EAAA;AAAA,EAAI,OAAA,EAAS,WAAA;AAAA,EAAa,IAAA,EAAM,MAAA;AAAA,EAAQ,MAAA,EAAQ,cAAA;AAAA,EACnE,WAAA,EAAa,GAAA;AAAA,EAAK,aAAA,EAAe,OAAA;AAAA,EAAS,cAAA,EAAgB,OAAA;AAAA,EAAS,aAAA,EAAe,IAAA;AAAA,EAClF,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA;AACvB,CAAA;AAEO,SAAS,IAAA,CAAK,EAAE,IAAA,EAAK,EAAuB;AACjD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AACH,MAAA,uBAAOA,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,OAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI;AAAA,OAAA,EAAE,CAAA;AAAA,IAC5N,KAAK,OAAA;AACH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,kBAAA,EAAmB,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB;AAAA,OAAA,EAAE,CAAA;AAAA,IAC5G,KAAK,QAAA;AACH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uBAAA,EAAwB;AAAA,OAAA,EAAE,CAAA;AAAA,IAC5G,KAAK,KAAA;AACH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,OAAM,GAAA,EAAI,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iBAAA,EAAkB;AAAA,OAAA,EAAE,CAAA;AAAA,IACtI,KAAK,QAAA;AACH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,yDAAA,EAA0D,CAAA;AAAA,uCAAG,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,KAAA,EAAM,GAAE,KAAA,EAAM;AAAA,OAAA,EAAE,CAAA;AAAA,IAC/H,KAAK,OAAA;AACH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,YAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,GAAE,KAAA,EAAM,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4BAAA,EAA6B,CAAA;AAAA,uCAAG,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,GAAE,KAAA,EAAM,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B;AAAA,OAAA,EAAE,CAAA;AAAA,IACrK,KAAK,UAAA;AAEH,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,QAAA,EAAS,CAAA;AAAA,uCAAG,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,uCAAG,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW;AAAA,OAAA,EAAE,CAAA;AAAA,IACvK;AACE,MAAA,uBAAOD,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,kBAAA,EAAmB,CAAA;AAAA,wBAAEA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY;AAAA,OAAA,EAAE,CAAA;AAAA;AAE/E;AAEO,SAAS,QAAQ,EAAA,EAAsB;AAC5C,EAAA,MAAM,KAAA,GAAoB,CAAC,MAAA,EAAQ,OAAA,EAAS,UAAU,KAAA,EAAO,QAAA,EAAU,SAAS,UAAU,CAAA;AAC1F,EAAA,OAAQ,KAAA,CAAmB,QAAA,CAAS,EAAE,CAAA,GAAK,EAAA,GAAkB,KAAA;AAC/D;AClBO,IAAM,WAAA,GAAc,kBAAA;AAEpB,SAAS,QAAA,CAAS,IAAA,EAAe,UAAA,EAAoB,QAAA,EAA2B;AACrF,EAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU,OAAO,eAAe,QAAA,IAAY,UAAA,KAAe,GAAG,QAAQ,CAAA,CAAA,CAAA;AACxF,EAAA,OAAO,UAAA,KAAe,KAAK,IAAA,IAAQ,UAAA,CAAW,WAAW,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAC1E;AAEO,SAAS,OAAA,CAAQ,EAAE,KAAA,EAAO,MAAA,GAAS,EAAC,EAAG,UAAA,EAAY,UAAS,EAAmF;AACpJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEhD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA,KAAM,WAAA,eAA0B,IAAI,CAAA;AAAA,IACjF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,OAAO,CAAC,SAAA;AACd,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,WAAA,EAAa,IAAA,GAAO,cAAc,MAAM,CAAA;AAAA,IACtE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAkB;AACpC,IAAA,MAAM,SAAS,CAAC,IAAA,CAAK,YAAY,QAAA,CAAS,IAAA,EAAM,YAAY,QAAQ,CAAA;AACpE,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,uBACEH,eAAAA,CAAC,MAAA,EAAA,EAAmB,SAAA,EAAU,6CAAA,EAA8C,eAAA,EAAc,MAAA,EAAO,KAAA,EAAO,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,KAAK,wBAAmB,aAAA,EAClJ,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAAC,QAAK,IAAA,EAAM,OAAA,CAAQ,KAAK,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA;AAAA,wBAC3CA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,eAAK,KAAA,EAAM;AAAA,OAAA,EAAA,EAFvC,KAAK,EAGhB,CAAA;AAAA,IAEJ;AACA,IAAA,uBACED,eAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QAEC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAA,EAAW,CAAC,kBAAA,EAAoB,MAAA,IAAU,0BAA0B,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,QAC9F,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,QAChC,KAAA,EAAO,SAAA,GAAY,IAAA,CAAK,KAAA,GAAQ,MAAA;AAAA,QAEhC,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAAC,QAAK,IAAA,EAAM,OAAA,CAAQ,KAAK,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA;AAAA,0BAC3CA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,eAAK,KAAA,EAAM;AAAA;AAAA,OAAA;AAAA,MAP3C,IAAA,CAAK;AAAA,KAQZ;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACED,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,CAAC,cAAc,SAAA,IAAa,uBAAuB,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAG,cAAW,kBAAA,EAC3G,QAAA,EAAA;AAAA,oBAAAC,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAmB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,EAAE,CAAA;AAAA,IAEvD,MAAA,CAAO,MAAA,GAAS,CAAA,oBAAKA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,YAAA,EAAW,UAAA,EAAY,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA,EAAE,CAAA;AAAA,oBACxGD,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,sBAAA;AAAA,QACV,OAAA,EAAS,MAAA;AAAA,QACT,YAAA,EAAY,YAAY,mBAAA,GAAsB,qBAAA;AAAA,QAC9C,KAAA,EAAO,YAAY,QAAA,GAAW,UAAA;AAAA,QAE9B,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,OAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,aAAA,EAAY,MAAA,EAAO,KAAA,EAAO,EAAE,WAAW,SAAA,GAAY,gBAAA,GAAmB,MAAA,EAAU,EAC/N,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kBAAiB,CAAA,EAC3B,CAAA;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAoB,QAAA,EAAA,UAAA,EAAQ;AAAA;AAAA;AAAA;AAC9C,GAAA,EACF,CAAA;AAEJ;AChFO,SAAS,WAAA,CAAY,OAAA,GAAyB,WAAA,EAAa,IAAA,GAAmB,MAAM,KAAA,EAAwB;AACjH,EAAA,OAAO,CAAC,QAAA,EAAU,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAC5F;AAGO,SAAS,WAAA,CAAY,OAAA,GAAyB,WAAA,EAAa,IAAA,GAAmB,IAAA,EAAM;AACzF,EAAA,OAAO,EAAE,SAAA,EAAW,WAAA,CAAY,OAAA,EAAS,IAAI,CAAA,EAAE;AACjD;AAOO,SAAS,MAAA,CAAO,EAAE,OAAA,GAAU,WAAA,EAAa,IAAA,GAAO,IAAA,EAAM,SAAA,EAAW,IAAA,GAAO,QAAA,EAAU,GAAG,IAAA,EAAK,EAAgB;AAC/G,EAAA,uBAAOA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAY,SAAA,EAAW,WAAA,CAAY,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA,EAAI,GAAG,IAAA,EAAM,CAAA;AACzF;AAWO,SAAS,UAAA,CAAW,EAAE,OAAA,GAAU,WAAA,EAAa,IAAA,GAAO,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,GAAG,IAAA,EAAK,EAAoB;AACnI,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,MAAA,EAAQ,UAAU,GAAA,EAAK,YAAA,EAAc,GAAG,IAAA,EAAK,GAAI,IAAA;AAC5E,EAAA,uBACED,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,WAAA,CAAY,SAAS,IAAA,EAAM,SAAS,CAAA,EAAI,GAAG,KAAA,EACtD,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,QAAA,oBAAYC,cAAAA,CAAC,aAAA,EAAA,EAAc,CAAA;AAAA,IAC3B,OAAA,IAAW,CAAC,QAAA,oBAAYA,eAAC,YAAA,EAAA,EAAa;AAAA,GAAA,EACzC,CAAA;AAEJ;AAEO,SAAS,YAAA,GAAe;AAC7B,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,eAAY,MAAA,EAAO,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,WAAU,wBAAA,EACnJ,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,oBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB;AAAA,GAAA,EAC/C,CAAA;AAEJ;AAGO,SAAS,aAAA,GAAgB;AAC9B,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,eAAY,MAAA,EAAO,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,WAAU,UAAA,EACnJ,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,CAAA;AAAA,oBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa;AAAA,GAAA,EAC9C,CAAA;AAEJ;ACnDO,IAAM,SAAA,GAAY,gBAAA;AAElB,SAAS,QAAA,CAAS,eAAsB,OAAA,EAAsC;AACnF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,eAAgB,YAAY,CAAA;AAEtD,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AACpD,MAAA,IAAI,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,MAAA,WAAiB,MAAM,CAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAa;AACxB,IAAA,QAAA,CAAS,CAAC,CAAA;AACV,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA;AAAA,IAC1C,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AACA,EAAA,OAAO,CAAC,OAAO,GAAG,CAAA;AACpB;AAEO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,QAAA,EAAS,EAAmD;AAC/F,EAAA,uBACEH,gBAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAS,IAAA,EAAK,OAAA,EAAQ,cAAW,OAAA,EAC/C,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,cAAA,EAAc,KAAA,KAAU,OAAA,EAAS,OAAA,EAAS,MAAM,QAAA,CAAS,OAAO,CAAA,EAAG,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,oBAC9FA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,cAAA,EAAc,KAAA,KAAU,MAAA,EAAQ,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,GAAG,QAAA,EAAA,MAAA,EAAI;AAAA,GAAA,EAC7F,CAAA;AAEJ;AC3BO,SAAS,YAAY,IAAA,EAAyB;AACnD,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,EAAM,IAAA,GAAO,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA;AACjD,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAC1C,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAAE,aAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA;AAClE;AAEO,SAAS,WAAW,IAAA,EAAyB;AAClD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAM,IAAA,EAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,IAAK,EAAC;AACjE,EAAA,IAAI,MAAM,MAAA,IAAU,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,CAAE,CAAC,GAAG,WAAA,EAAY;AACrF,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AAChE,EAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,KAAK,WAAA,EAAY;AAC5C;AAEA,IAAM,MAAM,EAAE,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,EAAI,SAAS,WAAA,EAAa,IAAA,EAAM,QAAQ,MAAA,EAAQ,cAAA,EAAgB,aAAa,CAAA,EAAG,aAAA,EAAe,SAAkB,cAAA,EAAgB,OAAA,EAAkB,eAAe,IAAA,EAAK;AACxM,IAAM,UAAA,GAAa,sBAAMA,cAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,GAAA,EAAK,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kDAAA,EAAmD,CAAA,EAAE,CAAA;AACpG,IAAM,UAAU,sBAAMD,eAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,GAAA,EAAK,QAAA,EAAA;AAAA,kBAAAC,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,kBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oGAAA,EAAqG;AAAA,CAAA,EAAE,CAAA;AACnL,IAAM,WAAW,sBAAMD,eAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,GAAA,EAAK,QAAA,EAAA;AAAA,kBAAAC,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI,CAAA;AAAA,kBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB;AAAA,CAAA,EAAE,CAAA;AAErG,IAAM,WAAW,sBAAMD,eAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,GAAA,EAAK,QAAA,EAAA;AAAA,kBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0CAAA,EAA2C,CAAA;AAAA,kBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4CAAA,EAA6C;AAAA,CAAA,EAAE,CAAA;AACjJ,IAAM,YAAY,sBAAMD,eAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,GAAA,EAAK,QAAA,EAAA;AAAA,kBAAAC,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,kBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sDAAA,EAAuD;AAAA,CAAA,EAAE,CAAA;AACvI,IAAM,UAAU,sBAAMD,eAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,GAAA,EAAK,QAAA,EAAA;AAAA,kBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yCAAA,EAA0C,CAAA;AAAA,kBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB,CAAA;AAAA,kBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW;AAAA,CAAA,EAAE,CAAA;AAEjI,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,SAAS,WAAA,EAAa,WAAA,EAAa,QAAA,EAAU,OAAA,EAAQ,EAYnG;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAOE,aAAuB,IAAI,CAAA;AAExC,EAAAD,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS,QAAA,CAAS,EAAE,MAAc,CAAA,UAAW,KAAK,CAAA;AAAA,IAC9D,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IACvC,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,OAAO,CAAA;AAC9C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,OAAO,CAAA;AACjD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBACEH,gBAAC,KAAA,EAAA,EAAI,GAAA,EAAK,MAAM,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAW,EAC5C,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,WAAA,EAAY,eAAA,EAAc,MAAA,EAAO,eAAA,EAAe,MAAM,YAAA,EAAW,cAAA,EAAe,OAAA,EAAS,MAAM,QAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,GAC7I,QAAA,EAAA,IAAA,CAAK,SAAA,mBAAYA,cAAAA,CAAC,SAAI,GAAA,EAAK,IAAA,CAAK,SAAA,EAAW,GAAA,EAAI,IAAG,SAAA,EAAU,gBAAA,EAAiB,CAAA,GAAK,UAAA,CAAW,IAAI,CAAA,EACpG,CAAA;AAAA,IAEC,wBACCD,eAAAA,CAAC,SAAI,SAAA,EAAU,SAAA,EAAU,MAAK,MAAA,EAC5B,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EAAiB,eAAK,IAAA,EAAM,IAAA,EAAK,IAAK,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,QAC/D,IAAA,CAAK,IAAA,EAAM,IAAA,EAAK,oBAAKA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM;AAAA,OAAA,EACpE,CAAA;AAAA,sBACAD,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAsC,IAAA,EAAK,UAAA,EAAW,iBAAc,MAAA,EACjF,QAAA,EAAA;AAAA,wBAAAC,eAAC,UAAA,EAAA,EAAW,CAAA;AAAA,wBACZA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACVA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAuC,QAAA,EAAA,IAAA,EAAK;AAAA,OAAA,EAC9D,CAAA;AAAA,sBACAD,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAsC,IAAA,EAAK,UAAA,EAAW,iBAAc,MAAA,EACjF,QAAA,EAAA;AAAA,wBAAAC,eAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,wBACTA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,wBACXA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,QAAA,kBAAAA,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAc,QAAA,EAAU,OAAA,EAAS,CAAA,EAAE;AAAA,OAAA,EACjF,CAAA;AAAA,MAAA,CACE,WAAW,WAAA,IAAe,QAAA,qBAAaA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EAAe,CAAA;AAAA,MACtE,OAAA,oBACCD,eAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,YAAA,EAAa,IAAA,EAAK,UAAA,EAAW,WAAU,eAAA,EAC3E,QAAA,EAAA;AAAA,wBAAAC,eAAC,SAAA,EAAA,EAAU,CAAA;AAAA,QAAE,cAAA;AAAA,wBAEbA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAe,QAAA,kBAAAA,cAAAA,CAAC,iBAAc,CAAA,EAAE;AAAA,OAAA,EAClD,CAAA;AAAA,MAED,WAAA,oBACCD,eAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,WAAA,EAAa,IAAA,EAAK,UAAA,EAAW,SAAA,EAAU,eAAA,EAC9C,QAAA,EAAA;AAAA,wBAAAC,eAAC,QAAA,EAAA,EAAS,CAAA;AAAA,QAAE;AAAA,OAAA,EAEd,CAAA;AAAA,MAED,QAAA,oBACCD,eAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,QAAA,EAAU,IAAA,EAAK,UAAA,EAAW,SAAA,EAAU,eAAA,EAC3C,QAAA,EAAA;AAAA,wBAAAC,eAAC,QAAA,EAAA,EAAS,CAAA;AAAA,QAAE;AAAA,OAAA,EAEd,CAAA;AAAA,sBAEFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,sBAC9BA,cAAAA,CAAC,MAAA,EAAA,EAAK,MAAA,EAAO,MAAA,EAAO,QAAQ,WAAA,EAAa,SAAA,EAAU,kBAAA,EACjD,QAAA,kBAAAD,gBAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,IAAA,EAAK,UAAA,EAAW,WAAU,eAAA,EAC9C,QAAA,EAAA;AAAA,wBAAAC,eAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,QAAE;AAAA,OAAA,EAEb,CAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACvHO,SAAS,MAAA,CAAO,EAAE,QAAA,EAAU,WAAA,EAAa,SAAS,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,WAAA,EAAa,UAAS,EAcxI;AACD,EAAA,uBACED,eAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,WAAA,EAChB,QAAA,EAAA;AAAA,oBAAAA,eAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,MAAM,OAAA,IAAW,QAAA;AAAA,QACjB,SAAA,EAAU,kBAAA;AAAA,QACT,GAAI,OAAA,GAAU,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAK,YAAA,EAAc,KAAA,EAAO,oCAAA,EAAqC,GAAI,EAAC;AAAA,QAGtG,QAAA,EAAA;AAAA,UAAA,OAAA,oBAAWC,eAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAS,GAAA,EAAI,EAAA,EAAG,WAAU,iBAAA,EAAkB,CAAA;AAAA,0BAClEA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,0BAChBA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAsB,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,UACjD,OAAA,oBAAWA,cAAAA,CAAC,aAAA,EAAA,EAAc;AAAA;AAAA;AAAA,KAC7B;AAAA,IACC,QAAQ,IAAA,oBACPD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,eAAY,aAAA,EAAc,QAAA,EAAA;AAAA,QAAA,gBAAA;AAAA,QAAe,YAAY,IAAI;AAAA,OAAA,EAAE,CAAA;AAAA,sBACjGC,cAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAY,IAAA,EAAY,OAAc,OAAA,EAAkB,WAAA,EAA0B,WAAA,EAA0B,QAAA,EAAoB,OAAA,EAAkB;AAAA,KAAA,EACjK;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;AC3BO,IAAM,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACgClB,SAAS,UAAA,CAAW;AAAA,EACzB,QAAA;AAAA,EAAU,WAAA,GAAc,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,GAAA;AAAA,EAAK,SAAA;AAAA,EAAW,UAAA;AAAA,EACvE,QAAA,GAAW,QAAA;AAAA,EAAU,WAAA;AAAA,EAAa,WAAA;AAAA,EAAa,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,YAAA,GAAe,OAAA;AAAA,EAAS;AACtG,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,YAAY,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,IAAQ,IAAI,CAAA;AACpC,EAAA,MAAM,SAAA,GAAY,QAAA,EAAU,IAAA,EAAM,IAAA,EAAK,IAAK,QAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,UAAU,OAAA,IAAW,OAAA;AAEvC,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAW,cAAY,KAAA,EACpC,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,WAAO,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,oBAClBA,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,SAAA;AAAA,QACV,WAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,OAAA;AAAA,QACA,QAAA,EAAU,QAAA;AAAA,QACV,IAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,OAAA,EAAS,QAAA;AAAA,QACT,WAAA,EAAa,WAAA,IAAe,CAAA,EAAG,QAAQ,CAAA,aAAA,CAAA;AAAA,QACvC,aAAa,WAAA,KAAgB,IAAA,GAAO,MAAA,GAAa,WAAA,IAAe,GAAG,QAAQ,CAAA,QAAA,CAAA;AAAA,QAC3E,UAAU,QAAA,KAAa,IAAA,GAAO,MAAA,GAAa,QAAA,IAAY,GAAG,QAAQ,CAAA,KAAA;AAAA;AAAA,KACpE;AAAA,oBACAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA,oBAAWC,eAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,KAAK,MAAA,EAAQ,SAAA,EAAW,YAAwB,QAAA,EAAoB,CAAA;AAAA,sBAChGA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EACd,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAc,QAAA,EAAS,CAAA,EACxC;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC7EO,SAAS,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,MAAM,QAAA,EAAU,OAAA,EAAS,WAAU,EAKpE;AACD,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAC,SAAA,EAAW,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAC5D,QAAA,EAAA;AAAA,IAAA,KAAA,oBAASC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAkB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAChD,wBAAQA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAiB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,IAC7C,wBAAQA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAiB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,IAC7C,QAAA;AAAA,IACA,2BAAWA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAoB,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EACzD,CAAA;AAEJ;AAEO,SAAS,WAAW,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,SAAQ,EAE5D;AACD,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,gBAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,OAAA,oBAAWC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAwB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBAC3DA,cAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACV,4BAAYA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAoB,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EAC3D,CAAA;AAAA,IACC,OAAA,oBAAWA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAE,EAAI,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EAClF,CAAA;AAEJ;AAIO,SAAS,WAAW,EAAE,IAAA,GAAO,SAAA,EAAW,QAAA,EAAU,OAAM,EAA6D;AAC1H,EAAA,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAW,oBAAoB,IAAI,CAAA,CAAA,EAAI,OAAe,QAAA,EAAS,CAAA;AAC9E;AAEO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,QAAA,EAAU,QAAO,EAAmE;AACtH,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,QAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACV,QAAA,oBAAYA,cAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAS,CAAA;AAAA,IAC3B,MAAA,oBAAUA,cAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,SAAA,EAAW,EAAA,EAAG,EAAI,QAAA,EAAA,MAAA,EAAO;AAAA,GAAA,EACpD,CAAA;AAEJ;AAQO,SAAS,KAAA,CAAM,EAAE,KAAA,EAAM,EAA0E;AACtG,EAAA,uBACEA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,cAAW,UAAA,EACjC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,qBACdD,eAAAA,CAAC,IAAA,EAAA,EAAW,SAAA,EAAW,CAAA,iBAAA,EAAoB,EAAA,CAAG,KAAK,CAAA,CAAA,EAAI,cAAA,EAAc,EAAA,CAAG,KAAA,KAAU,QAAA,GAAW,MAAA,GAAS,MAAA,EACpG,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,eAAY,MAAA,EAAQ,QAAA,EAAA,EAAA,CAAG,KAAA,KAAU,MAAA,GAAS,WAAM,EAAA,CAAG,KAAA,KAAU,QAAA,GAAW,GAAA,GAAM,IAAI,CAAA,EAAE,CAAA;AAAA,oBACnHD,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EACd,QAAA,EAAA;AAAA,sBAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,aAAG,KAAA,EAAM,CAAA;AAAA,MAC1C,EAAA,CAAG,wBAAQA,cAAAA,CAAC,UAAK,SAAA,EAAU,eAAA,EAAiB,aAAG,IAAA,EAAK;AAAA,KAAA,EACvD;AAAA,GAAA,EAAA,EALO,CAMT,CACD,CAAA,EACH,CAAA;AAEJ;ACvDO,SAAS,KAAK,EAAE,OAAA,EAAS,OAAO,QAAA,EAAU,KAAA,GAAQ,YAAW,EAKjE;AACD,EAAA,MAAM,IAAA,GAAOG,aAAuB,IAAI,CAAA;AAExC,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqC;AAClD,IAAA,MAAM,IAAI,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACpD,IAAA,IAAI,IAAI,CAAA,EAAG;AACX,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,EAAE,GAAA,KAAQ,YAAA,EAAc,IAAA,GAAA,CAAQ,CAAA,GAAI,KAAK,OAAA,CAAQ,MAAA;AAAA,SAAA,IAC5C,CAAA,CAAE,QAAQ,WAAA,EAAa,IAAA,GAAA,CAAQ,IAAI,CAAA,GAAI,OAAA,CAAQ,UAAU,OAAA,CAAQ,MAAA;AAAA,SAAA,IACjE,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAQ,IAAA,GAAO,CAAA;AAAA,SAAA,IACzB,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO,IAAA,GAAO,QAAQ,MAAA,GAAS,CAAA;AAAA,SAC7C;AACL,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAK,CAAA;AAC5B,IAAC,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,IAAI,GAA+B,KAAA,EAAM;AAAA,EACnE,CAAA;AAEA,EAAA,uBACEH,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,WAAU,SAAA,EAAU,IAAA,EAAK,SAAA,EAAU,YAAA,EAAY,OAAO,SAAA,EAAW,KAAA,EAC9E,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AAClB,IAAA,MAAM,MAAA,GAAS,EAAE,KAAA,KAAU,KAAA;AAC3B,IAAA,uBACED,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAU,cAAA;AAAA,QACV,eAAA,EAAe,MAAA;AAAA,QACf,QAAA,EAAU,SAAS,CAAA,GAAI,EAAA;AAAA,QACvB,OAAA,EAAS,MAAM,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAA,QAE9B,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,KAAA;AAAA,UACF,EAAE,MAAA,oBAAUA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EAAW,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAAE,CAAA,CAAE;AAAA,WAAA,EAAO;AAAA;AAAA,OAAA;AAAA,MAT9C,CAAA,CAAE;AAAA,KAUT;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ","file":"index.cjs","sourcesContent":["/** Eight stroke icons, 18px, currentColor. Registry ids pick one; unknown ids get `doc`. */\n\nimport type { SVGProps } from \"react\";\n\nexport type IconName = \"home\" | \"posts\" | \"events\" | \"mic\" | \"venues\" | \"users\" | \"settings\" | \"doc\";\n\nconst base: SVGProps<SVGSVGElement> = {\n width: 18, height: 18, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\",\n strokeWidth: 1.7, strokeLinecap: \"round\", strokeLinejoin: \"round\", \"aria-hidden\": true,\n style: { flexShrink: 0 },\n};\n\nexport function Icon({ name }: { name: IconName }) {\n switch (name) {\n case \"home\":\n return <svg {...base}><rect x=\"3\" y=\"3\" width=\"7\" height=\"9\" rx=\"1\" /><rect x=\"14\" y=\"3\" width=\"7\" height=\"5\" rx=\"1\" /><rect x=\"14\" y=\"12\" width=\"7\" height=\"9\" rx=\"1\" /><rect x=\"3\" y=\"16\" width=\"7\" height=\"5\" rx=\"1\" /></svg>;\n case \"posts\":\n return <svg {...base}><path d=\"M6 3h9l4 4v14H6z\" /><path d=\"M15 3v4h4\" /><path d=\"M9 12h7M9 16h7M9 8h3\" /></svg>;\n case \"events\":\n return <svg {...base}><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M8 3v4M16 3v4M3 10h18\" /></svg>;\n case \"mic\":\n return <svg {...base}><rect x=\"9\" y=\"3\" width=\"6\" height=\"11\" rx=\"3\" /><path d=\"M5 11a7 7 0 0 0 14 0\" /><path d=\"M12 18v3M9 21h6\" /></svg>;\n case \"venues\":\n return <svg {...base}><path d=\"M12 21s7-6.2 7-11.5A7 7 0 0 0 5 9.5C5 14.8 12 21 12 21z\" /><circle cx=\"12\" cy=\"9.5\" r=\"2.5\" /></svg>;\n case \"users\":\n return <svg {...base}><circle cx=\"9\" cy=\"8\" r=\"3.5\" /><path d=\"M2.5 20a6.5 6.5 0 0 1 13 0\" /><circle cx=\"17\" cy=\"9\" r=\"2.5\" /><path d=\"M15.5 14.5a5 5 0 0 1 6 5\" /></svg>;\n case \"settings\":\n // Two sliders — the same mark the visibility tracker uses, so Studio and the tracker read as one family.\n return <svg {...base}><path d=\"M4 7h9\" /><circle cx=\"16\" cy=\"7\" r=\"2\" /><path d=\"M19 7h1\" /><path d=\"M4 17h9\" /><circle cx=\"16\" cy=\"17\" r=\"2\" /><path d=\"M19 17h1\" /></svg>;\n default:\n return <svg {...base}><path d=\"M6 3h9l4 4v14H6z\" /><path d=\"M15 3v4h4\" /></svg>;\n }\n}\n\nexport function iconFor(id: string): IconName {\n const known: IconName[] = [\"home\", \"posts\", \"events\", \"mic\", \"venues\", \"users\", \"settings\"];\n return (known as string[]).includes(id) ? (id as IconName) : \"doc\";\n}\n","/**\n * Sidebar — items from the content-type registry (via navFromContentTypes),\n * active by href prefix, collapsible with the state remembered per browser.\n * Plain anchors: the package does not know which router the host uses.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { Icon, iconFor } from \"./icons\";\n\nexport interface NavItem {\n id: string;\n label: string;\n href: string;\n /** Icon id; unknown ids fall back to a document icon. Defaults to `id`. */\n icon?: string;\n /** Shown greyed out and not navigable — a section that is coming but not built yet. */\n disabled?: boolean;\n}\n\nexport const SIDEBAR_KEY = \"rz-admin-sidebar\";\n\nexport function isActive(item: NavItem, activeHref: string, basePath: string): boolean {\n if (item.href === basePath) return activeHref === basePath || activeHref === `${basePath}/`;\n return activeHref === item.href || activeHref.startsWith(`${item.href}/`);\n}\n\nexport function Sidebar({ items, pinned = [], activeHref, basePath }: { items: NavItem[]; pinned?: NavItem[]; activeHref: string; basePath: string }) {\n const [collapsed, setCollapsed] = useState(false);\n\n useEffect(() => {\n try {\n if (window.localStorage.getItem(SIDEBAR_KEY) === \"collapsed\") setCollapsed(true);\n } catch {\n /* storage unavailable */\n }\n }, []);\n\n const toggle = () => {\n const next = !collapsed;\n setCollapsed(next);\n try {\n window.localStorage.setItem(SIDEBAR_KEY, next ? \"collapsed\" : \"open\");\n } catch {\n /* ignore */\n }\n };\n\n const renderItem = (item: NavItem) => {\n const active = !item.disabled && isActive(item, activeHref, basePath);\n if (item.disabled) {\n return (\n <span key={item.id} className=\"rz-sidebar__item rz-sidebar__item--disabled\" aria-disabled=\"true\" title={collapsed ? `${item.label} — coming soon` : \"Coming soon\"}>\n <Icon name={iconFor(item.icon ?? item.id)} />\n <span className=\"rz-sidebar__label\">{item.label}</span>\n </span>\n );\n }\n return (\n <a\n key={item.id}\n href={item.href}\n className={[\"rz-sidebar__item\", active && \"rz-sidebar__item--active\"].filter(Boolean).join(\" \")}\n aria-current={active ? \"page\" : undefined}\n title={collapsed ? item.label : undefined}\n >\n <Icon name={iconFor(item.icon ?? item.id)} />\n <span className=\"rz-sidebar__label\">{item.label}</span>\n </a>\n );\n };\n\n return (\n <aside className={[\"rz-sidebar\", collapsed && \"rz-sidebar--collapsed\"].filter(Boolean).join(\" \")} aria-label=\"Admin navigation\">\n <nav className=\"rz-sidebar__nav\">{items.map(renderItem)}</nav>\n {/* Pinned above Collapse (Settings) so it stays in one place as sections are added, instead of drifting down the list. */}\n {pinned.length > 0 && <nav className=\"rz-sidebar__pinned\" aria-label=\"Settings\">{pinned.map(renderItem)}</nav>}\n <button\n type=\"button\"\n className=\"rz-sidebar__collapse\"\n onClick={toggle}\n aria-label={collapsed ? \"Expand navigation\" : \"Collapse navigation\"}\n title={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" style={{ transform: collapsed ? \"rotate(180deg)\" : undefined }}>\n <path d=\"M15 6l-6 6 6 6\" />\n </svg>\n <span className=\"rz-sidebar__label\">Collapse</span>\n </button>\n </aside>\n );\n}\n","/**\n * The one source of button styling (the tracker's rule: hand-rolled buttons\n * drift). Classes only — everything resolves to tokens in SHELL_CSS.\n */\n\nimport type { AnchorHTMLAttributes, ButtonHTMLAttributes } from \"react\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\nexport type ButtonSize = \"sm\" | \"md\";\n\nexport function buttonClass(variant: ButtonVariant = \"secondary\", size: ButtonSize = \"md\", extra?: string): string {\n return [\"rz-btn\", `rz-btn--${variant}`, `rz-btn--${size}`, extra].filter(Boolean).join(\" \");\n}\n\n/** Kept for parity with the tracker's API; returns the class string to spread onto an <a>. */\nexport function buttonStyle(variant: ButtonVariant = \"secondary\", size: ButtonSize = \"md\") {\n return { className: buttonClass(variant, size) };\n}\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nexport function Button({ variant = \"secondary\", size = \"md\", className, type = \"button\", ...rest }: ButtonProps) {\n return <button type={type} className={buttonClass(variant, size, className)} {...rest} />;\n}\n\ninterface LinkButtonProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Opens elsewhere (GitHub, the live site): new tab + the outbound arrow that lifts on hover, like realiiz.com. */\n external?: boolean;\n /** Leads onward inside the app (next step): a right arrow that slides on hover, like realiiz.com's CTAs. */\n forward?: boolean;\n}\n\nexport function LinkButton({ variant = \"secondary\", size = \"md\", className, external, forward, children, ...rest }: LinkButtonProps) {\n const extra = external ? { target: \"_blank\", rel: \"noreferrer\", ...rest } : rest;\n return (\n <a className={buttonClass(variant, size, className)} {...extra}>\n {children}\n {external && <OutboundArrow />}\n {forward && !external && <ForwardArrow />}\n </a>\n );\n}\n\nexport function ForwardArrow() {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"rz-arrow rz-arrow--fwd\">\n <path d=\"M5 12h14\" /><path d=\"m13 6 6 6-6 6\" />\n </svg>\n );\n}\n\n/** Drawn, not the ↗ glyph — the glyph sits high in its box and never centers. */\nexport function OutboundArrow() {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"rz-arrow\">\n <path d=\"M7 17 17 7\" /><path d=\"M7 7h10v10\" />\n </svg>\n );\n}\n","/**\n * Light / dark, remembered per browser. The attribute lives on the .rz-admin\n * root (not <html>) so the host site's own theme is never touched.\n *\n * No flash of the wrong theme: the server renders defaultTheme, and the effect\n * only flips when a stored value differs — a single client-side change, never\n * a mismatch between server HTML and first client render.\n */\n\nimport { useEffect, useState } from \"react\";\n\nexport type Theme = \"light\" | \"dark\";\nexport const THEME_KEY = \"rz-admin-theme\";\n\nexport function useTheme(defaultTheme: Theme = \"light\"): [Theme, (t: Theme) => void] {\n const [theme, setTheme] = useState<Theme>(defaultTheme);\n\n useEffect(() => {\n try {\n const stored = window.localStorage.getItem(THEME_KEY);\n if (stored === \"light\" || stored === \"dark\") setTheme(stored);\n } catch {\n /* storage unavailable */\n }\n }, []);\n\n const set = (t: Theme) => {\n setTheme(t);\n try {\n window.localStorage.setItem(THEME_KEY, t);\n } catch {\n /* ignore */\n }\n };\n return [theme, set];\n}\n\nexport function ThemeToggle({ theme, onChange }: { theme: Theme; onChange: (t: Theme) => void }) {\n return (\n <span className=\"rz-seg\" role=\"group\" aria-label=\"Theme\">\n <button type=\"button\" aria-pressed={theme === \"light\"} onClick={() => onChange(\"light\")}>Light</button>\n <button type=\"button\" aria-pressed={theme === \"dark\"} onClick={() => onChange(\"dark\")}>Dark</button>\n </span>\n );\n}\n","/**\n * Avatar button → menu, tracker-style: a header with who you are, then\n * full-width rows each led by a 14px icon. Sign out is a plain POST form so it\n * works before hydration.\n */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { OutboundArrow } from \"./Button\";\nimport { ThemeToggle, type Theme } from \"./ThemeToggle\";\n\nexport interface ShellUser {\n email: string;\n name?: string | null;\n /** Profile photo; initials show when absent. */\n avatarUrl?: string | null;\n}\n\nexport function firstNameOf(user: ShellUser): string {\n const fromName = user.name?.trim().split(/\\s+/)[0];\n if (fromName) return fromName;\n const local = user.email.split(\"@\")[0] ?? \"\";\n return local ? local.charAt(0).toUpperCase() + local.slice(1) : \"there\";\n}\n\nexport function initialsOf(user: ShellUser): string {\n const parts = user.name?.trim().split(/\\s+/).filter(Boolean) ?? [];\n if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (user.email[0] ?? \"?\").toUpperCase();\n}\n\nconst ico = { width: 14, height: 14, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\" as const, strokeLinejoin: \"round\" as const, \"aria-hidden\": true };\nconst ShieldIcon = () => <svg {...ico}><path d=\"M12 3l7 3v5c0 5-3.5 8.5-7 10-3.5-1.5-7-5-7-10V6z\" /></svg>;\nconst SunIcon = () => <svg {...ico}><circle cx=\"12\" cy=\"12\" r=\"4\" /><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" /></svg>;\nconst UserIcon = () => <svg {...ico}><circle cx=\"12\" cy=\"8\" r=\"4\" /><path d=\"M4 21a8 8 0 0 1 16 0\" /></svg>;\n// An open book — \"the guide\". Two clean strokes that stay legible at 14px.\nconst HelpIcon = () => <svg {...ico}><path d=\"M2 4h6a4 4 0 0 1 4 4v12a3 3 0 0 0-3-3H2z\" /><path d=\"M22 4h-6a4 4 0 0 0-4 4v12a3 3 0 0 1 3-3h7z\" /></svg>;\nconst GlobeIcon = () => <svg {...ico}><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18\" /></svg>;\nconst OutIcon = () => <svg {...ico}><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" /><path d=\"M16 17l5-5-5-5\" /><path d=\"M21 12H9\" /></svg>;\n\nexport function AccountMenu({ user, role, theme, onTheme, signOutPath, accountHref, helpHref, siteUrl }: {\n user: ShellUser;\n role: string;\n theme: Theme;\n onTheme: (t: Theme) => void;\n signOutPath: string;\n /** The Account page (My Profile · Change Password · Team · Business). Omit to hide the item. */\n accountHref?: string;\n /** The Help center. Omit to hide the item. */\n helpHref?: string;\n /** The live website — a \"View website\" item that opens in a new tab. Omit to hide it. */\n siteUrl?: string | null;\n}) {\n const [open, setOpen] = useState(false);\n const wrap = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => {\n if (!wrap.current?.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onClick);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n return (\n <div ref={wrap} style={{ position: \"relative\" }}>\n <button type=\"button\" className=\"rz-avatar\" aria-haspopup=\"menu\" aria-expanded={open} aria-label=\"Account menu\" onClick={() => setOpen((v) => !v)}>\n {user.avatarUrl ? <img src={user.avatarUrl} alt=\"\" className=\"rz-avatar__img\" /> : initialsOf(user)}\n </button>\n\n {open && (\n <div className=\"rz-menu\" role=\"menu\">\n <div className=\"rz-menu__who\">\n <div className=\"rz-menu__name\">{user.name?.trim() || user.email}</div>\n {user.name?.trim() && <div className=\"rz-menu__email\">{user.email}</div>}\n </div>\n <div className=\"rz-menu__item rz-menu__item--static\" role=\"menuitem\" aria-disabled=\"true\">\n <ShieldIcon />\n <span>Role</span>\n <span className=\"rz-menu__end rz-pill rz-pill--plain\">{role}</span>\n </div>\n <div className=\"rz-menu__item rz-menu__item--static\" role=\"menuitem\" aria-disabled=\"true\">\n <SunIcon />\n <span>Theme</span>\n <span className=\"rz-menu__end\"><ThemeToggle theme={theme} onChange={onTheme} /></span>\n </div>\n {(siteUrl || accountHref || helpHref) && <div className=\"rz-menu__sep\" />}\n {siteUrl && (\n <a href={siteUrl} target=\"_blank\" rel=\"noreferrer\" role=\"menuitem\" className=\"rz-menu__item\">\n <GlobeIcon />\n View website\n <span className=\"rz-menu__end\"><OutboundArrow /></span>\n </a>\n )}\n {accountHref && (\n <a href={accountHref} role=\"menuitem\" className=\"rz-menu__item\">\n <UserIcon />\n Account\n </a>\n )}\n {helpHref && (\n <a href={helpHref} role=\"menuitem\" className=\"rz-menu__item\">\n <HelpIcon />\n Help center\n </a>\n )}\n <div className=\"rz-menu__sep\" />\n <form method=\"post\" action={signOutPath} className=\"rz-menu__signout\">\n <button type=\"submit\" role=\"menuitem\" className=\"rz-menu__item\">\n <OutIcon />\n Sign out\n </button>\n </form>\n </div>\n )}\n </div>\n );\n}\n","/** Top bar: brand on the left, greeting + account menu on the right. */\n\nimport { AccountMenu, firstNameOf, type ShellUser } from \"./AccountMenu\";\nimport type { Theme } from \"./ThemeToggle\";\nimport { OutboundArrow } from \"./Button\";\n\nexport function TopBar({ siteName, productName, logoUrl, homeHref, siteUrl, user, role, theme, onTheme, signOutPath, accountHref, helpHref }: {\n siteName: string;\n productName: string;\n logoUrl?: string | null;\n homeHref: string;\n /** The live website. When set, the brand opens it in a new tab (like every dashboard people know); otherwise it goes to the dashboard. */\n siteUrl?: string | null;\n user: ShellUser | null;\n role: string | null;\n theme: Theme;\n onTheme: (t: Theme) => void;\n signOutPath: string;\n accountHref?: string;\n helpHref?: string;\n}) {\n return (\n <header className=\"rz-topbar\">\n <a\n href={siteUrl || homeHref}\n className=\"rz-topbar__brand\"\n {...(siteUrl ? { target: \"_blank\", rel: \"noreferrer\", title: \"Open the live website in a new tab\" } : {})}\n >\n {/* the site's own mark (usually its favicon); next/image is deliberately not used in the package */}\n {logoUrl && <img src={logoUrl} alt=\"\" className=\"rz-topbar__logo\" />}\n <span>{siteName}</span>\n <span className=\"rz-topbar__product\">{productName}</span>\n {siteUrl && <OutboundArrow />}\n </a>\n {user && role && (\n <div className=\"rz-topbar__right\">\n <span className=\"rz-topbar__greeting\" data-testid=\"rz-greeting\">Welcome back, {firstNameOf(user)}</span>\n <AccountMenu user={user} role={role} theme={theme} onTheme={onTheme} signOutPath={signOutPath} accountHref={accountHref} helpHref={helpHref} siteUrl={siteUrl} />\n </div>\n )}\n </header>\n );\n}\n","/**\n * SHELL_CSS — the design system, as one string the shell injects.\n *\n * Palette borrowed from the visibility tracker (Realiiz's back-office look):\n * warm bone/ink with an operative-green signal. Light is the default so every\n * install looks finished; dark is one attribute away. Everything is scoped to\n * `.rz-admin` so a host site's variables never leak in and ours never leak out.\n *\n * A site overrides by redeclaring any variable on `.rz-admin` — e.g.\n * .rz-admin { --signal: #0a58ca; --rz-font: var(--font-inter), sans-serif; }\n *\n * The block at the end maps the forms-ui variables onto these tokens, so\n * ContentForm and MagicLinkForm re-skin without touching their own code.\n */\n\nexport const SHELL_CSS = `\n.rz-admin, .rz-admin[data-theme=\"light\"] {\n /* realiiz.com palette (src/app/globals.css): ink, bone, paper, signal blue, slate, line, amber */\n --ink: #0e1726; --bone: #f7f5f0; --signal: #1f6feb;\n --surface-0: #f7f5f0; --surface-1: #ffffff; --surface-2: #f1eee7; --surface-3: #e8e4da;\n --text-primary: #0e1726; --text-secondary: #5b6678; --text-muted: #8a93a5;\n --signal-dim: #1a63d8; --signal-glow: #5b9bff; --signal-warn: #e0a03b; --series-blue: #1f6feb;\n --border: #d9d4c8; --separator: #e9e5dc;\n --status-up: #15803d; --status-down: #dc2626; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin[data-theme=\"dark\"] { color-scheme: dark; }\n.rz-admin[data-theme=\"dark\"] {\n --ink: #eef0f5; --bone: #1b2334; --signal: #3b82f6;\n --surface-0: #1b2334; --surface-1: #222c42; --surface-2: #29344a; --surface-3: #36415c;\n --text-primary: #eef0f5; --text-secondary: #a2abbf; --text-muted: #77819a;\n --signal-dim: #8db4ff; --signal-glow: #aec9ff; --signal-warn: #eab058; --series-blue: #3b82f6;\n --border: #36415c; --separator: #2c3750;\n --status-up: #4ade80; --status-down: #f87171; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin {\n --rz-font: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n --rz-font-display: var(--rz-font);\n --rz-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;\n --rz-radius: 6px;\n --rz-sidebar: 220px; --rz-sidebar-collapsed: 58px; --rz-topbar: 52px;\n\n /* forms-ui speaks these; map them once so both packages agree */\n --realiiz-form-fg: var(--text-primary); --realiiz-form-muted: var(--text-muted);\n --realiiz-form-border: var(--border); --realiiz-form-accent: var(--signal);\n --realiiz-form-accent-fg: var(--signal-fg); --realiiz-form-danger: var(--status-down);\n --realiiz-form-radius: var(--rz-radius); --realiiz-form-font: var(--rz-font);\n --realiiz-form-focus-ring: 0 0 0 3px color-mix(in srgb, var(--signal) 25%, transparent);\n\n box-sizing: border-box; min-height: 100vh; display: flex; flex-direction: column;\n background: var(--surface-0); color: var(--text-primary);\n font-family: var(--rz-font); font-size: 14px; line-height: 1.45;\n}\n.rz-admin *, .rz-admin *::before, .rz-admin *::after { box-sizing: inherit; }\n.rz-admin a { color: inherit; }\n.rz-admin h1, .rz-admin h2, .rz-admin h3 { font-family: var(--rz-font-display); color: var(--text-primary); margin: 0; }\n.rz-admin .realiiz-form__control { background: var(--surface-0); }\n.rz-admin .realiiz-image { background: var(--surface-0); }\n.rz-admin .realiiz-image__thumb { background: var(--surface-2); }\n.rz-admin[data-theme=\"dark\"] .realiiz-form__control::-webkit-calendar-picker-indicator { filter: invert(1) opacity(.7); }\n.rz-admin .realiiz-form__button { background: var(--surface-1); color: var(--text-primary); }\n.rz-admin .realiiz-form__button--primary { background: var(--signal); color: var(--signal-fg); }\n\n/* ---- frame ---------------------------------------------------------- */\n.rz-topbar { height: var(--rz-topbar); display: flex; align-items: center; gap: 1rem; padding: 0 1.25rem; border-bottom: 1px solid var(--border); background: var(--surface-1); flex-shrink: 0; }\n.rz-topbar__brand { display: flex; align-items: center; gap: .6rem; font-weight: 600; font-size: .9375rem; text-decoration: none; }\n.rz-topbar__logo { height: 22px; width: auto; display: block; }\n.rz-topbar__product { font-weight: 400; color: var(--text-secondary); }\n.rz-topbar__brand .rz-arrow { color: var(--text-muted); opacity: 0; transition: opacity .15s, transform .15s; }\n.rz-topbar__brand:hover .rz-arrow { opacity: 1; }\n.rz-topbar__right { margin-left: auto; display: flex; align-items: center; gap: 1rem; }\n.rz-topbar__greeting { color: var(--text-secondary); font-size: .8rem; }\n.rz-body { display: flex; flex: 1; min-height: 0; }\n/* Top bar and sidebar stay put while the content scrolls, so Collapse is always at the bottom-left. */\n.rz-topbar { position: sticky; top: 0; z-index: 20; }\n.rz-sidebar { position: sticky; top: var(--rz-topbar); height: calc(100vh - var(--rz-topbar)); width: var(--rz-sidebar); flex-shrink: 0; border-right: 1px solid var(--border); background: var(--surface-1); display: flex; flex-direction: column; transition: width .15s ease; overflow: hidden; }\n.rz-sidebar--collapsed { width: var(--rz-sidebar-collapsed); }\n.rz-sidebar__nav { padding: .75rem 0; flex: 1; overflow-y: auto; }\n.rz-sidebar__item { display: flex; align-items: center; gap: .65rem; padding: .55rem 1rem; color: var(--text-secondary); text-decoration: none; font-size: .875rem; font-weight: 400; white-space: nowrap; overflow: hidden; }\n.rz-sidebar__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-sidebar__item--active { background: var(--surface-2); color: var(--signal); font-weight: 500; }\n.rz-sidebar__item--disabled, .rz-sidebar__item--disabled:hover { color: var(--text-muted); opacity: .55; background: transparent; cursor: default; }\n.rz-sidebar--collapsed .rz-sidebar__item { justify-content: center; padding: .55rem 0; }\n.rz-sidebar--collapsed .rz-sidebar__label { display: none; }\n.rz-sidebar__pinned { border-top: 1px solid var(--separator); padding: .3rem 0; }\n.rz-sidebar__collapse { display: flex; align-items: center; gap: .7rem; padding: .6rem 1rem; border: 0; border-top: 1px solid var(--separator); background: transparent; color: var(--text-muted); cursor: pointer; font: inherit; font-size: .8rem; text-align: left; }\n.rz-sidebar__collapse:hover { color: var(--text-primary); }\n.rz-sidebar__collapse svg { flex-shrink: 0; }\n.rz-sidebar--collapsed .rz-sidebar__collapse { justify-content: center; padding: .6rem 0; }\n.rz-main { flex: 1; min-width: 0; }\n.rz-content { max-width: 1400px; margin: 0; padding: 28px 32px 80px; }\n.rz-content .realiiz-form { max-width: none; }\n.rz-content .realiiz-form fieldset, .rz-content .realiiz-form__alert, .rz-content .realiiz-form__actions { max-width: 920px; }\n/* The form's save bar pins to the bottom of the content column: bleed out over .rz-content's padding, then pad back in. */\n.rz-content .realiiz-form__bar { position: sticky; bottom: 0; z-index: 10; margin: 24px -32px -80px; padding: 12px 32px; background: var(--surface-1); border-top: 1px solid var(--border); box-shadow: 0 -6px 16px rgba(14,23,38,.05); }\n.rz-content .realiiz-form__status { color: var(--text-muted); }\n.rz-content .realiiz-form__bar[data-dirty] .realiiz-form__status { color: var(--text-primary); font-weight: 500; }\n\n/* ---- primitives ----------------------------------------------------- */\n/* Same metrics as the form's Save button (.realiiz-form__button) so every button in the admin matches. */\n.rz-btn { font-family: inherit; font-weight: 600; border-radius: var(--rz-radius); cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: .4rem; white-space: nowrap; line-height: 1.2; }\n.rz-btn--md { padding: 10px 16px; font-size: 15px; min-height: 40px; }\n.rz-btn--sm { padding: 6px 12px; font-size: 13px; min-height: 32px; }\n.rz-admin .rz-btn--primary, .rz-admin a.rz-btn--primary { background: var(--signal); color: var(--signal-fg); border: 1px solid var(--signal); }\n.rz-admin .rz-btn--secondary, .rz-admin a.rz-btn--secondary { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn--danger, .rz-admin a.rz-btn--danger { background: transparent; color: var(--status-down); border: 1px solid var(--status-down); }\n.rz-admin .rz-btn--ghost, .rz-admin a.rz-btn--ghost { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn:disabled { opacity: .55; cursor: default; }\n.rz-arrow { width: 1.1em; height: 1.1em; flex-shrink: 0; transition: transform .15s ease-out; }\n@media (prefers-reduced-motion: no-preference) {\n .rz-btn:hover .rz-arrow, a:hover .rz-arrow { transform: translate(2px, -2px); }\n .rz-btn:hover .rz-arrow--fwd, a:hover .rz-arrow--fwd { transform: translateX(4px); }\n}\n.rz-card { display: flex; flex-direction: column; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; padding: 18px 20px; }\n.rz-card--narrow { max-width: 760px; }\n.rz-card__title { font-size: .9375rem; font-weight: 600; margin-bottom: .35rem; }\n.rz-card__meta { color: var(--text-muted); font-size: .8rem; }\n.rz-card__actions { display: flex; gap: .5rem; margin-top: auto; padding-top: .9rem; flex-wrap: wrap; }\n.rz-card__note { margin-top: .5rem; }\n.rz-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }\n.rz-pagehead { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }\n.rz-pagehead__eyebrow { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .08em; color: var(--text-muted); margin-bottom: .3rem; }\n.rz-pagehead h1 { font-size: 1.375rem; font-weight: 600; }\n.rz-pagehead__sub { color: var(--text-secondary); font-size: .85rem; margin-top: .25rem; }\n.rz-pill { display: inline-flex; align-items: center; gap: .4rem; white-space: nowrap; font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; padding: .15rem .5rem; border: 1px solid var(--border); border-radius: 999px; color: var(--text-secondary); }\n.rz-pill::before { content: \"\"; width: 7px; height: 7px; border-radius: 50%; background: var(--status-neutral); }\n.rz-pill--up::before { background: var(--status-up); } .rz-pill--warn::before { background: var(--signal-warn); } .rz-pill--down::before { background: var(--status-down); }\n.rz-pill--plain::before { display: none; }\n/* ---- steps tracker ------------------------------------------------- */\n/* Dots on one rail, connectors dot-to-dot, label under each dot; left-aligned like the rest of the page. */\n.rz-steps { list-style: none; margin: 4px 0 22px; padding: 0 0 22px; display: flex; border-bottom: 1px solid var(--separator); }\n.rz-step { flex: 1; position: relative; display: flex; flex-direction: column; align-items: flex-start; text-align: left; gap: 8px; min-width: 0; }\n.rz-step:last-child { flex: 0 0 auto; }\n.rz-step:not(:last-child)::after { content: \"\"; position: absolute; top: 12px; left: 26px; right: 0; height: 2px; background: var(--border); }\n.rz-step--done:not(:last-child)::after { background: var(--status-up); }\n.rz-step__dot { width: 26px; height: 26px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 600; flex-shrink: 0; border: 2px solid var(--border); color: var(--text-muted); background: var(--surface-1); }\n.rz-step--done .rz-step__dot { background: var(--status-up); border-color: var(--status-up); color: #fff; }\n.rz-step--active .rz-step__dot { position: relative; border-color: color-mix(in srgb, var(--signal) 30%, transparent); color: var(--signal); }\n/* A spinning arc over the ring: the step is working, not waiting on you. */\n.rz-step--active .rz-step__dot::after { content: \"\"; position: absolute; inset: -2px; border-radius: 50%; border: 2px solid transparent; border-top-color: var(--signal); animation: rz-spin .9s linear infinite; }\n@media (prefers-reduced-motion: reduce) { .rz-step--active .rz-step__dot::after { animation: none; border-color: var(--signal); } }\n@keyframes rz-spin { to { transform: rotate(360deg); } }\n.rz-step--failed .rz-step__dot { background: var(--status-down); border-color: var(--status-down); color: #fff; }\n.rz-step__text { display: flex; flex-direction: column; gap: 1px; padding-right: 16px; }\n.rz-step__label { font-size: .875rem; font-weight: 500; color: var(--text-secondary); }\n.rz-step--active .rz-step__label, .rz-step--done .rz-step__label { color: var(--text-primary); }\n.rz-step--failed .rz-step__label { color: var(--status-down); }\n.rz-step__note { font-size: .75rem; color: var(--text-muted); }\n@keyframes rz-pulse { 0%, 100% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--signal) 18%, transparent); } 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--signal) 8%, transparent); } }\n.rz-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 20px; }\n.rz-actions__hint { font-size: .8rem; color: var(--text-muted); }\n.rz-notice { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface-1); margin-bottom: 18px; font-size: .9rem; }\n.rz-notice__text { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }\n.rz-status-link { text-decoration: none; }\n.rz-discard { margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--separator); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: .85rem; color: var(--text-secondary); }\n.rz-discard__link { background: none; border: 0; padding: 0; font: inherit; font-size: .85rem; color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.rz-discard__link:hover { color: var(--status-down); }\n.rz-nowrap { white-space: nowrap; }\n.rz-table td.rz-fit, .rz-table th.rz-fit { width: 1%; white-space: nowrap; }\n.rz-empty { border: 1px dashed var(--border); border-radius: 8px; padding: 32px; text-align: center; color: var(--text-secondary); }\n.rz-empty h3 { font-size: 1rem; margin-bottom: .4rem; }\n.rz-table-wrap { width: 100%; }\n.rz-table { width: 100%; border-collapse: collapse; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }\n.rz-table th, .rz-table td { text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--separator); font-size: .875rem; vertical-align: top; }\n.rz-table th { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; color: var(--text-muted); background: var(--surface-2); }\n.rz-table tr:last-child td { border-bottom: 0; }\n.rz-muted { color: var(--text-muted); }\n.rz-alert { border: 1px solid var(--status-down); color: var(--status-down); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n.rz-ok { border: 1px solid var(--status-up); color: var(--signal-dim); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n\n/* ---- account menu --------------------------------------------------- */\n.rz-avatar__img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }\n.rz-tabs { display: flex; gap: .25rem; border-bottom: 1px solid var(--border); margin: 0 0 1.5rem; flex-wrap: wrap; }\n.rz-tabs__tab { padding: .55rem .9rem; font: inherit; font-size: .88rem; color: var(--text-secondary); background: none; border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; cursor: pointer; }\n.rz-tabs__tab:hover { color: var(--text-primary); }\n.rz-tabs__tab[aria-selected=\"true\"] { color: var(--text-primary); border-bottom-color: var(--signal); font-weight: 600; }\n.rz-tabs__tab:focus-visible { outline: 2px solid var(--signal); outline-offset: -2px; border-radius: 4px; }\n.rz-avatar { width: 2rem; height: 2rem; border-radius: 50%; background: var(--surface-3); border: 1px solid var(--border); color: var(--text-primary); font-size: .6875rem; font-weight: 600; letter-spacing: .04em; display: flex; align-items: center; justify-content: center; cursor: pointer; font-family: inherit; padding: 0; overflow: hidden; }\n.rz-menu { position: absolute; right: 0; top: calc(100% + 8px); min-width: 15rem; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; box-shadow: 0 8px 24px rgba(14,23,38,.14); overflow: hidden; z-index: 50; }\n.rz-menu__who { padding: .75rem .9rem; border-bottom: 1px solid var(--border); margin-bottom: .3rem; }\n.rz-menu__name { font-weight: 600; font-size: .875rem; }\n.rz-menu__email { color: var(--text-muted); font-size: .75rem; word-break: break-all; }\n.rz-menu__sep { height: 1px; background: var(--border); margin: .3rem 0; }\n.rz-menu__item { display: flex; align-items: center; gap: .55rem; width: 100%; padding: .45rem .9rem; font: inherit; font-size: .8125rem; color: var(--text-secondary); background: none; border: 0; text-align: left; cursor: pointer; text-decoration: none; }\n.rz-menu__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-menu__item svg { flex-shrink: 0; }\n.rz-menu__item--static { cursor: default; }\n.rz-menu__item--static:hover { background: none; color: var(--text-secondary); }\n.rz-menu__item .rz-menu__end { margin-left: auto; }\n.rz-menu__signout { margin: 0 0 .3rem; }\n.rz-seg { display: inline-flex; border: 1px solid var(--border); border-radius: var(--rz-radius); overflow: hidden; }\n.rz-seg button { font: inherit; font-size: .75rem; padding: .15rem .55rem; line-height: 1.3; background: transparent; color: var(--text-secondary); border: 0; cursor: pointer; }\n.rz-seg button[aria-pressed=\"true\"] { background: var(--surface-3); color: var(--text-primary); }\n\n/* ---- mobile: sidebar becomes a strip under the top bar --------------- */\n@media (max-width: 720px) {\n .rz-body { flex-direction: column; }\n .rz-sidebar, .rz-sidebar--collapsed { width: 100%; border-right: 0; border-bottom: 1px solid var(--border); flex-direction: row; }\n .rz-sidebar__nav { display: flex; padding: .35rem .25rem; overflow-x: auto; }\n .rz-sidebar__item { flex-direction: column; gap: .2rem; font-size: .6875rem; padding: .4rem .6rem; border-radius: 6px; }\n .rz-sidebar--collapsed .rz-sidebar__label { display: block; }\n .rz-sidebar__collapse { display: none; }\n .rz-sidebar__pinned { display: flex; border-top: 0; padding: .35rem .25rem; }\n .rz-topbar__greeting { display: none; }\n .rz-content { padding: 18px 14px 60px; }\n /* The sidebar is a top strip now, so it must not be sticky-height; the topbar stays pinned. */\n .rz-sidebar, .rz-sidebar--collapsed { position: static; height: auto; }\n .rz-sidebar__item--disabled { display: none; }\n /* Save bar: bleed matches the narrower content padding; stack status above the buttons. */\n .rz-content .realiiz-form__bar { margin: 18px -14px -60px; padding: 10px 14px; flex-wrap: wrap; }\n .rz-content .realiiz-form__status { flex-basis: 100%; margin-right: 0; font-size: .8rem; }\n /* Editor toolbar wraps; the Insert group drops its label and left rule to save width. */\n .rz-admin .realiiz-md__head { padding: 5px; }\n .rz-admin .realiiz-md__insert { border-left: 0; padding-left: 0; margin-left: 0; }\n .rz-admin .realiiz-md__lab { display: none; }\n .rz-admin .realiiz-md--fs { padding: 8px; }\n /* Tracker: notes hide, labels shrink, so three steps fit a phone. */\n .rz-step__note { display: none; }\n .rz-step__label { font-size: .8rem; }\n .rz-step:not(:last-child)::after { right: 6px; }\n /* Tables scroll sideways inside their own box instead of stretching the page. */\n .rz-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n .rz-pagehead { align-items: flex-start; flex-direction: column; }\n .rz-notice { flex-direction: column; align-items: flex-start; }\n .rz-card--narrow { max-width: none; }\n}\n\n/* ---- forms extras: markdown editor, chips, gauges, preview prose --------- */\n.rz-admin .realiiz-md { --_md-head: var(--surface-2); --_md-hover: var(--surface-2); --_md-hover-line: var(--signal-glow); --_md-on: color-mix(in srgb, var(--signal) 12%, var(--surface-1)); --_md-tip: var(--ink); }\n.rz-admin .realiiz-md__mode { background: var(--surface-2); }\n.rz-admin .realiiz-md__mode button { color: var(--text-secondary); }\n.rz-admin .realiiz-md__mode button[aria-selected=\"true\"] { background: var(--surface-1); color: var(--text-primary); box-shadow: 0 1px 2px rgba(14,23,38,.12); }\n.rz-admin .realiiz-md__panel, .rz-admin .realiiz-md__tgrid, .rz-admin .realiiz-md--fs, .rz-admin .realiiz-md .realiiz-md__ta, .rz-admin .realiiz-md__preview, .rz-admin .realiiz-md__head button { background: var(--surface-1); }\n.rz-admin .realiiz-md__head { background: var(--surface-2); }\n.rz-admin .realiiz-md__head button { color: var(--text-primary); }\n.rz-admin .realiiz-md__insert button { background: var(--surface-2); color: var(--text-secondary); }\n.rz-admin .realiiz-md__tgcells i { background: var(--surface-1); }\n.rz-admin .realiiz-md__tgcells i.hot { background: color-mix(in srgb, var(--signal) 18%, var(--surface-1)); }\n.rz-admin .realiiz-md__loading { color: var(--text-muted); font-size: .8rem; }\n.rz-admin .realiiz-prose { max-width: 68ch; font-size: 1rem; line-height: 1.65; color: var(--text-primary); }\n.rz-admin .realiiz-prose h1, .rz-admin .realiiz-prose h2, .rz-admin .realiiz-prose h3 { font-family: var(--rz-font-display); line-height: 1.25; margin: 1.4em 0 .5em; }\n.rz-admin .realiiz-prose h2 { font-size: 1.35rem; } .rz-admin .realiiz-prose h3 { font-size: 1.1rem; }\n.rz-admin .realiiz-prose p, .rz-admin .realiiz-prose ul, .rz-admin .realiiz-prose ol, .rz-admin .realiiz-prose blockquote { margin: 0 0 1em; }\n.rz-admin .realiiz-prose a { color: var(--signal); }\n/* The site's prose class picks a slate body color for a light page; on the dark surface that reads as disabled. */\n.rz-admin[data-theme=\"dark\"] .realiiz-prose, .rz-admin[data-theme=\"dark\"] .realiiz-prose :is(p, li, td, th, dd, dt, figcaption, strong, b, em, i, h1, h2, h3, h4, h5, h6) { color: var(--text-primary); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose :is(code, kbd) { color: var(--text-primary); background: var(--surface-3); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose a { color: var(--signal-dim); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose hr { border-color: var(--border); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose blockquote { color: var(--text-secondary); }\n.rz-admin .realiiz-prose blockquote { border-left: 3px solid var(--border); padding-left: 1em; color: var(--text-secondary); }\n.rz-admin .realiiz-prose code { background: var(--surface-2); padding: 0 4px; border-radius: 4px; font-family: var(--rz-font-mono); font-size: .9em; }\n.rz-admin .realiiz-prose pre { background: var(--surface-2); padding: 12px 14px; border-radius: 6px; overflow-x: auto; }\n.rz-admin .realiiz-prose img { max-width: 100%; height: auto; border-radius: 6px; }\n.rz-admin .realiiz-chips { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; min-height: 40px; padding: 5px 8px; background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--rz-radius); }\n.rz-admin .realiiz-chips:focus-within { border-color: var(--signal); box-shadow: var(--realiiz-form-focus-ring); }\n.rz-admin .realiiz-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 4px 2px 9px; background: var(--surface-3); border: 1px solid var(--border); border-radius: 999px; font-size: .8rem; color: var(--text-primary); }\n.rz-admin .realiiz-chip button { font: inherit; line-height: 1; width: 18px; height: 18px; border-radius: 50%; border: 0; background: transparent; color: var(--text-muted); cursor: pointer; }\n.rz-admin .realiiz-chip button:hover { background: var(--status-down); color: #fff; }\n.rz-admin .realiiz-chips__input { flex: 1; min-width: 120px; border: 0; background: transparent; font: inherit; color: inherit; outline: none; padding: 4px; }\n.rz-admin .realiiz-chips__count { margin-left: auto; color: var(--text-muted); font-size: .75rem; font-variant-numeric: tabular-nums; }\n.rz-admin .realiiz-gauge { color: var(--text-muted); }\n.rz-admin .realiiz-gauge__bar { background: var(--surface-3); }\n.rz-admin .realiiz-gauge__zone { background: color-mix(in srgb, var(--status-up) 28%, transparent); }\n.rz-admin .realiiz-gauge__fill { background: var(--text-muted); }\n.rz-admin .realiiz-gauge--ok .realiiz-gauge__fill { background: var(--status-up); } .rz-admin .realiiz-gauge--ok { color: var(--status-up); }\n.rz-admin .realiiz-gauge--over .realiiz-gauge__fill { background: var(--status-down); } .rz-admin .realiiz-gauge--over { color: var(--status-down); }\n`;\n","/**\n * AdminShell — the frame every /admin page renders inside.\n *\n * Pure presentation: the host passes the session, the nav (from the registry)\n * and the current path. No env, no fetch, no router import. Tokens are\n * injected once via <style>; a site overrides them on `.rz-admin`.\n */\n\nimport type { ReactNode } from \"react\";\nimport type { ShellUser } from \"./AccountMenu\";\nimport { Sidebar, type NavItem } from \"./Sidebar\";\nimport { TopBar } from \"./TopBar\";\nimport { useTheme, type Theme } from \"./ThemeToggle\";\nimport { SHELL_CSS } from \"./tokens\";\n\nexport interface AdminShellProps {\n siteName: string;\n /** What the product is called in the top bar, e.g. \"Realiiz Studio\". Default \"Studio\" (shown as \"{siteName} Studio\"). */\n productName?: string;\n logoUrl?: string | null;\n /** null when nobody is signed in (sign-in page, not-configured page). */\n user: ShellUser | null;\n role: string | null;\n nav: NavItem[];\n /** Items pinned above Collapse (Settings), so they stay put as sections are added. */\n pinnedNav?: NavItem[];\n /** The current pathname, for the active nav item. */\n activeHref: string;\n /** Default \"/admin\". */\n basePath?: string;\n /** Default `${basePath}/auth/signout`. */\n signOutPath?: string;\n /** Account page for the avatar menu. Default `${basePath}/account`; null hides the item. */\n accountHref?: string | null;\n /** Help center for the avatar menu. Default `${basePath}/help`; null hides the item. */\n helpHref?: string | null;\n /** The live website. Makes the brand and a \"View website\" menu item open it in a new tab. */\n siteUrl?: string | null;\n /**\n * The client's own branding (Business tab). `name` replaces siteName in the top bar\n * and `logoUrl` replaces the logo; the product word (\"Studio\") stays.\n */\n branding?: { name?: string | null; logoUrl?: string | null } | null;\n defaultTheme?: Theme;\n children: ReactNode;\n}\n\nexport function AdminShell({\n siteName, productName = \"Studio\", logoUrl, user, role, nav, pinnedNav, activeHref,\n basePath = \"/admin\", signOutPath, accountHref, helpHref, siteUrl, branding, defaultTheme = \"light\", children,\n}: AdminShellProps) {\n const [theme, setTheme] = useTheme(defaultTheme);\n const showNav = Boolean(user && role);\n const shownName = branding?.name?.trim() || siteName;\n const shownLogo = branding?.logoUrl || logoUrl;\n\n return (\n <div className=\"rz-admin\" data-theme={theme}>\n <style>{SHELL_CSS}</style>\n <TopBar\n siteName={shownName}\n productName={productName}\n logoUrl={shownLogo}\n siteUrl={siteUrl}\n homeHref={basePath}\n user={user}\n role={role}\n theme={theme}\n onTheme={setTheme}\n signOutPath={signOutPath ?? `${basePath}/auth/signout`}\n accountHref={accountHref === null ? undefined : (accountHref ?? `${basePath}/account`)}\n helpHref={helpHref === null ? undefined : (helpHref ?? `${basePath}/help`)}\n />\n <div className=\"rz-body\">\n {showNav && <Sidebar items={nav} pinned={pinnedNav} activeHref={activeHref} basePath={basePath} />}\n <main className=\"rz-main\">\n <div className=\"rz-content\">{children}</div>\n </main>\n </div>\n </div>\n );\n}\n","/** Card, PageHeader, StatusPill, EmptyState, Steps — the page-level vocabulary. */\n\nimport type { ReactNode } from \"react\";\n\nexport function Card({ title, meta, note, children, actions, className }: {\n title?: ReactNode; meta?: ReactNode;\n /** A short status line under the meta — a pill, a count — kept out of `meta` so long text never pushes the actions around. */\n note?: ReactNode;\n children?: ReactNode; actions?: ReactNode; className?: string;\n}) {\n return (\n <div className={[\"rz-card\", className].filter(Boolean).join(\" \")}>\n {title && <div className=\"rz-card__title\">{title}</div>}\n {meta && <div className=\"rz-card__meta\">{meta}</div>}\n {note && <div className=\"rz-card__note\">{note}</div>}\n {children}\n {actions && <div className=\"rz-card__actions\">{actions}</div>}\n </div>\n );\n}\n\nexport function PageHeader({ eyebrow, title, subtitle, actions }: {\n eyebrow?: ReactNode; title: ReactNode; subtitle?: ReactNode; actions?: ReactNode;\n}) {\n return (\n <div className=\"rz-pagehead\">\n <div>\n {eyebrow && <div className=\"rz-pagehead__eyebrow\">{eyebrow}</div>}\n <h1>{title}</h1>\n {subtitle && <div className=\"rz-pagehead__sub\">{subtitle}</div>}\n </div>\n {actions && <div className=\"rz-card__actions\" style={{ marginTop: 0 }}>{actions}</div>}\n </div>\n );\n}\n\nexport type PillTone = \"up\" | \"warn\" | \"down\" | \"neutral\" | \"plain\";\n\nexport function StatusPill({ tone = \"neutral\", children, title }: { tone?: PillTone; children: ReactNode; title?: string }) {\n return <span className={`rz-pill rz-pill--${tone}`} title={title}>{children}</span>;\n}\n\nexport function EmptyState({ title, children, action }: { title: ReactNode; children?: ReactNode; action?: ReactNode }) {\n return (\n <div className=\"rz-empty\">\n <h3>{title}</h3>\n {children && <div>{children}</div>}\n {action && <div style={{ marginTop: 14 }}>{action}</div>}\n </div>\n );\n}\n\nexport type StepState = \"done\" | \"active\" | \"todo\" | \"failed\";\n\n/**\n * A short horizontal progress tracker: Saved → Checking → Live. One state per\n * step; the active one gets the pulse. Small enough to sit at the top of a card.\n */\nexport function Steps({ steps }: { steps: { label: ReactNode; state: StepState; note?: ReactNode }[] }) {\n return (\n <ol className=\"rz-steps\" aria-label=\"Progress\">\n {steps.map((st, i) => (\n <li key={i} className={`rz-step rz-step--${st.state}`} aria-current={st.state === \"active\" ? \"step\" : undefined}>\n <span className=\"rz-step__dot\" aria-hidden=\"true\">{st.state === \"done\" ? \"✓\" : st.state === \"failed\" ? \"!\" : i + 1}</span>\n <span className=\"rz-step__text\">\n <span className=\"rz-step__label\">{st.label}</span>\n {st.note && <span className=\"rz-step__note\">{st.note}</span>}\n </span>\n </li>\n ))}\n </ol>\n );\n}\n","/**\n * Tabs — which SECTION of this page am I on (Account: My Profile · Change\n * Password · Team · Business). Underlined strip, same as the visibility\n * tracker's: five two-word labels stay on one line where pills would wrap.\n * Not for choosing a value or filtering — that is a segmented control.\n * Keyboard: Left/Right (and Home/End) move between tabs.\n */\n\nimport { useRef, type KeyboardEvent } from \"react\";\n\nexport interface TabOption {\n value: string;\n label: string;\n /** A small marker after the label — a count, an unsaved dot. Keep it short. */\n suffix?: string;\n}\n\nexport function Tabs({ options, value, onChange, label = \"Sections\" }: {\n options: TabOption[];\n value: string;\n onChange: (value: string) => void;\n label?: string;\n}) {\n const list = useRef<HTMLDivElement>(null);\n\n const onKey = (e: KeyboardEvent<HTMLDivElement>) => {\n const i = options.findIndex((o) => o.value === value);\n if (i < 0) return;\n let next = i;\n if (e.key === \"ArrowRight\") next = (i + 1) % options.length;\n else if (e.key === \"ArrowLeft\") next = (i - 1 + options.length) % options.length;\n else if (e.key === \"Home\") next = 0;\n else if (e.key === \"End\") next = options.length - 1;\n else return;\n e.preventDefault();\n onChange(options[next].value);\n (list.current?.children[next] as HTMLElement | undefined)?.focus();\n };\n\n return (\n <div ref={list} className=\"rz-tabs\" role=\"tablist\" aria-label={label} onKeyDown={onKey}>\n {options.map((o) => {\n const active = o.value === value;\n return (\n <button\n key={o.value}\n type=\"button\"\n role=\"tab\"\n className=\"rz-tabs__tab\"\n aria-selected={active}\n tabIndex={active ? 0 : -1}\n onClick={() => onChange(o.value)}\n >\n {o.label}\n {o.suffix && <span className=\"rz-muted\"> {o.suffix}</span>}\n </button>\n );\n })}\n </div>\n );\n}\n"]}
|
package/dist/shell/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode, ButtonHTMLAttributes, AnchorHTMLAttributes } from 'react';
|
|
3
|
-
import { S as ShellUser, N as NavItem, T as Theme } from '../Sidebar-
|
|
4
|
-
export { A as AccountMenu, a as Sidebar, b as ThemeToggle, f as firstNameOf, i as initialsOf, c as isActive, u as useTheme } from '../Sidebar-
|
|
3
|
+
import { S as ShellUser, N as NavItem, T as Theme } from '../Sidebar-Dz_qJOSx.cjs';
|
|
4
|
+
export { A as AccountMenu, a as Sidebar, b as ThemeToggle, f as firstNameOf, i as initialsOf, c as isActive, u as useTheme } from '../Sidebar-Dz_qJOSx.cjs';
|
|
5
5
|
|
|
6
6
|
interface AdminShellProps {
|
|
7
7
|
siteName: string;
|
|
@@ -24,6 +24,8 @@ interface AdminShellProps {
|
|
|
24
24
|
accountHref?: string | null;
|
|
25
25
|
/** Help center for the avatar menu. Default `${basePath}/help`; null hides the item. */
|
|
26
26
|
helpHref?: string | null;
|
|
27
|
+
/** The live website. Makes the brand and a "View website" menu item open it in a new tab. */
|
|
28
|
+
siteUrl?: string | null;
|
|
27
29
|
/**
|
|
28
30
|
* The client's own branding (Business tab). `name` replaces siteName in the top bar
|
|
29
31
|
* and `logoUrl` replaces the logo; the product word ("Studio") stays.
|
|
@@ -35,13 +37,15 @@ interface AdminShellProps {
|
|
|
35
37
|
defaultTheme?: Theme;
|
|
36
38
|
children: ReactNode;
|
|
37
39
|
}
|
|
38
|
-
declare function AdminShell({ siteName, productName, logoUrl, user, role, nav, pinnedNav, activeHref, basePath, signOutPath, accountHref, helpHref, branding, defaultTheme, children, }: AdminShellProps): react.JSX.Element;
|
|
40
|
+
declare function AdminShell({ siteName, productName, logoUrl, user, role, nav, pinnedNav, activeHref, basePath, signOutPath, accountHref, helpHref, siteUrl, branding, defaultTheme, children, }: AdminShellProps): react.JSX.Element;
|
|
39
41
|
|
|
40
|
-
declare function TopBar({ siteName, productName, logoUrl, homeHref, user, role, theme, onTheme, signOutPath, accountHref, helpHref }: {
|
|
42
|
+
declare function TopBar({ siteName, productName, logoUrl, homeHref, siteUrl, user, role, theme, onTheme, signOutPath, accountHref, helpHref }: {
|
|
41
43
|
siteName: string;
|
|
42
44
|
productName: string;
|
|
43
45
|
logoUrl?: string | null;
|
|
44
46
|
homeHref: string;
|
|
47
|
+
/** The live website. When set, the brand opens it in a new tab (like every dashboard people know); otherwise it goes to the dashboard. */
|
|
48
|
+
siteUrl?: string | null;
|
|
45
49
|
user: ShellUser | null;
|
|
46
50
|
role: string | null;
|
|
47
51
|
theme: Theme;
|
|
@@ -136,7 +140,7 @@ declare function iconFor(id: string): IconName;
|
|
|
136
140
|
* The block at the end maps the forms-ui variables onto these tokens, so
|
|
137
141
|
* ContentForm and MagicLinkForm re-skin without touching their own code.
|
|
138
142
|
*/
|
|
139
|
-
declare const SHELL_CSS = "\n.rz-admin, .rz-admin[data-theme=\"light\"] {\n /* realiiz.com palette (src/app/globals.css): ink, bone, paper, signal blue, slate, line, amber */\n --ink: #0e1726; --bone: #f7f5f0; --signal: #1f6feb;\n --surface-0: #f7f5f0; --surface-1: #ffffff; --surface-2: #f1eee7; --surface-3: #e8e4da;\n --text-primary: #0e1726; --text-secondary: #5b6678; --text-muted: #8a93a5;\n --signal-dim: #1a63d8; --signal-glow: #5b9bff; --signal-warn: #e0a03b; --series-blue: #1f6feb;\n --border: #d9d4c8; --separator: #e9e5dc;\n --status-up: #15803d; --status-down: #dc2626; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin[data-theme=\"dark\"] { color-scheme: dark; }\n.rz-admin[data-theme=\"dark\"] {\n --ink: #eef0f5; --bone: #1b2334; --signal: #3b82f6;\n --surface-0: #1b2334; --surface-1: #222c42; --surface-2: #29344a; --surface-3: #36415c;\n --text-primary: #eef0f5; --text-secondary: #a2abbf; --text-muted: #77819a;\n --signal-dim: #8db4ff; --signal-glow: #aec9ff; --signal-warn: #eab058; --series-blue: #3b82f6;\n --border: #36415c; --separator: #2c3750;\n --status-up: #4ade80; --status-down: #f87171; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin {\n --rz-font: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n --rz-font-display: var(--rz-font);\n --rz-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;\n --rz-radius: 6px;\n --rz-sidebar: 220px; --rz-sidebar-collapsed: 58px; --rz-topbar: 52px;\n\n /* forms-ui speaks these; map them once so both packages agree */\n --realiiz-form-fg: var(--text-primary); --realiiz-form-muted: var(--text-muted);\n --realiiz-form-border: var(--border); --realiiz-form-accent: var(--signal);\n --realiiz-form-accent-fg: var(--signal-fg); --realiiz-form-danger: var(--status-down);\n --realiiz-form-radius: var(--rz-radius); --realiiz-form-font: var(--rz-font);\n --realiiz-form-focus-ring: 0 0 0 3px color-mix(in srgb, var(--signal) 25%, transparent);\n\n box-sizing: border-box; min-height: 100vh; display: flex; flex-direction: column;\n background: var(--surface-0); color: var(--text-primary);\n font-family: var(--rz-font); font-size: 14px; line-height: 1.45;\n}\n.rz-admin *, .rz-admin *::before, .rz-admin *::after { box-sizing: inherit; }\n.rz-admin a { color: inherit; }\n.rz-admin h1, .rz-admin h2, .rz-admin h3 { font-family: var(--rz-font-display); color: var(--text-primary); margin: 0; }\n.rz-admin .realiiz-form__control { background: var(--surface-0); }\n.rz-admin .realiiz-image { background: var(--surface-0); }\n.rz-admin .realiiz-image__thumb { background: var(--surface-2); }\n.rz-admin[data-theme=\"dark\"] .realiiz-form__control::-webkit-calendar-picker-indicator { filter: invert(1) opacity(.7); }\n.rz-admin .realiiz-form__button { background: var(--surface-1); color: var(--text-primary); }\n.rz-admin .realiiz-form__button--primary { background: var(--signal); color: var(--signal-fg); }\n\n/* ---- frame ---------------------------------------------------------- */\n.rz-topbar { height: var(--rz-topbar); display: flex; align-items: center; gap: 1rem; padding: 0 1.25rem; border-bottom: 1px solid var(--border); background: var(--surface-1); flex-shrink: 0; }\n.rz-topbar__brand { display: flex; align-items: center; gap: .6rem; font-weight: 600; font-size: .9375rem; text-decoration: none; }\n.rz-topbar__logo { height: 22px; width: auto; display: block; }\n.rz-topbar__product { font-weight: 400; color: var(--text-secondary); }\n.rz-topbar__right { margin-left: auto; display: flex; align-items: center; gap: 1rem; }\n.rz-topbar__greeting { color: var(--text-secondary); font-size: .8rem; }\n.rz-body { display: flex; flex: 1; min-height: 0; }\n/* Top bar and sidebar stay put while the content scrolls, so Collapse is always at the bottom-left. */\n.rz-topbar { position: sticky; top: 0; z-index: 20; }\n.rz-sidebar { position: sticky; top: var(--rz-topbar); height: calc(100vh - var(--rz-topbar)); width: var(--rz-sidebar); flex-shrink: 0; border-right: 1px solid var(--border); background: var(--surface-1); display: flex; flex-direction: column; transition: width .15s ease; overflow: hidden; }\n.rz-sidebar--collapsed { width: var(--rz-sidebar-collapsed); }\n.rz-sidebar__nav { padding: .75rem 0; flex: 1; overflow-y: auto; }\n.rz-sidebar__item { display: flex; align-items: center; gap: .65rem; padding: .55rem 1rem; color: var(--text-secondary); text-decoration: none; font-size: .875rem; font-weight: 400; white-space: nowrap; overflow: hidden; }\n.rz-sidebar__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-sidebar__item--active { background: var(--surface-2); color: var(--signal); font-weight: 500; }\n.rz-sidebar__item--disabled, .rz-sidebar__item--disabled:hover { color: var(--text-muted); opacity: .55; background: transparent; cursor: default; }\n.rz-sidebar--collapsed .rz-sidebar__item { justify-content: center; padding: .55rem 0; }\n.rz-sidebar--collapsed .rz-sidebar__label { display: none; }\n.rz-sidebar__pinned { border-top: 1px solid var(--separator); padding: .3rem 0; }\n.rz-sidebar__collapse { display: flex; align-items: center; gap: .7rem; padding: .6rem 1rem; border: 0; border-top: 1px solid var(--separator); background: transparent; color: var(--text-muted); cursor: pointer; font: inherit; font-size: .8rem; text-align: left; }\n.rz-sidebar__collapse:hover { color: var(--text-primary); }\n.rz-sidebar__collapse svg { flex-shrink: 0; }\n.rz-sidebar--collapsed .rz-sidebar__collapse { justify-content: center; padding: .6rem 0; }\n.rz-main { flex: 1; min-width: 0; }\n.rz-content { max-width: 1400px; margin: 0; padding: 28px 32px 80px; }\n.rz-content .realiiz-form { max-width: none; }\n.rz-content .realiiz-form fieldset, .rz-content .realiiz-form__alert, .rz-content .realiiz-form__actions { max-width: 920px; }\n/* The form's save bar pins to the bottom of the content column: bleed out over .rz-content's padding, then pad back in. */\n.rz-content .realiiz-form__bar { position: sticky; bottom: 0; z-index: 10; margin: 24px -32px -80px; padding: 12px 32px; background: var(--surface-1); border-top: 1px solid var(--border); box-shadow: 0 -6px 16px rgba(14,23,38,.05); }\n.rz-content .realiiz-form__status { color: var(--text-muted); }\n.rz-content .realiiz-form__bar[data-dirty] .realiiz-form__status { color: var(--text-primary); font-weight: 500; }\n\n/* ---- primitives ----------------------------------------------------- */\n/* Same metrics as the form's Save button (.realiiz-form__button) so every button in the admin matches. */\n.rz-btn { font-family: inherit; font-weight: 600; border-radius: var(--rz-radius); cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: .4rem; white-space: nowrap; line-height: 1.2; }\n.rz-btn--md { padding: 10px 16px; font-size: 15px; min-height: 40px; }\n.rz-btn--sm { padding: 6px 12px; font-size: 13px; min-height: 32px; }\n.rz-admin .rz-btn--primary, .rz-admin a.rz-btn--primary { background: var(--signal); color: var(--signal-fg); border: 1px solid var(--signal); }\n.rz-admin .rz-btn--secondary, .rz-admin a.rz-btn--secondary { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn--danger, .rz-admin a.rz-btn--danger { background: transparent; color: var(--status-down); border: 1px solid var(--status-down); }\n.rz-admin .rz-btn--ghost, .rz-admin a.rz-btn--ghost { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn:disabled { opacity: .55; cursor: default; }\n.rz-arrow { width: 1.1em; height: 1.1em; flex-shrink: 0; transition: transform .15s ease-out; }\n@media (prefers-reduced-motion: no-preference) {\n .rz-btn:hover .rz-arrow, a:hover .rz-arrow { transform: translate(2px, -2px); }\n .rz-btn:hover .rz-arrow--fwd, a:hover .rz-arrow--fwd { transform: translateX(4px); }\n}\n.rz-card { display: flex; flex-direction: column; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; padding: 18px 20px; }\n.rz-card--narrow { max-width: 760px; }\n.rz-card__title { font-size: .9375rem; font-weight: 600; margin-bottom: .35rem; }\n.rz-card__meta { color: var(--text-muted); font-size: .8rem; }\n.rz-card__actions { display: flex; gap: .5rem; margin-top: auto; padding-top: .9rem; flex-wrap: wrap; }\n.rz-card__note { margin-top: .5rem; }\n.rz-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }\n.rz-pagehead { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }\n.rz-pagehead__eyebrow { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .08em; color: var(--text-muted); margin-bottom: .3rem; }\n.rz-pagehead h1 { font-size: 1.375rem; font-weight: 600; }\n.rz-pagehead__sub { color: var(--text-secondary); font-size: .85rem; margin-top: .25rem; }\n.rz-pill { display: inline-flex; align-items: center; gap: .4rem; white-space: nowrap; font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; padding: .15rem .5rem; border: 1px solid var(--border); border-radius: 999px; color: var(--text-secondary); }\n.rz-pill::before { content: \"\"; width: 7px; height: 7px; border-radius: 50%; background: var(--status-neutral); }\n.rz-pill--up::before { background: var(--status-up); } .rz-pill--warn::before { background: var(--signal-warn); } .rz-pill--down::before { background: var(--status-down); }\n.rz-pill--plain::before { display: none; }\n/* ---- steps tracker ------------------------------------------------- */\n/* Dots on one rail, connectors dot-to-dot, label under each dot; left-aligned like the rest of the page. */\n.rz-steps { list-style: none; margin: 4px 0 22px; padding: 0 0 22px; display: flex; border-bottom: 1px solid var(--separator); }\n.rz-step { flex: 1; position: relative; display: flex; flex-direction: column; align-items: flex-start; text-align: left; gap: 8px; min-width: 0; }\n.rz-step:last-child { flex: 0 0 auto; }\n.rz-step:not(:last-child)::after { content: \"\"; position: absolute; top: 12px; left: 26px; right: 0; height: 2px; background: var(--border); }\n.rz-step--done:not(:last-child)::after { background: var(--status-up); }\n.rz-step__dot { width: 26px; height: 26px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 600; flex-shrink: 0; border: 2px solid var(--border); color: var(--text-muted); background: var(--surface-1); }\n.rz-step--done .rz-step__dot { background: var(--status-up); border-color: var(--status-up); color: #fff; }\n.rz-step--active .rz-step__dot { position: relative; border-color: color-mix(in srgb, var(--signal) 30%, transparent); color: var(--signal); }\n/* A spinning arc over the ring: the step is working, not waiting on you. */\n.rz-step--active .rz-step__dot::after { content: \"\"; position: absolute; inset: -2px; border-radius: 50%; border: 2px solid transparent; border-top-color: var(--signal); animation: rz-spin .9s linear infinite; }\n@media (prefers-reduced-motion: reduce) { .rz-step--active .rz-step__dot::after { animation: none; border-color: var(--signal); } }\n@keyframes rz-spin { to { transform: rotate(360deg); } }\n.rz-step--failed .rz-step__dot { background: var(--status-down); border-color: var(--status-down); color: #fff; }\n.rz-step__text { display: flex; flex-direction: column; gap: 1px; padding-right: 16px; }\n.rz-step__label { font-size: .875rem; font-weight: 500; color: var(--text-secondary); }\n.rz-step--active .rz-step__label, .rz-step--done .rz-step__label { color: var(--text-primary); }\n.rz-step--failed .rz-step__label { color: var(--status-down); }\n.rz-step__note { font-size: .75rem; color: var(--text-muted); }\n@keyframes rz-pulse { 0%, 100% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--signal) 18%, transparent); } 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--signal) 8%, transparent); } }\n.rz-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 20px; }\n.rz-actions__hint { font-size: .8rem; color: var(--text-muted); }\n.rz-notice { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface-1); margin-bottom: 18px; font-size: .9rem; }\n.rz-notice__text { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }\n.rz-status-link { text-decoration: none; }\n.rz-discard { margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--separator); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: .85rem; color: var(--text-secondary); }\n.rz-discard__link { background: none; border: 0; padding: 0; font: inherit; font-size: .85rem; color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.rz-discard__link:hover { color: var(--status-down); }\n.rz-nowrap { white-space: nowrap; }\n.rz-table td.rz-fit, .rz-table th.rz-fit { width: 1%; white-space: nowrap; }\n.rz-empty { border: 1px dashed var(--border); border-radius: 8px; padding: 32px; text-align: center; color: var(--text-secondary); }\n.rz-empty h3 { font-size: 1rem; margin-bottom: .4rem; }\n.rz-table-wrap { width: 100%; }\n.rz-table { width: 100%; border-collapse: collapse; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }\n.rz-table th, .rz-table td { text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--separator); font-size: .875rem; vertical-align: top; }\n.rz-table th { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; color: var(--text-muted); background: var(--surface-2); }\n.rz-table tr:last-child td { border-bottom: 0; }\n.rz-muted { color: var(--text-muted); }\n.rz-alert { border: 1px solid var(--status-down); color: var(--status-down); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n.rz-ok { border: 1px solid var(--status-up); color: var(--signal-dim); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n\n/* ---- account menu --------------------------------------------------- */\n.rz-avatar__img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }\n.rz-tabs { display: flex; gap: .25rem; border-bottom: 1px solid var(--border); margin: 0 0 1.5rem; flex-wrap: wrap; }\n.rz-tabs__tab { padding: .55rem .9rem; font: inherit; font-size: .88rem; color: var(--text-secondary); background: none; border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; cursor: pointer; }\n.rz-tabs__tab:hover { color: var(--text-primary); }\n.rz-tabs__tab[aria-selected=\"true\"] { color: var(--text-primary); border-bottom-color: var(--signal); font-weight: 600; }\n.rz-tabs__tab:focus-visible { outline: 2px solid var(--signal); outline-offset: -2px; border-radius: 4px; }\n.rz-avatar { width: 2rem; height: 2rem; border-radius: 50%; background: var(--surface-3); border: 1px solid var(--border); color: var(--text-primary); font-size: .6875rem; font-weight: 600; letter-spacing: .04em; display: flex; align-items: center; justify-content: center; cursor: pointer; font-family: inherit; padding: 0; overflow: hidden; }\n.rz-menu { position: absolute; right: 0; top: calc(100% + 8px); min-width: 15rem; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; box-shadow: 0 8px 24px rgba(14,23,38,.14); overflow: hidden; z-index: 50; }\n.rz-menu__who { padding: .75rem .9rem; border-bottom: 1px solid var(--border); margin-bottom: .3rem; }\n.rz-menu__name { font-weight: 600; font-size: .875rem; }\n.rz-menu__email { color: var(--text-muted); font-size: .75rem; word-break: break-all; }\n.rz-menu__sep { height: 1px; background: var(--border); margin: .3rem 0; }\n.rz-menu__item { display: flex; align-items: center; gap: .55rem; width: 100%; padding: .45rem .9rem; font: inherit; font-size: .8125rem; color: var(--text-secondary); background: none; border: 0; text-align: left; cursor: pointer; text-decoration: none; }\n.rz-menu__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-menu__item svg { flex-shrink: 0; }\n.rz-menu__item--static { cursor: default; }\n.rz-menu__item--static:hover { background: none; color: var(--text-secondary); }\n.rz-menu__item .rz-menu__end { margin-left: auto; }\n.rz-menu__signout { margin: 0 0 .3rem; }\n.rz-seg { display: inline-flex; border: 1px solid var(--border); border-radius: var(--rz-radius); overflow: hidden; }\n.rz-seg button { font: inherit; font-size: .75rem; padding: .15rem .55rem; line-height: 1.3; background: transparent; color: var(--text-secondary); border: 0; cursor: pointer; }\n.rz-seg button[aria-pressed=\"true\"] { background: var(--surface-3); color: var(--text-primary); }\n\n/* ---- mobile: sidebar becomes a strip under the top bar --------------- */\n@media (max-width: 720px) {\n .rz-body { flex-direction: column; }\n .rz-sidebar, .rz-sidebar--collapsed { width: 100%; border-right: 0; border-bottom: 1px solid var(--border); flex-direction: row; }\n .rz-sidebar__nav { display: flex; padding: .35rem .25rem; overflow-x: auto; }\n .rz-sidebar__item { flex-direction: column; gap: .2rem; font-size: .6875rem; padding: .4rem .6rem; border-radius: 6px; }\n .rz-sidebar--collapsed .rz-sidebar__label { display: block; }\n .rz-sidebar__collapse { display: none; }\n .rz-sidebar__pinned { display: flex; border-top: 0; padding: .35rem .25rem; }\n .rz-topbar__greeting { display: none; }\n .rz-content { padding: 18px 14px 60px; }\n /* The sidebar is a top strip now, so it must not be sticky-height; the topbar stays pinned. */\n .rz-sidebar, .rz-sidebar--collapsed { position: static; height: auto; }\n .rz-sidebar__item--disabled { display: none; }\n /* Save bar: bleed matches the narrower content padding; stack status above the buttons. */\n .rz-content .realiiz-form__bar { margin: 18px -14px -60px; padding: 10px 14px; flex-wrap: wrap; }\n .rz-content .realiiz-form__status { flex-basis: 100%; margin-right: 0; font-size: .8rem; }\n /* Editor toolbar wraps; the Insert group drops its label and left rule to save width. */\n .rz-admin .realiiz-md__head { padding: 5px; }\n .rz-admin .realiiz-md__insert { border-left: 0; padding-left: 0; margin-left: 0; }\n .rz-admin .realiiz-md__lab { display: none; }\n .rz-admin .realiiz-md--fs { padding: 8px; }\n /* Tracker: notes hide, labels shrink, so three steps fit a phone. */\n .rz-step__note { display: none; }\n .rz-step__label { font-size: .8rem; }\n .rz-step:not(:last-child)::after { right: 6px; }\n /* Tables scroll sideways inside their own box instead of stretching the page. */\n .rz-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n .rz-pagehead { align-items: flex-start; flex-direction: column; }\n .rz-notice { flex-direction: column; align-items: flex-start; }\n .rz-card--narrow { max-width: none; }\n}\n\n/* ---- forms extras: markdown editor, chips, gauges, preview prose --------- */\n.rz-admin .realiiz-md { --_md-head: var(--surface-2); --_md-hover: var(--surface-2); --_md-hover-line: var(--signal-glow); --_md-on: color-mix(in srgb, var(--signal) 12%, var(--surface-1)); --_md-tip: var(--ink); }\n.rz-admin .realiiz-md__mode { background: var(--surface-2); }\n.rz-admin .realiiz-md__mode button { color: var(--text-secondary); }\n.rz-admin .realiiz-md__mode button[aria-selected=\"true\"] { background: var(--surface-1); color: var(--text-primary); box-shadow: 0 1px 2px rgba(14,23,38,.12); }\n.rz-admin .realiiz-md__panel, .rz-admin .realiiz-md__tgrid, .rz-admin .realiiz-md--fs, .rz-admin .realiiz-md .realiiz-md__ta, .rz-admin .realiiz-md__preview, .rz-admin .realiiz-md__head button { background: var(--surface-1); }\n.rz-admin .realiiz-md__head { background: var(--surface-2); }\n.rz-admin .realiiz-md__head button { color: var(--text-primary); }\n.rz-admin .realiiz-md__insert button { background: var(--surface-2); color: var(--text-secondary); }\n.rz-admin .realiiz-md__tgcells i { background: var(--surface-1); }\n.rz-admin .realiiz-md__tgcells i.hot { background: color-mix(in srgb, var(--signal) 18%, var(--surface-1)); }\n.rz-admin .realiiz-md__loading { color: var(--text-muted); font-size: .8rem; }\n.rz-admin .realiiz-prose { max-width: 68ch; font-size: 1rem; line-height: 1.65; color: var(--text-primary); }\n.rz-admin .realiiz-prose h1, .rz-admin .realiiz-prose h2, .rz-admin .realiiz-prose h3 { font-family: var(--rz-font-display); line-height: 1.25; margin: 1.4em 0 .5em; }\n.rz-admin .realiiz-prose h2 { font-size: 1.35rem; } .rz-admin .realiiz-prose h3 { font-size: 1.1rem; }\n.rz-admin .realiiz-prose p, .rz-admin .realiiz-prose ul, .rz-admin .realiiz-prose ol, .rz-admin .realiiz-prose blockquote { margin: 0 0 1em; }\n.rz-admin .realiiz-prose a { color: var(--signal); }\n/* The site's prose class picks a slate body color for a light page; on the dark surface that reads as disabled. */\n.rz-admin[data-theme=\"dark\"] .realiiz-prose, .rz-admin[data-theme=\"dark\"] .realiiz-prose :is(p, li, td, th, dd, dt, figcaption, strong, b, em, i, h1, h2, h3, h4, h5, h6) { color: var(--text-primary); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose :is(code, kbd) { color: var(--text-primary); background: var(--surface-3); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose a { color: var(--signal-dim); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose hr { border-color: var(--border); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose blockquote { color: var(--text-secondary); }\n.rz-admin .realiiz-prose blockquote { border-left: 3px solid var(--border); padding-left: 1em; color: var(--text-secondary); }\n.rz-admin .realiiz-prose code { background: var(--surface-2); padding: 0 4px; border-radius: 4px; font-family: var(--rz-font-mono); font-size: .9em; }\n.rz-admin .realiiz-prose pre { background: var(--surface-2); padding: 12px 14px; border-radius: 6px; overflow-x: auto; }\n.rz-admin .realiiz-prose img { max-width: 100%; height: auto; border-radius: 6px; }\n.rz-admin .realiiz-chips { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; min-height: 40px; padding: 5px 8px; background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--rz-radius); }\n.rz-admin .realiiz-chips:focus-within { border-color: var(--signal); box-shadow: var(--realiiz-form-focus-ring); }\n.rz-admin .realiiz-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 4px 2px 9px; background: var(--surface-3); border: 1px solid var(--border); border-radius: 999px; font-size: .8rem; color: var(--text-primary); }\n.rz-admin .realiiz-chip button { font: inherit; line-height: 1; width: 18px; height: 18px; border-radius: 50%; border: 0; background: transparent; color: var(--text-muted); cursor: pointer; }\n.rz-admin .realiiz-chip button:hover { background: var(--status-down); color: #fff; }\n.rz-admin .realiiz-chips__input { flex: 1; min-width: 120px; border: 0; background: transparent; font: inherit; color: inherit; outline: none; padding: 4px; }\n.rz-admin .realiiz-chips__count { margin-left: auto; color: var(--text-muted); font-size: .75rem; font-variant-numeric: tabular-nums; }\n.rz-admin .realiiz-gauge { color: var(--text-muted); }\n.rz-admin .realiiz-gauge__bar { background: var(--surface-3); }\n.rz-admin .realiiz-gauge__zone { background: color-mix(in srgb, var(--status-up) 28%, transparent); }\n.rz-admin .realiiz-gauge__fill { background: var(--text-muted); }\n.rz-admin .realiiz-gauge--ok .realiiz-gauge__fill { background: var(--status-up); } .rz-admin .realiiz-gauge--ok { color: var(--status-up); }\n.rz-admin .realiiz-gauge--over .realiiz-gauge__fill { background: var(--status-down); } .rz-admin .realiiz-gauge--over { color: var(--status-down); }\n";
|
|
143
|
+
declare const SHELL_CSS = "\n.rz-admin, .rz-admin[data-theme=\"light\"] {\n /* realiiz.com palette (src/app/globals.css): ink, bone, paper, signal blue, slate, line, amber */\n --ink: #0e1726; --bone: #f7f5f0; --signal: #1f6feb;\n --surface-0: #f7f5f0; --surface-1: #ffffff; --surface-2: #f1eee7; --surface-3: #e8e4da;\n --text-primary: #0e1726; --text-secondary: #5b6678; --text-muted: #8a93a5;\n --signal-dim: #1a63d8; --signal-glow: #5b9bff; --signal-warn: #e0a03b; --series-blue: #1f6feb;\n --border: #d9d4c8; --separator: #e9e5dc;\n --status-up: #15803d; --status-down: #dc2626; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin[data-theme=\"dark\"] { color-scheme: dark; }\n.rz-admin[data-theme=\"dark\"] {\n --ink: #eef0f5; --bone: #1b2334; --signal: #3b82f6;\n --surface-0: #1b2334; --surface-1: #222c42; --surface-2: #29344a; --surface-3: #36415c;\n --text-primary: #eef0f5; --text-secondary: #a2abbf; --text-muted: #77819a;\n --signal-dim: #8db4ff; --signal-glow: #aec9ff; --signal-warn: #eab058; --series-blue: #3b82f6;\n --border: #36415c; --separator: #2c3750;\n --status-up: #4ade80; --status-down: #f87171; --status-neutral: var(--text-muted); --status-blocked: var(--border);\n --signal-fg: #ffffff;\n}\n.rz-admin {\n --rz-font: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n --rz-font-display: var(--rz-font);\n --rz-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;\n --rz-radius: 6px;\n --rz-sidebar: 220px; --rz-sidebar-collapsed: 58px; --rz-topbar: 52px;\n\n /* forms-ui speaks these; map them once so both packages agree */\n --realiiz-form-fg: var(--text-primary); --realiiz-form-muted: var(--text-muted);\n --realiiz-form-border: var(--border); --realiiz-form-accent: var(--signal);\n --realiiz-form-accent-fg: var(--signal-fg); --realiiz-form-danger: var(--status-down);\n --realiiz-form-radius: var(--rz-radius); --realiiz-form-font: var(--rz-font);\n --realiiz-form-focus-ring: 0 0 0 3px color-mix(in srgb, var(--signal) 25%, transparent);\n\n box-sizing: border-box; min-height: 100vh; display: flex; flex-direction: column;\n background: var(--surface-0); color: var(--text-primary);\n font-family: var(--rz-font); font-size: 14px; line-height: 1.45;\n}\n.rz-admin *, .rz-admin *::before, .rz-admin *::after { box-sizing: inherit; }\n.rz-admin a { color: inherit; }\n.rz-admin h1, .rz-admin h2, .rz-admin h3 { font-family: var(--rz-font-display); color: var(--text-primary); margin: 0; }\n.rz-admin .realiiz-form__control { background: var(--surface-0); }\n.rz-admin .realiiz-image { background: var(--surface-0); }\n.rz-admin .realiiz-image__thumb { background: var(--surface-2); }\n.rz-admin[data-theme=\"dark\"] .realiiz-form__control::-webkit-calendar-picker-indicator { filter: invert(1) opacity(.7); }\n.rz-admin .realiiz-form__button { background: var(--surface-1); color: var(--text-primary); }\n.rz-admin .realiiz-form__button--primary { background: var(--signal); color: var(--signal-fg); }\n\n/* ---- frame ---------------------------------------------------------- */\n.rz-topbar { height: var(--rz-topbar); display: flex; align-items: center; gap: 1rem; padding: 0 1.25rem; border-bottom: 1px solid var(--border); background: var(--surface-1); flex-shrink: 0; }\n.rz-topbar__brand { display: flex; align-items: center; gap: .6rem; font-weight: 600; font-size: .9375rem; text-decoration: none; }\n.rz-topbar__logo { height: 22px; width: auto; display: block; }\n.rz-topbar__product { font-weight: 400; color: var(--text-secondary); }\n.rz-topbar__brand .rz-arrow { color: var(--text-muted); opacity: 0; transition: opacity .15s, transform .15s; }\n.rz-topbar__brand:hover .rz-arrow { opacity: 1; }\n.rz-topbar__right { margin-left: auto; display: flex; align-items: center; gap: 1rem; }\n.rz-topbar__greeting { color: var(--text-secondary); font-size: .8rem; }\n.rz-body { display: flex; flex: 1; min-height: 0; }\n/* Top bar and sidebar stay put while the content scrolls, so Collapse is always at the bottom-left. */\n.rz-topbar { position: sticky; top: 0; z-index: 20; }\n.rz-sidebar { position: sticky; top: var(--rz-topbar); height: calc(100vh - var(--rz-topbar)); width: var(--rz-sidebar); flex-shrink: 0; border-right: 1px solid var(--border); background: var(--surface-1); display: flex; flex-direction: column; transition: width .15s ease; overflow: hidden; }\n.rz-sidebar--collapsed { width: var(--rz-sidebar-collapsed); }\n.rz-sidebar__nav { padding: .75rem 0; flex: 1; overflow-y: auto; }\n.rz-sidebar__item { display: flex; align-items: center; gap: .65rem; padding: .55rem 1rem; color: var(--text-secondary); text-decoration: none; font-size: .875rem; font-weight: 400; white-space: nowrap; overflow: hidden; }\n.rz-sidebar__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-sidebar__item--active { background: var(--surface-2); color: var(--signal); font-weight: 500; }\n.rz-sidebar__item--disabled, .rz-sidebar__item--disabled:hover { color: var(--text-muted); opacity: .55; background: transparent; cursor: default; }\n.rz-sidebar--collapsed .rz-sidebar__item { justify-content: center; padding: .55rem 0; }\n.rz-sidebar--collapsed .rz-sidebar__label { display: none; }\n.rz-sidebar__pinned { border-top: 1px solid var(--separator); padding: .3rem 0; }\n.rz-sidebar__collapse { display: flex; align-items: center; gap: .7rem; padding: .6rem 1rem; border: 0; border-top: 1px solid var(--separator); background: transparent; color: var(--text-muted); cursor: pointer; font: inherit; font-size: .8rem; text-align: left; }\n.rz-sidebar__collapse:hover { color: var(--text-primary); }\n.rz-sidebar__collapse svg { flex-shrink: 0; }\n.rz-sidebar--collapsed .rz-sidebar__collapse { justify-content: center; padding: .6rem 0; }\n.rz-main { flex: 1; min-width: 0; }\n.rz-content { max-width: 1400px; margin: 0; padding: 28px 32px 80px; }\n.rz-content .realiiz-form { max-width: none; }\n.rz-content .realiiz-form fieldset, .rz-content .realiiz-form__alert, .rz-content .realiiz-form__actions { max-width: 920px; }\n/* The form's save bar pins to the bottom of the content column: bleed out over .rz-content's padding, then pad back in. */\n.rz-content .realiiz-form__bar { position: sticky; bottom: 0; z-index: 10; margin: 24px -32px -80px; padding: 12px 32px; background: var(--surface-1); border-top: 1px solid var(--border); box-shadow: 0 -6px 16px rgba(14,23,38,.05); }\n.rz-content .realiiz-form__status { color: var(--text-muted); }\n.rz-content .realiiz-form__bar[data-dirty] .realiiz-form__status { color: var(--text-primary); font-weight: 500; }\n\n/* ---- primitives ----------------------------------------------------- */\n/* Same metrics as the form's Save button (.realiiz-form__button) so every button in the admin matches. */\n.rz-btn { font-family: inherit; font-weight: 600; border-radius: var(--rz-radius); cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: .4rem; white-space: nowrap; line-height: 1.2; }\n.rz-btn--md { padding: 10px 16px; font-size: 15px; min-height: 40px; }\n.rz-btn--sm { padding: 6px 12px; font-size: 13px; min-height: 32px; }\n.rz-admin .rz-btn--primary, .rz-admin a.rz-btn--primary { background: var(--signal); color: var(--signal-fg); border: 1px solid var(--signal); }\n.rz-admin .rz-btn--secondary, .rz-admin a.rz-btn--secondary { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn--danger, .rz-admin a.rz-btn--danger { background: transparent; color: var(--status-down); border: 1px solid var(--status-down); }\n.rz-admin .rz-btn--ghost, .rz-admin a.rz-btn--ghost { background: var(--surface-1); color: var(--text-primary); border: 1px solid var(--border); }\n.rz-admin .rz-btn:disabled { opacity: .55; cursor: default; }\n.rz-arrow { width: 1.1em; height: 1.1em; flex-shrink: 0; transition: transform .15s ease-out; }\n@media (prefers-reduced-motion: no-preference) {\n .rz-btn:hover .rz-arrow, a:hover .rz-arrow { transform: translate(2px, -2px); }\n .rz-btn:hover .rz-arrow--fwd, a:hover .rz-arrow--fwd { transform: translateX(4px); }\n}\n.rz-card { display: flex; flex-direction: column; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; padding: 18px 20px; }\n.rz-card--narrow { max-width: 760px; }\n.rz-card__title { font-size: .9375rem; font-weight: 600; margin-bottom: .35rem; }\n.rz-card__meta { color: var(--text-muted); font-size: .8rem; }\n.rz-card__actions { display: flex; gap: .5rem; margin-top: auto; padding-top: .9rem; flex-wrap: wrap; }\n.rz-card__note { margin-top: .5rem; }\n.rz-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }\n.rz-pagehead { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }\n.rz-pagehead__eyebrow { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .08em; color: var(--text-muted); margin-bottom: .3rem; }\n.rz-pagehead h1 { font-size: 1.375rem; font-weight: 600; }\n.rz-pagehead__sub { color: var(--text-secondary); font-size: .85rem; margin-top: .25rem; }\n.rz-pill { display: inline-flex; align-items: center; gap: .4rem; white-space: nowrap; font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; padding: .15rem .5rem; border: 1px solid var(--border); border-radius: 999px; color: var(--text-secondary); }\n.rz-pill::before { content: \"\"; width: 7px; height: 7px; border-radius: 50%; background: var(--status-neutral); }\n.rz-pill--up::before { background: var(--status-up); } .rz-pill--warn::before { background: var(--signal-warn); } .rz-pill--down::before { background: var(--status-down); }\n.rz-pill--plain::before { display: none; }\n/* ---- steps tracker ------------------------------------------------- */\n/* Dots on one rail, connectors dot-to-dot, label under each dot; left-aligned like the rest of the page. */\n.rz-steps { list-style: none; margin: 4px 0 22px; padding: 0 0 22px; display: flex; border-bottom: 1px solid var(--separator); }\n.rz-step { flex: 1; position: relative; display: flex; flex-direction: column; align-items: flex-start; text-align: left; gap: 8px; min-width: 0; }\n.rz-step:last-child { flex: 0 0 auto; }\n.rz-step:not(:last-child)::after { content: \"\"; position: absolute; top: 12px; left: 26px; right: 0; height: 2px; background: var(--border); }\n.rz-step--done:not(:last-child)::after { background: var(--status-up); }\n.rz-step__dot { width: 26px; height: 26px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 600; flex-shrink: 0; border: 2px solid var(--border); color: var(--text-muted); background: var(--surface-1); }\n.rz-step--done .rz-step__dot { background: var(--status-up); border-color: var(--status-up); color: #fff; }\n.rz-step--active .rz-step__dot { position: relative; border-color: color-mix(in srgb, var(--signal) 30%, transparent); color: var(--signal); }\n/* A spinning arc over the ring: the step is working, not waiting on you. */\n.rz-step--active .rz-step__dot::after { content: \"\"; position: absolute; inset: -2px; border-radius: 50%; border: 2px solid transparent; border-top-color: var(--signal); animation: rz-spin .9s linear infinite; }\n@media (prefers-reduced-motion: reduce) { .rz-step--active .rz-step__dot::after { animation: none; border-color: var(--signal); } }\n@keyframes rz-spin { to { transform: rotate(360deg); } }\n.rz-step--failed .rz-step__dot { background: var(--status-down); border-color: var(--status-down); color: #fff; }\n.rz-step__text { display: flex; flex-direction: column; gap: 1px; padding-right: 16px; }\n.rz-step__label { font-size: .875rem; font-weight: 500; color: var(--text-secondary); }\n.rz-step--active .rz-step__label, .rz-step--done .rz-step__label { color: var(--text-primary); }\n.rz-step--failed .rz-step__label { color: var(--status-down); }\n.rz-step__note { font-size: .75rem; color: var(--text-muted); }\n@keyframes rz-pulse { 0%, 100% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--signal) 18%, transparent); } 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--signal) 8%, transparent); } }\n.rz-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 20px; }\n.rz-actions__hint { font-size: .8rem; color: var(--text-muted); }\n.rz-notice { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface-1); margin-bottom: 18px; font-size: .9rem; }\n.rz-notice__text { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }\n.rz-status-link { text-decoration: none; }\n.rz-discard { margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--separator); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: .85rem; color: var(--text-secondary); }\n.rz-discard__link { background: none; border: 0; padding: 0; font: inherit; font-size: .85rem; color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.rz-discard__link:hover { color: var(--status-down); }\n.rz-nowrap { white-space: nowrap; }\n.rz-table td.rz-fit, .rz-table th.rz-fit { width: 1%; white-space: nowrap; }\n.rz-empty { border: 1px dashed var(--border); border-radius: 8px; padding: 32px; text-align: center; color: var(--text-secondary); }\n.rz-empty h3 { font-size: 1rem; margin-bottom: .4rem; }\n.rz-table-wrap { width: 100%; }\n.rz-table { width: 100%; border-collapse: collapse; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }\n.rz-table th, .rz-table td { text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--separator); font-size: .875rem; vertical-align: top; }\n.rz-table th { font-family: var(--rz-font-mono); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; color: var(--text-muted); background: var(--surface-2); }\n.rz-table tr:last-child td { border-bottom: 0; }\n.rz-muted { color: var(--text-muted); }\n.rz-alert { border: 1px solid var(--status-down); color: var(--status-down); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n.rz-ok { border: 1px solid var(--status-up); color: var(--signal-dim); border-radius: var(--rz-radius); padding: 12px 14px; margin: 0 0 16px; }\n\n/* ---- account menu --------------------------------------------------- */\n.rz-avatar__img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }\n.rz-tabs { display: flex; gap: .25rem; border-bottom: 1px solid var(--border); margin: 0 0 1.5rem; flex-wrap: wrap; }\n.rz-tabs__tab { padding: .55rem .9rem; font: inherit; font-size: .88rem; color: var(--text-secondary); background: none; border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; cursor: pointer; }\n.rz-tabs__tab:hover { color: var(--text-primary); }\n.rz-tabs__tab[aria-selected=\"true\"] { color: var(--text-primary); border-bottom-color: var(--signal); font-weight: 600; }\n.rz-tabs__tab:focus-visible { outline: 2px solid var(--signal); outline-offset: -2px; border-radius: 4px; }\n.rz-avatar { width: 2rem; height: 2rem; border-radius: 50%; background: var(--surface-3); border: 1px solid var(--border); color: var(--text-primary); font-size: .6875rem; font-weight: 600; letter-spacing: .04em; display: flex; align-items: center; justify-content: center; cursor: pointer; font-family: inherit; padding: 0; overflow: hidden; }\n.rz-menu { position: absolute; right: 0; top: calc(100% + 8px); min-width: 15rem; background: var(--surface-1); border: 1px solid var(--border); border-radius: 8px; box-shadow: 0 8px 24px rgba(14,23,38,.14); overflow: hidden; z-index: 50; }\n.rz-menu__who { padding: .75rem .9rem; border-bottom: 1px solid var(--border); margin-bottom: .3rem; }\n.rz-menu__name { font-weight: 600; font-size: .875rem; }\n.rz-menu__email { color: var(--text-muted); font-size: .75rem; word-break: break-all; }\n.rz-menu__sep { height: 1px; background: var(--border); margin: .3rem 0; }\n.rz-menu__item { display: flex; align-items: center; gap: .55rem; width: 100%; padding: .45rem .9rem; font: inherit; font-size: .8125rem; color: var(--text-secondary); background: none; border: 0; text-align: left; cursor: pointer; text-decoration: none; }\n.rz-menu__item:hover { background: var(--surface-2); color: var(--text-primary); }\n.rz-menu__item svg { flex-shrink: 0; }\n.rz-menu__item--static { cursor: default; }\n.rz-menu__item--static:hover { background: none; color: var(--text-secondary); }\n.rz-menu__item .rz-menu__end { margin-left: auto; }\n.rz-menu__signout { margin: 0 0 .3rem; }\n.rz-seg { display: inline-flex; border: 1px solid var(--border); border-radius: var(--rz-radius); overflow: hidden; }\n.rz-seg button { font: inherit; font-size: .75rem; padding: .15rem .55rem; line-height: 1.3; background: transparent; color: var(--text-secondary); border: 0; cursor: pointer; }\n.rz-seg button[aria-pressed=\"true\"] { background: var(--surface-3); color: var(--text-primary); }\n\n/* ---- mobile: sidebar becomes a strip under the top bar --------------- */\n@media (max-width: 720px) {\n .rz-body { flex-direction: column; }\n .rz-sidebar, .rz-sidebar--collapsed { width: 100%; border-right: 0; border-bottom: 1px solid var(--border); flex-direction: row; }\n .rz-sidebar__nav { display: flex; padding: .35rem .25rem; overflow-x: auto; }\n .rz-sidebar__item { flex-direction: column; gap: .2rem; font-size: .6875rem; padding: .4rem .6rem; border-radius: 6px; }\n .rz-sidebar--collapsed .rz-sidebar__label { display: block; }\n .rz-sidebar__collapse { display: none; }\n .rz-sidebar__pinned { display: flex; border-top: 0; padding: .35rem .25rem; }\n .rz-topbar__greeting { display: none; }\n .rz-content { padding: 18px 14px 60px; }\n /* The sidebar is a top strip now, so it must not be sticky-height; the topbar stays pinned. */\n .rz-sidebar, .rz-sidebar--collapsed { position: static; height: auto; }\n .rz-sidebar__item--disabled { display: none; }\n /* Save bar: bleed matches the narrower content padding; stack status above the buttons. */\n .rz-content .realiiz-form__bar { margin: 18px -14px -60px; padding: 10px 14px; flex-wrap: wrap; }\n .rz-content .realiiz-form__status { flex-basis: 100%; margin-right: 0; font-size: .8rem; }\n /* Editor toolbar wraps; the Insert group drops its label and left rule to save width. */\n .rz-admin .realiiz-md__head { padding: 5px; }\n .rz-admin .realiiz-md__insert { border-left: 0; padding-left: 0; margin-left: 0; }\n .rz-admin .realiiz-md__lab { display: none; }\n .rz-admin .realiiz-md--fs { padding: 8px; }\n /* Tracker: notes hide, labels shrink, so three steps fit a phone. */\n .rz-step__note { display: none; }\n .rz-step__label { font-size: .8rem; }\n .rz-step:not(:last-child)::after { right: 6px; }\n /* Tables scroll sideways inside their own box instead of stretching the page. */\n .rz-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n .rz-pagehead { align-items: flex-start; flex-direction: column; }\n .rz-notice { flex-direction: column; align-items: flex-start; }\n .rz-card--narrow { max-width: none; }\n}\n\n/* ---- forms extras: markdown editor, chips, gauges, preview prose --------- */\n.rz-admin .realiiz-md { --_md-head: var(--surface-2); --_md-hover: var(--surface-2); --_md-hover-line: var(--signal-glow); --_md-on: color-mix(in srgb, var(--signal) 12%, var(--surface-1)); --_md-tip: var(--ink); }\n.rz-admin .realiiz-md__mode { background: var(--surface-2); }\n.rz-admin .realiiz-md__mode button { color: var(--text-secondary); }\n.rz-admin .realiiz-md__mode button[aria-selected=\"true\"] { background: var(--surface-1); color: var(--text-primary); box-shadow: 0 1px 2px rgba(14,23,38,.12); }\n.rz-admin .realiiz-md__panel, .rz-admin .realiiz-md__tgrid, .rz-admin .realiiz-md--fs, .rz-admin .realiiz-md .realiiz-md__ta, .rz-admin .realiiz-md__preview, .rz-admin .realiiz-md__head button { background: var(--surface-1); }\n.rz-admin .realiiz-md__head { background: var(--surface-2); }\n.rz-admin .realiiz-md__head button { color: var(--text-primary); }\n.rz-admin .realiiz-md__insert button { background: var(--surface-2); color: var(--text-secondary); }\n.rz-admin .realiiz-md__tgcells i { background: var(--surface-1); }\n.rz-admin .realiiz-md__tgcells i.hot { background: color-mix(in srgb, var(--signal) 18%, var(--surface-1)); }\n.rz-admin .realiiz-md__loading { color: var(--text-muted); font-size: .8rem; }\n.rz-admin .realiiz-prose { max-width: 68ch; font-size: 1rem; line-height: 1.65; color: var(--text-primary); }\n.rz-admin .realiiz-prose h1, .rz-admin .realiiz-prose h2, .rz-admin .realiiz-prose h3 { font-family: var(--rz-font-display); line-height: 1.25; margin: 1.4em 0 .5em; }\n.rz-admin .realiiz-prose h2 { font-size: 1.35rem; } .rz-admin .realiiz-prose h3 { font-size: 1.1rem; }\n.rz-admin .realiiz-prose p, .rz-admin .realiiz-prose ul, .rz-admin .realiiz-prose ol, .rz-admin .realiiz-prose blockquote { margin: 0 0 1em; }\n.rz-admin .realiiz-prose a { color: var(--signal); }\n/* The site's prose class picks a slate body color for a light page; on the dark surface that reads as disabled. */\n.rz-admin[data-theme=\"dark\"] .realiiz-prose, .rz-admin[data-theme=\"dark\"] .realiiz-prose :is(p, li, td, th, dd, dt, figcaption, strong, b, em, i, h1, h2, h3, h4, h5, h6) { color: var(--text-primary); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose :is(code, kbd) { color: var(--text-primary); background: var(--surface-3); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose a { color: var(--signal-dim); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose hr { border-color: var(--border); }\n.rz-admin[data-theme=\"dark\"] .realiiz-prose blockquote { color: var(--text-secondary); }\n.rz-admin .realiiz-prose blockquote { border-left: 3px solid var(--border); padding-left: 1em; color: var(--text-secondary); }\n.rz-admin .realiiz-prose code { background: var(--surface-2); padding: 0 4px; border-radius: 4px; font-family: var(--rz-font-mono); font-size: .9em; }\n.rz-admin .realiiz-prose pre { background: var(--surface-2); padding: 12px 14px; border-radius: 6px; overflow-x: auto; }\n.rz-admin .realiiz-prose img { max-width: 100%; height: auto; border-radius: 6px; }\n.rz-admin .realiiz-chips { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; min-height: 40px; padding: 5px 8px; background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--rz-radius); }\n.rz-admin .realiiz-chips:focus-within { border-color: var(--signal); box-shadow: var(--realiiz-form-focus-ring); }\n.rz-admin .realiiz-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 4px 2px 9px; background: var(--surface-3); border: 1px solid var(--border); border-radius: 999px; font-size: .8rem; color: var(--text-primary); }\n.rz-admin .realiiz-chip button { font: inherit; line-height: 1; width: 18px; height: 18px; border-radius: 50%; border: 0; background: transparent; color: var(--text-muted); cursor: pointer; }\n.rz-admin .realiiz-chip button:hover { background: var(--status-down); color: #fff; }\n.rz-admin .realiiz-chips__input { flex: 1; min-width: 120px; border: 0; background: transparent; font: inherit; color: inherit; outline: none; padding: 4px; }\n.rz-admin .realiiz-chips__count { margin-left: auto; color: var(--text-muted); font-size: .75rem; font-variant-numeric: tabular-nums; }\n.rz-admin .realiiz-gauge { color: var(--text-muted); }\n.rz-admin .realiiz-gauge__bar { background: var(--surface-3); }\n.rz-admin .realiiz-gauge__zone { background: color-mix(in srgb, var(--status-up) 28%, transparent); }\n.rz-admin .realiiz-gauge__fill { background: var(--text-muted); }\n.rz-admin .realiiz-gauge--ok .realiiz-gauge__fill { background: var(--status-up); } .rz-admin .realiiz-gauge--ok { color: var(--status-up); }\n.rz-admin .realiiz-gauge--over .realiiz-gauge__fill { background: var(--status-down); } .rz-admin .realiiz-gauge--over { color: var(--status-down); }\n";
|
|
140
144
|
|
|
141
145
|
/**
|
|
142
146
|
* Tabs — which SECTION of this page am I on (Account: My Profile · Change
|