@fayz-ai/ui 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-75EFDLST.js +274 -0
- package/dist/chunk-75EFDLST.js.map +1 -0
- package/dist/{chunk-YB5ZJKNG.cjs → chunk-7PTRAWHO.cjs} +263 -225
- package/dist/chunk-7PTRAWHO.cjs.map +1 -0
- package/dist/{chunk-CZ6X6PZT.js → chunk-COC5DDFG.js} +313 -44
- package/dist/chunk-COC5DDFG.js.map +1 -0
- package/dist/{chunk-MYZT2OG7.js → chunk-FY7OZNKU.js} +24 -68
- package/dist/chunk-FY7OZNKU.js.map +1 -0
- package/dist/chunk-H6OULCHF.cjs +81 -0
- package/dist/chunk-H6OULCHF.cjs.map +1 -0
- package/dist/{chunk-GE6XUREM.cjs → chunk-HG5RH3B3.cjs} +339 -68
- package/dist/chunk-HG5RH3B3.cjs.map +1 -0
- package/dist/{chunk-7TBDPNLY.cjs → chunk-NWPMNPGR.cjs} +76 -47
- package/dist/chunk-NWPMNPGR.cjs.map +1 -0
- package/dist/{chunk-D6SXPF4F.cjs → chunk-ODY3GZ3Y.cjs} +41 -87
- package/dist/chunk-ODY3GZ3Y.cjs.map +1 -0
- package/dist/{chunk-22J2RTMN.js → chunk-OTUH4K4B.js} +196 -150
- package/dist/chunk-OTUH4K4B.js.map +1 -0
- package/dist/chunk-OW73RZOU.cjs +313 -0
- package/dist/chunk-OW73RZOU.cjs.map +1 -0
- package/dist/{chunk-GFH5HOCO.js → chunk-W5O2X277.js} +42 -14
- package/dist/chunk-W5O2X277.js.map +1 -0
- package/dist/chunk-YRVE4FOD.js +57 -0
- package/dist/chunk-YRVE4FOD.js.map +1 -0
- package/dist/dashboard/DashboardCanvas.d.ts +5 -1
- package/dist/dashboard/DashboardCanvas.d.ts.map +1 -1
- package/dist/dashboard/GoldCard.d.ts +19 -0
- package/dist/dashboard/GoldCard.d.ts.map +1 -0
- package/dist/dashboard/KpiCard.d.ts.map +1 -1
- package/dist/dashboard/index.cjs +30 -26
- package/dist/dashboard/index.d.ts +1 -0
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -3
- package/dist/index.cjs +198 -174
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/layout/AppShell.d.ts +27 -6
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/ContentSplit.d.ts +32 -0
- package/dist/layout/ContentSplit.d.ts.map +1 -0
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Topbar.d.ts.map +1 -1
- package/dist/layout/index.cjs +31 -23
- package/dist/layout/index.d.ts +2 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +3 -3
- package/dist/primitives/index.cjs +126 -114
- package/dist/primitives/index.d.ts +2 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +4 -4
- package/dist/primitives/markdown-editor.d.ts +23 -0
- package/dist/primitives/markdown-editor.d.ts.map +1 -0
- package/dist/primitives/markdown.d.ts +9 -0
- package/dist/primitives/markdown.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/dashboard/DashboardCanvas.tsx +13 -2
- package/src/dashboard/GoldCard.tsx +38 -0
- package/src/dashboard/KpiCard.tsx +4 -2
- package/src/dashboard/index.ts +1 -0
- package/src/index.ts +15 -0
- package/src/layout/AppShell.tsx +240 -20
- package/src/layout/ContentSplit.tsx +153 -0
- package/src/layout/ModulePage.tsx +2 -2
- package/src/layout/Sidebar.tsx +71 -20
- package/src/layout/Topbar.tsx +47 -17
- package/src/layout/index.ts +15 -1
- package/src/primitives/dropdown.tsx +4 -4
- package/src/primitives/index.ts +2 -0
- package/src/primitives/markdown-editor.tsx +75 -0
- package/src/primitives/markdown.tsx +169 -0
- package/src/primitives/select.tsx +1 -1
- package/dist/chunk-22J2RTMN.js.map +0 -1
- package/dist/chunk-7TBDPNLY.cjs.map +0 -1
- package/dist/chunk-CZ6X6PZT.js.map +0 -1
- package/dist/chunk-D6SXPF4F.cjs.map +0 -1
- package/dist/chunk-DNYVEOAX.js +0 -11
- package/dist/chunk-DNYVEOAX.js.map +0 -1
- package/dist/chunk-E526FHZ4.js +0 -169
- package/dist/chunk-E526FHZ4.js.map +0 -1
- package/dist/chunk-GE6XUREM.cjs.map +0 -1
- package/dist/chunk-GFH5HOCO.js.map +0 -1
- package/dist/chunk-MYZT2OG7.js.map +0 -1
- package/dist/chunk-VVVZO2LE.cjs +0 -13
- package/dist/chunk-VVVZO2LE.cjs.map +0 -1
- package/dist/chunk-W4XXXJRW.cjs +0 -196
- package/dist/chunk-W4XXXJRW.cjs.map +0 -1
- package/dist/chunk-YB5ZJKNG.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stores/layout.store.ts","../src/layout/Sidebar.tsx","../src/layout/Topbar.tsx","../src/layout/AppShell.tsx","../src/layout/PageTransition.tsx","../src/layout/ModulePage.tsx"],"names":["React","React2","jsxs","jsx","UserCog","Settings","CreditCard","Fragment","ICON_MAP","Home","Users","Bell","Calendar","Package","BarChart3","FileText","Mail","DollarSign","Megaphone","ShoppingCart","Target","Wrench","ClipboardList","Briefcase","BookOpen","MessageCircle","Globe","Percent","Tag","Camera","UtensilsCrossed","Search","MapPin","Handshake","Contact","Building2","ChevronDown","Filter","Plus","List","Dog","Cat","PawPrint","Heart","LayoutTemplate","LeafyGreen","Apple","Egg","Wheat","PartyPopper","Radio","CalendarDays","Banknote","Layers","Music","Eye","ListMusic","Disc3","UsersRound","Mic","getIcon","Menu","React4","React5","NavItem"],"mappings":";;;;;;;;;;;AAaO,IAAM,cAAA,GAAiB,MAAA,CAAoB,CAAC,GAAA,MAAS;AAAA,EAC1D,WAAA,EAAa,IAAA;AAAA,EACb,gBAAA,EAAkB,KAAA;AAAA,EAClB,gBAAA,EAAkB,KAAA;AAAA,EAClB,kBAAA,EAAoB,KAAA;AAAA,EAEpB,aAAA,EAAe,MACb,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,WAAA,EAAa,CAAC,KAAA,CAAM,WAAA,EAAY,CAAE,CAAA;AAAA,EAEtD,qBAAqB,CAAC,SAAA,KACpB,IAAI,EAAE,gBAAA,EAAkB,WAAW,CAAA;AAAA,EAErC,kBAAA,EAAoB,MAClB,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,gBAAA,EAAkB,CAAC,KAAA,CAAM,gBAAA,EAAiB,CAAE,CAAA;AAAA,EAEhE,uBAAuB,CAAC,IAAA,KACtB,IAAI,EAAE,kBAAA,EAAoB,MAAM;AACpC,CAAA,CAAE;ACmFF,IAAM,QAAA,GAAuC;AAAA,EAC3C,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,SAAA;AAAA,EAC5D,QAAA;AAAA,EAAU,IAAA;AAAA,EAAM,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,YAAA;AAAA,EAAc,MAAA;AAAA,EAAQ,MAAA;AAAA,EAC7D,aAAA;AAAA,EAAe,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,aAAA;AAAA,EAAe,KAAA;AAAA,EAC5D,OAAA;AAAA,EAAS,GAAA;AAAA,EAAK,MAAA;AAAA,EAAQ,eAAA;AAAA,EAAiB,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,OAAA;AAAA,EAC1D,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,cAAA;AAAA,EAAgB,UAAA;AAAA,EAAY,KAAA;AAAA,EAAO,GAAA;AAAA,EAAK,KAAA;AAAA,EAC1G,WAAA;AAAA,EAAa,KAAA;AAAA,EAAO,YAAA;AAAA,EAAc,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,GAAA;AAAA,EAAK,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,UAAA;AAAA,EAAY,GAAA;AAAA,EAC9F,GAAA;AAAA,EAAK,KAAA;AAAA,EAAO,eAAA;AAAA,EAAiB,aAAA;AAAA,EAAe,IAAA;AAAA,EAAM;AACpD;AAIA,SAAS,QAAQ,IAAA,EAA0B;AACzC,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA;AAC3B;AAEA,SAAS,OAAA,CAAQ;AAAA,EACf,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAE9B,EAAA,MAAM,OAAA,mBACJ,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,MACpC,SAAA,EAAW,EAAA;AAAA,QACT,mGAAA;AAAA,QACA,iEAAA;AAAA,QACA,WACI,0EAAA,GACA,4BAAA;AAAA,QACJ,SAAA,IAAa;AAAA,OACf;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,kBAAA,EAAmB,CAAA;AAAA,QAClC,CAAC,6BACA,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,UACvD,IAAA,CAAK,UAAU,MAAA,oBACd,GAAA,CAAC,UAAK,SAAA,EAAU,2FAAA,EACb,eAAK,KAAA,EACR;AAAA,SAAA,EAEJ;AAAA;AAAA;AAAA,GAEJ;AAGF,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACE,IAAA,CAAS,OAAA,CAAA,IAAA,EAAR,EAAa,aAAA,EAAe,CAAA,EAC3B,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAS,OAAA,CAAA,OAAA,EAAR,EAAgB,OAAA,EAAO,IAAA,EAAE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBAClC,GAAA,CAAS,gBAAR,EACC,QAAA,kBAAA,IAAA;AAAA,QAAS,OAAA,CAAA,OAAA;AAAA,QAAR;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,UAAA,EAAY,CAAA;AAAA,UACZ,SAAA,EAAU,qGAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,KAAA;AAAA,YACL,IAAA,CAAK,UAAU,MAAA,oBACd,GAAA,CAAC,UAAK,SAAA,EAAU,4EAAA,EACb,eAAK,KAAA,EACR,CAAA;AAAA,4BAEF,GAAA,CAAS,OAAA,CAAA,KAAA,EAAR,EAAc,SAAA,EAAU,cAAA,EAAe;AAAA;AAAA;AAAA,OAC1C,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,QAAA,CAAS;AAAA,EAChB,IAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUA,MAAA,CAAA,QAAA;AAAA,IAAS,MACrC,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,KAAM,WAAA,KAAgB,CAAA,CAAE,KAAA,IAAS,YAAY,UAAA,CAAW,CAAA,CAAE,KAAA,GAAQ,GAAG,CAAC,CAAA,IAAK;AAAA,GAClG;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,MAAM,aAAA,GAAgB,KAAK,QAAA,EAAU,IAAA;AAAA,IACnC,CAAC,MAAM,WAAA,KAAgB,CAAA,CAAE,SAAS,WAAA,CAAY,UAAA,CAAW,CAAA,CAAE,KAAA,GAAQ,GAAG;AAAA,GACxE;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACE,IAAA,CAAS,OAAA,CAAA,IAAA,EAAR,EAAa,aAAA,EAAe,CAAA,EAC3B,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAS,OAAA,CAAA,OAAA,EAAR,EAAgB,OAAA,EAAO,IAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,UACpC,SAAA,EAAW,EAAA;AAAA,YACT,oGAAA;AAAA,YACA,8DAAA;AAAA,YACA,gBAAgB,kDAAA,GAAqD;AAAA,WACvE;AAAA,UAEA,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB;AAAA;AAAA,OACrC,EACF,CAAA;AAAA,sBACA,GAAA,CAAS,OAAA,CAAA,MAAA,EAAR,EACC,QAAA,kBAAA,IAAA,CAAS,OAAA,CAAA,OAAA,EAAR,EAAgB,IAAA,EAAK,OAAA,EAAQ,UAAA,EAAY,CAAA,EAAG,SAAA,EAAU,qGAAA,EACpD,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,KAAA;AAAA,wBACN,GAAA,CAAS,OAAA,CAAA,KAAA,EAAR,EAAc,SAAA,EAAU,cAAA,EAAe;AAAA,OAAA,EAC1C,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,4BACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,IAAI,CAAA;AAAA,QAC5B,SAAA,EAAW,EAAA;AAAA,UACT,2FAAA;AAAA,UACA,8DAAA;AAAA,UACA,gBAAgB,gCAAA,GAAmC;AAAA,SACrD;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,kBAAA,EAAmB,CAAA;AAAA,0BACnC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA6B,eAAK,KAAA,EAAM,CAAA;AAAA,8BACvD,WAAA,EAAA,EAAY,SAAA,EAAW,GAAG,2CAAA,EAA6C,IAAA,IAAQ,YAAY,CAAA,EAAG;AAAA;AAAA;AAAA,KACjG;AAAA,IACC,IAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAU,kEACZ,QAAA,EAAA,IAAA,CAAK,QAAA,EAAU,GAAA,CAAI,CAAC,KAAA,KAAU;AAC7B,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AACpC,MAAA,MAAM,QAAA,GAAW,gBAAgB,KAAA,CAAM,KAAA,IAAS,YAAY,UAAA,CAAW,KAAA,CAAM,QAAQ,GAAG,CAAA;AACxF,MAAA,uBACE,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,OAAA,EAAS,MAAM,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AAAA,UACrC,SAAA,EAAW,EAAA;AAAA,YACT,mFAAA;AAAA,YACA,WACI,4CAAA,GACA;AAAA,WACN;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,SAAA,EAAA,EAAU,WAAU,sBAAA,EAAuB,CAAA;AAAA,4BAC5C,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,gBAAM,KAAA,EAAM;AAAA;AAAA,SAAA;AAAA,QAVnC,KAAA,CAAM;AAAA,OAWb;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEO,SAAS,OAAA,CAAQ;AAAA,EACtB,UAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAa,eAAA,GAAkB,GAAA;AAAA,EAC/B,IAAA,EAAM,KAAA;AAAA,EACN,WAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAAiB;AACf,EAAA,MAAM,WAAA,GAAc,eAAA;AACpB,EAAA,MAAM,qBAAA,GAAwB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,qBAAqB,CAAA;AAE3E,EAAA,MAAM,YAAY,UAAA,CAAW,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AACrE,EAAA,MAAM,iBAAiB,UAAA,CAAW,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,YAAY,WAAW,CAAA;AAC/E,EAAA,MAAM,gBAAgB,UAAA,CAAW,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,YAAY,UAAU,CAAA;AAE7E,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACxC,IAAA,UAAA,GAAa,KAAK,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,uBACE,GAAA,CAAS,kBAAR,EACC,QAAA,kBAAA,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,MAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACT,qFAAA;AAAA,QACA,CAAC,UAAA,IAAc,gCAAA;AAAA,QACf,YAAY,MAAA,GAAS;AAAA,OACvB;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,6CAAA;AAAA,cACA,CAAC,UAAA,IAAc,gCAAA;AAAA,cACf,SAAA,IAAa;AAAA,aACf;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,CAAC,6BACA,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,gBAAA,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,gCAChD,GAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,QAAA;AAAA,oBACT,SAAA,EAAU,4HAAA;AAAA,oBACV,YAAA,EAAW,kBAAA;AAAA,oBAEX,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACtC,eAAA,EACF,CAAA;AAAA,cAED,SAAA,oBACC,GAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,QAAA;AAAA,kBACT,SAAA,EAAU,oHAAA;AAAA,kBACV,YAAA,EAAW,gBAAA;AAAA,kBAEX,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACjC;AAAA;AAAA,SAEJ;AAAA,wBAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,UAAA,oBAAc,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,UAE1D,UAAU,MAAA,GAAS,CAAA,wBACjB,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,SAAA,CAAU,GAAA;AAAA,YAAI,CAAC,IAAA,KACd,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA,mBACtC,GAAA,CAAC,QAAA,EAAA,EAAuB,MAAY,SAAA,EAAsB,WAAA,EAA0B,YAAY,cAAA,EAAA,EAAjF,IAAA,CAAK,EAA4F,CAAA,mBAEhH,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBAEC,IAAA;AAAA,gBACA,SAAA;AAAA,gBACA,QAAA,EAAU,gBAAgB,IAAA,CAAK,KAAA,IAAS,YAAY,UAAA,CAAW,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,gBAC/E,UAAA,EAAY;AAAA,eAAA;AAAA,cAJP,IAAA,CAAK;AAAA;AAKZ,WAEJ,EACF,CAAA;AAAA,UAGD,eAAe,MAAA,GAAS,CAAA,wBACtB,KAAA,EAAA,EAAI,SAAA,EAAU,kBACZ,QAAA,EAAA,cAAA,CAAe,GAAA;AAAA,YAAI,CAAC,IAAA,KACnB,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA,mBACtC,GAAA,CAAC,QAAA,EAAA,EAAuB,MAAY,SAAA,EAAsB,WAAA,EAA0B,YAAY,cAAA,EAAA,EAAjF,IAAA,CAAK,EAA4F,CAAA,mBAEhH,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBAEC,IAAA;AAAA,gBACA,SAAA;AAAA,gBACA,QAAA,EAAU,gBAAgB,IAAA,CAAK,KAAA,IAAS,YAAY,UAAA,CAAW,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,gBAC/E,UAAA,EAAY;AAAA,eAAA;AAAA,cAJP,IAAA,CAAK;AAAA;AAKZ,WAEJ,EACF;AAAA,SAAA,EAEJ,CAAA;AAAA,QAGC,aAAA,CAAc,MAAA,GAAS,CAAA,oBACtB,GAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,CAAC,cAAc,gCAAgC,CAAA,EAChF,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,qBAClB,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YAEC,IAAA;AAAA,YACA,SAAA;AAAA,YACA,QAAA,EAAU,gBAAgB,IAAA,CAAK,KAAA,IAAS,YAAY,UAAA,CAAW,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,YAC/E,UAAA,EAAY;AAAA,WAAA;AAAA,UAJP,IAAA,CAAK;AAAA,SAMb,CAAA,EACH,CAAA;AAAA,QAGD,aAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,KAAA,EAAO,CAAC,UAAA,IAAc,gCAAgC,GACvE,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAa,yBAAc,CAAA,EAC5C,CAAA;AAAA,QAID,WAAA,IAAqBA,sBAAe,WAAW,CAAA,GACtCA,oBAAa,WAAA,EAAwC,EAAE,SAAA,EAAW,CAAA,GACxE,WAAA;AAAA,wBAGJ,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,CAAC,UAAA,IAAc,gCAAgC,CAAA,EACvE,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,UACd,8BAAA;AAAA,UACA,YAAY,gBAAA,GAAmB;AAAA,SACjC,EAEG,QAAA,EAAA;AAAA,UAAA,YAAA;AAAA,UAGA,CAAC,SAAA,oBAAa,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,QAAA,EAAS,CAAA;AAAA,0BAGvC,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,qBAAA,CAAsB,IAAI,CAAA;AAAA,cACzC,SAAA,EAAU,sKAAA;AAAA,cACV,YAAA,EAAW,QAAA;AAAA,cAEX,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAC9B;AAAA,UAGC,gBAAA,oBACC,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,+KAAA;AAAA,cACV,YAAA,EAAY,WAAA,GAAc,CAAA,GAAI,CAAA,EAAG,WAAW,CAAA,qBAAA,CAAA,GAA0B,eAAA;AAAA,cAEtE,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,SAAA,EAAU,CAAA;AAAA,gBACzB,WAAA,GAAc,CAAA,oBACb,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4DAAA,EAA6D;AAAA;AAAA;AAAA;AAEjF,SAAA,EAEJ,CAAA,EACF;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;ACrVA,SAAS,cAAA,CAAe;AAAA,EACtB,IAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA0G;AACxG,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUC,gBAAS,KAAK,CAAA;AAC5C,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,QAAA,EAAU,IAAA,EAAK,GAAI,CAAC,CAAA,IAAK,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,IAAK,GAAA,EAAK,WAAA,EAAY;AACnF,EAAA,MAAM,OAAO,CAAC,KAAA,EAAe,OAAA,EAAsB,IAAA,KACjD,0BACEC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAEC,SAAS,MAAM;AAAE,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAC3C,SAAA,EAAU,2HAAA;AAAA,MAET,QAAA,EAAA;AAAA,QAAA,IAAA,oBAAQC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,CAAA;AAAA,wBACzDA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA,KAAA;AAAA,IALR;AAAA,GAMP,GACE,IAAA;AACN,EAAA,uBACED,IAAAA,CAAS,OAAA,CAAA,IAAA,EAAR,EAAa,IAAA,EAAY,cAAc,OAAA,EACtC,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAS,OAAA,CAAA,OAAA,EAAR,EAAgB,OAAA,EAAO,MACtB,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,WAAA;AAAA,QACX,SAAA,EAAU,kMAAA;AAAA,QAET,QAAA,EAAA,IAAA,CAAK,SAAA;AAAA;AAAA,0BAEJA,IAAC,KAAA,EAAA,EAAI,GAAA,EAAK,KAAK,SAAA,EAAW,GAAA,EAAI,EAAA,EAAG,SAAA,EAAU,4BAAA,EAA6B;AAAA,YAExE;AAAA;AAAA,KAEJ,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAS,OAAA,CAAA,MAAA,EAAR,EACC,QAAA,kBAAAD,IAAAA;AAAA,MAAS,OAAA,CAAA,OAAA;AAAA,MAAR;AAAA,QACC,KAAA,EAAM,KAAA;AAAA,QACN,UAAA,EAAY,CAAA;AAAA,QACZ,SAAA,EAAU,kIAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDAAgD,QAAA,EAAA,IAAA,CAAK,QAAA,IAAY,KAAK,KAAA,EAAM,CAAA;AAAA,4BACzFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EAA0C,eAAK,KAAA,EAAM;AAAA,WAAA,EACpE,CAAA;AAAA,0BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACZ,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,QAAA,EAAU,WAAWE,OAAO,CAAA;AAAA,YACjC,IAAA,CAAK,qBAAA,EAAiB,UAAA,EAAYC,QAAQ,CAAA;AAAA,YAC1C,IAAA,CAAK,aAAA,EAAY,SAAA,EAAWC,UAAU,CAAA;AAAA,YACtC,cAAA,EAAgB,IAAI,CAAC,CAAA,KAAM,KAAK,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,OAAO,CAAC,CAAA;AAAA,YACnD,SAAA,oBACCJ,IAAAA,CAAAK,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,cAC5C,IAAA,CAAK,QAAQ,SAAS;AAAA,aAAA,EACzB;AAAA,WAAA,EAEJ;AAAA;AAAA;AAAA,KACF,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAMK,SAAAA,GAAuC;AAAA,EAClD,IAAA,EAAAC,IAAAA;AAAA,EAAM,KAAA,EAAAC,KAAAA;AAAA,EAAO,QAAA,EAAAL,QAAAA;AAAA,EAAU,UAAA,EAAAC,UAAAA;AAAA,EAAY,IAAA,EAAAK,IAAAA;AAAA,EAAM,QAAA,EAAAC,QAAAA;AAAA,EAAU,OAAA,EAAAC,OAAAA;AAAA,EAAS,SAAA,EAAAC,SAAAA;AAAA,EAC5D,QAAA,EAAAC,QAAAA;AAAA,EAAU,IAAA,EAAAC,IAAAA;AAAA,EAAM,UAAA,EAAAC,UAAAA;AAAA,EAAY,SAAA,EAAAC,SAAAA;AAAA,EAAW,YAAA,EAAAC,YAAAA;AAAA,EAAc,MAAA,EAAAC,MAAAA;AAAA,EAAQ,MAAA,EAAAC,MAAAA;AAAA,EAC7D,aAAA,EAAAC,aAAAA;AAAA,EAAe,SAAA,EAAAC,SAAAA;AAAA,EAAW,OAAA,EAAAnB,OAAAA;AAAA,EAAS,QAAA,EAAAoB,QAAAA;AAAA,EAAU,aAAA,EAAAC,aAAAA;AAAA,EAAe,KAAA,EAAAC,KAAAA;AAAA,EAC5D,OAAA,EAAAC,OAAAA;AAAA,EAAS,GAAA,EAAAC,GAAAA;AAAA,EAAK,MAAA,EAAAC,MAAAA;AAAA,EAAQ,eAAA,EAAAC,eAAAA;AAAA,EAAiB,MAAA,EAAAC,MAAAA;AAAA,EAAQ,MAAA,EAAAC,MAAAA;AAAA,EAAQ,SAAA,EAAAC,SAAAA;AAAA,EACvD,OAAA,EAAAC,OAAAA;AAAA,EAAS,SAAA,EAAAC,SAAAA;AAAA,EAAW,WAAA,EAAAC,WAAAA;AAAA,EAAa,MAAA,EAAAC,MAAAA;AAAA,EAAQ,IAAA,EAAAC,IAAAA;AAAA,EAAM,IAAA,EAAAC,IAAAA;AAAA,EAAM,GAAA,EAAAC,GAAAA;AAAA,EAAK,GAAA,EAAAC,GAAAA;AAAA,EAAK,QAAA,EAAAC,QAAAA;AAAA,EAAU,KAAA,EAAAC,KAAAA;AAAA,EAAO,cAAA,EAAAC,cAAAA;AAAA,EAAgB,UAAA,EAAAC,UAAAA;AAAA,EAAY,KAAA,EAAAC,KAAAA;AAAA,EAAO,GAAA,EAAAC,GAAAA;AAAA,EAAK,KAAA,EAAAC,KAAAA;AAAA,EACxH,eAAA;AAAA,EAAiB,aAAA;AAAA,EAAe,cAAA;AAAA,EAAgB,IAAA;AAAA,EAAM,iBAAA;AAAA,EAAmB,eAAA;AAAA,EAAiB,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,UAAA;AAAA,EAAY,gBAAA;AAAA,EAAkB,KAAA;AAAA,EAAO,aAAA;AAAA,EAAe,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,YAAA;AAAA,EAAc,cAAA;AAAA,EAAgB,QAAA;AAAA,EAAU,QAAA;AAAA,EAC7O,WAAA,EAAAC,WAAAA;AAAA,EAAa,KAAA,EAAAC,KAAAA;AAAA,EAAO,YAAA,EAAAC,YAAAA;AAAA,EAAc,QAAA,EAAAC,QAAAA;AAAA,EAAU,MAAA,EAAAC,MAAAA;AAAA,EAAQ,KAAA,EAAAC,KAAAA;AAAA,EAAO,GAAA,EAAAC,GAAAA;AAAA,EAAK,SAAA,EAAAC,SAAAA;AAAA,EAAW,KAAA,EAAAC,KAAAA;AAAA,EAAO,UAAA,EAAAC,UAAAA;AAAA,EAAY,GAAA,EAAAC;AAChG,CAAA;AAEA,SAASC,SAAQ,IAAA,EAA0B;AACzC,EAAA,OAAOpD,SAAAA,CAAS,IAAI,CAAA,IAAKC,IAAAA;AAC3B;AAEA,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,WAAA,EAAa,YAAW,EAIlD;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUR,gBAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,IAAA,GAAO2D,QAAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,MAAM,aAAA,GAAgB,KAAK,QAAA,EAAU,IAAA;AAAA,IACnC,CAAC,UAAU,WAAA,KAAgB,KAAA,CAAM,SAAS,WAAA,CAAY,UAAA,CAAW,KAAA,CAAM,KAAA,GAAQ,GAAG;AAAA,GACpF;AAEA,EAAA,uBACE1D,IAAAA,CAAS,OAAA,CAAA,IAAA,EAAR,EAAa,IAAA,EAAY,cAAc,OAAA,EACtC,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAS,OAAA,CAAA,OAAA,EAAR,EAAgB,OAAA,EAAO,MACtB,QAAA,kBAAAD,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,mBAAiB,aAAA,IAAiB,MAAA;AAAA,QAClC,SAAA,EAAW,EAAA;AAAA,UACT,4FAAA;AAAA,UACA,gBACI,wEAAA,GACA;AAAA,SACN;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,0BAC1BA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,0BAClBA,IAACiC,WAAAA,EAAA,EAAY,WAAW,EAAA,CAAG,8BAAA,EAAgC,IAAA,IAAQ,YAAY,CAAA,EAAG;AAAA;AAAA;AAAA,KACpF,EACF,CAAA;AAAA,oBACAjC,GAAAA,CAAS,OAAA,CAAA,MAAA,EAAR,EACC,QAAA,kBAAAA,GAAAA;AAAA,MAAS,OAAA,CAAA,OAAA;AAAA,MAAR;AAAA,QACC,KAAA,EAAM,OAAA;AAAA,QACN,UAAA,EAAY,CAAA;AAAA,QACZ,SAAA,EAAU,kIAAA;AAAA,QAET,QAAA,EAAA,IAAA,CAAK,QAAA,EAAU,GAAA,CAAI,CAAC,KAAA,KAAU;AAC7B,UAAA,MAAM,SAAA,GAAYyD,QAAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AACpC,UAAA,MAAM,QAAA,GAAW,gBAAgB,KAAA,CAAM,KAAA,IAAS,YAAY,UAAA,CAAW,KAAA,CAAM,QAAQ,GAAG,CAAA;AACxF,UAAA,uBACE1D,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,SAAS,MAAM;AACb,gBAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AACtB,gBAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,cACf,CAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACT,iFAAA;AAAA,gBACA,WACI,sCAAA,GACA;AAAA,eACN;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,+BAAA,EAAgC,CAAA;AAAA,gCACrDA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM;AAAA;AAAA,aAAA;AAAA,YAbd,KAAA,CAAM;AAAA,WAcb;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,MAAA,CAAO;AAAA,EACrB,UAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,GAAA;AAAA,EACd,UAAA;AAAA,EACA,iBAAA,GAAoB,WAAA;AAAA,EACpB,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAgB;AACd,EAAA,MAAM,qBAAA,GAAwB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,qBAAqB,CAAA;AAE3E,EAAA,MAAM,UAAU,UAAA,CAAW,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AACnE,EAAA,MAAM,eAAe,UAAA,CAAW,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,YAAY,WAAW,CAAA;AAC7E,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAA,EAAS,GAAG,YAAY,CAAA;AAE3C,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACxC,IAAA,UAAA,GAAa,KAAK,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,uBACED,IAAAA,CAAC,QAAA,EAAA,EAAO,YAAA,EAAW,MAAA,EAAO,WAAU,mCAAA,EAElC,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,mEAAA,EACb,0BAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4DAAA,EAEb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,WAAA;AAAA,YACT,SAAA,EAAU,+IAAA;AAAA,YACV,YAAA,EAAW,WAAA;AAAA,YAEX,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SAC5B;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACZ,QAAA,EAAA,IAAA,oBAAQA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,KAAA,EAAG,CAAA,EAClD;AAAA,OAAA,EACF,CAAA;AAAA,sBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCACb,QAAA,kBAAAD,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,qBAAA,CAAsB,IAAI,CAAA;AAAA,UACzC,SAAA,EAAU,gLAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC4B,MAAAA,EAAA,EAAO,SAAA,EAAU,2EAAA,EAA4E,CAAA;AAAA,4BAC9F5B,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAW,QAAA,EAAA,iBAAA,EAAkB,CAAA;AAAA,4BAC7CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kJAAiJ,QAAA,EAAA,SAAA,EAEhK;AAAA;AAAA;AAAA,OACF,EACF,CAAA;AAAA,sBAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,WAAA;AAAA,QACA,YAAA;AAAA,wBACDC,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,IAAA;AAAA,YACA,SAAA;AAAA,YACA,SAAA;AAAA,YACA,UAAA;AAAA,YACA,SAAA;AAAA,YACA;AAAA;AAAA;AACF,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,CAAC,EAAA,KAAO;AAChB,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,aAAA,CAAc,0BAA0B,CAAA;AAC1D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,OAAO,MAAA,CAAO,UAAA,GAAa,GAAG,WAAA,GAAc,CAAA,GAAI,OAAO,WAAA,GAAc,CAAA;AAC3E,QAAA,EAAA,CAAG,QAAA,CAAS,EAAE,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,MAC7D;AAAA,IACF,GAAG,SAAA,EAAU,0DAAA,EACV,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,KAAS;AACpB,MAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7C,QAAA,uBACEA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YAEC,IAAA;AAAA,YACA,WAAA;AAAA,YACA,UAAA,EAAY;AAAA,WAAA;AAAA,UAHP,IAAA,CAAK;AAAA,SAIZ;AAAA,MAEJ;AAEA,MAAA,MAAM,IAAA,GAAOyD,QAAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC9B,MAAA,MAAM,QAAA,GACJ,IAAA,CAAK,KAAA,KAAU,GAAA,GACX,WAAA,KAAgB,GAAA,GAChB,WAAA,KAAgB,IAAA,CAAK,KAAA,IAAS,WAAA,CAAY,UAAA,CAAW,IAAA,CAAK,QAAQ,GAAG,CAAA;AAE3E,MAAA,uBACE1D,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,mBAAiB,QAAA,IAAY,MAAA;AAAA,UAC7B,OAAA,EAAS,MAAM,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AAAA,UACxC,SAAA,EAAW,EAAA;AAAA,YACT,4FAAA;AAAA,YACA,WACI,sDAAA,GACA;AAAA,WACN;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,4BAC1BA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,YACjB,IAAA,CAAK,UAAU,MAAA,oBACdA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yFAAA,EACb,QAAA,EAAA,IAAA,CAAK,KAAA,EACR;AAAA;AAAA,SAAA;AAAA,QAfG,IAAA,CAAK;AAAA,OAiBZ;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACjXA,IAAM,uBAAA,GAAgC,qBAAkC,IAAI,CAAA;AAErE,SAAS,mBAAA,GAA0C;AACxD,EAAA,OAAa,kBAAW,uBAAuB,CAAA;AACjD;AAGA,IAAM,8BAAA,GAAuC,qBAAkC,IAAI,CAAA;AAE5E,SAAS,0BAAA,GAAiD;AAC/D,EAAA,OAAa,kBAAW,8BAA8B,CAAA;AACxD;AAgDA,SAAS,aAAA,CAAc;AAAA,EACrB,aAAa,EAAC;AAAA,EACd,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA,EAAgB,eAAA;AAAA,EAChB,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAsBG;AACD,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,gBAAgB,CAAA;AACjE,EAAA,MAAM,mBAAA,GAAsB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,mBAAmB,CAAA;AACvE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAU,gBAAS,KAAK,CAAA;AAChE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,gBAA6B,IAAI,CAAA;AAC3E,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAU,gBAA6B,IAAI,CAAA;AAE7E,EAAA,uBACEA,IAAC,eAAA,EAAA,EACD,QAAA,kBAAAA,IAAC,uBAAA,CAAwB,QAAA,EAAxB,EAAiC,KAAA,EAAO,UAAA,EACzC,0BAAAA,GAAAA,CAAC,8BAAA,CAA+B,UAA/B,EAAwC,KAAA,EAAO,aAChD,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EAEb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,UAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA,EAAW,gBAAA;AAAA,QACX,QAAA,EAAU,MAAM,mBAAA,CAAoB,CAAC,gBAAgB,CAAA;AAAA,QACrD,UAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA,EAAY,iBAAA;AAAA,QACZ,aAAA,EAAe,oBAAA;AAAA,QACf,UAAA,EAAY,KAAA;AAAA,QACZ,YAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA;AAAA,KACF,EACF,CAAA;AAAA,oBAKAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,MACd,+CAAA;AAAA,MACA,KAAA,IAAS;AAAA,KACX,EAEE,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oGAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,cACrC,SAAA,EAAU,wGAAA;AAAA,cACV,YAAA,EAAW,WAAA;AAAA,cAEX,QAAA,kBAAAA,GAAAA,CAAC0D,IAAAA,EAAA,EAAK,WAAU,SAAA,EAAU;AAAA;AAAA,WAC5B;AAAA,UACC,6BAAa1D,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAyB,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,UAC9D,WAAA;AAAA,0BAEDA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,aAAA,EAAe,WAAU,kCAAA,EAAmC;AAAA,SAAA,EACxE,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAEb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAA,EAAgB,WAAU,yBAAA,EAA0B,CAAA;AAAA,UAC7D;AAAA,SAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBAGAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BACb,QAAA,EACH,CAAA;AAAA,sBAGAA,IAAC,OAAA,EAAA,EAAQ;AAAA,KAAA,EACX,CAAA;AAAA,IAGC,kCACCA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,UAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA,EAAY,iBAAA;AAAA,QACZ,aAAA,EAAe,oBAAA;AAAA,QACf,YAAA;AAAA,QACA,gBAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA,EAAS,MAAM,iBAAA,CAAkB,KAAK;AAAA;AAAA;AACxC,GAAA,EAEJ,CAAA,EACA,GACA,CAAA,EACA,CAAA;AAEJ;AAMA,SAAS,YAAA,CAAa;AAAA,EACpB,aAAa,EAAC;AAAA,EACd,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAeG;AACD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAU,gBAAS,KAAK,CAAA;AAGhE,EAAA,uBACEA,GAAAA,CAAC,eAAA,EAAA,EACD,0BAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+DAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,UAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA;AAAA,QACA,WAAA,EAAa,WAAA;AAAA,QACb,YAAA,EAAc,SAAA;AAAA,QACd,WAAA,EAAa,MAAM,iBAAA,CAAkB,IAAI;AAAA;AAAA,KAC3C;AAAA,oBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,EAAA,CAAG,wBAAA,EAA0B,SAAS,QAAQ,CAAA,EAC7D,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,YAAA,EAAc,SAAS,qDAAqD,CAAA,EAC5F,UACH,CAAA,EACF,CAAA;AAAA,oBAGAA,IAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,IAIR,kCACCA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,UAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAc,IAAA,mBAAOA,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAY,CAAA,GAAK,MAAA;AAAA,QACrD,OAAA,EAAS,MAAM,iBAAA,CAAkB,KAAK;AAAA;AAAA;AACxC,GAAA,EAEJ,CAAA,EACA,CAAA;AAEJ;AAGA,SAAS,aAAA,CAAc,EAAE,IAAA,EAAK,EAA2B;AACvD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAA;AACpC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,SAAA,mBACJC,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAK,IAAA,CAAK,SAAA,EAAW,GAAA,EAAI,EAAA,EAAG,SAAA,EAAU,4CAAA,EAA6C,oBAExFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yHAAA,EACZ,QAAA,EAAA,CAAA,KAAA,IAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,EACxC,CAAA;AAAA,oBAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAwD,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAChF,CAAA;AAEJ;AAMA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EACA,IAAA,EAAM,KAAA;AAAA,EACN,QAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,6FAAA,EAChB,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA,IAAA,oBAAQA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,KAAA,EAAG,CAAA,EAClD,CAAA;AAAA,MACC,6BAAaA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA2B,QAAA,EAAA,SAAA,EAAU;AAAA,KAAA,EACpE,CAAA;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BACb,QAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAUA,SAAS,cAAc,EAAE,OAAA,EAAS,UAAA,EAAY,GAAG,cAAa,EAAuB;AAGnF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,gBAAS,KAAK,CAAA;AAElD,EAAM,iBAAU,MAAM;AACpB,IAAA,MAAM,EAAA,GAAK,qBAAA,CAAsB,MAAM,UAAA,CAAW,IAAI,CAAC,CAAA;AACvD,IAAA,OAAO,MAAM,qBAAqB,EAAE,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAc,mBAAY,MAAM;AACpC,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,MAAA,CAAO,UAAA,CAAW,SAAS,GAAG,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAM,iBAAU,MAAM;AACpB,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,EAAE,CAAA;AAGL,EAAM,iBAAU,MAAM;AACpB,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,KAAA,EAAM;AAAA,IAChC,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAEb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,uEAAA;AAAA,UACA,UAAU,aAAA,GAAgB;AAAA,SAC5B;AAAA,QACA,OAAA,EAAS;AAAA;AAAA,KACX;AAAA,oBAGAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,uGAAA;AAAA,UACA,UAAU,eAAA,GAAkB;AAAA,SAC9B;AAAA,QAEA,QAAA,kBAAAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACE,GAAG,YAAA;AAAA,YACJ,SAAA,EAAW,KAAA;AAAA,YACX,QAAA,EAAU,KAAA;AAAA,YACV,UAAA,EAAU,IAAA;AAAA,YACV,UAAA,EAAY,CAAC,KAAA,KAAU;AACrB,cAAA,UAAA,GAAa,KAAK,CAAA;AAClB,cAAA,KAAA,EAAM;AAAA,YACR;AAAA;AAAA;AACF;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAMO,SAAS,QAAA,CAAS;AAAA,EACvB,OAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAAkB;AAChB,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,SAAA;AACH,MAAA,uBACEA,GAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,UAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA;AAAA,UACA,UAAA;AAAA,UACA,SAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,WAAA;AAAA,UACA,iBAAA;AAAA,UACA,oBAAA;AAAA,UACA,KAAA,EAAO,YAAA;AAAA,UACP,WAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA;AAAA,UACA,YAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAA;AAAA,UAEC;AAAA;AAAA,OACH;AAAA,IAGJ,KAAK,QAAA;AACH,MAAA,uBACEA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,UAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA;AAAA,UACA,UAAA;AAAA,UACA,SAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,KAAA,EAAO,YAAA;AAAA,UACP,WAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA;AAAA,UAEC;AAAA;AAAA,OACH;AAAA,IAGJ,KAAK,SAAA;AACH,MAAA,uBACEA,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAY,IAAA,EAAY,SAAA,EAAW,WAC/C,QAAA,EACH,CAAA;AAAA,IAGJ,SAAS;AAEP,MAAA,OAAO,IAAA;AAAA,IACT;AAAA;AAEJ;ACxfA,IAAM,oBAAA,GAA6B2D,qBAA6B,OAAO,CAAA;AAEhE,SAAS,qBAAA,CAAsB,EAAE,KAAA,EAAO,QAAA,EAAS,EAAwD;AAC9G,EAAA,uBAAO3D,GAAAA,CAAC,oBAAA,CAAqB,QAAA,EAArB,EAA8B,OAAe,QAAA,EAAS,CAAA;AAChE;AAEO,SAAS,gBAAA,GAAkC;AAChD,EAAA,OAAa2D,kBAAW,oBAAoB,CAAA;AAC9C;AAEA,SAAS,sBAAA,CAAuB,YAA2B,SAAA,EAAwC;AACjG,EAAA,IAAI,UAAA,KAAe,QAAQ,OAAO,EAAA;AAClC,EAAA,IAAI,UAAA,KAAe,QAAQ,OAAO,iBAAA;AAElC,EAAA,IAAI,SAAA,KAAc,QAAQ,OAAO,eAAA;AACjC,EAAA,IAAI,SAAA,KAAc,WAAW,OAAO,kBAAA;AACpC,EAAA,OAAO,iBAAA;AACT;AAOO,SAAS,cAAA,CAAe;AAAA,EAC7B,aAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAa,gBAAA,EAAiB;AACpC,EAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,UAAA,EAAY,SAAS,CAAA;AAC9D,EAAA,uBACE3D,IAAC,KAAA,EAAA,EAAwB,SAAA,EAAW,GAAG,SAAA,EAAW,SAAS,CAAA,EACxD,QAAA,EAAA,EADO,aAEV,CAAA;AAEJ;ACtCO,SAAS,iBAAA,CAAkB,EAAE,QAAA,EAAS,EAAkC;AAC7E,EAAA,MAAM,OAAO,0BAAA,EAA2B;AACxC,EAAA,IAAI,IAAA,EAAM,OAAO,YAAA,CAAa,QAAA,EAAU,IAAI,CAAA;AAC5C,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAA4C,QAAA,EAAS,CAAA;AAC7E;AAyCA,IAAM,mBAAA,GAA4B4D,qBAAgC,MAAM,CAAA;AAEjE,SAAS,oBAAA,CAAqB,EAAE,OAAA,EAAS,QAAA,EAAS,EAA6D;AACpH,EAAA,uBAAO5D,GAAAA,CAAC,mBAAA,CAAoB,UAApB,EAA6B,KAAA,EAAO,SAAU,QAAA,EAAS,CAAA;AACjE;AAEO,SAAS,eAAA,GAAoC;AAClD,EAAA,OAAa4D,kBAAW,mBAAmB,CAAA;AAC7C;AAEA,SAASC,QAAAA,CAAQ,EAAE,IAAA,EAAK,EAA4B;AAClD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUD,gBAAS,IAAI,CAAA;AACnD,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA,GAAQvD,UAAS,IAAA,CAAK,IAAI,KAAK,IAAA,GAAQ,IAAA;AACzD,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AAC5D,EAAA,MAAM,cAAA,GAAiB,eAAe,IAAA,CAAK,QAAA,CAAU,KAAK,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AACzE,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,IAAU,cAAA;AAEhC,EAAA,uBACEN,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,QAAQ,CAAA,GAAI,KAAK,OAAA,IAAU;AAAA,QACrE,SAAA,EAAW,EAAA;AAAA,UACT,mFAAA;AAAA,UACA,WACI,wCAAA,GACA;AAAA,SACN;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,0BAC5CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA6B,eAAK,KAAA,EAAM,CAAA;AAAA,UACvD,WAAA,KACC,QAAA,mBACIA,GAAAA,CAACiC,WAAAA,EAAA,EAAY,SAAA,EAAU,iCAAA,EAAkC,CAAA,mBACzDjC,GAAAA,CAAC,YAAA,EAAA,EAAa,WAAU,iCAAA,EAAkC,CAAA;AAAA;AAAA;AAAA,KAElE;AAAA,IACC,WAAA,IAAe,QAAA,oBACdA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACZ,QAAA,EAAA,IAAA,CAAK,QAAA,CAAU,GAAA,CAAI,CAAC,KAAA,qBACnBA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,SAAA,EAAW,EAAA;AAAA,UACT,2EAAA;AAAA,UACA,KAAA,CAAM,SACF,uCAAA,GACA;AAAA,SACN;AAAA,QAEC,QAAA,EAAA,KAAA,CAAM;AAAA,OAAA;AAAA,MAVF,KAAA,CAAM;AAAA,KAYd,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAGA,SAAS,UAAA,CAAW,EAAE,GAAA,EAAI,EAA6B;AACrD,EAAA,MAAM,SAAA,GAAkB4D,cAAuB,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAUA,gBAAwB,IAAI,CAAA;AAGtE,EAAMA,iBAAU,MAAM;AACpB,IAAA,MAAM,YAAY,SAAA,CAAU,OAAA;AAC5B,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,aAAA,CAAc,sBAAsB,CAAA;AAC/D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,OAAO,QAAA,CAAS,UAAA,GAAa,UAAU,WAAA,GAAc,CAAA,GAAI,SAAS,WAAA,GAAc,CAAA;AACtF,MAAA,SAAA,CAAU,QAAA,CAAS,EAAE,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,IACpE;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,uBACE7D,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,SAAI,GAAA,EAAK,SAAA,EAAW,WAAU,qDAAA,EAC5B,QAAA,EAAA,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAS;AACjB,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,GAAQK,UAAS,IAAA,CAAK,IAAI,KAAK,IAAA,GAAQ,IAAA;AACzD,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AAC5D,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,IAAU,IAAA,CAAK,UAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA;AACnE,MAAA,MAAM,UAAA,GAAa,eAAe,IAAA,CAAK,EAAA;AAEvC,MAAA,uBACEN,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,eAAa,QAAA,IAAY,MAAA;AAAA,UACzB,SAAS,MAAM;AACb,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,aAAA,CAAc,UAAA,GAAa,IAAA,GAAO,IAAA,CAAK,EAAE,CAAA;AAAA,YAC3C,CAAA,MAAO;AACL,cAAA,IAAA,CAAK,OAAA,IAAU;AACf,cAAA,aAAA,CAAc,IAAI,CAAA;AAAA,YACpB;AAAA,UACF,CAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,qHAAA;AAAA,YACA,WACI,oCAAA,GACA;AAAA,WACN;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,IAAA,oBAAQC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,YAClC,IAAA,CAAK,KAAA;AAAA,YACL,WAAA,oBAAeA,GAAAA,CAACiC,WAAAA,EAAA,EAAY,WAAW,EAAA,CAAG,kCAAA,EAAoC,UAAA,IAAc,YAAY,CAAA,EAAG;AAAA;AAAA,SAAA;AAAA,QApBvG,IAAA,CAAK;AAAA,OAqBZ;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IAGC,eAAe,MAAM;AACpB,MAAA,MAAM,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,UAAU,CAAA;AAChD,MAAA,IAAI,CAAC,IAAA,EAAM,QAAA,EAAU,OAAO,IAAA;AAC5B,MAAA,uBACEjC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACZ,eAAK,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,qBAClBA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AAAE,YAAA,KAAA,CAAM,OAAA,IAAU;AAAG,YAAA,aAAA,CAAc,IAAI,CAAA;AAAA,UAAE,CAAA;AAAA,UACxD,SAAA,EAAW,EAAA;AAAA,YACT,+FAAA;AAAA,YACA,KAAA,CAAM,SACF,kCAAA,GACA;AAAA,WACN;AAAA,UAEC,QAAA,EAAA,KAAA,CAAM;AAAA,SAAA;AAAA,QAVF,KAAA,CAAM;AAAA,OAYd,CAAA,EACH,CAAA;AAAA,IAEJ,CAAA;AAAG,GAAA,EACL,CAAA;AAEJ;AAmBA,IAAM,gBAAA,GAAyB4D,qBAA+B,MAAM,CAAA;AAE7D,SAAS,iBAAA,CAAkB,EAAE,KAAA,EAAO,QAAA,EAAS,EAA0D;AAC5G,EAAA,uBAAO5D,GAAAA,CAAC,gBAAA,CAAiB,UAAjB,EAA0B,KAAA,EAAO,OAAQ,QAAA,EAAS,CAAA;AAC5D;AAEO,SAAS,YAAA,GAAgC;AAC9C,EAAA,OAAa4D,kBAAW,gBAAgB,CAAA;AAC1C;AAmBO,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,QAAA,EAAU,MAAM,MAAA,EAAQ,WAAA,EAAa,OAAA,EAAS,SAAA,EAAU,EAAuB;AACpH,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,WAAW,YAAA,EAAa;AAK9B,EAAA,MAAM,EAAE,QAAQ,eAAA,EAAiB,WAAA,EAAa,sBAAqB,GAAI,kBAAA,CAAmB,QAAQ,WAAW,CAAA;AAG7G,EAAA,cAAA,CAAe,eAAe,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,IAAA,GAAQvD,SAAAA,CAAS,IAAI,KAAK,IAAA,GAAQ,IAAA;AAE/C,EAAA,MAAM,KAAA,GAAyB,CAAC,eAAA,GAAkB,MAAA,GAAU,SAAA,IAAa,QAAA;AACzE,EAAA,MAAM,cAAA,GAAkC,KAAA,KAAU,MAAA,IAAU,CAAC,uBAAuB,MAAA,GAAS,KAAA;AAE7F,EAAA,MAAM,UAAA,mBACJN,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,cAAA,KAAmB,MAAA,IAAU,mCAC5BC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,eAAA;AAAA,UACT,SAAA,EAAU,8IAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,OACnC;AAAA,MAED,IAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,CAAA,EAClD,CAAA;AAAA,sBAEFD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACxC,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,QAAA,EAAS;AAAA,OAAA,EACtE;AAAA,KAAA,EACF,CAAA;AAAA,IACC,2BAAWA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAY,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EACjD,CAAA;AAGF,EAAA,IAAI,mBAAmB,YAAA,EAAc;AACnC,IAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,QAAA,EAAA,EAAO,OAAA,EAAS,eAAA,EAAiB,SAAA,EAAU,2CAA2C,QAAA,EAAA,oBAAA,EAAqB,CAAA;AAAA,0BAC5GA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,0BACtCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAA+B,QAAA,EAAA,KAAA,EAAM;AAAA,SAAA,EACvD,CAAA;AAAA,QACC,2BAAWA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAY,QAAA,EAAA,OAAA,EAAQ;AAAA,OAAA,EACjD,CAAA;AAAA,MACC,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uCAAuC,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EAC5E,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,IAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,eAAA;AAAA,UACT,SAAA,EAAU,wGAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,YAChC,CAAA,CAAE,oBAAA,EAAsB,EAAE,QAAA,EAAU,sBAAgC;AAAA;AAAA;AAAA,OACvE;AAAA,MACC;AAAA,KAAA,EACH,CAAA;AAAA,EAEJ;AAGA,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAkB,QAAA,EAAA,UAAA,EAAW,CAAA;AACrD;AAQA,SAAS,YAAA,CAAa,EAAE,GAAA,EAAI,EAA6B;AACvD,EAAA,MAAM,OAAO,mBAAA,EAAoB;AAIjC,EAAA,SAAS,aAAa,IAAA,EAAqB;AACzC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,IAAY,EAAC;AAC/B,IAAA,OAAO,KAAK,IAAA,CAAK,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAE,CAAA,IAAK,SAAA,CAAU,IAAA,CAAK,EAAE,KAAK,CAAC,KAAK,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EAChG;AAEA,EAAA,MAAM,OAAA,mBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACZ,QAAA,EAAA,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAS;AACjB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA,GAAQK,UAAS,IAAA,CAAK,IAAI,KAAK,IAAA,GAAQ,IAAA;AACzD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,KAAK,MAAA,IAAU,IAAA,CAAK,UAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA;AACnE,IAAA,uBACEN,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAO,WAAA,GAAc,YAAA,CAAa,IAAI,CAAA,EAAG,OAAA,IAAU,GAAI,IAAA,CAAK,OAAA,IAAU;AAAA,QAC/E,SAAA,EAAW,EAAA;AAAA,UACT,qHAAA;AAAA,UACA,WACI,gCAAA,GACA;AAAA,SACN;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQC,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,UAClC,IAAA,CAAK;AAAA;AAAA,OAAA;AAAA,MAXD,IAAA,CAAK;AAAA,KAYZ;AAAA,EAEJ,CAAC,GACH,CAAA,EACF,CAAA;AAGF,EAAA,IAAI,IAAA,EAAM,OAAO,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAE3C,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAoC,QAAA,EAAA,OAAA,EAAQ,CAAA;AACpE;AAMO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,QAAA,EAAU,KAAK,QAAA,EAAU,SAAA,EAAW,YAAA,EAAc,UAAA,GAAa,IAAA,EAAM,aAAA,EAAe,UAAA,EAAY,OAAA,EAAS,WAAU,EAAoB;AACzK,EAAA,MAAM,aAAa,eAAA,EAAgB;AACnC,EAAA,MAAM,UAAU,UAAA,IAAc,UAAA;AAC9B,EAAA,MAAM,gBAAgB,OAAA,IAAW,MAAA;AAKjC,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,uBACED,IAAAA,CAAAK,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,gBAAa,GAAA,EAAU,CAAA;AAAA,MAGvB,UAAA,IAAc,YAAA,oBAAgBA,GAAAA,CAAC,qBAAmB,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,sBAChEA,GAAAA,CAAC,cAAA,EAAA,EAAe,aAAA,EAA8B,SAAA,EAAsB,WAAW,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EACnG,QAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,kBAAA,EAAoB,SAAS,CAAA,EAE9C,QAAA,EAAA;AAAA,oBAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CACb,QAAA,kBAAAD,IAAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,aAAA,IAAiB,4BAA4B,GAAG,KAAA,EAAO,aAAA,GAAgB,EAAE,MAAA,EAAQ,oBAAA,KAAyB,MAAA,EAC3H,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kFAAA,EAAoF,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACvGA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,cAAI,GAAA,CAAI,CAAC,IAAA,qBACRA,IAAC6D,QAAAA,EAAA,EAAsB,QAAT,IAAA,CAAK,EAAgB,CACpC,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,MACC,iCAAiB7D,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAW,QAAA,EAAA,aAAA,EAAc;AAAA,KAAA,EAC5D,CAAA,EACF,CAAA;AAAA,oBAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,UAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACzC,4BAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,QAAA,EAAS;AAAA,SAAA,EACtE,CAAA;AAAA,QACC;AAAA,OAAA,EACH,CAAA;AAAA,sBAGFA,GAAAA,CAAC,UAAA,EAAA,EAAW,GAAA,EAAU,CAAA;AAAA,sBACtBA,GAAAA,CAAC,cAAA,EAAA,EAAe,aAAA,EAA8B,WAC3C,QAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-CZ6X6PZT.js","sourcesContent":["import { create } from 'zustand'\n\ninterface LayoutState {\n sidebarOpen: boolean\n sidebarCollapsed: boolean\n mobileDrawerOpen: boolean\n commandPaletteOpen: boolean\n toggleSidebar: () => void\n setSidebarCollapsed: (collapsed: boolean) => void\n toggleMobileDrawer: () => void\n setCommandPaletteOpen: (open: boolean) => void\n}\n\nexport const useLayoutStore = create<LayoutState>((set) => ({\n sidebarOpen: true,\n sidebarCollapsed: false,\n mobileDrawerOpen: false,\n commandPaletteOpen: false,\n\n toggleSidebar: () =>\n set((state) => ({ sidebarOpen: !state.sidebarOpen })),\n\n setSidebarCollapsed: (collapsed) =>\n set({ sidebarCollapsed: collapsed }),\n\n toggleMobileDrawer: () =>\n set((state) => ({ mobileDrawerOpen: !state.mobileDrawerOpen })),\n\n setCommandPaletteOpen: (open) =>\n set({ commandPaletteOpen: open }),\n}))\n","import * as React from 'react'\nimport * as Tooltip from '@radix-ui/react-tooltip'\nimport {\n Home,\n Users,\n Settings,\n CreditCard,\n Bell,\n Calendar,\n Package,\n BarChart3,\n FileText,\n Mail,\n PanelLeftClose,\n PanelLeft,\n Search,\n DollarSign,\n Megaphone,\n ShoppingCart,\n Target,\n Wrench,\n ClipboardList,\n Briefcase,\n UserCog,\n BookOpen,\n MessageCircle,\n Globe,\n Percent,\n Tag,\n Camera,\n UtensilsCrossed,\n MapPin,\n Handshake,\n Contact,\n Building2,\n Filter,\n Plus,\n List,\n ChevronDown,\n Dog,\n Cat,\n PawPrint,\n Heart,\n LayoutTemplate,\n LeafyGreen,\n Apple,\n Egg,\n Wheat,\n PartyPopper,\n Radio,\n CalendarDays,\n Banknote,\n Layers,\n Music,\n Eye,\n ListMusic,\n Disc3,\n UsersRound,\n Mic,\n Zap,\n Award,\n LayoutDashboard,\n MessageSquare,\n Star,\n Workflow,\n type LucideIcon,\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { useLayoutStore } from '../stores/layout.store'\n\nexport interface NavigationItem {\n id: string\n label: string\n icon: string\n route: string\n section: 'main' | 'secondary' | 'settings'\n badge?: string | number\n permission?: { feature: string; action: 'read' | 'create' | 'edit' | 'delete' }\n children?: NavigationItem[]\n}\n\nexport interface SidebarUser {\n fullName: string\n avatarUrl?: string\n email: string\n}\n\nexport interface SidebarProps {\n navigation: NavigationItem[]\n logo?: React.ReactNode\n collapsed: boolean\n onToggle: () => void\n onNavigate?: (route: string) => void\n currentPath?: string\n user?: SidebarUser\n onSignOut?: () => void\n onProfile?: () => void\n onSettings?: () => void\n onBilling?: () => void\n userMenuExtras?: { label: string; icon?: React.ReactNode; onClick: () => void }[]\n orgSwitcher?: React.ReactNode\n topContent?: React.ReactNode\n footerContent?: React.ReactNode\n /** When true, removes all borders for a cleaner framed look */\n borderless?: boolean\n /** User menu component to render at the bottom */\n userMenuSlot?: React.ReactNode\n /** Notification slot to render at the bottom */\n notificationSlot?: React.ReactNode\n /** Unread notification count for the bell indicator */\n unreadCount?: number\n}\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n Home, Users, Settings, CreditCard, Bell, Calendar, Package, BarChart3,\n FileText, Mail, DollarSign, Megaphone, ShoppingCart, Target, Wrench,\n ClipboardList, Briefcase, UserCog, BookOpen, MessageCircle, Globe,\n Percent, Tag, Camera, UtensilsCrossed, MapPin, Handshake, Contact,\n Building2, Filter, Plus, List, Search, Dog, Cat, PawPrint, Heart, LayoutTemplate, LeafyGreen, Apple, Egg, Wheat,\n PartyPopper, Radio, CalendarDays, Banknote, Layers, Music, Eye, ListMusic, Disc3, UsersRound, Mic,\n Zap, Award, LayoutDashboard, MessageSquare, Star, Workflow,\n}\n\nexport { ICON_MAP }\n\nfunction getIcon(name: string): LucideIcon {\n return ICON_MAP[name] ?? Home\n}\n\nfunction NavItem({\n item,\n collapsed,\n isActive,\n onNavigate,\n}: {\n item: NavigationItem\n collapsed: boolean\n isActive: boolean\n onNavigate: (route: string) => void\n}) {\n const Icon = getIcon(item.icon)\n\n const content = (\n <button\n onClick={() => onNavigate(item.route)}\n className={cn(\n 'flex w-full items-center gap-3 rounded-md px-2.5 py-1.5 text-[13px] font-medium transition-colors',\n 'hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground',\n isActive\n ? 'bg-sidebar-accent font-semibold text-sidebar-accent-foreground shadow-sm'\n : 'text-sidebar-foreground/80',\n collapsed && 'justify-center px-2',\n )}\n >\n <Icon className=\"h-4 w-4 shrink-0\" />\n {!collapsed && (\n <>\n <span className=\"flex-1 truncate text-left\">{item.label}</span>\n {item.badge !== undefined && (\n <span className=\"ml-auto rounded-full bg-primary px-2 py-0.5 text-xs font-semibold text-primary-foreground\">\n {item.badge}\n </span>\n )}\n </>\n )}\n </button>\n )\n\n if (collapsed) {\n return (\n <Tooltip.Root delayDuration={0}>\n <Tooltip.Trigger asChild>{content}</Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content\n side=\"right\"\n sideOffset={8}\n className=\"fayz-glass-surface z-50 rounded-md bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md\"\n >\n {item.label}\n {item.badge !== undefined && (\n <span className=\"ml-2 rounded-full bg-primary px-1.5 py-0.5 text-xs text-primary-foreground\">\n {item.badge}\n </span>\n )}\n <Tooltip.Arrow className=\"fill-popover\" />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )\n }\n\n return content\n}\n\nfunction NavGroup({\n item,\n collapsed,\n currentPath,\n onNavigate,\n}: {\n item: NavigationItem\n collapsed: boolean\n currentPath: string\n onNavigate: (route: string) => void\n}) {\n const [open, setOpen] = React.useState(() =>\n item.children?.some((c) => currentPath === c.route || currentPath.startsWith(c.route + '/')) ?? false\n )\n const Icon = getIcon(item.icon)\n const isChildActive = item.children?.some(\n (c) => currentPath === c.route || currentPath.startsWith(c.route + '/')\n )\n\n if (collapsed) {\n return (\n <Tooltip.Root delayDuration={0}>\n <Tooltip.Trigger asChild>\n <button\n onClick={() => onNavigate(item.route)}\n className={cn(\n 'flex w-full items-center justify-center rounded-md px-2 py-2 text-sm font-medium transition-colors',\n 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n isChildActive ? 'bg-sidebar-accent text-sidebar-accent-foreground' : 'text-sidebar-muted'\n )}\n >\n <Icon className=\"h-4 w-4 shrink-0\" />\n </button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content side=\"right\" sideOffset={8} className=\"fayz-glass-surface z-50 rounded-md bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md\">\n {item.label}\n <Tooltip.Arrow className=\"fill-popover\" />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )\n }\n\n return (\n <div>\n <button\n onClick={() => setOpen(!open)}\n className={cn(\n 'flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm font-medium transition-colors',\n 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n isChildActive ? 'text-sidebar-accent-foreground' : 'text-sidebar-muted'\n )}\n >\n <Icon className=\"h-4 w-4 shrink-0\" />\n <span className=\"flex-1 truncate text-left\">{item.label}</span>\n <ChevronDown className={cn('h-3.5 w-3.5 shrink-0 transition-transform', open && 'rotate-180')} />\n </button>\n {open && (\n <div className=\"ml-4 mt-0.5 space-y-0.5 border-l border-sidebar-border/50 pl-3\">\n {item.children?.map((child) => {\n const ChildIcon = getIcon(child.icon)\n const isActive = currentPath === child.route || currentPath.startsWith(child.route + '/')\n return (\n <button\n key={child.id}\n onClick={() => onNavigate(child.route)}\n className={cn(\n 'flex w-full items-center gap-2.5 rounded-md px-2 py-1.5 text-sm transition-colors',\n isActive\n ? 'font-medium text-sidebar-accent-foreground'\n : 'text-sidebar-muted hover:text-sidebar-accent-foreground'\n )}\n >\n <ChildIcon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{child.label}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\nexport function Sidebar({\n navigation,\n logo,\n collapsed,\n onToggle,\n onNavigate,\n currentPath: currentPathProp = '/',\n user: _user,\n orgSwitcher,\n topContent,\n footerContent,\n borderless,\n userMenuSlot,\n notificationSlot,\n unreadCount = 0,\n}: SidebarProps) {\n const currentPath = currentPathProp\n const setCommandPaletteOpen = useLayoutStore((s) => s.setCommandPaletteOpen)\n\n const mainItems = navigation.filter((item) => item.section === 'main')\n const secondaryItems = navigation.filter((item) => item.section === 'secondary')\n const settingsItems = navigation.filter((item) => item.section === 'settings')\n\n const handleNavigate = (route: string) => {\n onNavigate?.(route)\n }\n\n return (\n <Tooltip.Provider>\n <aside\n data-print=\"hide\"\n className={cn(\n 'flex h-full flex-col bg-sidebar text-sidebar-foreground transition-all duration-200',\n !borderless && 'border-r border-sidebar-border',\n collapsed ? 'w-16' : 'w-64'\n )}\n >\n {/* Logo + Collapse Toggle */}\n <div\n className={cn(\n 'flex h-14 items-center justify-between px-4',\n !borderless && 'border-b border-sidebar-border',\n collapsed && 'justify-center px-2'\n )}\n >\n {!collapsed && (\n <>\n {logo ?? <span className=\"text-lg font-bold\">App</span>}\n <button\n onClick={onToggle}\n className=\"ml-auto rounded-md p-1.5 text-sidebar-muted transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n aria-label=\"Collapse sidebar\"\n >\n <PanelLeftClose className=\"h-4 w-4\" />\n </button>\n </>\n )}\n {collapsed && (\n <button\n onClick={onToggle}\n className=\"rounded-md p-1.5 text-sidebar-muted transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n aria-label=\"Expand sidebar\"\n >\n <PanelLeft className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n\n {/* Main Navigation */}\n <nav className=\"flex-1 space-y-1 overflow-y-auto p-2\">\n {topContent && <div className=\"mb-4 space-y-2\">{topContent}</div>}\n\n {mainItems.length > 0 && (\n <div className=\"space-y-1\">\n {mainItems.map((item) =>\n item.children && item.children.length > 0 ? (\n <NavGroup key={item.id} item={item} collapsed={collapsed} currentPath={currentPath} onNavigate={handleNavigate} />\n ) : (\n <NavItem\n key={item.id}\n item={item}\n collapsed={collapsed}\n isActive={currentPath === item.route || currentPath.startsWith(item.route + '/')}\n onNavigate={handleNavigate}\n />\n )\n )}\n </div>\n )}\n\n {secondaryItems.length > 0 && (\n <div className=\"mt-6 space-y-1\">\n {secondaryItems.map((item) =>\n item.children && item.children.length > 0 ? (\n <NavGroup key={item.id} item={item} collapsed={collapsed} currentPath={currentPath} onNavigate={handleNavigate} />\n ) : (\n <NavItem\n key={item.id}\n item={item}\n collapsed={collapsed}\n isActive={currentPath === item.route || currentPath.startsWith(item.route + '/')}\n onNavigate={handleNavigate}\n />\n )\n )}\n </div>\n )}\n </nav>\n\n {/* Settings nav items */}\n {settingsItems.length > 0 && (\n <div className={cn('p-2 space-y-1', !borderless && 'border-t border-sidebar-border')}>\n {settingsItems.map((item) => (\n <NavItem\n key={item.id}\n item={item}\n collapsed={collapsed}\n isActive={currentPath === item.route || currentPath.startsWith(item.route + '/')}\n onNavigate={handleNavigate}\n />\n ))}\n </div>\n )}\n\n {footerContent && (\n <div className={cn('p-2', !borderless && 'border-t border-sidebar-border')}>\n <div className=\"space-y-2\">{footerContent}</div>\n </div>\n )}\n\n {/* Org Switcher — above user row */}\n {orgSwitcher && React.isValidElement(orgSwitcher)\n ? React.cloneElement(orgSwitcher as React.ReactElement<any>, { collapsed })\n : orgSwitcher}\n\n {/* Bottom: User row with inline action icons */}\n <div className={cn('p-2', !borderless && 'border-t border-sidebar-border')}>\n <div className={cn(\n 'flex items-center rounded-md',\n collapsed ? 'flex-col gap-1' : 'gap-1 px-1'\n )}>\n {/* User Menu slot */}\n {userMenuSlot}\n\n {/* Spacer pushes icons to right when expanded */}\n {!collapsed && <div className=\"flex-1\" />}\n\n {/* Search — opens command palette */}\n <button\n onClick={() => setCommandPaletteOpen(true)}\n className=\"inline-flex shrink-0 items-center justify-center rounded-md p-2 text-sidebar-muted transition-colors hover:bg-sidebar-accent/50 hover:text-sidebar-accent-foreground\"\n aria-label=\"Search\"\n >\n <Search className=\"h-4 w-4\" />\n </button>\n\n {/* Notification slot or default bell */}\n {notificationSlot ?? (\n <button\n className=\"relative inline-flex shrink-0 items-center justify-center rounded-md p-2 text-sidebar-muted transition-colors hover:bg-sidebar-accent/50 hover:text-sidebar-accent-foreground\"\n aria-label={unreadCount > 0 ? `${unreadCount} unread notifications` : 'Notifications'}\n >\n <Bell className=\"h-4 w-4\" />\n {unreadCount > 0 && (\n <span className=\"absolute right-1 top-1 h-2 w-2 rounded-full bg-destructive\" />\n )}\n </button>\n )}\n </div>\n </div>\n </aside>\n </Tooltip.Provider>\n )\n}\n","import * as React from 'react'\nimport * as Popover from '@radix-ui/react-popover'\nimport {\n Menu,\n Search,\n ChevronDown,\n Filter,\n Home,\n Users,\n Settings,\n CreditCard,\n Bell,\n Calendar,\n Package,\n BarChart3,\n FileText,\n Mail,\n DollarSign,\n Megaphone,\n ShoppingCart,\n Target,\n Wrench,\n ClipboardList,\n Briefcase,\n UserCog,\n BookOpen,\n MessageCircle,\n Globe,\n Percent,\n Tag,\n Camera,\n UtensilsCrossed,\n MapPin,\n Handshake,\n Contact,\n Building2,\n Plus,\n List,\n Dog,\n Cat,\n PawPrint,\n Heart,\n LayoutTemplate,\n LeafyGreen,\n Apple,\n Egg,\n Wheat,\n ArrowDownCircle,\n ArrowUpCircle,\n Landmark,\n Receipt,\n TrendingUp,\n CircleDollarSign,\n Wallet,\n Clock,\n AlertTriangle,\n Sparkles,\n Warehouse,\n Ruler,\n ArrowUpRight,\n ArrowDownRight,\n ArrowLeftRight,\n Plug,\n SlidersHorizontal,\n TableProperties,\n UserPlus,\n TreePalm,\n PartyPopper,\n Radio,\n CalendarDays,\n Banknote,\n Layers,\n Music,\n Eye,\n ListMusic,\n Disc3,\n UsersRound,\n Mic,\n type LucideIcon,\n} from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { useLayoutStore } from '../stores/layout.store'\n\nexport interface NavigationItem {\n id: string\n label: string\n icon: string\n route: string\n section: 'main' | 'secondary' | 'settings'\n badge?: string | number\n children?: NavigationItem[]\n permission?: { feature: string; action: 'read' | 'create' | 'edit' | 'delete' }\n}\n\nexport interface TopbarProps {\n navigation: NavigationItem[]\n logo?: React.ReactNode\n user?: { fullName: string; avatarUrl?: string; email: string }\n onMenuClick?: () => void\n leftContent?: React.ReactNode\n rightContent?: React.ReactNode\n currentPath?: string\n onNavigate?: (route: string) => void\n searchPlaceholder?: string\n onSignOut?: () => void\n onProfile?: () => void\n onSettings?: () => void\n onBilling?: () => void\n userMenuExtras?: { label: string; icon?: React.ReactNode; onClick: () => void }[]\n}\n\nfunction TopbarUserMenu({\n user,\n onSignOut,\n onProfile,\n onSettings,\n onBilling,\n userMenuExtras,\n}: Pick<TopbarProps, 'user' | 'onSignOut' | 'onProfile' | 'onSettings' | 'onBilling' | 'userMenuExtras'>) {\n const [open, setOpen] = React.useState(false)\n if (!user) return null\n const initial = (user.fullName?.trim()?.[0] ?? user.email?.[0] ?? '?').toUpperCase()\n const item = (label: string, onClick?: () => void, Icon?: LucideIcon) =>\n onClick ? (\n <button\n key={label}\n onClick={() => { setOpen(false); onClick() }}\n className=\"flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-sm text-popover-foreground transition-colors hover:bg-muted/70\"\n >\n {Icon && <Icon className=\"h-4 w-4 text-muted-foreground\" />}\n <span>{label}</span>\n </button>\n ) : null\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger asChild>\n <button\n aria-label=\"User menu\"\n className=\"ml-1 flex h-9 w-9 items-center justify-center overflow-hidden rounded-full bg-primary text-xs font-semibold text-primary-foreground ring-2 ring-transparent transition hover:ring-sidebar-border\"\n >\n {user.avatarUrl ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={user.avatarUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n initial\n )}\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n align=\"end\"\n sideOffset={8}\n className=\"fayz-glass-surface z-50 min-w-[220px] rounded-xl border border-border bg-popover p-1.5 shadow-lg animate-in fade-in-0 zoom-in-95\"\n >\n <div className=\"border-b border-border px-3 py-2\">\n <p className=\"truncate text-sm font-medium text-foreground\">{user.fullName || user.email}</p>\n <p className=\"truncate text-xs text-muted-foreground\">{user.email}</p>\n </div>\n <div className=\"mt-1 space-y-0.5\">\n {item('Perfil', onProfile, UserCog)}\n {item('Configurações', onSettings, Settings)}\n {item('Cobrança', onBilling, CreditCard)}\n {userMenuExtras?.map((e) => item(e.label, e.onClick))}\n {onSignOut && (\n <>\n <div className=\"my-1 border-t border-border\" />\n {item('Sair', onSignOut)}\n </>\n )}\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\nexport const ICON_MAP: Record<string, LucideIcon> = {\n Home, Users, Settings, CreditCard, Bell, Calendar, Package, BarChart3,\n FileText, Mail, DollarSign, Megaphone, ShoppingCart, Target, Wrench,\n ClipboardList, Briefcase, UserCog, BookOpen, MessageCircle, Globe,\n Percent, Tag, Camera, UtensilsCrossed, Search, MapPin, Handshake,\n Contact, Building2, ChevronDown, Filter, Plus, List, Dog, Cat, PawPrint, Heart, LayoutTemplate, LeafyGreen, Apple, Egg, Wheat,\n ArrowDownCircle, ArrowUpCircle, ArrowLeftRight, Plug, SlidersHorizontal, TableProperties, Landmark, Receipt, TrendingUp, CircleDollarSign, Clock, AlertTriangle, Sparkles, Wallet, Warehouse, Ruler, ArrowUpRight, ArrowDownRight, UserPlus, TreePalm,\n PartyPopper, Radio, CalendarDays, Banknote, Layers, Music, Eye, ListMusic, Disc3, UsersRound, Mic,\n}\n\nfunction getIcon(name: string): LucideIcon {\n return ICON_MAP[name] ?? Home\n}\n\nfunction NavDropdown({ item, currentPath, onNavigate }: {\n item: NavigationItem\n currentPath: string\n onNavigate: (route: string) => void\n}) {\n const [open, setOpen] = React.useState(false)\n const Icon = getIcon(item.icon)\n const isChildActive = item.children?.some(\n (child) => currentPath === child.route || currentPath.startsWith(child.route + '/')\n )\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger asChild>\n <button\n data-nav-active={isChildActive || undefined}\n className={cn(\n 'flex items-center gap-1.5 whitespace-nowrap border-b-2 px-3 py-2 text-sm transition-colors',\n isChildActive\n ? 'border-sidebar-accent-foreground font-semibold text-sidebar-foreground'\n : 'border-transparent text-sidebar-muted hover:text-sidebar-foreground'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n <span>{item.label}</span>\n <ChevronDown className={cn('h-3 w-3 transition-transform', open && 'rotate-180')} />\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n align=\"start\"\n sideOffset={4}\n className=\"fayz-glass-surface z-50 min-w-[200px] rounded-xl border border-border bg-popover p-1.5 shadow-lg animate-in fade-in-0 zoom-in-95\"\n >\n {item.children?.map((child) => {\n const ChildIcon = getIcon(child.icon)\n const isActive = currentPath === child.route || currentPath.startsWith(child.route + '/')\n return (\n <button\n key={child.id}\n onClick={() => {\n onNavigate(child.route)\n setOpen(false)\n }}\n className={cn(\n 'flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-sm transition-colors',\n isActive\n ? 'bg-muted font-medium text-foreground'\n : 'text-popover-foreground hover:bg-muted/70'\n )}\n >\n <ChildIcon className=\"h-4 w-4 text-muted-foreground\" />\n <span>{child.label}</span>\n </button>\n )\n })}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\nexport function Topbar({\n navigation,\n logo,\n user,\n onMenuClick,\n leftContent,\n rightContent,\n currentPath = '/',\n onNavigate,\n searchPlaceholder = 'Search...',\n onSignOut,\n onProfile,\n onSettings,\n onBilling,\n userMenuExtras,\n}: TopbarProps) {\n const setCommandPaletteOpen = useLayoutStore((s) => s.setCommandPaletteOpen)\n\n const mainNav = navigation.filter((item) => item.section === 'main')\n const secondaryNav = navigation.filter((item) => item.section === 'secondary')\n const allNav = [...mainNav, ...secondaryNav]\n\n const handleNavigate = (route: string) => {\n onNavigate?.(route)\n }\n\n return (\n <header data-print=\"hide\" className=\"sticky top-0 z-50 w-full shrink-0\">\n {/* Row 1: Logo + Search + Actions */}\n <div className=\"border-b border-sidebar-border bg-sidebar text-sidebar-foreground\">\n <div className=\"flex h-14 w-full items-center justify-between px-4 md:px-6\">\n {/* Left: Mobile menu + Logo */}\n <div className=\"flex items-center gap-3\">\n <button\n onClick={onMenuClick}\n className=\"inline-flex items-center justify-center rounded-md p-2 text-sidebar-foreground/70 hover:bg-sidebar/30 hover:text-sidebar-foreground md:hidden\"\n aria-label=\"Open menu\"\n >\n <Menu className=\"h-5 w-5\" />\n </button>\n <div className=\"hidden shrink-0 items-center md:flex\">\n {logo ?? <span className=\"text-lg font-bold\">App</span>}\n </div>\n </div>\n\n {/* Center: Search (desktop only) */}\n <div className=\"mx-8 hidden max-w-sm flex-1 md:flex\">\n <button\n onClick={() => setCommandPaletteOpen(true)}\n className=\"relative flex h-8 w-full items-center rounded-md border border-sidebar-border bg-sidebar-accent px-3 pl-8 text-sm text-sidebar-muted shadow-sm transition-colors hover:bg-card\"\n >\n <Search className=\"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-sidebar-muted\" />\n <span className=\"text-xs\">{searchPlaceholder}</span>\n <kbd className=\"ml-auto hidden rounded border border-sidebar-border bg-sidebar-accent px-1.5 py-0.5 text-[10px] font-medium text-sidebar-muted sm:inline-block\">\n ⌘K\n </kbd>\n </button>\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-1\">\n {leftContent}\n {rightContent}\n <TopbarUserMenu\n user={user}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n userMenuExtras={userMenuExtras}\n />\n </div>\n </div>\n </div>\n\n {/* Row 2: Navigation — desktop only */}\n <div className=\"hidden md:block bg-sidebar\">\n <div className=\"flex h-11 w-full items-center px-4 md:px-6\">\n <nav ref={(el) => {\n if (!el) return\n const active = el.querySelector('[data-nav-active=\"true\"]') as HTMLElement\n if (active) {\n const left = active.offsetLeft - el.offsetWidth / 2 + active.offsetWidth / 2\n el.scrollTo({ left: Math.max(0, left), behavior: 'smooth' })\n }\n }} className=\"flex items-center gap-0.5 overflow-x-auto scrollbar-hide\">\n {allNav.map((item) => {\n if (item.children && item.children.length > 0) {\n return (\n <NavDropdown\n key={item.id}\n item={item}\n currentPath={currentPath}\n onNavigate={handleNavigate}\n />\n )\n }\n\n const Icon = getIcon(item.icon)\n const isActive =\n item.route === '/'\n ? currentPath === '/'\n : currentPath === item.route || currentPath.startsWith(item.route + '/')\n\n return (\n <button\n key={item.id}\n data-nav-active={isActive || undefined}\n onClick={() => handleNavigate(item.route)}\n className={cn(\n 'flex items-center gap-1.5 whitespace-nowrap border-b-2 px-3 py-2 text-sm transition-colors',\n isActive\n ? 'border-primary font-semibold text-sidebar-foreground'\n : 'border-transparent text-sidebar-muted hover:text-sidebar-foreground'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n <span>{item.label}</span>\n {item.badge !== undefined && (\n <span className=\"rounded-full bg-primary px-1.5 py-0.5 text-[10px] font-semibold text-primary-foreground\">\n {item.badge}\n </span>\n )}\n </button>\n )\n })}\n </nav>\n </div>\n </div>\n </header>\n )\n}\n","import * as React from 'react'\nimport { Menu } from 'lucide-react'\nimport { Sidebar, type NavigationItem, type SidebarUser, type SidebarProps } from './Sidebar'\nimport { Topbar } from './Topbar'\nimport { SaveBar, SaveBarProvider } from './SaveBar'\nimport { useLayoutStore } from '../stores/layout.store'\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// Module header slot — the page top-bar exposes a DOM node that module pages\n// (ModulePage 'tabs' variant) portal their title + sub-nav into, so the module\n// header lives in the shell's top-of-page container (GoHighLevel style).\n// ---------------------------------------------------------------------------\n\nconst ModuleHeaderSlotContext = React.createContext<HTMLElement | null>(null)\n\nexport function useModuleHeaderSlot(): HTMLElement | null {\n return React.useContext(ModuleHeaderSlotContext)\n}\n\n// Right-aligned slot for a page's primary action buttons (e.g. \"New campaign\").\nconst ModuleHeaderActionsSlotContext = React.createContext<HTMLElement | null>(null)\n\nexport function useModuleHeaderActionsSlot(): HTMLElement | null {\n return React.useContext(ModuleHeaderActionsSlotContext)\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AppShellUser {\n fullName: string\n avatarUrl?: string\n email: string\n}\n\nexport interface AppShellProps {\n /** Layout variant */\n variant: 'sidebar' | 'topbar' | 'minimal'\n /** Wrap the main content in an inset framed card. The sidebar is always\n * flush/full-height (GoHighLevel style). */\n contentFrame?: boolean\n navigation?: NavigationItem[]\n logo?: React.ReactNode\n user?: AppShellUser\n children?: React.ReactNode\n onNavigate?: (route: string) => void\n onSignOut?: () => void\n onProfile?: () => void\n onSettings?: () => void\n onBilling?: () => void\n pageTitle?: string\n currentPath?: string\n userMenuExtras?: { label: string; icon?: React.ReactNode; onClick: () => void }[]\n orgSwitcher?: React.ReactNode\n topbarStart?: React.ReactNode\n topbarEnd?: React.ReactNode\n sidebarTopContent?: React.ReactNode\n sidebarFooterContent?: React.ReactNode\n bottomNav?: Array<{ label: string; icon: string; route: string }>\n /** Rendered in sidebar bottom user slot */\n userMenuSlot?: React.ReactNode\n /** Rendered in sidebar bottom notification slot */\n notificationSlot?: React.ReactNode\n /** Unread notification count */\n unreadCount?: number\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar layout\n// ---------------------------------------------------------------------------\n\nfunction SidebarLayout({\n navigation = [],\n logo,\n user,\n children,\n onNavigate,\n onSignOut,\n onProfile,\n onSettings,\n onBilling,\n userMenuExtras: _userMenuExtras,\n orgSwitcher,\n sidebarTopContent,\n sidebarFooterContent,\n frame,\n currentPath,\n pageTitle,\n topbarStart,\n topbarEnd,\n userMenuSlot,\n notificationSlot,\n unreadCount = 0,\n}: {\n navigation?: NavigationItem[]\n logo?: React.ReactNode\n user?: AppShellUser\n children?: React.ReactNode\n onNavigate?: (route: string) => void\n onSignOut?: () => void\n onProfile?: () => void\n onSettings?: () => void\n onBilling?: () => void\n userMenuExtras?: AppShellProps['userMenuExtras']\n orgSwitcher?: React.ReactNode\n sidebarTopContent?: React.ReactNode\n sidebarFooterContent?: React.ReactNode\n frame?: boolean\n currentPath?: string\n pageTitle?: string\n topbarStart?: React.ReactNode\n topbarEnd?: React.ReactNode\n userMenuSlot?: React.ReactNode\n notificationSlot?: React.ReactNode\n unreadCount?: number\n}) {\n const sidebarCollapsed = useLayoutStore((s) => s.sidebarCollapsed)\n const setSidebarCollapsed = useLayoutStore((s) => s.setSidebarCollapsed)\n const [mobileMenuOpen, setMobileMenuOpen] = React.useState(false)\n const [headerSlot, setHeaderSlot] = React.useState<HTMLElement | null>(null)\n const [actionsSlot, setActionsSlot] = React.useState<HTMLElement | null>(null)\n\n return (\n <SaveBarProvider>\n <ModuleHeaderSlotContext.Provider value={headerSlot}>\n <ModuleHeaderActionsSlotContext.Provider value={actionsSlot}>\n <div className=\"flex h-screen overflow-hidden bg-background\">\n {/* Desktop Sidebar — always flush / full-height (GoHighLevel style) */}\n <div className=\"hidden md:flex\">\n <Sidebar\n navigation={navigation}\n logo={logo}\n collapsed={sidebarCollapsed}\n onToggle={() => setSidebarCollapsed(!sidebarCollapsed)}\n onNavigate={onNavigate}\n currentPath={currentPath}\n user={user}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n orgSwitcher={orgSwitcher}\n topContent={sidebarTopContent}\n footerContent={sidebarFooterContent}\n borderless={false}\n userMenuSlot={userMenuSlot}\n notificationSlot={notificationSlot}\n unreadCount={unreadCount}\n />\n </div>\n\n {/* Main content — optionally wrapped in an inset framed card.\n The inset/rounding is suppressed on mobile so the content stays\n edge-to-edge (the framed card only reads well on larger screens). */}\n <div className={cn(\n 'relative flex flex-1 flex-col overflow-hidden',\n frame && 'md:m-2 md:rounded-xl md:border md:border-border md:bg-card'\n )}>\n {/* Top bar — mobile hamburger + module header slot (title + sub-nav) + actions */}\n <div className=\"flex min-h-14 shrink-0 items-center justify-between gap-3 border-b border-border bg-card px-4 py-2\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <button\n onClick={() => setMobileMenuOpen(true)}\n className=\"inline-flex items-center justify-center rounded-md p-2 text-muted-foreground hover:bg-accent md:hidden\"\n aria-label=\"Open menu\"\n >\n <Menu className=\"h-5 w-5\" />\n </button>\n {pageTitle && <h2 className=\"font-semibold text-lg\">{pageTitle}</h2>}\n {topbarStart}\n {/* Module pages (tabs variant) portal their sub-nav here */}\n <div ref={setHeaderSlot} className=\"flex min-w-0 flex-1 items-center\" />\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {/* Pages portal their primary action buttons here */}\n <div ref={setActionsSlot} className=\"flex items-center gap-2\" />\n {topbarEnd}\n </div>\n </div>\n\n {/* Page content */}\n <main className=\"flex-1 overflow-y-auto\">\n {children}\n </main>\n\n {/* App-wide floating SaveBar (spans the content column, not the sidebar) */}\n <SaveBar />\n </div>\n\n {/* Mobile drawer — animated, owns its own close transition. */}\n {mobileMenuOpen && (\n <MobileOverlay\n navigation={navigation}\n logo={logo}\n user={user}\n currentPath={currentPath}\n onNavigate={onNavigate}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n orgSwitcher={orgSwitcher}\n topContent={sidebarTopContent}\n footerContent={sidebarFooterContent}\n userMenuSlot={userMenuSlot}\n notificationSlot={notificationSlot}\n unreadCount={unreadCount}\n onClose={() => setMobileMenuOpen(false)}\n />\n )}\n </div>\n </ModuleHeaderActionsSlotContext.Provider>\n </ModuleHeaderSlotContext.Provider>\n </SaveBarProvider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Topbar layout\n// ---------------------------------------------------------------------------\n\nfunction TopbarLayout({\n navigation = [],\n logo,\n user,\n children,\n onNavigate,\n onSignOut,\n onProfile,\n onSettings,\n onBilling,\n userMenuExtras,\n frame,\n currentPath,\n topbarStart,\n topbarEnd,\n}: {\n navigation?: NavigationItem[]\n logo?: React.ReactNode\n user?: AppShellUser\n children?: React.ReactNode\n onNavigate?: (route: string) => void\n onSignOut?: () => void\n onProfile?: () => void\n onSettings?: () => void\n onBilling?: () => void\n userMenuExtras?: AppShellProps['userMenuExtras']\n frame?: boolean\n currentPath?: string\n topbarStart?: React.ReactNode\n topbarEnd?: React.ReactNode\n}) {\n const [mobileMenuOpen, setMobileMenuOpen] = React.useState(false)\n\n // Topbar is full-bleed (edge to edge); only the content area gets the frame.\n return (\n <SaveBarProvider>\n <div className=\"relative flex h-screen flex-col overflow-hidden bg-background\">\n <Topbar\n navigation={navigation}\n logo={logo}\n user={user}\n currentPath={currentPath}\n onNavigate={onNavigate}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n userMenuExtras={userMenuExtras}\n leftContent={topbarStart}\n rightContent={topbarEnd}\n onMenuClick={() => setMobileMenuOpen(true)}\n />\n {/* Frame inset/border only from md up, so mobile stays edge-to-edge. */}\n <main className={cn('flex-1 overflow-y-auto', frame && 'md:p-2')}>\n <div className={cn('min-h-full', frame && 'md:rounded-xl md:border md:border-border md:bg-card')}>\n {children}\n </div>\n </main>\n\n {/* App-wide floating SaveBar */}\n <SaveBar />\n\n {/* Mobile drawer — topbar has no persistent sidebar, so the burger opens\n the same animated nav drawer used by the sidebar layout. */}\n {mobileMenuOpen && (\n <MobileOverlay\n navigation={navigation}\n logo={logo}\n user={user}\n currentPath={currentPath}\n onNavigate={onNavigate}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n userMenuSlot={user ? <DrawerUserRow user={user} /> : undefined}\n onClose={() => setMobileMenuOpen(false)}\n />\n )}\n </div>\n </SaveBarProvider>\n )\n}\n\n// Compact user identity for the mobile drawer's bottom row.\nfunction DrawerUserRow({ user }: { user: AppShellUser }) {\n const label = user.fullName || user.email\n return (\n <div className=\"flex min-w-0 items-center gap-2 px-1\">\n {user.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"h-7 w-7 shrink-0 rounded-full object-cover\" />\n ) : (\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-primary text-xs font-semibold text-primary-foreground\">\n {(label || '?').charAt(0).toUpperCase()}\n </span>\n )}\n <span className=\"truncate text-sm font-medium text-sidebar-foreground\">{label}</span>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Minimal layout\n// ---------------------------------------------------------------------------\n\nfunction MinimalLayout({\n logo,\n user: _user,\n children,\n headerEnd,\n}: {\n logo?: React.ReactNode\n user?: AppShellUser\n children?: React.ReactNode\n headerEnd?: React.ReactNode\n}) {\n return (\n <div className=\"flex h-screen flex-col\">\n <header className=\"flex h-14 shrink-0 items-center justify-between border-b border-border bg-card px-4 md:px-6\">\n <div className=\"flex items-center gap-3\">\n {logo ?? <span className=\"text-lg font-bold\">App</span>}\n </div>\n {headerEnd && <div className=\"flex items-center gap-2\">{headerEnd}</div>}\n </header>\n <main className=\"flex-1 overflow-y-auto\">\n {children}\n </main>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Mobile overlay drawer\n// ---------------------------------------------------------------------------\n\ntype MobileOverlayProps = Omit<SidebarProps, 'collapsed' | 'onToggle'> & {\n onClose: () => void\n}\n\nfunction MobileOverlay({ onClose, onNavigate, ...sidebarProps }: MobileOverlayProps) {\n // Mount hidden, then flip to visible on the next frame so the CSS transition\n // plays on open. On dismiss we play the exit transition first, then unmount.\n const [visible, setVisible] = React.useState(false)\n\n React.useEffect(() => {\n const id = requestAnimationFrame(() => setVisible(true))\n return () => cancelAnimationFrame(id)\n }, [])\n\n const close = React.useCallback(() => {\n setVisible(false)\n window.setTimeout(onClose, 250)\n }, [onClose])\n\n // Lock body scroll while the drawer is open.\n React.useEffect(() => {\n const previous = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = previous\n }\n }, [])\n\n // Dismiss on Escape.\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [close])\n\n return (\n <div className=\"fixed inset-0 z-[60] md:hidden\">\n {/* Backdrop — fades in/out */}\n <div\n className={cn(\n 'absolute inset-0 bg-black/50 transition-opacity duration-300 ease-out',\n visible ? 'opacity-100' : 'opacity-0',\n )}\n onClick={close}\n />\n {/* Drawer — slides in from the left, reusing the real Sidebar for full\n design parity (icons, active state, org switcher, bottom user row). */}\n <div\n className={cn(\n 'absolute inset-y-0 left-0 shadow-2xl transition-transform duration-300 ease-out will-change-transform',\n visible ? 'translate-x-0' : '-translate-x-full',\n )}\n >\n <Sidebar\n {...sidebarProps}\n collapsed={false}\n onToggle={close}\n borderless\n onNavigate={(route) => {\n onNavigate?.(route)\n close()\n }}\n />\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// AppShell — main entry point\n// ---------------------------------------------------------------------------\n\nexport function AppShell({\n variant,\n contentFrame,\n navigation = [],\n logo,\n user,\n children,\n onNavigate,\n onSignOut,\n onProfile,\n onSettings,\n onBilling,\n pageTitle,\n currentPath,\n userMenuExtras,\n orgSwitcher,\n topbarStart,\n topbarEnd,\n sidebarTopContent,\n sidebarFooterContent,\n userMenuSlot,\n notificationSlot,\n unreadCount = 0,\n}: AppShellProps) {\n switch (variant) {\n case 'sidebar':\n return (\n <SidebarLayout\n navigation={navigation}\n logo={logo}\n user={user}\n onNavigate={onNavigate}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n userMenuExtras={userMenuExtras}\n orgSwitcher={orgSwitcher}\n sidebarTopContent={sidebarTopContent}\n sidebarFooterContent={sidebarFooterContent}\n frame={contentFrame}\n currentPath={currentPath}\n pageTitle={pageTitle}\n topbarStart={topbarStart}\n topbarEnd={topbarEnd}\n userMenuSlot={userMenuSlot}\n notificationSlot={notificationSlot}\n unreadCount={unreadCount}\n >\n {children}\n </SidebarLayout>\n )\n\n case 'topbar':\n return (\n <TopbarLayout\n navigation={navigation}\n logo={logo}\n user={user}\n onNavigate={onNavigate}\n onSignOut={onSignOut}\n onProfile={onProfile}\n onSettings={onSettings}\n onBilling={onBilling}\n userMenuExtras={userMenuExtras}\n frame={contentFrame}\n currentPath={currentPath}\n topbarStart={topbarStart}\n topbarEnd={topbarEnd}\n >\n {children}\n </TopbarLayout>\n )\n\n case 'minimal':\n return (\n <MinimalLayout logo={logo} user={user} headerEnd={topbarEnd}>\n {children}\n </MinimalLayout>\n )\n\n default: {\n const _exhaustive: never = variant\n return null\n }\n }\n}\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// PageTransition — the single, SDK-owned animation applied to every nested\n// navigation (route changes in the shell + module-internal view changes).\n// Plugins never implement transitions themselves; they render content and the\n// shell/ModulePage wrap it in <PageTransition>. The style is provided app-wide\n// via NavTransitionProvider so different products/repos can ship a different\n// feel (slide | fade | none | future custom) without touching plugins.\n// ---------------------------------------------------------------------------\n\nexport type NavTransition = 'slide' | 'fade' | 'none'\n\nconst NavTransitionContext = React.createContext<NavTransition>('slide')\n\nexport function NavTransitionProvider({ value, children }: { value: NavTransition; children: React.ReactNode }) {\n return <NavTransitionContext.Provider value={value}>{children}</NavTransitionContext.Provider>\n}\n\nexport function useNavTransition(): NavTransition {\n return React.useContext(NavTransitionContext)\n}\n\nfunction resolveTransitionClass(transition: NavTransition, direction?: 'forward' | 'back'): string {\n if (transition === 'none') return ''\n if (transition === 'fade') return 'saas-page-enter'\n // slide (default) — direction-aware, falls back to a plain enter.\n if (direction === 'back') return 'saas-nav-back'\n if (direction === 'forward') return 'saas-nav-forward'\n return 'saas-page-enter'\n}\n\n/**\n * Wraps content and re-fires the active transition whenever `transitionKey`\n * changes (the key swap forces the node to remount, restarting the CSS\n * animation). Direction is optional and only used by the 'slide' transition.\n */\nexport function PageTransition({\n transitionKey,\n direction,\n className,\n children,\n}: {\n transitionKey: string | number\n direction?: 'forward' | 'back'\n className?: string\n children: React.ReactNode\n}) {\n const transition = useNavTransition()\n const animClass = resolveTransitionClass(transition, direction)\n return (\n <div key={transitionKey} className={cn(animClass, className)}>\n {children}\n </div>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { ChevronDown, ChevronRight, ChevronLeft } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { cn } from '../utils/cn'\nimport { ICON_MAP } from './Topbar'\nimport { useModuleHeaderSlot, useModuleHeaderActionsSlot } from './AppShell'\nimport { PageTransition } from './PageTransition'\nimport { useBackHandler } from './SaveBar'\nimport { useCrossModuleBack } from './useCrossModuleBack'\n\n// ---------------------------------------------------------------------------\n// PageHeaderActions — portals a page's primary action button(s) into the shell\n// top-bar's right-aligned actions slot. Falls back to a right-aligned inline row\n// when there's no slot (e.g. topbar layout). Any page can use it:\n// <PageHeaderActions><Button>New campaign</Button></PageHeaderActions>\n// ---------------------------------------------------------------------------\n\nexport function PageHeaderActions({ children }: { children: React.ReactNode }) {\n const slot = useModuleHeaderActionsSlot()\n if (slot) return createPortal(children, slot)\n return <div className=\"mb-4 flex items-center justify-end gap-2\">{children}</div>\n}\n\nexport interface ModuleNavItem {\n id: string\n label: string\n icon?: string\n active?: boolean\n onClick?: () => void\n children?: { id: string; label: string; active?: boolean; onClick?: () => void }[]\n}\n\nexport interface ModulePageProps {\n title: string\n subtitle?: string\n nav: ModuleNavItem[]\n children: React.ReactNode\n className?: string\n /** Optional action element rendered next to the title (e.g. settings gear) */\n headerAction?: React.ReactNode\n /** Show the title/subtitle header. Default: true */\n showHeader?: boolean\n /** Optional content pinned to the bottom of the sidebar (e.g. \"Powered by X\") */\n sidebarFooter?: React.ReactNode\n /** How the module-internal nav renders. Falls back to the ModuleLayout context\n * (set by the app shell from its layout), then 'rail'. */\n navVariant?: ModuleNavVariant\n /** Active sub-view id — drives the SDK page transition when it changes.\n * Plugins pass their `useModuleNavigation().view`; they no longer animate themselves. */\n viewKey?: string\n /** Navigation direction for the transition (from `useModuleNavigation`). */\n direction?: 'forward' | 'back'\n}\n\n// ---------------------------------------------------------------------------\n// ModuleLayout context — lets the app shell decide how every module's internal\n// navigation renders ('rail' for topbar products, 'tabs' for sidebar/GHL-style\n// products), so plugins stay agnostic and products feel distinct.\n// ---------------------------------------------------------------------------\n\nexport type ModuleNavVariant = 'rail' | 'tabs'\n\nconst ModuleLayoutContext = React.createContext<ModuleNavVariant>('rail')\n\nexport function ModuleLayoutProvider({ variant, children }: { variant: ModuleNavVariant; children: React.ReactNode }) {\n return <ModuleLayoutContext.Provider value={variant}>{children}</ModuleLayoutContext.Provider>\n}\n\nexport function useModuleLayout(): ModuleNavVariant {\n return React.useContext(ModuleLayoutContext)\n}\n\nfunction NavItem({ item }: { item: ModuleNavItem }) {\n const [expanded, setExpanded] = React.useState(true)\n const Icon = item.icon ? (ICON_MAP[item.icon] ?? null) : null\n const hasChildren = item.children && item.children.length > 0\n const hasActiveChild = hasChildren && item.children!.some((c) => c.active)\n const isActive = item.active || hasActiveChild\n\n return (\n <div>\n <button\n type=\"button\"\n onClick={() => hasChildren ? setExpanded(!expanded) : item.onClick?.()}\n className={cn(\n 'flex items-center gap-2 w-full rounded-md px-2.5 py-1.5 text-sm transition-colors',\n isActive\n ? 'bg-primary/10 text-primary font-medium'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'\n )}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0\" />}\n <span className=\"flex-1 text-left truncate\">{item.label}</span>\n {hasChildren && (\n expanded\n ? <ChevronDown className=\"h-3.5 w-3.5 shrink-0 opacity-50\" />\n : <ChevronRight className=\"h-3.5 w-3.5 shrink-0 opacity-50\" />\n )}\n </button>\n {hasChildren && expanded && (\n <div className=\"ml-4 mt-0.5 space-y-0.5 border-l pl-2\">\n {item.children!.map((child) => (\n <button\n key={child.id}\n type=\"button\"\n onClick={child.onClick}\n className={cn(\n 'flex items-center w-full rounded-md px-2.5 py-1 text-xs transition-colors',\n child.active\n ? 'text-primary font-medium bg-primary/5'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'\n )}\n >\n {child.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** Horizontal scrollable tabs for mobile — with expandable children */\nfunction MobileTabs({ nav }: { nav: ModuleNavItem[] }) {\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const [expandedId, setExpandedId] = React.useState<string | null>(null)\n\n // Auto-scroll to active tab on mount\n React.useEffect(() => {\n const container = scrollRef.current\n if (!container) return\n const activeEl = container.querySelector('[data-active=\"true\"]') as HTMLElement\n if (activeEl) {\n const left = activeEl.offsetLeft - container.offsetWidth / 2 + activeEl.offsetWidth / 2\n container.scrollTo({ left: Math.max(0, left), behavior: 'smooth' })\n }\n }, [nav])\n\n return (\n <div className=\"md:hidden -mx-1 mb-4 no-print\">\n <div ref={scrollRef} className=\"flex gap-1 px-1 pb-2 overflow-x-auto scrollbar-hide\">\n {nav.map((item) => {\n const Icon = item.icon ? (ICON_MAP[item.icon] ?? null) : null\n const hasChildren = item.children && item.children.length > 0\n const isActive = item.active || item.children?.some((c) => c.active)\n const isExpanded = expandedId === item.id\n\n return (\n <button\n key={item.id}\n type=\"button\"\n data-active={isActive || undefined}\n onClick={() => {\n if (hasChildren) {\n setExpandedId(isExpanded ? null : item.id)\n } else {\n item.onClick?.()\n setExpandedId(null)\n }\n }}\n className={cn(\n 'flex items-center gap-1.5 whitespace-nowrap rounded-full px-3 py-1.5 text-xs font-medium transition-colors shrink-0',\n isActive\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-muted-foreground hover:text-foreground'\n )}\n >\n {Icon && <Icon className=\"h-3 w-3\" />}\n {item.label}\n {hasChildren && <ChevronDown className={cn('h-2.5 w-2.5 transition-transform', isExpanded && 'rotate-180')} />}\n </button>\n )\n })}\n </div>\n\n {/* Expanded children dropdown */}\n {expandedId && (() => {\n const item = nav.find((n) => n.id === expandedId)\n if (!item?.children) return null\n return (\n <div className=\"flex gap-1 px-2 pb-2 animate-in fade-in-0 slide-in-from-top-1\">\n {item.children.map((child) => (\n <button\n key={child.id}\n type=\"button\"\n onClick={() => { child.onClick?.(); setExpandedId(null) }}\n className={cn(\n 'whitespace-nowrap rounded-full px-2.5 py-1 text-[11px] font-medium transition-colors shrink-0',\n child.active\n ? 'bg-foreground/10 text-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {child.label}\n </button>\n ))}\n </div>\n )\n })()}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SubpageHeader\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Back-button style — the SINGLE, app-wide affordance for returning from a\n// detail/subpage. Set once by the product via <BackStyleProvider>, NOT chosen\n// per-plugin (mirrors NavTransitionProvider for page transitions). Plugins just\n// pass `onBack` + `parentLabel` to SubpageHeader and inherit whatever style the\n// app picked:\n// 'link' → subtle \"← Back to {parent}\" above the title (default)\n// 'breadcrumb' → \"{parent} › Title\"\n// 'icon' → square chevron button beside the title\n// ---------------------------------------------------------------------------\n\nexport type BackButtonStyle = 'link' | 'breadcrumb' | 'icon'\n\nconst BackStyleContext = React.createContext<BackButtonStyle>('link')\n\nexport function BackStyleProvider({ style, children }: { style: BackButtonStyle; children: React.ReactNode }) {\n return <BackStyleContext.Provider value={style}>{children}</BackStyleContext.Provider>\n}\n\nexport function useBackStyle(): BackButtonStyle {\n return React.useContext(BackStyleContext)\n}\n\nexport interface SubpageHeaderProps {\n /** Page title */\n title: string\n /** Short description */\n subtitle?: string\n /** Lucide icon name */\n icon?: string\n /** Back button handler */\n onBack?: () => void\n /** Parent label (e.g. \"Invoices\") — used by every back style (\"Back to Invoices\", breadcrumb root, etc.) */\n parentLabel?: string\n /** Actions rendered on the right */\n actions?: React.ReactNode\n /** Override the app-wide back style for this one header. Rarely needed. */\n backStyle?: BackButtonStyle\n}\n\nexport function SubpageHeader({ title, subtitle, icon, onBack, parentLabel, actions, backStyle }: SubpageHeaderProps) {\n const t = useTranslation()\n const appStyle = useBackStyle()\n\n // Defer to the global navigation history when the user came from another\n // module, so the back link points at the actual previous page. Within the\n // same module the page's own onBack/parentLabel pass through unchanged.\n const { onBack: effectiveOnBack, parentLabel: effectiveParentLabel } = useCrossModuleBack(onBack, parentLabel)\n\n // Wire this page's back action into the app-wide Escape key (no per-plugin code).\n useBackHandler(effectiveOnBack)\n const Icon = icon ? (ICON_MAP[icon] ?? null) : null\n // Breadcrumb/link need a parent label; without one we fall back to the icon button.\n const style: BackButtonStyle = !effectiveOnBack ? 'icon' : (backStyle ?? appStyle)\n const effectiveStyle: BackButtonStyle = style !== 'icon' && !effectiveParentLabel ? 'icon' : style\n\n const titleBlock = (\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-3\">\n {effectiveStyle === 'icon' && effectiveOnBack && (\n <button\n onClick={effectiveOnBack}\n className=\"flex h-8 w-8 items-center justify-center rounded-lg border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n )}\n {Icon && (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-muted\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n )}\n <div>\n <h2 className=\"text-xl font-bold\">{title}</h2>\n {subtitle && <p className=\"text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n </div>\n {actions && <div className=\"no-print\">{actions}</div>}\n </div>\n )\n\n if (effectiveStyle === 'breadcrumb') {\n return (\n <div className=\"space-y-4 mb-6\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <button onClick={effectiveOnBack} className=\"hover:text-foreground transition-colors\">{effectiveParentLabel}</button>\n <ChevronRight className=\"h-3.5 w-3.5\" />\n <span className=\"text-foreground font-medium\">{title}</span>\n </div>\n {actions && <div className=\"no-print\">{actions}</div>}\n </div>\n {subtitle && <p className=\"text-sm text-muted-foreground -mt-2\">{subtitle}</p>}\n </div>\n )\n }\n\n if (effectiveStyle === 'link') {\n return (\n <div className=\"space-y-3 mb-6\">\n <button\n onClick={effectiveOnBack}\n className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n {t('crud.detail.backTo', { entities: effectiveParentLabel as string })}\n </button>\n {titleBlock}\n </div>\n )\n }\n\n // icon (default fallback)\n return <div className=\"space-y-4 mb-6\">{titleBlock}</div>\n}\n\n// ---------------------------------------------------------------------------\n// ModuleHeader — GoHighLevel-style module header (title + horizontal sub-nav),\n// portalled into the shell's top-of-page header slot. Active tab's children\n// render as a secondary pill row. Falls back to inline if no slot is present.\n// ---------------------------------------------------------------------------\n\nfunction ModuleHeader({ nav }: { nav: ModuleNavItem[] }) {\n const slot = useModuleHeaderSlot()\n\n // Tabs are flat: a parent with children navigates straight to its default\n // \"list\" view (sub-actions like \"New\" live as a button inside that list).\n function defaultChild(item: ModuleNavItem) {\n const kids = item.children ?? []\n return kids.find((c) => /list/i.test(c.id) || /^list$/i.test(c.label)) ?? kids[kids.length - 1]\n }\n\n const content = (\n <div className=\"flex w-full min-w-0 items-center gap-4\">\n <div className=\"flex min-w-0 items-center gap-0.5 overflow-x-auto scrollbar-hide\">\n {nav.map((item) => {\n const Icon = item.icon ? (ICON_MAP[item.icon] ?? null) : null\n const hasChildren = item.children && item.children.length > 0\n const isActive = item.active || item.children?.some((c) => c.active)\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => (hasChildren ? defaultChild(item)?.onClick?.() : item.onClick?.())}\n className={cn(\n 'flex shrink-0 items-center gap-1.5 whitespace-nowrap border-b-2 px-2.5 py-1.5 text-sm font-medium transition-colors',\n isActive\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground',\n )}\n >\n {Icon && <Icon className=\"h-4 w-4\" />}\n {item.label}\n </button>\n )\n })}\n </div>\n </div>\n )\n\n if (slot) return createPortal(content, slot)\n // Fallback: render inline above content when no shell header slot exists.\n return <div className=\"mb-5 border-b border-border pb-2\">{content}</div>\n}\n\n// ---------------------------------------------------------------------------\n// ModulePage\n// ---------------------------------------------------------------------------\n\nexport function ModulePage({ title, subtitle, nav, children, className, headerAction, showHeader = true, sidebarFooter, navVariant, viewKey, direction }: ModulePageProps) {\n const ctxVariant = useModuleLayout()\n const variant = navVariant ?? ctxVariant\n const transitionKey = viewKey ?? 'view'\n\n // Tabs variant — the module sub-nav renders in the shell's top-of-page header\n // container and actions in its right slot (GoHighLevel style); the content\n // area holds only the view (the shell owns the page title).\n if (variant === 'tabs') {\n return (\n <>\n <ModuleHeader nav={nav} />\n {/* Header actions belong to the module overview only; internal sub-views\n (showHeader=false) carry their own actions. */}\n {showHeader && headerAction && <PageHeaderActions>{headerAction}</PageHeaderActions>}\n <PageTransition transitionKey={transitionKey} direction={direction} className={cn('min-w-0', className)}>\n {children}\n </PageTransition>\n </>\n )\n }\n\n // Rail variant (default) — left sub-nav column.\n return (\n <div className={cn('flex gap-6 -mt-2', className)}>\n {/* Side navigation — hidden on mobile + print */}\n <div className=\"w-48 shrink-0 hidden md:block no-print\">\n <div className={cn(sidebarFooter && 'sticky top-4 flex flex-col')} style={sidebarFooter ? { height: 'calc(100vh - 8rem)' } : undefined}>\n <div>\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider px-2.5 mb-2\">{title}</p>\n <nav className=\"space-y-0.5\">\n {nav.map((item) => (\n <NavItem key={item.id} item={item} />\n ))}\n </nav>\n </div>\n {sidebarFooter && <div className=\"mt-auto\">{sidebarFooter}</div>}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n {showHeader && (\n <div className=\"mb-6 flex items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-bold\">{title}</h1>\n {subtitle && <p className=\"text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n {headerAction}\n </div>\n )}\n {/* Mobile tabs */}\n <MobileTabs nav={nav} />\n <PageTransition transitionKey={transitionKey} direction={direction}>\n {children}\n </PageTransition>\n </div>\n </div>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/button.tsx","../src/primitives/card.tsx","../src/primitives/dropdown.tsx","../src/primitives/data-table.tsx","../src/primitives/segmented-control.tsx"],"names":["cva","React","Slot","jsx","cn","React2","DropdownMenuPrimitive","React3","jsxs","ChevronRight","Check","Circle","React4","useReactTable","getCoreRowModel","getSortedRowModel","_","flexRender","ArrowUp","ArrowDown","ArrowUpDown"],"mappings":"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","file":"chunk-D6SXPF4F.cjs","sourcesContent":["import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../utils/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-button text-sm font-semibold ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n // Polaris primary — near-black brand with the stronger primary bevel\n default:\n 'bg-primary text-primary-foreground border border-primary shadow-button-primary hover:bg-primary/90 active:shadow-button-inset',\n destructive:\n 'bg-destructive text-destructive-foreground border border-destructive shadow-button-primary hover:bg-destructive/90 active:shadow-button-inset',\n // Default/secondary surface — white with hairline + bevel\n outline:\n 'border border-border bg-card text-foreground shadow-button hover:bg-muted active:shadow-button-inset',\n secondary:\n 'border border-border bg-card text-foreground shadow-button hover:bg-muted active:shadow-button-inset',\n ghost: 'hover:bg-muted hover:text-foreground',\n link: 'text-info underline-offset-4 hover:underline',\n },\n size: {\n // Polaris button sizes: md 30px, sm 26px, lg 36px\n default: 'h-[30px] px-3 py-1',\n sm: 'h-[26px] rounded-button px-2.5 text-xs',\n lg: 'h-9 rounded-button px-4 text-sm',\n icon: 'h-[30px] w-[30px]',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as React from 'react'\n\nimport { cn } from '../utils/cn'\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'fayz-glass-surface rounded-card border bg-card text-card-foreground shadow-sm',\n className\n )}\n {...props}\n />\n))\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1 p-4', className)}\n {...props}\n />\n))\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n 'text-sm font-semibold leading-tight tracking-tight',\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-xs text-muted-foreground', className)}\n {...props}\n />\n))\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-4 pt-0', className)} {...props} />\n))\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-4 pt-0', className)}\n {...props}\n />\n))\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Check, ChevronRight, Circle } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\nconst Dropdown = DropdownMenuPrimitive.Root\n\nconst DropdownTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownGroup = DropdownMenuPrimitive.Group\n\nconst DropdownPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownSub = DropdownMenuPrimitive.Sub\n\nconst DropdownRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-muted data-[state=open]:bg-muted',\n inset && 'pl-8',\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n))\nDropdownSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n 'px-2 py-1.5 text-sm font-semibold',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nDropdownSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn('ml-auto text-xs tracking-widest opacity-60', className)}\n {...props}\n />\n )\n}\nDropdownShortcut.displayName = 'DropdownShortcut'\n\nexport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownCheckboxItem,\n DropdownRadioItem,\n DropdownLabel,\n DropdownSeparator,\n DropdownShortcut,\n DropdownGroup,\n DropdownPortal,\n DropdownSub,\n DropdownSubContent,\n DropdownSubTrigger,\n DropdownRadioGroup,\n}\n","import * as React from 'react'\nimport {\n type ColumnDef,\n type SortingState,\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { ArrowUpDown, ArrowUp, ArrowDown } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\ninterface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n loading?: boolean\n skeletonRows?: number\n emptyMessage?: string\n onRowClick?: (row: TData) => void\n /** Visual variant: 'card' (white bg, card wrapper — default) or 'flat' (transparent bg) */\n variant?: 'card' | 'flat'\n /** Compact mode: smaller padding and font size */\n compact?: boolean\n}\n\nfunction DataTable<TData, TValue>({\n columns,\n data,\n loading = false,\n skeletonRows = 3,\n emptyMessage = 'No results.',\n onRowClick,\n variant = 'card',\n compact = false,\n}: DataTableProps<TData, TValue>) {\n const isCard = variant === 'card'\n const wrapperCls = isCard ? 'rounded-lg border bg-card shadow-sm overflow-x-auto' : 'rounded-lg border overflow-x-auto'\n const headerCls = isCard ? 'border-b bg-muted/50' : 'border-b bg-muted/30'\n const thCls = compact ? 'px-3 py-1.5 text-left text-[11px] font-medium text-muted-foreground' : 'px-4 py-2.5 text-left font-medium text-muted-foreground'\n const tdCls = compact ? 'px-3 py-1.5 align-middle text-xs' : 'px-4 py-3 align-middle'\n const tableCls = compact ? 'w-full text-xs min-w-max' : 'w-full text-sm min-w-max'\n const rowHoverCls = isCard ? 'hover:bg-muted/30' : 'hover:bg-muted/20'\n const [sorting, setSorting] = React.useState<SortingState>([])\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: setSorting,\n state: { sorting },\n })\n\n if (loading) {\n return (\n <div className={wrapperCls}>\n <table className={tableCls}>\n <thead>\n <tr className={headerCls}>\n {columns.map((_, i) => (\n <th key={i} className={thCls}>\n <div className=\"h-3.5 w-20 animate-pulse rounded bg-muted\" />\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: skeletonRows }).map((_, i) => (\n <tr key={i} className=\"border-b last:border-0\">\n {columns.map((_, j) => (\n <td key={j} className={tdCls}>\n <div className=\"h-3.5 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n }\n\n return (\n <div className={wrapperCls}>\n <table className={tableCls}>\n <thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id} className={headerCls}>\n {headerGroup.headers.map((header) => {\n const sorted = header.column.getIsSorted()\n return (\n <th\n key={header.id}\n className={thCls}\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <button\n className=\"flex items-center gap-1 hover:text-foreground transition-colors\"\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n {sorted === 'asc' ? (\n <ArrowUp className=\"h-3 w-3\" />\n ) : sorted === 'desc' ? (\n <ArrowDown className=\"h-3 w-3\" />\n ) : (\n <ArrowUpDown className=\"h-3 w-3 opacity-40\" />\n )}\n </button>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </th>\n )\n })}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <tr\n key={row.id}\n className={cn(\n `border-b last:border-0 transition-colors ${rowHoverCls}`,\n onRowClick && 'cursor-pointer'\n )}\n onClick={() => onRowClick?.(row.original)}\n >\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className={tdCls}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))\n ) : (\n <tr>\n <td colSpan={columns.length} className=\"h-24 text-center text-muted-foreground\">\n {emptyMessage}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n )\n}\n\nexport { DataTable, type DataTableProps }\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\nexport interface SegmentedOption<T extends string = string> {\n value: T\n label: React.ReactNode\n}\n\nexport interface SegmentedControlProps<T extends string = string> {\n /** Options as plain values (label = value) or `{ value, label }` objects. */\n options: ReadonlyArray<T | SegmentedOption<T>>\n value: T\n onChange: (value: T) => void\n /** Matches the equivalent Button heights: sm = 26px, md = 30px. */\n size?: 'sm' | 'md'\n className?: string\n 'aria-label'?: string\n}\n\nconst SIZE: Record<'sm' | 'md', { container: string; segment: string }> = {\n sm: { container: 'h-[26px]', segment: 'px-2.5 text-xs' },\n md: { container: 'h-[30px]', segment: 'px-3 text-sm' },\n}\n\n/**\n * Canonical segmented (pill) control — same chrome as Button (rounded-button\n * radius, hairline border + shadow-button bevel on a card surface). Use this for\n * any 7d/30d/90d-style toggle so every surface stays visually consistent instead\n * of hand-rolling a styled toggle group.\n */\nexport function SegmentedControl<T extends string = string>({\n options, value, onChange, size = 'sm', className, ...rest\n}: SegmentedControlProps<T>) {\n const items = options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o)) as SegmentedOption<T>[]\n return (\n <div\n role=\"tablist\"\n aria-label={rest['aria-label']}\n className={cn(\n 'inline-flex items-center rounded-button border border-border bg-card p-0.5 shadow-button',\n SIZE[size].container,\n className,\n )}\n >\n {items.map((item) => {\n const active = item.value === value\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(item.value)}\n className={cn(\n 'flex h-full items-center rounded-button font-semibold transition-colors',\n SIZE[size].segment,\n active ? 'bg-foreground text-background' : 'text-muted-foreground hover:bg-muted/60',\n )}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )\n}\n"]}
|
package/dist/chunk-DNYVEOAX.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { clsx } from 'clsx';
|
|
2
|
-
import { twMerge } from 'tailwind-merge';
|
|
3
|
-
|
|
4
|
-
// src/utils/cn.ts
|
|
5
|
-
function cn(...inputs) {
|
|
6
|
-
return twMerge(clsx(inputs));
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export { cn };
|
|
10
|
-
//# sourceMappingURL=chunk-DNYVEOAX.js.map
|
|
11
|
-
//# sourceMappingURL=chunk-DNYVEOAX.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/cn.ts"],"names":[],"mappings":";;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B","file":"chunk-DNYVEOAX.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"]}
|
package/dist/chunk-E526FHZ4.js
DELETED
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import { cn } from './chunk-DNYVEOAX.js';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
import { Loader2 } from 'lucide-react';
|
|
4
|
-
import { useTranslation, useNavReferrer, routeModule, navHistoryBack } from '@fayz-ai/core';
|
|
5
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
-
|
|
7
|
-
var SaveBarApiContext = React.createContext(null);
|
|
8
|
-
var SaveBarStateContext = React.createContext({ visible: false, saving: false });
|
|
9
|
-
var _saveBarVisible = false;
|
|
10
|
-
var _saveBarSubs = /* @__PURE__ */ new Set();
|
|
11
|
-
function setSaveBarVisibleSignal(v) {
|
|
12
|
-
if (v === _saveBarVisible) return;
|
|
13
|
-
_saveBarVisible = v;
|
|
14
|
-
_saveBarSubs.forEach((fn) => fn());
|
|
15
|
-
}
|
|
16
|
-
function useSaveBarVisible() {
|
|
17
|
-
return React.useSyncExternalStore(
|
|
18
|
-
(cb) => {
|
|
19
|
-
_saveBarSubs.add(cb);
|
|
20
|
-
return () => {
|
|
21
|
-
_saveBarSubs.delete(cb);
|
|
22
|
-
};
|
|
23
|
-
},
|
|
24
|
-
() => _saveBarVisible,
|
|
25
|
-
() => false
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
function SaveBarProvider({ children }) {
|
|
29
|
-
const [state, setState] = React.useState({ visible: false, saving: false });
|
|
30
|
-
const handlers = React.useRef({});
|
|
31
|
-
const api = React.useMemo(() => ({ setState, handlers }), []);
|
|
32
|
-
const backStack = React.useRef([]);
|
|
33
|
-
const backApi = React.useMemo(() => ({ stack: backStack }), []);
|
|
34
|
-
React.useEffect(() => {
|
|
35
|
-
setSaveBarVisibleSignal(state.visible);
|
|
36
|
-
}, [state.visible]);
|
|
37
|
-
React.useEffect(() => {
|
|
38
|
-
function onKey(e) {
|
|
39
|
-
if (state.visible && !state.saving) {
|
|
40
|
-
if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
|
|
41
|
-
e.preventDefault();
|
|
42
|
-
handlers.current.onSave?.();
|
|
43
|
-
} else if (e.key === "Escape") {
|
|
44
|
-
e.preventDefault();
|
|
45
|
-
handlers.current.onDiscard?.();
|
|
46
|
-
}
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (e.key === "Escape" && !e.defaultPrevented && !isEditableTarget(e.target)) {
|
|
50
|
-
for (let i = backStack.current.length - 1; i >= 0; i--) {
|
|
51
|
-
const back = backStack.current[i].current;
|
|
52
|
-
if (back) {
|
|
53
|
-
e.preventDefault();
|
|
54
|
-
back();
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
window.addEventListener("keydown", onKey);
|
|
61
|
-
return () => window.removeEventListener("keydown", onKey);
|
|
62
|
-
}, [state.visible, state.saving]);
|
|
63
|
-
return /* @__PURE__ */ jsx(SaveBarApiContext.Provider, { value: api, children: /* @__PURE__ */ jsx(BackNavApiContext.Provider, { value: backApi, children: /* @__PURE__ */ jsx(SaveBarStateContext.Provider, { value: state, children }) }) });
|
|
64
|
-
}
|
|
65
|
-
var BackNavApiContext = React.createContext(null);
|
|
66
|
-
function isEditableTarget(target) {
|
|
67
|
-
const el = target;
|
|
68
|
-
if (!el || !el.tagName) return false;
|
|
69
|
-
const tag = el.tagName.toLowerCase();
|
|
70
|
-
return tag === "input" || tag === "textarea" || tag === "select" || el.isContentEditable;
|
|
71
|
-
}
|
|
72
|
-
function useBackHandler(onBack) {
|
|
73
|
-
const api = React.useContext(BackNavApiContext);
|
|
74
|
-
const ref = React.useRef(onBack);
|
|
75
|
-
React.useEffect(() => {
|
|
76
|
-
ref.current = onBack;
|
|
77
|
-
});
|
|
78
|
-
React.useEffect(() => {
|
|
79
|
-
if (!api) return;
|
|
80
|
-
const stack = api.stack.current;
|
|
81
|
-
stack.push(ref);
|
|
82
|
-
return () => {
|
|
83
|
-
const i = stack.indexOf(ref);
|
|
84
|
-
if (i !== -1) stack.splice(i, 1);
|
|
85
|
-
};
|
|
86
|
-
}, [api]);
|
|
87
|
-
}
|
|
88
|
-
function useSaveBar({ dirty, saving = false, onSave, onDiscard, message, saveLabel, discardLabel }) {
|
|
89
|
-
const api = React.useContext(SaveBarApiContext);
|
|
90
|
-
React.useEffect(() => {
|
|
91
|
-
if (api) api.handlers.current = { onSave, onDiscard };
|
|
92
|
-
});
|
|
93
|
-
React.useEffect(() => {
|
|
94
|
-
if (!api) return;
|
|
95
|
-
api.setState({ visible: dirty, saving, message, saveLabel, discardLabel });
|
|
96
|
-
return () => api.setState((s) => ({ ...s, visible: false }));
|
|
97
|
-
}, [api, dirty, saving, message, saveLabel, discardLabel]);
|
|
98
|
-
}
|
|
99
|
-
function SaveBar({ className }) {
|
|
100
|
-
const state = React.useContext(SaveBarStateContext);
|
|
101
|
-
const api = React.useContext(SaveBarApiContext);
|
|
102
|
-
const t = useTranslation();
|
|
103
|
-
const [rendered, setRendered] = React.useState(state.visible);
|
|
104
|
-
const [closing, setClosing] = React.useState(false);
|
|
105
|
-
React.useEffect(() => {
|
|
106
|
-
if (state.visible) {
|
|
107
|
-
setRendered(true);
|
|
108
|
-
setClosing(false);
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
if (!rendered) return;
|
|
112
|
-
setClosing(true);
|
|
113
|
-
const id = setTimeout(() => {
|
|
114
|
-
setRendered(false);
|
|
115
|
-
setClosing(false);
|
|
116
|
-
}, 200);
|
|
117
|
-
return () => clearTimeout(id);
|
|
118
|
-
}, [state.visible, rendered]);
|
|
119
|
-
if (!api || !rendered) return null;
|
|
120
|
-
const { saving, message, saveLabel, discardLabel } = state;
|
|
121
|
-
return /* @__PURE__ */ jsx("div", { className: cn("pointer-events-none fixed inset-x-0 bottom-5 z-40 flex justify-center px-4", className), children: /* @__PURE__ */ jsxs("div", { className: cn(
|
|
122
|
-
"pointer-events-auto flex items-center gap-5 rounded-full bg-foreground py-2 pl-5 pr-2 text-background shadow-xl ring-1 ring-black/5 duration-200",
|
|
123
|
-
closing ? "animate-out fade-out slide-out-to-bottom-2" : "animate-in fade-in slide-in-from-bottom-2"
|
|
124
|
-
), children: [
|
|
125
|
-
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 text-sm font-medium", children: [
|
|
126
|
-
/* @__PURE__ */ jsx("span", { className: "h-2 w-2 shrink-0 rounded-full bg-amber-400" }),
|
|
127
|
-
message ?? t("saveBar.unsaved")
|
|
128
|
-
] }),
|
|
129
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
130
|
-
/* @__PURE__ */ jsx(
|
|
131
|
-
"button",
|
|
132
|
-
{
|
|
133
|
-
type: "button",
|
|
134
|
-
disabled: saving,
|
|
135
|
-
onClick: () => api.handlers.current.onDiscard?.(),
|
|
136
|
-
className: "rounded-full px-3 py-1.5 text-sm font-medium text-background/70 transition-colors hover:bg-background/10 hover:text-background disabled:opacity-50",
|
|
137
|
-
children: discardLabel ?? t("common.discard")
|
|
138
|
-
}
|
|
139
|
-
),
|
|
140
|
-
/* @__PURE__ */ jsxs(
|
|
141
|
-
"button",
|
|
142
|
-
{
|
|
143
|
-
type: "button",
|
|
144
|
-
disabled: saving,
|
|
145
|
-
onClick: () => api.handlers.current.onSave?.(),
|
|
146
|
-
className: "inline-flex items-center rounded-full bg-background px-4 py-1.5 text-sm font-semibold text-foreground transition-colors hover:bg-background/90 disabled:opacity-60",
|
|
147
|
-
children: [
|
|
148
|
-
saving && /* @__PURE__ */ jsx(Loader2, { className: "mr-1.5 h-3.5 w-3.5 animate-spin" }),
|
|
149
|
-
saveLabel ?? t("common.save")
|
|
150
|
-
]
|
|
151
|
-
}
|
|
152
|
-
)
|
|
153
|
-
] })
|
|
154
|
-
] }) });
|
|
155
|
-
}
|
|
156
|
-
function useCrossModuleBack(onBack, parentLabel) {
|
|
157
|
-
const currentPath = typeof window !== "undefined" ? (window.location.hash ? window.location.hash.slice(1) : window.location.pathname) || "/" : "/";
|
|
158
|
-
const referrer = useNavReferrer(currentPath);
|
|
159
|
-
const cross = referrer && referrer.label && routeModule(referrer.path) !== routeModule(currentPath) ? referrer : null;
|
|
160
|
-
return {
|
|
161
|
-
onBack: cross ? () => navHistoryBack(onBack) : onBack,
|
|
162
|
-
parentLabel: cross ? cross.label : parentLabel,
|
|
163
|
-
isCrossModule: !!cross
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export { SaveBar, SaveBarProvider, useBackHandler, useCrossModuleBack, useSaveBar, useSaveBarVisible };
|
|
168
|
-
//# sourceMappingURL=chunk-E526FHZ4.js.map
|
|
169
|
-
//# sourceMappingURL=chunk-E526FHZ4.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/layout/SaveBar.tsx","../src/layout/useCrossModuleBack.ts"],"names":[],"mappings":"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","file":"chunk-E526FHZ4.js","sourcesContent":["import * as React from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { cn } from '../utils/cn'\n\n// ---------------------------------------------------------------------------\n// SaveBar — the single, app-wide \"Unsaved changes\" floating island. A form\n// declares its state via useSaveBar({ dirty, saving, onSave, onDiscard }); the\n// shell renders ONE <SaveBar/> (centered, floating above the content area) that\n// appears whenever the active form is dirty. Mirrors the BackStyleProvider /\n// PageHeaderActions idiom: decide-once at the shell, hook-in at the page.\n//\n// Handlers live in a ref (not state) so per-render closure changes never cause\n// re-render loops; only the primitive `dirty`/`saving` flags drive visibility.\n// ---------------------------------------------------------------------------\n\nexport interface SaveBarRegistration {\n /** Show the bar when true (form has unsaved changes). */\n dirty: boolean\n /** Save in progress — disables buttons and shows a spinner. */\n saving?: boolean\n onSave: () => void\n onDiscard?: () => void\n /** Override the \"Unsaved changes\" message. */\n message?: string\n /** Override the Save / Discard button labels. */\n saveLabel?: string\n discardLabel?: string\n}\n\ninterface SaveBarState {\n visible: boolean\n saving: boolean\n message?: string\n saveLabel?: string\n discardLabel?: string\n}\n\ninterface SaveBarApi {\n setState: React.Dispatch<React.SetStateAction<SaveBarState>>\n handlers: React.MutableRefObject<{ onSave?: () => void; onDiscard?: () => void }>\n}\n\n// Two contexts on purpose: the API context is STABLE (so useSaveBar's effect\n// deps don't change every render → no loop), the state context changes to\n// re-render only <SaveBar/>.\nconst SaveBarApiContext = React.createContext<SaveBarApi | null>(null)\nconst SaveBarStateContext = React.createContext<SaveBarState>({ visible: false, saving: false })\n\n// Module-level \"is the SaveBar showing\" signal so sibling UI that isn't a\n// descendant of SaveBarProvider (e.g. the ToastProvider) can react to it —\n// used to lift toasts above the bar so they stack instead of overlapping.\nlet _saveBarVisible = false\nconst _saveBarSubs = new Set<() => void>()\nfunction setSaveBarVisibleSignal(v: boolean) {\n if (v === _saveBarVisible) return\n _saveBarVisible = v\n _saveBarSubs.forEach((fn) => fn())\n}\n\n/** Subscribe to whether the floating SaveBar is currently on screen. */\nexport function useSaveBarVisible(): boolean {\n return React.useSyncExternalStore(\n (cb) => { _saveBarSubs.add(cb); return () => { _saveBarSubs.delete(cb) } },\n () => _saveBarVisible,\n () => false,\n )\n}\n\nexport function SaveBarProvider({ children }: { children: React.ReactNode }) {\n const [state, setState] = React.useState<SaveBarState>({ visible: false, saving: false })\n const handlers = React.useRef<{ onSave?: () => void; onDiscard?: () => void }>({})\n const api = React.useMemo<SaveBarApi>(() => ({ setState, handlers }), [])\n\n // Stack of registered back-navigation handlers (latest-mounted wins) so the\n // app-wide Escape key can navigate \"up\" to the parent route. Lives here, next\n // to the SaveBar handlers, so ONE keydown listener arbitrates both — Escape\n // discards a dirty form first, and only navigates back when none is open.\n const backStack = React.useRef<React.MutableRefObject<(() => void) | undefined>[]>([])\n const backApi = React.useMemo<BackNavApi>(() => ({ stack: backStack }), [])\n\n // Broadcast visibility to the module-level signal (for the ToastProvider).\n React.useEffect(() => { setSaveBarVisibleSignal(state.visible) }, [state.visible])\n\n // App-wide keyboard shortcuts, arbitrated in one place:\n // • Cmd/Ctrl+Enter → save the active (dirty) form\n // • Escape (form dirty) → discard the form\n // • Escape (no dirty form) → navigate back to the parent route\n React.useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (state.visible && !state.saving) {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n handlers.current.onSave?.()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n handlers.current.onDiscard?.()\n }\n return\n }\n // No open/dirty form — Escape walks \"up\" via the topmost back handler.\n if (e.key === 'Escape' && !e.defaultPrevented && !isEditableTarget(e.target)) {\n for (let i = backStack.current.length - 1; i >= 0; i--) {\n const back = backStack.current[i].current\n if (back) { e.preventDefault(); back(); return }\n }\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [state.visible, state.saving])\n\n return (\n <SaveBarApiContext.Provider value={api}>\n <BackNavApiContext.Provider value={backApi}>\n <SaveBarStateContext.Provider value={state}>\n {children}\n </SaveBarStateContext.Provider>\n </BackNavApiContext.Provider>\n </SaveBarApiContext.Provider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Back-navigation registry — lets any subpage register its \"go to parent\" action\n// so the shell's single Escape handler can drive it (see SaveBarProvider above).\n// SubpageHeader already receives onBack, so wiring it there gives every plugin\n// detail page Escape-to-parent for free, with zero per-plugin code.\n// ---------------------------------------------------------------------------\n\ninterface BackNavApi {\n stack: React.MutableRefObject<React.MutableRefObject<(() => void) | undefined>[]>\n}\nconst BackNavApiContext = React.createContext<BackNavApi | null>(null)\n\n/** True when the keyboard event originates from a field where Escape has its\n * own meaning (clear/close), so we shouldn't hijack it for back-navigation. */\nfunction isEditableTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el || !el.tagName) return false\n const tag = el.tagName.toLowerCase()\n return tag === 'input' || tag === 'textarea' || tag === 'select' || el.isContentEditable\n}\n\n/**\n * Register a back-navigation handler with the app-wide Escape key. Call it in a\n * subpage (or pass through SubpageHeader's onBack); while mounted, pressing\n * Escape with no dirty form open invokes the most-recently-registered handler.\n * Pass `undefined` to opt out (e.g. a top-level page with nothing to go back to).\n */\nexport function useBackHandler(onBack?: () => void): void {\n const api = React.useContext(BackNavApiContext)\n // Hold the latest closure in a ref so re-renders don't churn the stack.\n const ref = React.useRef(onBack)\n React.useEffect(() => { ref.current = onBack })\n React.useEffect(() => {\n if (!api) return\n const stack = api.stack.current\n stack.push(ref)\n return () => {\n const i = stack.indexOf(ref)\n if (i !== -1) stack.splice(i, 1)\n }\n }, [api])\n}\n\n/**\n * Register the current form with the app-wide SaveBar. Call it unconditionally\n * in a form view; it shows the island while `dirty`, keeps handlers current, and\n * hides the island automatically when the form unmounts (e.g. on navigation).\n */\nexport function useSaveBar({ dirty, saving = false, onSave, onDiscard, message, saveLabel, discardLabel }: SaveBarRegistration): void {\n const api = React.useContext(SaveBarApiContext)\n\n // Keep latest handlers in the shared ref (no state churn from new closures).\n React.useEffect(() => {\n if (api) api.handlers.current = { onSave, onDiscard }\n })\n\n // Drive visibility from primitives only; `api` is stable → no render loops.\n React.useEffect(() => {\n if (!api) return\n api.setState({ visible: dirty, saving, message, saveLabel, discardLabel })\n return () => api.setState((s) => ({ ...s, visible: false }))\n }, [api, dirty, saving, message, saveLabel, discardLabel])\n}\n\n/** The floating island. Rendered once by the shell inside the content column. */\nexport function SaveBar({ className }: { className?: string }) {\n const state = React.useContext(SaveBarStateContext)\n const api = React.useContext(SaveBarApiContext)\n const t = useTranslation()\n\n // Keep the island mounted through its exit animation: `rendered` lags behind\n // `visible` so we can play fade-out before unmounting.\n const [rendered, setRendered] = React.useState(state.visible)\n const [closing, setClosing] = React.useState(false)\n\n React.useEffect(() => {\n if (state.visible) {\n setRendered(true)\n setClosing(false)\n return\n }\n if (!rendered) return\n setClosing(true)\n const id = setTimeout(() => { setRendered(false); setClosing(false) }, 200)\n return () => clearTimeout(id)\n }, [state.visible, rendered])\n\n if (!api || !rendered) return null\n const { saving, message, saveLabel, discardLabel } = state\n\n return (\n <div className={cn('pointer-events-none fixed inset-x-0 bottom-5 z-40 flex justify-center px-4', className)}>\n {/* Dark island for strong contrast against the light page (auto-inverts in dark mode). */}\n <div className={cn(\n 'pointer-events-auto flex items-center gap-5 rounded-full bg-foreground py-2 pl-5 pr-2 text-background shadow-xl ring-1 ring-black/5 duration-200',\n closing ? 'animate-out fade-out slide-out-to-bottom-2' : 'animate-in fade-in slide-in-from-bottom-2',\n )}>\n <span className=\"flex items-center gap-2 text-sm font-medium\">\n <span className=\"h-2 w-2 shrink-0 rounded-full bg-amber-400\" />\n {message ?? t('saveBar.unsaved')}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => api.handlers.current.onDiscard?.()}\n className=\"rounded-full px-3 py-1.5 text-sm font-medium text-background/70 transition-colors hover:bg-background/10 hover:text-background disabled:opacity-50\"\n >\n {discardLabel ?? t('common.discard')}\n </button>\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => api.handlers.current.onSave?.()}\n className=\"inline-flex items-center rounded-full bg-background px-4 py-1.5 text-sm font-semibold text-foreground transition-colors hover:bg-background/90 disabled:opacity-60\"\n >\n {saving && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n {saveLabel ?? t('common.save')}\n </button>\n </div>\n </div>\n </div>\n )\n}\n","import { useNavReferrer, navHistoryBack, routeModule } from '@fayz-ai/core'\n\n/**\n * Context-aware back target shared by all header/breadcrumb components.\n *\n * When the user arrived from a *different* module (tracked in the global\n * navigation history), a page's own onBack/parentLabel point at its local\n * parent — wrong for the referrer. In that case we return the referrer's label\n * and a back action that pops the browser history to the actual previous page.\n * Within the same module the page's own (more specific) values pass through\n * unchanged, so existing behavior is preserved.\n */\nexport function useCrossModuleBack(onBack?: () => void, parentLabel?: string): {\n onBack?: () => void\n parentLabel?: string\n isCrossModule: boolean\n} {\n const currentPath = typeof window !== 'undefined'\n ? ((window.location.hash ? window.location.hash.slice(1) : window.location.pathname) || '/')\n : '/'\n const referrer = useNavReferrer(currentPath)\n const cross = referrer && referrer.label && routeModule(referrer.path) !== routeModule(currentPath)\n ? referrer\n : null\n return {\n onBack: cross ? () => navHistoryBack(onBack) : onBack,\n parentLabel: cross ? cross.label : parentLabel,\n isCrossModule: !!cross,\n }\n}\n"]}
|