rootzz-layout 0.1.2 → 0.1.4
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/dist/index.cjs +1 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +1 -2
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +13 -32
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -578,11 +578,10 @@ function AppsMenu({ source = true, label = "Aplicativos", title = "Aplicativos"
|
|
|
578
578
|
{
|
|
579
579
|
align: "start",
|
|
580
580
|
ariaLabel: title,
|
|
581
|
-
panelWidth:
|
|
581
|
+
panelWidth: 400,
|
|
582
582
|
panelClassName: "rootzz-apps",
|
|
583
583
|
renderTrigger: ({ toggle, triggerProps }) => /* @__PURE__ */ jsxRuntime.jsx(IconButton, { onClick: toggle, "aria-label": label, title: label, ...triggerProps, children: /* @__PURE__ */ jsxRuntime.jsx(AppsGridIcon, { size: 22 }) }),
|
|
584
584
|
children: [
|
|
585
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rootzz-apps__title", children: title }),
|
|
586
585
|
loading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rootzz-apps__status", children: "Carregando\u2026" }),
|
|
587
586
|
error && !loading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rootzz-apps__status", children: "N\xE3o foi poss\xEDvel carregar os aplicativos." }),
|
|
588
587
|
!loading && !error && items.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rootzz-apps__grid rootzz-scrollbar-none", children: items.map((app, index) => /* @__PURE__ */ jsxRuntime.jsxs(
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/useControllableState.ts","../src/context/LayoutContext.tsx","../src/lib/cx.ts","../src/components/Content.tsx","../src/context/SidebarContext.tsx","../src/lib/icons.tsx","../src/components/IconButton.tsx","../src/lib/usePresence.ts","../src/components/Overlay.tsx","../src/components/SidebarItem.tsx","../src/components/SidebarGroup.tsx","../src/components/Sidebar.tsx","../src/lib/useApps.ts","../src/lib/useDismiss.ts","../src/components/Dropdown.tsx","../src/components/AppsMenu.tsx","../src/components/Brand.tsx","../src/components/ThemeToggle.tsx","../src/components/UserMenu.tsx","../src/components/Topbar.tsx","../src/components/RootzzLayout.tsx","../src/components/SearchBar.tsx"],"names":["useState","useRef","useCallback","createContext","useContext","useEffect","useMemo","jsx","cx","jsxs","forwardRef","IconButton","Fragment","useId","isValidElement","Children","SearchBar"],"mappings":";;;;;;AAMO,SAAS,qBAAwB,OAAA,EAOM;AAC5C,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAc,QAAA,EAAS,GAAI,OAAA;AAC1C,EAAA,MAAM,eAAe,KAAA,KAAU,MAAA;AAE/B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAY,YAAY,CAAA;AAGxD,EAAA,MAAM,WAAA,GAAcC,aAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,MAAM,OAAA,GAAU,eAAgB,KAAA,GAAc,QAAA;AAC9C,EAAA,MAAM,UAAA,GAAaA,aAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,EAAA,MAAM,QAAA,GAAWC,iBAAA;AAAA,IACf,CAAC,IAAA,KAA+B;AAC9B,MAAA,MAAM,WACJ,OAAO,IAAA,KAAS,aACX,IAAA,CAAwB,UAAA,CAAW,OAAO,CAAA,GAC3C,IAAA;AAEN,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,MACtB;AACA,MAAA,IAAI,QAAA,KAAa,WAAW,OAAA,EAAS;AACnC,QAAA,WAAA,CAAY,UAAU,QAAQ,CAAA;AAAA,MAChC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,OAAO,CAAC,SAAS,QAAQ,CAAA;AAC3B;AChCA,IAAM,YAAA,GAAe,uBAAA;AAmBrB,IAAM,aAAA,GAAgBC,oBAAyC,IAAI,CAAA;AAG5D,SAAS,SAAA,GAAgC;AAC9C,EAAA,MAAM,GAAA,GAAMC,iBAAW,aAAa,CAAA;AACpC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,qEAAqE,CAAA;AAAA,EACvF;AACA,EAAA,OAAO,GAAA;AACT;AAUO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,KAAA,EAAO,SAAA;AAAA,EACP,YAAA,GAAe,OAAA;AAAA,EACf,aAAA;AAAA,EACA,aAAA,GAAgB;AAClB,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,oBAAA,CAAgC;AAAA,IACxD,KAAA,EAAO,SAAA;AAAA,IACP,YAAA,EAAc,YAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIJ,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAG9C,EAAAK,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,UAAA,EAAY;AACzD,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC5C,IAAA,MAAA,EAAO;AACP,IAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACrC,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,MAAM,CAAA;AAAA,EACvD,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,UAAA,EAAY,aAAA,CAAc,KAAK,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAGzB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,QAAA,EAAU;AAC9B,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AACrC,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAAA,IACjC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEzB,EAAA,MAAM,WAAA,GAAcH,kBAAY,MAAM;AACpC,IAAA,QAAA,CAAS,KAAA,KAAU,MAAA,GAAS,OAAA,GAAU,MAAM,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEpB,EAAA,MAAM,KAAA,GAAQI,aAAA;AAAA,IACZ,OAAO;AAAA,MACL,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,UAAA,EAAY,UAAU,aAAa;AAAA,GACpE;AAEA,EAAA,uBAAOC,cAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OAAe,QAAA,EAAS,CAAA;AACzD;;;AChGO,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,MAAM,MAAgB,EAAC;AAEvB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AAC1D,MAAA,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACxB,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/B,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,GAAG,KAAK,CAAA;AACzB,MAAA,IAAI,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AACpC,MAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,QAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA,CAAI,KAAK,GAAG,CAAA;AACrB;ACjBO,SAAS,QAAQ,EAAE,QAAA,EAAU,UAAU,SAAA,EAAW,SAAA,GAAY,OAAM,EAAiB;AAC1F,EAAA,MAAM,WAAW,QAAA,KAAa,MAAA;AAC9B,EAAA,MAAM,QACJ,QAAA,KAAa,MAAA,IAAa,aAAa,KAAA,GAAQ,MAAA,GAAY,EAAE,QAAA,EAAS;AAExE,EAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBACd,QAAA,kBAAAA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,uBAAA;AAAA,QACA,QAAA,IAAY,4BAAA;AAAA,QACZ,CAAC,SAAA,IAAa,+BAAA;AAAA,QACd;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AC7BA,IAAM,cAAA,GAAiBJ,mBAAAA,CAAmC,EAAE,CAAA;AAErD,IAAM,kBAAkB,cAAA,CAAe,QAAA;AAEvC,SAAS,UAAA,GAAkC;AAChD,EAAA,OAAOC,iBAAW,cAAc,CAAA;AAClC;ACNA,SAAS,KAAK,EAAE,IAAA,GAAO,EAAA,EAAI,GAAG,OAAM,EAAc;AAChD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,WAAA;AAAA,IACT,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,4BAAA;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,SAAA,EAAW,KAAA;AAAA,IACX,GAAG;AAAA,GACL;AACF;AAIA,IAAM,MAAA,GAAS;AAAA,EACb,MAAA,EAAQ,cAAA;AAAA,EACR,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,OAAA;AAAA,EACf,cAAA,EAAgB;AAClB,CAAA;AAGO,SAAS,aAAa,KAAA,EAAkB;AAC7C,EAAA,MAAM,EAAA,GAAK,CAAC,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AACrB,EAAA,MAAM,EAAA,GAAK,CAAC,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AACrB,EAAA,uBACEG,cAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,CAAK,KAAK,GAChB,QAAA,EAAA,EAAA,CAAG,OAAA;AAAA,IAAQ,CAAC,OACX,EAAA,CAAG,GAAA,CAAI,CAACC,GAAAA,qBAAOD,eAAC,QAAA,EAAA,EAA2B,EAAA,EAAIC,KAAI,EAAA,EAAQ,CAAA,EAAG,GAAI,GAAG,MAAA,EAAA,EAAzC,GAAGA,GAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAsC,CAAE;AAAA,GACjF,EACF,CAAA;AAEJ;AAGO,SAAS,gBAAgB,KAAA,EAAkB;AAChD,EAAA,uBACED,cAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,KAAK,KAAK,CAAA,EACjB,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAgB,GAAG,QAAQ,CAAA,EACrC,CAAA;AAEJ;AAaO,SAAS,SAAS,KAAA,EAAkB;AACzC,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,KAAK,KAAK,CAAA,EACjB,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yBAAA,EAA2B,GAAG,QAAQ,CAAA,EAChD,CAAA;AAEJ;AAGO,SAAS,UAAU,KAAA,EAAkB;AAC1C,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,KAAK,KAAK,CAAA,EACjB,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAwB,GAAG,QAAQ,CAAA,EAC7C,CAAA;AAEJ;AAGO,SAAS,WAAW,KAAA,EAAkB;AAC3C,EAAA,uBACEE,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,CAAK,KAAK,CAAA,EACjB,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,YAAO,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAI,GAAG,MAAA,EAAQ,CAAA;AAAA,oBAC1CA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAkB,GAAG,MAAA,EAAQ;AAAA,GAAA,EACvC,CAAA;AAEJ;AAGO,SAAS,QAAQ,KAAA,EAAkB;AACxC,EAAA,uBACEE,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,CAAK,KAAK,CAAA,EACjB,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,YAAO,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,CAAA,EAAG,CAAA,EAAI,GAAG,MAAA,EAAQ,CAAA;AAAA,oBAC1CA,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,sHAAA;AAAA,QACD,GAAG;AAAA;AAAA;AACN,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,SAAS,KAAA,EAAkB;AACzC,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,KAAK,KAAK,CAAA,EACjB,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iDAAA,EAAmD,GAAG,QAAQ,CAAA,EACxE,CAAA;AAEJ;AC7FO,IAAM,UAAA,GAAaG,gBAAA,CAA+C,SAASC,WAAAA,CAChF,EAAE,QAAA,EAAU,KAAA,EAAO,IAAA,GAAO,EAAA,EAAI,WAAW,IAAA,GAAO,QAAA,EAAU,GAAG,IAAA,IAC7D,GAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAW,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,SAAS,KAAA,KAAU,IAAA;AACrE,EAAA,MAAM,QAAQ,KAAA,KAAU,IAAA;AAExB,EAAA,uBACEF,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,MACnC,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS,CAAA;AAAA,MAC5C,GAAG,IAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA,4BACCF,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,2BAAA;AAAA,cACA,QAAQ,gCAAA,GAAmC;AAAA,aAC7C;AAAA,YAEC,WAAC,KAAA,IAAS;AAAA;AAAA;AACb;AAAA;AAAA,GAEJ;AAEJ,CAAC;AC7BM,SAAS,WAAA,CAAY,IAAA,EAAe,QAAA,GAAW,GAAA,EAAe;AACnE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIP,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,IAAI,CAAA;AAEzC,EAAAK,gBAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,UAAA,CAAW,IAAI,CAAA;AAEf,MAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,MAAM,SAAA,CAAU,IAAI,CAAC,CAAA;AACvD,MAAA,OAAO,MAAM,qBAAqB,GAAG,CAAA;AAAA,IACvC;AACA,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAK,GAAG,QAAQ,CAAA;AAC1D,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEnB,EAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAC3B;ACvBO,SAAS,OAAA,CAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,WAAU,EAAiB;AAClE,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,YAAY,IAAI,CAAA;AAC5C,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,uBACEE,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,UAAA,EAAS,SAAA;AAAA,MACT,aAAA,EAAW,IAAA;AAAA,MACX,OAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,gBAAA;AAAA,QACA,SAAS,wBAAA,GAA2B,0BAAA;AAAA,QACpC;AAAA;AACF;AAAA,GACF;AAEJ;ACdO,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,MAAA,GAAS,OAAM,EAAqB;AACtE,EAAA,MAAM,EAAE,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,aAAA,KAAkB,SAAA,EAAU;AACnE,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,UAAA,EAAW;AAEjC,EAAA,MAAM,WAAW,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,IAAA,IAAQ,KAAK,GAAA,KAAQ,SAAA,CAAA;AAEnE,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAsB;AACzC,IAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AAEpB,IAAA,IAAI,QAAA,gBAAwB,KAAK,CAAA;AAAA,EACnC,CAAA;AAGA,EAAA,MAAM,SAAA,GAAY,EAAA;AAAA,IAChB,qBAAA;AAAA,IACA,MAAA,IAAU,6BAAA;AAAA,IACV,KAAK,QAAA,IAAY,+BAAA;AAAA,IACjB,QAAA,IAAY;AAAA,GACd;AAEA,EAAA,MAAM,OAAA,mBACJE,eAAAA,CAAAG,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,wBAAQL,cAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EAA6B,eAAK,IAAA,EAAK,CAAA;AAAA,oBACrEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,eAAK,KAAA,EAAM,CAAA;AAAA,IACxD,IAAA,CAAK,SAAS,IAAA,oBAAQA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM;AAAA,GAAA,EAClF,CAAA;AAGF,EAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,CAAC,IAAA,CAAK,QAAA,EAAU;AAC/B,IAAA,uBACEA,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAA,EAAS,WAAA;AAAA,QACT,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,QAClC,SAAA;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,WAAA;AAAA,MACT,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,MAClC,SAAA;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;ACtDO,SAAS,YAAA,CAAa,EAAE,KAAA,EAAM,EAAsB;AACzD,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,UAAA,EAAW;AACjC,EAAA,MAAM,WAAA,GAAc,MAAM,WAAA,IAAe,IAAA;AACzC,EAAA,MAAM,CAAC,WAAW,YAAY,CAAA,GAAIP,eAAS,WAAA,GAAe,KAAA,CAAM,gBAAA,IAAoB,KAAA,GAAS,KAAK,CAAA;AAClG,EAAA,MAAM,IAAA,GAAO,WAAA,GAAc,CAAC,SAAA,GAAY,IAAA;AACxC,EAAA,MAAM,WAAWa,WAAA,EAAM;AAGvB,EAAA,MAAM,cAAA,GAAiB,MAAM,KAAA,CAAM,IAAA;AAAA,IACjC,CAAC,EAAA,KAAO,EAAA,CAAG,UAAW,SAAA,IAAa,IAAA,IAAQ,GAAG,GAAA,KAAQ;AAAA,GACxD;AAEA,EAAA,MAAM,MAAA,mBACJJ,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,wBAAQF,cAAAA,CAAC,UAAK,SAAA,EAAU,4BAAA,EAA8B,gBAAM,IAAA,EAAK,CAAA;AAAA,oBACxEA,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,6BAAA;AAAA,UACA,cAAA,IAAkB;AAAA,SACpB;AAAA,QAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,KACT;AAAA,IACC,+BACCA,cAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,EAAA;AAAA,QACN,SAAA,EAAW,EAAA;AAAA,UACT,+BAAA;AAAA,UACA,IAAA,IAAQ;AAAA;AACV;AAAA;AACF,GAAA,EAEJ,CAAA;AAGF,EAAA,uBACEE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,WAAA,mBACCF,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,YAAA,CAAa,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QACrC,eAAA,EAAe,IAAA;AAAA,QACf,eAAA,EAAe,QAAA;AAAA,QACf,SAAA,EAAU,+BAAA;AAAA,QAET,QAAA,EAAA;AAAA;AAAA,KACH,GAEA,MAAA;AAAA,oBAKFA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,QAAA;AAAA,QACJ,eAAa,CAAC,IAAA;AAAA,QACd,SAAA,EAAW,EAAA;AAAA,UACT,8BAAA;AAAA,UACA,IAAA,IAAQ;AAAA,SACV;AAAA,QAEA,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,IAAA,qBAChBA,cAAAA,CAAC,WAAA,EAAA,EAA2B,IAAA,EAAY,MAAA,EAAM,IAAA,EAAA,EAA5B,IAAA,CAAK,GAAwB,CAChD,CAAA,EACH,CAAA,EACF;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACrDA,SAAS,WAAA,CAAY,OAAiB,KAAA,EAAe;AACnD,EAAA,IAAK,KAAA,CAA4B,SAAS,SAAA,EAAW;AACnD,IAAA,uBAAOA,eAAC,KAAA,EAAA,EAAgE,SAAA,EAAU,yBAAhE,KAAA,CAA2B,GAAA,IAAO,CAAA,QAAA,EAAW,KAAK,CAAA,CAAoC,CAAA;AAAA,EAC1G;AACA,EAAA,IAAK,KAAA,CAA4B,SAAS,OAAA,EAAS;AACjD,IAAA,MAAM,KAAA,GAAQ,KAAA;AACd,IAAA,uBAAOA,cAAAA,CAAC,YAAA,EAAA,EAA6B,KAAA,EAAA,EAAX,MAAM,GAAmB,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,IAAA,GAAO,KAAA;AACb,EAAA,uBAAOA,cAAAA,CAAC,WAAA,EAAA,EAA2B,IAAA,EAAA,EAAV,KAAK,GAAiB,CAAA;AACjD;AAEA,SAAS,GAAA,CAAI;AAAA,EACX,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAgF;AAC9E,EAAA,uBACEE,eAAAA,CAAC,KAAA,EAAA,EAAI,cAAY,SAAA,IAAa,2BAAA,EAAuB,WAAU,YAAA,EAC5D,QAAA,EAAA;AAAA,IAAA,MAAA,oBAAUF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAsB,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,oBAEvDA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACZ,QAAA,EAAA,QAAA,oBAAYA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EAAoB,QAAA,EAAA,IAAA,EAAM,GAAA,CAAI,WAAW,GAAE,CAAA,EACzE,CAAA;AAAA,IAEC,0BAAUA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAsB,QAAA,EAAA,MAAA,EAAO;AAAA,GAAA,EACzD,CAAA;AAEJ;AAOO,SAAS,OAAA,CAAQ;AAAA,EACtB,IAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,EAAE,UAAA,EAAY,aAAA,EAAc,GAAI,SAAA,EAAU;AAGhD,EAAAF,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,aAAA,CAAc,KAAK,CAAA;AAAA,IAC7C,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,UAAA,EAAY,aAAa,CAAC,CAAA;AAE9B,EAAA,MAAM,WAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,WAAW,QAAA,EAAS;AAE7D,EAAA,uBACEI,eAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAO,EAAE,WAAU,EAElC,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,OAAA,EAAA,EAAM,UAAA,EAAS,SAAA,EAAU,WAAW,EAAA,CAAG,gBAAA,EAAkB,SAAS,CAAA,EACjE,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAK,GAAG,UAAU,CAAA,EACrB,CAAA;AAAA,oBAGAA,eAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,YAAY,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA,EAAG,CAAA;AAAA,oBAChEE,eAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAS,QAAA;AAAA,QACT,YAAA,EAAY,aAAa,MAAA,GAAS,QAAA;AAAA,QAClC,eAAa,CAAC,UAAA;AAAA,QACd,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,UAAA,IAAc,uBAAuB,SAAS,CAAA;AAAA,QAE7E,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,4BACpDA,cAAAA,CAAC,UAAA,EAAA,EAAW,YAAA,EAAW,eAAc,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,GACrE,QAAA,kBAAAA,cAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,IAAI,CAAA,EACvB;AAAA,WAAA,EACF,CAAA;AAAA,0BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,0BAAAA,cAAAA,CAAC,GAAA,EAAA,EAAK,GAAG,QAAA,EAAU,CAAA,EACrB;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACnHO,IAAM,gBAAA,GAAmB;AAGhC,IAAM,KAAA,uBAAY,GAAA,EAAgC;AAElD,SAAS,UAAU,GAAA,EAAiC;AAClD,EAAA,IAAI,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,KAAA,CAAM,GAAG,CAAA,CAChB,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,eAAA,CAAiB,CAAA;AAChE,MAAA,OAAO,IAAI,IAAA,EAAK;AAAA,IAClB,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,SAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAK,OAAqB,EAAG,CAAA,CAC/D,KAAA,CAAM,CAAC,GAAA,KAAQ;AAEd,MAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAChB,MAAA,MAAM,GAAA;AAAA,IACR,CAAC,CAAA;AACH,IAAA,KAAA,CAAM,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,OAAA;AACT;AAOA,SAAS,cAAc,MAAA,EAAgD;AACrE,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,KAAK,IAAA,EAAK;AACnD,EAAA,IAAI,WAAW,IAAA,EAAM,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,KAAK,gBAAA,EAAiB;AACvE,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,KAAK,MAAA,EAAO;AACxE,EAAA,IAAI,KAAA,CAAM,QAAQ,MAAM,CAAA,SAAU,EAAE,WAAA,EAAa,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAK;AACnE,EAAA,IAAI,MAAA,CAAO,OAAO,OAAO,EAAE,aAAa,MAAA,CAAO,KAAA,EAAO,KAAK,IAAA,EAAK;AAChE,EAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,GAAA,EAAK,MAAA,CAAO,OAAO,gBAAA,EAAiB;AAClE;AAYO,SAAS,QAAQ,MAAA,EAA+C;AACrE,EAAA,MAAM,EAAE,WAAA,EAAa,GAAA,EAAI,GAAI,cAAc,MAAM,CAAA;AAEjD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIP,cAAAA,CAAoB,WAAA,IAAe,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,SAAS,UAAU,CAAA,GAAIA,eAAkB,CAAC,CAAC,GAAA,IAAO,CAAC,WAAW,CAAA;AACrE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAAK,gBAAU,MAAM;AACd,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,QAAA,CAAS,WAAW,CAAA;AACpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,SAAA,CAAU,GAAG,CAAA,CACV,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAe;AACrB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,QAAA,CAAS,GAAG,CAAA;AACZ,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,GAAS,KAAA;AAAA,IACX,CAAA;AAAA,EAGF,GAAG,CAAC,GAAA,EAAK,cAAc,WAAA,CAAY,MAAA,GAAS,IAAI,CAAC,CAAA;AAEjD,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM;AACjC;AAiBO,SAAS,cAAA,CACd,WAAA,EACA,GAAA,GAAc,gBAAA,EACQ;AACtB,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIL,eAAyB,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,IAAIA,cAAAA,CAAkB,CAAC,CAAC,WAAW,CAAA;AAC7D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAAK,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAA,CAAO,IAAI,CAAA;AACX,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,SAAA,CAAU,GAAG,CAAA,CACV,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,IAAA,KAAS,KAAK,WAAA,KAAgB,WAAW,KAAK,IAAI,CAAA;AACpE,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAe;AACrB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,QAAA,CAAS,GAAG,CAAA;AACZ,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,GAAS,KAAA;AAAA,IACX,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,GAAG,CAAC,CAAA;AAErB,EAAA,OAAO,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAM;AAC/B;AChJO,SAAS,UAAA,CACd,IAAA,EACA,IAAA,EACA,SAAA,EACM;AACN,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAC,CAAA;AAC7E,MAAA,IAAI,CAAC,QAAQ,SAAA,EAAU;AAAA,IACzB,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,SAAA,EAAU;AAAA,IACxC,CAAA;AAGA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,aAAA,EAAe,IAAI,CAAA;AAC5D,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAE9C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,aAAA,EAAe,IAAI,CAAA;AAC/D,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,SAAA,EAAW,IAAI,CAAC,CAAA;AAC5B;ACMO,SAAS,QAAA,CAAS;AAAA,EACvB,aAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR,cAAA;AAAA,EACA,UAAA;AAAA,EACA,mBAAA,GAAsB,IAAA;AAAA,EACtB,SAAA;AAAA,EACA,IAAA,EAAM,QAAA;AAAA,EACN;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,oBAAA,CAAqB;AAAA,IAC3C,KAAA,EAAO,QAAA;AAAA,IACP,YAAA,EAAc,KAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,YAAA,GAAeJ,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,UAAUY,WAAAA,EAAM;AACtB,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,YAAY,IAAI,CAAA;AAE5C,EAAA,UAAA,CAAW,MAAM,CAAC,YAAY,GAAG,MAAM,OAAA,CAAQ,KAAK,CAAC,CAAA;AAErD,EAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAEtC,EAAA,uBACEJ,eAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,WAAU,iBAAA,EAC/B,QAAA,EAAA;AAAA,IAAA,aAAA,CAAc;AAAA,MACb,IAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,eAAA,EAAiB,MAAA;AAAA,QACjB,eAAA,EAAiB,IAAA;AAAA,QACjB,eAAA,EAAiB;AAAA;AACnB,KACD,CAAA;AAAA,IAEA,2BACCF,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAY,SAAA;AAAA,QACZ,OAAA,EAAS,MAAM,mBAAA,IAAuB,OAAA,CAAQ,KAAK,CAAA;AAAA,QACnD,OAAO,UAAA,KAAe,MAAA,GAAY,EAAE,KAAA,EAAO,YAAW,GAAI,MAAA;AAAA,QAC1D,SAAA,EAAW,EAAA;AAAA,UACT,wBAAA;AAAA,UACA,KAAA,KAAU,QAAQ,6BAAA,GAAgC,+BAAA;AAAA,UAClD,SAAS,gCAAA,GAAmC,kCAAA;AAAA,UAC5C;AAAA,SACF;AAAA,QAEC;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ;AClFO,SAAS,QAAA,CAAS,EAAE,MAAA,GAAS,IAAA,EAAM,QAAQ,aAAA,EAAe,KAAA,GAAQ,eAAc,EAAkB;AACvG,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM,GAAI,QAAQ,MAAM,CAAA;AAGhD,EAAA,IAAI,MAAA,KAAW,OAAO,OAAO,IAAA;AAE7B,EAAA,uBACEE,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,OAAA;AAAA,MACN,SAAA,EAAW,KAAA;AAAA,MACX,UAAA,EAAY,GAAA;AAAA,MACZ,cAAA,EAAe,aAAA;AAAA,MACf,aAAA,EAAe,CAAC,EAAE,MAAA,EAAQ,cAAa,qBACrCF,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,cAAY,KAAA,EAAO,KAAA,EAAO,OAAQ,GAAG,YAAA,EAChE,0BAAAA,cAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,CAAA,EAC1B,CAAA;AAAA,MAGF,QAAA,EAAA;AAAA,wBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAE1C,2BAAWA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAsB,QAAA,EAAA,kBAAA,EAAW,CAAA;AAAA,QAE3D,KAAA,IAAS,CAAC,OAAA,oBACTA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAsB,QAAA,EAAA,iDAAA,EAAyC,CAAA;AAAA,QAG/E,CAAC,OAAA,IAAW,CAAC,KAAA,IAAS,KAAA,CAAM,SAAS,CAAA,oBACpCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yCAAA,EACZ,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,GAAA,EAAK,0BACfE,eAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YAEC,MAAM,GAAA,CAAI,GAAA;AAAA,YACV,KAAA,EAAO,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,KAAA;AAAA,YAC9B,IAAA,EAAK,UAAA;AAAA,YACL,SAAA,EAAU,mBAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,KAAI,EAAA,EAAG,SAAA,EAAU,mBAAA,EAAoB,OAAA,EAAQ,MAAA,EAAO,CAAA;AAAA,8BACxEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,cAAI,KAAA,EAAM;AAAA;AAAA,WAAA;AAAA,UAP3C,IAAI,WAAA,IAAe,CAAA,EAAG,GAAA,CAAI,KAAK,IAAI,KAAK,CAAA;AAAA,SAShD,CAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;AC/BA,IAAM,YAAA,GAA2B;AAAA,EAC/B,GAAA,EAAK,gDAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,MAAA,EAAQ;AACV,CAAA;AAGA,SAAS,kBAAkB,KAAA,EAAiC;AAC1D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAM,IAAA,EAAK,CAAE,aAAY,KAAM,SAAA;AACrE;AAEA,SAAS,aAAa,KAAA,EAAqC;AACzD,EAAA,OACE,OAAO,UAAU,QAAA,IACjB,KAAA,KAAU,QACV,CAACO,oBAAA,CAAe,KAAK,CAAA,IACrB,KAAA,IAAU,KAAA;AAEd;AAEA,SAAS,IAAA,CAAK,EAAE,IAAA,EAAK,EAAqC;AACxD,EAAA,MAAM,EAAE,aAAA,EAAe,IAAA,EAAK,GAAI,SAAA,EAAU;AAE1C,EAAA,IAAI,YAAA,CAAa,IAAI,CAAA,EAAG;AACtB,IAAA,MAAM,GAAA,mBACJP,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,IAAA,CAAK,GAAA,IAAO,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAG9E,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,uBACEA,cAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,SAAA,EAAU,yBAAA,EACrD,QAAA,EAAA,GAAA,EACH,CAAA;AAAA,IAEJ;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,uBACEA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAS,IAAA,CAAK,OAAA,EAAS,SAAA,EAAU,yBAAA,EACpD,QAAA,EAAA,GAAA,EACH,CAAA;AAAA,IAEJ;AACA,IAAA,uBAAOA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA2B,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,EACxD;AAEA,EAAA,uBAAOA,cAAAA,CAAAK,mBAAAA,EAAA,EAAG,QAAA,EAAA,IAAA,EAAK,CAAA;AACjB;AAGA,SAAS,gBAAA,CAAiB,EAAE,WAAA,EAAY,EAA4B;AAClE,EAAA,MAAM,EAAE,aAAA,EAAe,IAAA,EAAK,GAAI,SAAA,EAAU;AAC1C,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,cAAA,CAAe,WAAW,CAAA;AAE1C,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,uBACEH,eAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,GAAA,CAAI,KAAK,SAAA,EAAU,mBAAA,EAAoB,KAAA,EAAO,GAAA,CAAI,KAAA,EAC5D,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,SAAI,GAAA,EAAK,GAAA,CAAI,MAAM,GAAA,EAAK,GAAA,CAAI,KAAA,EAAO,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,oBACvEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,cAAI,KAAA,EAAM;AAAA,GAAA,EACtD,CAAA;AAEJ;AAGO,SAAS,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,WAAU,EAAe;AAGxE,EAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,IAAI,CAAA,GAAI,YAAA,GAAe,IAAA;AAE9D,EAAA,uBACEE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,QAAA,EAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,OAAO,SAAA,EAAW,CAAA;AAAA,IACzC,WAAA,mBACCA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBACd,QAAA,kBAAAA,cAAAA,CAAC,gBAAA,EAAA,EAAiB,WAAA,EAA0B,CAAA,EAC9C,CAAA,GAEA,gBAAgB,IAAA,oBACdA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EACd,0BAAAA,cAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,YAAA,EAAc,CAAA,EAC5B;AAAA,GAAA,EAGN,CAAA;AAEJ;ACxGO,SAAS,WAAA,CAAY,EAAE,KAAA,GAAQ,eAAA,EAAgB,EAAqB;AACzE,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,SAAA,EAAU;AACzC,EAAA,MAAM,SAAS,KAAA,KAAU,MAAA;AAEzB,EAAA,uBACEA,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,WAAA,EAAa,YAAA,EAAY,KAAA,EAAO,KAAA,EAAO,KAAA,EAC1D,QAAA,kBAAAE,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,qBAAA,EACd,QAAA,EAAA;AAAA,oBAAAF,eAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,IAAI,SAAA,EAAW,MAAA,CAAO,MAAM,CAAA,EAAG,CAAA;AAAA,oBAC9CA,eAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAI,SAAA,EAAW,MAAA,CAAO,CAAC,MAAM,CAAA,EAAG;AAAA,GAAA,EAClD,CAAA,EACF,CAAA;AAEJ;AAGA,SAAS,OAAO,OAAA,EAA0B;AACxC,EAAA,OAAO;AAAA,IACL,2BAAA;AAAA,IACA,UAAU,oCAAA,GAAuC;AAAA,GACnD,CAAE,KAAK,GAAG,CAAA;AACZ;ACpBA,SAAS,gBAAgB,IAAA,EAAsB;AAC7C,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC/B,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,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,WAAA,EAAY;AAChE;AAEA,SAAS,MAAA,CAAO,EAAE,IAAA,EAAM,IAAA,GAAO,IAAG,EAAwC;AACxE,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,eAAA,CAAgB,KAAK,IAAI,CAAA;AAC3D,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,uBACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAK,IAAA,CAAK,SAAA;AAAA,QACV,KAAK,IAAA,CAAK,IAAA;AAAA,QACV,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,QACnC,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,EAEJ;AACA,EAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,MAAC,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK,EAAG,SAAA,EAAU,yCAC/D,QAAA,EAAA,QAAA,EACH,CAAA;AAEJ;AAEA,SAAS,UAAU,KAAA,EAAkE;AACnF,EAAA,OAAQ,MAA4B,IAAA,KAAS,SAAA;AAC/C;AAGO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAK,EAAkB;AAChD,EAAA,MAAM,EAAE,aAAA,EAAe,IAAA,EAAK,GAAI,SAAA,EAAU;AAC1C,EAAA,MAAM,UAAU,CAAC,CAAC,KAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,MAAA,GAAS,CAAA;AAElD,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,qBACfE,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,OAAA;AAAA,MACpC,GAAI,KAAA,EAAO,YAAA,IAAgB,EAAC;AAAA,MAC7B,SAAA,EAAU,aAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC,UAAO,IAAA,EAAY,CAAA;AAAA,wBACpBA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,eAAK,IAAA,EAAK,CAAA;AAAA,QAC9C,2BAAWA,cAAAA,CAAC,mBAAgB,IAAA,EAAM,EAAA,EAAI,WAAU,sBAAA,EAAuB;AAAA;AAAA;AAAA,GAC1E;AAGF,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,OAAA,EAAQ;AAAA,EACjB;AAEA,EAAA,uBACEE,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,CAAA,QAAA,EAAW,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,MAC/B,UAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAe,CAAC,EAAE,MAAA,EAAQ,YAAA,OAAmB,OAAA,CAAQ,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAA;AAAA,MAE7E,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,0BAAAF,cAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAY,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,0BAC9BE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA2B,eAAK,IAAA,EAAK,CAAA;AAAA,YACnD,IAAA,CAAK,yBAASA,cAAAA,CAAC,SAAI,SAAA,EAAU,0BAAA,EAA4B,eAAK,KAAA,EAAM;AAAA,WAAA,EACvE;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,QAE/B,IAAA,CAAK,IAAA,CAAM,GAAA,CAAI,CAAC,OAAO,KAAA,KAAU;AAChC,UAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG;AACpB,YAAA,uBAAOA,eAAC,KAAA,EAAA,EAA0C,SAAA,EAAU,oBAA3C,KAAA,CAAM,GAAA,IAAO,CAAA,QAAA,EAAW,KAAK,CAAA,CAA+B,CAAA;AAAA,UAC/E;AAEA,UAAA,MAAM,SAAA,GAAY,EAAA;AAAA,YAChB,kBAAA;AAAA,YACA,MAAM,QAAA,IAAY,4BAAA;AAAA,YAClB,MAAM,MAAA,IAAU;AAAA,WAClB;AAEA,UAAA,MAAM,OAAA,mBACJE,eAAAA,CAAAG,mBAAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,wBAAQL,cAAAA,CAAC,UAAK,SAAA,EAAU,wBAAA,EAA0B,gBAAM,IAAA,EAAK,CAAA;AAAA,4BACpEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA2B,gBAAM,KAAA,EAAM;AAAA,WAAA,EACzD,CAAA;AAGF,UAAA,IAAI,MAAM,IAAA,EAAM;AACd,YAAA,uBACEA,cAAAA,CAAC,IAAA,EAAA,EAA8B,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAA,EAAK,UAAA,EAAW,SAAA,EAAW,SAAA,EACzE,QAAA,EAAA,OAAA,EAAA,EADQ,KAAA,CAAM,OAAO,KAExB,CAAA;AAAA,UAEJ;AACA,UAAA,uBACEA,cAAAA,CAAC,QAAA,EAAA,EAAgC,IAAA,EAAK,UAAS,IAAA,EAAK,UAAA,EAAW,OAAA,EAAS,KAAA,CAAM,SAAS,SAAA,EAAW,SAAA,EAC/F,QAAA,EAAA,OAAA,EAAA,EADU,KAAA,CAAM,OAAO,KAE1B,CAAA;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,GACH;AAEJ;AC5EO,SAAS,MAAA,CAAO;AAAA,EACrB,IAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,cAAA,GAAiB,IAAA;AAAA,EACjB,SAAA;AAAA,EACA,eAAA,GAAkB,YAAA;AAAA,EAClB;AACF,CAAA,EAAgB;AACd,EAAA,MAAM,EAAE,UAAA,EAAY,aAAA,EAAc,GAAI,SAAA,EAAU;AAEhD,EAAA,uBACEE,eAAAA,CAAC,QAAA,EAAA,EAAO,WAAW,EAAA,CAAG,eAAA,EAAiB,SAAS,CAAA,EAE9C,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,cAAA,oBACCF,cAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,4BAAA;AAAA,UACV,YAAA,EAAY,eAAA;AAAA,UACZ,eAAA,EAAe,UAAA;AAAA,UACf,OAAA,EAAS,MAAM,aAAA,CAAc,CAAC,UAAU,CAAA;AAAA,UAExC,QAAA,kBAAAA,cAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,OACtB;AAAA,sBAEFA,cAAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAY,WAAA,EAA0B,MAAY,SAAA,EAAsB;AAAA,KAAA,EACjF,CAAA;AAAA,oBAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,QAAA,EAAA,MAAA,oBAAUA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,MAAA,EAAO,CAAA,EAC5D,CAAA;AAAA,oBAGAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MACA,eAAA,oBAAmBF,cAAAA,CAAC,WAAA,EAAA,EAAY,CAAA;AAAA,MAChC,IAAA,oBAAQA,cAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAY;AAAA,KAAA,EACjC;AAAA,GAAA,EACF,CAAA;AAEJ;ACvEA,SAAS,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,IAAG,EAAuE;AACrH,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,SAAA,EAAU;AAE5B,EAAA,MAAM,QAAQQ,cAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAOD,oBAAc,CAAA;AAC9D,EAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,MAAM,CAAA;AACpD,EAAA,MAAM,WAAW,KAAA,CAAM,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,OAAO,CAAA;AAEzD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,CAAC,EAAA,KAAO,GAAG,IAAA,KAAS,MAAA,IAAU,EAAA,CAAG,IAAA,KAAS,OAAO,CAAA;AAE3E,EAAA,uBACEL,eAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAQ,YAAA,EAAY,KAAA,EAAO,KAAA,EAAc,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,SAAS,CAAA,EACnF,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,oBACDA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA;AAAA,MACA;AAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AA8BA,SAAS,gBAAA,CAAiB;AAAA,EACxB,QAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,uBACEF,cAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MAEA,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAsB,KAAA,EAAc,IACxC,QAAA,EACH;AAAA;AAAA,GACF;AAEJ;AAOO,IAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,gBAAA,EAAkB;AAAA,EAC1D,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC;ACzEM,IAAM,SAAA,GAAYG,gBAAAA,CAA6C,SAASM,UAAAA,CAC7E,EAAE,WAAA,GAAc,cAAA,EAAW,QAAA,EAAU,gBAAA,EAAkB,SAAA,EAAW,GAAG,IAAA,IACrE,GAAA,EACA;AACA,EAAA,uBACEP,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,eAAA,EAAiB,gBAAgB,CAAA,EAClD,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI,WAAU,qBAAA,EAAsB,CAAA;AAAA,oBACtDA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,WAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,sBAAA,EAAwB,SAAS,CAAA;AAAA,QAC9C,GAAG;AAAA;AAAA,KACN;AAAA,IACC,YAAY,IAAA,oBAAQA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA2B,QAAA,EAAA,QAAA,EAAS;AAAA,GAAA,EAC1E,CAAA;AAEJ,CAAC","file":"index.cjs","sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\n/**\n * Estado que pode ser controlado (via prop) ou não-controlado (estado interno).\n * Espelha o padrão usado por bibliotecas como Radix/React Aria, sem dependências.\n */\nexport function useControllableState<T>(options: {\n /** Valor controlado. Se `undefined`, o estado é interno. */\n value?: T;\n /** Valor inicial quando não-controlado. */\n defaultValue: T;\n /** Notifica mudanças (em ambos os modos). */\n onChange?: (value: T) => void;\n}): [T, (next: T | ((prev: T) => T)) => void] {\n const { value, defaultValue, onChange } = options;\n const isControlled = value !== undefined;\n\n const [internal, setInternal] = useState<T>(defaultValue);\n\n // Mantém o onChange fresco sem recriar o setter.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const current = isControlled ? (value as T) : internal;\n const currentRef = useRef(current);\n currentRef.current = current;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === 'function'\n ? (next as (prev: T) => T)(currentRef.current)\n : next;\n\n if (!isControlled) {\n setInternal(resolved);\n }\n if (resolved !== currentRef.current) {\n onChangeRef.current?.(resolved);\n }\n },\n [isControlled],\n );\n\n return [current, setValue];\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport { useControllableState } from '../lib/useControllableState';\nimport type { LinkComponent, ThemeMode } from '../lib/types';\n\n/** Breakpoint mobile (abaixo do `md` do Tailwind). */\nconst MOBILE_QUERY = '(max-width: 767.98px)';\n\nexport interface LayoutContextValue {\n /** Tema atual. */\n theme: ThemeMode;\n /** Define o tema. */\n setTheme: (theme: ThemeMode) => void;\n /** Alterna entre claro e escuro. */\n toggleTheme: () => void;\n /** Drawer mobile aberto? */\n mobileOpen: boolean;\n /** Abre/fecha o drawer mobile. */\n setMobileOpen: (open: boolean) => void;\n /** Estamos em viewport mobile? */\n isMobile: boolean;\n /** Componente de link usado na navegação (padrão `<a>`). */\n linkComponent: LinkComponent;\n}\n\nconst LayoutContext = createContext<LayoutContextValue | null>(null);\n\n/** Acessa o estado do layout (tema, drawer mobile, etc.). */\nexport function useLayout(): LayoutContextValue {\n const ctx = useContext(LayoutContext);\n if (!ctx) {\n throw new Error('useLayout deve ser usado dentro de <RootzzLayout> ou <LayoutShell>.');\n }\n return ctx;\n}\n\nexport interface LayoutProviderProps {\n children: ReactNode;\n theme?: ThemeMode;\n defaultTheme?: ThemeMode;\n onThemeChange?: (theme: ThemeMode) => void;\n linkComponent?: LinkComponent;\n}\n\nexport function LayoutProvider({\n children,\n theme: themeProp,\n defaultTheme = 'light',\n onThemeChange,\n linkComponent = 'a',\n}: LayoutProviderProps) {\n const [theme, setTheme] = useControllableState<ThemeMode>({\n value: themeProp,\n defaultValue: defaultTheme,\n onChange: onThemeChange,\n });\n\n const [mobileOpen, setMobileOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n // Detecta viewport mobile (sem dependências, SSR-safe).\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const update = () => setIsMobile(mql.matches);\n update();\n mql.addEventListener('change', update);\n return () => mql.removeEventListener('change', update);\n }, []);\n\n // Ao sair do mobile, garante o drawer fechado.\n useEffect(() => {\n if (!isMobile && mobileOpen) setMobileOpen(false);\n }, [isMobile, mobileOpen]);\n\n // Trava o scroll do body enquanto o drawer mobile está aberto.\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (!mobileOpen || !isMobile) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = previous;\n };\n }, [mobileOpen, isMobile]);\n\n const toggleTheme = useCallback(() => {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }, [theme, setTheme]);\n\n const value = useMemo<LayoutContextValue>(\n () => ({\n theme,\n setTheme,\n toggleTheme,\n mobileOpen,\n setMobileOpen,\n isMobile,\n linkComponent,\n }),\n [theme, setTheme, toggleTheme, mobileOpen, isMobile, linkComponent],\n );\n\n return <LayoutContext.Provider value={value}>{children}</LayoutContext.Provider>;\n}\n","/**\n * Concatena classes condicionalmente. Substituto mínimo de `clsx` para manter\n * a biblioteca sem dependências de runtime.\n *\n * @example cx('rootzz-item', isActive && 'rootzz-item--active', { 'rootzz-hidden': hidden })\n */\nexport type ClassValue =\n | string\n | number\n | null\n | false\n | undefined\n | ClassValue[]\n | Record<string, boolean | null | undefined>;\n\nexport function cx(...inputs: ClassValue[]): string {\n const out: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === 'string' || typeof input === 'number') {\n out.push(String(input));\n } else if (Array.isArray(input)) {\n const inner = cx(...input);\n if (inner) out.push(inner);\n } else if (typeof input === 'object') {\n for (const key in input) {\n if (input[key]) out.push(key);\n }\n }\n }\n\n return out.join(' ');\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface ContentProps {\n children?: ReactNode;\n /**\n * Largura máxima do conteúdo. `false` ocupa 100%.\n * Omitido usa o token `--rzl-content-max-width`.\n */\n maxWidth?: number | string | false;\n /** Classe extra no wrapper interno. */\n className?: string;\n /** Remove o padding padrão. */\n noPadding?: boolean;\n}\n\n/** Área de conteúdo: rola verticalmente e centraliza/limita a largura do que for inserido. */\nexport function Content({ children, maxWidth, className, noPadding = false }: ContentProps) {\n const useToken = maxWidth === undefined;\n const style: CSSProperties | undefined =\n maxWidth === undefined || maxWidth === false ? undefined : { maxWidth };\n\n return (\n <main className=\"rootzz-content\">\n <div\n style={style}\n className={cx(\n 'rootzz-content__inner',\n useToken && 'rootzz-content__inner--max',\n !noPadding && 'rootzz-content__inner--padded',\n className,\n )}\n >\n {children}\n </div>\n </main>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Estado local da Sidebar (compartilhado com itens/grupos). */\nexport interface SidebarContextValue {\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({});\n\nexport const SidebarProvider = SidebarContext.Provider;\n\nexport function useSidebar(): SidebarContextValue {\n return useContext(SidebarContext);\n}\n","import type { SVGProps } from 'react';\n\n/**\n * Ícones SVG inline — evitam uma dependência de biblioteca de ícones.\n * Usam `currentColor`, então herdam a cor do texto via classes utilitárias.\n */\ntype IconProps = SVGProps<SVGSVGElement> & { size?: number | string };\n\nfunction base({ size = 20, ...props }: IconProps) {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n xmlns: 'http://www.w3.org/2000/svg',\n 'aria-hidden': true,\n focusable: false,\n ...props,\n } as SVGProps<SVGSVGElement>;\n}\n\n// Estilo lucide-react: viewBox 24, fill none, stroke currentColor, stroke-width 1.5,\n// linecap/linejoin round. Os paths abaixo são os mesmos dos ícones lucide.\nconst stroke = {\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\n/** Grade 9-pontos (botão de aplicativos) — lucide `Grip`. */\nexport function AppsGridIcon(props: IconProps) {\n const xs = [5, 12, 19];\n const ys = [5, 12, 19];\n return (\n <svg {...base(props)}>\n {ys.flatMap((cy) =>\n xs.map((cx) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r={1} {...stroke} />),\n )}\n </svg>\n );\n}\n\n/** Chevron para baixo — lucide `ChevronDown`. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"m6 9 6 6 6-6\" {...stroke} />\n </svg>\n );\n}\n\n/** Sino de notificações. */\nexport function BellIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9\" {...stroke} />\n <path d=\"M13.7 21a2 2 0 0 1-3.4 0\" {...stroke} />\n </svg>\n );\n}\n\n/** Menu hambúrguer (mobile). */\nexport function MenuIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M3 6h18M3 12h18M3 18h18\" {...stroke} />\n </svg>\n );\n}\n\n/** Fechar (X). */\nexport function CloseIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 6 6 18M6 6l12 12\" {...stroke} />\n </svg>\n );\n}\n\n/** Lupa de busca. */\nexport function SearchIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={11} cy={11} r={7} {...stroke} />\n <path d=\"m21 21-4.3-4.3\" {...stroke} />\n </svg>\n );\n}\n\n/** Sol (tema claro). */\nexport function SunIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={12} cy={12} r={4} {...stroke} />\n <path\n d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\n {...stroke}\n />\n </svg>\n );\n}\n\n/** Lua (tema escuro). */\nexport function MoonIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\" {...stroke} />\n </svg>\n );\n}\n\n/** Link externo (itens do menu de apps). */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M15 3h6v6M10 14 21 3M21 14v5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5\" {...stroke} />\n </svg>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Ícone/conteúdo central. */\n children: ReactNode;\n /** Conteúdo do badge (número ou nó). `true` exibe um ponto. */\n badge?: ReactNode | boolean;\n /** Tamanho do botão em px. Padrão: 40. */\n size?: number;\n}\n\n/**\n * Botão de ícone padronizado para a topbar (hover suave, foco acessível, badge opcional).\n * Útil também para montar suas próprias ações custom mantendo a consistência visual.\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { children, badge, size = 40, className, type = 'button', ...rest },\n ref,\n) {\n const hasBadge = badge !== undefined && badge !== false && badge !== null;\n const isDot = badge === true;\n\n return (\n <button\n ref={ref}\n type={type}\n style={{ width: size, height: size }}\n className={cx('rootzz-icon-button', className)}\n {...rest}\n >\n {children}\n {hasBadge && (\n <span\n className={cx(\n 'rootzz-icon-button__badge',\n isDot ? 'rootzz-icon-button__badge--dot' : 'rootzz-icon-button__badge--count',\n )}\n >\n {!isDot && badge}\n </span>\n )}\n </button>\n );\n});\n","import { useEffect, useState } from 'react';\n\nexport interface Presence {\n /** Deve renderizar no DOM? (permanece `true` durante a saída). */\n mounted: boolean;\n /** Estado visual para alternar classes de transição (entrada/saída). */\n active: boolean;\n}\n\n/**\n * Coordena enter/exit com transições CSS, sem libs de animação.\n * Mantém o elemento montado durante a saída para o fade-out acontecer.\n *\n * @param open estado desejado\n * @param duration ms que o elemento fica montado durante a saída (casa com --rzl-duration)\n */\nexport function usePresence(open: boolean, duration = 220): Presence {\n const [mounted, setMounted] = useState(open);\n const [active, setActive] = useState(open);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n // Próximo frame: ativa as classes \"abertas\" para a transição rodar.\n const raf = requestAnimationFrame(() => setActive(true));\n return () => cancelAnimationFrame(raf);\n }\n setActive(false);\n const timer = setTimeout(() => setMounted(false), duration);\n return () => clearTimeout(timer);\n }, [open, duration]);\n\n return { mounted, active };\n}\n","import { cx } from '../lib/cx';\nimport { usePresence } from '../lib/usePresence';\n\nexport interface OverlayProps {\n open: boolean;\n onClick?: () => void;\n className?: string;\n}\n\n/** Camada escura semitransparente (mobile), com fade in/out. */\nexport function Overlay({ open, onClick, className }: OverlayProps) {\n const { mounted, active } = usePresence(open);\n if (!mounted) return null;\n\n return (\n <div\n // Decorativo: o fechamento acessível é via Escape (useDismiss) e botões.\n data-rzl=\"overlay\"\n aria-hidden\n onClick={onClick}\n className={cx(\n 'rootzz-overlay',\n active ? 'rootzz-overlay--active' : 'rootzz-overlay--inactive',\n className,\n )}\n />\n );\n}\n","import type { MouseEvent } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport type { MenuLink } from '../lib/types';\n\nexport interface SidebarItemProps {\n item: MenuLink;\n /** Recuo extra (usado para itens dentro de grupos). */\n nested?: boolean;\n}\n\n/** Item simples (link) da sidebar, com estado ativo. */\nexport function SidebarItem({ item, nested = false }: SidebarItemProps) {\n const { linkComponent: Link, isMobile, setMobileOpen } = useLayout();\n const { activeKey } = useSidebar();\n\n const isActive = item.active ?? (activeKey != null && item.key === activeKey);\n\n const handleClick = (event: MouseEvent) => {\n item.onClick?.(event);\n // Em mobile, navegar fecha o drawer.\n if (isMobile) setMobileOpen(false);\n };\n\n // Itens aninhados recebem margem horizontal para o pill ficar mais estreito que o pai.\n const className = cx(\n 'rootzz-sidebar-item',\n nested && 'rootzz-sidebar-item--nested',\n item.disabled && 'rootzz-sidebar-item--disabled',\n isActive && 'rootzz-sidebar-item--active',\n );\n\n const content = (\n <>\n {item.icon && <span className=\"rootzz-sidebar-item__icon\">{item.icon}</span>}\n <span className=\"rootzz-sidebar-item__label\">{item.label}</span>\n {item.badge != null && <span className=\"rootzz-sidebar-item__badge\">{item.badge}</span>}\n </>\n );\n\n if (item.href && !item.disabled) {\n return (\n <Link\n href={item.href}\n target={item.target}\n onClick={handleClick}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </Link>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={item.disabled}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </button>\n );\n}\n","import { useId, useState } from 'react';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { MenuGroup } from '../lib/types';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarGroupProps {\n group: MenuGroup;\n}\n\n/** Grupo colapsável da sidebar (label em maiúsculas + chevron animado + altura animada). */\nexport function SidebarGroup({ group }: SidebarGroupProps) {\n const { activeKey } = useSidebar();\n const collapsible = group.collapsible ?? true;\n const [collapsed, setCollapsed] = useState(collapsible ? (group.defaultCollapsed ?? false) : false);\n const open = collapsible ? !collapsed : true;\n const regionId = useId();\n\n // Se algum filho está ativo, o label do grupo fica destacado (cor ativa).\n const hasActiveChild = group.items.some(\n (it) => it.active || (activeKey != null && it.key === activeKey),\n );\n\n const header = (\n <div className=\"rootzz-sidebar-group__header\">\n {group.icon && <span className=\"rootzz-sidebar-group__icon\">{group.icon}</span>}\n <span\n className={cx(\n 'rootzz-sidebar-group__label',\n hasActiveChild && 'rootzz-sidebar-group__label--active',\n )}\n >\n {group.label}\n </span>\n {collapsible && (\n <ChevronDownIcon\n size={16}\n className={cx(\n 'rootzz-sidebar-group__chevron',\n open && 'rootzz-sidebar-group__chevron--open',\n )}\n />\n )}\n </div>\n );\n\n return (\n <div className=\"rootzz-sidebar-group\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => setCollapsed((v) => !v)}\n aria-expanded={open}\n aria-controls={regionId}\n className=\"rootzz-sidebar-group__trigger\"\n >\n {header}\n </button>\n ) : (\n header\n )}\n\n {/* Altura animada via grid-template-rows (0fr → 1fr). Mantém o conteúdo\n montado para o colapso ser suave nos dois sentidos. */}\n <div\n id={regionId}\n aria-hidden={!open}\n className={cx(\n 'rootzz-sidebar-group__region',\n open && 'rootzz-sidebar-group__region--open',\n )}\n >\n <div className=\"rootzz-sidebar-group__clip\">\n <div className=\"rootzz-sidebar-group__items\">\n {group.items.map((item) => (\n <SidebarItem key={item.key} item={item} nested />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { SidebarProvider } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { CloseIcon } from '../lib/icons';\nimport type { MenuItem } from '../lib/types';\nimport { IconButton } from './IconButton';\nimport { Overlay } from './Overlay';\nimport { SidebarGroup } from './SidebarGroup';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarProps {\n /** Entradas do menu (links, grupos, divisores). */\n menu?: MenuItem[];\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n /** Conteúdo fixo no topo. */\n header?: ReactNode;\n /** Conteúdo fixo no rodapé. */\n footer?: ReactNode;\n /** Rótulo acessível da navegação. Padrão: \"Navegação principal\". */\n ariaLabel?: string;\n /** Conteúdo custom (substitui `menu` se quiser compor manualmente). */\n children?: ReactNode;\n className?: string;\n /** Título do drawer mobile. */\n mobileTitle?: ReactNode;\n}\n\nfunction renderEntry(entry: MenuItem, index: number) {\n if ((entry as { type?: string }).type === 'divider') {\n return <div key={(entry as { key?: string }).key ?? `divider-${index}`} className=\"rootzz-nav__divider\" />;\n }\n if ((entry as { type?: string }).type === 'group') {\n const group = entry as Extract<MenuItem, { type: 'group' }>;\n return <SidebarGroup key={group.key} group={group} />;\n }\n const item = entry as Extract<MenuItem, { type?: 'item' }>;\n return <SidebarItem key={item.key} item={item} />;\n}\n\nfunction Nav({\n menu,\n header,\n footer,\n ariaLabel,\n children,\n}: Pick<SidebarProps, 'menu' | 'header' | 'footer' | 'ariaLabel' | 'children'>) {\n return (\n <nav aria-label={ariaLabel ?? 'Navegação principal'} className=\"rootzz-nav\">\n {header && <div className=\"rootzz-nav__header\">{header}</div>}\n\n <div className=\"rootzz-nav__scroll rootzz-scrollbar-none\">\n {children ?? <div className=\"rootzz-nav__list\">{menu?.map(renderEntry)}</div>}\n </div>\n\n {footer && <div className=\"rootzz-nav__footer\">{footer}</div>}\n </nav>\n );\n}\n\n/**\n * Sidebar de navegação.\n * - Desktop (≥768px): coluna fixa com largura `--rzl-sidebar-width`.\n * - Mobile (<768px): drawer off-canvas com overlay e fade/slide suaves.\n */\nexport function Sidebar({\n menu,\n activeKey,\n header,\n footer,\n ariaLabel,\n children,\n className,\n mobileTitle,\n}: SidebarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n // Escape fecha o drawer no mobile.\n useEffect(() => {\n if (!mobileOpen) return;\n if (typeof document === 'undefined') return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n const navProps = { menu, header, footer, ariaLabel, children };\n\n return (\n <SidebarProvider value={{ activeKey }}>\n {/* Desktop: coluna estática */}\n <aside data-rzl=\"sidebar\" className={cx('rootzz-sidebar', className)}>\n <Nav {...navProps} />\n </aside>\n\n {/* Mobile: overlay + drawer */}\n <Overlay open={mobileOpen} onClick={() => setMobileOpen(false)} />\n <aside\n data-rzl=\"drawer\"\n data-state={mobileOpen ? 'open' : 'closed'}\n aria-hidden={!mobileOpen}\n className={cx('rootzz-drawer', mobileOpen && 'rootzz-drawer--open', className)}\n >\n <div className=\"rootzz-drawer__header\">\n <span className=\"rootzz-drawer__title\">{mobileTitle}</span>\n <IconButton aria-label=\"Fechar menu\" onClick={() => setMobileOpen(false)}>\n <CloseIcon size={22} />\n </IconButton>\n </div>\n <div className=\"rootzz-drawer__body\">\n <Nav {...navProps} />\n </div>\n </aside>\n </SidebarProvider>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { AppItem, AppsSource } from './types';\n\n/** URL padrão da lista de aplicativos da Eduzz. */\nexport const DEFAULT_APPS_URL = 'https://cdn.eduzzcdn.com/topbar/applications.json';\n\n/** Cache em nível de módulo: evita refetch entre múltiplas instâncias / re-renders. */\nconst cache = new Map<string, Promise<AppItem[]>>();\n\nfunction fetchApps(url: string): Promise<AppItem[]> {\n let promise = cache.get(url);\n if (!promise) {\n promise = fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status} ao buscar apps`);\n return res.json();\n })\n .then((data) => (Array.isArray(data) ? (data as AppItem[]) : []))\n .catch((err) => {\n // Em caso de erro, limpa o cache para permitir nova tentativa futura.\n cache.delete(url);\n throw err;\n });\n cache.set(url, promise);\n }\n return promise;\n}\n\ninterface ResolvedSource {\n staticItems: AppItem[] | null;\n url: string | null;\n}\n\nfunction resolveSource(source: AppsSource | undefined): ResolvedSource {\n if (!source) return { staticItems: null, url: null };\n if (source === true) return { staticItems: null, url: DEFAULT_APPS_URL };\n if (typeof source === 'string') return { staticItems: null, url: source };\n if (Array.isArray(source)) return { staticItems: source, url: null };\n if (source.items) return { staticItems: source.items, url: null };\n return { staticItems: null, url: source.url ?? DEFAULT_APPS_URL };\n}\n\nexport interface UseAppsResult {\n items: AppItem[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve a fonte de apps em `{ items, loading, error }`.\n * Listas estáticas são usadas direto; URLs são buscadas (com cache).\n */\nexport function useApps(source: AppsSource | undefined): UseAppsResult {\n const { staticItems, url } = resolveSource(source);\n\n const [items, setItems] = useState<AppItem[]>(staticItems ?? []);\n const [loading, setLoading] = useState<boolean>(!!url && !staticItems);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (staticItems) {\n setItems(staticItems);\n setLoading(false);\n setError(null);\n return;\n }\n if (!url) {\n setItems([]);\n setLoading(false);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setItems(data);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n // Estabilizamos por `url` e por uma assinatura simples da lista estática.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, staticItems ? staticItems.length : null]);\n\n return { items, loading, error };\n}\n\nexport interface UseApplicationResult {\n /** App encontrado pelo identificador, ou `null` enquanto carrega / se não existir. */\n app: AppItem | null;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve um único aplicativo da Eduzz pelo seu identificador (campo\n * `application` do `applications.json`). Reaproveita o mesmo fetch/cache de\n * {@link useApps}, então não há requisição extra quando o menu de apps já carregou.\n *\n * @param application Identificador (ex.: `\"orbita\"`). `undefined` desativa.\n * @param url Fonte custom do JSON. Padrão: {@link DEFAULT_APPS_URL}.\n */\nexport function useApplication(\n application: string | undefined,\n url: string = DEFAULT_APPS_URL,\n): UseApplicationResult {\n const [app, setApp] = useState<AppItem | null>(null);\n const [loading, setLoading] = useState<boolean>(!!application);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!application) {\n setApp(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setApp(data.find((item) => item.application === application) ?? null);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [application, url]);\n\n return { app, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * Fecha um elemento (dropdown, popover) ao clicar fora dele ou pressionar Escape.\n * Sem dependências; ouve eventos apenas enquanto `open` é `true`.\n */\nexport function useDismiss(\n open: boolean,\n refs: Array<RefObject<HTMLElement | null>>,\n onDismiss: () => void,\n): void {\n useEffect(() => {\n if (!open) return;\n if (typeof document === 'undefined') return;\n\n const handlePointer = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n const inside = refs.some((ref) => ref.current && ref.current.contains(target));\n if (!inside) onDismiss();\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onDismiss();\n };\n\n // `pointerdown` fecha antes de cliques dispararem navegação inesperada.\n document.addEventListener('pointerdown', handlePointer, true);\n document.addEventListener('keydown', handleKey);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointer, true);\n document.removeEventListener('keydown', handleKey);\n };\n }, [open, onDismiss, refs]);\n}\n","import { useId, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { useDismiss } from '../lib/useDismiss';\nimport { usePresence } from '../lib/usePresence';\nimport { useControllableState } from '../lib/useControllableState';\n\nexport interface DropdownTriggerArgs {\n open: boolean;\n toggle: () => void;\n /** Props a serem espalhadas no elemento de trigger (acessibilidade). */\n triggerProps: {\n 'aria-haspopup': 'menu';\n 'aria-expanded': boolean;\n 'aria-controls': string;\n };\n}\n\nexport interface DropdownProps {\n /** Renderiza o gatilho. Receba `toggle` e `triggerProps`. */\n renderTrigger: (args: DropdownTriggerArgs) => ReactNode;\n /** Conteúdo do painel. */\n children: ReactNode;\n /** Alinhamento horizontal do painel. Padrão: `'end'`. */\n align?: 'start' | 'end';\n /** Classe extra do painel. */\n panelClassName?: string;\n /** Largura do painel (px ou CSS). */\n panelWidth?: number | string;\n /** Fecha o painel ao clicar em qualquer lugar dentro dele. Padrão: `true`. */\n closeOnContentClick?: boolean;\n /** Rótulo acessível do menu. */\n ariaLabel?: string;\n /** Estado controlado (opcional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Dropdown inline (sem portal — garante herança do escopo de estilo `.rootzz-layout`).\n * Fecha em clique fora / Escape e faz fade in/out suave.\n */\nexport function Dropdown({\n renderTrigger,\n children,\n align = 'end',\n panelClassName,\n panelWidth,\n closeOnContentClick = true,\n ariaLabel,\n open: openProp,\n onOpenChange,\n}: DropdownProps) {\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: false,\n onChange: onOpenChange,\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, active } = usePresence(open);\n\n useDismiss(open, [containerRef], () => setOpen(false));\n\n const toggle = () => setOpen((v) => !v);\n\n return (\n <div ref={containerRef} className=\"rootzz-dropdown\">\n {renderTrigger({\n open,\n toggle,\n triggerProps: {\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n 'aria-controls': panelId,\n },\n })}\n\n {mounted && (\n <div\n id={panelId}\n role=\"menu\"\n aria-label={ariaLabel}\n onClick={() => closeOnContentClick && setOpen(false)}\n style={panelWidth !== undefined ? { width: panelWidth } : undefined}\n className={cx(\n 'rootzz-dropdown__panel',\n align === 'end' ? 'rootzz-dropdown__panel--end' : 'rootzz-dropdown__panel--start',\n active ? 'rootzz-dropdown__panel--active' : 'rootzz-dropdown__panel--inactive',\n panelClassName,\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n","import { useApps } from '../lib/useApps';\nimport type { AppsSource } from '../lib/types';\nimport { AppsGridIcon } from '../lib/icons';\nimport { Dropdown } from './Dropdown';\nimport { IconButton } from './IconButton';\n\nexport interface AppsMenuProps {\n /** Fonte dos apps (veja {@link AppsSource}). */\n source?: AppsSource;\n /** Rótulo acessível do botão. Padrão: \"Aplicativos\". */\n label?: string;\n /** Título exibido no topo do painel. Padrão: \"Aplicativos\". */\n title?: string;\n}\n\n/** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */\nexport function AppsMenu({ source = true, label = 'Aplicativos', title = 'Aplicativos' }: AppsMenuProps) {\n const { items, loading, error } = useApps(source);\n\n // `apps={false}` → não renderiza o botão.\n if (source === false) return null;\n\n return (\n <Dropdown\n align=\"start\"\n ariaLabel={title}\n panelWidth={332}\n panelClassName=\"rootzz-apps\"\n renderTrigger={({ toggle, triggerProps }) => (\n <IconButton onClick={toggle} aria-label={label} title={label} {...triggerProps}>\n <AppsGridIcon size={22} />\n </IconButton>\n )}\n >\n <div className=\"rootzz-apps__title\">{title}</div>\n\n {loading && <div className=\"rootzz-apps__status\">Carregando…</div>}\n\n {error && !loading && (\n <div className=\"rootzz-apps__status\">Não foi possível carregar os aplicativos.</div>\n )}\n\n {!loading && !error && items.length > 0 && (\n <div className=\"rootzz-apps__grid rootzz-scrollbar-none\">\n {items.map((app, index) => (\n <a\n key={app.application ?? `${app.label}-${index}`}\n href={app.url}\n title={app.description ?? app.label}\n role=\"menuitem\"\n className=\"rootzz-apps__item\"\n >\n <img src={app.icon} alt=\"\" className=\"rootzz-apps__icon\" loading=\"lazy\" />\n <span className=\"rootzz-apps__label\">{app.label}</span>\n </a>\n ))}\n </div>\n )}\n </Dropdown>\n );\n}\n","import { isValidElement } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useApplication } from '../lib/useApps';\nimport type { AppsSource, LogoConfig } from '../lib/types';\nimport { AppsMenu } from './AppsMenu';\n\nexport interface BrandProps {\n /**\n * Logo da topbar. Aceita:\n * - a string `\"myeduzz\"` → renderiza o logo oficial do MyEduzz;\n * - um `LogoConfig` (`{ src, alt, href… }`) → imagem configurável;\n * - qualquer `ReactNode` → renderizado como veio.\n *\n * Ignorado quando `application` resolve um app.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (campo `application` do\n * `applications.json`, ex.: `\"orbita\"`). Busca o app na lista oficial e\n * renderiza o logo + nome dele, linkando para a `url` do app.\n * No mobile, mostra apenas o logo (sem o nome). Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n appsLabel?: string;\n}\n\n/** URL do logo oficial do MyEduzz (CDN da Eduzz). */\nconst MYEDUZZ_LOGO: LogoConfig = {\n src: 'https://cdn.eduzzcdn.com/topbar/orbita-new.svg',\n alt: 'MyEduzz',\n height: 28,\n};\n\n/** `true` quando `logo` é o atalho de string para o logo do MyEduzz. */\nfunction isMyEduzzShortcut(value: unknown): value is string {\n return typeof value === 'string' && value.trim().toLowerCase() === 'myeduzz';\n}\n\nfunction isLogoConfig(value: unknown): value is LogoConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n !isValidElement(value) &&\n 'src' in (value as Record<string, unknown>)\n );\n}\n\nfunction Logo({ logo }: { logo: ReactNode | LogoConfig }) {\n const { linkComponent: Link } = useLayout();\n\n if (isLogoConfig(logo)) {\n const img = (\n <img src={logo.src} alt={logo.alt ?? ''} className=\"rootzz-brand__logo-img\" />\n );\n\n if (logo.href) {\n return (\n <Link href={logo.href} onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </Link>\n );\n }\n if (logo.onClick) {\n return (\n <button type=\"button\" onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </button>\n );\n }\n return <span className=\"rootzz-brand__logo-link\">{img}</span>;\n }\n\n return <>{logo}</>;\n}\n\n/** Marca de um aplicativo resolvido do `applications.json`: logo + nome (link). */\nfunction ApplicationBrand({ application }: { application: string }) {\n const { linkComponent: Link } = useLayout();\n const { app } = useApplication(application);\n\n if (!app) return null;\n\n return (\n <Link href={app.url} className=\"rootzz-brand__app\" title={app.label}>\n <img src={app.icon} alt={app.label} className=\"rootzz-brand__app-icon\" />\n <span className=\"rootzz-brand__app-name\">{app.label}</span>\n </Link>\n );\n}\n\n/** Bloco da esquerda da topbar: botão de aplicativos + logo/aplicação. */\nexport function Brand({ logo, application, apps, appsLabel }: BrandProps) {\n // A string \"myeduzz\" é um atalho para o logo oficial; qualquer outro valor\n // (LogoConfig ou ReactNode) é renderizado como veio.\n const resolvedLogo = isMyEduzzShortcut(logo) ? MYEDUZZ_LOGO : logo;\n\n return (\n <div className=\"rootzz-brand\">\n <AppsMenu source={apps} label={appsLabel} />\n {application ? (\n <span className=\"rootzz-brand__logo\">\n <ApplicationBrand application={application} />\n </span>\n ) : (\n resolvedLogo != null && (\n <span className=\"rootzz-brand__logo\">\n <Logo logo={resolvedLogo} />\n </span>\n )\n )}\n </div>\n );\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { IconButton } from './IconButton';\nimport { MoonIcon, SunIcon } from '../lib/icons';\n\nexport interface ThemeToggleProps {\n /** Rótulo acessível. Padrão: \"Alternar tema\". */\n label?: string;\n}\n\n/** Botão de alternância de tema (claro/escuro), com crossfade dos ícones. */\nexport function ThemeToggle({ label = 'Alternar tema' }: ThemeToggleProps) {\n const { theme, toggleTheme } = useLayout();\n const isDark = theme === 'dark';\n\n return (\n <IconButton onClick={toggleTheme} aria-label={label} title={label}>\n <span className=\"rootzz-theme-toggle\">\n <SunIcon size={20} className={cxFade(isDark)} />\n <MoonIcon size={20} className={cxFade(!isDark)} />\n </span>\n </IconButton>\n );\n}\n\n/** Posiciona ambos os ícones empilhados e faz o crossfade conforme visível. */\nfunction cxFade(visible: boolean): string {\n return [\n 'rootzz-theme-toggle__icon',\n visible ? 'rootzz-theme-toggle__icon--visible' : 'rootzz-theme-toggle__icon--hidden',\n ].join(' ');\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { UserConfig, UserMenuEntry } from '../lib/types';\nimport { Dropdown } from './Dropdown';\n\nexport interface UserMenuProps {\n user: UserConfig;\n}\n\nfunction computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction Avatar({ user, size = 32 }: { user: UserConfig; size?: number }) {\n const initials = user.initials ?? computeInitials(user.name);\n if (user.avatarUrl) {\n return (\n <img\n src={user.avatarUrl}\n alt={user.name}\n style={{ width: size, height: size }}\n className=\"rootzz-avatar\"\n />\n );\n }\n return (\n <span aria-hidden style={{ width: size, height: size }} className=\"rootzz-avatar rootzz-avatar--initials\">\n {initials}\n </span>\n );\n}\n\nfunction isDivider(entry: UserMenuEntry): entry is { type: 'divider'; key?: string } {\n return (entry as { type?: string }).type === 'divider';\n}\n\n/** Usuário à direita da topbar: avatar + nome + dropdown de ações. */\nexport function UserMenu({ user }: UserMenuProps) {\n const { linkComponent: Link } = useLayout();\n const hasMenu = !!user.menu && user.menu.length > 0;\n\n const trigger = (extra?: { toggle: () => void; triggerProps?: object }) => (\n <button\n type=\"button\"\n onClick={extra ? extra.toggle : user.onClick}\n {...(extra?.triggerProps ?? {})}\n className=\"rootzz-user\"\n >\n <Avatar user={user} />\n <span className=\"rootzz-user__name\">{user.name}</span>\n {hasMenu && <ChevronDownIcon size={16} className=\"rootzz-user__chevron\" />}\n </button>\n );\n\n if (!hasMenu) {\n return trigger();\n }\n\n return (\n <Dropdown\n align=\"end\"\n ariaLabel={`Menu de ${user.name}`}\n panelWidth={240}\n renderTrigger={({ toggle, triggerProps }) => trigger({ toggle, triggerProps })}\n >\n <div className=\"rootzz-user-panel__header\">\n <Avatar user={user} size={36} />\n <div className=\"rootzz-user-panel__info\">\n <div className=\"rootzz-user-panel__name\">{user.name}</div>\n {user.email && <div className=\"rootzz-user-panel__email\">{user.email}</div>}\n </div>\n </div>\n\n <div className=\"rootzz-divider\" />\n\n {user.menu!.map((entry, index) => {\n if (isDivider(entry)) {\n return <div key={entry.key ?? `divider-${index}`} className=\"rootzz-divider\" />;\n }\n\n const itemClass = cx(\n 'rootzz-menu-item',\n entry.disabled && 'rootzz-menu-item--disabled',\n entry.danger && 'rootzz-menu-item--danger',\n );\n\n const content = (\n <>\n {entry.icon && <span className=\"rootzz-menu-item__icon\">{entry.icon}</span>}\n <span className=\"rootzz-menu-item__label\">{entry.label}</span>\n </>\n );\n\n if (entry.href) {\n return (\n <Link key={entry.key ?? index} href={entry.href} role=\"menuitem\" className={itemClass}>\n {content}\n </Link>\n );\n }\n return (\n <button key={entry.key ?? index} type=\"button\" role=\"menuitem\" onClick={entry.onClick} className={itemClass}>\n {content}\n </button>\n );\n })}\n </Dropdown>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { MenuIcon } from '../lib/icons';\nimport type { AppsSource, LogoConfig, UserConfig } from '../lib/types';\nimport { Brand } from './Brand';\nimport { IconButton } from './IconButton';\nimport { ThemeToggle } from './ThemeToggle';\nimport { UserMenu } from './UserMenu';\n\nexport interface TopbarProps {\n /**\n * Logo exibido à esquerda. Aceita a string `\"myeduzz\"` (renderiza o logo\n * oficial do MyEduzz), um `LogoConfig` ou qualquer `ReactNode`.\n * Ignorado quando `application` é informado.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (ex.: `\"orbita\"`). Busca o app no\n * `applications.json` e renderiza o logo + nome dele (no mobile, só o logo),\n * linkando para a URL do app. Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n search?: ReactNode;\n actions?: ReactNode;\n user?: UserConfig;\n showThemeToggle?: boolean;\n /** Exibe o botão de menu (hambúrguer) no mobile. Padrão: `true`. */\n showMenuButton?: boolean;\n appsLabel?: string;\n menuButtonLabel?: string;\n className?: string;\n}\n\n/** Barra superior fixa: marca à esquerda, busca opcional ao centro, ações/usuário à direita. */\nexport function Topbar({\n logo,\n application,\n apps,\n search,\n actions,\n user,\n showThemeToggle = false,\n showMenuButton = true,\n appsLabel,\n menuButtonLabel = 'Abrir menu',\n className,\n}: TopbarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n return (\n <header className={cx('rootzz-topbar', className)}>\n {/* Esquerda */}\n <div className=\"rootzz-topbar__left\">\n {showMenuButton && (\n <IconButton\n className=\"rootzz-topbar__menu-button\"\n aria-label={menuButtonLabel}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen(!mobileOpen)}\n >\n <MenuIcon size={22} />\n </IconButton>\n )}\n <Brand logo={logo} application={application} apps={apps} appsLabel={appsLabel} />\n </div>\n\n {/* Centro (busca opcional) */}\n <div className=\"rootzz-topbar__center\">\n {search && <div className=\"rootzz-topbar__search\">{search}</div>}\n </div>\n\n {/* Direita */}\n <div className=\"rootzz-topbar__right\">\n {actions}\n {showThemeToggle && <ThemeToggle />}\n {user && <UserMenu user={user} />}\n </div>\n </header>\n );\n}\n","import { Children, isValidElement } from 'react';\nimport type { ReactElement } from 'react';\nimport { LayoutProvider, useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport type { RootzzLayoutProps } from '../lib/types';\nimport { Content } from './Content';\nimport { Sidebar } from './Sidebar';\nimport { Topbar } from './Topbar';\n\n/** Organiza os filhos: Topbar no topo (largura total), Sidebar + Content na linha abaixo. */\nfunction Shell({ children, className, style, id }: Pick<RootzzLayoutProps, 'children' | 'className' | 'style' | 'id'>) {\n const { theme } = useLayout();\n\n const items = Children.toArray(children).filter(isValidElement) as ReactElement[];\n const topbar = items.find((el) => el.type === Topbar);\n const sidebars = items.filter((el) => el.type === Sidebar);\n // Content + qualquer outro filho (na ordem fornecida), sempre após a sidebar.\n const body = items.filter((el) => el.type !== Topbar && el.type !== Sidebar);\n\n return (\n <div id={id} data-theme={theme} style={style} className={cx('rootzz-layout', className)}>\n {topbar}\n <div className=\"rootzz-layout__body\">\n {sidebars}\n {body}\n </div>\n </div>\n );\n}\n\n/**\n * Shell de aplicação composável. Forneça os subcomponentes como filhos —\n * cada um com suas próprias props.\n *\n * @example\n * import { RootzzLayout } from 'rootzz-layout';\n * import 'rootzz-layout/styles.css';\n *\n * <RootzzLayout>\n * <RootzzLayout.Topbar\n * logo={{ src: '/logo.svg', alt: 'MyEduzz', href: '/' }}\n * apps\n * showThemeToggle\n * user={{ name: 'Designers da Eduzz', initials: 'Dd', menu: [{ label: 'Sair', danger: true }] }}\n * />\n * <RootzzLayout.Sidebar\n * activeKey=\"resumo\"\n * menu={[\n * { key: 'resumo', label: 'Resumo', href: '/' },\n * { type: 'group', key: 'vendas', label: 'Vendas', items: [{ key: 'pedidos', label: 'Pedidos', href: '/pedidos' }] },\n * ]}\n * />\n * <RootzzLayout.Content>conteúdo aqui</RootzzLayout.Content>\n * </RootzzLayout>\n *\n * Config de nível de shell (tema, linkComponent) fica no `<RootzzLayout>`:\n * `<RootzzLayout theme=\"dark\" linkComponent={Link}>…</RootzzLayout>`\n */\nfunction RootzzLayoutBase({\n children,\n theme,\n defaultTheme,\n onThemeChange,\n linkComponent,\n className,\n style,\n id,\n}: RootzzLayoutProps) {\n return (\n <LayoutProvider\n theme={theme}\n defaultTheme={defaultTheme}\n onThemeChange={onThemeChange}\n linkComponent={linkComponent}\n >\n <Shell className={className} style={style} id={id}>\n {children}\n </Shell>\n </LayoutProvider>\n );\n}\n\n/**\n * `RootzzLayout` + subcomponentes anexados:\n * `RootzzLayout.Topbar`, `RootzzLayout.Sidebar`, `RootzzLayout.Content`.\n * (Os mesmos componentes também são exportados individualmente.)\n */\nexport const RootzzLayout = Object.assign(RootzzLayoutBase, {\n Topbar,\n Sidebar,\n Content,\n});\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { SearchIcon } from '../lib/icons';\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Texto de placeholder. */\n placeholder?: string;\n /** Dica de atalho exibida à direita (ex.: \"⌘K\"). */\n shortcut?: ReactNode;\n /** Classe extra do wrapper. */\n wrapperClassName?: string;\n}\n\n/**\n * Campo de busca estilizado para o centro da topbar (opcional).\n * É um `<input>` comum — controle via `value`/`onChange` como qualquer input.\n */\nexport const SearchBar = forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { placeholder = 'Buscar…', shortcut, wrapperClassName, className, ...rest },\n ref,\n) {\n return (\n <div className={cx('rootzz-search', wrapperClassName)}>\n <SearchIcon size={18} className=\"rootzz-search__icon\" />\n <input\n ref={ref}\n type=\"search\"\n placeholder={placeholder}\n className={cx('rootzz-search__input', className)}\n {...rest}\n />\n {shortcut != null && <kbd className=\"rootzz-search__shortcut\">{shortcut}</kbd>}\n </div>\n );\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/useControllableState.ts","../src/context/LayoutContext.tsx","../src/lib/cx.ts","../src/components/Content.tsx","../src/context/SidebarContext.tsx","../src/lib/icons.tsx","../src/components/IconButton.tsx","../src/lib/usePresence.ts","../src/components/Overlay.tsx","../src/components/SidebarItem.tsx","../src/components/SidebarGroup.tsx","../src/components/Sidebar.tsx","../src/lib/useApps.ts","../src/lib/useDismiss.ts","../src/components/Dropdown.tsx","../src/components/AppsMenu.tsx","../src/components/Brand.tsx","../src/components/ThemeToggle.tsx","../src/components/UserMenu.tsx","../src/components/Topbar.tsx","../src/components/RootzzLayout.tsx","../src/components/SearchBar.tsx"],"names":["useState","useRef","useCallback","createContext","useContext","useEffect","useMemo","jsx","cx","jsxs","forwardRef","IconButton","Fragment","useId","isValidElement","Children","SearchBar"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\n/**\n * Estado que pode ser controlado (via prop) ou não-controlado (estado interno).\n * Espelha o padrão usado por bibliotecas como Radix/React Aria, sem dependências.\n */\nexport function useControllableState<T>(options: {\n /** Valor controlado. Se `undefined`, o estado é interno. */\n value?: T;\n /** Valor inicial quando não-controlado. */\n defaultValue: T;\n /** Notifica mudanças (em ambos os modos). */\n onChange?: (value: T) => void;\n}): [T, (next: T | ((prev: T) => T)) => void] {\n const { value, defaultValue, onChange } = options;\n const isControlled = value !== undefined;\n\n const [internal, setInternal] = useState<T>(defaultValue);\n\n // Mantém o onChange fresco sem recriar o setter.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const current = isControlled ? (value as T) : internal;\n const currentRef = useRef(current);\n currentRef.current = current;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === 'function'\n ? (next as (prev: T) => T)(currentRef.current)\n : next;\n\n if (!isControlled) {\n setInternal(resolved);\n }\n if (resolved !== currentRef.current) {\n onChangeRef.current?.(resolved);\n }\n },\n [isControlled],\n );\n\n return [current, setValue];\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport { useControllableState } from '../lib/useControllableState';\nimport type { LinkComponent, ThemeMode } from '../lib/types';\n\n/** Breakpoint mobile (abaixo do `md` do Tailwind). */\nconst MOBILE_QUERY = '(max-width: 767.98px)';\n\nexport interface LayoutContextValue {\n /** Tema atual. */\n theme: ThemeMode;\n /** Define o tema. */\n setTheme: (theme: ThemeMode) => void;\n /** Alterna entre claro e escuro. */\n toggleTheme: () => void;\n /** Drawer mobile aberto? */\n mobileOpen: boolean;\n /** Abre/fecha o drawer mobile. */\n setMobileOpen: (open: boolean) => void;\n /** Estamos em viewport mobile? */\n isMobile: boolean;\n /** Componente de link usado na navegação (padrão `<a>`). */\n linkComponent: LinkComponent;\n}\n\nconst LayoutContext = createContext<LayoutContextValue | null>(null);\n\n/** Acessa o estado do layout (tema, drawer mobile, etc.). */\nexport function useLayout(): LayoutContextValue {\n const ctx = useContext(LayoutContext);\n if (!ctx) {\n throw new Error('useLayout deve ser usado dentro de <RootzzLayout> ou <LayoutShell>.');\n }\n return ctx;\n}\n\nexport interface LayoutProviderProps {\n children: ReactNode;\n theme?: ThemeMode;\n defaultTheme?: ThemeMode;\n onThemeChange?: (theme: ThemeMode) => void;\n linkComponent?: LinkComponent;\n}\n\nexport function LayoutProvider({\n children,\n theme: themeProp,\n defaultTheme = 'light',\n onThemeChange,\n linkComponent = 'a',\n}: LayoutProviderProps) {\n const [theme, setTheme] = useControllableState<ThemeMode>({\n value: themeProp,\n defaultValue: defaultTheme,\n onChange: onThemeChange,\n });\n\n const [mobileOpen, setMobileOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n // Detecta viewport mobile (sem dependências, SSR-safe).\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const update = () => setIsMobile(mql.matches);\n update();\n mql.addEventListener('change', update);\n return () => mql.removeEventListener('change', update);\n }, []);\n\n // Ao sair do mobile, garante o drawer fechado.\n useEffect(() => {\n if (!isMobile && mobileOpen) setMobileOpen(false);\n }, [isMobile, mobileOpen]);\n\n // Trava o scroll do body enquanto o drawer mobile está aberto.\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (!mobileOpen || !isMobile) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = previous;\n };\n }, [mobileOpen, isMobile]);\n\n const toggleTheme = useCallback(() => {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }, [theme, setTheme]);\n\n const value = useMemo<LayoutContextValue>(\n () => ({\n theme,\n setTheme,\n toggleTheme,\n mobileOpen,\n setMobileOpen,\n isMobile,\n linkComponent,\n }),\n [theme, setTheme, toggleTheme, mobileOpen, isMobile, linkComponent],\n );\n\n return <LayoutContext.Provider value={value}>{children}</LayoutContext.Provider>;\n}\n","/**\n * Concatena classes condicionalmente. Substituto mínimo de `clsx` para manter\n * a biblioteca sem dependências de runtime.\n *\n * @example cx('rootzz-item', isActive && 'rootzz-item--active', { 'rootzz-hidden': hidden })\n */\nexport type ClassValue =\n | string\n | number\n | null\n | false\n | undefined\n | ClassValue[]\n | Record<string, boolean | null | undefined>;\n\nexport function cx(...inputs: ClassValue[]): string {\n const out: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === 'string' || typeof input === 'number') {\n out.push(String(input));\n } else if (Array.isArray(input)) {\n const inner = cx(...input);\n if (inner) out.push(inner);\n } else if (typeof input === 'object') {\n for (const key in input) {\n if (input[key]) out.push(key);\n }\n }\n }\n\n return out.join(' ');\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface ContentProps {\n children?: ReactNode;\n /**\n * Largura máxima do conteúdo. `false` ocupa 100%.\n * Omitido usa o token `--rzl-content-max-width`.\n */\n maxWidth?: number | string | false;\n /** Classe extra no wrapper interno. */\n className?: string;\n /** Remove o padding padrão. */\n noPadding?: boolean;\n}\n\n/** Área de conteúdo: rola verticalmente e centraliza/limita a largura do que for inserido. */\nexport function Content({ children, maxWidth, className, noPadding = false }: ContentProps) {\n const useToken = maxWidth === undefined;\n const style: CSSProperties | undefined =\n maxWidth === undefined || maxWidth === false ? undefined : { maxWidth };\n\n return (\n <main className=\"rootzz-content\">\n <div\n style={style}\n className={cx(\n 'rootzz-content__inner',\n useToken && 'rootzz-content__inner--max',\n !noPadding && 'rootzz-content__inner--padded',\n className,\n )}\n >\n {children}\n </div>\n </main>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Estado local da Sidebar (compartilhado com itens/grupos). */\nexport interface SidebarContextValue {\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({});\n\nexport const SidebarProvider = SidebarContext.Provider;\n\nexport function useSidebar(): SidebarContextValue {\n return useContext(SidebarContext);\n}\n","import type { SVGProps } from 'react';\n\n/**\n * Ícones SVG inline — evitam uma dependência de biblioteca de ícones.\n * Usam `currentColor`, então herdam a cor do texto via classes utilitárias.\n */\ntype IconProps = SVGProps<SVGSVGElement> & { size?: number | string };\n\nfunction base({ size = 20, ...props }: IconProps) {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n xmlns: 'http://www.w3.org/2000/svg',\n 'aria-hidden': true,\n focusable: false,\n ...props,\n } as SVGProps<SVGSVGElement>;\n}\n\n// Estilo lucide-react: viewBox 24, fill none, stroke currentColor, stroke-width 1.5,\n// linecap/linejoin round. Os paths abaixo são os mesmos dos ícones lucide.\nconst stroke = {\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\n/** Grade 9-pontos (botão de aplicativos) — lucide `Grip`. */\nexport function AppsGridIcon(props: IconProps) {\n const xs = [5, 12, 19];\n const ys = [5, 12, 19];\n return (\n <svg {...base(props)}>\n {ys.flatMap((cy) =>\n xs.map((cx) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r={1} {...stroke} />),\n )}\n </svg>\n );\n}\n\n/** Chevron para baixo — lucide `ChevronDown`. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"m6 9 6 6 6-6\" {...stroke} />\n </svg>\n );\n}\n\n/** Sino de notificações. */\nexport function BellIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9\" {...stroke} />\n <path d=\"M13.7 21a2 2 0 0 1-3.4 0\" {...stroke} />\n </svg>\n );\n}\n\n/** Menu hambúrguer (mobile). */\nexport function MenuIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M3 6h18M3 12h18M3 18h18\" {...stroke} />\n </svg>\n );\n}\n\n/** Fechar (X). */\nexport function CloseIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 6 6 18M6 6l12 12\" {...stroke} />\n </svg>\n );\n}\n\n/** Lupa de busca. */\nexport function SearchIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={11} cy={11} r={7} {...stroke} />\n <path d=\"m21 21-4.3-4.3\" {...stroke} />\n </svg>\n );\n}\n\n/** Sol (tema claro). */\nexport function SunIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={12} cy={12} r={4} {...stroke} />\n <path\n d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\n {...stroke}\n />\n </svg>\n );\n}\n\n/** Lua (tema escuro). */\nexport function MoonIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\" {...stroke} />\n </svg>\n );\n}\n\n/** Link externo (itens do menu de apps). */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M15 3h6v6M10 14 21 3M21 14v5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5\" {...stroke} />\n </svg>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Ícone/conteúdo central. */\n children: ReactNode;\n /** Conteúdo do badge (número ou nó). `true` exibe um ponto. */\n badge?: ReactNode | boolean;\n /** Tamanho do botão em px. Padrão: 40. */\n size?: number;\n}\n\n/**\n * Botão de ícone padronizado para a topbar (hover suave, foco acessível, badge opcional).\n * Útil também para montar suas próprias ações custom mantendo a consistência visual.\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { children, badge, size = 40, className, type = 'button', ...rest },\n ref,\n) {\n const hasBadge = badge !== undefined && badge !== false && badge !== null;\n const isDot = badge === true;\n\n return (\n <button\n ref={ref}\n type={type}\n style={{ width: size, height: size }}\n className={cx('rootzz-icon-button', className)}\n {...rest}\n >\n {children}\n {hasBadge && (\n <span\n className={cx(\n 'rootzz-icon-button__badge',\n isDot ? 'rootzz-icon-button__badge--dot' : 'rootzz-icon-button__badge--count',\n )}\n >\n {!isDot && badge}\n </span>\n )}\n </button>\n );\n});\n","import { useEffect, useState } from 'react';\n\nexport interface Presence {\n /** Deve renderizar no DOM? (permanece `true` durante a saída). */\n mounted: boolean;\n /** Estado visual para alternar classes de transição (entrada/saída). */\n active: boolean;\n}\n\n/**\n * Coordena enter/exit com transições CSS, sem libs de animação.\n * Mantém o elemento montado durante a saída para o fade-out acontecer.\n *\n * @param open estado desejado\n * @param duration ms que o elemento fica montado durante a saída (casa com --rzl-duration)\n */\nexport function usePresence(open: boolean, duration = 220): Presence {\n const [mounted, setMounted] = useState(open);\n const [active, setActive] = useState(open);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n // Próximo frame: ativa as classes \"abertas\" para a transição rodar.\n const raf = requestAnimationFrame(() => setActive(true));\n return () => cancelAnimationFrame(raf);\n }\n setActive(false);\n const timer = setTimeout(() => setMounted(false), duration);\n return () => clearTimeout(timer);\n }, [open, duration]);\n\n return { mounted, active };\n}\n","import { cx } from '../lib/cx';\nimport { usePresence } from '../lib/usePresence';\n\nexport interface OverlayProps {\n open: boolean;\n onClick?: () => void;\n className?: string;\n}\n\n/** Camada escura semitransparente (mobile), com fade in/out. */\nexport function Overlay({ open, onClick, className }: OverlayProps) {\n const { mounted, active } = usePresence(open);\n if (!mounted) return null;\n\n return (\n <div\n // Decorativo: o fechamento acessível é via Escape (useDismiss) e botões.\n data-rzl=\"overlay\"\n aria-hidden\n onClick={onClick}\n className={cx(\n 'rootzz-overlay',\n active ? 'rootzz-overlay--active' : 'rootzz-overlay--inactive',\n className,\n )}\n />\n );\n}\n","import type { MouseEvent } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport type { MenuLink } from '../lib/types';\n\nexport interface SidebarItemProps {\n item: MenuLink;\n /** Recuo extra (usado para itens dentro de grupos). */\n nested?: boolean;\n}\n\n/** Item simples (link) da sidebar, com estado ativo. */\nexport function SidebarItem({ item, nested = false }: SidebarItemProps) {\n const { linkComponent: Link, isMobile, setMobileOpen } = useLayout();\n const { activeKey } = useSidebar();\n\n const isActive = item.active ?? (activeKey != null && item.key === activeKey);\n\n const handleClick = (event: MouseEvent) => {\n item.onClick?.(event);\n // Em mobile, navegar fecha o drawer.\n if (isMobile) setMobileOpen(false);\n };\n\n // Itens aninhados recebem margem horizontal para o pill ficar mais estreito que o pai.\n const className = cx(\n 'rootzz-sidebar-item',\n nested && 'rootzz-sidebar-item--nested',\n item.disabled && 'rootzz-sidebar-item--disabled',\n isActive && 'rootzz-sidebar-item--active',\n );\n\n const content = (\n <>\n {item.icon && <span className=\"rootzz-sidebar-item__icon\">{item.icon}</span>}\n <span className=\"rootzz-sidebar-item__label\">{item.label}</span>\n {item.badge != null && <span className=\"rootzz-sidebar-item__badge\">{item.badge}</span>}\n </>\n );\n\n if (item.href && !item.disabled) {\n return (\n <Link\n href={item.href}\n target={item.target}\n onClick={handleClick}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </Link>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={item.disabled}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </button>\n );\n}\n","import { useId, useState } from 'react';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { MenuGroup } from '../lib/types';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarGroupProps {\n group: MenuGroup;\n}\n\n/** Grupo colapsável da sidebar (label em maiúsculas + chevron animado + altura animada). */\nexport function SidebarGroup({ group }: SidebarGroupProps) {\n const { activeKey } = useSidebar();\n const collapsible = group.collapsible ?? true;\n const [collapsed, setCollapsed] = useState(collapsible ? (group.defaultCollapsed ?? false) : false);\n const open = collapsible ? !collapsed : true;\n const regionId = useId();\n\n // Se algum filho está ativo, o label do grupo fica destacado (cor ativa).\n const hasActiveChild = group.items.some(\n (it) => it.active || (activeKey != null && it.key === activeKey),\n );\n\n const header = (\n <div className=\"rootzz-sidebar-group__header\">\n {group.icon && <span className=\"rootzz-sidebar-group__icon\">{group.icon}</span>}\n <span\n className={cx(\n 'rootzz-sidebar-group__label',\n hasActiveChild && 'rootzz-sidebar-group__label--active',\n )}\n >\n {group.label}\n </span>\n {collapsible && (\n <ChevronDownIcon\n size={16}\n className={cx(\n 'rootzz-sidebar-group__chevron',\n open && 'rootzz-sidebar-group__chevron--open',\n )}\n />\n )}\n </div>\n );\n\n return (\n <div className=\"rootzz-sidebar-group\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => setCollapsed((v) => !v)}\n aria-expanded={open}\n aria-controls={regionId}\n className=\"rootzz-sidebar-group__trigger\"\n >\n {header}\n </button>\n ) : (\n header\n )}\n\n {/* Altura animada via grid-template-rows (0fr → 1fr). Mantém o conteúdo\n montado para o colapso ser suave nos dois sentidos. */}\n <div\n id={regionId}\n aria-hidden={!open}\n className={cx(\n 'rootzz-sidebar-group__region',\n open && 'rootzz-sidebar-group__region--open',\n )}\n >\n <div className=\"rootzz-sidebar-group__clip\">\n <div className=\"rootzz-sidebar-group__items\">\n {group.items.map((item) => (\n <SidebarItem key={item.key} item={item} nested />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { SidebarProvider } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { CloseIcon } from '../lib/icons';\nimport type { MenuItem } from '../lib/types';\nimport { IconButton } from './IconButton';\nimport { Overlay } from './Overlay';\nimport { SidebarGroup } from './SidebarGroup';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarProps {\n /** Entradas do menu (links, grupos, divisores). */\n menu?: MenuItem[];\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n /** Conteúdo fixo no topo. */\n header?: ReactNode;\n /** Conteúdo fixo no rodapé. */\n footer?: ReactNode;\n /** Rótulo acessível da navegação. Padrão: \"Navegação principal\". */\n ariaLabel?: string;\n /** Conteúdo custom (substitui `menu` se quiser compor manualmente). */\n children?: ReactNode;\n className?: string;\n /** Título do drawer mobile. */\n mobileTitle?: ReactNode;\n}\n\nfunction renderEntry(entry: MenuItem, index: number) {\n if ((entry as { type?: string }).type === 'divider') {\n return <div key={(entry as { key?: string }).key ?? `divider-${index}`} className=\"rootzz-nav__divider\" />;\n }\n if ((entry as { type?: string }).type === 'group') {\n const group = entry as Extract<MenuItem, { type: 'group' }>;\n return <SidebarGroup key={group.key} group={group} />;\n }\n const item = entry as Extract<MenuItem, { type?: 'item' }>;\n return <SidebarItem key={item.key} item={item} />;\n}\n\nfunction Nav({\n menu,\n header,\n footer,\n ariaLabel,\n children,\n}: Pick<SidebarProps, 'menu' | 'header' | 'footer' | 'ariaLabel' | 'children'>) {\n return (\n <nav aria-label={ariaLabel ?? 'Navegação principal'} className=\"rootzz-nav\">\n {header && <div className=\"rootzz-nav__header\">{header}</div>}\n\n <div className=\"rootzz-nav__scroll rootzz-scrollbar-none\">\n {children ?? <div className=\"rootzz-nav__list\">{menu?.map(renderEntry)}</div>}\n </div>\n\n {footer && <div className=\"rootzz-nav__footer\">{footer}</div>}\n </nav>\n );\n}\n\n/**\n * Sidebar de navegação.\n * - Desktop (≥768px): coluna fixa com largura `--rzl-sidebar-width`.\n * - Mobile (<768px): drawer off-canvas com overlay e fade/slide suaves.\n */\nexport function Sidebar({\n menu,\n activeKey,\n header,\n footer,\n ariaLabel,\n children,\n className,\n mobileTitle,\n}: SidebarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n // Escape fecha o drawer no mobile.\n useEffect(() => {\n if (!mobileOpen) return;\n if (typeof document === 'undefined') return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n const navProps = { menu, header, footer, ariaLabel, children };\n\n return (\n <SidebarProvider value={{ activeKey }}>\n {/* Desktop: coluna estática */}\n <aside data-rzl=\"sidebar\" className={cx('rootzz-sidebar', className)}>\n <Nav {...navProps} />\n </aside>\n\n {/* Mobile: overlay + drawer */}\n <Overlay open={mobileOpen} onClick={() => setMobileOpen(false)} />\n <aside\n data-rzl=\"drawer\"\n data-state={mobileOpen ? 'open' : 'closed'}\n aria-hidden={!mobileOpen}\n className={cx('rootzz-drawer', mobileOpen && 'rootzz-drawer--open', className)}\n >\n <div className=\"rootzz-drawer__header\">\n <span className=\"rootzz-drawer__title\">{mobileTitle}</span>\n <IconButton aria-label=\"Fechar menu\" onClick={() => setMobileOpen(false)}>\n <CloseIcon size={22} />\n </IconButton>\n </div>\n <div className=\"rootzz-drawer__body\">\n <Nav {...navProps} />\n </div>\n </aside>\n </SidebarProvider>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { AppItem, AppsSource } from './types';\n\n/** URL padrão da lista de aplicativos da Eduzz. */\nexport const DEFAULT_APPS_URL = 'https://cdn.eduzzcdn.com/topbar/applications.json';\n\n/** Cache em nível de módulo: evita refetch entre múltiplas instâncias / re-renders. */\nconst cache = new Map<string, Promise<AppItem[]>>();\n\nfunction fetchApps(url: string): Promise<AppItem[]> {\n let promise = cache.get(url);\n if (!promise) {\n promise = fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status} ao buscar apps`);\n return res.json();\n })\n .then((data) => (Array.isArray(data) ? (data as AppItem[]) : []))\n .catch((err) => {\n // Em caso de erro, limpa o cache para permitir nova tentativa futura.\n cache.delete(url);\n throw err;\n });\n cache.set(url, promise);\n }\n return promise;\n}\n\ninterface ResolvedSource {\n staticItems: AppItem[] | null;\n url: string | null;\n}\n\nfunction resolveSource(source: AppsSource | undefined): ResolvedSource {\n if (!source) return { staticItems: null, url: null };\n if (source === true) return { staticItems: null, url: DEFAULT_APPS_URL };\n if (typeof source === 'string') return { staticItems: null, url: source };\n if (Array.isArray(source)) return { staticItems: source, url: null };\n if (source.items) return { staticItems: source.items, url: null };\n return { staticItems: null, url: source.url ?? DEFAULT_APPS_URL };\n}\n\nexport interface UseAppsResult {\n items: AppItem[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve a fonte de apps em `{ items, loading, error }`.\n * Listas estáticas são usadas direto; URLs são buscadas (com cache).\n */\nexport function useApps(source: AppsSource | undefined): UseAppsResult {\n const { staticItems, url } = resolveSource(source);\n\n const [items, setItems] = useState<AppItem[]>(staticItems ?? []);\n const [loading, setLoading] = useState<boolean>(!!url && !staticItems);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (staticItems) {\n setItems(staticItems);\n setLoading(false);\n setError(null);\n return;\n }\n if (!url) {\n setItems([]);\n setLoading(false);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setItems(data);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n // Estabilizamos por `url` e por uma assinatura simples da lista estática.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, staticItems ? staticItems.length : null]);\n\n return { items, loading, error };\n}\n\nexport interface UseApplicationResult {\n /** App encontrado pelo identificador, ou `null` enquanto carrega / se não existir. */\n app: AppItem | null;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve um único aplicativo da Eduzz pelo seu identificador (campo\n * `application` do `applications.json`). Reaproveita o mesmo fetch/cache de\n * {@link useApps}, então não há requisição extra quando o menu de apps já carregou.\n *\n * @param application Identificador (ex.: `\"orbita\"`). `undefined` desativa.\n * @param url Fonte custom do JSON. Padrão: {@link DEFAULT_APPS_URL}.\n */\nexport function useApplication(\n application: string | undefined,\n url: string = DEFAULT_APPS_URL,\n): UseApplicationResult {\n const [app, setApp] = useState<AppItem | null>(null);\n const [loading, setLoading] = useState<boolean>(!!application);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!application) {\n setApp(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setApp(data.find((item) => item.application === application) ?? null);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [application, url]);\n\n return { app, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * Fecha um elemento (dropdown, popover) ao clicar fora dele ou pressionar Escape.\n * Sem dependências; ouve eventos apenas enquanto `open` é `true`.\n */\nexport function useDismiss(\n open: boolean,\n refs: Array<RefObject<HTMLElement | null>>,\n onDismiss: () => void,\n): void {\n useEffect(() => {\n if (!open) return;\n if (typeof document === 'undefined') return;\n\n const handlePointer = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n const inside = refs.some((ref) => ref.current && ref.current.contains(target));\n if (!inside) onDismiss();\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onDismiss();\n };\n\n // `pointerdown` fecha antes de cliques dispararem navegação inesperada.\n document.addEventListener('pointerdown', handlePointer, true);\n document.addEventListener('keydown', handleKey);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointer, true);\n document.removeEventListener('keydown', handleKey);\n };\n }, [open, onDismiss, refs]);\n}\n","import { useId, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { useDismiss } from '../lib/useDismiss';\nimport { usePresence } from '../lib/usePresence';\nimport { useControllableState } from '../lib/useControllableState';\n\nexport interface DropdownTriggerArgs {\n open: boolean;\n toggle: () => void;\n /** Props a serem espalhadas no elemento de trigger (acessibilidade). */\n triggerProps: {\n 'aria-haspopup': 'menu';\n 'aria-expanded': boolean;\n 'aria-controls': string;\n };\n}\n\nexport interface DropdownProps {\n /** Renderiza o gatilho. Receba `toggle` e `triggerProps`. */\n renderTrigger: (args: DropdownTriggerArgs) => ReactNode;\n /** Conteúdo do painel. */\n children: ReactNode;\n /** Alinhamento horizontal do painel. Padrão: `'end'`. */\n align?: 'start' | 'end';\n /** Classe extra do painel. */\n panelClassName?: string;\n /** Largura do painel (px ou CSS). */\n panelWidth?: number | string;\n /** Fecha o painel ao clicar em qualquer lugar dentro dele. Padrão: `true`. */\n closeOnContentClick?: boolean;\n /** Rótulo acessível do menu. */\n ariaLabel?: string;\n /** Estado controlado (opcional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Dropdown inline (sem portal — garante herança do escopo de estilo `.rootzz-layout`).\n * Fecha em clique fora / Escape e faz fade in/out suave.\n */\nexport function Dropdown({\n renderTrigger,\n children,\n align = 'end',\n panelClassName,\n panelWidth,\n closeOnContentClick = true,\n ariaLabel,\n open: openProp,\n onOpenChange,\n}: DropdownProps) {\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: false,\n onChange: onOpenChange,\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, active } = usePresence(open);\n\n useDismiss(open, [containerRef], () => setOpen(false));\n\n const toggle = () => setOpen((v) => !v);\n\n return (\n <div ref={containerRef} className=\"rootzz-dropdown\">\n {renderTrigger({\n open,\n toggle,\n triggerProps: {\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n 'aria-controls': panelId,\n },\n })}\n\n {mounted && (\n <div\n id={panelId}\n role=\"menu\"\n aria-label={ariaLabel}\n onClick={() => closeOnContentClick && setOpen(false)}\n style={panelWidth !== undefined ? { width: panelWidth } : undefined}\n className={cx(\n 'rootzz-dropdown__panel',\n align === 'end' ? 'rootzz-dropdown__panel--end' : 'rootzz-dropdown__panel--start',\n active ? 'rootzz-dropdown__panel--active' : 'rootzz-dropdown__panel--inactive',\n panelClassName,\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n","import { useApps } from '../lib/useApps';\nimport type { AppsSource } from '../lib/types';\nimport { AppsGridIcon } from '../lib/icons';\nimport { Dropdown } from './Dropdown';\nimport { IconButton } from './IconButton';\n\nexport interface AppsMenuProps {\n /** Fonte dos apps (veja {@link AppsSource}). */\n source?: AppsSource;\n /** Rótulo acessível do botão. Padrão: \"Aplicativos\". */\n label?: string;\n /** Rótulo acessível (aria-label) do painel. Padrão: \"Aplicativos\". */\n title?: string;\n}\n\n/** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */\nexport function AppsMenu({ source = true, label = 'Aplicativos', title = 'Aplicativos' }: AppsMenuProps) {\n const { items, loading, error } = useApps(source);\n\n // `apps={false}` → não renderiza o botão.\n if (source === false) return null;\n\n return (\n <Dropdown\n align=\"start\"\n ariaLabel={title}\n panelWidth={400}\n panelClassName=\"rootzz-apps\"\n renderTrigger={({ toggle, triggerProps }) => (\n <IconButton onClick={toggle} aria-label={label} title={label} {...triggerProps}>\n <AppsGridIcon size={22} />\n </IconButton>\n )}\n >\n {loading && <div className=\"rootzz-apps__status\">Carregando…</div>}\n\n {error && !loading && (\n <div className=\"rootzz-apps__status\">Não foi possível carregar os aplicativos.</div>\n )}\n\n {!loading && !error && items.length > 0 && (\n <div className=\"rootzz-apps__grid rootzz-scrollbar-none\">\n {items.map((app, index) => (\n <a\n key={app.application ?? `${app.label}-${index}`}\n href={app.url}\n title={app.description ?? app.label}\n role=\"menuitem\"\n className=\"rootzz-apps__item\"\n >\n <img src={app.icon} alt=\"\" className=\"rootzz-apps__icon\" loading=\"lazy\" />\n <span className=\"rootzz-apps__label\">{app.label}</span>\n </a>\n ))}\n </div>\n )}\n </Dropdown>\n );\n}\n","import { isValidElement } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useApplication } from '../lib/useApps';\nimport type { AppsSource, LogoConfig } from '../lib/types';\nimport { AppsMenu } from './AppsMenu';\n\nexport interface BrandProps {\n /**\n * Logo da topbar. Aceita:\n * - a string `\"myeduzz\"` → renderiza o logo oficial do MyEduzz;\n * - um `LogoConfig` (`{ src, alt, href… }`) → imagem configurável;\n * - qualquer `ReactNode` → renderizado como veio.\n *\n * Ignorado quando `application` resolve um app.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (campo `application` do\n * `applications.json`, ex.: `\"orbita\"`). Busca o app na lista oficial e\n * renderiza o logo + nome dele, linkando para a `url` do app.\n * No mobile, mostra apenas o logo (sem o nome). Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n appsLabel?: string;\n}\n\n/** URL do logo oficial do MyEduzz (CDN da Eduzz). */\nconst MYEDUZZ_LOGO: LogoConfig = {\n src: 'https://cdn.eduzzcdn.com/topbar/orbita-new.svg',\n alt: 'MyEduzz',\n height: 28,\n};\n\n/** `true` quando `logo` é o atalho de string para o logo do MyEduzz. */\nfunction isMyEduzzShortcut(value: unknown): value is string {\n return typeof value === 'string' && value.trim().toLowerCase() === 'myeduzz';\n}\n\nfunction isLogoConfig(value: unknown): value is LogoConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n !isValidElement(value) &&\n 'src' in (value as Record<string, unknown>)\n );\n}\n\nfunction Logo({ logo }: { logo: ReactNode | LogoConfig }) {\n const { linkComponent: Link } = useLayout();\n\n if (isLogoConfig(logo)) {\n const img = (\n <img src={logo.src} alt={logo.alt ?? ''} className=\"rootzz-brand__logo-img\" />\n );\n\n if (logo.href) {\n return (\n <Link href={logo.href} onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </Link>\n );\n }\n if (logo.onClick) {\n return (\n <button type=\"button\" onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </button>\n );\n }\n return <span className=\"rootzz-brand__logo-link\">{img}</span>;\n }\n\n return <>{logo}</>;\n}\n\n/** Marca de um aplicativo resolvido do `applications.json`: logo + nome (link). */\nfunction ApplicationBrand({ application }: { application: string }) {\n const { linkComponent: Link } = useLayout();\n const { app } = useApplication(application);\n\n if (!app) return null;\n\n return (\n <Link href={app.url} className=\"rootzz-brand__app\" title={app.label}>\n <img src={app.icon} alt={app.label} className=\"rootzz-brand__app-icon\" />\n <span className=\"rootzz-brand__app-name\">{app.label}</span>\n </Link>\n );\n}\n\n/** Bloco da esquerda da topbar: botão de aplicativos + logo/aplicação. */\nexport function Brand({ logo, application, apps, appsLabel }: BrandProps) {\n // A string \"myeduzz\" é um atalho para o logo oficial; qualquer outro valor\n // (LogoConfig ou ReactNode) é renderizado como veio.\n const resolvedLogo = isMyEduzzShortcut(logo) ? MYEDUZZ_LOGO : logo;\n\n return (\n <div className=\"rootzz-brand\">\n <AppsMenu source={apps} label={appsLabel} />\n {application ? (\n <span className=\"rootzz-brand__logo\">\n <ApplicationBrand application={application} />\n </span>\n ) : (\n resolvedLogo != null && (\n <span className=\"rootzz-brand__logo\">\n <Logo logo={resolvedLogo} />\n </span>\n )\n )}\n </div>\n );\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { IconButton } from './IconButton';\nimport { MoonIcon, SunIcon } from '../lib/icons';\n\nexport interface ThemeToggleProps {\n /** Rótulo acessível. Padrão: \"Alternar tema\". */\n label?: string;\n}\n\n/** Botão de alternância de tema (claro/escuro), com crossfade dos ícones. */\nexport function ThemeToggle({ label = 'Alternar tema' }: ThemeToggleProps) {\n const { theme, toggleTheme } = useLayout();\n const isDark = theme === 'dark';\n\n return (\n <IconButton onClick={toggleTheme} aria-label={label} title={label}>\n <span className=\"rootzz-theme-toggle\">\n <SunIcon size={20} className={cxFade(isDark)} />\n <MoonIcon size={20} className={cxFade(!isDark)} />\n </span>\n </IconButton>\n );\n}\n\n/** Posiciona ambos os ícones empilhados e faz o crossfade conforme visível. */\nfunction cxFade(visible: boolean): string {\n return [\n 'rootzz-theme-toggle__icon',\n visible ? 'rootzz-theme-toggle__icon--visible' : 'rootzz-theme-toggle__icon--hidden',\n ].join(' ');\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { UserConfig, UserMenuEntry } from '../lib/types';\nimport { Dropdown } from './Dropdown';\n\nexport interface UserMenuProps {\n user: UserConfig;\n}\n\nfunction computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction Avatar({ user, size = 32 }: { user: UserConfig; size?: number }) {\n const initials = user.initials ?? computeInitials(user.name);\n if (user.avatarUrl) {\n return (\n <img\n src={user.avatarUrl}\n alt={user.name}\n style={{ width: size, height: size }}\n className=\"rootzz-avatar\"\n />\n );\n }\n return (\n <span aria-hidden style={{ width: size, height: size }} className=\"rootzz-avatar rootzz-avatar--initials\">\n {initials}\n </span>\n );\n}\n\nfunction isDivider(entry: UserMenuEntry): entry is { type: 'divider'; key?: string } {\n return (entry as { type?: string }).type === 'divider';\n}\n\n/** Usuário à direita da topbar: avatar + nome + dropdown de ações. */\nexport function UserMenu({ user }: UserMenuProps) {\n const { linkComponent: Link } = useLayout();\n const hasMenu = !!user.menu && user.menu.length > 0;\n\n const trigger = (extra?: { toggle: () => void; triggerProps?: object }) => (\n <button\n type=\"button\"\n onClick={extra ? extra.toggle : user.onClick}\n {...(extra?.triggerProps ?? {})}\n className=\"rootzz-user\"\n >\n <Avatar user={user} />\n <span className=\"rootzz-user__name\">{user.name}</span>\n {hasMenu && <ChevronDownIcon size={16} className=\"rootzz-user__chevron\" />}\n </button>\n );\n\n if (!hasMenu) {\n return trigger();\n }\n\n return (\n <Dropdown\n align=\"end\"\n ariaLabel={`Menu de ${user.name}`}\n panelWidth={240}\n renderTrigger={({ toggle, triggerProps }) => trigger({ toggle, triggerProps })}\n >\n <div className=\"rootzz-user-panel__header\">\n <Avatar user={user} size={36} />\n <div className=\"rootzz-user-panel__info\">\n <div className=\"rootzz-user-panel__name\">{user.name}</div>\n {user.email && <div className=\"rootzz-user-panel__email\">{user.email}</div>}\n </div>\n </div>\n\n <div className=\"rootzz-divider\" />\n\n {user.menu!.map((entry, index) => {\n if (isDivider(entry)) {\n return <div key={entry.key ?? `divider-${index}`} className=\"rootzz-divider\" />;\n }\n\n const itemClass = cx(\n 'rootzz-menu-item',\n entry.disabled && 'rootzz-menu-item--disabled',\n entry.danger && 'rootzz-menu-item--danger',\n );\n\n const content = (\n <>\n {entry.icon && <span className=\"rootzz-menu-item__icon\">{entry.icon}</span>}\n <span className=\"rootzz-menu-item__label\">{entry.label}</span>\n </>\n );\n\n if (entry.href) {\n return (\n <Link key={entry.key ?? index} href={entry.href} role=\"menuitem\" className={itemClass}>\n {content}\n </Link>\n );\n }\n return (\n <button key={entry.key ?? index} type=\"button\" role=\"menuitem\" onClick={entry.onClick} className={itemClass}>\n {content}\n </button>\n );\n })}\n </Dropdown>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { MenuIcon } from '../lib/icons';\nimport type { AppsSource, LogoConfig, UserConfig } from '../lib/types';\nimport { Brand } from './Brand';\nimport { IconButton } from './IconButton';\nimport { ThemeToggle } from './ThemeToggle';\nimport { UserMenu } from './UserMenu';\n\nexport interface TopbarProps {\n /**\n * Logo exibido à esquerda. Aceita a string `\"myeduzz\"` (renderiza o logo\n * oficial do MyEduzz), um `LogoConfig` ou qualquer `ReactNode`.\n * Ignorado quando `application` é informado.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (ex.: `\"orbita\"`). Busca o app no\n * `applications.json` e renderiza o logo + nome dele (no mobile, só o logo),\n * linkando para a URL do app. Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n search?: ReactNode;\n actions?: ReactNode;\n user?: UserConfig;\n showThemeToggle?: boolean;\n /** Exibe o botão de menu (hambúrguer) no mobile. Padrão: `true`. */\n showMenuButton?: boolean;\n appsLabel?: string;\n menuButtonLabel?: string;\n className?: string;\n}\n\n/** Barra superior fixa: marca à esquerda, busca opcional ao centro, ações/usuário à direita. */\nexport function Topbar({\n logo,\n application,\n apps,\n search,\n actions,\n user,\n showThemeToggle = false,\n showMenuButton = true,\n appsLabel,\n menuButtonLabel = 'Abrir menu',\n className,\n}: TopbarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n return (\n <header className={cx('rootzz-topbar', className)}>\n {/* Esquerda */}\n <div className=\"rootzz-topbar__left\">\n {showMenuButton && (\n <IconButton\n className=\"rootzz-topbar__menu-button\"\n aria-label={menuButtonLabel}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen(!mobileOpen)}\n >\n <MenuIcon size={22} />\n </IconButton>\n )}\n <Brand logo={logo} application={application} apps={apps} appsLabel={appsLabel} />\n </div>\n\n {/* Centro (busca opcional) */}\n <div className=\"rootzz-topbar__center\">\n {search && <div className=\"rootzz-topbar__search\">{search}</div>}\n </div>\n\n {/* Direita */}\n <div className=\"rootzz-topbar__right\">\n {actions}\n {showThemeToggle && <ThemeToggle />}\n {user && <UserMenu user={user} />}\n </div>\n </header>\n );\n}\n","import { Children, isValidElement } from 'react';\nimport type { ReactElement } from 'react';\nimport { LayoutProvider, useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport type { RootzzLayoutProps } from '../lib/types';\nimport { Content } from './Content';\nimport { Sidebar } from './Sidebar';\nimport { Topbar } from './Topbar';\n\n/** Organiza os filhos: Topbar no topo (largura total), Sidebar + Content na linha abaixo. */\nfunction Shell({ children, className, style, id }: Pick<RootzzLayoutProps, 'children' | 'className' | 'style' | 'id'>) {\n const { theme } = useLayout();\n\n const items = Children.toArray(children).filter(isValidElement) as ReactElement[];\n const topbar = items.find((el) => el.type === Topbar);\n const sidebars = items.filter((el) => el.type === Sidebar);\n // Content + qualquer outro filho (na ordem fornecida), sempre após a sidebar.\n const body = items.filter((el) => el.type !== Topbar && el.type !== Sidebar);\n\n return (\n <div id={id} data-theme={theme} style={style} className={cx('rootzz-layout', className)}>\n {topbar}\n <div className=\"rootzz-layout__body\">\n {sidebars}\n {body}\n </div>\n </div>\n );\n}\n\n/**\n * Shell de aplicação composável. Forneça os subcomponentes como filhos —\n * cada um com suas próprias props.\n *\n * @example\n * import { RootzzLayout } from 'rootzz-layout';\n * import 'rootzz-layout/styles.css';\n *\n * <RootzzLayout>\n * <RootzzLayout.Topbar\n * logo={{ src: '/logo.svg', alt: 'MyEduzz', href: '/' }}\n * apps\n * showThemeToggle\n * user={{ name: 'Designers da Eduzz', initials: 'Dd', menu: [{ label: 'Sair', danger: true }] }}\n * />\n * <RootzzLayout.Sidebar\n * activeKey=\"resumo\"\n * menu={[\n * { key: 'resumo', label: 'Resumo', href: '/' },\n * { type: 'group', key: 'vendas', label: 'Vendas', items: [{ key: 'pedidos', label: 'Pedidos', href: '/pedidos' }] },\n * ]}\n * />\n * <RootzzLayout.Content>conteúdo aqui</RootzzLayout.Content>\n * </RootzzLayout>\n *\n * Config de nível de shell (tema, linkComponent) fica no `<RootzzLayout>`:\n * `<RootzzLayout theme=\"dark\" linkComponent={Link}>…</RootzzLayout>`\n */\nfunction RootzzLayoutBase({\n children,\n theme,\n defaultTheme,\n onThemeChange,\n linkComponent,\n className,\n style,\n id,\n}: RootzzLayoutProps) {\n return (\n <LayoutProvider\n theme={theme}\n defaultTheme={defaultTheme}\n onThemeChange={onThemeChange}\n linkComponent={linkComponent}\n >\n <Shell className={className} style={style} id={id}>\n {children}\n </Shell>\n </LayoutProvider>\n );\n}\n\n/**\n * `RootzzLayout` + subcomponentes anexados:\n * `RootzzLayout.Topbar`, `RootzzLayout.Sidebar`, `RootzzLayout.Content`.\n * (Os mesmos componentes também são exportados individualmente.)\n */\nexport const RootzzLayout = Object.assign(RootzzLayoutBase, {\n Topbar,\n Sidebar,\n Content,\n});\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { SearchIcon } from '../lib/icons';\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Texto de placeholder. */\n placeholder?: string;\n /** Dica de atalho exibida à direita (ex.: \"⌘K\"). */\n shortcut?: ReactNode;\n /** Classe extra do wrapper. */\n wrapperClassName?: string;\n}\n\n/**\n * Campo de busca estilizado para o centro da topbar (opcional).\n * É um `<input>` comum — controle via `value`/`onChange` como qualquer input.\n */\nexport const SearchBar = forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { placeholder = 'Buscar…', shortcut, wrapperClassName, className, ...rest },\n ref,\n) {\n return (\n <div className={cx('rootzz-search', wrapperClassName)}>\n <SearchIcon size={18} className=\"rootzz-search__icon\" />\n <input\n ref={ref}\n type=\"search\"\n placeholder={placeholder}\n className={cx('rootzz-search__input', className)}\n {...rest}\n />\n {shortcut != null && <kbd className=\"rootzz-search__shortcut\">{shortcut}</kbd>}\n </div>\n );\n});\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -291,7 +291,7 @@ interface AppsMenuProps {
|
|
|
291
291
|
source?: AppsSource;
|
|
292
292
|
/** Rótulo acessível do botão. Padrão: "Aplicativos". */
|
|
293
293
|
label?: string;
|
|
294
|
-
/**
|
|
294
|
+
/** Rótulo acessível (aria-label) do painel. Padrão: "Aplicativos". */
|
|
295
295
|
title?: string;
|
|
296
296
|
}
|
|
297
297
|
/** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */
|
package/dist/index.d.ts
CHANGED
|
@@ -291,7 +291,7 @@ interface AppsMenuProps {
|
|
|
291
291
|
source?: AppsSource;
|
|
292
292
|
/** Rótulo acessível do botão. Padrão: "Aplicativos". */
|
|
293
293
|
label?: string;
|
|
294
|
-
/**
|
|
294
|
+
/** Rótulo acessível (aria-label) do painel. Padrão: "Aplicativos". */
|
|
295
295
|
title?: string;
|
|
296
296
|
}
|
|
297
297
|
/** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */
|
package/dist/index.mjs
CHANGED
|
@@ -576,11 +576,10 @@ function AppsMenu({ source = true, label = "Aplicativos", title = "Aplicativos"
|
|
|
576
576
|
{
|
|
577
577
|
align: "start",
|
|
578
578
|
ariaLabel: title,
|
|
579
|
-
panelWidth:
|
|
579
|
+
panelWidth: 400,
|
|
580
580
|
panelClassName: "rootzz-apps",
|
|
581
581
|
renderTrigger: ({ toggle, triggerProps }) => /* @__PURE__ */ jsx(IconButton, { onClick: toggle, "aria-label": label, title: label, ...triggerProps, children: /* @__PURE__ */ jsx(AppsGridIcon, { size: 22 }) }),
|
|
582
582
|
children: [
|
|
583
|
-
/* @__PURE__ */ jsx("div", { className: "rootzz-apps__title", children: title }),
|
|
584
583
|
loading && /* @__PURE__ */ jsx("div", { className: "rootzz-apps__status", children: "Carregando\u2026" }),
|
|
585
584
|
error && !loading && /* @__PURE__ */ jsx("div", { className: "rootzz-apps__status", children: "N\xE3o foi poss\xEDvel carregar os aplicativos." }),
|
|
586
585
|
!loading && !error && items.length > 0 && /* @__PURE__ */ jsx("div", { className: "rootzz-apps__grid rootzz-scrollbar-none", children: items.map((app, index) => /* @__PURE__ */ jsxs(
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/useControllableState.ts","../src/context/LayoutContext.tsx","../src/lib/cx.ts","../src/components/Content.tsx","../src/context/SidebarContext.tsx","../src/lib/icons.tsx","../src/components/IconButton.tsx","../src/lib/usePresence.ts","../src/components/Overlay.tsx","../src/components/SidebarItem.tsx","../src/components/SidebarGroup.tsx","../src/components/Sidebar.tsx","../src/lib/useApps.ts","../src/lib/useDismiss.ts","../src/components/Dropdown.tsx","../src/components/AppsMenu.tsx","../src/components/Brand.tsx","../src/components/ThemeToggle.tsx","../src/components/UserMenu.tsx","../src/components/Topbar.tsx","../src/components/RootzzLayout.tsx","../src/components/SearchBar.tsx"],"names":["useState","useCallback","jsx","createContext","useContext","cx","IconButton","jsxs","useEffect","useRef","useId","Fragment","isValidElement","forwardRef","SearchBar"],"mappings":"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","file":"index.mjs","sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\n/**\n * Estado que pode ser controlado (via prop) ou não-controlado (estado interno).\n * Espelha o padrão usado por bibliotecas como Radix/React Aria, sem dependências.\n */\nexport function useControllableState<T>(options: {\n /** Valor controlado. Se `undefined`, o estado é interno. */\n value?: T;\n /** Valor inicial quando não-controlado. */\n defaultValue: T;\n /** Notifica mudanças (em ambos os modos). */\n onChange?: (value: T) => void;\n}): [T, (next: T | ((prev: T) => T)) => void] {\n const { value, defaultValue, onChange } = options;\n const isControlled = value !== undefined;\n\n const [internal, setInternal] = useState<T>(defaultValue);\n\n // Mantém o onChange fresco sem recriar o setter.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const current = isControlled ? (value as T) : internal;\n const currentRef = useRef(current);\n currentRef.current = current;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === 'function'\n ? (next as (prev: T) => T)(currentRef.current)\n : next;\n\n if (!isControlled) {\n setInternal(resolved);\n }\n if (resolved !== currentRef.current) {\n onChangeRef.current?.(resolved);\n }\n },\n [isControlled],\n );\n\n return [current, setValue];\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport { useControllableState } from '../lib/useControllableState';\nimport type { LinkComponent, ThemeMode } from '../lib/types';\n\n/** Breakpoint mobile (abaixo do `md` do Tailwind). */\nconst MOBILE_QUERY = '(max-width: 767.98px)';\n\nexport interface LayoutContextValue {\n /** Tema atual. */\n theme: ThemeMode;\n /** Define o tema. */\n setTheme: (theme: ThemeMode) => void;\n /** Alterna entre claro e escuro. */\n toggleTheme: () => void;\n /** Drawer mobile aberto? */\n mobileOpen: boolean;\n /** Abre/fecha o drawer mobile. */\n setMobileOpen: (open: boolean) => void;\n /** Estamos em viewport mobile? */\n isMobile: boolean;\n /** Componente de link usado na navegação (padrão `<a>`). */\n linkComponent: LinkComponent;\n}\n\nconst LayoutContext = createContext<LayoutContextValue | null>(null);\n\n/** Acessa o estado do layout (tema, drawer mobile, etc.). */\nexport function useLayout(): LayoutContextValue {\n const ctx = useContext(LayoutContext);\n if (!ctx) {\n throw new Error('useLayout deve ser usado dentro de <RootzzLayout> ou <LayoutShell>.');\n }\n return ctx;\n}\n\nexport interface LayoutProviderProps {\n children: ReactNode;\n theme?: ThemeMode;\n defaultTheme?: ThemeMode;\n onThemeChange?: (theme: ThemeMode) => void;\n linkComponent?: LinkComponent;\n}\n\nexport function LayoutProvider({\n children,\n theme: themeProp,\n defaultTheme = 'light',\n onThemeChange,\n linkComponent = 'a',\n}: LayoutProviderProps) {\n const [theme, setTheme] = useControllableState<ThemeMode>({\n value: themeProp,\n defaultValue: defaultTheme,\n onChange: onThemeChange,\n });\n\n const [mobileOpen, setMobileOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n // Detecta viewport mobile (sem dependências, SSR-safe).\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const update = () => setIsMobile(mql.matches);\n update();\n mql.addEventListener('change', update);\n return () => mql.removeEventListener('change', update);\n }, []);\n\n // Ao sair do mobile, garante o drawer fechado.\n useEffect(() => {\n if (!isMobile && mobileOpen) setMobileOpen(false);\n }, [isMobile, mobileOpen]);\n\n // Trava o scroll do body enquanto o drawer mobile está aberto.\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (!mobileOpen || !isMobile) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = previous;\n };\n }, [mobileOpen, isMobile]);\n\n const toggleTheme = useCallback(() => {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }, [theme, setTheme]);\n\n const value = useMemo<LayoutContextValue>(\n () => ({\n theme,\n setTheme,\n toggleTheme,\n mobileOpen,\n setMobileOpen,\n isMobile,\n linkComponent,\n }),\n [theme, setTheme, toggleTheme, mobileOpen, isMobile, linkComponent],\n );\n\n return <LayoutContext.Provider value={value}>{children}</LayoutContext.Provider>;\n}\n","/**\n * Concatena classes condicionalmente. Substituto mínimo de `clsx` para manter\n * a biblioteca sem dependências de runtime.\n *\n * @example cx('rootzz-item', isActive && 'rootzz-item--active', { 'rootzz-hidden': hidden })\n */\nexport type ClassValue =\n | string\n | number\n | null\n | false\n | undefined\n | ClassValue[]\n | Record<string, boolean | null | undefined>;\n\nexport function cx(...inputs: ClassValue[]): string {\n const out: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === 'string' || typeof input === 'number') {\n out.push(String(input));\n } else if (Array.isArray(input)) {\n const inner = cx(...input);\n if (inner) out.push(inner);\n } else if (typeof input === 'object') {\n for (const key in input) {\n if (input[key]) out.push(key);\n }\n }\n }\n\n return out.join(' ');\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface ContentProps {\n children?: ReactNode;\n /**\n * Largura máxima do conteúdo. `false` ocupa 100%.\n * Omitido usa o token `--rzl-content-max-width`.\n */\n maxWidth?: number | string | false;\n /** Classe extra no wrapper interno. */\n className?: string;\n /** Remove o padding padrão. */\n noPadding?: boolean;\n}\n\n/** Área de conteúdo: rola verticalmente e centraliza/limita a largura do que for inserido. */\nexport function Content({ children, maxWidth, className, noPadding = false }: ContentProps) {\n const useToken = maxWidth === undefined;\n const style: CSSProperties | undefined =\n maxWidth === undefined || maxWidth === false ? undefined : { maxWidth };\n\n return (\n <main className=\"rootzz-content\">\n <div\n style={style}\n className={cx(\n 'rootzz-content__inner',\n useToken && 'rootzz-content__inner--max',\n !noPadding && 'rootzz-content__inner--padded',\n className,\n )}\n >\n {children}\n </div>\n </main>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Estado local da Sidebar (compartilhado com itens/grupos). */\nexport interface SidebarContextValue {\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({});\n\nexport const SidebarProvider = SidebarContext.Provider;\n\nexport function useSidebar(): SidebarContextValue {\n return useContext(SidebarContext);\n}\n","import type { SVGProps } from 'react';\n\n/**\n * Ícones SVG inline — evitam uma dependência de biblioteca de ícones.\n * Usam `currentColor`, então herdam a cor do texto via classes utilitárias.\n */\ntype IconProps = SVGProps<SVGSVGElement> & { size?: number | string };\n\nfunction base({ size = 20, ...props }: IconProps) {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n xmlns: 'http://www.w3.org/2000/svg',\n 'aria-hidden': true,\n focusable: false,\n ...props,\n } as SVGProps<SVGSVGElement>;\n}\n\n// Estilo lucide-react: viewBox 24, fill none, stroke currentColor, stroke-width 1.5,\n// linecap/linejoin round. Os paths abaixo são os mesmos dos ícones lucide.\nconst stroke = {\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\n/** Grade 9-pontos (botão de aplicativos) — lucide `Grip`. */\nexport function AppsGridIcon(props: IconProps) {\n const xs = [5, 12, 19];\n const ys = [5, 12, 19];\n return (\n <svg {...base(props)}>\n {ys.flatMap((cy) =>\n xs.map((cx) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r={1} {...stroke} />),\n )}\n </svg>\n );\n}\n\n/** Chevron para baixo — lucide `ChevronDown`. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"m6 9 6 6 6-6\" {...stroke} />\n </svg>\n );\n}\n\n/** Sino de notificações. */\nexport function BellIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9\" {...stroke} />\n <path d=\"M13.7 21a2 2 0 0 1-3.4 0\" {...stroke} />\n </svg>\n );\n}\n\n/** Menu hambúrguer (mobile). */\nexport function MenuIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M3 6h18M3 12h18M3 18h18\" {...stroke} />\n </svg>\n );\n}\n\n/** Fechar (X). */\nexport function CloseIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 6 6 18M6 6l12 12\" {...stroke} />\n </svg>\n );\n}\n\n/** Lupa de busca. */\nexport function SearchIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={11} cy={11} r={7} {...stroke} />\n <path d=\"m21 21-4.3-4.3\" {...stroke} />\n </svg>\n );\n}\n\n/** Sol (tema claro). */\nexport function SunIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={12} cy={12} r={4} {...stroke} />\n <path\n d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\n {...stroke}\n />\n </svg>\n );\n}\n\n/** Lua (tema escuro). */\nexport function MoonIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\" {...stroke} />\n </svg>\n );\n}\n\n/** Link externo (itens do menu de apps). */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M15 3h6v6M10 14 21 3M21 14v5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5\" {...stroke} />\n </svg>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Ícone/conteúdo central. */\n children: ReactNode;\n /** Conteúdo do badge (número ou nó). `true` exibe um ponto. */\n badge?: ReactNode | boolean;\n /** Tamanho do botão em px. Padrão: 40. */\n size?: number;\n}\n\n/**\n * Botão de ícone padronizado para a topbar (hover suave, foco acessível, badge opcional).\n * Útil também para montar suas próprias ações custom mantendo a consistência visual.\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { children, badge, size = 40, className, type = 'button', ...rest },\n ref,\n) {\n const hasBadge = badge !== undefined && badge !== false && badge !== null;\n const isDot = badge === true;\n\n return (\n <button\n ref={ref}\n type={type}\n style={{ width: size, height: size }}\n className={cx('rootzz-icon-button', className)}\n {...rest}\n >\n {children}\n {hasBadge && (\n <span\n className={cx(\n 'rootzz-icon-button__badge',\n isDot ? 'rootzz-icon-button__badge--dot' : 'rootzz-icon-button__badge--count',\n )}\n >\n {!isDot && badge}\n </span>\n )}\n </button>\n );\n});\n","import { useEffect, useState } from 'react';\n\nexport interface Presence {\n /** Deve renderizar no DOM? (permanece `true` durante a saída). */\n mounted: boolean;\n /** Estado visual para alternar classes de transição (entrada/saída). */\n active: boolean;\n}\n\n/**\n * Coordena enter/exit com transições CSS, sem libs de animação.\n * Mantém o elemento montado durante a saída para o fade-out acontecer.\n *\n * @param open estado desejado\n * @param duration ms que o elemento fica montado durante a saída (casa com --rzl-duration)\n */\nexport function usePresence(open: boolean, duration = 220): Presence {\n const [mounted, setMounted] = useState(open);\n const [active, setActive] = useState(open);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n // Próximo frame: ativa as classes \"abertas\" para a transição rodar.\n const raf = requestAnimationFrame(() => setActive(true));\n return () => cancelAnimationFrame(raf);\n }\n setActive(false);\n const timer = setTimeout(() => setMounted(false), duration);\n return () => clearTimeout(timer);\n }, [open, duration]);\n\n return { mounted, active };\n}\n","import { cx } from '../lib/cx';\nimport { usePresence } from '../lib/usePresence';\n\nexport interface OverlayProps {\n open: boolean;\n onClick?: () => void;\n className?: string;\n}\n\n/** Camada escura semitransparente (mobile), com fade in/out. */\nexport function Overlay({ open, onClick, className }: OverlayProps) {\n const { mounted, active } = usePresence(open);\n if (!mounted) return null;\n\n return (\n <div\n // Decorativo: o fechamento acessível é via Escape (useDismiss) e botões.\n data-rzl=\"overlay\"\n aria-hidden\n onClick={onClick}\n className={cx(\n 'rootzz-overlay',\n active ? 'rootzz-overlay--active' : 'rootzz-overlay--inactive',\n className,\n )}\n />\n );\n}\n","import type { MouseEvent } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport type { MenuLink } from '../lib/types';\n\nexport interface SidebarItemProps {\n item: MenuLink;\n /** Recuo extra (usado para itens dentro de grupos). */\n nested?: boolean;\n}\n\n/** Item simples (link) da sidebar, com estado ativo. */\nexport function SidebarItem({ item, nested = false }: SidebarItemProps) {\n const { linkComponent: Link, isMobile, setMobileOpen } = useLayout();\n const { activeKey } = useSidebar();\n\n const isActive = item.active ?? (activeKey != null && item.key === activeKey);\n\n const handleClick = (event: MouseEvent) => {\n item.onClick?.(event);\n // Em mobile, navegar fecha o drawer.\n if (isMobile) setMobileOpen(false);\n };\n\n // Itens aninhados recebem margem horizontal para o pill ficar mais estreito que o pai.\n const className = cx(\n 'rootzz-sidebar-item',\n nested && 'rootzz-sidebar-item--nested',\n item.disabled && 'rootzz-sidebar-item--disabled',\n isActive && 'rootzz-sidebar-item--active',\n );\n\n const content = (\n <>\n {item.icon && <span className=\"rootzz-sidebar-item__icon\">{item.icon}</span>}\n <span className=\"rootzz-sidebar-item__label\">{item.label}</span>\n {item.badge != null && <span className=\"rootzz-sidebar-item__badge\">{item.badge}</span>}\n </>\n );\n\n if (item.href && !item.disabled) {\n return (\n <Link\n href={item.href}\n target={item.target}\n onClick={handleClick}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </Link>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={item.disabled}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </button>\n );\n}\n","import { useId, useState } from 'react';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { MenuGroup } from '../lib/types';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarGroupProps {\n group: MenuGroup;\n}\n\n/** Grupo colapsável da sidebar (label em maiúsculas + chevron animado + altura animada). */\nexport function SidebarGroup({ group }: SidebarGroupProps) {\n const { activeKey } = useSidebar();\n const collapsible = group.collapsible ?? true;\n const [collapsed, setCollapsed] = useState(collapsible ? (group.defaultCollapsed ?? false) : false);\n const open = collapsible ? !collapsed : true;\n const regionId = useId();\n\n // Se algum filho está ativo, o label do grupo fica destacado (cor ativa).\n const hasActiveChild = group.items.some(\n (it) => it.active || (activeKey != null && it.key === activeKey),\n );\n\n const header = (\n <div className=\"rootzz-sidebar-group__header\">\n {group.icon && <span className=\"rootzz-sidebar-group__icon\">{group.icon}</span>}\n <span\n className={cx(\n 'rootzz-sidebar-group__label',\n hasActiveChild && 'rootzz-sidebar-group__label--active',\n )}\n >\n {group.label}\n </span>\n {collapsible && (\n <ChevronDownIcon\n size={16}\n className={cx(\n 'rootzz-sidebar-group__chevron',\n open && 'rootzz-sidebar-group__chevron--open',\n )}\n />\n )}\n </div>\n );\n\n return (\n <div className=\"rootzz-sidebar-group\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => setCollapsed((v) => !v)}\n aria-expanded={open}\n aria-controls={regionId}\n className=\"rootzz-sidebar-group__trigger\"\n >\n {header}\n </button>\n ) : (\n header\n )}\n\n {/* Altura animada via grid-template-rows (0fr → 1fr). Mantém o conteúdo\n montado para o colapso ser suave nos dois sentidos. */}\n <div\n id={regionId}\n aria-hidden={!open}\n className={cx(\n 'rootzz-sidebar-group__region',\n open && 'rootzz-sidebar-group__region--open',\n )}\n >\n <div className=\"rootzz-sidebar-group__clip\">\n <div className=\"rootzz-sidebar-group__items\">\n {group.items.map((item) => (\n <SidebarItem key={item.key} item={item} nested />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { SidebarProvider } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { CloseIcon } from '../lib/icons';\nimport type { MenuItem } from '../lib/types';\nimport { IconButton } from './IconButton';\nimport { Overlay } from './Overlay';\nimport { SidebarGroup } from './SidebarGroup';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarProps {\n /** Entradas do menu (links, grupos, divisores). */\n menu?: MenuItem[];\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n /** Conteúdo fixo no topo. */\n header?: ReactNode;\n /** Conteúdo fixo no rodapé. */\n footer?: ReactNode;\n /** Rótulo acessível da navegação. Padrão: \"Navegação principal\". */\n ariaLabel?: string;\n /** Conteúdo custom (substitui `menu` se quiser compor manualmente). */\n children?: ReactNode;\n className?: string;\n /** Título do drawer mobile. */\n mobileTitle?: ReactNode;\n}\n\nfunction renderEntry(entry: MenuItem, index: number) {\n if ((entry as { type?: string }).type === 'divider') {\n return <div key={(entry as { key?: string }).key ?? `divider-${index}`} className=\"rootzz-nav__divider\" />;\n }\n if ((entry as { type?: string }).type === 'group') {\n const group = entry as Extract<MenuItem, { type: 'group' }>;\n return <SidebarGroup key={group.key} group={group} />;\n }\n const item = entry as Extract<MenuItem, { type?: 'item' }>;\n return <SidebarItem key={item.key} item={item} />;\n}\n\nfunction Nav({\n menu,\n header,\n footer,\n ariaLabel,\n children,\n}: Pick<SidebarProps, 'menu' | 'header' | 'footer' | 'ariaLabel' | 'children'>) {\n return (\n <nav aria-label={ariaLabel ?? 'Navegação principal'} className=\"rootzz-nav\">\n {header && <div className=\"rootzz-nav__header\">{header}</div>}\n\n <div className=\"rootzz-nav__scroll rootzz-scrollbar-none\">\n {children ?? <div className=\"rootzz-nav__list\">{menu?.map(renderEntry)}</div>}\n </div>\n\n {footer && <div className=\"rootzz-nav__footer\">{footer}</div>}\n </nav>\n );\n}\n\n/**\n * Sidebar de navegação.\n * - Desktop (≥768px): coluna fixa com largura `--rzl-sidebar-width`.\n * - Mobile (<768px): drawer off-canvas com overlay e fade/slide suaves.\n */\nexport function Sidebar({\n menu,\n activeKey,\n header,\n footer,\n ariaLabel,\n children,\n className,\n mobileTitle,\n}: SidebarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n // Escape fecha o drawer no mobile.\n useEffect(() => {\n if (!mobileOpen) return;\n if (typeof document === 'undefined') return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n const navProps = { menu, header, footer, ariaLabel, children };\n\n return (\n <SidebarProvider value={{ activeKey }}>\n {/* Desktop: coluna estática */}\n <aside data-rzl=\"sidebar\" className={cx('rootzz-sidebar', className)}>\n <Nav {...navProps} />\n </aside>\n\n {/* Mobile: overlay + drawer */}\n <Overlay open={mobileOpen} onClick={() => setMobileOpen(false)} />\n <aside\n data-rzl=\"drawer\"\n data-state={mobileOpen ? 'open' : 'closed'}\n aria-hidden={!mobileOpen}\n className={cx('rootzz-drawer', mobileOpen && 'rootzz-drawer--open', className)}\n >\n <div className=\"rootzz-drawer__header\">\n <span className=\"rootzz-drawer__title\">{mobileTitle}</span>\n <IconButton aria-label=\"Fechar menu\" onClick={() => setMobileOpen(false)}>\n <CloseIcon size={22} />\n </IconButton>\n </div>\n <div className=\"rootzz-drawer__body\">\n <Nav {...navProps} />\n </div>\n </aside>\n </SidebarProvider>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { AppItem, AppsSource } from './types';\n\n/** URL padrão da lista de aplicativos da Eduzz. */\nexport const DEFAULT_APPS_URL = 'https://cdn.eduzzcdn.com/topbar/applications.json';\n\n/** Cache em nível de módulo: evita refetch entre múltiplas instâncias / re-renders. */\nconst cache = new Map<string, Promise<AppItem[]>>();\n\nfunction fetchApps(url: string): Promise<AppItem[]> {\n let promise = cache.get(url);\n if (!promise) {\n promise = fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status} ao buscar apps`);\n return res.json();\n })\n .then((data) => (Array.isArray(data) ? (data as AppItem[]) : []))\n .catch((err) => {\n // Em caso de erro, limpa o cache para permitir nova tentativa futura.\n cache.delete(url);\n throw err;\n });\n cache.set(url, promise);\n }\n return promise;\n}\n\ninterface ResolvedSource {\n staticItems: AppItem[] | null;\n url: string | null;\n}\n\nfunction resolveSource(source: AppsSource | undefined): ResolvedSource {\n if (!source) return { staticItems: null, url: null };\n if (source === true) return { staticItems: null, url: DEFAULT_APPS_URL };\n if (typeof source === 'string') return { staticItems: null, url: source };\n if (Array.isArray(source)) return { staticItems: source, url: null };\n if (source.items) return { staticItems: source.items, url: null };\n return { staticItems: null, url: source.url ?? DEFAULT_APPS_URL };\n}\n\nexport interface UseAppsResult {\n items: AppItem[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve a fonte de apps em `{ items, loading, error }`.\n * Listas estáticas são usadas direto; URLs são buscadas (com cache).\n */\nexport function useApps(source: AppsSource | undefined): UseAppsResult {\n const { staticItems, url } = resolveSource(source);\n\n const [items, setItems] = useState<AppItem[]>(staticItems ?? []);\n const [loading, setLoading] = useState<boolean>(!!url && !staticItems);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (staticItems) {\n setItems(staticItems);\n setLoading(false);\n setError(null);\n return;\n }\n if (!url) {\n setItems([]);\n setLoading(false);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setItems(data);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n // Estabilizamos por `url` e por uma assinatura simples da lista estática.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, staticItems ? staticItems.length : null]);\n\n return { items, loading, error };\n}\n\nexport interface UseApplicationResult {\n /** App encontrado pelo identificador, ou `null` enquanto carrega / se não existir. */\n app: AppItem | null;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve um único aplicativo da Eduzz pelo seu identificador (campo\n * `application` do `applications.json`). Reaproveita o mesmo fetch/cache de\n * {@link useApps}, então não há requisição extra quando o menu de apps já carregou.\n *\n * @param application Identificador (ex.: `\"orbita\"`). `undefined` desativa.\n * @param url Fonte custom do JSON. Padrão: {@link DEFAULT_APPS_URL}.\n */\nexport function useApplication(\n application: string | undefined,\n url: string = DEFAULT_APPS_URL,\n): UseApplicationResult {\n const [app, setApp] = useState<AppItem | null>(null);\n const [loading, setLoading] = useState<boolean>(!!application);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!application) {\n setApp(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setApp(data.find((item) => item.application === application) ?? null);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [application, url]);\n\n return { app, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * Fecha um elemento (dropdown, popover) ao clicar fora dele ou pressionar Escape.\n * Sem dependências; ouve eventos apenas enquanto `open` é `true`.\n */\nexport function useDismiss(\n open: boolean,\n refs: Array<RefObject<HTMLElement | null>>,\n onDismiss: () => void,\n): void {\n useEffect(() => {\n if (!open) return;\n if (typeof document === 'undefined') return;\n\n const handlePointer = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n const inside = refs.some((ref) => ref.current && ref.current.contains(target));\n if (!inside) onDismiss();\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onDismiss();\n };\n\n // `pointerdown` fecha antes de cliques dispararem navegação inesperada.\n document.addEventListener('pointerdown', handlePointer, true);\n document.addEventListener('keydown', handleKey);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointer, true);\n document.removeEventListener('keydown', handleKey);\n };\n }, [open, onDismiss, refs]);\n}\n","import { useId, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { useDismiss } from '../lib/useDismiss';\nimport { usePresence } from '../lib/usePresence';\nimport { useControllableState } from '../lib/useControllableState';\n\nexport interface DropdownTriggerArgs {\n open: boolean;\n toggle: () => void;\n /** Props a serem espalhadas no elemento de trigger (acessibilidade). */\n triggerProps: {\n 'aria-haspopup': 'menu';\n 'aria-expanded': boolean;\n 'aria-controls': string;\n };\n}\n\nexport interface DropdownProps {\n /** Renderiza o gatilho. Receba `toggle` e `triggerProps`. */\n renderTrigger: (args: DropdownTriggerArgs) => ReactNode;\n /** Conteúdo do painel. */\n children: ReactNode;\n /** Alinhamento horizontal do painel. Padrão: `'end'`. */\n align?: 'start' | 'end';\n /** Classe extra do painel. */\n panelClassName?: string;\n /** Largura do painel (px ou CSS). */\n panelWidth?: number | string;\n /** Fecha o painel ao clicar em qualquer lugar dentro dele. Padrão: `true`. */\n closeOnContentClick?: boolean;\n /** Rótulo acessível do menu. */\n ariaLabel?: string;\n /** Estado controlado (opcional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Dropdown inline (sem portal — garante herança do escopo de estilo `.rootzz-layout`).\n * Fecha em clique fora / Escape e faz fade in/out suave.\n */\nexport function Dropdown({\n renderTrigger,\n children,\n align = 'end',\n panelClassName,\n panelWidth,\n closeOnContentClick = true,\n ariaLabel,\n open: openProp,\n onOpenChange,\n}: DropdownProps) {\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: false,\n onChange: onOpenChange,\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, active } = usePresence(open);\n\n useDismiss(open, [containerRef], () => setOpen(false));\n\n const toggle = () => setOpen((v) => !v);\n\n return (\n <div ref={containerRef} className=\"rootzz-dropdown\">\n {renderTrigger({\n open,\n toggle,\n triggerProps: {\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n 'aria-controls': panelId,\n },\n })}\n\n {mounted && (\n <div\n id={panelId}\n role=\"menu\"\n aria-label={ariaLabel}\n onClick={() => closeOnContentClick && setOpen(false)}\n style={panelWidth !== undefined ? { width: panelWidth } : undefined}\n className={cx(\n 'rootzz-dropdown__panel',\n align === 'end' ? 'rootzz-dropdown__panel--end' : 'rootzz-dropdown__panel--start',\n active ? 'rootzz-dropdown__panel--active' : 'rootzz-dropdown__panel--inactive',\n panelClassName,\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n","import { useApps } from '../lib/useApps';\nimport type { AppsSource } from '../lib/types';\nimport { AppsGridIcon } from '../lib/icons';\nimport { Dropdown } from './Dropdown';\nimport { IconButton } from './IconButton';\n\nexport interface AppsMenuProps {\n /** Fonte dos apps (veja {@link AppsSource}). */\n source?: AppsSource;\n /** Rótulo acessível do botão. Padrão: \"Aplicativos\". */\n label?: string;\n /** Título exibido no topo do painel. Padrão: \"Aplicativos\". */\n title?: string;\n}\n\n/** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */\nexport function AppsMenu({ source = true, label = 'Aplicativos', title = 'Aplicativos' }: AppsMenuProps) {\n const { items, loading, error } = useApps(source);\n\n // `apps={false}` → não renderiza o botão.\n if (source === false) return null;\n\n return (\n <Dropdown\n align=\"start\"\n ariaLabel={title}\n panelWidth={332}\n panelClassName=\"rootzz-apps\"\n renderTrigger={({ toggle, triggerProps }) => (\n <IconButton onClick={toggle} aria-label={label} title={label} {...triggerProps}>\n <AppsGridIcon size={22} />\n </IconButton>\n )}\n >\n <div className=\"rootzz-apps__title\">{title}</div>\n\n {loading && <div className=\"rootzz-apps__status\">Carregando…</div>}\n\n {error && !loading && (\n <div className=\"rootzz-apps__status\">Não foi possível carregar os aplicativos.</div>\n )}\n\n {!loading && !error && items.length > 0 && (\n <div className=\"rootzz-apps__grid rootzz-scrollbar-none\">\n {items.map((app, index) => (\n <a\n key={app.application ?? `${app.label}-${index}`}\n href={app.url}\n title={app.description ?? app.label}\n role=\"menuitem\"\n className=\"rootzz-apps__item\"\n >\n <img src={app.icon} alt=\"\" className=\"rootzz-apps__icon\" loading=\"lazy\" />\n <span className=\"rootzz-apps__label\">{app.label}</span>\n </a>\n ))}\n </div>\n )}\n </Dropdown>\n );\n}\n","import { isValidElement } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useApplication } from '../lib/useApps';\nimport type { AppsSource, LogoConfig } from '../lib/types';\nimport { AppsMenu } from './AppsMenu';\n\nexport interface BrandProps {\n /**\n * Logo da topbar. Aceita:\n * - a string `\"myeduzz\"` → renderiza o logo oficial do MyEduzz;\n * - um `LogoConfig` (`{ src, alt, href… }`) → imagem configurável;\n * - qualquer `ReactNode` → renderizado como veio.\n *\n * Ignorado quando `application` resolve um app.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (campo `application` do\n * `applications.json`, ex.: `\"orbita\"`). Busca o app na lista oficial e\n * renderiza o logo + nome dele, linkando para a `url` do app.\n * No mobile, mostra apenas o logo (sem o nome). Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n appsLabel?: string;\n}\n\n/** URL do logo oficial do MyEduzz (CDN da Eduzz). */\nconst MYEDUZZ_LOGO: LogoConfig = {\n src: 'https://cdn.eduzzcdn.com/topbar/orbita-new.svg',\n alt: 'MyEduzz',\n height: 28,\n};\n\n/** `true` quando `logo` é o atalho de string para o logo do MyEduzz. */\nfunction isMyEduzzShortcut(value: unknown): value is string {\n return typeof value === 'string' && value.trim().toLowerCase() === 'myeduzz';\n}\n\nfunction isLogoConfig(value: unknown): value is LogoConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n !isValidElement(value) &&\n 'src' in (value as Record<string, unknown>)\n );\n}\n\nfunction Logo({ logo }: { logo: ReactNode | LogoConfig }) {\n const { linkComponent: Link } = useLayout();\n\n if (isLogoConfig(logo)) {\n const img = (\n <img src={logo.src} alt={logo.alt ?? ''} className=\"rootzz-brand__logo-img\" />\n );\n\n if (logo.href) {\n return (\n <Link href={logo.href} onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </Link>\n );\n }\n if (logo.onClick) {\n return (\n <button type=\"button\" onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </button>\n );\n }\n return <span className=\"rootzz-brand__logo-link\">{img}</span>;\n }\n\n return <>{logo}</>;\n}\n\n/** Marca de um aplicativo resolvido do `applications.json`: logo + nome (link). */\nfunction ApplicationBrand({ application }: { application: string }) {\n const { linkComponent: Link } = useLayout();\n const { app } = useApplication(application);\n\n if (!app) return null;\n\n return (\n <Link href={app.url} className=\"rootzz-brand__app\" title={app.label}>\n <img src={app.icon} alt={app.label} className=\"rootzz-brand__app-icon\" />\n <span className=\"rootzz-brand__app-name\">{app.label}</span>\n </Link>\n );\n}\n\n/** Bloco da esquerda da topbar: botão de aplicativos + logo/aplicação. */\nexport function Brand({ logo, application, apps, appsLabel }: BrandProps) {\n // A string \"myeduzz\" é um atalho para o logo oficial; qualquer outro valor\n // (LogoConfig ou ReactNode) é renderizado como veio.\n const resolvedLogo = isMyEduzzShortcut(logo) ? MYEDUZZ_LOGO : logo;\n\n return (\n <div className=\"rootzz-brand\">\n <AppsMenu source={apps} label={appsLabel} />\n {application ? (\n <span className=\"rootzz-brand__logo\">\n <ApplicationBrand application={application} />\n </span>\n ) : (\n resolvedLogo != null && (\n <span className=\"rootzz-brand__logo\">\n <Logo logo={resolvedLogo} />\n </span>\n )\n )}\n </div>\n );\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { IconButton } from './IconButton';\nimport { MoonIcon, SunIcon } from '../lib/icons';\n\nexport interface ThemeToggleProps {\n /** Rótulo acessível. Padrão: \"Alternar tema\". */\n label?: string;\n}\n\n/** Botão de alternância de tema (claro/escuro), com crossfade dos ícones. */\nexport function ThemeToggle({ label = 'Alternar tema' }: ThemeToggleProps) {\n const { theme, toggleTheme } = useLayout();\n const isDark = theme === 'dark';\n\n return (\n <IconButton onClick={toggleTheme} aria-label={label} title={label}>\n <span className=\"rootzz-theme-toggle\">\n <SunIcon size={20} className={cxFade(isDark)} />\n <MoonIcon size={20} className={cxFade(!isDark)} />\n </span>\n </IconButton>\n );\n}\n\n/** Posiciona ambos os ícones empilhados e faz o crossfade conforme visível. */\nfunction cxFade(visible: boolean): string {\n return [\n 'rootzz-theme-toggle__icon',\n visible ? 'rootzz-theme-toggle__icon--visible' : 'rootzz-theme-toggle__icon--hidden',\n ].join(' ');\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { UserConfig, UserMenuEntry } from '../lib/types';\nimport { Dropdown } from './Dropdown';\n\nexport interface UserMenuProps {\n user: UserConfig;\n}\n\nfunction computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction Avatar({ user, size = 32 }: { user: UserConfig; size?: number }) {\n const initials = user.initials ?? computeInitials(user.name);\n if (user.avatarUrl) {\n return (\n <img\n src={user.avatarUrl}\n alt={user.name}\n style={{ width: size, height: size }}\n className=\"rootzz-avatar\"\n />\n );\n }\n return (\n <span aria-hidden style={{ width: size, height: size }} className=\"rootzz-avatar rootzz-avatar--initials\">\n {initials}\n </span>\n );\n}\n\nfunction isDivider(entry: UserMenuEntry): entry is { type: 'divider'; key?: string } {\n return (entry as { type?: string }).type === 'divider';\n}\n\n/** Usuário à direita da topbar: avatar + nome + dropdown de ações. */\nexport function UserMenu({ user }: UserMenuProps) {\n const { linkComponent: Link } = useLayout();\n const hasMenu = !!user.menu && user.menu.length > 0;\n\n const trigger = (extra?: { toggle: () => void; triggerProps?: object }) => (\n <button\n type=\"button\"\n onClick={extra ? extra.toggle : user.onClick}\n {...(extra?.triggerProps ?? {})}\n className=\"rootzz-user\"\n >\n <Avatar user={user} />\n <span className=\"rootzz-user__name\">{user.name}</span>\n {hasMenu && <ChevronDownIcon size={16} className=\"rootzz-user__chevron\" />}\n </button>\n );\n\n if (!hasMenu) {\n return trigger();\n }\n\n return (\n <Dropdown\n align=\"end\"\n ariaLabel={`Menu de ${user.name}`}\n panelWidth={240}\n renderTrigger={({ toggle, triggerProps }) => trigger({ toggle, triggerProps })}\n >\n <div className=\"rootzz-user-panel__header\">\n <Avatar user={user} size={36} />\n <div className=\"rootzz-user-panel__info\">\n <div className=\"rootzz-user-panel__name\">{user.name}</div>\n {user.email && <div className=\"rootzz-user-panel__email\">{user.email}</div>}\n </div>\n </div>\n\n <div className=\"rootzz-divider\" />\n\n {user.menu!.map((entry, index) => {\n if (isDivider(entry)) {\n return <div key={entry.key ?? `divider-${index}`} className=\"rootzz-divider\" />;\n }\n\n const itemClass = cx(\n 'rootzz-menu-item',\n entry.disabled && 'rootzz-menu-item--disabled',\n entry.danger && 'rootzz-menu-item--danger',\n );\n\n const content = (\n <>\n {entry.icon && <span className=\"rootzz-menu-item__icon\">{entry.icon}</span>}\n <span className=\"rootzz-menu-item__label\">{entry.label}</span>\n </>\n );\n\n if (entry.href) {\n return (\n <Link key={entry.key ?? index} href={entry.href} role=\"menuitem\" className={itemClass}>\n {content}\n </Link>\n );\n }\n return (\n <button key={entry.key ?? index} type=\"button\" role=\"menuitem\" onClick={entry.onClick} className={itemClass}>\n {content}\n </button>\n );\n })}\n </Dropdown>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { MenuIcon } from '../lib/icons';\nimport type { AppsSource, LogoConfig, UserConfig } from '../lib/types';\nimport { Brand } from './Brand';\nimport { IconButton } from './IconButton';\nimport { ThemeToggle } from './ThemeToggle';\nimport { UserMenu } from './UserMenu';\n\nexport interface TopbarProps {\n /**\n * Logo exibido à esquerda. Aceita a string `\"myeduzz\"` (renderiza o logo\n * oficial do MyEduzz), um `LogoConfig` ou qualquer `ReactNode`.\n * Ignorado quando `application` é informado.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (ex.: `\"orbita\"`). Busca o app no\n * `applications.json` e renderiza o logo + nome dele (no mobile, só o logo),\n * linkando para a URL do app. Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n search?: ReactNode;\n actions?: ReactNode;\n user?: UserConfig;\n showThemeToggle?: boolean;\n /** Exibe o botão de menu (hambúrguer) no mobile. Padrão: `true`. */\n showMenuButton?: boolean;\n appsLabel?: string;\n menuButtonLabel?: string;\n className?: string;\n}\n\n/** Barra superior fixa: marca à esquerda, busca opcional ao centro, ações/usuário à direita. */\nexport function Topbar({\n logo,\n application,\n apps,\n search,\n actions,\n user,\n showThemeToggle = false,\n showMenuButton = true,\n appsLabel,\n menuButtonLabel = 'Abrir menu',\n className,\n}: TopbarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n return (\n <header className={cx('rootzz-topbar', className)}>\n {/* Esquerda */}\n <div className=\"rootzz-topbar__left\">\n {showMenuButton && (\n <IconButton\n className=\"rootzz-topbar__menu-button\"\n aria-label={menuButtonLabel}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen(!mobileOpen)}\n >\n <MenuIcon size={22} />\n </IconButton>\n )}\n <Brand logo={logo} application={application} apps={apps} appsLabel={appsLabel} />\n </div>\n\n {/* Centro (busca opcional) */}\n <div className=\"rootzz-topbar__center\">\n {search && <div className=\"rootzz-topbar__search\">{search}</div>}\n </div>\n\n {/* Direita */}\n <div className=\"rootzz-topbar__right\">\n {actions}\n {showThemeToggle && <ThemeToggle />}\n {user && <UserMenu user={user} />}\n </div>\n </header>\n );\n}\n","import { Children, isValidElement } from 'react';\nimport type { ReactElement } from 'react';\nimport { LayoutProvider, useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport type { RootzzLayoutProps } from '../lib/types';\nimport { Content } from './Content';\nimport { Sidebar } from './Sidebar';\nimport { Topbar } from './Topbar';\n\n/** Organiza os filhos: Topbar no topo (largura total), Sidebar + Content na linha abaixo. */\nfunction Shell({ children, className, style, id }: Pick<RootzzLayoutProps, 'children' | 'className' | 'style' | 'id'>) {\n const { theme } = useLayout();\n\n const items = Children.toArray(children).filter(isValidElement) as ReactElement[];\n const topbar = items.find((el) => el.type === Topbar);\n const sidebars = items.filter((el) => el.type === Sidebar);\n // Content + qualquer outro filho (na ordem fornecida), sempre após a sidebar.\n const body = items.filter((el) => el.type !== Topbar && el.type !== Sidebar);\n\n return (\n <div id={id} data-theme={theme} style={style} className={cx('rootzz-layout', className)}>\n {topbar}\n <div className=\"rootzz-layout__body\">\n {sidebars}\n {body}\n </div>\n </div>\n );\n}\n\n/**\n * Shell de aplicação composável. Forneça os subcomponentes como filhos —\n * cada um com suas próprias props.\n *\n * @example\n * import { RootzzLayout } from 'rootzz-layout';\n * import 'rootzz-layout/styles.css';\n *\n * <RootzzLayout>\n * <RootzzLayout.Topbar\n * logo={{ src: '/logo.svg', alt: 'MyEduzz', href: '/' }}\n * apps\n * showThemeToggle\n * user={{ name: 'Designers da Eduzz', initials: 'Dd', menu: [{ label: 'Sair', danger: true }] }}\n * />\n * <RootzzLayout.Sidebar\n * activeKey=\"resumo\"\n * menu={[\n * { key: 'resumo', label: 'Resumo', href: '/' },\n * { type: 'group', key: 'vendas', label: 'Vendas', items: [{ key: 'pedidos', label: 'Pedidos', href: '/pedidos' }] },\n * ]}\n * />\n * <RootzzLayout.Content>conteúdo aqui</RootzzLayout.Content>\n * </RootzzLayout>\n *\n * Config de nível de shell (tema, linkComponent) fica no `<RootzzLayout>`:\n * `<RootzzLayout theme=\"dark\" linkComponent={Link}>…</RootzzLayout>`\n */\nfunction RootzzLayoutBase({\n children,\n theme,\n defaultTheme,\n onThemeChange,\n linkComponent,\n className,\n style,\n id,\n}: RootzzLayoutProps) {\n return (\n <LayoutProvider\n theme={theme}\n defaultTheme={defaultTheme}\n onThemeChange={onThemeChange}\n linkComponent={linkComponent}\n >\n <Shell className={className} style={style} id={id}>\n {children}\n </Shell>\n </LayoutProvider>\n );\n}\n\n/**\n * `RootzzLayout` + subcomponentes anexados:\n * `RootzzLayout.Topbar`, `RootzzLayout.Sidebar`, `RootzzLayout.Content`.\n * (Os mesmos componentes também são exportados individualmente.)\n */\nexport const RootzzLayout = Object.assign(RootzzLayoutBase, {\n Topbar,\n Sidebar,\n Content,\n});\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { SearchIcon } from '../lib/icons';\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Texto de placeholder. */\n placeholder?: string;\n /** Dica de atalho exibida à direita (ex.: \"⌘K\"). */\n shortcut?: ReactNode;\n /** Classe extra do wrapper. */\n wrapperClassName?: string;\n}\n\n/**\n * Campo de busca estilizado para o centro da topbar (opcional).\n * É um `<input>` comum — controle via `value`/`onChange` como qualquer input.\n */\nexport const SearchBar = forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { placeholder = 'Buscar…', shortcut, wrapperClassName, className, ...rest },\n ref,\n) {\n return (\n <div className={cx('rootzz-search', wrapperClassName)}>\n <SearchIcon size={18} className=\"rootzz-search__icon\" />\n <input\n ref={ref}\n type=\"search\"\n placeholder={placeholder}\n className={cx('rootzz-search__input', className)}\n {...rest}\n />\n {shortcut != null && <kbd className=\"rootzz-search__shortcut\">{shortcut}</kbd>}\n </div>\n );\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/useControllableState.ts","../src/context/LayoutContext.tsx","../src/lib/cx.ts","../src/components/Content.tsx","../src/context/SidebarContext.tsx","../src/lib/icons.tsx","../src/components/IconButton.tsx","../src/lib/usePresence.ts","../src/components/Overlay.tsx","../src/components/SidebarItem.tsx","../src/components/SidebarGroup.tsx","../src/components/Sidebar.tsx","../src/lib/useApps.ts","../src/lib/useDismiss.ts","../src/components/Dropdown.tsx","../src/components/AppsMenu.tsx","../src/components/Brand.tsx","../src/components/ThemeToggle.tsx","../src/components/UserMenu.tsx","../src/components/Topbar.tsx","../src/components/RootzzLayout.tsx","../src/components/SearchBar.tsx"],"names":["useState","useCallback","jsx","createContext","useContext","cx","IconButton","jsxs","useEffect","useRef","useId","Fragment","isValidElement","forwardRef","SearchBar"],"mappings":"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","file":"index.mjs","sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\n/**\n * Estado que pode ser controlado (via prop) ou não-controlado (estado interno).\n * Espelha o padrão usado por bibliotecas como Radix/React Aria, sem dependências.\n */\nexport function useControllableState<T>(options: {\n /** Valor controlado. Se `undefined`, o estado é interno. */\n value?: T;\n /** Valor inicial quando não-controlado. */\n defaultValue: T;\n /** Notifica mudanças (em ambos os modos). */\n onChange?: (value: T) => void;\n}): [T, (next: T | ((prev: T) => T)) => void] {\n const { value, defaultValue, onChange } = options;\n const isControlled = value !== undefined;\n\n const [internal, setInternal] = useState<T>(defaultValue);\n\n // Mantém o onChange fresco sem recriar o setter.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const current = isControlled ? (value as T) : internal;\n const currentRef = useRef(current);\n currentRef.current = current;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolved =\n typeof next === 'function'\n ? (next as (prev: T) => T)(currentRef.current)\n : next;\n\n if (!isControlled) {\n setInternal(resolved);\n }\n if (resolved !== currentRef.current) {\n onChangeRef.current?.(resolved);\n }\n },\n [isControlled],\n );\n\n return [current, setValue];\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport { useControllableState } from '../lib/useControllableState';\nimport type { LinkComponent, ThemeMode } from '../lib/types';\n\n/** Breakpoint mobile (abaixo do `md` do Tailwind). */\nconst MOBILE_QUERY = '(max-width: 767.98px)';\n\nexport interface LayoutContextValue {\n /** Tema atual. */\n theme: ThemeMode;\n /** Define o tema. */\n setTheme: (theme: ThemeMode) => void;\n /** Alterna entre claro e escuro. */\n toggleTheme: () => void;\n /** Drawer mobile aberto? */\n mobileOpen: boolean;\n /** Abre/fecha o drawer mobile. */\n setMobileOpen: (open: boolean) => void;\n /** Estamos em viewport mobile? */\n isMobile: boolean;\n /** Componente de link usado na navegação (padrão `<a>`). */\n linkComponent: LinkComponent;\n}\n\nconst LayoutContext = createContext<LayoutContextValue | null>(null);\n\n/** Acessa o estado do layout (tema, drawer mobile, etc.). */\nexport function useLayout(): LayoutContextValue {\n const ctx = useContext(LayoutContext);\n if (!ctx) {\n throw new Error('useLayout deve ser usado dentro de <RootzzLayout> ou <LayoutShell>.');\n }\n return ctx;\n}\n\nexport interface LayoutProviderProps {\n children: ReactNode;\n theme?: ThemeMode;\n defaultTheme?: ThemeMode;\n onThemeChange?: (theme: ThemeMode) => void;\n linkComponent?: LinkComponent;\n}\n\nexport function LayoutProvider({\n children,\n theme: themeProp,\n defaultTheme = 'light',\n onThemeChange,\n linkComponent = 'a',\n}: LayoutProviderProps) {\n const [theme, setTheme] = useControllableState<ThemeMode>({\n value: themeProp,\n defaultValue: defaultTheme,\n onChange: onThemeChange,\n });\n\n const [mobileOpen, setMobileOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n // Detecta viewport mobile (sem dependências, SSR-safe).\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const update = () => setIsMobile(mql.matches);\n update();\n mql.addEventListener('change', update);\n return () => mql.removeEventListener('change', update);\n }, []);\n\n // Ao sair do mobile, garante o drawer fechado.\n useEffect(() => {\n if (!isMobile && mobileOpen) setMobileOpen(false);\n }, [isMobile, mobileOpen]);\n\n // Trava o scroll do body enquanto o drawer mobile está aberto.\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (!mobileOpen || !isMobile) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = previous;\n };\n }, [mobileOpen, isMobile]);\n\n const toggleTheme = useCallback(() => {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }, [theme, setTheme]);\n\n const value = useMemo<LayoutContextValue>(\n () => ({\n theme,\n setTheme,\n toggleTheme,\n mobileOpen,\n setMobileOpen,\n isMobile,\n linkComponent,\n }),\n [theme, setTheme, toggleTheme, mobileOpen, isMobile, linkComponent],\n );\n\n return <LayoutContext.Provider value={value}>{children}</LayoutContext.Provider>;\n}\n","/**\n * Concatena classes condicionalmente. Substituto mínimo de `clsx` para manter\n * a biblioteca sem dependências de runtime.\n *\n * @example cx('rootzz-item', isActive && 'rootzz-item--active', { 'rootzz-hidden': hidden })\n */\nexport type ClassValue =\n | string\n | number\n | null\n | false\n | undefined\n | ClassValue[]\n | Record<string, boolean | null | undefined>;\n\nexport function cx(...inputs: ClassValue[]): string {\n const out: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === 'string' || typeof input === 'number') {\n out.push(String(input));\n } else if (Array.isArray(input)) {\n const inner = cx(...input);\n if (inner) out.push(inner);\n } else if (typeof input === 'object') {\n for (const key in input) {\n if (input[key]) out.push(key);\n }\n }\n }\n\n return out.join(' ');\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface ContentProps {\n children?: ReactNode;\n /**\n * Largura máxima do conteúdo. `false` ocupa 100%.\n * Omitido usa o token `--rzl-content-max-width`.\n */\n maxWidth?: number | string | false;\n /** Classe extra no wrapper interno. */\n className?: string;\n /** Remove o padding padrão. */\n noPadding?: boolean;\n}\n\n/** Área de conteúdo: rola verticalmente e centraliza/limita a largura do que for inserido. */\nexport function Content({ children, maxWidth, className, noPadding = false }: ContentProps) {\n const useToken = maxWidth === undefined;\n const style: CSSProperties | undefined =\n maxWidth === undefined || maxWidth === false ? undefined : { maxWidth };\n\n return (\n <main className=\"rootzz-content\">\n <div\n style={style}\n className={cx(\n 'rootzz-content__inner',\n useToken && 'rootzz-content__inner--max',\n !noPadding && 'rootzz-content__inner--padded',\n className,\n )}\n >\n {children}\n </div>\n </main>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Estado local da Sidebar (compartilhado com itens/grupos). */\nexport interface SidebarContextValue {\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({});\n\nexport const SidebarProvider = SidebarContext.Provider;\n\nexport function useSidebar(): SidebarContextValue {\n return useContext(SidebarContext);\n}\n","import type { SVGProps } from 'react';\n\n/**\n * Ícones SVG inline — evitam uma dependência de biblioteca de ícones.\n * Usam `currentColor`, então herdam a cor do texto via classes utilitárias.\n */\ntype IconProps = SVGProps<SVGSVGElement> & { size?: number | string };\n\nfunction base({ size = 20, ...props }: IconProps) {\n return {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n xmlns: 'http://www.w3.org/2000/svg',\n 'aria-hidden': true,\n focusable: false,\n ...props,\n } as SVGProps<SVGSVGElement>;\n}\n\n// Estilo lucide-react: viewBox 24, fill none, stroke currentColor, stroke-width 1.5,\n// linecap/linejoin round. Os paths abaixo são os mesmos dos ícones lucide.\nconst stroke = {\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\n/** Grade 9-pontos (botão de aplicativos) — lucide `Grip`. */\nexport function AppsGridIcon(props: IconProps) {\n const xs = [5, 12, 19];\n const ys = [5, 12, 19];\n return (\n <svg {...base(props)}>\n {ys.flatMap((cy) =>\n xs.map((cx) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r={1} {...stroke} />),\n )}\n </svg>\n );\n}\n\n/** Chevron para baixo — lucide `ChevronDown`. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"m6 9 6 6 6-6\" {...stroke} />\n </svg>\n );\n}\n\n/** Sino de notificações. */\nexport function BellIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9\" {...stroke} />\n <path d=\"M13.7 21a2 2 0 0 1-3.4 0\" {...stroke} />\n </svg>\n );\n}\n\n/** Menu hambúrguer (mobile). */\nexport function MenuIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M3 6h18M3 12h18M3 18h18\" {...stroke} />\n </svg>\n );\n}\n\n/** Fechar (X). */\nexport function CloseIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M18 6 6 18M6 6l12 12\" {...stroke} />\n </svg>\n );\n}\n\n/** Lupa de busca. */\nexport function SearchIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={11} cy={11} r={7} {...stroke} />\n <path d=\"m21 21-4.3-4.3\" {...stroke} />\n </svg>\n );\n}\n\n/** Sol (tema claro). */\nexport function SunIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <circle cx={12} cy={12} r={4} {...stroke} />\n <path\n d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\n {...stroke}\n />\n </svg>\n );\n}\n\n/** Lua (tema escuro). */\nexport function MoonIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\" {...stroke} />\n </svg>\n );\n}\n\n/** Link externo (itens do menu de apps). */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...base(props)}>\n <path d=\"M15 3h6v6M10 14 21 3M21 14v5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5\" {...stroke} />\n </svg>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Ícone/conteúdo central. */\n children: ReactNode;\n /** Conteúdo do badge (número ou nó). `true` exibe um ponto. */\n badge?: ReactNode | boolean;\n /** Tamanho do botão em px. Padrão: 40. */\n size?: number;\n}\n\n/**\n * Botão de ícone padronizado para a topbar (hover suave, foco acessível, badge opcional).\n * Útil também para montar suas próprias ações custom mantendo a consistência visual.\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { children, badge, size = 40, className, type = 'button', ...rest },\n ref,\n) {\n const hasBadge = badge !== undefined && badge !== false && badge !== null;\n const isDot = badge === true;\n\n return (\n <button\n ref={ref}\n type={type}\n style={{ width: size, height: size }}\n className={cx('rootzz-icon-button', className)}\n {...rest}\n >\n {children}\n {hasBadge && (\n <span\n className={cx(\n 'rootzz-icon-button__badge',\n isDot ? 'rootzz-icon-button__badge--dot' : 'rootzz-icon-button__badge--count',\n )}\n >\n {!isDot && badge}\n </span>\n )}\n </button>\n );\n});\n","import { useEffect, useState } from 'react';\n\nexport interface Presence {\n /** Deve renderizar no DOM? (permanece `true` durante a saída). */\n mounted: boolean;\n /** Estado visual para alternar classes de transição (entrada/saída). */\n active: boolean;\n}\n\n/**\n * Coordena enter/exit com transições CSS, sem libs de animação.\n * Mantém o elemento montado durante a saída para o fade-out acontecer.\n *\n * @param open estado desejado\n * @param duration ms que o elemento fica montado durante a saída (casa com --rzl-duration)\n */\nexport function usePresence(open: boolean, duration = 220): Presence {\n const [mounted, setMounted] = useState(open);\n const [active, setActive] = useState(open);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n // Próximo frame: ativa as classes \"abertas\" para a transição rodar.\n const raf = requestAnimationFrame(() => setActive(true));\n return () => cancelAnimationFrame(raf);\n }\n setActive(false);\n const timer = setTimeout(() => setMounted(false), duration);\n return () => clearTimeout(timer);\n }, [open, duration]);\n\n return { mounted, active };\n}\n","import { cx } from '../lib/cx';\nimport { usePresence } from '../lib/usePresence';\n\nexport interface OverlayProps {\n open: boolean;\n onClick?: () => void;\n className?: string;\n}\n\n/** Camada escura semitransparente (mobile), com fade in/out. */\nexport function Overlay({ open, onClick, className }: OverlayProps) {\n const { mounted, active } = usePresence(open);\n if (!mounted) return null;\n\n return (\n <div\n // Decorativo: o fechamento acessível é via Escape (useDismiss) e botões.\n data-rzl=\"overlay\"\n aria-hidden\n onClick={onClick}\n className={cx(\n 'rootzz-overlay',\n active ? 'rootzz-overlay--active' : 'rootzz-overlay--inactive',\n className,\n )}\n />\n );\n}\n","import type { MouseEvent } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport type { MenuLink } from '../lib/types';\n\nexport interface SidebarItemProps {\n item: MenuLink;\n /** Recuo extra (usado para itens dentro de grupos). */\n nested?: boolean;\n}\n\n/** Item simples (link) da sidebar, com estado ativo. */\nexport function SidebarItem({ item, nested = false }: SidebarItemProps) {\n const { linkComponent: Link, isMobile, setMobileOpen } = useLayout();\n const { activeKey } = useSidebar();\n\n const isActive = item.active ?? (activeKey != null && item.key === activeKey);\n\n const handleClick = (event: MouseEvent) => {\n item.onClick?.(event);\n // Em mobile, navegar fecha o drawer.\n if (isMobile) setMobileOpen(false);\n };\n\n // Itens aninhados recebem margem horizontal para o pill ficar mais estreito que o pai.\n const className = cx(\n 'rootzz-sidebar-item',\n nested && 'rootzz-sidebar-item--nested',\n item.disabled && 'rootzz-sidebar-item--disabled',\n isActive && 'rootzz-sidebar-item--active',\n );\n\n const content = (\n <>\n {item.icon && <span className=\"rootzz-sidebar-item__icon\">{item.icon}</span>}\n <span className=\"rootzz-sidebar-item__label\">{item.label}</span>\n {item.badge != null && <span className=\"rootzz-sidebar-item__badge\">{item.badge}</span>}\n </>\n );\n\n if (item.href && !item.disabled) {\n return (\n <Link\n href={item.href}\n target={item.target}\n onClick={handleClick}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </Link>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={item.disabled}\n aria-current={isActive ? 'page' : undefined}\n className={className}\n >\n {content}\n </button>\n );\n}\n","import { useId, useState } from 'react';\nimport { useSidebar } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { MenuGroup } from '../lib/types';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarGroupProps {\n group: MenuGroup;\n}\n\n/** Grupo colapsável da sidebar (label em maiúsculas + chevron animado + altura animada). */\nexport function SidebarGroup({ group }: SidebarGroupProps) {\n const { activeKey } = useSidebar();\n const collapsible = group.collapsible ?? true;\n const [collapsed, setCollapsed] = useState(collapsible ? (group.defaultCollapsed ?? false) : false);\n const open = collapsible ? !collapsed : true;\n const regionId = useId();\n\n // Se algum filho está ativo, o label do grupo fica destacado (cor ativa).\n const hasActiveChild = group.items.some(\n (it) => it.active || (activeKey != null && it.key === activeKey),\n );\n\n const header = (\n <div className=\"rootzz-sidebar-group__header\">\n {group.icon && <span className=\"rootzz-sidebar-group__icon\">{group.icon}</span>}\n <span\n className={cx(\n 'rootzz-sidebar-group__label',\n hasActiveChild && 'rootzz-sidebar-group__label--active',\n )}\n >\n {group.label}\n </span>\n {collapsible && (\n <ChevronDownIcon\n size={16}\n className={cx(\n 'rootzz-sidebar-group__chevron',\n open && 'rootzz-sidebar-group__chevron--open',\n )}\n />\n )}\n </div>\n );\n\n return (\n <div className=\"rootzz-sidebar-group\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => setCollapsed((v) => !v)}\n aria-expanded={open}\n aria-controls={regionId}\n className=\"rootzz-sidebar-group__trigger\"\n >\n {header}\n </button>\n ) : (\n header\n )}\n\n {/* Altura animada via grid-template-rows (0fr → 1fr). Mantém o conteúdo\n montado para o colapso ser suave nos dois sentidos. */}\n <div\n id={regionId}\n aria-hidden={!open}\n className={cx(\n 'rootzz-sidebar-group__region',\n open && 'rootzz-sidebar-group__region--open',\n )}\n >\n <div className=\"rootzz-sidebar-group__clip\">\n <div className=\"rootzz-sidebar-group__items\">\n {group.items.map((item) => (\n <SidebarItem key={item.key} item={item} nested />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { SidebarProvider } from '../context/SidebarContext';\nimport { cx } from '../lib/cx';\nimport { CloseIcon } from '../lib/icons';\nimport type { MenuItem } from '../lib/types';\nimport { IconButton } from './IconButton';\nimport { Overlay } from './Overlay';\nimport { SidebarGroup } from './SidebarGroup';\nimport { SidebarItem } from './SidebarItem';\n\nexport interface SidebarProps {\n /** Entradas do menu (links, grupos, divisores). */\n menu?: MenuItem[];\n /** Chave do item ativo (casa com `MenuLink.key`). */\n activeKey?: string;\n /** Conteúdo fixo no topo. */\n header?: ReactNode;\n /** Conteúdo fixo no rodapé. */\n footer?: ReactNode;\n /** Rótulo acessível da navegação. Padrão: \"Navegação principal\". */\n ariaLabel?: string;\n /** Conteúdo custom (substitui `menu` se quiser compor manualmente). */\n children?: ReactNode;\n className?: string;\n /** Título do drawer mobile. */\n mobileTitle?: ReactNode;\n}\n\nfunction renderEntry(entry: MenuItem, index: number) {\n if ((entry as { type?: string }).type === 'divider') {\n return <div key={(entry as { key?: string }).key ?? `divider-${index}`} className=\"rootzz-nav__divider\" />;\n }\n if ((entry as { type?: string }).type === 'group') {\n const group = entry as Extract<MenuItem, { type: 'group' }>;\n return <SidebarGroup key={group.key} group={group} />;\n }\n const item = entry as Extract<MenuItem, { type?: 'item' }>;\n return <SidebarItem key={item.key} item={item} />;\n}\n\nfunction Nav({\n menu,\n header,\n footer,\n ariaLabel,\n children,\n}: Pick<SidebarProps, 'menu' | 'header' | 'footer' | 'ariaLabel' | 'children'>) {\n return (\n <nav aria-label={ariaLabel ?? 'Navegação principal'} className=\"rootzz-nav\">\n {header && <div className=\"rootzz-nav__header\">{header}</div>}\n\n <div className=\"rootzz-nav__scroll rootzz-scrollbar-none\">\n {children ?? <div className=\"rootzz-nav__list\">{menu?.map(renderEntry)}</div>}\n </div>\n\n {footer && <div className=\"rootzz-nav__footer\">{footer}</div>}\n </nav>\n );\n}\n\n/**\n * Sidebar de navegação.\n * - Desktop (≥768px): coluna fixa com largura `--rzl-sidebar-width`.\n * - Mobile (<768px): drawer off-canvas com overlay e fade/slide suaves.\n */\nexport function Sidebar({\n menu,\n activeKey,\n header,\n footer,\n ariaLabel,\n children,\n className,\n mobileTitle,\n}: SidebarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n // Escape fecha o drawer no mobile.\n useEffect(() => {\n if (!mobileOpen) return;\n if (typeof document === 'undefined') return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n const navProps = { menu, header, footer, ariaLabel, children };\n\n return (\n <SidebarProvider value={{ activeKey }}>\n {/* Desktop: coluna estática */}\n <aside data-rzl=\"sidebar\" className={cx('rootzz-sidebar', className)}>\n <Nav {...navProps} />\n </aside>\n\n {/* Mobile: overlay + drawer */}\n <Overlay open={mobileOpen} onClick={() => setMobileOpen(false)} />\n <aside\n data-rzl=\"drawer\"\n data-state={mobileOpen ? 'open' : 'closed'}\n aria-hidden={!mobileOpen}\n className={cx('rootzz-drawer', mobileOpen && 'rootzz-drawer--open', className)}\n >\n <div className=\"rootzz-drawer__header\">\n <span className=\"rootzz-drawer__title\">{mobileTitle}</span>\n <IconButton aria-label=\"Fechar menu\" onClick={() => setMobileOpen(false)}>\n <CloseIcon size={22} />\n </IconButton>\n </div>\n <div className=\"rootzz-drawer__body\">\n <Nav {...navProps} />\n </div>\n </aside>\n </SidebarProvider>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { AppItem, AppsSource } from './types';\n\n/** URL padrão da lista de aplicativos da Eduzz. */\nexport const DEFAULT_APPS_URL = 'https://cdn.eduzzcdn.com/topbar/applications.json';\n\n/** Cache em nível de módulo: evita refetch entre múltiplas instâncias / re-renders. */\nconst cache = new Map<string, Promise<AppItem[]>>();\n\nfunction fetchApps(url: string): Promise<AppItem[]> {\n let promise = cache.get(url);\n if (!promise) {\n promise = fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status} ao buscar apps`);\n return res.json();\n })\n .then((data) => (Array.isArray(data) ? (data as AppItem[]) : []))\n .catch((err) => {\n // Em caso de erro, limpa o cache para permitir nova tentativa futura.\n cache.delete(url);\n throw err;\n });\n cache.set(url, promise);\n }\n return promise;\n}\n\ninterface ResolvedSource {\n staticItems: AppItem[] | null;\n url: string | null;\n}\n\nfunction resolveSource(source: AppsSource | undefined): ResolvedSource {\n if (!source) return { staticItems: null, url: null };\n if (source === true) return { staticItems: null, url: DEFAULT_APPS_URL };\n if (typeof source === 'string') return { staticItems: null, url: source };\n if (Array.isArray(source)) return { staticItems: source, url: null };\n if (source.items) return { staticItems: source.items, url: null };\n return { staticItems: null, url: source.url ?? DEFAULT_APPS_URL };\n}\n\nexport interface UseAppsResult {\n items: AppItem[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve a fonte de apps em `{ items, loading, error }`.\n * Listas estáticas são usadas direto; URLs são buscadas (com cache).\n */\nexport function useApps(source: AppsSource | undefined): UseAppsResult {\n const { staticItems, url } = resolveSource(source);\n\n const [items, setItems] = useState<AppItem[]>(staticItems ?? []);\n const [loading, setLoading] = useState<boolean>(!!url && !staticItems);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (staticItems) {\n setItems(staticItems);\n setLoading(false);\n setError(null);\n return;\n }\n if (!url) {\n setItems([]);\n setLoading(false);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setItems(data);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n // Estabilizamos por `url` e por uma assinatura simples da lista estática.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, staticItems ? staticItems.length : null]);\n\n return { items, loading, error };\n}\n\nexport interface UseApplicationResult {\n /** App encontrado pelo identificador, ou `null` enquanto carrega / se não existir. */\n app: AppItem | null;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Resolve um único aplicativo da Eduzz pelo seu identificador (campo\n * `application` do `applications.json`). Reaproveita o mesmo fetch/cache de\n * {@link useApps}, então não há requisição extra quando o menu de apps já carregou.\n *\n * @param application Identificador (ex.: `\"orbita\"`). `undefined` desativa.\n * @param url Fonte custom do JSON. Padrão: {@link DEFAULT_APPS_URL}.\n */\nexport function useApplication(\n application: string | undefined,\n url: string = DEFAULT_APPS_URL,\n): UseApplicationResult {\n const [app, setApp] = useState<AppItem | null>(null);\n const [loading, setLoading] = useState<boolean>(!!application);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!application) {\n setApp(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let active = true;\n setLoading(true);\n setError(null);\n\n fetchApps(url)\n .then((data) => {\n if (!active) return;\n setApp(data.find((item) => item.application === application) ?? null);\n setLoading(false);\n })\n .catch((err: Error) => {\n if (!active) return;\n setError(err);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [application, url]);\n\n return { app, loading, error };\n}\n","import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * Fecha um elemento (dropdown, popover) ao clicar fora dele ou pressionar Escape.\n * Sem dependências; ouve eventos apenas enquanto `open` é `true`.\n */\nexport function useDismiss(\n open: boolean,\n refs: Array<RefObject<HTMLElement | null>>,\n onDismiss: () => void,\n): void {\n useEffect(() => {\n if (!open) return;\n if (typeof document === 'undefined') return;\n\n const handlePointer = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (!target) return;\n const inside = refs.some((ref) => ref.current && ref.current.contains(target));\n if (!inside) onDismiss();\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onDismiss();\n };\n\n // `pointerdown` fecha antes de cliques dispararem navegação inesperada.\n document.addEventListener('pointerdown', handlePointer, true);\n document.addEventListener('keydown', handleKey);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointer, true);\n document.removeEventListener('keydown', handleKey);\n };\n }, [open, onDismiss, refs]);\n}\n","import { useId, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { useDismiss } from '../lib/useDismiss';\nimport { usePresence } from '../lib/usePresence';\nimport { useControllableState } from '../lib/useControllableState';\n\nexport interface DropdownTriggerArgs {\n open: boolean;\n toggle: () => void;\n /** Props a serem espalhadas no elemento de trigger (acessibilidade). */\n triggerProps: {\n 'aria-haspopup': 'menu';\n 'aria-expanded': boolean;\n 'aria-controls': string;\n };\n}\n\nexport interface DropdownProps {\n /** Renderiza o gatilho. Receba `toggle` e `triggerProps`. */\n renderTrigger: (args: DropdownTriggerArgs) => ReactNode;\n /** Conteúdo do painel. */\n children: ReactNode;\n /** Alinhamento horizontal do painel. Padrão: `'end'`. */\n align?: 'start' | 'end';\n /** Classe extra do painel. */\n panelClassName?: string;\n /** Largura do painel (px ou CSS). */\n panelWidth?: number | string;\n /** Fecha o painel ao clicar em qualquer lugar dentro dele. Padrão: `true`. */\n closeOnContentClick?: boolean;\n /** Rótulo acessível do menu. */\n ariaLabel?: string;\n /** Estado controlado (opcional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Dropdown inline (sem portal — garante herança do escopo de estilo `.rootzz-layout`).\n * Fecha em clique fora / Escape e faz fade in/out suave.\n */\nexport function Dropdown({\n renderTrigger,\n children,\n align = 'end',\n panelClassName,\n panelWidth,\n closeOnContentClick = true,\n ariaLabel,\n open: openProp,\n onOpenChange,\n}: DropdownProps) {\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: false,\n onChange: onOpenChange,\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, active } = usePresence(open);\n\n useDismiss(open, [containerRef], () => setOpen(false));\n\n const toggle = () => setOpen((v) => !v);\n\n return (\n <div ref={containerRef} className=\"rootzz-dropdown\">\n {renderTrigger({\n open,\n toggle,\n triggerProps: {\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n 'aria-controls': panelId,\n },\n })}\n\n {mounted && (\n <div\n id={panelId}\n role=\"menu\"\n aria-label={ariaLabel}\n onClick={() => closeOnContentClick && setOpen(false)}\n style={panelWidth !== undefined ? { width: panelWidth } : undefined}\n className={cx(\n 'rootzz-dropdown__panel',\n align === 'end' ? 'rootzz-dropdown__panel--end' : 'rootzz-dropdown__panel--start',\n active ? 'rootzz-dropdown__panel--active' : 'rootzz-dropdown__panel--inactive',\n panelClassName,\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n","import { useApps } from '../lib/useApps';\nimport type { AppsSource } from '../lib/types';\nimport { AppsGridIcon } from '../lib/icons';\nimport { Dropdown } from './Dropdown';\nimport { IconButton } from './IconButton';\n\nexport interface AppsMenuProps {\n /** Fonte dos apps (veja {@link AppsSource}). */\n source?: AppsSource;\n /** Rótulo acessível do botão. Padrão: \"Aplicativos\". */\n label?: string;\n /** Rótulo acessível (aria-label) do painel. Padrão: \"Aplicativos\". */\n title?: string;\n}\n\n/** Botão de grade 9-pontos que abre o menu de aplicativos da Eduzz. */\nexport function AppsMenu({ source = true, label = 'Aplicativos', title = 'Aplicativos' }: AppsMenuProps) {\n const { items, loading, error } = useApps(source);\n\n // `apps={false}` → não renderiza o botão.\n if (source === false) return null;\n\n return (\n <Dropdown\n align=\"start\"\n ariaLabel={title}\n panelWidth={400}\n panelClassName=\"rootzz-apps\"\n renderTrigger={({ toggle, triggerProps }) => (\n <IconButton onClick={toggle} aria-label={label} title={label} {...triggerProps}>\n <AppsGridIcon size={22} />\n </IconButton>\n )}\n >\n {loading && <div className=\"rootzz-apps__status\">Carregando…</div>}\n\n {error && !loading && (\n <div className=\"rootzz-apps__status\">Não foi possível carregar os aplicativos.</div>\n )}\n\n {!loading && !error && items.length > 0 && (\n <div className=\"rootzz-apps__grid rootzz-scrollbar-none\">\n {items.map((app, index) => (\n <a\n key={app.application ?? `${app.label}-${index}`}\n href={app.url}\n title={app.description ?? app.label}\n role=\"menuitem\"\n className=\"rootzz-apps__item\"\n >\n <img src={app.icon} alt=\"\" className=\"rootzz-apps__icon\" loading=\"lazy\" />\n <span className=\"rootzz-apps__label\">{app.label}</span>\n </a>\n ))}\n </div>\n )}\n </Dropdown>\n );\n}\n","import { isValidElement } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { useApplication } from '../lib/useApps';\nimport type { AppsSource, LogoConfig } from '../lib/types';\nimport { AppsMenu } from './AppsMenu';\n\nexport interface BrandProps {\n /**\n * Logo da topbar. Aceita:\n * - a string `\"myeduzz\"` → renderiza o logo oficial do MyEduzz;\n * - um `LogoConfig` (`{ src, alt, href… }`) → imagem configurável;\n * - qualquer `ReactNode` → renderizado como veio.\n *\n * Ignorado quando `application` resolve um app.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (campo `application` do\n * `applications.json`, ex.: `\"orbita\"`). Busca o app na lista oficial e\n * renderiza o logo + nome dele, linkando para a `url` do app.\n * No mobile, mostra apenas o logo (sem o nome). Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n appsLabel?: string;\n}\n\n/** URL do logo oficial do MyEduzz (CDN da Eduzz). */\nconst MYEDUZZ_LOGO: LogoConfig = {\n src: 'https://cdn.eduzzcdn.com/topbar/orbita-new.svg',\n alt: 'MyEduzz',\n height: 28,\n};\n\n/** `true` quando `logo` é o atalho de string para o logo do MyEduzz. */\nfunction isMyEduzzShortcut(value: unknown): value is string {\n return typeof value === 'string' && value.trim().toLowerCase() === 'myeduzz';\n}\n\nfunction isLogoConfig(value: unknown): value is LogoConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n !isValidElement(value) &&\n 'src' in (value as Record<string, unknown>)\n );\n}\n\nfunction Logo({ logo }: { logo: ReactNode | LogoConfig }) {\n const { linkComponent: Link } = useLayout();\n\n if (isLogoConfig(logo)) {\n const img = (\n <img src={logo.src} alt={logo.alt ?? ''} className=\"rootzz-brand__logo-img\" />\n );\n\n if (logo.href) {\n return (\n <Link href={logo.href} onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </Link>\n );\n }\n if (logo.onClick) {\n return (\n <button type=\"button\" onClick={logo.onClick} className=\"rootzz-brand__logo-link\">\n {img}\n </button>\n );\n }\n return <span className=\"rootzz-brand__logo-link\">{img}</span>;\n }\n\n return <>{logo}</>;\n}\n\n/** Marca de um aplicativo resolvido do `applications.json`: logo + nome (link). */\nfunction ApplicationBrand({ application }: { application: string }) {\n const { linkComponent: Link } = useLayout();\n const { app } = useApplication(application);\n\n if (!app) return null;\n\n return (\n <Link href={app.url} className=\"rootzz-brand__app\" title={app.label}>\n <img src={app.icon} alt={app.label} className=\"rootzz-brand__app-icon\" />\n <span className=\"rootzz-brand__app-name\">{app.label}</span>\n </Link>\n );\n}\n\n/** Bloco da esquerda da topbar: botão de aplicativos + logo/aplicação. */\nexport function Brand({ logo, application, apps, appsLabel }: BrandProps) {\n // A string \"myeduzz\" é um atalho para o logo oficial; qualquer outro valor\n // (LogoConfig ou ReactNode) é renderizado como veio.\n const resolvedLogo = isMyEduzzShortcut(logo) ? MYEDUZZ_LOGO : logo;\n\n return (\n <div className=\"rootzz-brand\">\n <AppsMenu source={apps} label={appsLabel} />\n {application ? (\n <span className=\"rootzz-brand__logo\">\n <ApplicationBrand application={application} />\n </span>\n ) : (\n resolvedLogo != null && (\n <span className=\"rootzz-brand__logo\">\n <Logo logo={resolvedLogo} />\n </span>\n )\n )}\n </div>\n );\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { IconButton } from './IconButton';\nimport { MoonIcon, SunIcon } from '../lib/icons';\n\nexport interface ThemeToggleProps {\n /** Rótulo acessível. Padrão: \"Alternar tema\". */\n label?: string;\n}\n\n/** Botão de alternância de tema (claro/escuro), com crossfade dos ícones. */\nexport function ThemeToggle({ label = 'Alternar tema' }: ThemeToggleProps) {\n const { theme, toggleTheme } = useLayout();\n const isDark = theme === 'dark';\n\n return (\n <IconButton onClick={toggleTheme} aria-label={label} title={label}>\n <span className=\"rootzz-theme-toggle\">\n <SunIcon size={20} className={cxFade(isDark)} />\n <MoonIcon size={20} className={cxFade(!isDark)} />\n </span>\n </IconButton>\n );\n}\n\n/** Posiciona ambos os ícones empilhados e faz o crossfade conforme visível. */\nfunction cxFade(visible: boolean): string {\n return [\n 'rootzz-theme-toggle__icon',\n visible ? 'rootzz-theme-toggle__icon--visible' : 'rootzz-theme-toggle__icon--hidden',\n ].join(' ');\n}\n","import { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { ChevronDownIcon } from '../lib/icons';\nimport type { UserConfig, UserMenuEntry } from '../lib/types';\nimport { Dropdown } from './Dropdown';\n\nexport interface UserMenuProps {\n user: UserConfig;\n}\n\nfunction computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction Avatar({ user, size = 32 }: { user: UserConfig; size?: number }) {\n const initials = user.initials ?? computeInitials(user.name);\n if (user.avatarUrl) {\n return (\n <img\n src={user.avatarUrl}\n alt={user.name}\n style={{ width: size, height: size }}\n className=\"rootzz-avatar\"\n />\n );\n }\n return (\n <span aria-hidden style={{ width: size, height: size }} className=\"rootzz-avatar rootzz-avatar--initials\">\n {initials}\n </span>\n );\n}\n\nfunction isDivider(entry: UserMenuEntry): entry is { type: 'divider'; key?: string } {\n return (entry as { type?: string }).type === 'divider';\n}\n\n/** Usuário à direita da topbar: avatar + nome + dropdown de ações. */\nexport function UserMenu({ user }: UserMenuProps) {\n const { linkComponent: Link } = useLayout();\n const hasMenu = !!user.menu && user.menu.length > 0;\n\n const trigger = (extra?: { toggle: () => void; triggerProps?: object }) => (\n <button\n type=\"button\"\n onClick={extra ? extra.toggle : user.onClick}\n {...(extra?.triggerProps ?? {})}\n className=\"rootzz-user\"\n >\n <Avatar user={user} />\n <span className=\"rootzz-user__name\">{user.name}</span>\n {hasMenu && <ChevronDownIcon size={16} className=\"rootzz-user__chevron\" />}\n </button>\n );\n\n if (!hasMenu) {\n return trigger();\n }\n\n return (\n <Dropdown\n align=\"end\"\n ariaLabel={`Menu de ${user.name}`}\n panelWidth={240}\n renderTrigger={({ toggle, triggerProps }) => trigger({ toggle, triggerProps })}\n >\n <div className=\"rootzz-user-panel__header\">\n <Avatar user={user} size={36} />\n <div className=\"rootzz-user-panel__info\">\n <div className=\"rootzz-user-panel__name\">{user.name}</div>\n {user.email && <div className=\"rootzz-user-panel__email\">{user.email}</div>}\n </div>\n </div>\n\n <div className=\"rootzz-divider\" />\n\n {user.menu!.map((entry, index) => {\n if (isDivider(entry)) {\n return <div key={entry.key ?? `divider-${index}`} className=\"rootzz-divider\" />;\n }\n\n const itemClass = cx(\n 'rootzz-menu-item',\n entry.disabled && 'rootzz-menu-item--disabled',\n entry.danger && 'rootzz-menu-item--danger',\n );\n\n const content = (\n <>\n {entry.icon && <span className=\"rootzz-menu-item__icon\">{entry.icon}</span>}\n <span className=\"rootzz-menu-item__label\">{entry.label}</span>\n </>\n );\n\n if (entry.href) {\n return (\n <Link key={entry.key ?? index} href={entry.href} role=\"menuitem\" className={itemClass}>\n {content}\n </Link>\n );\n }\n return (\n <button key={entry.key ?? index} type=\"button\" role=\"menuitem\" onClick={entry.onClick} className={itemClass}>\n {content}\n </button>\n );\n })}\n </Dropdown>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport { MenuIcon } from '../lib/icons';\nimport type { AppsSource, LogoConfig, UserConfig } from '../lib/types';\nimport { Brand } from './Brand';\nimport { IconButton } from './IconButton';\nimport { ThemeToggle } from './ThemeToggle';\nimport { UserMenu } from './UserMenu';\n\nexport interface TopbarProps {\n /**\n * Logo exibido à esquerda. Aceita a string `\"myeduzz\"` (renderiza o logo\n * oficial do MyEduzz), um `LogoConfig` ou qualquer `ReactNode`.\n * Ignorado quando `application` é informado.\n */\n logo?: ReactNode | LogoConfig;\n /**\n * Identificador de um aplicativo da Eduzz (ex.: `\"orbita\"`). Busca o app no\n * `applications.json` e renderiza o logo + nome dele (no mobile, só o logo),\n * linkando para a URL do app. Tem precedência sobre `logo`.\n */\n application?: string;\n apps?: AppsSource;\n search?: ReactNode;\n actions?: ReactNode;\n user?: UserConfig;\n showThemeToggle?: boolean;\n /** Exibe o botão de menu (hambúrguer) no mobile. Padrão: `true`. */\n showMenuButton?: boolean;\n appsLabel?: string;\n menuButtonLabel?: string;\n className?: string;\n}\n\n/** Barra superior fixa: marca à esquerda, busca opcional ao centro, ações/usuário à direita. */\nexport function Topbar({\n logo,\n application,\n apps,\n search,\n actions,\n user,\n showThemeToggle = false,\n showMenuButton = true,\n appsLabel,\n menuButtonLabel = 'Abrir menu',\n className,\n}: TopbarProps) {\n const { mobileOpen, setMobileOpen } = useLayout();\n\n return (\n <header className={cx('rootzz-topbar', className)}>\n {/* Esquerda */}\n <div className=\"rootzz-topbar__left\">\n {showMenuButton && (\n <IconButton\n className=\"rootzz-topbar__menu-button\"\n aria-label={menuButtonLabel}\n aria-expanded={mobileOpen}\n onClick={() => setMobileOpen(!mobileOpen)}\n >\n <MenuIcon size={22} />\n </IconButton>\n )}\n <Brand logo={logo} application={application} apps={apps} appsLabel={appsLabel} />\n </div>\n\n {/* Centro (busca opcional) */}\n <div className=\"rootzz-topbar__center\">\n {search && <div className=\"rootzz-topbar__search\">{search}</div>}\n </div>\n\n {/* Direita */}\n <div className=\"rootzz-topbar__right\">\n {actions}\n {showThemeToggle && <ThemeToggle />}\n {user && <UserMenu user={user} />}\n </div>\n </header>\n );\n}\n","import { Children, isValidElement } from 'react';\nimport type { ReactElement } from 'react';\nimport { LayoutProvider, useLayout } from '../context/LayoutContext';\nimport { cx } from '../lib/cx';\nimport type { RootzzLayoutProps } from '../lib/types';\nimport { Content } from './Content';\nimport { Sidebar } from './Sidebar';\nimport { Topbar } from './Topbar';\n\n/** Organiza os filhos: Topbar no topo (largura total), Sidebar + Content na linha abaixo. */\nfunction Shell({ children, className, style, id }: Pick<RootzzLayoutProps, 'children' | 'className' | 'style' | 'id'>) {\n const { theme } = useLayout();\n\n const items = Children.toArray(children).filter(isValidElement) as ReactElement[];\n const topbar = items.find((el) => el.type === Topbar);\n const sidebars = items.filter((el) => el.type === Sidebar);\n // Content + qualquer outro filho (na ordem fornecida), sempre após a sidebar.\n const body = items.filter((el) => el.type !== Topbar && el.type !== Sidebar);\n\n return (\n <div id={id} data-theme={theme} style={style} className={cx('rootzz-layout', className)}>\n {topbar}\n <div className=\"rootzz-layout__body\">\n {sidebars}\n {body}\n </div>\n </div>\n );\n}\n\n/**\n * Shell de aplicação composável. Forneça os subcomponentes como filhos —\n * cada um com suas próprias props.\n *\n * @example\n * import { RootzzLayout } from 'rootzz-layout';\n * import 'rootzz-layout/styles.css';\n *\n * <RootzzLayout>\n * <RootzzLayout.Topbar\n * logo={{ src: '/logo.svg', alt: 'MyEduzz', href: '/' }}\n * apps\n * showThemeToggle\n * user={{ name: 'Designers da Eduzz', initials: 'Dd', menu: [{ label: 'Sair', danger: true }] }}\n * />\n * <RootzzLayout.Sidebar\n * activeKey=\"resumo\"\n * menu={[\n * { key: 'resumo', label: 'Resumo', href: '/' },\n * { type: 'group', key: 'vendas', label: 'Vendas', items: [{ key: 'pedidos', label: 'Pedidos', href: '/pedidos' }] },\n * ]}\n * />\n * <RootzzLayout.Content>conteúdo aqui</RootzzLayout.Content>\n * </RootzzLayout>\n *\n * Config de nível de shell (tema, linkComponent) fica no `<RootzzLayout>`:\n * `<RootzzLayout theme=\"dark\" linkComponent={Link}>…</RootzzLayout>`\n */\nfunction RootzzLayoutBase({\n children,\n theme,\n defaultTheme,\n onThemeChange,\n linkComponent,\n className,\n style,\n id,\n}: RootzzLayoutProps) {\n return (\n <LayoutProvider\n theme={theme}\n defaultTheme={defaultTheme}\n onThemeChange={onThemeChange}\n linkComponent={linkComponent}\n >\n <Shell className={className} style={style} id={id}>\n {children}\n </Shell>\n </LayoutProvider>\n );\n}\n\n/**\n * `RootzzLayout` + subcomponentes anexados:\n * `RootzzLayout.Topbar`, `RootzzLayout.Sidebar`, `RootzzLayout.Content`.\n * (Os mesmos componentes também são exportados individualmente.)\n */\nexport const RootzzLayout = Object.assign(RootzzLayoutBase, {\n Topbar,\n Sidebar,\n Content,\n});\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { SearchIcon } from '../lib/icons';\n\nexport interface SearchBarProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Texto de placeholder. */\n placeholder?: string;\n /** Dica de atalho exibida à direita (ex.: \"⌘K\"). */\n shortcut?: ReactNode;\n /** Classe extra do wrapper. */\n wrapperClassName?: string;\n}\n\n/**\n * Campo de busca estilizado para o centro da topbar (opcional).\n * É um `<input>` comum — controle via `value`/`onChange` como qualquer input.\n */\nexport const SearchBar = forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { placeholder = 'Buscar…', shortcut, wrapperClassName, className, ...rest },\n ref,\n) {\n return (\n <div className={cx('rootzz-search', wrapperClassName)}>\n <SearchIcon size={18} className=\"rootzz-search__icon\" />\n <input\n ref={ref}\n type=\"search\"\n placeholder={placeholder}\n className={cx('rootzz-search__input', className)}\n {...rest}\n />\n {shortcut != null && <kbd className=\"rootzz-search__shortcut\">{shortcut}</kbd>}\n </div>\n );\n});\n"]}
|
package/dist/styles.css
CHANGED
|
@@ -79,8 +79,8 @@
|
|
|
79
79
|
--rzl-active-bg: rgba(71, 112, 235, 0.16);
|
|
80
80
|
--rzl-active-fg: var(--rzl-primary);
|
|
81
81
|
|
|
82
|
-
--rzl-bg: #
|
|
83
|
-
--rzl-surface: #
|
|
82
|
+
--rzl-bg: #000000;
|
|
83
|
+
--rzl-surface: #000000; /* topbar e sidebar acompanham o fundo no dark */
|
|
84
84
|
|
|
85
85
|
--rzl-fg: #ffffff;
|
|
86
86
|
--rzl-fg-muted: rgba(255, 255, 255, 0.65);
|
|
@@ -104,28 +104,18 @@
|
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
/* ── Reset mínimo, ESCOPADO ───────────────────────────────────────────── */
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
107
|
+
/* Aplica SOMENTE nos elementos do próprio rootzz-layout (classes `rootzz-*`),
|
|
108
|
+
nunca com `*`. Assim o conteúdo do consumidor dentro de
|
|
109
|
+
`.rootzz-content__inner` nunca herda `box-sizing`/`border-*` da lib. */
|
|
110
|
+
[class*='rootzz-'],
|
|
111
|
+
[class*='rootzz-']::before,
|
|
112
|
+
[class*='rootzz-']::after {
|
|
111
113
|
box-sizing: border-box;
|
|
112
114
|
border-width: 0;
|
|
113
115
|
border-style: solid;
|
|
114
116
|
border-color: var(--rzl-border);
|
|
115
117
|
}
|
|
116
118
|
|
|
117
|
-
/* O conteúdo do consumidor vive em `.rootzz-content__inner`: ele e seus
|
|
118
|
-
descendentes ficam de fora do reset de `border-*` para não vazar no app
|
|
119
|
-
de quem consome a lib. `box-sizing` é mantido por ser inofensivo. */
|
|
120
|
-
.rootzz-content__inner,
|
|
121
|
-
.rootzz-content__inner *,
|
|
122
|
-
.rootzz-content__inner *::before,
|
|
123
|
-
.rootzz-content__inner *::after {
|
|
124
|
-
border-width: revert;
|
|
125
|
-
border-style: revert;
|
|
126
|
-
border-color: revert;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
119
|
.rootzz-layout {
|
|
130
120
|
/* Layout do shell: coluna com topbar no topo e (sidebar + conteúdo) abaixo. */
|
|
131
121
|
display: flex;
|
|
@@ -238,7 +228,7 @@
|
|
|
238
228
|
display: flex;
|
|
239
229
|
flex-shrink: 0;
|
|
240
230
|
align-items: center;
|
|
241
|
-
gap:
|
|
231
|
+
gap: 8px;
|
|
242
232
|
}
|
|
243
233
|
|
|
244
234
|
/* Botão de menu (hambúrguer): só no mobile. Especificidade dupla
|
|
@@ -304,8 +294,8 @@
|
|
|
304
294
|
}
|
|
305
295
|
|
|
306
296
|
.rootzz-brand__app-icon {
|
|
307
|
-
height:
|
|
308
|
-
width:
|
|
297
|
+
height: 35px;
|
|
298
|
+
width: 35px;
|
|
309
299
|
object-fit: contain;
|
|
310
300
|
flex-shrink: 0;
|
|
311
301
|
}
|
|
@@ -441,7 +431,7 @@
|
|
|
441
431
|
.rootzz-dropdown__panel {
|
|
442
432
|
position: absolute;
|
|
443
433
|
top: 100%;
|
|
444
|
-
margin-top:
|
|
434
|
+
margin-top: 4px;
|
|
445
435
|
z-index: var(--rzl-z-dropdown);
|
|
446
436
|
transform-origin: top;
|
|
447
437
|
padding: 0.375rem 0;
|
|
@@ -477,15 +467,6 @@
|
|
|
477
467
|
padding: 0.5rem;
|
|
478
468
|
}
|
|
479
469
|
|
|
480
|
-
.rootzz-apps__title {
|
|
481
|
-
padding: 0.25rem 0.5rem 0.5rem;
|
|
482
|
-
font-size: 0.75rem;
|
|
483
|
-
font-weight: 600;
|
|
484
|
-
text-transform: uppercase;
|
|
485
|
-
letter-spacing: 0.025em;
|
|
486
|
-
color: var(--rzl-fg-subtle);
|
|
487
|
-
}
|
|
488
|
-
|
|
489
470
|
.rootzz-apps__status {
|
|
490
471
|
padding: 1.5rem 0.5rem;
|
|
491
472
|
text-align: center;
|
|
@@ -524,7 +505,7 @@
|
|
|
524
505
|
|
|
525
506
|
.rootzz-apps__label {
|
|
526
507
|
font-size: 0.75rem;
|
|
527
|
-
font-weight:
|
|
508
|
+
font-weight: 400;
|
|
528
509
|
line-height: 1.25;
|
|
529
510
|
color: var(--rzl-fg);
|
|
530
511
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rootzz-layout",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Shell de aplicação (Topbar + Sidebar + Content) da Eduzz para React. Leve, sem dependências de runtime e em CSS puro (sem Tailwind no consumidor).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Eduzz",
|