@classytic/fluid 0.2.1 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dashboard.d.ts +1 -0
- package/dist/dashboard.js +1 -1
- package/dist/dashboard.js.map +1 -1
- package/dist/index.d.ts +9 -10
- package/dist/index.js +30 -68
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/dashboard.d.ts
CHANGED
package/dist/dashboard.js
CHANGED
|
@@ -294,7 +294,7 @@ function SidebarNavItem({ item, onClick }) {
|
|
|
294
294
|
]
|
|
295
295
|
}
|
|
296
296
|
),
|
|
297
|
-
/* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx(SidebarMenuSub, { children: item.items.map((subItem, idx) => /* @__PURE__ */ jsx(SidebarMenuSubItem, { children: /* @__PURE__ */ jsxs(SidebarMenuSubButton, { render: /* @__PURE__ */ jsx(Link3, { href: subItem.url }), children: [
|
|
297
|
+
/* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx(SidebarMenuSub, { children: item.items.map((subItem, idx) => /* @__PURE__ */ jsx(SidebarMenuSubItem, { children: /* @__PURE__ */ jsxs(SidebarMenuSubButton, { render: /* @__PURE__ */ jsx(Link3, { href: subItem.url }), isActive: subItem.isActive, children: [
|
|
298
298
|
/* @__PURE__ */ jsx("span", { children: subItem.title }),
|
|
299
299
|
subItem.badge && /* @__PURE__ */ jsx("span", { className: "ml-auto text-xs opacity-60", children: subItem.badge })
|
|
300
300
|
] }) }, `${item.title}-${subItem.title}-${idx}`)) }) })
|
package/dist/dashboard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dashboard/header-section.tsx","../src/dashboard/page-header.tsx","../src/dashboard/dashboard-content.tsx","../src/dashboard/sidebar-brand.tsx","../src/dashboard/sidebar-nav.tsx","../src/dashboard/sidebar-user-menu.tsx","../src/dashboard/project-switcher.tsx","../src/dashboard/dashboard-header.tsx","../src/dashboard/presets/inset-sidebar.tsx","../src/dashboard/presets/dual-sidebar.tsx"],"names":["badge","jsxs","jsx","React","Link","SidebarMenuItem","SidebarMenuButton","SidebarMenu","useSidebar","Fragment","React2","DropdownMenuContent","DropdownMenuGroup","DropdownMenuLabel","DropdownMenuItem","Badge","Skeleton","Button","DropdownMenu","DropdownMenuTrigger","ChevronsUpDown","Breadcrumb","BreadcrumbList","React3","BreadcrumbItem","BreadcrumbPage","BreadcrumbLink","BreadcrumbSeparator","SidebarTrigger","Separator","SheetTitle","SheetDescription","ChevronRight","SidebarHeader","SidebarContent","SidebarGroup","SidebarGroupLabel","SidebarFooter"],"mappings":";;;;;;;;;;;;;;;;;;;AAgDA,IAAM,QAAA,GAAW;AAAA,EACf,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,qEAAA;AAAA,IACT,KAAA,EAAO,uCAAA;AAAA,IACP,WAAA,EAAa,+BAAA;AAAA,IACb,QAAA,EAAU,SAAA;AAAA,IACV,SAAA,EAAW,QAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,8CAAA;AAAA,IACT,KAAA,EAAO,uBAAA;AAAA,IACP,WAAA,EAAa,+BAAA;AAAA,IACb,QAAA,EAAU,QAAA;AAAA,IACV,SAAA,EAAW,QAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,sFAAA;AAAA,IACT,KAAA,EAAO,mHAAA;AAAA,IACP,WAAA,EAAa,sCAAA;AAAA,IACb,QAAA,EAAU,SAAA;AAAA,IACV,SAAA,EAAW,QAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,WAAA;AAAA,IACT,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa,+BAAA;AAAA,IACb,QAAA,EAAU,QAAA;AAAA,IACV,SAAA,EAAW,QAAA;AAAA,IACX,OAAA,EAAS;AAAA;AAEb,CAAA;AAEO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,MAAM,IAAA,GAAO,IAAA;AAAA,EACb,aAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,OAAA,GAAU,SAAA;AAAA,EACV,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,OAAO,CAAA,IAAK,QAAA,CAAS,OAAA;AAErD,EAAA,MAAM,aAAA,GAAgB,CAACA,MAAAA,KAAyD;AAC9E,IAAA,OAAO,OAAOA,MAAAA,KAAU,QAAA,IAAYA,MAAAA,KAAU,QAAQ,MAAA,IAAUA,MAAAA;AAAA,EAClE,CAAA;AAGA,EAAA,IAAI,OAAA,IAAW,CAAC,KAAA,EAAO;AACrB,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,cAAA,CAAe,OAAA,EAAS,6BAAA,EAA+B,SAAS,CAAA,EACjF,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,IAAA,wBAAS,QAAA,EAAA,EAAS,SAAA,EAAW,GAAG,cAAA,CAAe,QAAA,EAAU,YAAY,CAAA,EAAG,CAAA;AAAA,wBACzE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,cAAA,CAAe,OAAA,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAS,WAAU,UAAA,EAAW,CAAA;AAAA,0BAC/B,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,eAAA,EAAgB;AAAA,SAAA,EACtC;AAAA,OAAA,EACF,CAAA;AAAA,MACC,OAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,WAAU,UAAA,EAAW,CAAA;AAAA,wBAC/B,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW;AAAA,OAAA,EACjC;AAAA,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,6BAAA;AAAA,QACA,cAAA,CAAe,OAAA;AAAA,QACf;AAAA,OACF;AAAA,MAGC,QAAA,EAAA;AAAA,QAAA,WAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACZ,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,wBAGF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EAEZ,QAAA,EAAA;AAAA,YAAA,IAAA,oBACC,GAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,yEAAA;AAAA,kBACA,4BAAA;AAAA,kBACA,cAAA,CAAe,QAAA;AAAA,kBACf;AAAA,iBACF;AAAA,gBAEA,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,cAAA,CAAe,SAAA,EAAW;AAAA;AAAA,aAC7C;AAAA,iCAID,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,QAAA,EAAU,cAAA,CAAe,OAAO,CAAA,EACjD,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,QAAG,SAAA,EAAW,EAAA,CAAG,gBAAgB,cAAA,CAAe,KAAK,GACnD,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,gBACC,KAAA,KACC,aAAA,CAAc,KAAK,CAAA,mBACjB,GAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,MAAM,OAAA,IAAW,WAAA;AAAA,oBAC1B,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,KAAA,CAAM,SAAS,CAAA;AAAA,oBAEpC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,iBACT,GAEA,KAAA;AAAA,eAAA,EAGN,CAAA;AAAA,cAEC,+BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,cAAA,CAAe,aAAc,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,cAIxD,QAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACZ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBACnB,IAAA,CAAC,KAAA,EAAA,EAAgB,WAAU,yBAAA,EACxB,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,wBAAQ,GAAA,CAAC,IAAA,CAAK,IAAA,EAAL,EAAU,WAAU,QAAA,EAAS,CAAA;AAAA,gCAC5C,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK;AAAA,eAAA,EAAA,EAFT,KAGV,CACD,CAAA,EACH;AAAA,aAAA,EAEJ;AAAA,WAAA,EACF,CAAA;AAAA,UAGC,OAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAU,qCACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC9B,YAAA,MAAM,eAAA,GAAkB,OAAO,OAAA,IAAW,KAAA;AAC1C,YAAA,MAAM,UAAA,GAAa,OAAA,IAAW,MAAA,CAAO,QAAA,IAAY,eAAA;AACjD,YAAA,MAAM,cAAc,eAAA,GACf,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,OAC9B,MAAA,CAAO,IAAA;AAEX,YAAA,uBACE,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,SAAS,MAAA,CAAO,OAAA;AAAA,gBAChB,QAAA,EAAU,UAAA;AAAA,gBACV,OAAA,EAAS,OAAO,OAAA,IAAW,SAAA;AAAA,gBAC3B,IAAA,EAAM,MAAA,CAAO,IAAA,KAAS,OAAA,KAAY,YAAY,IAAA,GAAO,SAAA,CAAA;AAAA,gBACrD,SAAA,EAAW,EAAA;AAAA,kBACT,YAAY,MAAA,IAAU,2BAAA;AAAA,kBACtB,MAAA,CAAO;AAAA,iBACT;AAAA,gBAEC,QAAA,EAAA;AAAA,kBAAA,MAAA,CAAO,IAAA,IAAQ,OAAO,YAAA,KAAiB,OAAA,wBACrC,MAAA,CAAO,IAAA,EAAP,EAAY,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,kCAEvC,GAAA,CAAC,UAAM,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,kBAClB,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,YAAA,KAAiB,OAAA,wBACrC,MAAA,CAAO,IAAA,EAAP,EAAY,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA,eAAA;AAAA,cAflC;AAAA,aAiBP;AAAA,UAEJ,CAAC,CAAA,EACH;AAAA,SAAA,EAEJ,CAAA;AAAA,QAGC,QAAA,oBACC,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,oBAAA;AAAA,cACA,YAAY,SAAA,IAAa;AAAA,aAC3B;AAAA,YAEC;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ;ACxNO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,SAAA,EAAW,SAAQ,EAAoB;AACzE,EAAA,uBACEC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,uDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,OAAA,EAAQ,CAAA;AAAA,0BAClCA,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,WAAU,kBAAA,EAAmB,CAAA;AAAA,0BAC/DA,GAAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,cAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,KAAA,qBAChBD,IAAAA,CAACE,eAAA,CAAM,UAAN,EACC,QAAA,EAAA;AAAA,4BAAAD,GAAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,IAAA,CAAK,OAAA,GAAU,EAAA,GAAK,iBAAA;AAAA,gBAE9B,QAAA,EAAA,IAAA,CAAK,0BACJA,GAAAA,CAAC,kBAAgB,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,oBAE5BA,GAAAA,CAAC,kBAAe,MAAA,kBAAQA,IAACE,KAAA,EAAA,EAAK,IAAA,EAAM,KAAK,IAAA,IAAQ,GAAA,EAAK,CAAA,EACnD,QAAA,EAAA,IAAA,CAAK,KAAA,EACR;AAAA;AAAA,aAEJ;AAAA,YACC,KAAA,GAAQ,MAAM,MAAA,GAAS,CAAA,oBACtBF,GAAAA,CAAC,mBAAA,EAAA,EAAoB,WAAU,iBAAA,EAAkB;AAAA,WAAA,EAAA,EAbhC,CAAA,WAAA,EAAc,KAAK,CAAA,CAexC,CACD,GACH,CAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;ACzCA,IAAM,OAAA,GAAU;AAAA,EACd,IAAA,EAAM,EAAA;AAAA,EACN,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AA+BO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,OAAA,GAAU;AACZ,CAAA,EAA0B;AAExB,EAAA,MAAM,cAAA,GACJ,cAAc,IAAA,GACV,iBAAA,GACA,OAAO,SAAA,KAAc,QAAA,GACnB,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,GACvB,EAAA;AAER,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,8BAAA,EAAgC,SAAS,GAC1D,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,oCAAA;AAAA,QACA,cAAA;AAAA,QACA,QAAQ,OAAO;AAAA,OACjB;AAAA,MAEC;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AC5DO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,GAAA;AAAA,EACP,SAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,UAAA,EAAW;AACvC,EAAA,MAAM,cAAc,KAAA,KAAU,WAAA;AAE9B,EAAA,uBACEA,GAAAA,CAAC,WAAA,EAAA,EAAY,WACX,QAAA,kBAAAA,GAAAA,CAAC,mBACC,QAAA,kBAAAD,IAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,IAAA;AAAA,MACL,SAAA,EAAU,oCAAA;AAAA,MACV,OAAA,EAAS,WAAA,GAAc,OAAA,IAAW,KAAA,GAAQ,MAAA;AAAA,MAC1C,wBACEC,GAAAA;AAAA,QAACE,KAAAA;AAAA,QAAA;AAAA,UACC,IAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,2CAAA;AAAA,YACA,WAAA,IAAe,CAAC,QAAA,IAAY;AAAA;AAC9B;AAAA,OACF;AAAA,MAGF,QAAA,EAAA;AAAA,wBAAAF,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,kJAAA;AAAA,cACA,WAAA,IAAe,CAAC,QAAA,GAAW,SAAA,GAAY;AAAA,aACzC;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,4CAAA;AAAA,cACA,CAAC,YAAY,WAAA,IAAe;AAAA,aAC9B;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KAEJ,CAAA,EACF,CAAA;AAEJ;ACIO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAwB;AACrE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,MAAM,MAAA,GAAS,CAAA;AACtD,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAEvD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,uBACEA,GAAAA,CAACG,eAAAA,EAAA,EACC,QAAA,kBAAAJ,IAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,YAAA,EAAc,OAAA;AAAA,QACd,SAAA,EAAU,mBAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,MAAA,kBAAQC,GAAAA,CAACI,iBAAAA,EAAA,EAAkB,CAAA;AAAA,cAE1B,QAAA,EAAA;AAAA,gBAAA,IAAA,oBAAQJ,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gCACnCA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,gBACjB,IAAA,CAAK,yBACJA,GAAAA,CAAC,UAAK,SAAA,EAAU,wFAAA,EACb,eAAK,KAAA,EACR,CAAA;AAAA,gCAEFA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,yFAAA,EAA0F;AAAA;AAAA;AAAA,WACpH;AAAA,0BACAA,GAAAA,CAAC,kBAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,KAAA,CAAO,GAAA,CAAI,CAAC,OAAA,EAAS,GAAA,qBACzBA,IAAC,kBAAA,EAAA,EACC,QAAA,kBAAAD,IAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,kBAAQC,GAAAA,CAACE,KAAAA,EAAA,EAAK,IAAA,EAAM,OAAA,CAAQ,GAAA,EAAK,CAAA,EACrD,QAAA,EAAA;AAAA,4BAAAF,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAM,CAAA;AAAA,YACpB,OAAA,CAAQ,yBACPA,GAAAA,CAAC,UAAK,SAAA,EAAU,4BAAA,EACb,kBAAQ,KAAA,EACX;AAAA,WAAA,EAEJ,CAAA,EAAA,EARuB,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAS9D,CACD,CAAA,EACH,CAAA,EACF;AAAA;AAAA;AAAA,KACF,EACF,CAAA;AAAA,EAEJ;AAIA,EAAA,uBACEA,GAAAA,CAACG,eAAAA,EAAA,EACC,QAAA,kBAAAH,GAAAA,CAACE,KAAAA,EAAA,EAAK,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,SAAA,EAAU,UAC9B,QAAA,kBAAAH,IAAAA;AAAA,IAACK,iBAAAA;AAAA,IAAA;AAAA,MACC,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,oBAAQJ,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,wBACnCA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,QACjB,IAAA,CAAK,yBACJA,GAAAA,CAAC,UAAK,SAAA,EAAU,wFAAA,EACb,eAAK,KAAA,EACR;AAAA;AAAA;AAAA,KAGN,CAAA,EACF,CAAA;AAEJ;AAKO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,uBACED,IAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EACX,QAAA,EAAA;AAAA,IAAA,KAAA,oBAASC,GAAAA,CAAC,iBAAA,EAAA,EAAmB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACpCA,IAACK,WAAAA,EAAA,EACE,gBAAM,GAAA,CAAI,CAAC,IAAA,EAAM,GAAA,qBAChBL,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QAEC,IAAA;AAAA,QACA,OAAA,EAAS,MAAM,WAAA,GAAc,IAAI;AAAA,OAAA;AAAA,MAF5B,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,KAI5B,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAKO,SAAS,UAAA,CAAW,EAAE,MAAA,EAAQ,SAAA,EAAW,aAAY,EAAoB;AAC9E,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA,EAChD,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,0BAClBA,GAAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MAEC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb;AAAA,KAAA;AAAA,IAHK,KAAA,CAAM,KAAA,IAAS,CAAA,UAAA,EAAa,KAAK,CAAA;AAAA,GAKzC,CAAA,EACH,CAAA;AAEJ;ACtIA,SAAS,gBAAgB,IAAA,EAAuB;AAC9C,EAAA,IAAI,CAAC,MAAM,OAAO,GAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,GAAG,CAAA;AACnC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AAChE,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,WAAA,EAAY;AAChE;AAMA,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,SAAA,EAAU,EAA2C;AAC/E,EAAA,uBACED,IAAAA,CAAC,MAAA,EAAA,EAAO,WAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS,CAAA,EACnD,QAAA,EAAA;AAAA,oBAAAC,IAAC,WAAA,EAAA,EAAY,GAAA,EAAK,KAAK,MAAA,EAAQ,GAAA,EAAK,KAAK,IAAA,EAAM,CAAA;AAAA,oBAC/CA,IAAC,cAAA,EAAA,EAAe,SAAA,EAAU,iEACvB,QAAA,EAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAC5B;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAK,EAAuB;AAC9C,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,eAAK,IAAA,EAAK,CAAA;AAAA,oBACpDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,eAAK,KAAA,EAAM;AAAA,GAAA,EACvE,CAAA;AAEJ;AAMO,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,YAAY,EAAC;AAAA,EACb,QAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAIM,UAAAA,EAAW;AACvC,EAAA,MAAM,cAAc,KAAA,KAAU,WAAA;AAG9B,EAAA,MAAM,YAAA,GAA+B;AAAA,IACnC;AAAA,MACE,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,eAAA;AAAA,MACN,IAAA,EAAM;AAAA;AACR,GACF;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,YAAA;AAEjD,EAAA,uBACEN,GAAAA,CAACK,WAAAA,EAAA,EAAY,SAAA,EACX,QAAA,kBAAAL,GAAAA,CAACG,eAAAA,EAAA,EACC,QAAA,kBAAAJ,IAAAA,CAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,wBACEC,GAAAA;AAAA,UAACI,iBAAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,WAAA,GAAc,IAAA,CAAK,IAAA,GAAO,MAAA;AAAA,YACnC,SAAA,EAAW,EAAA;AAAA,cACT,sEAAA;AAAA,cACA,WAAA,IAAe,CAAC,QAAA,IAAY;AAAA;AAC9B;AAAA,SACF;AAAA,QAGF,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,cAAW,IAAA,EAAY,CAAA;AAAA,UAAA,CACtB,CAAC,WAAA,IAAe,QAAA,qBAChBD,IAAAA,CAAAQ,UAAA,EACE,QAAA,EAAA;AAAA,4BAAAP,GAAAA,CAAC,YAAS,IAAA,EAAY,CAAA;AAAA,4BACtBA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,gBAAA,EAAiB;AAAA,WAAA,EAC7C;AAAA;AAAA;AAAA,KAEJ;AAAA,oBACAD,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,wCAAA;AAAA,QACV,IAAA,EAAM,WAAW,QAAA,GAAW,OAAA;AAAA,QAC5B,KAAA,EAAM,KAAA;AAAA,QACN,UAAA,EAAY,CAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,iBAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAU,iBAAA,EAC3B,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,cAAW,IAAA,EAAY,CAAA;AAAA,4BACxBA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAY;AAAA,WAAA,EACxB,GACF,CAAA,EACF,CAAA;AAAA,0BACAA,IAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,0BAEvBA,GAAAA,CAAC,iBAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChBD,IAAAA,CAAOS,MAAA,CAAA,QAAA,EAAN,EACE,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,SAAA,IAAa,KAAA,GAAQ,CAAA,oBAAKR,IAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,YACtD,IAAA,CAAK,uBACJD,IAAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,wBAAQC,GAAAA,CAACE,OAAA,EAAK,IAAA,EAAM,KAAK,IAAA,EAAM,CAAA;AAAA,gBAC/B,SAAA,EAAU,0BAAA;AAAA,gBAET,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAK,wBAAQF,GAAAA,CAAC,KAAK,IAAA,EAAL,EAAU,WAAU,cAAA,EAAe,CAAA;AAAA,kBACjD,IAAA,CAAK;AAAA;AAAA;AAAA,gCAGRD,IAAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,SAAS,IAAA,CAAK,OAAA;AAAA,gBACd,SAAA,EAAU,0BAAA;AAAA,gBAET,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAK,wBAAQC,GAAAA,CAAC,KAAK,IAAA,EAAL,EAAU,WAAU,cAAA,EAAe,CAAA;AAAA,kBACjD,IAAA,CAAK;AAAA;AAAA;AAAA;AACR,WAAA,EAAA,EAjBiB,IAAA,CAAK,KAmB1B,CACD,CAAA,EACH,CAAA;AAAA,UAEC,QAAA,oBACCD,IAAAA,CAAAQ,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAP,IAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,4BACvBD,IAAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,QAAA;AAAA,gBACT,SAAA,EAAU,0BAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA;AAErC,WAAA,EACF;AAAA;AAAA;AAAA;AAEJ,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;ACnHA,SAAS,eAAA,CAAgB;AAAA,EACvB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAOG;AACD,EAAA,uBACEA,GAAAA;AAAA,IAACS,mBAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iBAAA;AAAA,MACV,IAAA,EAAM,WAAW,QAAA,GAAW,OAAA;AAAA,MAC5B,KAAA,EAAM,OAAA;AAAA,MACN,UAAA,EAAY,CAAA;AAAA,MAEZ,QAAA,kBAAAV,IAAAA,CAACW,iBAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAV,GAAAA,CAACW,iBAAAA,EAAA,EAAkB,SAAA,EAAU,6CAC1B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QACC,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,UAAA,MAAM,UAAA,GAAa,QAAA,CAAS,EAAA,KAAO,IAAA,CAAK,EAAA;AAExC,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,uBACEX,GAAAA;AAAA,cAACY,gBAAAA;AAAA,cAAA;AAAA,gBAEC,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,gBAC5B,SAAA,EAAU,gBAAA;AAAA,gBAET,QAAA,EAAA,UAAA,CAAW,MAAM,UAAU;AAAA,eAAA;AAAA,cAJvB,IAAA,CAAK;AAAA,aAKZ;AAAA,UAEJ;AAEA,UAAA,uBACEZ,GAAAA;AAAA,YAACY,gBAAAA;AAAA,YAAA;AAAA,cAEC,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,cAC5B,SAAA,EAAU,sBAAA;AAAA,cAEV,QAAA,kBAAAb,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,eAAK,IAAA,EAAK,CAAA;AAAA,kBACzD,UAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAU,gCAAA,EAAiC;AAAA,iBAAA,EAEtD,CAAA;AAAA,gCACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAK,wBACJC,GAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAiC,eAAK,IAAA,EAAK,CAAA;AAAA,kBAE5D,IAAA,CAAK,IAAA,oBACJD,IAAAA,CAAAQ,UAAA,EACG,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAK,wBACJP,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,oCAEnDA,IAACa,KAAAA,EAAA,EAAM,SAAQ,SAAA,EAAU,SAAA,EAAU,sBAAA,EAChC,QAAA,EAAA,IAAA,CAAK,IAAA,EACR;AAAA,mBAAA,EACF,CAAA;AAAA,kBAED,IAAA,CAAK,SAAA,oBACJb,GAAAA,CAACa,KAAAA,EAAA,EAAM,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAA,SAAA,EAE5D,CAAA;AAAA,kBAED,IAAA,CAAK,QAAA,KAAa,KAAA,oBACjBb,GAAAA,CAACa,KAAAA,EAAA,EAAM,OAAA,EAAQ,aAAA,EAAc,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAA,UAAA,EAE9D;AAAA,iBAAA,EAEJ,CAAA;AAAA,gBACC,IAAA,CAAK,4BACJb,GAAAA,CAAC,OAAE,SAAA,EAAU,mDAAA,EACV,eAAK,QAAA,EACR;AAAA,eAAA,EAEJ;AAAA,aAAA;AAAA,YAzCK,IAAA,CAAK;AAAA,WA0CZ;AAAA,QAEJ,CAAC;AAAA,OAAA,EACH;AAAA;AAAA,GACF;AAEJ;AAGA,SAAS,sBAAA,CAAuB,EAAE,WAAA,EAAa,QAAA,EAAS,EAAgD;AACtG,EAAA,uBACEA,IAACK,WAAAA,EAAA,EACC,0BAAAL,GAAAA,CAACG,eAAAA,EAAA,EACC,QAAA,kBAAAJ,IAAAA;AAAA,IAACK,iBAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kCAAA;AAAA,QACA,WAAA,IAAe,CAAC,QAAA,IAAY;AAAA,OAC9B;AAAA,MACA,QAAA,EAAQ,IAAA;AAAA,MAER,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAACc,QAAAA,EAAA,EAAS,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,QAAA,CAChD,CAAC,WAAA,IAAe,QAAA,qBAChBf,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAACc,QAAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,0BAC/Bd,GAAAA,CAACc,QAAAA,EAAA,EAAS,WAAU,YAAA,EAAa;AAAA,SAAA,EACnC;AAAA;AAAA;AAAA,KAGN,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,qBAAA,CAAsB;AAAA,EAC7B,OAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,uBACEf,IAAAA,CAAAQ,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAP,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,IAAA,CACvD,CAAC,WAAA,IAAe,QAAA,qBAChBD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAAA,EAAgC,kBAAQ,IAAA,EAAK,CAAA;AAAA,MACzD,OAAA,CAAQ,wBACPA,GAAAA,CAAC,OAAE,SAAA,EAAU,4CAAA,EACV,kBAAQ,IAAA,EACX;AAAA,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAGA,SAAS,yBAAA,CAA0B,EAAE,IAAA,EAAK,EAA+B;AACvE,EAAA,uBACED,IAAAA;AAAA,IAACgB,MAAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,SAAA;AAAA,MACR,IAAA;AAAA,MACA,WAAW,EAAA,CAAG,OAAA,EAAS,IAAA,KAAS,IAAA,GAAO,QAAQ,KAAK,CAAA;AAAA,MACpD,QAAA,EAAQ,IAAA;AAAA,MAER,QAAA,EAAA;AAAA,wBAAAf,GAAAA,CAACc,QAAAA,EAAA,EAAS,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,wBACzCd,GAAAA,CAACc,QAAAA,EAAA,EAAS,WAAU,UAAA,EAAW;AAAA;AAAA;AAAA,GACjC;AAEJ;AAEA,SAAS,wBAAA,CAAyB;AAAA,EAChC,OAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACEf,IAAAA,CAAAQ,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAP,GAAAA,CAAC,QAAK,SAAA,EAAW,EAAA,CAAG,kCAAkC,IAAA,KAAS,IAAA,GAAO,aAAA,GAAgB,SAAS,CAAA,EAAG,CAAA;AAAA,oBAClGA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,oCAAA,EAAsC,IAAA,KAAS,IAAA,GAAO,SAAA,GAAY,SAAS,CAAA,EAC5F,QAAA,EAAA,OAAA,CAAQ,IAAA,EACX,CAAA;AAAA,IACC,OAAA,CAAQ,IAAA,oBACPD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,gCAAA,EAAkC,IAAA,KAAS,IAAA,GAAO,aAAA,GAAgB,SAAS,CAAA,EAAG,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAC9F,OAAA,CAAQ,IAAA;AAAA,MAAK;AAAA,KAAA,EACjB;AAAA,GAAA,EAEJ,CAAA;AAEJ;AA0BO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,KAAA,GAAQ,gBAAA;AAAA,EACR,MAAM,IAAA,GAAO,SAAA;AAAA,EACb,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,SAAA;AAAA,EACP;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,gBAAA,GAAmB,MAAM,MAAA,GAAS,CAAA;AAGxC,EAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,uBAAOC,GAAAA,CAAC,yBAAA,EAAA,EAA0B,IAAA,EAAY,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,oBAAoB,QAAA,EAAU;AACjC,MAAA,uBACEA,GAAAA;AAAA,QAACe,MAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA;AAAA,UACA,WAAW,EAAA,CAAG,sBAAA,EAAwB,SAAS,IAAA,GAAO,KAAA,GAAQ,OAAO,SAAS,CAAA;AAAA,UAC9E,QAAA,EAAQ,IAAA;AAAA,UAER,0BAAAf,GAAAA,CAAC,wBAAA,EAAA,EAAyB,OAAA,EAAS,QAAA,EAAU,MAAY,IAAA,EAAY;AAAA;AAAA,OACvE;AAAA,IAEJ;AAEA,IAAA,uBACED,IAAAA,CAACiB,YAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAjB,IAAAA;AAAA,QAACkB,mBAAAA;AAAA,QAAA;AAAA,UACC,wBACEjB,GAAAA;AAAA,YAACe,MAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA;AAAA,cACA,WAAW,EAAA,CAAG,OAAA,EAAS,SAAS,IAAA,GAAO,KAAA,GAAQ,OAAO,SAAS;AAAA;AAAA,WACjE;AAAA,UAGF,QAAA,EAAA;AAAA,4BAAAf,GAAAA,CAAC,wBAAA,EAAA,EAAyB,OAAA,EAAS,QAAA,EAAU,MAAY,IAAA,EAAY,CAAA;AAAA,4BACrEA,GAAAA,CAACkB,cAAAA,EAAA,EAAe,SAAA,EAAW,EAAA,CAAG,gCAAA,EAAkC,IAAA,KAAS,IAAA,GAAO,SAAA,GAAY,aAAa,CAAA,EAAG;AAAA;AAAA;AAAA,OAC9G;AAAA,sBACAlB,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAIM,UAAAA,EAAW;AACvC,EAAA,MAAM,cAAc,KAAA,KAAU,WAAA;AAE9B,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAON,GAAAA,CAAC,sBAAA,EAAA,EAAuB,WAAA,EAA0B,QAAA,EAAoB,CAAA;AAAA,EAC/E;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,oBAAoB,QAAA,EAAU;AACjC,IAAA,uBACEA,IAACK,WAAAA,EAAA,EAAY,WACX,QAAA,kBAAAL,GAAAA,CAACG,eAAAA,EAAA,EACC,QAAA,kBAAAH,GAAAA;AAAA,MAACI,iBAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,kCAAA;AAAA,UACA,WAAA,IAAe,CAAC,QAAA,IAAY;AAAA,SAC9B;AAAA,QACA,OAAA,EAAS,WAAA,GAAc,QAAA,CAAS,IAAA,GAAO,MAAA;AAAA,QACvC,QAAA,EAAQ,IAAA;AAAA,QAER,QAAA,kBAAAJ,GAAAA;AAAA,UAAC,qBAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,QAAA;AAAA,YACT,IAAA;AAAA,YACA,WAAA;AAAA,YACA;AAAA;AAAA;AACF;AAAA,OAEJ,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA,CAACK,WAAAA,EAAA,EAAY,SAAA,EACX,QAAA,kBAAAL,GAAAA,CAACG,eAAAA,EAAA,EACC,QAAA,kBAAAJ,IAAAA,CAACiB,YAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAjB,IAAAA;AAAA,MAACkB,mBAAAA;AAAA,MAAA;AAAA,QACC,wBACEjB,GAAAA;AAAA,UAACI,iBAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,4EAAA;AAAA,cACA,WAAA,IAAe,CAAC,QAAA,IAAY;AAAA,aAC9B;AAAA,YACA,OAAA,EAAS,WAAA,GAAc,QAAA,CAAS,IAAA,GAAO;AAAA;AAAA,SACzC;AAAA,QAGF,QAAA,EAAA;AAAA,0BAAAJ,GAAAA;AAAA,YAAC,qBAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,QAAA;AAAA,cACT,IAAA;AAAA,cACA,WAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,UAAA,CACE,CAAC,eAAe,QAAA,qBAChBA,IAACkB,cAAAA,EAAA,EAAe,WAAU,wCAAA,EAAyC;AAAA;AAAA;AAAA,KAEvE;AAAA,oBACAlB,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;AC1XA,SAAS,aAAA,CAAc,EAAE,KAAA,EAAM,EAAgC;AAC7D,EAAA,uBACEA,GAAAA,CAACmB,UAAAA,EAAA,EACC,QAAA,kBAAAnB,IAACoB,cAAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChBrB,IAAAA,CAAOsB,iBAAN,EACC,QAAA,EAAA;AAAA,oBAAArB,GAAAA,CAACsB,cAAAA,EAAA,EAAe,SAAA,EAAW,KAAK,OAAA,GAAU,EAAA,GAAK,iBAAA,EAC5C,QAAA,EAAA,IAAA,CAAK,OAAA,mBACJtB,GAAAA,CAACuB,cAAAA,EAAA,EAAgB,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA,mBAE5BvB,GAAAA,CAACwB,cAAAA,EAAA,EAAe,MAAA,kBAAQxB,GAAAA,CAACE,KAAAA,EAAA,EAAK,IAAA,EAAM,KAAK,IAAA,IAAQ,GAAA,EAAK,CAAA,EACnD,QAAA,EAAA,IAAA,CAAK,OACR,CAAA,EAEJ,CAAA;AAAA,IACC,KAAA,GAAQ,MAAM,MAAA,GAAS,CAAA,oBACtBF,GAAAA,CAACyB,mBAAAA,EAAA,EAAoB,SAAA,EAAU,iBAAA,EAAkB;AAAA,GAAA,EAAA,EAXhC,CAAA,WAAA,EAAc,KAAK,CAAA,CAaxC,CACD,GACH,CAAA,EACF,CAAA;AAEJ;AAMO,SAAS,eAAA,CAAgB;AAAA,EAC9B,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA,GAAqB,IAAA;AAAA,EACrB,SAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,uBACE1B,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,uDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,kBAAA,oBACCA,IAAAA,CAAAQ,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAP,GAAAA,CAAC0B,cAAAA,EAAA,EAAe,SAAA,EAAU,OAAA,EAAQ,CAAA;AAAA,4BAClC1B,GAAAA,CAAC2B,SAAAA,EAAA,EAAU,WAAA,EAAY,UAAA,EAAW,WAAU,UAAA,EAAW;AAAA,WAAA,EACzD,CAAA;AAAA,UAGD,QAAA,GACC,QAAA,mBAEA5B,IAAAA,CAAAQ,UAAA,EACG,QAAA,EAAA;AAAA,YAAA,WAAA,IAAe,YAAY,MAAA,GAAS,CAAA,oBACnCP,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAO,WAAA,EAAa,CAAA;AAAA,YAEpC;AAAA,WAAA,EACH;AAAA,SAAA,EAEJ,CAAA;AAAA,QAEC,gCAAgBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA2B,QAAA,EAAA,YAAA,EAAa;AAAA;AAAA;AAAA,GAC1E;AAEJ;ACxCO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,UAAA;AAAA,EACA,mBAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA,GAAY,iBAAA;AAAA,EACZ,SAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,QAAA,EAAS,GAAIM,UAAAA,EAAW;AAEhC,EAAA,uBACEP,IAAAA,CAAC,OAAA,EAAA,EAAQ,SAAQ,OAAA,EAAQ,WAAA,EAAY,QAAO,SAAA,EAEzC,QAAA,EAAA;AAAA,IAAA,QAAA,oBACCA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EACd,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,cAAY,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,sBACvBA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,QAAA,EAAA,oEAAA,EAElB;AAAA,KAAA,EACF,CAAA;AAAA,oBAGFD,IAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,OAAA,EACvB,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,MAAM,KAAA,CAAM;AAAA;AAAA,OACd;AAAA,MACC,2BACCA,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,UACnB,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,MAAM,OAAA,CAAQ;AAAA;AAAA,OAChB;AAAA,MAED;AAAA,KAAA,EACH,CAAA;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EACE,sCACCD,IAAAA,CAAAQ,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAP,GAAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,MAC/B,uCACCA,GAAAA,CAAC,cAAW,MAAA,EAAQ,mBAAA,EAAqB,WAAU,SAAA,EAAU;AAAA,KAAA,EAEjE,CAAA,EAEJ,CAAA;AAAA,IAEC,IAAA,oBACCA,GAAAA,CAAC,aAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,UAAU,IAAA,CAAK;AAAA;AAAA,KACjB,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AChDA,IAAM,kBAAA,GAAqB,QAAA;AAC3B,IAAM,mBAAA,GAAsB,OAAA;AAC5B,IAAM,sBAAA,GAAyB,SAAA;AAC/B,IAAM,uBAAA,GAA0B,QAAA;AAChC,IAAM,eAAA,GAAkB,QAAA;AAGxB,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EAAS,YAAA;AAAA,EACT,IAAA,EAAM,8BAAA;AAAA,EACN,OAAA,EAAS,YAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,gBAAA,GAAmB;AAAA,EACvB,OAAA,EAAS,yBAAA;AAAA,EACT,IAAA,EAAM,eAAA;AAAA,EACN,OAAA,EAAS,yBAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAUO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA,GAAmB,KAAA;AAAA,EACnB,WAAA,GAAc,SAAA;AAAA,EACd,SAAA,GAAY,iBAAA;AAAA,EACZ;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAU,MAAA,CAAA,QAAA;AAAA,IAChD,sBAAsB,UAAA,CAAW,MAAA,GAAS,IAAI,UAAA,CAAW,CAAC,EAAE,EAAA,GAAK,IAAA;AAAA,GACnE;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,MAAA,CAAA,QAAA,CAAS,CAAC,gBAAgB,CAAA;AACpE,EAAA,MAAM,EAAE,QAAA,EAAS,GAAIM,UAAAA,EAAW;AAEhC,EAAA,MAAM,oBAAA,GAAuB,CAAC,EAAA,KAAe;AAC3C,IAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,IAAA,gBAAA,GAAmB,EAAE,CAAA;AAErB,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,aAAA,CAAc,CAAC,UAAU,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,kBAAA,GACJ,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,cAAc,CAAA,IAAK,IAAA;AAErD,EAAA,MAAM,YAAA,GAAe,aAAa,sBAAA,GAAyB,uBAAA;AAC3D,EAAA,MAAM,UAAA,GAAa,CAAA,KAAA,EAAQ,YAAY,CAAA,GAAA,EAAM,eAAe,CAAA,KAAA,CAAA;AAE5D,EAAA,uBACEN,GAAAA,CAAAO,QAAAA,EAAA,EAEE,QAAA,kBAAAR,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oDAAA;AAAA,MACV,YAAA,EAAW,UAAA;AAAA,MACX,kBAAA,EAAiB,EAAA;AAAA,MACjB,cAAA,EAAa,OAAA;AAAA,MACb,WAAA,EAAU,MAAA;AAAA,MACV,WAAA,EAAU,SAAA;AAAA,MAGV,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,aAAA;AAAA,YACV,SAAA,EAAU,qEAAA;AAAA,YACV,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA;AAAW;AAAA,SAC7B;AAAA,wBAGAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,mBAAA;AAAA,YACV,SAAA,EAAW,EAAA;AAAA,cACT,8FAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,UAAA;AAAA,cACP,OAAA,EAAS;AAAA,aACX;AAAA,YAGA,QAAA,kBAAAD,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,cAAA,EAAa,SAAA;AAAA,gBACb,WAAA,EAAU,eAAA;AAAA,gBACV,SAAA,EAAU,0GAAA;AAAA,gBAGT,QAAA,EAAA;AAAA,kBAAA,QAAA,oBACCA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EACd,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC4B,UAAAA,EAAA,EAAY,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,oCACvB5B,GAAAA,CAAC6B,gBAAAA,EAAA,EAAiB,QAAA,EAAA,0DAAA,EAElB;AAAA,mBAAA,EACF,CAAA;AAAA,kCAIF9B,IAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAW,EAAA;AAAA,wBACT,0CAAA;AAAA,wBACA,aAAa,WAAW,CAAA;AAAA,wBACxB,iBAAiB,WAAW,CAAA;AAAA,wBAC5B,UAAA,IAAc;AAAA,uBAChB;AAAA,sBACA,KAAA,EAAO,EAAE,KAAA,EAAO,kBAAA,EAAoB,UAAU,kBAAA,EAAmB;AAAA,sBAGjE,QAAA,EAAA;AAAA,wCAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,kBAAAD,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,0CAAAC,GAAAA;AAAA,4BAAC,cAAA;AAAA,4BAAA;AAAA,8BACC,wBACEA,GAAAA;AAAA,gCAACE,KAAAA;AAAA,gCAAA;AAAA,kCACC,IAAA,EAAM,MAAM,IAAA,IAAQ,GAAA;AAAA,kCACpB,SAAA,EAAW,EAAA;AAAA,oCACT,mFAAA;AAAA,oCACA,WAAA,KAAgB,MAAA,IAAU,WAAA,KAAgB,SAAA,GACtC,4CAAA,GACA;AAAA;AACN;AAAA,+BACF;AAAA,8BAGD,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,2BACT;AAAA,0CACAF,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,OAAA,EAAS,gBAAM,KAAA,EAAM;AAAA,yBAAA,EAC5C,CAAA,EACF,CAAA;AAAA,wCAGAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,QAAA,KAAa;AAC5B,0BAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,0BAAA,MAAM,QAAA,GAAW,mBAAmB,QAAA,CAAS,EAAA;AAE7C,0BAAA,uBACED,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,4CAAAC,GAAAA;AAAA,8BAAC,cAAA;AAAA,8BAAA;AAAA,gCACC,wBACEA,GAAAA;AAAA,kCAAC,QAAA;AAAA,kCAAA;AAAA,oCACC,OAAA,EAAS,MAAM,oBAAA,CAAqB,QAAA,CAAS,EAAE,CAAA;AAAA,oCAC/C,SAAA,EAAW,EAAA;AAAA,sCACT,yEAAA;AAAA,sCACA,QAAA,GACI,WAAA,KAAgB,MAAA,IAAU,WAAA,KAAgB,SAAA,GACxC,aAAA,GACA,kDAAA,GACF,WAAA,KAAgB,MAAA,IAAU,WAAA,KAAgB,SAAA,GACxC,mBAAA,GACA;AAAA;AACR;AAAA,iCACF;AAAA,gCAGF,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,6BAC5B;AAAA,4CACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,OAAA,EAAS,mBAAS,IAAA,EAAK;AAAA,2BAAA,EAAA,EApBhC,SAAS,EAqBvB,CAAA;AAAA,wBAEJ,CAAC,CAAA,EACH,CAAA;AAAA,wCAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,KAAA,EACb,QAAA,kBAAAD,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,0CAAAC,GAAAA;AAAA,4BAAC,cAAA;AAAA,4BAAA;AAAA,8BACC,wBACEA,GAAAA;AAAA,gCAAC,QAAA;AAAA,gCAAA;AAAA,kCACC,OAAA,EAAS,cAAA;AAAA,kCACT,SAAA,EAAW,EAAA;AAAA,oCACT,yEAAA;AAAA,oCACA,WAAA,KAAgB,MAAA,IAAU,WAAA,KAAgB,SAAA,GACtC,mBAAA,GACA;AAAA;AACN;AAAA,+BACF;AAAA,8BAGD,QAAA,EAAA,UAAA,mBACCA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,CAAA,mBAEjCA,GAAAA,CAAC8B,YAAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,2BAEtC;AAAA,0CACA9B,GAAAA,CAAC,cAAA,EAAA,EAAe,MAAK,OAAA,EAClB,QAAA,EAAA,UAAA,GAAa,qBAAqB,gBAAA,EACrC;AAAA,yBAAA,EACF,CAAA,EACF;AAAA;AAAA;AAAA,mBACF;AAAA,kCAGAA,GAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAW,EAAA;AAAA,wBACT,8FAAA;AAAA,wBACA,aAAa,aAAA,GAAgB;AAAA,uBAC/B;AAAA,sBACA,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,GAAa,sBAAsB,CAAA,EAAE;AAAA,sBAEpD,QAAA,EAAA,kBAAA,mBACCD,IAAAA,CAAAQ,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wCAAAP,GAAAA,CAAC+B,eAAA,EAAc,SAAA,EAAU,uEACvB,QAAA,kBAAAhC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0CAAAC,GAAAA,CAAC,kBAAA,CAAmB,IAAA,EAAnB,EAAwB,WAAU,iCAAA,EAAkC,CAAA;AAAA,0CACrEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EACb,6BAAmB,IAAA,EACtB;AAAA,yBAAA,EACF,CAAA,EACF,CAAA;AAAA,wCAEAA,GAAAA,CAACgC,cAAAA,EAAA,EAAe,SAAA,EAAU,wBAAA,EACxB,QAAA,kBAAAjC,IAAAA,CAACkC,YAAAA,EAAA,EAAa,SAAA,EAAU,KAAA,EACtB,QAAA,EAAA;AAAA,0CAAAlC,IAAAA,CAACmC,iBAAAA,EAAA,EAAkB,SAAA,EAAU,yCAAA,EAC1B,QAAA,EAAA;AAAA,4BAAA,kBAAA,CAAmB,IAAA;AAAA,4BAAK;AAAA,2BAAA,EAC3B,CAAA;AAAA,0CACAlC,IAACK,WAAAA,EAAA,EACE,6BAAmB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC3C,4BAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,4BAAA,uBACEL,GAAAA;AAAA,8BAACG,eAAAA;AAAA,8BAAA;AAAA,gCAGC,QAAA,kBAAAJ,IAAAA;AAAA,kCAACK,iBAAAA;AAAA,kCAAA;AAAA,oCACC,UAAU,IAAA,CAAK,QAAA;AAAA,oCACf,wBAAQJ,GAAAA,CAACE,OAAA,EAAK,IAAA,EAAM,KAAK,GAAA,EAAK,CAAA;AAAA,oCAE7B,QAAA,EAAA;AAAA,sCAAA,IAAA,oBAAQF,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sDACnCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,eAAK,KAAA,EAAM,CAAA;AAAA,sCACtC,IAAA,CAAK,yBACJA,GAAAA,CAAC,UAAK,SAAA,EAAU,iGAAA,EACb,eAAK,KAAA,EACR;AAAA;AAAA;AAAA;AAEJ,+BAAA;AAAA,8BAbK,GAAG,kBAAA,CAAmB,EAAE,IAAI,IAAA,CAAK,KAAK,IAAI,GAAG,CAAA;AAAA,6BAcpD;AAAA,0BAEJ,CAAC,CAAA,EACH;AAAA,yBAAA,EACF,CAAA,EACF,CAAA;AAAA,wBAEC,wBACCA,GAAAA,CAACmC,eAAA,EAAc,SAAA,EAAU,2CACvB,QAAA,kBAAAnC,GAAAA;AAAA,0BAAC,eAAA;AAAA,0BAAA;AAAA,4BACC,MAAM,IAAA,CAAK,IAAA;AAAA,4BACX,WAAW,IAAA,CAAK,SAAA;AAAA,4BAChB,UAAU,IAAA,CAAK;AAAA;AAAA,yBACjB,EACF;AAAA,uBAAA,EAEJ,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAA6E,QAAA,EAAA,mBAAA,EAE5F;AAAA;AAAA;AAEJ;AAAA;AAAA;AACF;AAAA;AACF;AAAA;AAAA,GACF,EACF,CAAA;AAEJ","file":"dashboard.js","sourcesContent":["\"use client\";\r\n\r\nimport type { LucideIcon } from \"lucide-react\";\r\nimport type { ReactNode } from \"react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { Badge } from \"@/components/ui/badge\";\r\nimport { Skeleton } from \"@/components/ui/skeleton\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface HeaderAction {\r\n text: string;\r\n onClick?: () => void;\r\n disabled?: boolean;\r\n variant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\";\r\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\r\n className?: string;\r\n icon?: LucideIcon;\r\n iconPosition?: \"left\" | \"right\";\r\n loadingText?: string;\r\n loading?: boolean;\r\n}\r\n\r\nexport interface HeaderBadge {\r\n text: string;\r\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"outline\";\r\n className?: string;\r\n}\r\n\r\nexport interface HeaderMetadata {\r\n text: string;\r\n icon?: LucideIcon;\r\n}\r\n\r\nexport interface HeaderSectionProps {\r\n title?: string;\r\n description?: string;\r\n actions?: HeaderAction[] | null;\r\n icon?: LucideIcon | null;\r\n iconClassName?: string;\r\n loading?: boolean;\r\n variant?: \"default\" | \"compact\" | \"hero\" | \"minimal\";\r\n className?: string;\r\n badge?: HeaderBadge | ReactNode;\r\n breadcrumbs?: ReactNode;\r\n metadata?: HeaderMetadata[];\r\n children?: ReactNode;\r\n}\r\n\r\nconst variants = {\r\n default: {\r\n wrapper: \"px-6 py-5 rounded-xl shadow-sm border bg-background hover:shadow-md\",\r\n title: \"text-2xl font-semibold tracking-tight\",\r\n description: \"text-sm text-muted-foreground\",\r\n iconSize: \"size-10\",\r\n iconInner: \"size-5\",\r\n spacing: \"space-y-1\",\r\n },\r\n compact: {\r\n wrapper: \"px-4 py-3 rounded-lg border bg-background/50\",\r\n title: \"text-lg font-semibold\",\r\n description: \"text-xs text-muted-foreground\",\r\n iconSize: \"size-8\",\r\n iconInner: \"size-4\",\r\n spacing: \"space-y-0.5\",\r\n },\r\n hero: {\r\n wrapper: \"px-8 py-8 rounded-2xl shadow-lg border bg-gradient-to-br from-background to-muted/20\",\r\n title: \"text-3xl font-bold tracking-tight bg-gradient-to-r from-foreground to-foreground/70 bg-clip-text text-transparent\",\r\n description: \"text-base text-muted-foreground mt-2\",\r\n iconSize: \"size-14\",\r\n iconInner: \"size-7\",\r\n spacing: \"space-y-2\",\r\n },\r\n minimal: {\r\n wrapper: \"px-0 py-2\",\r\n title: \"text-xl font-medium\",\r\n description: \"text-sm text-muted-foreground\",\r\n iconSize: \"size-8\",\r\n iconInner: \"size-4\",\r\n spacing: \"space-y-0.5\",\r\n },\r\n} as const;\r\n\r\nexport function HeaderSection({\r\n title,\r\n description,\r\n actions = null,\r\n icon: Icon = null,\r\n iconClassName,\r\n loading = false,\r\n variant = \"default\",\r\n className,\r\n badge,\r\n breadcrumbs,\r\n metadata,\r\n children,\r\n}: HeaderSectionProps) {\r\n const currentVariant = variants[variant] || variants.default;\r\n\r\n const isBadgeObject = (badge: HeaderBadge | ReactNode): badge is HeaderBadge => {\r\n return typeof badge === \"object\" && badge !== null && \"text\" in badge;\r\n };\r\n\r\n // Loading state\r\n if (loading && !title) {\r\n return (\r\n <div className={cn(currentVariant.wrapper, \"transition-all duration-300\", className)}>\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n {Icon && <Skeleton className={cn(currentVariant.iconSize, \"rounded-lg\")} />}\r\n <div className={currentVariant.spacing}>\r\n <Skeleton className=\"h-7 w-48\" />\r\n <Skeleton className=\"h-4 w-64 mt-1\" />\r\n </div>\r\n </div>\r\n {actions && (\r\n <div className=\"flex gap-2 mt-4 sm:mt-0\">\r\n <Skeleton className=\"h-9 w-24\" />\r\n <Skeleton className=\"h-9 w-24\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"transition-all duration-300\",\r\n currentVariant.wrapper,\r\n className\r\n )}\r\n >\r\n {/* Breadcrumbs */}\r\n {breadcrumbs && (\r\n <nav className=\"mb-3 text-sm text-muted-foreground\">\r\n {breadcrumbs}\r\n </nav>\r\n )}\r\n\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\r\n <div className=\"flex items-start sm:items-center gap-4\">\r\n {/* Icon */}\r\n {Icon && (\r\n <div\r\n className={cn(\r\n \"flex aspect-square items-center justify-center rounded-lg flex-shrink-0\",\r\n \"bg-primary/10 text-primary\",\r\n currentVariant.iconSize,\r\n iconClassName\r\n )}\r\n >\r\n <Icon className={currentVariant.iconInner} />\r\n </div>\r\n )}\r\n\r\n {/* Title and Description */}\r\n <div className={cn(\"flex-1\", currentVariant.spacing)}>\r\n <div className=\"flex items-center gap-2 flex-wrap\">\r\n <h1 className={cn(\"leading-none\", currentVariant.title)}>\r\n {title}\r\n </h1>\r\n {badge && (\r\n isBadgeObject(badge) ? (\r\n <Badge\r\n variant={badge.variant || \"secondary\"}\r\n className={cn(\"ml-2\", badge.className)}\r\n >\r\n {badge.text}\r\n </Badge>\r\n ) : (\r\n badge\r\n )\r\n )}\r\n </div>\r\n\r\n {description && (\r\n <p className={currentVariant.description}>{description}</p>\r\n )}\r\n\r\n {/* Metadata */}\r\n {metadata && (\r\n <div className=\"flex items-center gap-4 mt-2 text-xs text-muted-foreground\">\r\n {metadata.map((item, index) => (\r\n <div key={index} className=\"flex items-center gap-1\">\r\n {item.icon && <item.icon className=\"size-3\" />}\r\n <span>{item.text}</span>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n {actions && (\r\n <div className=\"flex flex-wrap gap-2 mt-4 sm:mt-0\">\r\n {actions.map((action, index) => {\r\n const isActionLoading = action.loading ?? false;\r\n const isDisabled = loading || action.disabled || isActionLoading;\r\n const displayText = isActionLoading\r\n ? (action.loadingText || action.text)\r\n : action.text;\r\n\r\n return (\r\n <Button\r\n key={index}\r\n onClick={action.onClick}\r\n disabled={isDisabled}\r\n variant={action.variant || \"default\"}\r\n size={action.size || (variant === \"compact\" ? \"sm\" : \"default\")}\r\n className={cn(\r\n variant === \"hero\" && \"shadow-md hover:shadow-lg\",\r\n action.className\r\n )}\r\n >\r\n {action.icon && action.iconPosition !== \"right\" && (\r\n <action.icon className=\"size-4 mr-2\" />\r\n )}\r\n <span>{displayText}</span>\r\n {action.icon && action.iconPosition === \"right\" && (\r\n <action.icon className=\"size-4 ml-2\" />\r\n )}\r\n </Button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Additional content slot */}\r\n {children && (\r\n <div\r\n className={cn(\r\n \"mt-4 pt-4 border-t\",\r\n variant === \"minimal\" && \"border-0 pt-2\"\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport Link from \"next/link\";\r\nimport {\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from \"@/components/ui/breadcrumb\";\r\nimport { Separator } from \"@/components/ui/separator\";\r\nimport { SidebarTrigger } from \"@/components/ui/sidebar\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface BreadcrumbItemData {\r\n label: string;\r\n href?: string;\r\n current?: boolean;\r\n}\r\n\r\nexport interface PageHeaderProps {\r\n items: BreadcrumbItemData[];\r\n className?: string;\r\n actions?: React.ReactNode;\r\n}\r\n\r\nexport function PageHeader({ items, className, actions }: PageHeaderProps) {\r\n return (\r\n <header\r\n className={cn(\r\n \"flex h-12 shrink-0 items-center justify-between gap-2\",\r\n className,\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <SidebarTrigger className=\"-ml-1\" />\r\n <Separator orientation=\"vertical\" className=\"!self-center h-4\" />\r\n <Breadcrumb>\r\n <BreadcrumbList>\r\n {items.map((item, index) => (\r\n <React.Fragment key={`breadcrumb-${index}`}>\r\n <BreadcrumbItem\r\n className={item.current ? \"\" : \"hidden md:block\"}\r\n >\r\n {item.current ? (\r\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\r\n ) : (\r\n <BreadcrumbLink render={<Link href={item.href || \"#\"} />}>\r\n {item.label}\r\n </BreadcrumbLink>\r\n )}\r\n </BreadcrumbItem>\r\n {index < items.length - 1 && (\r\n <BreadcrumbSeparator className=\"hidden md:block\" />\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n </div>\r\n {actions}\r\n </header>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface DashboardContentProps {\r\n /** Content to render inside the dashboard area */\r\n children: React.ReactNode;\r\n /** Additional className for the outer wrapper */\r\n className?: string;\r\n /** Enable @container queries on the content area */\r\n container?: boolean | string;\r\n /** Horizontal padding — defaults to \"md\" */\r\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\n// ============================================================================\r\n// PADDING MAP\r\n// ============================================================================\r\n\r\nconst PADDING = {\r\n none: \"\",\r\n sm: \"px-2\",\r\n md: \"px-4\",\r\n lg: \"px-6 lg:px-8\",\r\n} as const;\r\n\r\n// ============================================================================\r\n// DASHBOARD CONTENT\r\n// ============================================================================\r\n\r\n/**\r\n * DashboardContent — Safe content wrapper for sidebar layouts.\r\n *\r\n * Prevents the classic flexbox overflow bug where children with\r\n * `max-w-*` or grid layouts extend beyond the available space\r\n * (behind the sidebar) by propagating `min-w-0` through the\r\n * flex chain.\r\n *\r\n * **Important**: `SidebarInset` also needs `min-w-0` for the\r\n * width constraint to propagate correctly from the flex parent.\r\n * Pass `className=\"min-w-0\"` to `SidebarInset`.\r\n *\r\n * @example\r\n * ```tsx\r\n * <SidebarProvider>\r\n * <AppSidebar />\r\n * <SidebarInset className=\"min-w-0\">\r\n * <DashboardContent>\r\n * <PageHeader items={breadcrumbs} />\r\n * <MyPageContent />\r\n * </DashboardContent>\r\n * </SidebarInset>\r\n * </SidebarProvider>\r\n * ```\r\n */\r\nexport function DashboardContent({\r\n children,\r\n className,\r\n container = true,\r\n padding = \"md\",\r\n}: DashboardContentProps) {\r\n // Build @container attribute\r\n const containerClass =\r\n container === true\r\n ? \"@container/main\"\r\n : typeof container === \"string\"\r\n ? `@container/${container}`\r\n : \"\";\r\n\r\n return (\r\n <div className={cn(\"flex flex-1 flex-col min-w-0\", className)}>\r\n <div\r\n className={cn(\r\n \"flex flex-1 flex-col gap-2 min-w-0\",\r\n containerClass,\r\n PADDING[padding],\r\n )}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport Link from \"next/link\";\r\nimport {\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n useSidebar,\r\n} from \"@/components/ui/sidebar\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface SidebarBrandProps {\r\n /** Brand title text */\r\n title: string;\r\n /** Brand icon/logo element */\r\n icon: React.ReactNode;\r\n /** Link href (defaults to \"/\") */\r\n href?: string;\r\n /** Additional className */\r\n className?: string;\r\n /** Tooltip text when collapsed (defaults to title) */\r\n tooltip?: string;\r\n}\r\n\r\n/**\r\n * SidebarBrand - Logo and title section for dashboard sidebar.\r\n * Automatically handles collapsed state styling.\r\n */\r\nexport function SidebarBrand({\r\n title,\r\n icon,\r\n href = \"/\",\r\n className,\r\n tooltip,\r\n}: SidebarBrandProps) {\r\n const { isMobile, state } = useSidebar();\r\n const isCollapsed = state === \"collapsed\";\r\n\r\n return (\r\n <SidebarMenu className={className}>\r\n <SidebarMenuItem>\r\n <SidebarMenuButton\r\n size=\"lg\"\r\n className=\"group-data-[collapsible=icon]:p-0!\"\r\n tooltip={isCollapsed ? tooltip || title : undefined}\r\n render={\r\n <Link\r\n href={href}\r\n className={cn(\r\n \"flex items-center text-sidebar-foreground\",\r\n isCollapsed && !isMobile && \"justify-center\",\r\n )}\r\n />\r\n }\r\n >\r\n <div\r\n className={cn(\r\n \"rounded-lg flex items-center justify-center bg-sidebar-primary text-sidebar-primary-foreground shadow-sm flex-shrink-0 transition-[width,height]\",\r\n isCollapsed && !isMobile ? \"h-6 w-6\" : \"h-8 w-8\",\r\n )}\r\n >\r\n {icon}\r\n </div>\r\n <span\r\n className={cn(\r\n \"ml-2 font-semibold tracking-tight truncate\",\r\n !isMobile && isCollapsed && \"hidden\",\r\n )}\r\n >\r\n {title}\r\n </span>\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport Link from \"next/link\";\r\nimport { ChevronRight, type LucideIcon } from \"lucide-react\";\r\nimport {\r\n SidebarGroup,\r\n SidebarGroupLabel,\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarMenuSub,\r\n SidebarMenuSubButton,\r\n SidebarMenuSubItem,\r\n} from \"@/components/ui/sidebar\";\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from \"@/components/ui/collapsible\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface NavSubItem {\r\n title: string;\r\n url: string;\r\n badge?: string | number;\r\n}\r\n\r\nexport interface NavItem {\r\n title: string;\r\n url: string;\r\n icon?: LucideIcon;\r\n isActive?: boolean;\r\n badge?: string | number;\r\n items?: NavSubItem[];\r\n}\r\n\r\nexport interface NavGroup {\r\n title?: string;\r\n items: NavItem[];\r\n}\r\n\r\nexport interface SidebarNavProps {\r\n /** Navigation groups to render */\r\n groups: NavGroup[];\r\n /** Additional className */\r\n className?: string;\r\n /** Callback when a nav item is clicked */\r\n onItemClick?: (item: NavItem) => void;\r\n}\r\n\r\nexport interface SidebarNavGroupProps {\r\n /** Group title (optional) */\r\n title?: string;\r\n /** Navigation items in this group */\r\n items: NavItem[];\r\n /** Additional className */\r\n className?: string;\r\n /** Callback when an item is clicked */\r\n onItemClick?: (item: NavItem) => void;\r\n}\r\n\r\nexport interface SidebarNavItemProps {\r\n /** The navigation item data */\r\n item: NavItem;\r\n /** Callback when clicked */\r\n onClick?: () => void;\r\n}\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\n/**\r\n * SidebarNavItem - Single navigation item with optional sub-items.\r\n */\r\nexport function SidebarNavItem({ item, onClick }: SidebarNavItemProps) {\r\n const hasSubItems = item.items && item.items.length > 0;\r\n const Icon = item.icon;\r\n // Use controlled state to avoid Base UI warning about changing defaultOpen\r\n const [open, setOpen] = useState(item.isActive ?? false);\r\n\r\n if (hasSubItems) {\r\n return (\r\n <SidebarMenuItem>\r\n <Collapsible\r\n open={open}\r\n onOpenChange={setOpen}\r\n className=\"group/collapsible\"\r\n >\r\n <CollapsibleTrigger\r\n render={<SidebarMenuButton />}\r\n >\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n <span>{item.title}</span>\r\n {item.badge && (\r\n <span className=\"ml-auto text-xs bg-sidebar-accent text-sidebar-accent-foreground px-1.5 py-0.5 rounded\">\r\n {item.badge}\r\n </span>\r\n )}\r\n <ChevronRight className=\"ml-auto h-4 w-4 transition-transform duration-200 group-data-open/collapsible:rotate-90\" />\r\n </CollapsibleTrigger>\r\n <CollapsibleContent>\r\n <SidebarMenuSub>\r\n {item.items!.map((subItem, idx) => (\r\n <SidebarMenuSubItem key={`${item.title}-${subItem.title}-${idx}`}>\r\n <SidebarMenuSubButton render={<Link href={subItem.url} />}>\r\n <span>{subItem.title}</span>\r\n {subItem.badge && (\r\n <span className=\"ml-auto text-xs opacity-60\">\r\n {subItem.badge}\r\n </span>\r\n )}\r\n </SidebarMenuSubButton>\r\n </SidebarMenuSubItem>\r\n ))}\r\n </SidebarMenuSub>\r\n </CollapsibleContent>\r\n </Collapsible>\r\n </SidebarMenuItem>\r\n );\r\n }\r\n\r\n // Note: Cannot use tooltip prop with render prop together in shadcn's SidebarMenuButton\r\n // as tooltip replaces the render element. Navigation takes priority over collapsed tooltip.\r\n return (\r\n <SidebarMenuItem>\r\n <Link href={item.url} className=\"w-full\">\r\n <SidebarMenuButton\r\n isActive={item.isActive}\r\n onClick={onClick}\r\n >\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n <span>{item.title}</span>\r\n {item.badge && (\r\n <span className=\"ml-auto text-xs bg-sidebar-accent text-sidebar-accent-foreground px-1.5 py-0.5 rounded\">\r\n {item.badge}\r\n </span>\r\n )}\r\n </SidebarMenuButton>\r\n </Link>\r\n </SidebarMenuItem>\r\n );\r\n}\r\n\r\n/**\r\n * SidebarNavGroup - A group of navigation items with optional title.\r\n */\r\nexport function SidebarNavGroup({\r\n title,\r\n items,\r\n className,\r\n onItemClick,\r\n}: SidebarNavGroupProps) {\r\n return (\r\n <SidebarGroup className={className}>\r\n {title && <SidebarGroupLabel>{title}</SidebarGroupLabel>}\r\n <SidebarMenu>\r\n {items.map((item, idx) => (\r\n <SidebarNavItem\r\n key={`${item.title}-${idx}`}\r\n item={item}\r\n onClick={() => onItemClick?.(item)}\r\n />\r\n ))}\r\n </SidebarMenu>\r\n </SidebarGroup>\r\n );\r\n}\r\n\r\n/**\r\n * SidebarNav - Complete navigation section with multiple groups.\r\n */\r\nexport function SidebarNav({ groups, className, onItemClick }: SidebarNavProps) {\r\n return (\r\n <div className={cn(\"flex flex-col gap-2\", className)}>\r\n {groups.map((group, index) => (\r\n <SidebarNavGroup\r\n key={group.title || `nav-group-${index}`}\r\n title={group.title}\r\n items={group.items}\r\n onItemClick={onItemClick}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport Link from \"next/link\";\r\nimport { ChevronsUpDown, CircleUserRound, LogOut, type LucideIcon } from \"lucide-react\";\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuGroup,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuTrigger,\r\n} from \"@/components/ui/dropdown-menu\";\r\nimport {\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n useSidebar,\r\n} from \"@/components/ui/sidebar\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface UserData {\r\n name: string;\r\n email: string;\r\n avatar?: string;\r\n}\r\n\r\nexport interface UserMenuItem {\r\n label: string;\r\n icon?: LucideIcon;\r\n href?: string;\r\n onClick?: () => void;\r\n separator?: boolean;\r\n}\r\n\r\nexport interface SidebarUserMenuProps {\r\n /** User data to display */\r\n user: UserData;\r\n /** Menu items (account, settings, etc.) */\r\n menuItems?: UserMenuItem[];\r\n /** Logout handler */\r\n onLogout?: () => void;\r\n /** Additional className */\r\n className?: string;\r\n}\r\n\r\n// ============================================\r\n// Helpers\r\n// ============================================\r\n\r\nfunction getUserInitials(name?: string): string {\r\n if (!name) return \"?\";\r\n const names = name.trim().split(\" \");\r\n if (names.length === 1) return names[0].slice(0, 2).toUpperCase();\r\n return (names[0][0] + names[names.length - 1][0]).toUpperCase();\r\n}\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\nfunction UserAvatar({ user, className }: { user: UserData; className?: string }) {\r\n return (\r\n <Avatar className={cn(\"h-8 w-8 rounded-lg\", className)}>\r\n <AvatarImage src={user.avatar} alt={user.name} />\r\n <AvatarFallback className=\"rounded-lg bg-sidebar-primary text-sidebar-primary-foreground\">\r\n {getUserInitials(user.name)}\r\n </AvatarFallback>\r\n </Avatar>\r\n );\r\n}\r\n\r\nfunction UserInfo({ user }: { user: UserData }) {\r\n return (\r\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\r\n <span className=\"truncate font-semibold\">{user.name}</span>\r\n <span className=\"truncate text-xs text-muted-foreground\">{user.email}</span>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * SidebarUserMenu - User avatar and dropdown menu for sidebar footer.\r\n * Accepts handlers for logout and custom menu items.\r\n */\r\nexport function SidebarUserMenu({\r\n user,\r\n menuItems = [],\r\n onLogout,\r\n className,\r\n}: SidebarUserMenuProps) {\r\n const { isMobile, state } = useSidebar();\r\n const isCollapsed = state === \"collapsed\";\r\n\r\n // Default menu items if none provided\r\n const defaultItems: UserMenuItem[] = [\r\n {\r\n label: \"Account\",\r\n icon: CircleUserRound,\r\n href: \"/dashboard/profile\",\r\n },\r\n ];\r\n\r\n const items = menuItems.length > 0 ? menuItems : defaultItems;\r\n\r\n return (\r\n <SidebarMenu className={className}>\r\n <SidebarMenuItem>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n render={\r\n <SidebarMenuButton\r\n size=\"lg\"\r\n tooltip={isCollapsed ? user.name : undefined}\r\n className={cn(\r\n \"data-open:bg-sidebar-accent data-open:text-sidebar-accent-foreground\",\r\n isCollapsed && !isMobile && \"justify-center\"\r\n )}\r\n />\r\n }\r\n >\r\n <UserAvatar user={user} />\r\n {(!isCollapsed || isMobile) && (\r\n <>\r\n <UserInfo user={user} />\r\n <ChevronsUpDown className=\"ml-auto size-4\" />\r\n </>\r\n )}\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent\r\n className=\"w-(--anchor-width) min-w-56 rounded-lg\"\r\n side={isMobile ? \"bottom\" : \"right\"}\r\n align=\"end\"\r\n sideOffset={4}\r\n >\r\n <DropdownMenuGroup>\r\n <DropdownMenuLabel className=\"p-0 font-normal\">\r\n <div className=\"flex items-center gap-2 px-1 py-1.5 text-left text-sm\">\r\n <UserAvatar user={user} />\r\n <UserInfo user={user} />\r\n </div>\r\n </DropdownMenuLabel>\r\n </DropdownMenuGroup>\r\n <DropdownMenuSeparator />\r\n\r\n <DropdownMenuGroup>\r\n {items.map((item, index) => (\r\n <React.Fragment key={item.label}>\r\n {item.separator && index > 0 && <DropdownMenuSeparator />}\r\n {item.href ? (\r\n <DropdownMenuItem\r\n render={<Link href={item.href} />}\r\n className=\"w-full flex items-center\"\r\n >\r\n {item.icon && <item.icon className=\"mr-2 h-4 w-4\" />}\r\n {item.label}\r\n </DropdownMenuItem>\r\n ) : (\r\n <DropdownMenuItem\r\n onClick={item.onClick}\r\n className=\"w-full flex items-center\"\r\n >\r\n {item.icon && <item.icon className=\"mr-2 h-4 w-4\" />}\r\n {item.label}\r\n </DropdownMenuItem>\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </DropdownMenuGroup>\r\n\r\n {onLogout && (\r\n <>\r\n <DropdownMenuSeparator />\r\n <DropdownMenuItem\r\n onClick={onLogout}\r\n className=\"w-full flex items-center\"\r\n >\r\n <LogOut className=\"mr-2 h-4 w-4\" />\r\n Log out\r\n </DropdownMenuItem>\r\n </>\r\n )}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { Building2, Check, ChevronsUpDown, type LucideIcon } from \"lucide-react\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuGroup,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuTrigger,\r\n} from \"@/components/ui/dropdown-menu\";\r\nimport {\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n useSidebar,\r\n} from \"@/components/ui/sidebar\";\r\nimport { Badge } from \"@/components/ui/badge\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { Skeleton } from \"@/components/ui/skeleton\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface ProjectItem {\r\n /** Unique identifier */\r\n id: string;\r\n /** Display name */\r\n name: string;\r\n /** Short code or identifier */\r\n code?: string;\r\n /** Optional type badge */\r\n type?: string;\r\n /** Is this the default project */\r\n isDefault?: boolean;\r\n /** Is this project active */\r\n isActive?: boolean;\r\n /** Optional subtitle/description */\r\n subtitle?: string;\r\n}\r\n\r\nexport interface ProjectSwitcherProps {\r\n /** List of available projects */\r\n items: ProjectItem[];\r\n /** Currently selected project */\r\n selected?: ProjectItem;\r\n /** Callback when a project is selected */\r\n onSelect: (project: ProjectItem) => void;\r\n /** Whether the data is loading */\r\n isLoading?: boolean;\r\n /** Label shown in dropdown header */\r\n label?: string;\r\n /** Icon to display (defaults to Building2) */\r\n icon?: LucideIcon;\r\n /** Additional className */\r\n className?: string;\r\n /** Whether to show as disabled (single item) */\r\n disabled?: boolean;\r\n /**\r\n * Render variant:\r\n * - \"sidebar\": Uses SidebarMenu components, requires SidebarProvider context\r\n * - \"standalone\": Uses Button, works anywhere (headers, toolbars, etc.)\r\n */\r\n variant?: \"sidebar\" | \"standalone\";\r\n /** Size for standalone variant (ignored in sidebar variant) */\r\n size?: \"sm\" | \"default\";\r\n /** Render custom item content */\r\n renderItem?: (item: ProjectItem, isSelected: boolean) => React.ReactNode;\r\n}\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\n// Shared dropdown content for both variants\r\nfunction DropdownContent({\r\n items,\r\n selected,\r\n onSelect,\r\n label,\r\n renderItem,\r\n isMobile = false,\r\n}: {\r\n items: ProjectItem[];\r\n selected: ProjectItem;\r\n onSelect: (project: ProjectItem) => void;\r\n label: string;\r\n renderItem?: (item: ProjectItem, isSelected: boolean) => React.ReactNode;\r\n isMobile?: boolean;\r\n}) {\r\n return (\r\n <DropdownMenuContent\r\n className=\"w-64 rounded-lg\"\r\n side={isMobile ? \"bottom\" : \"right\"}\r\n align=\"start\"\r\n sideOffset={4}\r\n >\r\n <DropdownMenuGroup>\r\n <DropdownMenuLabel className=\"text-xs text-muted-foreground font-normal\">\r\n {label}\r\n </DropdownMenuLabel>\r\n {items.map((item) => {\r\n const isSelected = selected.id === item.id;\r\n\r\n if (renderItem) {\r\n return (\r\n <DropdownMenuItem\r\n key={item.id}\r\n onClick={() => onSelect(item)}\r\n className=\"cursor-pointer\"\r\n >\r\n {renderItem(item, isSelected)}\r\n </DropdownMenuItem>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenuItem\r\n key={item.id}\r\n onClick={() => onSelect(item)}\r\n className=\"gap-2 cursor-pointer\"\r\n >\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <span className=\"font-medium text-sm truncate\">{item.name}</span>\r\n {isSelected && (\r\n <Check className=\"size-3.5 text-primary shrink-0\" />\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-1.5 mt-0.5\">\r\n {item.code && (\r\n <span className=\"text-xs text-muted-foreground\">{item.code}</span>\r\n )}\r\n {item.type && (\r\n <>\r\n {item.code && (\r\n <span className=\"text-xs text-muted-foreground\">•</span>\r\n )}\r\n <Badge variant=\"outline\" className=\"text-[10px] h-4 px-1\">\r\n {item.type}\r\n </Badge>\r\n </>\r\n )}\r\n {item.isDefault && (\r\n <Badge variant=\"secondary\" className=\"text-[10px] h-4 px-1\">\r\n Default\r\n </Badge>\r\n )}\r\n {item.isActive === false && (\r\n <Badge variant=\"destructive\" className=\"text-[10px] h-4 px-1\">\r\n Inactive\r\n </Badge>\r\n )}\r\n </div>\r\n {item.subtitle && (\r\n <p className=\"text-[10px] text-muted-foreground mt-0.5 truncate\">\r\n {item.subtitle}\r\n </p>\r\n )}\r\n </div>\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuGroup>\r\n </DropdownMenuContent>\r\n );\r\n}\r\n\r\n// Sidebar variant components\r\nfunction SidebarLoadingSkeleton({ isCollapsed, isMobile }: { isCollapsed: boolean; isMobile: boolean }) {\r\n return (\r\n <SidebarMenu>\r\n <SidebarMenuItem>\r\n <SidebarMenuButton\r\n className={cn(\r\n \"h-10 py-1.5 bg-sidebar-accent/50\",\r\n isCollapsed && !isMobile && \"justify-center\"\r\n )}\r\n disabled\r\n >\r\n <Skeleton className=\"h-4 w-4 rounded-sm shrink-0\" />\r\n {(!isCollapsed || isMobile) && (\r\n <div className=\"flex-1 min-w-0 space-y-1\">\r\n <Skeleton className=\"h-3 w-24\" />\r\n <Skeleton className=\"h-2.5 w-14\" />\r\n </div>\r\n )}\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n}\r\n\r\nfunction SidebarProjectDisplay({\r\n project,\r\n Icon,\r\n isCollapsed,\r\n isMobile,\r\n}: {\r\n project: ProjectItem;\r\n Icon: LucideIcon;\r\n isCollapsed: boolean;\r\n isMobile: boolean;\r\n}) {\r\n return (\r\n <>\r\n <Icon className=\"h-4 w-4 text-muted-foreground shrink-0\" />\r\n {(!isCollapsed || isMobile) && (\r\n <div className=\"flex-1 min-w-0 leading-tight text-left\">\r\n <p className=\"text-xs font-medium truncate\">{project.name}</p>\r\n {project.code && (\r\n <p className=\"text-[10px] text-muted-foreground truncate\">\r\n {project.code}\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\n// Standalone variant components\r\nfunction StandaloneLoadingSkeleton({ size }: { size: \"sm\" | \"default\" }) {\r\n return (\r\n <Button\r\n variant=\"outline\"\r\n size={size}\r\n className={cn(\"gap-2\", size === \"sm\" ? \"h-8\" : \"h-9\")}\r\n disabled\r\n >\r\n <Skeleton className=\"h-4 w-4 rounded-sm\" />\r\n <Skeleton className=\"h-3 w-20\" />\r\n </Button>\r\n );\r\n}\r\n\r\nfunction StandaloneProjectDisplay({\r\n project,\r\n Icon,\r\n size,\r\n}: {\r\n project: ProjectItem;\r\n Icon: LucideIcon;\r\n size: \"sm\" | \"default\";\r\n}) {\r\n return (\r\n <>\r\n <Icon className={cn(\"text-muted-foreground shrink-0\", size === \"sm\" ? \"h-3.5 w-3.5\" : \"h-4 w-4\")} />\r\n <span className={cn(\"font-medium truncate max-w-[120px]\", size === \"sm\" ? \"text-xs\" : \"text-sm\")}>\r\n {project.name}\r\n </span>\r\n {project.code && (\r\n <span className={cn(\"text-muted-foreground truncate\", size === \"sm\" ? \"text-[10px]\" : \"text-xs\")}>\r\n ({project.code})\r\n </span>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\n/**\r\n * ProjectSwitcher - Generic project/workspace/branch switcher.\r\n * Works for any entity that needs switching functionality.\r\n *\r\n * @example Sidebar usage (inside SidebarProvider)\r\n * ```tsx\r\n * <ProjectSwitcher\r\n * items={projects}\r\n * selected={selectedProject}\r\n * onSelect={setSelectedProject}\r\n * />\r\n * ```\r\n *\r\n * @example Header/Standalone usage (no SidebarProvider needed)\r\n * ```tsx\r\n * <ProjectSwitcher\r\n * variant=\"standalone\"\r\n * items={projects}\r\n * selected={selectedProject}\r\n * onSelect={setSelectedProject}\r\n * size=\"sm\"\r\n * />\r\n * ```\r\n */\r\nexport function ProjectSwitcher({\r\n items,\r\n selected,\r\n onSelect,\r\n isLoading = false,\r\n label = \"Switch Project\",\r\n icon: Icon = Building2,\r\n className,\r\n disabled = false,\r\n variant = \"sidebar\",\r\n size = \"default\",\r\n renderItem,\r\n}: ProjectSwitcherProps) {\r\n const hasMultipleItems = items.length > 1;\r\n\r\n // Standalone variant - doesn't need SidebarProvider\r\n if (variant === \"standalone\") {\r\n if (isLoading) {\r\n return <StandaloneLoadingSkeleton size={size} />;\r\n }\r\n\r\n if (!selected) {\r\n return null;\r\n }\r\n\r\n if (!hasMultipleItems || disabled) {\r\n return (\r\n <Button\r\n variant=\"outline\"\r\n size={size}\r\n className={cn(\"gap-2 cursor-default\", size === \"sm\" ? \"h-8\" : \"h-9\", className)}\r\n disabled\r\n >\r\n <StandaloneProjectDisplay project={selected} Icon={Icon} size={size} />\r\n </Button>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n render={\r\n <Button\r\n variant=\"outline\"\r\n size={size}\r\n className={cn(\"gap-2\", size === \"sm\" ? \"h-8\" : \"h-9\", className)}\r\n />\r\n }\r\n >\r\n <StandaloneProjectDisplay project={selected} Icon={Icon} size={size} />\r\n <ChevronsUpDown className={cn(\"text-muted-foreground shrink-0\", size === \"sm\" ? \"h-3 w-3\" : \"h-3.5 w-3.5\")} />\r\n </DropdownMenuTrigger>\r\n <DropdownContent\r\n items={items}\r\n selected={selected}\r\n onSelect={onSelect}\r\n label={label}\r\n renderItem={renderItem}\r\n />\r\n </DropdownMenu>\r\n );\r\n }\r\n\r\n // Sidebar variant - requires SidebarProvider context\r\n const { isMobile, state } = useSidebar();\r\n const isCollapsed = state === \"collapsed\";\r\n\r\n if (isLoading) {\r\n return <SidebarLoadingSkeleton isCollapsed={isCollapsed} isMobile={isMobile} />;\r\n }\r\n\r\n if (!selected) {\r\n return null;\r\n }\r\n\r\n if (!hasMultipleItems || disabled) {\r\n return (\r\n <SidebarMenu className={className}>\r\n <SidebarMenuItem>\r\n <SidebarMenuButton\r\n className={cn(\r\n \"h-10 py-1.5 bg-sidebar-accent/50\",\r\n isCollapsed && !isMobile && \"justify-center\"\r\n )}\r\n tooltip={isCollapsed ? selected.name : undefined}\r\n disabled\r\n >\r\n <SidebarProjectDisplay\r\n project={selected}\r\n Icon={Icon}\r\n isCollapsed={isCollapsed}\r\n isMobile={isMobile}\r\n />\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n }\r\n\r\n return (\r\n <SidebarMenu className={className}>\r\n <SidebarMenuItem>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n render={\r\n <SidebarMenuButton\r\n className={cn(\r\n \"h-10 py-1.5 bg-sidebar-accent/50 hover:bg-sidebar-accent transition-colors\",\r\n isCollapsed && !isMobile && \"justify-center\"\r\n )}\r\n tooltip={isCollapsed ? selected.name : undefined}\r\n />\r\n }\r\n >\r\n <SidebarProjectDisplay\r\n project={selected}\r\n Icon={Icon}\r\n isCollapsed={isCollapsed}\r\n isMobile={isMobile}\r\n />\r\n {(!isCollapsed || isMobile) && (\r\n <ChevronsUpDown className=\"h-3 w-3 text-muted-foreground shrink-0\" />\r\n )}\r\n </DropdownMenuTrigger>\r\n <DropdownContent\r\n items={items}\r\n selected={selected}\r\n onSelect={onSelect}\r\n label={label}\r\n renderItem={renderItem}\r\n isMobile={isMobile}\r\n />\r\n </DropdownMenu>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport Link from \"next/link\";\r\nimport { SidebarTrigger } from \"@/components/ui/sidebar\";\r\nimport { Separator } from \"@/components/ui/separator\";\r\nimport {\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from \"@/components/ui/breadcrumb\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface BreadcrumbItem {\r\n label: string;\r\n href?: string;\r\n current?: boolean;\r\n}\r\n\r\nexport interface DashboardHeaderProps {\r\n /** Breadcrumb items */\r\n breadcrumbs?: BreadcrumbItem[];\r\n /** Content to show on the left (after breadcrumbs) */\r\n leftContent?: React.ReactNode;\r\n /** Content to show on the right (actions, mode toggle, etc.) */\r\n rightContent?: React.ReactNode;\r\n /** Whether to show sidebar trigger */\r\n showSidebarTrigger?: boolean;\r\n /** Additional className */\r\n className?: string;\r\n /** Custom content (replaces default breadcrumb) */\r\n children?: React.ReactNode;\r\n}\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\nfunction BreadcrumbNav({ items }: { items: BreadcrumbItem[] }) {\r\n return (\r\n <Breadcrumb>\r\n <BreadcrumbList>\r\n {items.map((item, index) => (\r\n <React.Fragment key={`breadcrumb-${index}`}>\r\n <BreadcrumbItem className={item.current ? \"\" : \"hidden md:block\"}>\r\n {item.current ? (\r\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\r\n ) : (\r\n <BreadcrumbLink render={<Link href={item.href || \"#\"} />}>\r\n {item.label}\r\n </BreadcrumbLink>\r\n )}\r\n </BreadcrumbItem>\r\n {index < items.length - 1 && (\r\n <BreadcrumbSeparator className=\"hidden md:block\" />\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n );\r\n}\r\n\r\n/**\r\n * DashboardHeader - Top header bar for dashboard pages.\r\n * Includes sidebar trigger, breadcrumbs, and action slots.\r\n */\r\nexport function DashboardHeader({\r\n breadcrumbs,\r\n leftContent,\r\n rightContent,\r\n showSidebarTrigger = true,\r\n className,\r\n children,\r\n}: DashboardHeaderProps) {\r\n return (\r\n <header\r\n className={cn(\r\n \"flex h-12 shrink-0 items-center justify-between gap-2\",\r\n className\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {showSidebarTrigger && (\r\n <>\r\n <SidebarTrigger className=\"-ml-1\" />\r\n <Separator orientation=\"vertical\" className=\"mr-2 h-4\" />\r\n </>\r\n )}\r\n\r\n {children ? (\r\n children\r\n ) : (\r\n <>\r\n {breadcrumbs && breadcrumbs.length > 0 && (\r\n <BreadcrumbNav items={breadcrumbs} />\r\n )}\r\n {leftContent}\r\n </>\r\n )}\r\n </div>\r\n\r\n {rightContent && <div className=\"flex items-center gap-2\">{rightContent}</div>}\r\n </header>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { type LucideIcon } from \"lucide-react\";\r\nimport {\r\n Sidebar,\r\n SidebarContent,\r\n SidebarFooter,\r\n SidebarHeader,\r\n useSidebar,\r\n} from \"@/components/ui/sidebar\";\r\nimport { SheetDescription, SheetTitle } from \"@/components/ui/sheet\";\r\nimport { SidebarBrand, type SidebarBrandProps } from \"../sidebar-brand\";\r\nimport { SidebarNav, type NavGroup } from \"../sidebar-nav\";\r\nimport { SidebarUserMenu, type UserData, type UserMenuItem } from \"../sidebar-user-menu\";\r\nimport { ProjectSwitcher, type ProjectItem } from \"../project-switcher\";\r\nimport { cn } from \"../../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface InsetSidebarBrand {\r\n title: string;\r\n icon: React.ReactNode;\r\n href?: string;\r\n}\r\n\r\nexport interface InsetSidebarProject {\r\n items: ProjectItem[];\r\n selected?: ProjectItem;\r\n onSelect: (project: ProjectItem) => void;\r\n isLoading?: boolean;\r\n label?: string;\r\n icon?: LucideIcon;\r\n}\r\n\r\nexport interface InsetSidebarUser {\r\n data: UserData;\r\n menuItems?: UserMenuItem[];\r\n onLogout?: () => void;\r\n}\r\n\r\nexport interface InsetSidebarProps {\r\n /** Brand configuration */\r\n brand: InsetSidebarBrand;\r\n /** Navigation groups */\r\n navigation: NavGroup[];\r\n /** Secondary navigation (shown at bottom above user) */\r\n secondaryNavigation?: NavGroup[];\r\n /** Project/workspace switcher configuration */\r\n project?: InsetSidebarProject;\r\n /** User menu configuration */\r\n user?: InsetSidebarUser;\r\n /** Custom content to render in header (after brand/project switcher) */\r\n headerContent?: React.ReactNode;\r\n /** Accessibility label for the sidebar */\r\n ariaLabel?: string;\r\n /** Additional className */\r\n className?: string;\r\n /** Children to render in content area */\r\n children?: React.ReactNode;\r\n}\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\n/**\r\n * InsetSidebar - Complete sidebar preset with inset variant.\r\n * The standard dashboard sidebar with collapsible to icons.\r\n */\r\nexport function InsetSidebar({\r\n brand,\r\n navigation,\r\n secondaryNavigation,\r\n project,\r\n user,\r\n headerContent,\r\n ariaLabel = \"Navigation Menu\",\r\n className,\r\n children,\r\n}: InsetSidebarProps) {\r\n const { isMobile } = useSidebar();\r\n\r\n return (\r\n <Sidebar variant=\"inset\" collapsible=\"icon\" className={className}>\r\n {/* Accessibility labels for mobile sheet */}\r\n {isMobile && (\r\n <span className=\"sr-only\">\r\n <SheetTitle>{ariaLabel}</SheetTitle>\r\n <SheetDescription>\r\n Application navigation menu containing links to different sections\r\n </SheetDescription>\r\n </span>\r\n )}\r\n\r\n <SidebarHeader className=\"gap-1\">\r\n <SidebarBrand\r\n title={brand.title}\r\n icon={brand.icon}\r\n href={brand.href}\r\n />\r\n {project && (\r\n <ProjectSwitcher\r\n items={project.items}\r\n selected={project.selected}\r\n onSelect={project.onSelect}\r\n isLoading={project.isLoading}\r\n label={project.label}\r\n icon={project.icon}\r\n />\r\n )}\r\n {headerContent}\r\n </SidebarHeader>\r\n\r\n <SidebarContent>\r\n {children || (\r\n <>\r\n <SidebarNav groups={navigation} />\r\n {secondaryNavigation && (\r\n <SidebarNav groups={secondaryNavigation} className=\"mt-auto\" />\r\n )}\r\n </>\r\n )}\r\n </SidebarContent>\r\n\r\n {user && (\r\n <SidebarFooter>\r\n <SidebarUserMenu\r\n user={user.data}\r\n menuItems={user.menuItems}\r\n onLogout={user.onLogout}\r\n />\r\n </SidebarFooter>\r\n )}\r\n </Sidebar>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport Link from \"next/link\";\r\nimport { ChevronLeft, ChevronRight, type LucideIcon } from \"lucide-react\";\r\nimport {\r\n SidebarContent,\r\n SidebarFooter,\r\n SidebarHeader,\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarGroup,\r\n SidebarGroupLabel,\r\n useSidebar,\r\n} from \"@/components/ui/sidebar\";\r\nimport { SheetDescription, SheetTitle } from \"@/components/ui/sheet\";\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\";\r\nimport {\r\n SidebarUserMenu,\r\n type UserData,\r\n type UserMenuItem,\r\n} from \"../sidebar-user-menu\";\r\nimport { cn } from \"../../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface DualSidebarCategory {\r\n /** Unique identifier */\r\n id: string;\r\n /** Display name */\r\n name: string;\r\n /** Category icon */\r\n icon: LucideIcon;\r\n /** Sub-items in this category */\r\n items: DualSidebarItem[];\r\n}\r\n\r\nexport interface DualSidebarItem {\r\n title: string;\r\n url: string;\r\n icon?: LucideIcon;\r\n badge?: string | number;\r\n isActive?: boolean;\r\n}\r\n\r\nexport interface DualSidebarBrand {\r\n title: string;\r\n icon: React.ReactNode;\r\n href?: string;\r\n}\r\n\r\nexport interface DualSidebarUser {\r\n data: UserData;\r\n menuItems?: UserMenuItem[];\r\n onLogout?: () => void;\r\n}\r\n\r\nexport interface DualSidebarProps {\r\n /** Brand configuration */\r\n brand: DualSidebarBrand;\r\n /** Main categories with their items */\r\n categories: DualSidebarCategory[];\r\n /** User menu configuration */\r\n user?: DualSidebarUser;\r\n /** Initially active category ID */\r\n defaultCategoryId?: string;\r\n /** Callback when category changes */\r\n onCategoryChange?: (categoryId: string) => void;\r\n /** Whether the expanded panel starts collapsed */\r\n defaultCollapsed?: boolean;\r\n /** Rail color variant */\r\n railVariant?: \"default\" | \"dark\" | \"primary\" | \"muted\";\r\n /** Accessibility label */\r\n ariaLabel?: string;\r\n /** Additional className for outer container */\r\n className?: string;\r\n}\r\n\r\n// ============================================\r\n// Constants\r\n// ============================================\r\nconst SIDEBAR_RAIL_WIDTH = \"3.5rem\"; // 56px\r\nconst SIDEBAR_PANEL_WIDTH = \"13rem\"; // 208px\r\nconst SIDEBAR_WIDTH_EXPANDED = \"16.5rem\"; // 56px + 208px = 264px\r\nconst SIDEBAR_WIDTH_COLLAPSED = \"3.5rem\"; // Just the rail\r\nconst SIDEBAR_PADDING = \"0.5rem\"; // 8px padding on each side\r\n\r\n// Rail color variants\r\nconst railVariants = {\r\n default: \"bg-sidebar\",\r\n dark: \"bg-zinc-900 dark:bg-zinc-950\",\r\n primary: \"bg-primary\",\r\n muted: \"bg-muted\",\r\n};\r\n\r\nconst railTextVariants = {\r\n default: \"text-sidebar-foreground\",\r\n dark: \"text-zinc-100\",\r\n primary: \"text-primary-foreground\",\r\n muted: \"text-muted-foreground\",\r\n};\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\n/**\r\n * DualSidebar - A sidebar with icon rail and collapsible expanded panel.\r\n * Mimics the inset sidebar variant structure for consistent styling.\r\n */\r\nexport function DualSidebar({\r\n brand,\r\n categories,\r\n user,\r\n defaultCategoryId,\r\n onCategoryChange,\r\n defaultCollapsed = false,\r\n railVariant = \"default\",\r\n ariaLabel = \"Navigation Menu\",\r\n className,\r\n}: DualSidebarProps) {\r\n const [activeCategory, setActiveCategory] = React.useState<string | null>(\r\n defaultCategoryId || (categories.length > 0 ? categories[0].id : null)\r\n );\r\n const [isExpanded, setIsExpanded] = React.useState(!defaultCollapsed);\r\n const { isMobile } = useSidebar();\r\n\r\n const handleCategorySelect = (id: string) => {\r\n setActiveCategory(id);\r\n onCategoryChange?.(id);\r\n // Auto-expand when selecting a category\r\n if (!isExpanded) {\r\n setIsExpanded(true);\r\n }\r\n };\r\n\r\n const toggleExpanded = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n\r\n const activeCategoryData =\r\n categories.find((c) => c.id === activeCategory) || null;\r\n\r\n const currentWidth = isExpanded ? SIDEBAR_WIDTH_EXPANDED : SIDEBAR_WIDTH_COLLAPSED;\r\n const totalWidth = `calc(${currentWidth} + ${SIDEBAR_PADDING} * 2)`;\r\n\r\n return (\r\n <>\r\n {/* Outer wrapper matching shadcn Sidebar structure */}\r\n <div\r\n className=\"group peer text-sidebar-foreground hidden md:block\"\r\n data-state=\"expanded\"\r\n data-collapsible=\"\"\r\n data-variant=\"inset\"\r\n data-side=\"left\"\r\n data-slot=\"sidebar\"\r\n >\r\n {/* Sidebar gap - reserves space in the layout */}\r\n <div\r\n data-slot=\"sidebar-gap\"\r\n className=\"relative bg-transparent transition-[width] duration-200 ease-linear\"\r\n style={{ width: totalWidth }}\r\n />\r\n\r\n {/* Fixed sidebar container */}\r\n <div\r\n data-slot=\"sidebar-container\"\r\n className={cn(\r\n \"fixed inset-y-0 left-0 z-10 hidden h-svh transition-[width] duration-200 ease-linear md:flex\",\r\n className\r\n )}\r\n style={{\r\n width: totalWidth,\r\n padding: SIDEBAR_PADDING,\r\n }}\r\n >\r\n {/* Inner sidebar with styling */}\r\n <div\r\n data-sidebar=\"sidebar\"\r\n data-slot=\"sidebar-inner\"\r\n className=\"bg-sidebar flex h-full w-full flex-row overflow-hidden rounded-lg border border-sidebar-border shadow-sm\"\r\n >\r\n {/* Accessibility labels for mobile */}\r\n {isMobile && (\r\n <span className=\"sr-only\">\r\n <SheetTitle>{ariaLabel}</SheetTitle>\r\n <SheetDescription>\r\n Navigation menu with category icons and expanded content\r\n </SheetDescription>\r\n </span>\r\n )}\r\n\r\n {/* Icon Rail */}\r\n <div\r\n className={cn(\r\n \"flex flex-col shrink-0 transition-colors\",\r\n railVariants[railVariant],\r\n railTextVariants[railVariant],\r\n isExpanded && \"border-r border-sidebar-border\"\r\n )}\r\n style={{ width: SIDEBAR_RAIL_WIDTH, minWidth: SIDEBAR_RAIL_WIDTH }}\r\n >\r\n {/* Brand Icon */}\r\n <div className=\"flex items-center justify-center p-2 h-14\">\r\n <Tooltip>\r\n <TooltipTrigger\r\n render={\r\n <Link\r\n href={brand.href || \"/\"}\r\n className={cn(\r\n \"flex items-center justify-center h-10 w-10 rounded-lg shadow-sm transition-colors\",\r\n railVariant === \"dark\" || railVariant === \"primary\"\r\n ? \"bg-white/10 hover:bg-white/20 text-inherit\"\r\n : \"bg-sidebar-primary text-sidebar-primary-foreground\"\r\n )}\r\n />\r\n }\r\n >\r\n {brand.icon}\r\n </TooltipTrigger>\r\n <TooltipContent side=\"right\">{brand.title}</TooltipContent>\r\n </Tooltip>\r\n </div>\r\n\r\n {/* Category Icons */}\r\n <div className=\"flex-1 flex flex-col gap-1 p-2\">\r\n {categories.map((category) => {\r\n const Icon = category.icon;\r\n const isActive = activeCategory === category.id;\r\n\r\n return (\r\n <Tooltip key={category.id}>\r\n <TooltipTrigger\r\n render={\r\n <button\r\n onClick={() => handleCategorySelect(category.id)}\r\n className={cn(\r\n \"flex items-center justify-center h-10 w-10 rounded-lg transition-colors\",\r\n isActive\r\n ? railVariant === \"dark\" || railVariant === \"primary\"\r\n ? \"bg-white/20\"\r\n : \"bg-sidebar-accent text-sidebar-accent-foreground\"\r\n : railVariant === \"dark\" || railVariant === \"primary\"\r\n ? \"hover:bg-white/10\"\r\n : \"hover:bg-sidebar-accent/50\"\r\n )}\r\n />\r\n }\r\n >\r\n <Icon className=\"h-5 w-5\" />\r\n </TooltipTrigger>\r\n <TooltipContent side=\"right\">{category.name}</TooltipContent>\r\n </Tooltip>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Collapse/Expand Toggle */}\r\n <div className=\"p-2\">\r\n <Tooltip>\r\n <TooltipTrigger\r\n render={\r\n <button\r\n onClick={toggleExpanded}\r\n className={cn(\r\n \"flex items-center justify-center h-10 w-10 rounded-lg transition-colors\",\r\n railVariant === \"dark\" || railVariant === \"primary\"\r\n ? \"hover:bg-white/10\"\r\n : \"hover:bg-sidebar-accent/50\"\r\n )}\r\n />\r\n }\r\n >\r\n {isExpanded ? (\r\n <ChevronLeft className=\"h-5 w-5\" />\r\n ) : (\r\n <ChevronRight className=\"h-5 w-5\" />\r\n )}\r\n </TooltipTrigger>\r\n <TooltipContent side=\"right\">\r\n {isExpanded ? \"Collapse sidebar\" : \"Expand sidebar\"}\r\n </TooltipContent>\r\n </Tooltip>\r\n </div>\r\n </div>\r\n\r\n {/* Expanded Panel */}\r\n <div\r\n className={cn(\r\n \"flex flex-col bg-sidebar overflow-hidden transition-[width,opacity] duration-200 ease-linear\",\r\n isExpanded ? \"opacity-100\" : \"opacity-0 w-0\"\r\n )}\r\n style={{ width: isExpanded ? SIDEBAR_PANEL_WIDTH : 0 }}\r\n >\r\n {activeCategoryData ? (\r\n <>\r\n <SidebarHeader className=\"h-14 border-b border-sidebar-border px-4 flex items-center shrink-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <activeCategoryData.icon className=\"h-5 w-5 text-sidebar-foreground\" />\r\n <span className=\"font-semibold text-sidebar-foreground truncate\">\r\n {activeCategoryData.name}\r\n </span>\r\n </div>\r\n </SidebarHeader>\r\n\r\n <SidebarContent className=\"flex-1 overflow-y-auto\">\r\n <SidebarGroup className=\"p-2\">\r\n <SidebarGroupLabel className=\"px-2 text-xs text-sidebar-foreground/60\">\r\n {activeCategoryData.name} Menu\r\n </SidebarGroupLabel>\r\n <SidebarMenu>\r\n {activeCategoryData.items.map((item, idx) => {\r\n const Icon = item.icon;\r\n return (\r\n <SidebarMenuItem\r\n key={`${activeCategoryData.id}-${item.title}-${idx}`}\r\n >\r\n <SidebarMenuButton\r\n isActive={item.isActive}\r\n render={<Link href={item.url} />}\r\n >\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n <span className=\"truncate\">{item.title}</span>\r\n {item.badge && (\r\n <span className=\"ml-auto text-xs bg-sidebar-accent text-sidebar-accent-foreground px-1.5 py-0.5 rounded shrink-0\">\r\n {item.badge}\r\n </span>\r\n )}\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n );\r\n })}\r\n </SidebarMenu>\r\n </SidebarGroup>\r\n </SidebarContent>\r\n\r\n {user && (\r\n <SidebarFooter className=\"border-t border-sidebar-border shrink-0\">\r\n <SidebarUserMenu\r\n user={user.data}\r\n menuItems={user.menuItems}\r\n onLogout={user.onLogout}\r\n />\r\n </SidebarFooter>\r\n )}\r\n </>\r\n ) : (\r\n <div className=\"flex-1 flex items-center justify-center text-sidebar-foreground/60 text-sm\">\r\n Select a category\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dashboard/header-section.tsx","../src/dashboard/page-header.tsx","../src/dashboard/dashboard-content.tsx","../src/dashboard/sidebar-brand.tsx","../src/dashboard/sidebar-nav.tsx","../src/dashboard/sidebar-user-menu.tsx","../src/dashboard/project-switcher.tsx","../src/dashboard/dashboard-header.tsx","../src/dashboard/presets/inset-sidebar.tsx","../src/dashboard/presets/dual-sidebar.tsx"],"names":["badge","jsxs","jsx","React","Link","SidebarMenuItem","SidebarMenuButton","SidebarMenu","useSidebar","Fragment","React2","DropdownMenuContent","DropdownMenuGroup","DropdownMenuLabel","DropdownMenuItem","Badge","Skeleton","Button","DropdownMenu","DropdownMenuTrigger","ChevronsUpDown","Breadcrumb","BreadcrumbList","React3","BreadcrumbItem","BreadcrumbPage","BreadcrumbLink","BreadcrumbSeparator","SidebarTrigger","Separator","SheetTitle","SheetDescription","ChevronRight","SidebarHeader","SidebarContent","SidebarGroup","SidebarGroupLabel","SidebarFooter"],"mappings":"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","file":"dashboard.js","sourcesContent":["\"use client\";\r\n\r\nimport type { LucideIcon } from \"lucide-react\";\r\nimport type { ReactNode } from \"react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { Badge } from \"@/components/ui/badge\";\r\nimport { Skeleton } from \"@/components/ui/skeleton\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface HeaderAction {\r\n text: string;\r\n onClick?: () => void;\r\n disabled?: boolean;\r\n variant?: \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\";\r\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\r\n className?: string;\r\n icon?: LucideIcon;\r\n iconPosition?: \"left\" | \"right\";\r\n loadingText?: string;\r\n loading?: boolean;\r\n}\r\n\r\nexport interface HeaderBadge {\r\n text: string;\r\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"outline\";\r\n className?: string;\r\n}\r\n\r\nexport interface HeaderMetadata {\r\n text: string;\r\n icon?: LucideIcon;\r\n}\r\n\r\nexport interface HeaderSectionProps {\r\n title?: string;\r\n description?: string;\r\n actions?: HeaderAction[] | null;\r\n icon?: LucideIcon | null;\r\n iconClassName?: string;\r\n loading?: boolean;\r\n variant?: \"default\" | \"compact\" | \"hero\" | \"minimal\";\r\n className?: string;\r\n badge?: HeaderBadge | ReactNode;\r\n breadcrumbs?: ReactNode;\r\n metadata?: HeaderMetadata[];\r\n children?: ReactNode;\r\n}\r\n\r\nconst variants = {\r\n default: {\r\n wrapper: \"px-6 py-5 rounded-xl shadow-sm border bg-background hover:shadow-md\",\r\n title: \"text-2xl font-semibold tracking-tight\",\r\n description: \"text-sm text-muted-foreground\",\r\n iconSize: \"size-10\",\r\n iconInner: \"size-5\",\r\n spacing: \"space-y-1\",\r\n },\r\n compact: {\r\n wrapper: \"px-4 py-3 rounded-lg border bg-background/50\",\r\n title: \"text-lg font-semibold\",\r\n description: \"text-xs text-muted-foreground\",\r\n iconSize: \"size-8\",\r\n iconInner: \"size-4\",\r\n spacing: \"space-y-0.5\",\r\n },\r\n hero: {\r\n wrapper: \"px-8 py-8 rounded-2xl shadow-lg border bg-gradient-to-br from-background to-muted/20\",\r\n title: \"text-3xl font-bold tracking-tight bg-gradient-to-r from-foreground to-foreground/70 bg-clip-text text-transparent\",\r\n description: \"text-base text-muted-foreground mt-2\",\r\n iconSize: \"size-14\",\r\n iconInner: \"size-7\",\r\n spacing: \"space-y-2\",\r\n },\r\n minimal: {\r\n wrapper: \"px-0 py-2\",\r\n title: \"text-xl font-medium\",\r\n description: \"text-sm text-muted-foreground\",\r\n iconSize: \"size-8\",\r\n iconInner: \"size-4\",\r\n spacing: \"space-y-0.5\",\r\n },\r\n} as const;\r\n\r\nexport function HeaderSection({\r\n title,\r\n description,\r\n actions = null,\r\n icon: Icon = null,\r\n iconClassName,\r\n loading = false,\r\n variant = \"default\",\r\n className,\r\n badge,\r\n breadcrumbs,\r\n metadata,\r\n children,\r\n}: HeaderSectionProps) {\r\n const currentVariant = variants[variant] || variants.default;\r\n\r\n const isBadgeObject = (badge: HeaderBadge | ReactNode): badge is HeaderBadge => {\r\n return typeof badge === \"object\" && badge !== null && \"text\" in badge;\r\n };\r\n\r\n // Loading state\r\n if (loading && !title) {\r\n return (\r\n <div className={cn(currentVariant.wrapper, \"transition-all duration-300\", className)}>\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n {Icon && <Skeleton className={cn(currentVariant.iconSize, \"rounded-lg\")} />}\r\n <div className={currentVariant.spacing}>\r\n <Skeleton className=\"h-7 w-48\" />\r\n <Skeleton className=\"h-4 w-64 mt-1\" />\r\n </div>\r\n </div>\r\n {actions && (\r\n <div className=\"flex gap-2 mt-4 sm:mt-0\">\r\n <Skeleton className=\"h-9 w-24\" />\r\n <Skeleton className=\"h-9 w-24\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"transition-all duration-300\",\r\n currentVariant.wrapper,\r\n className\r\n )}\r\n >\r\n {/* Breadcrumbs */}\r\n {breadcrumbs && (\r\n <nav className=\"mb-3 text-sm text-muted-foreground\">\r\n {breadcrumbs}\r\n </nav>\r\n )}\r\n\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\r\n <div className=\"flex items-start sm:items-center gap-4\">\r\n {/* Icon */}\r\n {Icon && (\r\n <div\r\n className={cn(\r\n \"flex aspect-square items-center justify-center rounded-lg flex-shrink-0\",\r\n \"bg-primary/10 text-primary\",\r\n currentVariant.iconSize,\r\n iconClassName\r\n )}\r\n >\r\n <Icon className={currentVariant.iconInner} />\r\n </div>\r\n )}\r\n\r\n {/* Title and Description */}\r\n <div className={cn(\"flex-1\", currentVariant.spacing)}>\r\n <div className=\"flex items-center gap-2 flex-wrap\">\r\n <h1 className={cn(\"leading-none\", currentVariant.title)}>\r\n {title}\r\n </h1>\r\n {badge && (\r\n isBadgeObject(badge) ? (\r\n <Badge\r\n variant={badge.variant || \"secondary\"}\r\n className={cn(\"ml-2\", badge.className)}\r\n >\r\n {badge.text}\r\n </Badge>\r\n ) : (\r\n badge\r\n )\r\n )}\r\n </div>\r\n\r\n {description && (\r\n <p className={currentVariant.description}>{description}</p>\r\n )}\r\n\r\n {/* Metadata */}\r\n {metadata && (\r\n <div className=\"flex items-center gap-4 mt-2 text-xs text-muted-foreground\">\r\n {metadata.map((item, index) => (\r\n <div key={index} className=\"flex items-center gap-1\">\r\n {item.icon && <item.icon className=\"size-3\" />}\r\n <span>{item.text}</span>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n {actions && (\r\n <div className=\"flex flex-wrap gap-2 mt-4 sm:mt-0\">\r\n {actions.map((action, index) => {\r\n const isActionLoading = action.loading ?? false;\r\n const isDisabled = loading || action.disabled || isActionLoading;\r\n const displayText = isActionLoading\r\n ? (action.loadingText || action.text)\r\n : action.text;\r\n\r\n return (\r\n <Button\r\n key={index}\r\n onClick={action.onClick}\r\n disabled={isDisabled}\r\n variant={action.variant || \"default\"}\r\n size={action.size || (variant === \"compact\" ? \"sm\" : \"default\")}\r\n className={cn(\r\n variant === \"hero\" && \"shadow-md hover:shadow-lg\",\r\n action.className\r\n )}\r\n >\r\n {action.icon && action.iconPosition !== \"right\" && (\r\n <action.icon className=\"size-4 mr-2\" />\r\n )}\r\n <span>{displayText}</span>\r\n {action.icon && action.iconPosition === \"right\" && (\r\n <action.icon className=\"size-4 ml-2\" />\r\n )}\r\n </Button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Additional content slot */}\r\n {children && (\r\n <div\r\n className={cn(\r\n \"mt-4 pt-4 border-t\",\r\n variant === \"minimal\" && \"border-0 pt-2\"\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport Link from \"next/link\";\r\nimport {\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from \"@/components/ui/breadcrumb\";\r\nimport { Separator } from \"@/components/ui/separator\";\r\nimport { SidebarTrigger } from \"@/components/ui/sidebar\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface BreadcrumbItemData {\r\n label: string;\r\n href?: string;\r\n current?: boolean;\r\n}\r\n\r\nexport interface PageHeaderProps {\r\n items: BreadcrumbItemData[];\r\n className?: string;\r\n actions?: React.ReactNode;\r\n}\r\n\r\nexport function PageHeader({ items, className, actions }: PageHeaderProps) {\r\n return (\r\n <header\r\n className={cn(\r\n \"flex h-12 shrink-0 items-center justify-between gap-2\",\r\n className,\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <SidebarTrigger className=\"-ml-1\" />\r\n <Separator orientation=\"vertical\" className=\"!self-center h-4\" />\r\n <Breadcrumb>\r\n <BreadcrumbList>\r\n {items.map((item, index) => (\r\n <React.Fragment key={`breadcrumb-${index}`}>\r\n <BreadcrumbItem\r\n className={item.current ? \"\" : \"hidden md:block\"}\r\n >\r\n {item.current ? (\r\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\r\n ) : (\r\n <BreadcrumbLink render={<Link href={item.href || \"#\"} />}>\r\n {item.label}\r\n </BreadcrumbLink>\r\n )}\r\n </BreadcrumbItem>\r\n {index < items.length - 1 && (\r\n <BreadcrumbSeparator className=\"hidden md:block\" />\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n </div>\r\n {actions}\r\n </header>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface DashboardContentProps {\r\n /** Content to render inside the dashboard area */\r\n children: React.ReactNode;\r\n /** Additional className for the outer wrapper */\r\n className?: string;\r\n /** Enable @container queries on the content area */\r\n container?: boolean | string;\r\n /** Horizontal padding — defaults to \"md\" */\r\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\n// ============================================================================\r\n// PADDING MAP\r\n// ============================================================================\r\n\r\nconst PADDING = {\r\n none: \"\",\r\n sm: \"px-2\",\r\n md: \"px-4\",\r\n lg: \"px-6 lg:px-8\",\r\n} as const;\r\n\r\n// ============================================================================\r\n// DASHBOARD CONTENT\r\n// ============================================================================\r\n\r\n/**\r\n * DashboardContent — Safe content wrapper for sidebar layouts.\r\n *\r\n * Prevents the classic flexbox overflow bug where children with\r\n * `max-w-*` or grid layouts extend beyond the available space\r\n * (behind the sidebar) by propagating `min-w-0` through the\r\n * flex chain.\r\n *\r\n * **Important**: `SidebarInset` also needs `min-w-0` for the\r\n * width constraint to propagate correctly from the flex parent.\r\n * Pass `className=\"min-w-0\"` to `SidebarInset`.\r\n *\r\n * @example\r\n * ```tsx\r\n * <SidebarProvider>\r\n * <AppSidebar />\r\n * <SidebarInset className=\"min-w-0\">\r\n * <DashboardContent>\r\n * <PageHeader items={breadcrumbs} />\r\n * <MyPageContent />\r\n * </DashboardContent>\r\n * </SidebarInset>\r\n * </SidebarProvider>\r\n * ```\r\n */\r\nexport function DashboardContent({\r\n children,\r\n className,\r\n container = true,\r\n padding = \"md\",\r\n}: DashboardContentProps) {\r\n // Build @container attribute\r\n const containerClass =\r\n container === true\r\n ? \"@container/main\"\r\n : typeof container === \"string\"\r\n ? `@container/${container}`\r\n : \"\";\r\n\r\n return (\r\n <div className={cn(\"flex flex-1 flex-col min-w-0\", className)}>\r\n <div\r\n className={cn(\r\n \"flex flex-1 flex-col gap-2 min-w-0\",\r\n containerClass,\r\n PADDING[padding],\r\n )}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport Link from \"next/link\";\r\nimport {\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n useSidebar,\r\n} from \"@/components/ui/sidebar\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport interface SidebarBrandProps {\r\n /** Brand title text */\r\n title: string;\r\n /** Brand icon/logo element */\r\n icon: React.ReactNode;\r\n /** Link href (defaults to \"/\") */\r\n href?: string;\r\n /** Additional className */\r\n className?: string;\r\n /** Tooltip text when collapsed (defaults to title) */\r\n tooltip?: string;\r\n}\r\n\r\n/**\r\n * SidebarBrand - Logo and title section for dashboard sidebar.\r\n * Automatically handles collapsed state styling.\r\n */\r\nexport function SidebarBrand({\r\n title,\r\n icon,\r\n href = \"/\",\r\n className,\r\n tooltip,\r\n}: SidebarBrandProps) {\r\n const { isMobile, state } = useSidebar();\r\n const isCollapsed = state === \"collapsed\";\r\n\r\n return (\r\n <SidebarMenu className={className}>\r\n <SidebarMenuItem>\r\n <SidebarMenuButton\r\n size=\"lg\"\r\n className=\"group-data-[collapsible=icon]:p-0!\"\r\n tooltip={isCollapsed ? tooltip || title : undefined}\r\n render={\r\n <Link\r\n href={href}\r\n className={cn(\r\n \"flex items-center text-sidebar-foreground\",\r\n isCollapsed && !isMobile && \"justify-center\",\r\n )}\r\n />\r\n }\r\n >\r\n <div\r\n className={cn(\r\n \"rounded-lg flex items-center justify-center bg-sidebar-primary text-sidebar-primary-foreground shadow-sm flex-shrink-0 transition-[width,height]\",\r\n isCollapsed && !isMobile ? \"h-6 w-6\" : \"h-8 w-8\",\r\n )}\r\n >\r\n {icon}\r\n </div>\r\n <span\r\n className={cn(\r\n \"ml-2 font-semibold tracking-tight truncate\",\r\n !isMobile && isCollapsed && \"hidden\",\r\n )}\r\n >\r\n {title}\r\n </span>\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport Link from \"next/link\";\r\nimport { ChevronRight, type LucideIcon } from \"lucide-react\";\r\nimport {\r\n SidebarGroup,\r\n SidebarGroupLabel,\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarMenuSub,\r\n SidebarMenuSubButton,\r\n SidebarMenuSubItem,\r\n} from \"@/components/ui/sidebar\";\r\nimport {\r\n Collapsible,\r\n CollapsibleContent,\r\n CollapsibleTrigger,\r\n} from \"@/components/ui/collapsible\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface NavSubItem {\r\n title: string;\r\n url: string;\r\n badge?: string | number;\r\n isActive?: boolean;\r\n}\r\n\r\nexport interface NavItem {\r\n title: string;\r\n url: string;\r\n icon?: LucideIcon;\r\n isActive?: boolean;\r\n badge?: string | number;\r\n items?: NavSubItem[];\r\n}\r\n\r\nexport interface NavGroup {\r\n title?: string;\r\n items: NavItem[];\r\n}\r\n\r\nexport interface SidebarNavProps {\r\n /** Navigation groups to render */\r\n groups: NavGroup[];\r\n /** Additional className */\r\n className?: string;\r\n /** Callback when a nav item is clicked */\r\n onItemClick?: (item: NavItem) => void;\r\n}\r\n\r\nexport interface SidebarNavGroupProps {\r\n /** Group title (optional) */\r\n title?: string;\r\n /** Navigation items in this group */\r\n items: NavItem[];\r\n /** Additional className */\r\n className?: string;\r\n /** Callback when an item is clicked */\r\n onItemClick?: (item: NavItem) => void;\r\n}\r\n\r\nexport interface SidebarNavItemProps {\r\n /** The navigation item data */\r\n item: NavItem;\r\n /** Callback when clicked */\r\n onClick?: () => void;\r\n}\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\n/**\r\n * SidebarNavItem - Single navigation item with optional sub-items.\r\n */\r\nexport function SidebarNavItem({ item, onClick }: SidebarNavItemProps) {\r\n const hasSubItems = item.items && item.items.length > 0;\r\n const Icon = item.icon;\r\n // Use controlled state to avoid Base UI warning about changing defaultOpen\r\n const [open, setOpen] = useState(item.isActive ?? false);\r\n\r\n if (hasSubItems) {\r\n return (\r\n <SidebarMenuItem>\r\n <Collapsible\r\n open={open}\r\n onOpenChange={setOpen}\r\n className=\"group/collapsible\"\r\n >\r\n <CollapsibleTrigger\r\n render={<SidebarMenuButton />}\r\n >\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n <span>{item.title}</span>\r\n {item.badge && (\r\n <span className=\"ml-auto text-xs bg-sidebar-accent text-sidebar-accent-foreground px-1.5 py-0.5 rounded\">\r\n {item.badge}\r\n </span>\r\n )}\r\n <ChevronRight className=\"ml-auto h-4 w-4 transition-transform duration-200 group-data-open/collapsible:rotate-90\" />\r\n </CollapsibleTrigger>\r\n <CollapsibleContent>\r\n <SidebarMenuSub>\r\n {item.items!.map((subItem, idx) => (\r\n <SidebarMenuSubItem key={`${item.title}-${subItem.title}-${idx}`}>\r\n <SidebarMenuSubButton render={<Link href={subItem.url} />} isActive={subItem.isActive}>\r\n <span>{subItem.title}</span>\r\n {subItem.badge && (\r\n <span className=\"ml-auto text-xs opacity-60\">\r\n {subItem.badge}\r\n </span>\r\n )}\r\n </SidebarMenuSubButton>\r\n </SidebarMenuSubItem>\r\n ))}\r\n </SidebarMenuSub>\r\n </CollapsibleContent>\r\n </Collapsible>\r\n </SidebarMenuItem>\r\n );\r\n }\r\n\r\n // Note: Cannot use tooltip prop with render prop together in shadcn's SidebarMenuButton\r\n // as tooltip replaces the render element. Navigation takes priority over collapsed tooltip.\r\n return (\r\n <SidebarMenuItem>\r\n <Link href={item.url} className=\"w-full\">\r\n <SidebarMenuButton\r\n isActive={item.isActive}\r\n onClick={onClick}\r\n >\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n <span>{item.title}</span>\r\n {item.badge && (\r\n <span className=\"ml-auto text-xs bg-sidebar-accent text-sidebar-accent-foreground px-1.5 py-0.5 rounded\">\r\n {item.badge}\r\n </span>\r\n )}\r\n </SidebarMenuButton>\r\n </Link>\r\n </SidebarMenuItem>\r\n );\r\n}\r\n\r\n/**\r\n * SidebarNavGroup - A group of navigation items with optional title.\r\n */\r\nexport function SidebarNavGroup({\r\n title,\r\n items,\r\n className,\r\n onItemClick,\r\n}: SidebarNavGroupProps) {\r\n return (\r\n <SidebarGroup className={className}>\r\n {title && <SidebarGroupLabel>{title}</SidebarGroupLabel>}\r\n <SidebarMenu>\r\n {items.map((item, idx) => (\r\n <SidebarNavItem\r\n key={`${item.title}-${idx}`}\r\n item={item}\r\n onClick={() => onItemClick?.(item)}\r\n />\r\n ))}\r\n </SidebarMenu>\r\n </SidebarGroup>\r\n );\r\n}\r\n\r\n/**\r\n * SidebarNav - Complete navigation section with multiple groups.\r\n */\r\nexport function SidebarNav({ groups, className, onItemClick }: SidebarNavProps) {\r\n return (\r\n <div className={cn(\"flex flex-col gap-2\", className)}>\r\n {groups.map((group, index) => (\r\n <SidebarNavGroup\r\n key={group.title || `nav-group-${index}`}\r\n title={group.title}\r\n items={group.items}\r\n onItemClick={onItemClick}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport Link from \"next/link\";\r\nimport { ChevronsUpDown, CircleUserRound, LogOut, type LucideIcon } from \"lucide-react\";\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuGroup,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuTrigger,\r\n} from \"@/components/ui/dropdown-menu\";\r\nimport {\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n useSidebar,\r\n} from \"@/components/ui/sidebar\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface UserData {\r\n name: string;\r\n email: string;\r\n avatar?: string;\r\n}\r\n\r\nexport interface UserMenuItem {\r\n label: string;\r\n icon?: LucideIcon;\r\n href?: string;\r\n onClick?: () => void;\r\n separator?: boolean;\r\n}\r\n\r\nexport interface SidebarUserMenuProps {\r\n /** User data to display */\r\n user: UserData;\r\n /** Menu items (account, settings, etc.) */\r\n menuItems?: UserMenuItem[];\r\n /** Logout handler */\r\n onLogout?: () => void;\r\n /** Additional className */\r\n className?: string;\r\n}\r\n\r\n// ============================================\r\n// Helpers\r\n// ============================================\r\n\r\nfunction getUserInitials(name?: string): string {\r\n if (!name) return \"?\";\r\n const names = name.trim().split(\" \");\r\n if (names.length === 1) return names[0].slice(0, 2).toUpperCase();\r\n return (names[0][0] + names[names.length - 1][0]).toUpperCase();\r\n}\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\nfunction UserAvatar({ user, className }: { user: UserData; className?: string }) {\r\n return (\r\n <Avatar className={cn(\"h-8 w-8 rounded-lg\", className)}>\r\n <AvatarImage src={user.avatar} alt={user.name} />\r\n <AvatarFallback className=\"rounded-lg bg-sidebar-primary text-sidebar-primary-foreground\">\r\n {getUserInitials(user.name)}\r\n </AvatarFallback>\r\n </Avatar>\r\n );\r\n}\r\n\r\nfunction UserInfo({ user }: { user: UserData }) {\r\n return (\r\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\r\n <span className=\"truncate font-semibold\">{user.name}</span>\r\n <span className=\"truncate text-xs text-muted-foreground\">{user.email}</span>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * SidebarUserMenu - User avatar and dropdown menu for sidebar footer.\r\n * Accepts handlers for logout and custom menu items.\r\n */\r\nexport function SidebarUserMenu({\r\n user,\r\n menuItems = [],\r\n onLogout,\r\n className,\r\n}: SidebarUserMenuProps) {\r\n const { isMobile, state } = useSidebar();\r\n const isCollapsed = state === \"collapsed\";\r\n\r\n // Default menu items if none provided\r\n const defaultItems: UserMenuItem[] = [\r\n {\r\n label: \"Account\",\r\n icon: CircleUserRound,\r\n href: \"/dashboard/profile\",\r\n },\r\n ];\r\n\r\n const items = menuItems.length > 0 ? menuItems : defaultItems;\r\n\r\n return (\r\n <SidebarMenu className={className}>\r\n <SidebarMenuItem>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n render={\r\n <SidebarMenuButton\r\n size=\"lg\"\r\n tooltip={isCollapsed ? user.name : undefined}\r\n className={cn(\r\n \"data-open:bg-sidebar-accent data-open:text-sidebar-accent-foreground\",\r\n isCollapsed && !isMobile && \"justify-center\"\r\n )}\r\n />\r\n }\r\n >\r\n <UserAvatar user={user} />\r\n {(!isCollapsed || isMobile) && (\r\n <>\r\n <UserInfo user={user} />\r\n <ChevronsUpDown className=\"ml-auto size-4\" />\r\n </>\r\n )}\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent\r\n className=\"w-(--anchor-width) min-w-56 rounded-lg\"\r\n side={isMobile ? \"bottom\" : \"right\"}\r\n align=\"end\"\r\n sideOffset={4}\r\n >\r\n <DropdownMenuGroup>\r\n <DropdownMenuLabel className=\"p-0 font-normal\">\r\n <div className=\"flex items-center gap-2 px-1 py-1.5 text-left text-sm\">\r\n <UserAvatar user={user} />\r\n <UserInfo user={user} />\r\n </div>\r\n </DropdownMenuLabel>\r\n </DropdownMenuGroup>\r\n <DropdownMenuSeparator />\r\n\r\n <DropdownMenuGroup>\r\n {items.map((item, index) => (\r\n <React.Fragment key={item.label}>\r\n {item.separator && index > 0 && <DropdownMenuSeparator />}\r\n {item.href ? (\r\n <DropdownMenuItem\r\n render={<Link href={item.href} />}\r\n className=\"w-full flex items-center\"\r\n >\r\n {item.icon && <item.icon className=\"mr-2 h-4 w-4\" />}\r\n {item.label}\r\n </DropdownMenuItem>\r\n ) : (\r\n <DropdownMenuItem\r\n onClick={item.onClick}\r\n className=\"w-full flex items-center\"\r\n >\r\n {item.icon && <item.icon className=\"mr-2 h-4 w-4\" />}\r\n {item.label}\r\n </DropdownMenuItem>\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </DropdownMenuGroup>\r\n\r\n {onLogout && (\r\n <>\r\n <DropdownMenuSeparator />\r\n <DropdownMenuItem\r\n onClick={onLogout}\r\n className=\"w-full flex items-center\"\r\n >\r\n <LogOut className=\"mr-2 h-4 w-4\" />\r\n Log out\r\n </DropdownMenuItem>\r\n </>\r\n )}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { Building2, Check, ChevronsUpDown, type LucideIcon } from \"lucide-react\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuGroup,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuTrigger,\r\n} from \"@/components/ui/dropdown-menu\";\r\nimport {\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n useSidebar,\r\n} from \"@/components/ui/sidebar\";\r\nimport { Badge } from \"@/components/ui/badge\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { Skeleton } from \"@/components/ui/skeleton\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface ProjectItem {\r\n /** Unique identifier */\r\n id: string;\r\n /** Display name */\r\n name: string;\r\n /** Short code or identifier */\r\n code?: string;\r\n /** Optional type badge */\r\n type?: string;\r\n /** Is this the default project */\r\n isDefault?: boolean;\r\n /** Is this project active */\r\n isActive?: boolean;\r\n /** Optional subtitle/description */\r\n subtitle?: string;\r\n}\r\n\r\nexport interface ProjectSwitcherProps {\r\n /** List of available projects */\r\n items: ProjectItem[];\r\n /** Currently selected project */\r\n selected?: ProjectItem;\r\n /** Callback when a project is selected */\r\n onSelect: (project: ProjectItem) => void;\r\n /** Whether the data is loading */\r\n isLoading?: boolean;\r\n /** Label shown in dropdown header */\r\n label?: string;\r\n /** Icon to display (defaults to Building2) */\r\n icon?: LucideIcon;\r\n /** Additional className */\r\n className?: string;\r\n /** Whether to show as disabled (single item) */\r\n disabled?: boolean;\r\n /**\r\n * Render variant:\r\n * - \"sidebar\": Uses SidebarMenu components, requires SidebarProvider context\r\n * - \"standalone\": Uses Button, works anywhere (headers, toolbars, etc.)\r\n */\r\n variant?: \"sidebar\" | \"standalone\";\r\n /** Size for standalone variant (ignored in sidebar variant) */\r\n size?: \"sm\" | \"default\";\r\n /** Render custom item content */\r\n renderItem?: (item: ProjectItem, isSelected: boolean) => React.ReactNode;\r\n}\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\n// Shared dropdown content for both variants\r\nfunction DropdownContent({\r\n items,\r\n selected,\r\n onSelect,\r\n label,\r\n renderItem,\r\n isMobile = false,\r\n}: {\r\n items: ProjectItem[];\r\n selected: ProjectItem;\r\n onSelect: (project: ProjectItem) => void;\r\n label: string;\r\n renderItem?: (item: ProjectItem, isSelected: boolean) => React.ReactNode;\r\n isMobile?: boolean;\r\n}) {\r\n return (\r\n <DropdownMenuContent\r\n className=\"w-64 rounded-lg\"\r\n side={isMobile ? \"bottom\" : \"right\"}\r\n align=\"start\"\r\n sideOffset={4}\r\n >\r\n <DropdownMenuGroup>\r\n <DropdownMenuLabel className=\"text-xs text-muted-foreground font-normal\">\r\n {label}\r\n </DropdownMenuLabel>\r\n {items.map((item) => {\r\n const isSelected = selected.id === item.id;\r\n\r\n if (renderItem) {\r\n return (\r\n <DropdownMenuItem\r\n key={item.id}\r\n onClick={() => onSelect(item)}\r\n className=\"cursor-pointer\"\r\n >\r\n {renderItem(item, isSelected)}\r\n </DropdownMenuItem>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenuItem\r\n key={item.id}\r\n onClick={() => onSelect(item)}\r\n className=\"gap-2 cursor-pointer\"\r\n >\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <span className=\"font-medium text-sm truncate\">{item.name}</span>\r\n {isSelected && (\r\n <Check className=\"size-3.5 text-primary shrink-0\" />\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-1.5 mt-0.5\">\r\n {item.code && (\r\n <span className=\"text-xs text-muted-foreground\">{item.code}</span>\r\n )}\r\n {item.type && (\r\n <>\r\n {item.code && (\r\n <span className=\"text-xs text-muted-foreground\">•</span>\r\n )}\r\n <Badge variant=\"outline\" className=\"text-[10px] h-4 px-1\">\r\n {item.type}\r\n </Badge>\r\n </>\r\n )}\r\n {item.isDefault && (\r\n <Badge variant=\"secondary\" className=\"text-[10px] h-4 px-1\">\r\n Default\r\n </Badge>\r\n )}\r\n {item.isActive === false && (\r\n <Badge variant=\"destructive\" className=\"text-[10px] h-4 px-1\">\r\n Inactive\r\n </Badge>\r\n )}\r\n </div>\r\n {item.subtitle && (\r\n <p className=\"text-[10px] text-muted-foreground mt-0.5 truncate\">\r\n {item.subtitle}\r\n </p>\r\n )}\r\n </div>\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuGroup>\r\n </DropdownMenuContent>\r\n );\r\n}\r\n\r\n// Sidebar variant components\r\nfunction SidebarLoadingSkeleton({ isCollapsed, isMobile }: { isCollapsed: boolean; isMobile: boolean }) {\r\n return (\r\n <SidebarMenu>\r\n <SidebarMenuItem>\r\n <SidebarMenuButton\r\n className={cn(\r\n \"h-10 py-1.5 bg-sidebar-accent/50\",\r\n isCollapsed && !isMobile && \"justify-center\"\r\n )}\r\n disabled\r\n >\r\n <Skeleton className=\"h-4 w-4 rounded-sm shrink-0\" />\r\n {(!isCollapsed || isMobile) && (\r\n <div className=\"flex-1 min-w-0 space-y-1\">\r\n <Skeleton className=\"h-3 w-24\" />\r\n <Skeleton className=\"h-2.5 w-14\" />\r\n </div>\r\n )}\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n}\r\n\r\nfunction SidebarProjectDisplay({\r\n project,\r\n Icon,\r\n isCollapsed,\r\n isMobile,\r\n}: {\r\n project: ProjectItem;\r\n Icon: LucideIcon;\r\n isCollapsed: boolean;\r\n isMobile: boolean;\r\n}) {\r\n return (\r\n <>\r\n <Icon className=\"h-4 w-4 text-muted-foreground shrink-0\" />\r\n {(!isCollapsed || isMobile) && (\r\n <div className=\"flex-1 min-w-0 leading-tight text-left\">\r\n <p className=\"text-xs font-medium truncate\">{project.name}</p>\r\n {project.code && (\r\n <p className=\"text-[10px] text-muted-foreground truncate\">\r\n {project.code}\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\n// Standalone variant components\r\nfunction StandaloneLoadingSkeleton({ size }: { size: \"sm\" | \"default\" }) {\r\n return (\r\n <Button\r\n variant=\"outline\"\r\n size={size}\r\n className={cn(\"gap-2\", size === \"sm\" ? \"h-8\" : \"h-9\")}\r\n disabled\r\n >\r\n <Skeleton className=\"h-4 w-4 rounded-sm\" />\r\n <Skeleton className=\"h-3 w-20\" />\r\n </Button>\r\n );\r\n}\r\n\r\nfunction StandaloneProjectDisplay({\r\n project,\r\n Icon,\r\n size,\r\n}: {\r\n project: ProjectItem;\r\n Icon: LucideIcon;\r\n size: \"sm\" | \"default\";\r\n}) {\r\n return (\r\n <>\r\n <Icon className={cn(\"text-muted-foreground shrink-0\", size === \"sm\" ? \"h-3.5 w-3.5\" : \"h-4 w-4\")} />\r\n <span className={cn(\"font-medium truncate max-w-[120px]\", size === \"sm\" ? \"text-xs\" : \"text-sm\")}>\r\n {project.name}\r\n </span>\r\n {project.code && (\r\n <span className={cn(\"text-muted-foreground truncate\", size === \"sm\" ? \"text-[10px]\" : \"text-xs\")}>\r\n ({project.code})\r\n </span>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\n/**\r\n * ProjectSwitcher - Generic project/workspace/branch switcher.\r\n * Works for any entity that needs switching functionality.\r\n *\r\n * @example Sidebar usage (inside SidebarProvider)\r\n * ```tsx\r\n * <ProjectSwitcher\r\n * items={projects}\r\n * selected={selectedProject}\r\n * onSelect={setSelectedProject}\r\n * />\r\n * ```\r\n *\r\n * @example Header/Standalone usage (no SidebarProvider needed)\r\n * ```tsx\r\n * <ProjectSwitcher\r\n * variant=\"standalone\"\r\n * items={projects}\r\n * selected={selectedProject}\r\n * onSelect={setSelectedProject}\r\n * size=\"sm\"\r\n * />\r\n * ```\r\n */\r\nexport function ProjectSwitcher({\r\n items,\r\n selected,\r\n onSelect,\r\n isLoading = false,\r\n label = \"Switch Project\",\r\n icon: Icon = Building2,\r\n className,\r\n disabled = false,\r\n variant = \"sidebar\",\r\n size = \"default\",\r\n renderItem,\r\n}: ProjectSwitcherProps) {\r\n const hasMultipleItems = items.length > 1;\r\n\r\n // Standalone variant - doesn't need SidebarProvider\r\n if (variant === \"standalone\") {\r\n if (isLoading) {\r\n return <StandaloneLoadingSkeleton size={size} />;\r\n }\r\n\r\n if (!selected) {\r\n return null;\r\n }\r\n\r\n if (!hasMultipleItems || disabled) {\r\n return (\r\n <Button\r\n variant=\"outline\"\r\n size={size}\r\n className={cn(\"gap-2 cursor-default\", size === \"sm\" ? \"h-8\" : \"h-9\", className)}\r\n disabled\r\n >\r\n <StandaloneProjectDisplay project={selected} Icon={Icon} size={size} />\r\n </Button>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n render={\r\n <Button\r\n variant=\"outline\"\r\n size={size}\r\n className={cn(\"gap-2\", size === \"sm\" ? \"h-8\" : \"h-9\", className)}\r\n />\r\n }\r\n >\r\n <StandaloneProjectDisplay project={selected} Icon={Icon} size={size} />\r\n <ChevronsUpDown className={cn(\"text-muted-foreground shrink-0\", size === \"sm\" ? \"h-3 w-3\" : \"h-3.5 w-3.5\")} />\r\n </DropdownMenuTrigger>\r\n <DropdownContent\r\n items={items}\r\n selected={selected}\r\n onSelect={onSelect}\r\n label={label}\r\n renderItem={renderItem}\r\n />\r\n </DropdownMenu>\r\n );\r\n }\r\n\r\n // Sidebar variant - requires SidebarProvider context\r\n const { isMobile, state } = useSidebar();\r\n const isCollapsed = state === \"collapsed\";\r\n\r\n if (isLoading) {\r\n return <SidebarLoadingSkeleton isCollapsed={isCollapsed} isMobile={isMobile} />;\r\n }\r\n\r\n if (!selected) {\r\n return null;\r\n }\r\n\r\n if (!hasMultipleItems || disabled) {\r\n return (\r\n <SidebarMenu className={className}>\r\n <SidebarMenuItem>\r\n <SidebarMenuButton\r\n className={cn(\r\n \"h-10 py-1.5 bg-sidebar-accent/50\",\r\n isCollapsed && !isMobile && \"justify-center\"\r\n )}\r\n tooltip={isCollapsed ? selected.name : undefined}\r\n disabled\r\n >\r\n <SidebarProjectDisplay\r\n project={selected}\r\n Icon={Icon}\r\n isCollapsed={isCollapsed}\r\n isMobile={isMobile}\r\n />\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n }\r\n\r\n return (\r\n <SidebarMenu className={className}>\r\n <SidebarMenuItem>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n render={\r\n <SidebarMenuButton\r\n className={cn(\r\n \"h-10 py-1.5 bg-sidebar-accent/50 hover:bg-sidebar-accent transition-colors\",\r\n isCollapsed && !isMobile && \"justify-center\"\r\n )}\r\n tooltip={isCollapsed ? selected.name : undefined}\r\n />\r\n }\r\n >\r\n <SidebarProjectDisplay\r\n project={selected}\r\n Icon={Icon}\r\n isCollapsed={isCollapsed}\r\n isMobile={isMobile}\r\n />\r\n {(!isCollapsed || isMobile) && (\r\n <ChevronsUpDown className=\"h-3 w-3 text-muted-foreground shrink-0\" />\r\n )}\r\n </DropdownMenuTrigger>\r\n <DropdownContent\r\n items={items}\r\n selected={selected}\r\n onSelect={onSelect}\r\n label={label}\r\n renderItem={renderItem}\r\n isMobile={isMobile}\r\n />\r\n </DropdownMenu>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport Link from \"next/link\";\r\nimport { SidebarTrigger } from \"@/components/ui/sidebar\";\r\nimport { Separator } from \"@/components/ui/separator\";\r\nimport {\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbLink,\r\n BreadcrumbList,\r\n BreadcrumbPage,\r\n BreadcrumbSeparator,\r\n} from \"@/components/ui/breadcrumb\";\r\nimport { cn } from \"../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface BreadcrumbItem {\r\n label: string;\r\n href?: string;\r\n current?: boolean;\r\n}\r\n\r\nexport interface DashboardHeaderProps {\r\n /** Breadcrumb items */\r\n breadcrumbs?: BreadcrumbItem[];\r\n /** Content to show on the left (after breadcrumbs) */\r\n leftContent?: React.ReactNode;\r\n /** Content to show on the right (actions, mode toggle, etc.) */\r\n rightContent?: React.ReactNode;\r\n /** Whether to show sidebar trigger */\r\n showSidebarTrigger?: boolean;\r\n /** Additional className */\r\n className?: string;\r\n /** Custom content (replaces default breadcrumb) */\r\n children?: React.ReactNode;\r\n}\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\nfunction BreadcrumbNav({ items }: { items: BreadcrumbItem[] }) {\r\n return (\r\n <Breadcrumb>\r\n <BreadcrumbList>\r\n {items.map((item, index) => (\r\n <React.Fragment key={`breadcrumb-${index}`}>\r\n <BreadcrumbItem className={item.current ? \"\" : \"hidden md:block\"}>\r\n {item.current ? (\r\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\r\n ) : (\r\n <BreadcrumbLink render={<Link href={item.href || \"#\"} />}>\r\n {item.label}\r\n </BreadcrumbLink>\r\n )}\r\n </BreadcrumbItem>\r\n {index < items.length - 1 && (\r\n <BreadcrumbSeparator className=\"hidden md:block\" />\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </BreadcrumbList>\r\n </Breadcrumb>\r\n );\r\n}\r\n\r\n/**\r\n * DashboardHeader - Top header bar for dashboard pages.\r\n * Includes sidebar trigger, breadcrumbs, and action slots.\r\n */\r\nexport function DashboardHeader({\r\n breadcrumbs,\r\n leftContent,\r\n rightContent,\r\n showSidebarTrigger = true,\r\n className,\r\n children,\r\n}: DashboardHeaderProps) {\r\n return (\r\n <header\r\n className={cn(\r\n \"flex h-12 shrink-0 items-center justify-between gap-2\",\r\n className\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {showSidebarTrigger && (\r\n <>\r\n <SidebarTrigger className=\"-ml-1\" />\r\n <Separator orientation=\"vertical\" className=\"mr-2 h-4\" />\r\n </>\r\n )}\r\n\r\n {children ? (\r\n children\r\n ) : (\r\n <>\r\n {breadcrumbs && breadcrumbs.length > 0 && (\r\n <BreadcrumbNav items={breadcrumbs} />\r\n )}\r\n {leftContent}\r\n </>\r\n )}\r\n </div>\r\n\r\n {rightContent && <div className=\"flex items-center gap-2\">{rightContent}</div>}\r\n </header>\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { type LucideIcon } from \"lucide-react\";\r\nimport {\r\n Sidebar,\r\n SidebarContent,\r\n SidebarFooter,\r\n SidebarHeader,\r\n useSidebar,\r\n} from \"@/components/ui/sidebar\";\r\nimport { SheetDescription, SheetTitle } from \"@/components/ui/sheet\";\r\nimport { SidebarBrand, type SidebarBrandProps } from \"../sidebar-brand\";\r\nimport { SidebarNav, type NavGroup } from \"../sidebar-nav\";\r\nimport { SidebarUserMenu, type UserData, type UserMenuItem } from \"../sidebar-user-menu\";\r\nimport { ProjectSwitcher, type ProjectItem } from \"../project-switcher\";\r\nimport { cn } from \"../../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface InsetSidebarBrand {\r\n title: string;\r\n icon: React.ReactNode;\r\n href?: string;\r\n}\r\n\r\nexport interface InsetSidebarProject {\r\n items: ProjectItem[];\r\n selected?: ProjectItem;\r\n onSelect: (project: ProjectItem) => void;\r\n isLoading?: boolean;\r\n label?: string;\r\n icon?: LucideIcon;\r\n}\r\n\r\nexport interface InsetSidebarUser {\r\n data: UserData;\r\n menuItems?: UserMenuItem[];\r\n onLogout?: () => void;\r\n}\r\n\r\nexport interface InsetSidebarProps {\r\n /** Brand configuration */\r\n brand: InsetSidebarBrand;\r\n /** Navigation groups */\r\n navigation: NavGroup[];\r\n /** Secondary navigation (shown at bottom above user) */\r\n secondaryNavigation?: NavGroup[];\r\n /** Project/workspace switcher configuration */\r\n project?: InsetSidebarProject;\r\n /** User menu configuration */\r\n user?: InsetSidebarUser;\r\n /** Custom content to render in header (after brand/project switcher) */\r\n headerContent?: React.ReactNode;\r\n /** Accessibility label for the sidebar */\r\n ariaLabel?: string;\r\n /** Additional className */\r\n className?: string;\r\n /** Children to render in content area */\r\n children?: React.ReactNode;\r\n}\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\n/**\r\n * InsetSidebar - Complete sidebar preset with inset variant.\r\n * The standard dashboard sidebar with collapsible to icons.\r\n */\r\nexport function InsetSidebar({\r\n brand,\r\n navigation,\r\n secondaryNavigation,\r\n project,\r\n user,\r\n headerContent,\r\n ariaLabel = \"Navigation Menu\",\r\n className,\r\n children,\r\n}: InsetSidebarProps) {\r\n const { isMobile } = useSidebar();\r\n\r\n return (\r\n <Sidebar variant=\"inset\" collapsible=\"icon\" className={className}>\r\n {/* Accessibility labels for mobile sheet */}\r\n {isMobile && (\r\n <span className=\"sr-only\">\r\n <SheetTitle>{ariaLabel}</SheetTitle>\r\n <SheetDescription>\r\n Application navigation menu containing links to different sections\r\n </SheetDescription>\r\n </span>\r\n )}\r\n\r\n <SidebarHeader className=\"gap-1\">\r\n <SidebarBrand\r\n title={brand.title}\r\n icon={brand.icon}\r\n href={brand.href}\r\n />\r\n {project && (\r\n <ProjectSwitcher\r\n items={project.items}\r\n selected={project.selected}\r\n onSelect={project.onSelect}\r\n isLoading={project.isLoading}\r\n label={project.label}\r\n icon={project.icon}\r\n />\r\n )}\r\n {headerContent}\r\n </SidebarHeader>\r\n\r\n <SidebarContent>\r\n {children || (\r\n <>\r\n <SidebarNav groups={navigation} />\r\n {secondaryNavigation && (\r\n <SidebarNav groups={secondaryNavigation} className=\"mt-auto\" />\r\n )}\r\n </>\r\n )}\r\n </SidebarContent>\r\n\r\n {user && (\r\n <SidebarFooter>\r\n <SidebarUserMenu\r\n user={user.data}\r\n menuItems={user.menuItems}\r\n onLogout={user.onLogout}\r\n />\r\n </SidebarFooter>\r\n )}\r\n </Sidebar>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport Link from \"next/link\";\r\nimport { ChevronLeft, ChevronRight, type LucideIcon } from \"lucide-react\";\r\nimport {\r\n SidebarContent,\r\n SidebarFooter,\r\n SidebarHeader,\r\n SidebarMenu,\r\n SidebarMenuButton,\r\n SidebarMenuItem,\r\n SidebarGroup,\r\n SidebarGroupLabel,\r\n useSidebar,\r\n} from \"@/components/ui/sidebar\";\r\nimport { SheetDescription, SheetTitle } from \"@/components/ui/sheet\";\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\";\r\nimport {\r\n SidebarUserMenu,\r\n type UserData,\r\n type UserMenuItem,\r\n} from \"../sidebar-user-menu\";\r\nimport { cn } from \"../../utils\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface DualSidebarCategory {\r\n /** Unique identifier */\r\n id: string;\r\n /** Display name */\r\n name: string;\r\n /** Category icon */\r\n icon: LucideIcon;\r\n /** Sub-items in this category */\r\n items: DualSidebarItem[];\r\n}\r\n\r\nexport interface DualSidebarItem {\r\n title: string;\r\n url: string;\r\n icon?: LucideIcon;\r\n badge?: string | number;\r\n isActive?: boolean;\r\n}\r\n\r\nexport interface DualSidebarBrand {\r\n title: string;\r\n icon: React.ReactNode;\r\n href?: string;\r\n}\r\n\r\nexport interface DualSidebarUser {\r\n data: UserData;\r\n menuItems?: UserMenuItem[];\r\n onLogout?: () => void;\r\n}\r\n\r\nexport interface DualSidebarProps {\r\n /** Brand configuration */\r\n brand: DualSidebarBrand;\r\n /** Main categories with their items */\r\n categories: DualSidebarCategory[];\r\n /** User menu configuration */\r\n user?: DualSidebarUser;\r\n /** Initially active category ID */\r\n defaultCategoryId?: string;\r\n /** Callback when category changes */\r\n onCategoryChange?: (categoryId: string) => void;\r\n /** Whether the expanded panel starts collapsed */\r\n defaultCollapsed?: boolean;\r\n /** Rail color variant */\r\n railVariant?: \"default\" | \"dark\" | \"primary\" | \"muted\";\r\n /** Accessibility label */\r\n ariaLabel?: string;\r\n /** Additional className for outer container */\r\n className?: string;\r\n}\r\n\r\n// ============================================\r\n// Constants\r\n// ============================================\r\nconst SIDEBAR_RAIL_WIDTH = \"3.5rem\"; // 56px\r\nconst SIDEBAR_PANEL_WIDTH = \"13rem\"; // 208px\r\nconst SIDEBAR_WIDTH_EXPANDED = \"16.5rem\"; // 56px + 208px = 264px\r\nconst SIDEBAR_WIDTH_COLLAPSED = \"3.5rem\"; // Just the rail\r\nconst SIDEBAR_PADDING = \"0.5rem\"; // 8px padding on each side\r\n\r\n// Rail color variants\r\nconst railVariants = {\r\n default: \"bg-sidebar\",\r\n dark: \"bg-zinc-900 dark:bg-zinc-950\",\r\n primary: \"bg-primary\",\r\n muted: \"bg-muted\",\r\n};\r\n\r\nconst railTextVariants = {\r\n default: \"text-sidebar-foreground\",\r\n dark: \"text-zinc-100\",\r\n primary: \"text-primary-foreground\",\r\n muted: \"text-muted-foreground\",\r\n};\r\n\r\n// ============================================\r\n// Components\r\n// ============================================\r\n\r\n/**\r\n * DualSidebar - A sidebar with icon rail and collapsible expanded panel.\r\n * Mimics the inset sidebar variant structure for consistent styling.\r\n */\r\nexport function DualSidebar({\r\n brand,\r\n categories,\r\n user,\r\n defaultCategoryId,\r\n onCategoryChange,\r\n defaultCollapsed = false,\r\n railVariant = \"default\",\r\n ariaLabel = \"Navigation Menu\",\r\n className,\r\n}: DualSidebarProps) {\r\n const [activeCategory, setActiveCategory] = React.useState<string | null>(\r\n defaultCategoryId || (categories.length > 0 ? categories[0].id : null)\r\n );\r\n const [isExpanded, setIsExpanded] = React.useState(!defaultCollapsed);\r\n const { isMobile } = useSidebar();\r\n\r\n const handleCategorySelect = (id: string) => {\r\n setActiveCategory(id);\r\n onCategoryChange?.(id);\r\n // Auto-expand when selecting a category\r\n if (!isExpanded) {\r\n setIsExpanded(true);\r\n }\r\n };\r\n\r\n const toggleExpanded = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n\r\n const activeCategoryData =\r\n categories.find((c) => c.id === activeCategory) || null;\r\n\r\n const currentWidth = isExpanded ? SIDEBAR_WIDTH_EXPANDED : SIDEBAR_WIDTH_COLLAPSED;\r\n const totalWidth = `calc(${currentWidth} + ${SIDEBAR_PADDING} * 2)`;\r\n\r\n return (\r\n <>\r\n {/* Outer wrapper matching shadcn Sidebar structure */}\r\n <div\r\n className=\"group peer text-sidebar-foreground hidden md:block\"\r\n data-state=\"expanded\"\r\n data-collapsible=\"\"\r\n data-variant=\"inset\"\r\n data-side=\"left\"\r\n data-slot=\"sidebar\"\r\n >\r\n {/* Sidebar gap - reserves space in the layout */}\r\n <div\r\n data-slot=\"sidebar-gap\"\r\n className=\"relative bg-transparent transition-[width] duration-200 ease-linear\"\r\n style={{ width: totalWidth }}\r\n />\r\n\r\n {/* Fixed sidebar container */}\r\n <div\r\n data-slot=\"sidebar-container\"\r\n className={cn(\r\n \"fixed inset-y-0 left-0 z-10 hidden h-svh transition-[width] duration-200 ease-linear md:flex\",\r\n className\r\n )}\r\n style={{\r\n width: totalWidth,\r\n padding: SIDEBAR_PADDING,\r\n }}\r\n >\r\n {/* Inner sidebar with styling */}\r\n <div\r\n data-sidebar=\"sidebar\"\r\n data-slot=\"sidebar-inner\"\r\n className=\"bg-sidebar flex h-full w-full flex-row overflow-hidden rounded-lg border border-sidebar-border shadow-sm\"\r\n >\r\n {/* Accessibility labels for mobile */}\r\n {isMobile && (\r\n <span className=\"sr-only\">\r\n <SheetTitle>{ariaLabel}</SheetTitle>\r\n <SheetDescription>\r\n Navigation menu with category icons and expanded content\r\n </SheetDescription>\r\n </span>\r\n )}\r\n\r\n {/* Icon Rail */}\r\n <div\r\n className={cn(\r\n \"flex flex-col shrink-0 transition-colors\",\r\n railVariants[railVariant],\r\n railTextVariants[railVariant],\r\n isExpanded && \"border-r border-sidebar-border\"\r\n )}\r\n style={{ width: SIDEBAR_RAIL_WIDTH, minWidth: SIDEBAR_RAIL_WIDTH }}\r\n >\r\n {/* Brand Icon */}\r\n <div className=\"flex items-center justify-center p-2 h-14\">\r\n <Tooltip>\r\n <TooltipTrigger\r\n render={\r\n <Link\r\n href={brand.href || \"/\"}\r\n className={cn(\r\n \"flex items-center justify-center h-10 w-10 rounded-lg shadow-sm transition-colors\",\r\n railVariant === \"dark\" || railVariant === \"primary\"\r\n ? \"bg-white/10 hover:bg-white/20 text-inherit\"\r\n : \"bg-sidebar-primary text-sidebar-primary-foreground\"\r\n )}\r\n />\r\n }\r\n >\r\n {brand.icon}\r\n </TooltipTrigger>\r\n <TooltipContent side=\"right\">{brand.title}</TooltipContent>\r\n </Tooltip>\r\n </div>\r\n\r\n {/* Category Icons */}\r\n <div className=\"flex-1 flex flex-col gap-1 p-2\">\r\n {categories.map((category) => {\r\n const Icon = category.icon;\r\n const isActive = activeCategory === category.id;\r\n\r\n return (\r\n <Tooltip key={category.id}>\r\n <TooltipTrigger\r\n render={\r\n <button\r\n onClick={() => handleCategorySelect(category.id)}\r\n className={cn(\r\n \"flex items-center justify-center h-10 w-10 rounded-lg transition-colors\",\r\n isActive\r\n ? railVariant === \"dark\" || railVariant === \"primary\"\r\n ? \"bg-white/20\"\r\n : \"bg-sidebar-accent text-sidebar-accent-foreground\"\r\n : railVariant === \"dark\" || railVariant === \"primary\"\r\n ? \"hover:bg-white/10\"\r\n : \"hover:bg-sidebar-accent/50\"\r\n )}\r\n />\r\n }\r\n >\r\n <Icon className=\"h-5 w-5\" />\r\n </TooltipTrigger>\r\n <TooltipContent side=\"right\">{category.name}</TooltipContent>\r\n </Tooltip>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Collapse/Expand Toggle */}\r\n <div className=\"p-2\">\r\n <Tooltip>\r\n <TooltipTrigger\r\n render={\r\n <button\r\n onClick={toggleExpanded}\r\n className={cn(\r\n \"flex items-center justify-center h-10 w-10 rounded-lg transition-colors\",\r\n railVariant === \"dark\" || railVariant === \"primary\"\r\n ? \"hover:bg-white/10\"\r\n : \"hover:bg-sidebar-accent/50\"\r\n )}\r\n />\r\n }\r\n >\r\n {isExpanded ? (\r\n <ChevronLeft className=\"h-5 w-5\" />\r\n ) : (\r\n <ChevronRight className=\"h-5 w-5\" />\r\n )}\r\n </TooltipTrigger>\r\n <TooltipContent side=\"right\">\r\n {isExpanded ? \"Collapse sidebar\" : \"Expand sidebar\"}\r\n </TooltipContent>\r\n </Tooltip>\r\n </div>\r\n </div>\r\n\r\n {/* Expanded Panel */}\r\n <div\r\n className={cn(\r\n \"flex flex-col bg-sidebar overflow-hidden transition-[width,opacity] duration-200 ease-linear\",\r\n isExpanded ? \"opacity-100\" : \"opacity-0 w-0\"\r\n )}\r\n style={{ width: isExpanded ? SIDEBAR_PANEL_WIDTH : 0 }}\r\n >\r\n {activeCategoryData ? (\r\n <>\r\n <SidebarHeader className=\"h-14 border-b border-sidebar-border px-4 flex items-center shrink-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <activeCategoryData.icon className=\"h-5 w-5 text-sidebar-foreground\" />\r\n <span className=\"font-semibold text-sidebar-foreground truncate\">\r\n {activeCategoryData.name}\r\n </span>\r\n </div>\r\n </SidebarHeader>\r\n\r\n <SidebarContent className=\"flex-1 overflow-y-auto\">\r\n <SidebarGroup className=\"p-2\">\r\n <SidebarGroupLabel className=\"px-2 text-xs text-sidebar-foreground/60\">\r\n {activeCategoryData.name} Menu\r\n </SidebarGroupLabel>\r\n <SidebarMenu>\r\n {activeCategoryData.items.map((item, idx) => {\r\n const Icon = item.icon;\r\n return (\r\n <SidebarMenuItem\r\n key={`${activeCategoryData.id}-${item.title}-${idx}`}\r\n >\r\n <SidebarMenuButton\r\n isActive={item.isActive}\r\n render={<Link href={item.url} />}\r\n >\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n <span className=\"truncate\">{item.title}</span>\r\n {item.badge && (\r\n <span className=\"ml-auto text-xs bg-sidebar-accent text-sidebar-accent-foreground px-1.5 py-0.5 rounded shrink-0\">\r\n {item.badge}\r\n </span>\r\n )}\r\n </SidebarMenuButton>\r\n </SidebarMenuItem>\r\n );\r\n })}\r\n </SidebarMenu>\r\n </SidebarGroup>\r\n </SidebarContent>\r\n\r\n {user && (\r\n <SidebarFooter className=\"border-t border-sidebar-border shrink-0\">\r\n <SidebarUserMenu\r\n user={user.data}\r\n menuItems={user.menuItems}\r\n onLogout={user.onLogout}\r\n />\r\n </SidebarFooter>\r\n )}\r\n </>\r\n ) : (\r\n <div className=\"flex-1 flex items-center justify-center text-sidebar-foreground/60 text-sm\">\r\n Select a category\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -554,8 +554,8 @@ interface EmptyStateProps {
|
|
|
554
554
|
title?: string;
|
|
555
555
|
/** Description / subtitle */
|
|
556
556
|
description?: string;
|
|
557
|
-
/** Icon
|
|
558
|
-
icon?:
|
|
557
|
+
/** Icon element (ReactNode) — e.g. <SearchX /> or <MyCustomIcon /> */
|
|
558
|
+
icon?: React.ReactNode;
|
|
559
559
|
/** Primary action button */
|
|
560
560
|
action?: React.ReactNode;
|
|
561
561
|
/** Secondary action button */
|
|
@@ -568,14 +568,16 @@ interface EmptyStateProps {
|
|
|
568
568
|
children?: React.ReactNode;
|
|
569
569
|
}
|
|
570
570
|
/**
|
|
571
|
-
* EmptyState —
|
|
571
|
+
* EmptyState — Higher-level wrapper around the composable Empty primitives.
|
|
572
|
+
*
|
|
573
|
+
* Composes: Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, EmptyContent
|
|
572
574
|
*
|
|
573
575
|
* @example Default
|
|
574
576
|
* ```tsx
|
|
575
577
|
* <EmptyState
|
|
576
578
|
* title="No projects yet"
|
|
577
579
|
* description="Create your first project to get started."
|
|
578
|
-
* icon={FolderPlus}
|
|
580
|
+
* icon={<FolderPlus className="h-6 w-6" />}
|
|
579
581
|
* action={<Button>Create Project</Button>}
|
|
580
582
|
* />
|
|
581
583
|
* ```
|
|
@@ -590,7 +592,7 @@ interface EmptyStateProps {
|
|
|
590
592
|
* <EmptyStateNoResults action={<Button onClick={clearFilters}>Clear filters</Button>} />
|
|
591
593
|
* ```
|
|
592
594
|
*/
|
|
593
|
-
declare function EmptyState({ title, description, icon
|
|
595
|
+
declare function EmptyState({ title, description, icon, action, secondaryAction, variant, className, children, }: EmptyStateProps): react_jsx_runtime.JSX.Element;
|
|
594
596
|
type EmptyStatePresetProps = Omit<EmptyStateProps, "icon" | "title" | "description"> & {
|
|
595
597
|
title?: string;
|
|
596
598
|
description?: string;
|
|
@@ -1742,11 +1744,8 @@ interface ComboboxInputProps<TFieldValues extends FieldValues = FieldValues> {
|
|
|
1742
1744
|
/**
|
|
1743
1745
|
* ComboboxInput - Searchable select with react-hook-form integration using Base UI
|
|
1744
1746
|
*
|
|
1745
|
-
*
|
|
1746
|
-
*
|
|
1747
|
-
* - Supports Base UI Combobox primitives
|
|
1748
|
-
* - Custom option rendering
|
|
1749
|
-
* - Can be used standalone without form
|
|
1747
|
+
* Passes `{ value, label }` objects to Base UI Combobox so it auto-resolves
|
|
1748
|
+
* labels for display and filtering. The form value is always the string `value`.
|
|
1750
1749
|
*
|
|
1751
1750
|
* @example
|
|
1752
1751
|
* ```tsx
|