@arqel-dev/ui 0.14.0 → 0.15.1

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.
Files changed (108) hide show
  1. package/README.md +1 -1
  2. package/dist/{AreaChart-NMQ2RQGA.js → AreaChart-JAZ6LUYG.js} +8 -4
  3. package/dist/AreaChart-JAZ6LUYG.js.map +1 -0
  4. package/dist/ArqelCreatePage-UZAHV4DK.js +8 -0
  5. package/dist/{ArqelCreatePage-O6KNXPAO.js.map → ArqelCreatePage-UZAHV4DK.js.map} +1 -1
  6. package/dist/ArqelDashboardPage-Z5R4XSH4.js +6 -0
  7. package/dist/{ArqelDashboardPage-PX3Y75AA.js.map → ArqelDashboardPage-Z5R4XSH4.js.map} +1 -1
  8. package/dist/ArqelEditPage-RRYFYOTC.js +8 -0
  9. package/dist/{ArqelShowPage-LGVTL6UZ.js.map → ArqelEditPage-RRYFYOTC.js.map} +1 -1
  10. package/dist/ArqelIndexPage-RGZWKKAX.js +12 -0
  11. package/dist/{ArqelIndexPage-GC33PNBL.js.map → ArqelIndexPage-RGZWKKAX.js.map} +1 -1
  12. package/dist/ArqelShowPage-TVCJAV2F.js +6 -0
  13. package/dist/{ArqelEditPage-NAMWJ5MC.js.map → ArqelShowPage-TVCJAV2F.js.map} +1 -1
  14. package/dist/{BarChart-KLHKTLO2.js → BarChart-E52NJSJE.js} +8 -4
  15. package/dist/BarChart-E52NJSJE.js.map +1 -0
  16. package/dist/{DonutChart-L56R4QF2.js → DonutChart-IGSF4LEB.js} +3 -3
  17. package/dist/{DonutChart-L56R4QF2.js.map → DonutChart-IGSF4LEB.js.map} +1 -1
  18. package/dist/{FormRenderer-BJBRIkfH.d.ts → FormRenderer-By8fZp4t.d.ts} +2 -0
  19. package/dist/{LineChart-GHMPHFZZ.js → LineChart-RRPGAZON.js} +8 -4
  20. package/dist/LineChart-RRPGAZON.js.map +1 -0
  21. package/dist/PieChart-SGN7V5LQ.js +4 -0
  22. package/dist/{PieChart-T2VQOFPP.js.map → PieChart-SGN7V5LQ.js.map} +1 -1
  23. package/dist/{RadarChart-CSWR5AO7.js → RadarChart-3AOM736J.js} +8 -4
  24. package/dist/RadarChart-3AOM736J.js.map +1 -0
  25. package/dist/action.d.ts +1 -1
  26. package/dist/action.js +5 -5
  27. package/dist/{chunk-IKJYLSTK.js → chunk-2JUWLJ3K.js} +90 -29
  28. package/dist/chunk-2JUWLJ3K.js.map +1 -0
  29. package/dist/chunk-3HN4ARGG.js +157 -0
  30. package/dist/chunk-3HN4ARGG.js.map +1 -0
  31. package/dist/{chunk-PXON56HL.js → chunk-3VSDQCFO.js} +3 -3
  32. package/dist/{chunk-PXON56HL.js.map → chunk-3VSDQCFO.js.map} +1 -1
  33. package/dist/{chunk-6UJQP7KU.js → chunk-4VWNBMMA.js} +34 -118
  34. package/dist/chunk-4VWNBMMA.js.map +1 -0
  35. package/dist/{chunk-4JJS2SVS.js → chunk-CMNZLA32.js} +83 -32
  36. package/dist/chunk-CMNZLA32.js.map +1 -0
  37. package/dist/{chunk-2LTZJ4R7.js → chunk-EG2DASKR.js} +16 -7
  38. package/dist/chunk-EG2DASKR.js.map +1 -0
  39. package/dist/{chunk-DSULVRB6.js → chunk-GJ2FKAOM.js} +5 -3
  40. package/dist/chunk-GJ2FKAOM.js.map +1 -0
  41. package/dist/{chunk-FHRQ7PWE.js → chunk-H23VX3RR.js} +4 -3
  42. package/dist/chunk-H23VX3RR.js.map +1 -0
  43. package/dist/{chunk-FV7RESKL.js → chunk-HNUUZEOL.js} +28 -16
  44. package/dist/chunk-HNUUZEOL.js.map +1 -0
  45. package/dist/{chunk-M6NI45DQ.js → chunk-IO6RMVUF.js} +9 -5
  46. package/dist/chunk-IO6RMVUF.js.map +1 -0
  47. package/dist/{chunk-I6MWOIFR.js → chunk-LLANMODS.js} +6 -5
  48. package/dist/chunk-LLANMODS.js.map +1 -0
  49. package/dist/{chunk-MTZJDFQ6.js → chunk-MZMYV43C.js} +11 -7
  50. package/dist/chunk-MZMYV43C.js.map +1 -0
  51. package/dist/{chunk-E2ORVQM5.js → chunk-Q7WGPKUN.js} +6 -4
  52. package/dist/chunk-Q7WGPKUN.js.map +1 -0
  53. package/dist/{chunk-PZEVKMZX.js → chunk-S5UNPCMQ.js} +315 -152
  54. package/dist/chunk-S5UNPCMQ.js.map +1 -0
  55. package/dist/{chunk-MTNFFSVA.js → chunk-SK6H7ARE.js} +5 -3
  56. package/dist/chunk-SK6H7ARE.js.map +1 -0
  57. package/dist/{chunk-WKWV36PG.js → chunk-WMOBLT3Z.js} +12 -5
  58. package/dist/chunk-WMOBLT3Z.js.map +1 -0
  59. package/dist/{chunk-C5H44NSP.js → chunk-WZRPGPLH.js} +10 -5
  60. package/dist/chunk-WZRPGPLH.js.map +1 -0
  61. package/dist/{chunk-QTUBBZVT.js → chunk-YQ6KXR3U.js} +9 -11
  62. package/dist/chunk-YQ6KXR3U.js.map +1 -0
  63. package/dist/{chunk-47HD7ALI.js → chunk-YYQ45W25.js} +37 -24
  64. package/dist/chunk-YYQ45W25.js.map +1 -0
  65. package/dist/flash.js +1 -1
  66. package/dist/form.d.ts +3 -1
  67. package/dist/form.js +3 -3
  68. package/dist/index.d.ts +1 -1
  69. package/dist/index.js +12 -12
  70. package/dist/pages.js +19 -19
  71. package/dist/palette.js +1 -1
  72. package/dist/resource.js +3 -3
  73. package/dist/shell.js +10 -6
  74. package/dist/shell.js.map +1 -1
  75. package/dist/table.js +2 -2
  76. package/dist/utility.js +1 -1
  77. package/dist/widgets.js +2 -2
  78. package/package.json +6 -6
  79. package/src/styles/globals.css +7 -0
  80. package/dist/AreaChart-NMQ2RQGA.js.map +0 -1
  81. package/dist/ArqelCreatePage-O6KNXPAO.js +0 -8
  82. package/dist/ArqelDashboardPage-PX3Y75AA.js +0 -6
  83. package/dist/ArqelEditPage-NAMWJ5MC.js +0 -8
  84. package/dist/ArqelIndexPage-GC33PNBL.js +0 -12
  85. package/dist/ArqelShowPage-LGVTL6UZ.js +0 -6
  86. package/dist/BarChart-KLHKTLO2.js.map +0 -1
  87. package/dist/LineChart-GHMPHFZZ.js.map +0 -1
  88. package/dist/PieChart-T2VQOFPP.js +0 -4
  89. package/dist/RadarChart-CSWR5AO7.js.map +0 -1
  90. package/dist/chunk-2LTZJ4R7.js.map +0 -1
  91. package/dist/chunk-47HD7ALI.js.map +0 -1
  92. package/dist/chunk-4JJS2SVS.js.map +0 -1
  93. package/dist/chunk-6UJQP7KU.js.map +0 -1
  94. package/dist/chunk-C5H44NSP.js.map +0 -1
  95. package/dist/chunk-DSULVRB6.js.map +0 -1
  96. package/dist/chunk-E2ORVQM5.js.map +0 -1
  97. package/dist/chunk-EYAUPJ6J.js +0 -64
  98. package/dist/chunk-EYAUPJ6J.js.map +0 -1
  99. package/dist/chunk-FHRQ7PWE.js.map +0 -1
  100. package/dist/chunk-FV7RESKL.js.map +0 -1
  101. package/dist/chunk-I6MWOIFR.js.map +0 -1
  102. package/dist/chunk-IKJYLSTK.js.map +0 -1
  103. package/dist/chunk-M6NI45DQ.js.map +0 -1
  104. package/dist/chunk-MTNFFSVA.js.map +0 -1
  105. package/dist/chunk-MTZJDFQ6.js.map +0 -1
  106. package/dist/chunk-PZEVKMZX.js.map +0 -1
  107. package/dist/chunk-QTUBBZVT.js.map +0 -1
  108. package/dist/chunk-WKWV36PG.js.map +0 -1
@@ -0,0 +1,157 @@
1
+ import { cn } from './chunk-B7ULUJVO.js';
2
+ import 'react';
3
+ import { XIcon } from 'lucide-react';
4
+ import { DropdownMenu as DropdownMenu$1, Dialog } from 'radix-ui';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ function DropdownMenu({
8
+ ...props
9
+ }) {
10
+ return /* @__PURE__ */ jsx(DropdownMenu$1.Root, { "data-slot": "dropdown-menu", ...props });
11
+ }
12
+ function DropdownMenuTrigger({
13
+ ...props
14
+ }) {
15
+ return /* @__PURE__ */ jsx(
16
+ DropdownMenu$1.Trigger,
17
+ {
18
+ "data-slot": "dropdown-menu-trigger",
19
+ ...props
20
+ }
21
+ );
22
+ }
23
+ function DropdownMenuContent({
24
+ className,
25
+ sideOffset = 4,
26
+ ...props
27
+ }) {
28
+ return /* @__PURE__ */ jsx(DropdownMenu$1.Portal, { children: /* @__PURE__ */ jsx(
29
+ DropdownMenu$1.Content,
30
+ {
31
+ "data-slot": "dropdown-menu-content",
32
+ sideOffset,
33
+ className: cn(
34
+ "z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
35
+ className
36
+ ),
37
+ ...props
38
+ }
39
+ ) });
40
+ }
41
+ function DropdownMenuItem({
42
+ className,
43
+ inset,
44
+ variant = "default",
45
+ ...props
46
+ }) {
47
+ return /* @__PURE__ */ jsx(
48
+ DropdownMenu$1.Item,
49
+ {
50
+ "data-slot": "dropdown-menu-item",
51
+ "data-inset": inset,
52
+ "data-variant": variant,
53
+ className: cn(
54
+ "relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!",
55
+ className
56
+ ),
57
+ ...props
58
+ }
59
+ );
60
+ }
61
+ function Sheet({ ...props }) {
62
+ return /* @__PURE__ */ jsx(Dialog.Root, { "data-slot": "sheet", ...props });
63
+ }
64
+ function SheetPortal({
65
+ ...props
66
+ }) {
67
+ return /* @__PURE__ */ jsx(Dialog.Portal, { "data-slot": "sheet-portal", ...props });
68
+ }
69
+ function SheetOverlay({
70
+ className,
71
+ ...props
72
+ }) {
73
+ return /* @__PURE__ */ jsx(
74
+ Dialog.Overlay,
75
+ {
76
+ "data-slot": "sheet-overlay",
77
+ className: cn(
78
+ "fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
79
+ className
80
+ ),
81
+ ...props
82
+ }
83
+ );
84
+ }
85
+ function SheetContent({
86
+ className,
87
+ children,
88
+ side = "right",
89
+ showCloseButton = true,
90
+ ...props
91
+ }) {
92
+ return /* @__PURE__ */ jsxs(SheetPortal, { children: [
93
+ /* @__PURE__ */ jsx(SheetOverlay, {}),
94
+ /* @__PURE__ */ jsxs(
95
+ Dialog.Content,
96
+ {
97
+ "data-slot": "sheet-content",
98
+ className: cn(
99
+ "fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500",
100
+ side === "right" && "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
101
+ side === "left" && "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
102
+ side === "top" && "inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
103
+ side === "bottom" && "inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
104
+ className
105
+ ),
106
+ ...props,
107
+ children: [
108
+ children,
109
+ showCloseButton && /* @__PURE__ */ jsxs(Dialog.Close, { className: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
110
+ /* @__PURE__ */ jsx(XIcon, { className: "size-4" }),
111
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
112
+ ] })
113
+ ]
114
+ }
115
+ )
116
+ ] });
117
+ }
118
+ function SheetHeader({ className, ...props }) {
119
+ return /* @__PURE__ */ jsx(
120
+ "div",
121
+ {
122
+ "data-slot": "sheet-header",
123
+ className: cn("flex flex-col gap-1.5 p-4", className),
124
+ ...props
125
+ }
126
+ );
127
+ }
128
+ function SheetTitle({
129
+ className,
130
+ ...props
131
+ }) {
132
+ return /* @__PURE__ */ jsx(
133
+ Dialog.Title,
134
+ {
135
+ "data-slot": "sheet-title",
136
+ className: cn("font-semibold text-foreground", className),
137
+ ...props
138
+ }
139
+ );
140
+ }
141
+ function SheetDescription({
142
+ className,
143
+ ...props
144
+ }) {
145
+ return /* @__PURE__ */ jsx(
146
+ Dialog.Description,
147
+ {
148
+ "data-slot": "sheet-description",
149
+ className: cn("text-sm text-muted-foreground", className),
150
+ ...props
151
+ }
152
+ );
153
+ }
154
+
155
+ export { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle };
156
+ //# sourceMappingURL=chunk-3HN4ARGG.js.map
157
+ //# sourceMappingURL=chunk-3HN4ARGG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shadcn/ui/dropdown-menu.tsx","../src/shadcn/ui/sheet.tsx"],"names":["DropdownMenuPrimitive","jsx","SheetPrimitive","jsxs"],"mappings":"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","file":"chunk-3HN4ARGG.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/utils/cn\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked ?? false}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[inset]:pl-8 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import * as React from \"react\"\nimport { XIcon } from \"lucide-react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/utils/cn\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500\",\n side === \"right\" &&\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n side === \"left\" &&\n \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n side === \"top\" &&\n \"inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n side === \"bottom\" &&\n \"inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close className=\"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"font-semibold text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { DashboardGrid } from './chunk-47HD7ALI.js';
1
+ import { DashboardGrid } from './chunk-YYQ45W25.js';
2
2
  import { usePage, router } from '@inertiajs/react';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
@@ -31,5 +31,5 @@ function ArqelDashboardPage() {
31
31
  }
32
32
 
33
33
  export { ArqelDashboardPage };
34
- //# sourceMappingURL=chunk-PXON56HL.js.map
35
- //# sourceMappingURL=chunk-PXON56HL.js.map
34
+ //# sourceMappingURL=chunk-3VSDQCFO.js.map
35
+ //# sourceMappingURL=chunk-3VSDQCFO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/pages/ArqelDashboardPage.tsx"],"names":[],"mappings":";;;;AA0Be,SAAR,kBAAA,GAAmD;AACxD,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,SAAiC,CAAE,KAAA;AAEvE,EAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,EAAc,KAAA,KAAyB;AACjE,IAAA,MAAM,OAAA,GAAU,gBAAgB,EAAC;AACjC,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAG,OAAA,EAAQ;AACnD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,MAAA,OAAO,KAAK,IAAI,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA;AAAA,IACf;AAEA,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,IAAQ,CAAA,kBAAA,EAAqB,UAAU,EAAE,CAAA,CAAA;AAChE,IAAA,MAAM,MAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,EAAC;AAEpE,IAAA,MAAA,CAAO,GAAA,CAAI,MAAM,MAAA,EAAQ;AAAA,MACvB,aAAA,EAAe,IAAA;AAAA,MACf,cAAA,EAAgB,IAAA;AAAA,MAChB,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,YAAA,EAAc,gBAAgB,EAAC;AAAA,MAC/B,cAAA,EAAgB;AAAA;AAAA,GAClB;AAEJ","file":"chunk-PXON56HL.js","sourcesContent":["/**\n * Default Inertia page for `arqel::dashboard`.\n *\n * Bridges the Inertia payload emitted by\n * `Arqel\\Widgets\\Http\\Controllers\\DashboardController::show` into the\n * existing `<DashboardGrid>` component. The grid already handles the\n * heading/description chrome, the filter bar and the responsive\n * widget grid (column spans, polling, deferred fetch), so this page\n * only owns one piece of glue: lifting filter state up into the URL\n * so deep-link refreshes rehydrate cleanly.\n *\n * Filter changes navigate via `router.get(path, { filters: ... })`,\n * matching `DashboardController::show` which reads\n * `$request->input('filters', [])` and forwards it as `filterValues`.\n */\n\nimport { router, usePage } from '@inertiajs/react';\nimport type { JSX } from 'react';\nimport { DashboardGrid, type DashboardPayload } from '../widgets/index.js';\n\ninterface ArqelDashboardPageProps {\n dashboard: DashboardPayload;\n filterValues?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport default function ArqelDashboardPage(): JSX.Element {\n const { dashboard, filterValues } = usePage<ArqelDashboardPageProps>().props;\n\n const handleFilterChange = (name: string, value: unknown): void => {\n const current = filterValues ?? {};\n const next: Record<string, unknown> = { ...current };\n if (value === undefined || value === null || value === '') {\n delete next[name];\n } else {\n next[name] = value;\n }\n\n const path = dashboard.path ?? `/admin/dashboards/${dashboard.id}`;\n const params = (Object.keys(next).length > 0 ? { filters: next } : {}) as never;\n\n router.get(path, params, {\n preserveState: true,\n preserveScroll: true,\n replace: true,\n });\n };\n\n return (\n <DashboardGrid\n dashboard={dashboard}\n filterValues={filterValues ?? {}}\n onFilterChange={handleFilterChange}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/pages/ArqelDashboardPage.tsx"],"names":[],"mappings":";;;;AA0Be,SAAR,kBAAA,GAAmD;AACxD,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,SAAiC,CAAE,KAAA;AAEvE,EAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,EAAc,KAAA,KAAyB;AACjE,IAAA,MAAM,OAAA,GAAU,gBAAgB,EAAC;AACjC,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAG,OAAA,EAAQ;AACnD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,MAAA,OAAO,KAAK,IAAI,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA;AAAA,IACf;AAEA,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,IAAQ,CAAA,kBAAA,EAAqB,UAAU,EAAE,CAAA,CAAA;AAChE,IAAA,MAAM,MAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,EAAC;AAEpE,IAAA,MAAA,CAAO,GAAA,CAAI,MAAM,MAAA,EAAQ;AAAA,MACvB,aAAA,EAAe,IAAA;AAAA,MACf,cAAA,EAAgB,IAAA;AAAA,MAChB,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,YAAA,EAAc,gBAAgB,EAAC;AAAA,MAC/B,cAAA,EAAgB;AAAA;AAAA,GAClB;AAEJ","file":"chunk-3VSDQCFO.js","sourcesContent":["/**\n * Default Inertia page for `arqel::dashboard`.\n *\n * Bridges the Inertia payload emitted by\n * `Arqel\\Widgets\\Http\\Controllers\\DashboardController::show` into the\n * existing `<DashboardGrid>` component. The grid already handles the\n * heading/description chrome, the filter bar and the responsive\n * widget grid (column spans, polling, deferred fetch), so this page\n * only owns one piece of glue: lifting filter state up into the URL\n * so deep-link refreshes rehydrate cleanly.\n *\n * Filter changes navigate via `router.get(path, { filters: ... })`,\n * matching `DashboardController::show` which reads\n * `$request->input('filters', [])` and forwards it as `filterValues`.\n */\n\nimport { router, usePage } from '@inertiajs/react';\nimport type { JSX } from 'react';\nimport { DashboardGrid, type DashboardPayload } from '../widgets/index.js';\n\ninterface ArqelDashboardPageProps {\n dashboard: DashboardPayload;\n filterValues?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport default function ArqelDashboardPage(): JSX.Element {\n const { dashboard, filterValues } = usePage<ArqelDashboardPageProps>().props;\n\n const handleFilterChange = (name: string, value: unknown): void => {\n const current = filterValues ?? {};\n const next: Record<string, unknown> = { ...current };\n if (value === undefined || value === null || value === '') {\n delete next[name];\n } else {\n next[name] = value;\n }\n\n const path = dashboard.path ?? `/admin/dashboards/${dashboard.id}`;\n const params = (Object.keys(next).length > 0 ? { filters: next } : {}) as never;\n\n router.get(path, params, {\n preserveState: true,\n preserveScroll: true,\n replace: true,\n });\n };\n\n return (\n <DashboardGrid\n dashboard={dashboard}\n filterValues={filterValues ?? {}}\n onFilterChange={handleFilterChange}\n />\n );\n}\n"]}
@@ -1,20 +1,22 @@
1
- import { CommandPalette } from './chunk-FV7RESKL.js';
1
+ import { CommandPalette } from './chunk-HNUUZEOL.js';
2
2
  import { resolveLucideIcon } from './chunk-RMPOR2YZ.js';
3
- import { Button } from './chunk-FHRQ7PWE.js';
3
+ import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from './chunk-3HN4ARGG.js';
4
+ import { Button } from './chunk-H23VX3RR.js';
4
5
  import { cn } from './chunk-B7ULUJVO.js';
5
- import * as React4 from 'react';
6
+ import * as React3 from 'react';
6
7
  import { useMemo } from 'react';
7
8
  import { cva } from 'class-variance-authority';
8
- import { PanelLeftIcon, XIcon } from 'lucide-react';
9
- import { Slot, Tooltip as Tooltip$1, Dialog } from 'radix-ui';
9
+ import { PanelLeftIcon } from 'lucide-react';
10
+ import { Slot, Tooltip as Tooltip$1 } from 'radix-ui';
10
11
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
11
12
  import { useNavigation } from '@arqel-dev/hooks';
12
13
  import { useTheme } from '@arqel-dev/react/providers';
14
+ import { useArqelTranslations } from '@arqel-dev/react/utils';
13
15
 
14
16
  var MOBILE_BREAKPOINT = 768;
15
17
  function useIsMobile() {
16
- const [isMobile, setIsMobile] = React4.useState(void 0);
17
- React4.useEffect(() => {
18
+ const [isMobile, setIsMobile] = React3.useState(void 0);
19
+ React3.useEffect(() => {
18
20
  const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
19
21
  const onChange = () => {
20
22
  setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
@@ -25,99 +27,6 @@ function useIsMobile() {
25
27
  }, []);
26
28
  return !!isMobile;
27
29
  }
28
- function Sheet({ ...props }) {
29
- return /* @__PURE__ */ jsx(Dialog.Root, { "data-slot": "sheet", ...props });
30
- }
31
- function SheetPortal({
32
- ...props
33
- }) {
34
- return /* @__PURE__ */ jsx(Dialog.Portal, { "data-slot": "sheet-portal", ...props });
35
- }
36
- function SheetOverlay({
37
- className,
38
- ...props
39
- }) {
40
- return /* @__PURE__ */ jsx(
41
- Dialog.Overlay,
42
- {
43
- "data-slot": "sheet-overlay",
44
- className: cn(
45
- "fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
46
- className
47
- ),
48
- ...props
49
- }
50
- );
51
- }
52
- function SheetContent({
53
- className,
54
- children,
55
- side = "right",
56
- showCloseButton = true,
57
- ...props
58
- }) {
59
- return /* @__PURE__ */ jsxs(SheetPortal, { children: [
60
- /* @__PURE__ */ jsx(SheetOverlay, {}),
61
- /* @__PURE__ */ jsxs(
62
- Dialog.Content,
63
- {
64
- "data-slot": "sheet-content",
65
- className: cn(
66
- "fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500",
67
- side === "right" && "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
68
- side === "left" && "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
69
- side === "top" && "inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
70
- side === "bottom" && "inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
71
- className
72
- ),
73
- ...props,
74
- children: [
75
- children,
76
- showCloseButton && /* @__PURE__ */ jsxs(Dialog.Close, { className: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
77
- /* @__PURE__ */ jsx(XIcon, { className: "size-4" }),
78
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
79
- ] })
80
- ]
81
- }
82
- )
83
- ] });
84
- }
85
- function SheetHeader({ className, ...props }) {
86
- return /* @__PURE__ */ jsx(
87
- "div",
88
- {
89
- "data-slot": "sheet-header",
90
- className: cn("flex flex-col gap-1.5 p-4", className),
91
- ...props
92
- }
93
- );
94
- }
95
- function SheetTitle({
96
- className,
97
- ...props
98
- }) {
99
- return /* @__PURE__ */ jsx(
100
- Dialog.Title,
101
- {
102
- "data-slot": "sheet-title",
103
- className: cn("font-semibold text-foreground", className),
104
- ...props
105
- }
106
- );
107
- }
108
- function SheetDescription({
109
- className,
110
- ...props
111
- }) {
112
- return /* @__PURE__ */ jsx(
113
- Dialog.Description,
114
- {
115
- "data-slot": "sheet-description",
116
- className: cn("text-sm text-muted-foreground", className),
117
- ...props
118
- }
119
- );
120
- }
121
30
  function TooltipProvider({
122
31
  delayDuration = 0,
123
32
  ...props
@@ -170,9 +79,9 @@ var SIDEBAR_WIDTH = "16rem";
170
79
  var SIDEBAR_WIDTH_MOBILE = "18rem";
171
80
  var SIDEBAR_WIDTH_ICON = "3rem";
172
81
  var SIDEBAR_KEYBOARD_SHORTCUT = "b";
173
- var SidebarContext = React4.createContext(null);
82
+ var SidebarContext = React3.createContext(null);
174
83
  function useSidebar() {
175
- const context = React4.useContext(SidebarContext);
84
+ const context = React3.useContext(SidebarContext);
176
85
  if (!context) {
177
86
  throw new Error("useSidebar must be used within a SidebarProvider.");
178
87
  }
@@ -188,10 +97,10 @@ function SidebarProvider({
188
97
  ...props
189
98
  }) {
190
99
  const isMobile = useIsMobile();
191
- const [openMobile, setOpenMobile] = React4.useState(false);
192
- const [_open, _setOpen] = React4.useState(defaultOpen);
100
+ const [openMobile, setOpenMobile] = React3.useState(false);
101
+ const [_open, _setOpen] = React3.useState(defaultOpen);
193
102
  const open = openProp ?? _open;
194
- const setOpen = React4.useCallback(
103
+ const setOpen = React3.useCallback(
195
104
  (value) => {
196
105
  const openState = typeof value === "function" ? value(open) : value;
197
106
  if (setOpenProp) {
@@ -203,10 +112,10 @@ function SidebarProvider({
203
112
  },
204
113
  [setOpenProp, open]
205
114
  );
206
- const toggleSidebar = React4.useCallback(() => {
115
+ const toggleSidebar = React3.useCallback(() => {
207
116
  return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2);
208
117
  }, [isMobile, setOpen, setOpenMobile]);
209
- React4.useEffect(() => {
118
+ React3.useEffect(() => {
210
119
  const handleKeyDown = (event) => {
211
120
  if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
212
121
  event.preventDefault();
@@ -217,7 +126,7 @@ function SidebarProvider({
217
126
  return () => window.removeEventListener("keydown", handleKeyDown);
218
127
  }, [toggleSidebar]);
219
128
  const state = open ? "expanded" : "collapsed";
220
- const contextValue = React4.useMemo(
129
+ const contextValue = React3.useMemo(
221
130
  () => ({
222
131
  state,
223
132
  open,
@@ -373,7 +282,7 @@ function SidebarInset({ className, ...props }) {
373
282
  {
374
283
  "data-slot": "sidebar-inset",
375
284
  className: cn(
376
- "relative flex w-full flex-1 flex-col bg-background",
285
+ "relative flex w-full min-w-0 flex-1 flex-col bg-background",
377
286
  "md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2",
378
287
  className
379
288
  ),
@@ -577,7 +486,7 @@ function AppShell({
577
486
  children: [
578
487
  /* @__PURE__ */ jsx(CommandPalette, {}),
579
488
  topbar,
580
- /* @__PURE__ */ jsx("main", { className: "flex-1", children }),
489
+ /* @__PURE__ */ jsx("main", { className: "min-w-0 flex-1 p-4 md:p-6", children }),
581
490
  footer
582
491
  ]
583
492
  }
@@ -599,7 +508,7 @@ function AppShell({
599
508
  sidebar,
600
509
  /* @__PURE__ */ jsxs(SidebarInset, { children: [
601
510
  topbar,
602
- /* @__PURE__ */ jsx("main", { className: "flex-1", children }),
511
+ /* @__PURE__ */ jsx("main", { className: "min-w-0 flex-1 p-4 md:p-6", children }),
603
512
  footer
604
513
  ] })
605
514
  ]
@@ -701,26 +610,33 @@ function Topbar({
701
610
  className
702
611
  }) {
703
612
  const { resolved, toggle } = useTheme();
613
+ const t = useArqelTranslations();
704
614
  return /* @__PURE__ */ jsxs(
705
615
  "header",
706
616
  {
707
617
  "data-arqel-topbar": "",
708
618
  className: cn(
709
- "flex h-14 shrink-0 items-center gap-2 border-b border-border bg-background px-4",
619
+ // `min-w-0 overflow-hidden` keep the topbar from ever pushing the body
620
+ // wide: as a flex child it must be allowed to shrink below its content
621
+ // (min-w-0), and any control cluster that still can't fit is clipped
622
+ // here instead of overflowing the viewport. Radix popovers (tenant /
623
+ // locale / user menus) render in a portal, so clipping the bar never
624
+ // hides their open content.
625
+ "flex h-14 min-w-0 shrink-0 items-center gap-2 overflow-hidden border-b border-border bg-background px-4",
710
626
  className
711
627
  ),
712
628
  children: [
713
629
  /* @__PURE__ */ jsx(SidebarTrigger, { className: "-ml-1" }),
714
- brand && /* @__PURE__ */ jsx("div", { className: "flex items-center", children: brand }),
715
- /* @__PURE__ */ jsx("div", { className: "hidden flex-1 md:block", children: search }),
716
- /* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-2 md:ml-0", children: [
630
+ brand && /* @__PURE__ */ jsx("div", { className: "flex min-w-0 items-center", children: brand }),
631
+ /* @__PURE__ */ jsx("div", { className: "hidden min-w-0 flex-1 md:block", children: search }),
632
+ /* @__PURE__ */ jsxs("div", { className: "ml-auto flex min-w-0 items-center gap-2 md:ml-0", children: [
717
633
  tenantSwitcher,
718
634
  /* @__PURE__ */ jsx(
719
635
  Button,
720
636
  {
721
637
  variant: "ghost",
722
638
  size: "icon",
723
- "aria-label": `Switch to ${resolved === "dark" ? "light" : "dark"} theme`,
639
+ "aria-label": resolved === "dark" ? t("arqel.aria.theme_toggle_light", "Switch to light theme") : t("arqel.aria.theme_toggle_dark", "Switch to dark theme"),
724
640
  onClick: toggle,
725
641
  children: /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: resolved === "dark" ? "\u2600" : "\u263E" })
726
642
  }
@@ -733,5 +649,5 @@ function Topbar({
733
649
  }
734
650
 
735
651
  export { AppShell, Footer, MainContent, Sidebar2 as Sidebar, Topbar };
736
- //# sourceMappingURL=chunk-6UJQP7KU.js.map
737
- //# sourceMappingURL=chunk-6UJQP7KU.js.map
652
+ //# sourceMappingURL=chunk-4VWNBMMA.js.map
653
+ //# sourceMappingURL=chunk-4VWNBMMA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shadcn/hooks/use-mobile.ts","../src/shadcn/ui/tooltip.tsx","../src/shadcn/ui/sidebar.tsx","../src/shell/AppShell.tsx","../src/shell/Footer.tsx","../src/shell/MainContent.tsx","../src/shell/Sidebar.tsx","../src/shell/Topbar.tsx"],"names":["React","TooltipPrimitive","open","jsx","jsxs","Sidebar","useMemo"],"mappings":";;;;;;;;;;;;;;;AAEA,IAAM,iBAAA,GAAoB,GAAA;AAEnB,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,gBAA8B,MAAS,CAAA;AAE7E,EAAMA,iBAAU,MAAM;AACpB,IAAA,MAAM,MAAM,MAAA,CAAO,UAAA,CAAW,CAAA,YAAA,EAAe,iBAAA,GAAoB,CAAC,CAAA,GAAA,CAAK,CAAA;AACvE,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,WAAA,CAAY,MAAA,CAAO,aAAa,iBAAiB,CAAA;AAAA,IACnD,CAAA;AACA,IAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACvC,IAAA,WAAA,CAAY,MAAA,CAAO,aAAa,iBAAiB,CAAA;AACjD,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EACzD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,CAAC,CAAC,QAAA;AACX;ACXA,SAAS,eAAA,CAAgB;AAAA,EACvB,aAAA,GAAgB,CAAA;AAAA,EAChB,GAAG;AACL,CAAA,EAA2D;AACzD,EAAA,uBACE,GAAA;AAAA,IAACC,SAAA,CAAiB,QAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,aAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,OAAA,CAAQ;AAAA,EACf,GAAG;AACL,CAAA,EAAuD;AACrD,EAAA,2BAAQA,SAAA,CAAiB,IAAA,EAAjB,EAAsB,WAAA,EAAU,SAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAC/D;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,2BAAQA,SAAA,CAAiB,OAAA,EAAjB,EAAyB,WAAA,EAAU,iBAAA,EAAmB,GAAG,KAAA,EAAO,CAAA;AAC1E;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,SAAA;AAAA,EACA,UAAA,GAAa,CAAA;AAAA,EACb,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBACE,GAAA,CAACA,SAAA,CAAiB,MAAA,EAAjB,EACC,QAAA,kBAAA,IAAA;AAAA,IAACA,SAAA,CAAiB,OAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,UAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,maAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACD,GAAA,CAACA,SAAA,CAAiB,KAAA,EAAjB,EAAuB,WAAU,oGAAA,EAAqG;AAAA;AAAA;AAAA,GACzI,EACF,CAAA;AAEJ;AC3BA,IAAM,mBAAA,GAAsB,eAAA;AAC5B,IAAM,sBAAA,GAAyB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA;AAC9C,IAAM,aAAA,GAAgB,OAAA;AACtB,IAAM,oBAAA,GAAuB,OAAA;AAC7B,IAAM,kBAAA,GAAqB,MAAA;AAC3B,IAAM,yBAAA,GAA4B,GAAA;AAYlC,IAAM,cAAA,GAAuB,qBAA0C,IAAI,CAAA;AAE3E,SAAS,UAAA,GAAa;AACpB,EAAA,MAAM,OAAA,GAAgB,kBAAW,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,WAAA,GAAc,IAAA;AAAA,EACd,IAAA,EAAM,QAAA;AAAA,EACN,YAAA,EAAc,WAAA;AAAA,EACd,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAIG;AACD,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,gBAAS,KAAK,CAAA;AAIxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,gBAAS,WAAW,CAAA;AACpD,EAAA,MAAM,OAAO,QAAA,IAAY,KAAA;AACzB,EAAA,MAAM,OAAA,GAAgB,MAAA,CAAA,WAAA;AAAA,IACpB,CAAC,KAAA,KAAmD;AAClD,MAAA,MAAM,YAAY,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAC9D,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,SAAS,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,SAAS,CAAA;AAAA,MACpB;AAGA,MAAA,QAAA,CAAS,SAAS,CAAA,EAAG,mBAAmB,CAAA,CAAA,EAAI,SAAS,qBAAqB,sBAAsB,CAAA,CAAA;AAAA,IAClG,CAAA;AAAA,IACA,CAAC,aAAa,IAAI;AAAA,GACpB;AAGA,EAAA,MAAM,aAAA,GAAsB,mBAAY,MAAM;AAC5C,IAAA,OAAO,QAAA,GAAW,aAAA,CAAc,CAACC,KAAAA,KAAS,CAACA,KAAI,CAAA,GAAI,OAAA,CAAQ,CAACA,KAAAA,KAAS,CAACA,KAAI,CAAA;AAAA,EAC5E,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,aAAa,CAAC,CAAA;AAGrC,EAAM,iBAAU,MAAM;AACpB,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyB;AAC9C,MAAA,IACE,MAAM,GAAA,KAAQ,yBAAA,KACb,KAAA,CAAM,OAAA,IAAW,MAAM,OAAA,CAAA,EACxB;AACA,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,aAAA,EAAc;AAAA,MAChB;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAChD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAIlB,EAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,GAAa,WAAA;AAElC,EAAA,MAAM,YAAA,GAAqB,MAAA,CAAA,OAAA;AAAA,IACzB,OAAO;AAAA,MACL,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,IAAA,EAAM,SAAS,QAAA,EAAU,UAAA,EAAY,eAAe,aAAa;AAAA,GAC3E;AAEA,EAAA,uBACEC,GAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EAAO,YAAA,EAC9B,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,aAAA,EAAe,CAAA,EAC9B,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,KAAA,EACE;AAAA,QACE,iBAAA,EAAmB,aAAA;AAAA,QACnB,sBAAA,EAAwB,kBAAA;AAAA,QACxB,GAAG;AAAA,OACL;AAAA,MAEF,SAAA,EAAW,EAAA;AAAA,QACT,iFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,KAEL,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,OAAA,CAAQ;AAAA,EACf,IAAA,GAAO,MAAA;AAAA,EACP,OAAA,GAAU,SAAA;AAAA,EACV,WAAA,GAAc,WAAA;AAAA,EACd,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAIG;AACD,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,aAAA,KAAkB,UAAA,EAAW;AAElE,EAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,IAAA,uBACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,SAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,6EAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBACEA,IAAC,KAAA,EAAA,EAAM,IAAA,EAAM,YAAY,YAAA,EAAc,aAAA,EAAgB,GAAG,KAAA,EACxD,QAAA,kBAAAC,IAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,cAAA,EAAa,SAAA;AAAA,QACb,WAAA,EAAU,SAAA;AAAA,QACV,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAU,8EAAA;AAAA,QACV,KAAA,EACE;AAAA,UACE,iBAAA,EAAmB;AAAA,SACrB;AAAA,QAEF,IAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,cAAW,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BACnBA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,QAAA,EAAA,8BAAA,EAA4B;AAAA,WAAA,EAChD,CAAA;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAA+B,QAAA,EAAS;AAAA;AAAA;AAAA,KACzD,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oDAAA;AAAA,MACV,YAAA,EAAY,KAAA;AAAA,MACZ,kBAAA,EAAkB,KAAA,KAAU,WAAA,GAAc,WAAA,GAAc,EAAA;AAAA,MACxD,cAAA,EAAc,OAAA;AAAA,MACd,WAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAU,SAAA;AAAA,MAGV,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,aAAA;AAAA,YACV,SAAA,EAAW,EAAA;AAAA,cACT,yFAAA;AAAA,cACA,wCAAA;AAAA,cACA,oCAAA;AAAA,cACA,OAAA,KAAY,UAAA,IAAc,OAAA,KAAY,OAAA,GAClC,kFAAA,GACA;AAAA;AACN;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,mBAAA;AAAA,YACV,SAAA,EAAW,EAAA;AAAA,cACT,sHAAA;AAAA,cACA,IAAA,KAAS,SACL,gFAAA,GACA,kFAAA;AAAA;AAAA,cAEJ,OAAA,KAAY,UAAA,IAAc,OAAA,KAAY,OAAA,GAClC,0FAAA,GACA,yHAAA;AAAA,cACJ;AAAA,aACF;AAAA,YACC,GAAG,KAAA;AAAA,YAEJ,QAAA,kBAAAA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,cAAA,EAAa,SAAA;AAAA,gBACb,WAAA,EAAU,eAAA;AAAA,gBACV,SAAA,EAAU,kNAAA;AAAA,gBAET;AAAA;AAAA;AACH;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,SAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwC;AACtC,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,UAAA,EAAW;AAErC,EAAA,uBACEC,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,cAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAU,iBAAA;AAAA,MACV,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,MACjC,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,QAAA,OAAA,GAAU,KAAK,CAAA;AACf,QAAA,aAAA,EAAc;AAAA,MAChB,CAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAD,IAAC,aAAA,EAAA,EAAc,CAAA;AAAA,wBACfA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,QAAA,EAAA,gBAAA,EAAc;AAAA;AAAA;AAAA,GAC1C;AAEJ;AA2BA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,GAAG,OAAM,EAAiC;AAC3E,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,4DAAA;AAAA,QACA,iNAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAgBA,SAAS,aAAA,CAAc,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC3E,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,gBAAA;AAAA,MACV,cAAA,EAAa,QAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,SAAS,CAAA;AAAA,MACjD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,aAAA,CAAc,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC3E,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,gBAAA;AAAA,MACV,cAAA,EAAa,QAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,SAAS,CAAA;AAAA,MACjD,GAAG;AAAA;AAAA,GACN;AAEJ;AAgBA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC5E,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,cAAA,EAAa,SAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACT,gGAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC1E,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,cAAA,EAAa,OAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,2CAAA,EAA6C,SAAS,CAAA;AAAA,MACnE,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACzB,SAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,GAAG;AACL,CAAA,EAAwD;AACtD,EAAA,MAAM,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,IAAA,GAAO,KAAA;AAEnC,EAAA,uBACEA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,qBAAA;AAAA,MACV,cAAA,EAAa,aAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACT,0OAAA;AAAA,QACA,6EAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAyBA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAgC;AAC9B,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,cAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,SAAS,CAAA;AAAA,MACxC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AACxE,EAAA,uBACEA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,cAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,oCAAA,EAAsC,SAAS,CAAA;AAAA,MAC5D,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AAC5E,EAAA,uBACEA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,cAAA,EAAa,WAAA;AAAA,MACb,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA;AAAA,MAClD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,IAAM,yBAAA,GAA4B,GAAA;AAAA,EAChC,mzBAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,8DAAA;AAAA,QACT,OAAA,EACE;AAAA,OACJ;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,aAAA;AAAA,QACT,EAAA,EAAI,aAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ,CAAA;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACzB,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,SAAA;AAAA,EACP,OAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAIoD;AAClD,EAAA,MAAM,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,IAAA,GAAO,QAAA;AACnC,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,UAAA,EAAW;AAEvC,EAAA,MAAM,yBACJA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,qBAAA;AAAA,MACV,cAAA,EAAa,aAAA;AAAA,MACb,WAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAa,QAAA;AAAA,MACb,SAAA,EAAW,GAAG,yBAAA,CAA0B,EAAE,SAAS,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,MACpE,GAAG;AAAA;AAAA,GACN;AAGF,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAA,GAAU;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,uBACEC,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAE,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,oBAChCA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,KAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,UAAU,WAAA,IAAe,QAAA;AAAA,QAChC,GAAG;AAAA;AAAA;AACN,GAAA,EACF,CAAA;AAEJ;AC/fO,SAAS,QAAA,CAAS;AAAA,EACvB,OAAA,GAAU,cAAA;AAAA,EACV,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,IAAA,uBACEC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EAAiB,YAAA;AAAA,QACjB,SAAA,EAAW,EAAA,CAAG,4CAAA,EAA8C,SAAS,CAAA;AAAA,QAErE,QAAA,EAAA;AAAA,0BAAAD,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,UACf;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,IAAI,YAAY,aAAA,EAAe;AAC7B,IAAA,uBACEC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EAAiB,aAAA;AAAA,QACjB,SAAA,EAAW,EAAA,CAAG,0DAAA,EAA4D,SAAS,CAAA;AAAA,QAEnF,QAAA,EAAA;AAAA,0BAAAD,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,UACf,MAAA;AAAA,0BACDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAA6B,QAAA,EAAS,CAAA;AAAA,UACrD;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM,WAAA,GAAc,OAAA,KAAY,eAAA,GAAkB,OAAA,GAAU,MAAA;AAE5D,EAAA,uBACEA,GAAAA,CAAC,eAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,kBAAA,EAAkB,OAAA;AAAA,MAClB,mBAAA,EAAmB,WAAA;AAAA,MACnB,SAAA,EAAW,EAAA;AAAA,QACT,qDAAA;AAAA,QACA,gBAAgB,OAAA,IAAW,kBAAA;AAAA,QAC3B;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,QACf,OAAA;AAAA,wBACDC,KAAC,YAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,MAAA;AAAA,0BACDD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAA6B,QAAA,EAAS,CAAA;AAAA,UACrD;AAAA,SAAA,EACH;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AC/EO,SAAS,MAAA,CAAO,EAAE,QAAA,EAAU,SAAA,EAAU,EAAgB;AAC3D,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,mBAAA,EAAkB,EAAA;AAAA,MAClB,SAAA,EAAW,EAAA;AAAA,QACT,uFAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACHA,IAAM,iBAAA,GAAyD;AAAA,EAC7D,IAAA,EAAM,EAAA;AAAA,EACN,EAAA,EAAI,UAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA,EACJ,KAAA,EAAO,WAAA;AAAA,EACP,KAAA,EAAO,WAAA;AAAA,EACP,KAAA,EAAO,WAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAqB;AACnB,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,iBAAA,EAAgB,EAAA;AAAA,MAChB,SAAA,EAAW,EAAA;AAAA,QACT,0CAAA;AAAA,QACA,kBAAkB,QAAQ,CAAA;AAAA,QAC1B;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,WAAA,oBAAeD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAQ,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,QAClD,0BAAUA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAQ,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,QACxC;AAAA;AAAA;AAAA,GACH;AAEJ;ACpBO,SAASE,SAAQ,EAAE,KAAA,EAAO,WAAW,KAAA,EAAO,MAAA,EAAQ,WAAU,EAAiB;AACpF,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,aAAA,EAAc;AAC7C,EAAA,MAAM,QAAQ,SAAA,IAAa,WAAA;AAC3B,EAAA,MAAM,OAAA,GAAUC,QAAQ,MAAM,UAAA,CAAW,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAExD,EAAA,uBACEF,IAAAA,CAAC,OAAA,EAAA,EAAc,WAAA,EAAY,QAAO,SAAA,EAC/B,QAAA,EAAA;AAAA,IAAA,KAAA,mBACCD,GAAAA,CAAC,aAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,SAAI,SAAA,EAAU,2DAAA,EAA6D,QAAA,EAAA,KAAA,EAAM,CAAA,EACpF,CAAA,GACE,IAAA;AAAA,oBACJA,GAAAA,CAAC,cAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,IAAI,CAAA,qBACxBC,IAAAA,CAAC,YAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,KAAA,mBAAQD,GAAAA,CAAC,iBAAA,EAAA,EAAmB,QAAA,EAAA,KAAA,EAAM,CAAA,GAAuB,IAAA;AAAA,sBAC1DA,IAAC,mBAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,WAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS;AAClB,QAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACxC,QAAA,uBACEA,GAAAA,CAAC,eAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,YACzB,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,YAE5B,eAAK,GAAA,mBACJC,KAAC,GAAA,EAAA,EAAE,IAAA,EAAM,KAAK,GAAA,EACX,QAAA,EAAA;AAAA,cAAA,IAAA,mBAAOD,GAAAA,CAAC,IAAA,EAAA,EAAK,CAAA,GAAK,IAAA;AAAA,8BACnBA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM;AAAA,aAAA,EACpB,CAAA,mBAEAC,IAAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,cAAA,IAAA,mBAAOD,GAAAA,CAAC,IAAA,EAAA,EAAK,CAAA,GAAK,IAAA;AAAA,8BACnBA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM;AAAA,aAAA,EACpB;AAAA;AAAA,SAEJ,EAAA,EAhBoB,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,KAiBvC,CAAA;AAAA,MAEJ,CAAC,GACH,CAAA,EACF;AAAA,KAAA,EAAA,EA5BiB,KAAA,IAAS,eA6B5B,CACD,CAAA,EACH,CAAA;AAAA,IACC,MAAA,mBAASA,GAAAA,CAAC,aAAA,EAAA,EAAe,kBAAO,CAAA,GAAmB;AAAA,GAAA,EACtD,CAAA;AAEJ;AAEA,SAAS,WACP,KAAA,EACsD;AACtD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAiD;AACpE,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,KAAA,IAAS,MAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,GAAG,KAAK,EAAC;AACjC,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,IAAA,MAAA,CAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA;AACpC;ACtEO,SAAS,MAAA,CAAO;AAAA,EACrB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAAgB;AACd,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,QAAA,EAAS;AACtC,EAAA,MAAM,IAAI,oBAAA,EAAqB;AAE/B,EAAA,uBACEC,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,mBAAA,EAAkB,EAAA;AAAA,MAClB,SAAA,EAAW,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOT,yGAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,OAAA,EAAQ,CAAA;AAAA,QACjC,yBAASA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAA6B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAC5DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAkC,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,wBACxDC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACZ,QAAA,EAAA;AAAA,UAAA,cAAA;AAAA,0BACDD,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,OAAA;AAAA,cACR,IAAA,EAAK,MAAA;AAAA,cACL,YAAA,EACE,aAAa,MAAA,GACT,CAAA,CAAE,iCAAiC,uBAAuB,CAAA,GAC1D,CAAA,CAAE,8BAAA,EAAgC,sBAAsB,CAAA;AAAA,cAE9D,OAAA,EAAS,MAAA;AAAA,cAET,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAY,QAAQ,QAAA,EAAA,QAAA,KAAa,MAAA,GAAS,WAAM,QAAA,EAAI;AAAA;AAAA,WAC5D;AAAA,UACC;AAAA,SAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ","file":"chunk-4VWNBMMA.js","sourcesContent":["import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/utils/cn\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { PanelLeftIcon } from \"lucide-react\"\nimport { Slot } from \"radix-ui\"\n\nimport { useIsMobile } from \"@/shadcn/hooks/use-mobile\"\nimport { cn } from \"@/utils/cn\"\nimport { Button } from \"@/shadcn/ui/button\"\nimport { Input } from \"@/shadcn/ui/input\"\nimport { Separator } from \"@/shadcn/ui/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@/shadcn/ui/sheet\"\nimport { Skeleton } from \"@/shadcn/ui/skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/shadcn/ui/tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"size-7\", className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full min-w-0 flex-1 flex-col bg-background\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform peer-hover/menu-button:text-sidebar-accent-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground data-[state=open]:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n }, [])\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","/**\n * `<AppShell>` — top-level admin layout wrapper.\n *\n * Four variants control where structural slots land:\n * - `sidebar-left` (default): sidebar on the left, topbar above main\n * - `sidebar-right`: sidebar on the right\n * - `topbar-only`: full-width content under the topbar (no sidebar)\n * - `full-width`: bare content, no chrome\n *\n * For sidebar variants, `<AppShell>` wraps content in shadcn's\n * `<SidebarProvider>` so the rail's collapsed/expanded state, mobile\n * sheet, and keyboard shortcuts work out of the box.\n *\n * Slots (`sidebar`, `topbar`, `footer`, `children`) are passed as React\n * nodes so callers can compose `<Sidebar />` / `<Topbar />` themselves\n * or substitute custom shells per panel.\n */\n\nimport type { ReactNode } from 'react';\nimport { CommandPalette } from '../palette/CommandPalette.js';\nimport { SidebarInset, SidebarProvider } from '../shadcn/ui/sidebar.js';\nimport { cn } from '../utils/cn.js';\n\nexport type AppShellVariant = 'sidebar-left' | 'sidebar-right' | 'topbar-only' | 'full-width';\n\nexport interface AppShellProps {\n variant?: AppShellVariant;\n sidebar?: ReactNode;\n topbar?: ReactNode;\n footer?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function AppShell({\n variant = 'sidebar-left',\n sidebar,\n topbar,\n footer,\n children,\n className,\n}: AppShellProps) {\n if (variant === 'full-width') {\n return (\n <div\n data-arqel-shell=\"full-width\"\n className={cn('min-h-screen bg-background text-foreground', className)}\n >\n <CommandPalette />\n {children}\n </div>\n );\n }\n\n if (variant === 'topbar-only') {\n return (\n <div\n data-arqel-shell=\"topbar-only\"\n className={cn('flex min-h-screen flex-col bg-background text-foreground', className)}\n >\n <CommandPalette />\n {topbar}\n <main className=\"min-w-0 flex-1 p-4 md:p-6\">{children}</main>\n {footer}\n </div>\n );\n }\n\n const sidebarSide = variant === 'sidebar-right' ? 'right' : 'left';\n\n return (\n <SidebarProvider>\n <div\n data-arqel-shell={variant}\n data-sidebar-side={sidebarSide}\n className={cn(\n 'flex min-h-svh w-full bg-background text-foreground',\n sidebarSide === 'right' && 'flex-row-reverse',\n className,\n )}\n >\n <CommandPalette />\n {sidebar}\n <SidebarInset>\n {topbar}\n <main className=\"min-w-0 flex-1 p-4 md:p-6\">{children}</main>\n {footer}\n </SidebarInset>\n </div>\n </SidebarProvider>\n );\n}\n","/**\n * `<Footer>` — minimal optional footer rendered below `<MainContent>`.\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport interface FooterProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function Footer({ children, className }: FooterProps) {\n return (\n <footer\n data-arqel-footer=\"\"\n className={cn(\n 'shrink-0 border-t border-border bg-background px-4 py-3 text-sm text-muted-foreground',\n className,\n )}\n >\n {children}\n </footer>\n );\n}\n","/**\n * `<MainContent>` — padded content wrapper used inside `<AppShell>`.\n *\n * Accepts breadcrumb and header slots so pages don't need to redefine\n * their own scaffolding. `maxWidth` mirrors the Tailwind container scale\n * — `none` opts out of any constraint (useful for full-bleed dashboards).\n */\n\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport type MainContentMaxWidth = 'none' | 'md' | 'lg' | 'xl' | '2xl' | '4xl' | '6xl' | '7xl';\n\nexport interface MainContentProps {\n breadcrumbs?: ReactNode;\n header?: ReactNode;\n children: ReactNode;\n maxWidth?: MainContentMaxWidth;\n className?: string;\n}\n\nconst MAX_WIDTH_CLASSES: Record<MainContentMaxWidth, string> = {\n none: '',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n '2xl': 'max-w-2xl',\n '4xl': 'max-w-4xl',\n '6xl': 'max-w-6xl',\n '7xl': 'max-w-7xl',\n};\n\nexport function MainContent({\n breadcrumbs,\n header,\n children,\n maxWidth = '7xl',\n className,\n}: MainContentProps) {\n return (\n <div\n data-arqel-main=\"\"\n className={cn(\n 'mx-auto w-full px-4 py-6 sm:px-6 lg:px-8',\n MAX_WIDTH_CLASSES[maxWidth],\n className,\n )}\n >\n {breadcrumbs && <div className=\"mb-3\">{breadcrumbs}</div>}\n {header && <div className=\"mb-6\">{header}</div>}\n {children}\n </div>\n );\n}\n","/**\n * `<Sidebar>` — primary navigation rail.\n *\n * Wraps the shadcn `Sidebar` block. Items come from `useNavigation()`\n * shared props (Inertia panel.navigation) by default, but the component\n * also accepts an `items` override for custom panels. The shadcn block\n * already handles desktop rail, mobile sheet, collapsed/icon mode, and\n * keyboard/cookie state via `<SidebarProvider>` (rendered by `<AppShell>`).\n */\n\nimport { type NavigationItemPayload, useNavigation } from '@arqel-dev/hooks';\nimport { type ReactNode, useMemo } from 'react';\nimport {\n Sidebar as ShadcnSidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from '../shadcn/ui/sidebar.js';\nimport { resolveLucideIcon } from '../utils/icon.js';\n\nexport interface SidebarProps {\n items?: NavigationItemPayload[];\n brand?: ReactNode;\n footer?: ReactNode;\n className?: string;\n}\n\nexport function Sidebar({ items: itemsProp, brand, footer, className }: SidebarProps) {\n const { items: sharedItems } = useNavigation();\n const items = itemsProp ?? sharedItems;\n const grouped = useMemo(() => groupItems(items), [items]);\n\n return (\n <ShadcnSidebar collapsible=\"icon\" className={className}>\n {brand ? (\n <SidebarHeader>\n <div className=\"flex items-center gap-2 px-2 py-1.5 text-sm font-semibold\">{brand}</div>\n </SidebarHeader>\n ) : null}\n <SidebarContent>\n {grouped.map(([group, list]) => (\n <SidebarGroup key={group ?? '__ungrouped__'}>\n {group ? <SidebarGroupLabel>{group}</SidebarGroupLabel> : null}\n <SidebarGroupContent>\n <SidebarMenu>\n {list.map((item) => {\n const Icon = resolveLucideIcon(item.icon);\n return (\n <SidebarMenuItem key={item.url ?? item.label}>\n <SidebarMenuButton\n asChild={Boolean(item.url)}\n isActive={Boolean(item.active)}\n >\n {item.url ? (\n <a href={item.url}>\n {Icon ? <Icon /> : null}\n <span>{item.label}</span>\n </a>\n ) : (\n <>\n {Icon ? <Icon /> : null}\n <span>{item.label}</span>\n </>\n )}\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n })}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n ))}\n </SidebarContent>\n {footer ? <SidebarFooter>{footer}</SidebarFooter> : null}\n </ShadcnSidebar>\n );\n}\n\nfunction groupItems(\n items: NavigationItemPayload[],\n): Array<[string | undefined, NavigationItemPayload[]]> {\n const groups = new Map<string | undefined, NavigationItemPayload[]>();\n for (const item of items) {\n const key = item.group ?? undefined;\n const list = groups.get(key) ?? [];\n list.push(item);\n groups.set(key, list);\n }\n return Array.from(groups.entries());\n}\n","/**\n * `<Topbar>` — header strip above the main content.\n *\n * Phase 1 wires the brand slot, theme toggle, and a mobile menu trigger.\n * Search and tenant switcher are reserved slots for Phase 2 (command\n * palette + multi-tenancy). The user menu is exposed as a slot so apps\n * can plug in any dropdown impl (Base UI Menu, ShadCN-generated, etc.).\n */\n\nimport { useTheme } from '@arqel-dev/react/providers';\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { ReactNode } from 'react';\nimport { Button } from '../action/Button.js';\nimport { SidebarTrigger } from '../shadcn/ui/sidebar.js';\nimport { cn } from '../utils/cn.js';\n\nexport interface TopbarProps {\n brand?: ReactNode;\n search?: ReactNode;\n userMenu?: ReactNode;\n tenantSwitcher?: ReactNode;\n onMobileMenuClick?: () => void;\n className?: string;\n}\n\nexport function Topbar({\n brand,\n search,\n userMenu,\n tenantSwitcher,\n onMobileMenuClick,\n className,\n}: TopbarProps) {\n const { resolved, toggle } = useTheme();\n const t = useArqelTranslations();\n\n return (\n <header\n data-arqel-topbar=\"\"\n className={cn(\n // `min-w-0 overflow-hidden` keep the topbar from ever pushing the body\n // wide: as a flex child it must be allowed to shrink below its content\n // (min-w-0), and any control cluster that still can't fit is clipped\n // here instead of overflowing the viewport. Radix popovers (tenant /\n // locale / user menus) render in a portal, so clipping the bar never\n // hides their open content.\n 'flex h-14 min-w-0 shrink-0 items-center gap-2 overflow-hidden border-b border-border bg-background px-4',\n className,\n )}\n >\n <SidebarTrigger className=\"-ml-1\" />\n {brand && <div className=\"flex min-w-0 items-center\">{brand}</div>}\n <div className=\"hidden min-w-0 flex-1 md:block\">{search}</div>\n <div className=\"ml-auto flex min-w-0 items-center gap-2 md:ml-0\">\n {tenantSwitcher}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={\n resolved === 'dark'\n ? t('arqel.aria.theme_toggle_light', 'Switch to light theme')\n : t('arqel.aria.theme_toggle_dark', 'Switch to dark theme')\n }\n onClick={toggle}\n >\n <span aria-hidden=\"true\">{resolved === 'dark' ? '☀' : '☾'}</span>\n </Button>\n {userMenu}\n </div>\n </header>\n );\n}\n"]}