@arqel-dev/ui 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/SKILL.md +5 -2
  2. package/dist/AreaChart-NMQ2RQGA.js +33 -0
  3. package/dist/AreaChart-NMQ2RQGA.js.map +1 -0
  4. package/dist/ArqelCreatePage-P3G6TKIK.js +8 -0
  5. package/dist/ArqelCreatePage-P3G6TKIK.js.map +1 -0
  6. package/dist/ArqelDashboardPage-PX3Y75AA.js +6 -0
  7. package/dist/ArqelDashboardPage-PX3Y75AA.js.map +1 -0
  8. package/dist/ArqelEditPage-HKQSE6E5.js +8 -0
  9. package/dist/ArqelEditPage-HKQSE6E5.js.map +1 -0
  10. package/dist/ArqelIndexPage-MRH3572Z.js +12 -0
  11. package/dist/ArqelIndexPage-MRH3572Z.js.map +1 -0
  12. package/dist/ArqelShowPage-4FS5MTUN.js +6 -0
  13. package/dist/ArqelShowPage-4FS5MTUN.js.map +1 -0
  14. package/dist/BarChart-KLHKTLO2.js +19 -0
  15. package/dist/BarChart-KLHKTLO2.js.map +1 -0
  16. package/dist/DonutChart-L56R4QF2.js +11 -0
  17. package/dist/DonutChart-L56R4QF2.js.map +1 -0
  18. package/dist/LineChart-GHMPHFZZ.js +30 -0
  19. package/dist/LineChart-GHMPHFZZ.js.map +1 -0
  20. package/dist/PieChart-T2VQOFPP.js +4 -0
  21. package/dist/PieChart-T2VQOFPP.js.map +1 -0
  22. package/dist/RadarChart-CSWR5AO7.js +32 -0
  23. package/dist/RadarChart-CSWR5AO7.js.map +1 -0
  24. package/dist/Topbar-DffcNdcJ.d.ts +50 -0
  25. package/dist/action.d.ts +12 -2
  26. package/dist/action.js +6 -1090
  27. package/dist/action.js.map +1 -1
  28. package/dist/auth.js +1 -10
  29. package/dist/auth.js.map +1 -1
  30. package/dist/chunk-2LTZJ4R7.js +110 -0
  31. package/dist/chunk-2LTZJ4R7.js.map +1 -0
  32. package/dist/chunk-3JJOHYD7.js +57 -0
  33. package/dist/chunk-3JJOHYD7.js.map +1 -0
  34. package/dist/chunk-47HD7ALI.js +370 -0
  35. package/dist/chunk-47HD7ALI.js.map +1 -0
  36. package/dist/chunk-6UJQP7KU.js +737 -0
  37. package/dist/chunk-6UJQP7KU.js.map +1 -0
  38. package/dist/chunk-7LSZADUC.js +50 -0
  39. package/dist/chunk-7LSZADUC.js.map +1 -0
  40. package/dist/chunk-B7ULUJVO.js +11 -0
  41. package/dist/chunk-B7ULUJVO.js.map +1 -0
  42. package/dist/chunk-C5H44NSP.js +37 -0
  43. package/dist/chunk-C5H44NSP.js.map +1 -0
  44. package/dist/chunk-DSULVRB6.js +101 -0
  45. package/dist/chunk-DSULVRB6.js.map +1 -0
  46. package/dist/chunk-ERT7LL6C.js +199 -0
  47. package/dist/chunk-ERT7LL6C.js.map +1 -0
  48. package/dist/chunk-EYAUPJ6J.js +64 -0
  49. package/dist/chunk-EYAUPJ6J.js.map +1 -0
  50. package/dist/chunk-FHRQ7PWE.js +58 -0
  51. package/dist/chunk-FHRQ7PWE.js.map +1 -0
  52. package/dist/chunk-FV7RESKL.js +285 -0
  53. package/dist/chunk-FV7RESKL.js.map +1 -0
  54. package/dist/chunk-K7QY56XN.js +610 -0
  55. package/dist/chunk-K7QY56XN.js.map +1 -0
  56. package/dist/chunk-L3JBBN4H.js +27 -0
  57. package/dist/chunk-L3JBBN4H.js.map +1 -0
  58. package/dist/chunk-MSRTGCTJ.js +597 -0
  59. package/dist/chunk-MSRTGCTJ.js.map +1 -0
  60. package/dist/chunk-MTNFFSVA.js +92 -0
  61. package/dist/chunk-MTNFFSVA.js.map +1 -0
  62. package/dist/chunk-MTZJDFQ6.js +32 -0
  63. package/dist/chunk-MTZJDFQ6.js.map +1 -0
  64. package/dist/chunk-MXUXMHOK.js +16 -0
  65. package/dist/chunk-MXUXMHOK.js.map +1 -0
  66. package/dist/chunk-PXON56HL.js +35 -0
  67. package/dist/chunk-PXON56HL.js.map +1 -0
  68. package/dist/chunk-PZEVKMZX.js +598 -0
  69. package/dist/chunk-PZEVKMZX.js.map +1 -0
  70. package/dist/chunk-R4BOUU6Y.js +55 -0
  71. package/dist/chunk-R4BOUU6Y.js.map +1 -0
  72. package/dist/chunk-RMPOR2YZ.js +12 -0
  73. package/dist/chunk-RMPOR2YZ.js.map +1 -0
  74. package/dist/chunk-RNAMHQM6.js +12 -0
  75. package/dist/chunk-RNAMHQM6.js.map +1 -0
  76. package/dist/chunk-TNJEHYRF.js +387 -0
  77. package/dist/chunk-TNJEHYRF.js.map +1 -0
  78. package/dist/chunk-VSTRVXXZ.js +49 -0
  79. package/dist/chunk-VSTRVXXZ.js.map +1 -0
  80. package/dist/chunk-WKWV36PG.js +140 -0
  81. package/dist/chunk-WKWV36PG.js.map +1 -0
  82. package/dist/cn-By8XWiSA.d.ts +12 -0
  83. package/dist/flash.js +2 -104
  84. package/dist/flash.js.map +1 -1
  85. package/dist/form.js +4 -673
  86. package/dist/form.js.map +1 -1
  87. package/dist/index.d.ts +2 -2
  88. package/dist/index.js +18 -3706
  89. package/dist/index.js.map +1 -1
  90. package/dist/pages.js +23 -3025
  91. package/dist/pages.js.map +1 -1
  92. package/dist/palette.js +1 -283
  93. package/dist/palette.js.map +1 -1
  94. package/dist/primitives.js +3 -658
  95. package/dist/primitives.js.map +1 -1
  96. package/dist/resource.js +5 -720
  97. package/dist/resource.js.map +1 -1
  98. package/dist/shell.d.ts +26 -46
  99. package/dist/shell.js +46 -1039
  100. package/dist/shell.js.map +1 -1
  101. package/dist/table.js +4 -618
  102. package/dist/table.js.map +1 -1
  103. package/dist/utility.js +3 -104
  104. package/dist/utility.js.map +1 -1
  105. package/dist/utils.d.ts +12 -6
  106. package/dist/utils.js +2 -9
  107. package/dist/utils.js.map +1 -1
  108. package/dist/widgets.d.ts +7 -2
  109. package/dist/widgets.js +3 -675
  110. package/dist/widgets.js.map +1 -1
  111. package/package.json +15 -14
@@ -0,0 +1,737 @@
1
+ import { CommandPalette } from './chunk-FV7RESKL.js';
2
+ import { resolveLucideIcon } from './chunk-RMPOR2YZ.js';
3
+ import { Button } from './chunk-FHRQ7PWE.js';
4
+ import { cn } from './chunk-B7ULUJVO.js';
5
+ import * as React4 from 'react';
6
+ import { useMemo } from 'react';
7
+ import { cva } from 'class-variance-authority';
8
+ import { PanelLeftIcon, XIcon } from 'lucide-react';
9
+ import { Slot, Tooltip as Tooltip$1, Dialog } from 'radix-ui';
10
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
11
+ import { useNavigation } from '@arqel-dev/hooks';
12
+ import { useTheme } from '@arqel-dev/react/providers';
13
+
14
+ var MOBILE_BREAKPOINT = 768;
15
+ function useIsMobile() {
16
+ const [isMobile, setIsMobile] = React4.useState(void 0);
17
+ React4.useEffect(() => {
18
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
19
+ const onChange = () => {
20
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
21
+ };
22
+ mql.addEventListener("change", onChange);
23
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
24
+ return () => mql.removeEventListener("change", onChange);
25
+ }, []);
26
+ return !!isMobile;
27
+ }
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
+ function TooltipProvider({
122
+ delayDuration = 0,
123
+ ...props
124
+ }) {
125
+ return /* @__PURE__ */ jsx(
126
+ Tooltip$1.Provider,
127
+ {
128
+ "data-slot": "tooltip-provider",
129
+ delayDuration,
130
+ ...props
131
+ }
132
+ );
133
+ }
134
+ function Tooltip({
135
+ ...props
136
+ }) {
137
+ return /* @__PURE__ */ jsx(Tooltip$1.Root, { "data-slot": "tooltip", ...props });
138
+ }
139
+ function TooltipTrigger({
140
+ ...props
141
+ }) {
142
+ return /* @__PURE__ */ jsx(Tooltip$1.Trigger, { "data-slot": "tooltip-trigger", ...props });
143
+ }
144
+ function TooltipContent({
145
+ className,
146
+ sideOffset = 0,
147
+ children,
148
+ ...props
149
+ }) {
150
+ return /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsxs(
151
+ Tooltip$1.Content,
152
+ {
153
+ "data-slot": "tooltip-content",
154
+ sideOffset,
155
+ className: cn(
156
+ "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",
157
+ className
158
+ ),
159
+ ...props,
160
+ children: [
161
+ children,
162
+ /* @__PURE__ */ jsx(Tooltip$1.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground" })
163
+ ]
164
+ }
165
+ ) });
166
+ }
167
+ var SIDEBAR_COOKIE_NAME = "sidebar_state";
168
+ var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
169
+ var SIDEBAR_WIDTH = "16rem";
170
+ var SIDEBAR_WIDTH_MOBILE = "18rem";
171
+ var SIDEBAR_WIDTH_ICON = "3rem";
172
+ var SIDEBAR_KEYBOARD_SHORTCUT = "b";
173
+ var SidebarContext = React4.createContext(null);
174
+ function useSidebar() {
175
+ const context = React4.useContext(SidebarContext);
176
+ if (!context) {
177
+ throw new Error("useSidebar must be used within a SidebarProvider.");
178
+ }
179
+ return context;
180
+ }
181
+ function SidebarProvider({
182
+ defaultOpen = true,
183
+ open: openProp,
184
+ onOpenChange: setOpenProp,
185
+ className,
186
+ style,
187
+ children,
188
+ ...props
189
+ }) {
190
+ const isMobile = useIsMobile();
191
+ const [openMobile, setOpenMobile] = React4.useState(false);
192
+ const [_open, _setOpen] = React4.useState(defaultOpen);
193
+ const open = openProp ?? _open;
194
+ const setOpen = React4.useCallback(
195
+ (value) => {
196
+ const openState = typeof value === "function" ? value(open) : value;
197
+ if (setOpenProp) {
198
+ setOpenProp(openState);
199
+ } else {
200
+ _setOpen(openState);
201
+ }
202
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
203
+ },
204
+ [setOpenProp, open]
205
+ );
206
+ const toggleSidebar = React4.useCallback(() => {
207
+ return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2);
208
+ }, [isMobile, setOpen, setOpenMobile]);
209
+ React4.useEffect(() => {
210
+ const handleKeyDown = (event) => {
211
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
212
+ event.preventDefault();
213
+ toggleSidebar();
214
+ }
215
+ };
216
+ window.addEventListener("keydown", handleKeyDown);
217
+ return () => window.removeEventListener("keydown", handleKeyDown);
218
+ }, [toggleSidebar]);
219
+ const state = open ? "expanded" : "collapsed";
220
+ const contextValue = React4.useMemo(
221
+ () => ({
222
+ state,
223
+ open,
224
+ setOpen,
225
+ isMobile,
226
+ openMobile,
227
+ setOpenMobile,
228
+ toggleSidebar
229
+ }),
230
+ [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
231
+ );
232
+ return /* @__PURE__ */ jsx(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsx(
233
+ "div",
234
+ {
235
+ "data-slot": "sidebar-wrapper",
236
+ style: {
237
+ "--sidebar-width": SIDEBAR_WIDTH,
238
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
239
+ ...style
240
+ },
241
+ className: cn(
242
+ "group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar",
243
+ className
244
+ ),
245
+ ...props,
246
+ children
247
+ }
248
+ ) }) });
249
+ }
250
+ function Sidebar({
251
+ side = "left",
252
+ variant = "sidebar",
253
+ collapsible = "offcanvas",
254
+ className,
255
+ children,
256
+ ...props
257
+ }) {
258
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
259
+ if (collapsible === "none") {
260
+ return /* @__PURE__ */ jsx(
261
+ "div",
262
+ {
263
+ "data-slot": "sidebar",
264
+ className: cn(
265
+ "flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground",
266
+ className
267
+ ),
268
+ ...props,
269
+ children
270
+ }
271
+ );
272
+ }
273
+ if (isMobile) {
274
+ return /* @__PURE__ */ jsx(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: /* @__PURE__ */ jsxs(
275
+ SheetContent,
276
+ {
277
+ "data-sidebar": "sidebar",
278
+ "data-slot": "sidebar",
279
+ "data-mobile": "true",
280
+ className: "w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",
281
+ style: {
282
+ "--sidebar-width": SIDEBAR_WIDTH_MOBILE
283
+ },
284
+ side,
285
+ children: [
286
+ /* @__PURE__ */ jsxs(SheetHeader, { className: "sr-only", children: [
287
+ /* @__PURE__ */ jsx(SheetTitle, { children: "Sidebar" }),
288
+ /* @__PURE__ */ jsx(SheetDescription, { children: "Displays the mobile sidebar." })
289
+ ] }),
290
+ /* @__PURE__ */ jsx("div", { className: "flex h-full w-full flex-col", children })
291
+ ]
292
+ }
293
+ ) });
294
+ }
295
+ return /* @__PURE__ */ jsxs(
296
+ "div",
297
+ {
298
+ className: "group peer hidden text-sidebar-foreground md:block",
299
+ "data-state": state,
300
+ "data-collapsible": state === "collapsed" ? collapsible : "",
301
+ "data-variant": variant,
302
+ "data-side": side,
303
+ "data-slot": "sidebar",
304
+ children: [
305
+ /* @__PURE__ */ jsx(
306
+ "div",
307
+ {
308
+ "data-slot": "sidebar-gap",
309
+ className: cn(
310
+ "relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear",
311
+ "group-data-[collapsible=offcanvas]:w-0",
312
+ "group-data-[side=right]:rotate-180",
313
+ variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"
314
+ )
315
+ }
316
+ ),
317
+ /* @__PURE__ */ jsx(
318
+ "div",
319
+ {
320
+ "data-slot": "sidebar-container",
321
+ className: cn(
322
+ "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex",
323
+ side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
324
+ // Adjust the padding for floating and inset variants.
325
+ variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",
326
+ className
327
+ ),
328
+ ...props,
329
+ children: /* @__PURE__ */ jsx(
330
+ "div",
331
+ {
332
+ "data-sidebar": "sidebar",
333
+ "data-slot": "sidebar-inner",
334
+ 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",
335
+ children
336
+ }
337
+ )
338
+ }
339
+ )
340
+ ]
341
+ }
342
+ );
343
+ }
344
+ function SidebarTrigger({
345
+ className,
346
+ onClick,
347
+ ...props
348
+ }) {
349
+ const { toggleSidebar } = useSidebar();
350
+ return /* @__PURE__ */ jsxs(
351
+ Button,
352
+ {
353
+ "data-sidebar": "trigger",
354
+ "data-slot": "sidebar-trigger",
355
+ variant: "ghost",
356
+ size: "icon",
357
+ className: cn("size-7", className),
358
+ onClick: (event) => {
359
+ onClick?.(event);
360
+ toggleSidebar();
361
+ },
362
+ ...props,
363
+ children: [
364
+ /* @__PURE__ */ jsx(PanelLeftIcon, {}),
365
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle Sidebar" })
366
+ ]
367
+ }
368
+ );
369
+ }
370
+ function SidebarInset({ className, ...props }) {
371
+ return /* @__PURE__ */ jsx(
372
+ "main",
373
+ {
374
+ "data-slot": "sidebar-inset",
375
+ className: cn(
376
+ "relative flex w-full flex-1 flex-col bg-background",
377
+ "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
+ className
379
+ ),
380
+ ...props
381
+ }
382
+ );
383
+ }
384
+ function SidebarHeader({ className, ...props }) {
385
+ return /* @__PURE__ */ jsx(
386
+ "div",
387
+ {
388
+ "data-slot": "sidebar-header",
389
+ "data-sidebar": "header",
390
+ className: cn("flex flex-col gap-2 p-2", className),
391
+ ...props
392
+ }
393
+ );
394
+ }
395
+ function SidebarFooter({ className, ...props }) {
396
+ return /* @__PURE__ */ jsx(
397
+ "div",
398
+ {
399
+ "data-slot": "sidebar-footer",
400
+ "data-sidebar": "footer",
401
+ className: cn("flex flex-col gap-2 p-2", className),
402
+ ...props
403
+ }
404
+ );
405
+ }
406
+ function SidebarContent({ className, ...props }) {
407
+ return /* @__PURE__ */ jsx(
408
+ "div",
409
+ {
410
+ "data-slot": "sidebar-content",
411
+ "data-sidebar": "content",
412
+ className: cn(
413
+ "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
414
+ className
415
+ ),
416
+ ...props
417
+ }
418
+ );
419
+ }
420
+ function SidebarGroup({ className, ...props }) {
421
+ return /* @__PURE__ */ jsx(
422
+ "div",
423
+ {
424
+ "data-slot": "sidebar-group",
425
+ "data-sidebar": "group",
426
+ className: cn("relative flex w-full min-w-0 flex-col p-2", className),
427
+ ...props
428
+ }
429
+ );
430
+ }
431
+ function SidebarGroupLabel({
432
+ className,
433
+ asChild = false,
434
+ ...props
435
+ }) {
436
+ const Comp = asChild ? Slot.Root : "div";
437
+ return /* @__PURE__ */ jsx(
438
+ Comp,
439
+ {
440
+ "data-slot": "sidebar-group-label",
441
+ "data-sidebar": "group-label",
442
+ className: cn(
443
+ "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",
444
+ "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
445
+ className
446
+ ),
447
+ ...props
448
+ }
449
+ );
450
+ }
451
+ function SidebarGroupContent({
452
+ className,
453
+ ...props
454
+ }) {
455
+ return /* @__PURE__ */ jsx(
456
+ "div",
457
+ {
458
+ "data-slot": "sidebar-group-content",
459
+ "data-sidebar": "group-content",
460
+ className: cn("w-full text-sm", className),
461
+ ...props
462
+ }
463
+ );
464
+ }
465
+ function SidebarMenu({ className, ...props }) {
466
+ return /* @__PURE__ */ jsx(
467
+ "ul",
468
+ {
469
+ "data-slot": "sidebar-menu",
470
+ "data-sidebar": "menu",
471
+ className: cn("flex w-full min-w-0 flex-col gap-1", className),
472
+ ...props
473
+ }
474
+ );
475
+ }
476
+ function SidebarMenuItem({ className, ...props }) {
477
+ return /* @__PURE__ */ jsx(
478
+ "li",
479
+ {
480
+ "data-slot": "sidebar-menu-item",
481
+ "data-sidebar": "menu-item",
482
+ className: cn("group/menu-item relative", className),
483
+ ...props
484
+ }
485
+ );
486
+ }
487
+ var sidebarMenuButtonVariants = cva(
488
+ "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",
489
+ {
490
+ variants: {
491
+ variant: {
492
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
493
+ outline: "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))]"
494
+ },
495
+ size: {
496
+ default: "h-8 text-sm",
497
+ sm: "h-7 text-xs",
498
+ lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!"
499
+ }
500
+ },
501
+ defaultVariants: {
502
+ variant: "default",
503
+ size: "default"
504
+ }
505
+ }
506
+ );
507
+ function SidebarMenuButton({
508
+ asChild = false,
509
+ isActive = false,
510
+ variant = "default",
511
+ size = "default",
512
+ tooltip,
513
+ className,
514
+ ...props
515
+ }) {
516
+ const Comp = asChild ? Slot.Root : "button";
517
+ const { isMobile, state } = useSidebar();
518
+ const button = /* @__PURE__ */ jsx(
519
+ Comp,
520
+ {
521
+ "data-slot": "sidebar-menu-button",
522
+ "data-sidebar": "menu-button",
523
+ "data-size": size,
524
+ "data-active": isActive,
525
+ className: cn(sidebarMenuButtonVariants({ variant, size }), className),
526
+ ...props
527
+ }
528
+ );
529
+ if (!tooltip) {
530
+ return button;
531
+ }
532
+ if (typeof tooltip === "string") {
533
+ tooltip = {
534
+ children: tooltip
535
+ };
536
+ }
537
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
538
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: button }),
539
+ /* @__PURE__ */ jsx(
540
+ TooltipContent,
541
+ {
542
+ side: "right",
543
+ align: "center",
544
+ hidden: state !== "collapsed" || isMobile,
545
+ ...tooltip
546
+ }
547
+ )
548
+ ] });
549
+ }
550
+ function AppShell({
551
+ variant = "sidebar-left",
552
+ sidebar,
553
+ topbar,
554
+ footer,
555
+ children,
556
+ className
557
+ }) {
558
+ if (variant === "full-width") {
559
+ return /* @__PURE__ */ jsxs(
560
+ "div",
561
+ {
562
+ "data-arqel-shell": "full-width",
563
+ className: cn("min-h-screen bg-background text-foreground", className),
564
+ children: [
565
+ /* @__PURE__ */ jsx(CommandPalette, {}),
566
+ children
567
+ ]
568
+ }
569
+ );
570
+ }
571
+ if (variant === "topbar-only") {
572
+ return /* @__PURE__ */ jsxs(
573
+ "div",
574
+ {
575
+ "data-arqel-shell": "topbar-only",
576
+ className: cn("flex min-h-screen flex-col bg-background text-foreground", className),
577
+ children: [
578
+ /* @__PURE__ */ jsx(CommandPalette, {}),
579
+ topbar,
580
+ /* @__PURE__ */ jsx("main", { className: "flex-1", children }),
581
+ footer
582
+ ]
583
+ }
584
+ );
585
+ }
586
+ const sidebarSide = variant === "sidebar-right" ? "right" : "left";
587
+ return /* @__PURE__ */ jsx(SidebarProvider, { children: /* @__PURE__ */ jsxs(
588
+ "div",
589
+ {
590
+ "data-arqel-shell": variant,
591
+ "data-sidebar-side": sidebarSide,
592
+ className: cn(
593
+ "flex min-h-svh w-full bg-background text-foreground",
594
+ sidebarSide === "right" && "flex-row-reverse",
595
+ className
596
+ ),
597
+ children: [
598
+ /* @__PURE__ */ jsx(CommandPalette, {}),
599
+ sidebar,
600
+ /* @__PURE__ */ jsxs(SidebarInset, { children: [
601
+ topbar,
602
+ /* @__PURE__ */ jsx("main", { className: "flex-1", children }),
603
+ footer
604
+ ] })
605
+ ]
606
+ }
607
+ ) });
608
+ }
609
+ function Footer({ children, className }) {
610
+ return /* @__PURE__ */ jsx(
611
+ "footer",
612
+ {
613
+ "data-arqel-footer": "",
614
+ className: cn(
615
+ "shrink-0 border-t border-border bg-background px-4 py-3 text-sm text-muted-foreground",
616
+ className
617
+ ),
618
+ children
619
+ }
620
+ );
621
+ }
622
+ var MAX_WIDTH_CLASSES = {
623
+ none: "",
624
+ md: "max-w-md",
625
+ lg: "max-w-lg",
626
+ xl: "max-w-xl",
627
+ "2xl": "max-w-2xl",
628
+ "4xl": "max-w-4xl",
629
+ "6xl": "max-w-6xl",
630
+ "7xl": "max-w-7xl"
631
+ };
632
+ function MainContent({
633
+ breadcrumbs,
634
+ header,
635
+ children,
636
+ maxWidth = "7xl",
637
+ className
638
+ }) {
639
+ return /* @__PURE__ */ jsxs(
640
+ "div",
641
+ {
642
+ "data-arqel-main": "",
643
+ className: cn(
644
+ "mx-auto w-full px-4 py-6 sm:px-6 lg:px-8",
645
+ MAX_WIDTH_CLASSES[maxWidth],
646
+ className
647
+ ),
648
+ children: [
649
+ breadcrumbs && /* @__PURE__ */ jsx("div", { className: "mb-3", children: breadcrumbs }),
650
+ header && /* @__PURE__ */ jsx("div", { className: "mb-6", children: header }),
651
+ children
652
+ ]
653
+ }
654
+ );
655
+ }
656
+ function Sidebar2({ items: itemsProp, brand, footer, className }) {
657
+ const { items: sharedItems } = useNavigation();
658
+ const items = itemsProp ?? sharedItems;
659
+ const grouped = useMemo(() => groupItems(items), [items]);
660
+ return /* @__PURE__ */ jsxs(Sidebar, { collapsible: "icon", className, children: [
661
+ brand ? /* @__PURE__ */ jsx(SidebarHeader, { children: /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 px-2 py-1.5 text-sm font-semibold", children: brand }) }) : null,
662
+ /* @__PURE__ */ jsx(SidebarContent, { children: grouped.map(([group, list]) => /* @__PURE__ */ jsxs(SidebarGroup, { children: [
663
+ group ? /* @__PURE__ */ jsx(SidebarGroupLabel, { children: group }) : null,
664
+ /* @__PURE__ */ jsx(SidebarGroupContent, { children: /* @__PURE__ */ jsx(SidebarMenu, { children: list.map((item) => {
665
+ const Icon = resolveLucideIcon(item.icon);
666
+ return /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsx(
667
+ SidebarMenuButton,
668
+ {
669
+ asChild: Boolean(item.url),
670
+ isActive: Boolean(item.active),
671
+ children: item.url ? /* @__PURE__ */ jsxs("a", { href: item.url, children: [
672
+ Icon ? /* @__PURE__ */ jsx(Icon, {}) : null,
673
+ /* @__PURE__ */ jsx("span", { children: item.label })
674
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
675
+ Icon ? /* @__PURE__ */ jsx(Icon, {}) : null,
676
+ /* @__PURE__ */ jsx("span", { children: item.label })
677
+ ] })
678
+ }
679
+ ) }, item.url ?? item.label);
680
+ }) }) })
681
+ ] }, group ?? "__ungrouped__")) }),
682
+ footer ? /* @__PURE__ */ jsx(SidebarFooter, { children: footer }) : null
683
+ ] });
684
+ }
685
+ function groupItems(items) {
686
+ const groups = /* @__PURE__ */ new Map();
687
+ for (const item of items) {
688
+ const key = item.group ?? void 0;
689
+ const list = groups.get(key) ?? [];
690
+ list.push(item);
691
+ groups.set(key, list);
692
+ }
693
+ return Array.from(groups.entries());
694
+ }
695
+ function Topbar({
696
+ brand,
697
+ search,
698
+ userMenu,
699
+ tenantSwitcher,
700
+ onMobileMenuClick,
701
+ className
702
+ }) {
703
+ const { resolved, toggle } = useTheme();
704
+ return /* @__PURE__ */ jsxs(
705
+ "header",
706
+ {
707
+ "data-arqel-topbar": "",
708
+ className: cn(
709
+ "flex h-14 shrink-0 items-center gap-2 border-b border-border bg-background px-4",
710
+ className
711
+ ),
712
+ children: [
713
+ /* @__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: [
717
+ tenantSwitcher,
718
+ /* @__PURE__ */ jsx(
719
+ Button,
720
+ {
721
+ variant: "ghost",
722
+ size: "icon",
723
+ "aria-label": `Switch to ${resolved === "dark" ? "light" : "dark"} theme`,
724
+ onClick: toggle,
725
+ children: /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: resolved === "dark" ? "\u2600" : "\u263E" })
726
+ }
727
+ ),
728
+ userMenu
729
+ ] })
730
+ ]
731
+ }
732
+ );
733
+ }
734
+
735
+ export { AppShell, Footer, MainContent, Sidebar2 as Sidebar, Topbar };
736
+ //# sourceMappingURL=chunk-6UJQP7KU.js.map
737
+ //# sourceMappingURL=chunk-6UJQP7KU.js.map