@caffeinebounce/ui 0.62.2

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -0
  3. package/dist/FinancialStatementTable-BNUrdTU4.d.cts +249 -0
  4. package/dist/FinancialStatementTable-BNUrdTU4.d.ts +249 -0
  5. package/dist/NewsletterSignup-BPreFi5W.d.cts +37 -0
  6. package/dist/NewsletterSignup-BPreFi5W.d.ts +37 -0
  7. package/dist/TestimonialsSection-DtPu2OeR.d.ts +736 -0
  8. package/dist/TestimonialsSection-z-yotRfv.d.cts +736 -0
  9. package/dist/UnifiedTableControls-CG299y9h.d.ts +1233 -0
  10. package/dist/UnifiedTableControls-CIjRpNhy.d.cts +1233 -0
  11. package/dist/blog.d.cts +99 -0
  12. package/dist/blog.d.ts +99 -0
  13. package/dist/blog.js +292 -0
  14. package/dist/blog.mjs +279 -0
  15. package/dist/button-BHnoRUkF.d.cts +34 -0
  16. package/dist/button-BHnoRUkF.d.ts +34 -0
  17. package/dist/charts.d.cts +80 -0
  18. package/dist/charts.d.ts +80 -0
  19. package/dist/charts.js +19 -0
  20. package/dist/charts.mjs +2 -0
  21. package/dist/chunk-33JR5SYE.js +44 -0
  22. package/dist/chunk-3NDB4YPC.js +247 -0
  23. package/dist/chunk-5RW4PYZ6.js +1504 -0
  24. package/dist/chunk-5THF4YP6.mjs +155 -0
  25. package/dist/chunk-6BUBNZPG.mjs +164 -0
  26. package/dist/chunk-6DVWMJ3H.mjs +7029 -0
  27. package/dist/chunk-6TGV2DNP.js +120 -0
  28. package/dist/chunk-72JGQ7IJ.mjs +1498 -0
  29. package/dist/chunk-7DHKQODW.mjs +2932 -0
  30. package/dist/chunk-7IKHZKAC.js +160 -0
  31. package/dist/chunk-ADIDI7AJ.js +11 -0
  32. package/dist/chunk-BFWX5GJZ.mjs +940 -0
  33. package/dist/chunk-BMFQG6RA.mjs +5537 -0
  34. package/dist/chunk-C4UT5V3P.js +65 -0
  35. package/dist/chunk-CC4KUIKC.js +2004 -0
  36. package/dist/chunk-D3QXPL47.mjs +1814 -0
  37. package/dist/chunk-DQWHYBV2.js +36 -0
  38. package/dist/chunk-E42B4GSB.js +993 -0
  39. package/dist/chunk-ESZ7CBA2.js +1007 -0
  40. package/dist/chunk-EYJJQVV4.js +111 -0
  41. package/dist/chunk-FRRS2YZH.mjs +129 -0
  42. package/dist/chunk-G5TQWWQA.mjs +37 -0
  43. package/dist/chunk-GAIQJCAZ.js +5612 -0
  44. package/dist/chunk-GMBGWOCR.mjs +48 -0
  45. package/dist/chunk-GUSTCU2W.mjs +105 -0
  46. package/dist/chunk-HBLKVQIQ.mjs +23 -0
  47. package/dist/chunk-HMAMMC72.js +26 -0
  48. package/dist/chunk-IMKLN273.mjs +9 -0
  49. package/dist/chunk-J6OLBSZR.js +250 -0
  50. package/dist/chunk-JAE45W2T.js +28 -0
  51. package/dist/chunk-JORVSG52.js +606 -0
  52. package/dist/chunk-KB7UXIQZ.mjs +984 -0
  53. package/dist/chunk-KGGQ5NZV.js +186 -0
  54. package/dist/chunk-KHCC5UKW.mjs +22 -0
  55. package/dist/chunk-KRRIRS6A.mjs +1945 -0
  56. package/dist/chunk-LQCVRWVF.js +48 -0
  57. package/dist/chunk-MHZXUOGN.mjs +168 -0
  58. package/dist/chunk-MPZFPU4X.js +349 -0
  59. package/dist/chunk-MVYRNJA6.js +74 -0
  60. package/dist/chunk-N6AFNFZR.mjs +565 -0
  61. package/dist/chunk-OFQLWSUR.mjs +214 -0
  62. package/dist/chunk-OLAAXLXY.mjs +219 -0
  63. package/dist/chunk-OZZWDIOY.js +1859 -0
  64. package/dist/chunk-PZRI43EZ.js +111 -0
  65. package/dist/chunk-Q256HRYD.js +176 -0
  66. package/dist/chunk-Q52ZEL62.mjs +223 -0
  67. package/dist/chunk-R26Y7LGJ.js +142 -0
  68. package/dist/chunk-RBUYW6QQ.js +39 -0
  69. package/dist/chunk-RVEFPVZF.mjs +43 -0
  70. package/dist/chunk-SORWLKOK.js +96 -0
  71. package/dist/chunk-STEP6C4C.mjs +33 -0
  72. package/dist/chunk-T5R6HUDG.mjs +22 -0
  73. package/dist/chunk-T6ZBA6VJ.js +7109 -0
  74. package/dist/chunk-UM7WMXIU.js +2995 -0
  75. package/dist/chunk-VBD4Q5LL.mjs +117 -0
  76. package/dist/chunk-WOITB4JL.js +195 -0
  77. package/dist/chunk-YKZEKJMZ.mjs +71 -0
  78. package/dist/chunk-YL7RZRHM.mjs +103 -0
  79. package/dist/chunk-YSLD2HLP.mjs +346 -0
  80. package/dist/chunk-ZFLZA7UP.mjs +140 -0
  81. package/dist/chunk-ZKUIUE7W.mjs +26 -0
  82. package/dist/chunk-ZOA7B32D.js +248 -0
  83. package/dist/data-table.d.cts +46 -0
  84. package/dist/data-table.d.ts +46 -0
  85. package/dist/data-table.js +270 -0
  86. package/dist/data-table.mjs +13 -0
  87. package/dist/editor.d.cts +89 -0
  88. package/dist/editor.d.ts +89 -0
  89. package/dist/editor.js +10 -0
  90. package/dist/editor.mjs +1 -0
  91. package/dist/forms.d.cts +142 -0
  92. package/dist/forms.d.ts +142 -0
  93. package/dist/forms.js +24 -0
  94. package/dist/forms.mjs +11 -0
  95. package/dist/hooks-8ORd7T1A.d.cts +751 -0
  96. package/dist/hooks-B2jU1GVT.d.ts +751 -0
  97. package/dist/hooks.d.cts +6 -0
  98. package/dist/hooks.d.ts +6 -0
  99. package/dist/hooks.js +99 -0
  100. package/dist/hooks.mjs +10 -0
  101. package/dist/index.d.cts +3141 -0
  102. package/dist/index.d.ts +3141 -0
  103. package/dist/index.js +7332 -0
  104. package/dist/index.mjs +5876 -0
  105. package/dist/layouts-DPfDDF53.d.cts +1001 -0
  106. package/dist/layouts-DPfDDF53.d.ts +1001 -0
  107. package/dist/layouts.d.cts +4 -0
  108. package/dist/layouts.d.ts +4 -0
  109. package/dist/layouts.js +100 -0
  110. package/dist/layouts.mjs +11 -0
  111. package/dist/marketing-3d.d.cts +51 -0
  112. package/dist/marketing-3d.d.ts +51 -0
  113. package/dist/marketing-3d.js +553 -0
  114. package/dist/marketing-3d.mjs +526 -0
  115. package/dist/marketing.d.cts +583 -0
  116. package/dist/marketing.d.ts +583 -0
  117. package/dist/marketing.js +299 -0
  118. package/dist/marketing.mjs +10 -0
  119. package/dist/media.d.cts +29 -0
  120. package/dist/media.d.ts +29 -0
  121. package/dist/media.js +189 -0
  122. package/dist/media.mjs +182 -0
  123. package/dist/navigation.d.cts +591 -0
  124. package/dist/navigation.d.ts +591 -0
  125. package/dist/navigation.js +108 -0
  126. package/dist/navigation.mjs +15 -0
  127. package/dist/portal.d.cts +58 -0
  128. package/dist/portal.d.ts +58 -0
  129. package/dist/portal.js +403 -0
  130. package/dist/portal.mjs +395 -0
  131. package/dist/primitives.d.cts +508 -0
  132. package/dist/primitives.d.ts +508 -0
  133. package/dist/primitives.js +295 -0
  134. package/dist/primitives.mjs +14 -0
  135. package/dist/settings.d.cts +216 -0
  136. package/dist/settings.d.ts +216 -0
  137. package/dist/settings.js +34 -0
  138. package/dist/settings.mjs +9 -0
  139. package/dist/shared-Dqn36QHZ.d.cts +4 -0
  140. package/dist/shared-Dqn36QHZ.d.ts +4 -0
  141. package/dist/styles.css +1213 -0
  142. package/package.json +189 -0
  143. package/styles.css +1 -0
@@ -0,0 +1,940 @@
1
+ import { Separator } from './chunk-ZKUIUE7W.mjs';
2
+ import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from './chunk-FRRS2YZH.mjs';
3
+ import { Spinner } from './chunk-HBLKVQIQ.mjs';
4
+ import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuSeparator, DropdownMenuItem } from './chunk-OFQLWSUR.mjs';
5
+ import { Input } from './chunk-STEP6C4C.mjs';
6
+ import { getAvatarGradient } from './chunk-MHZXUOGN.mjs';
7
+ import { cn } from './chunk-IMKLN273.mjs';
8
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
+ import { Slot } from '@radix-ui/react-slot';
10
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
11
+ import { cva } from 'class-variance-authority';
12
+ import { PanelLeft, ChevronUp } from 'lucide-react';
13
+ import * as React from 'react';
14
+ import { Fragment as Fragment$1 } from 'react';
15
+ import * as AvatarPrimitive from '@radix-ui/react-avatar';
16
+
17
+ function Kbd({ className, ...props }) {
18
+ return /* @__PURE__ */ jsx(
19
+ "kbd",
20
+ {
21
+ "data-slot": "kbd",
22
+ className: cn(
23
+ "bg-muted text-muted-foreground pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm px-1 font-sans text-xs font-medium select-none align-middle",
24
+ "[&_svg:not([class*='size-'])]:size-3",
25
+ // Inside tooltips: subtle background with visible text
26
+ "in-data-[slot=tooltip-content]:bg-foreground/10 in-data-[slot=tooltip-content]:text-popover-foreground/70",
27
+ className
28
+ ),
29
+ ...props
30
+ }
31
+ );
32
+ }
33
+ function KbdGroup({ className, ...props }) {
34
+ return /* @__PURE__ */ jsx(
35
+ "kbd",
36
+ {
37
+ "data-slot": "kbd-group",
38
+ className: cn("inline-flex items-center gap-1", className),
39
+ ...props
40
+ }
41
+ );
42
+ }
43
+ function KeyboardShortcut({
44
+ visible = true,
45
+ forceShow = false,
46
+ ...props
47
+ }) {
48
+ if (!forceShow && !visible) {
49
+ return null;
50
+ }
51
+ return /* @__PURE__ */ jsx(Kbd, { ...props });
52
+ }
53
+ var SIDEBAR_COOKIE_NAME = "sidebar_state";
54
+ var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
55
+ var SIDEBAR_WIDTH = "16rem";
56
+ var SIDEBAR_WIDTH_MOBILE = "18rem";
57
+ var SIDEBAR_WIDTH_ICON = "3rem";
58
+ var SIDEBAR_KEYBOARD_SHORTCUT = "b";
59
+ function resolveSidebarMode(width, desktopPref) {
60
+ if (width < 768) return "hidden";
61
+ if (desktopPref) return desktopPref;
62
+ return width < 1024 ? "collapsed" : "expanded";
63
+ }
64
+ function toDesktopPreference(open) {
65
+ if (open === void 0) return void 0;
66
+ return open ? "expanded" : "collapsed";
67
+ }
68
+ function getEffectiveMode(state) {
69
+ const resolved = resolveSidebarMode(state.viewportWidth, state.desktopPref);
70
+ if (resolved === "hidden") {
71
+ return state.openMobile ? "expanded" : "hidden";
72
+ }
73
+ return resolved;
74
+ }
75
+ function sidebarReducer(state, event) {
76
+ switch (event.type) {
77
+ case "VIEWPORT_CHANGED": {
78
+ return {
79
+ ...state,
80
+ viewportWidth: event.width,
81
+ hydrated: true,
82
+ openMobile: event.width < 768 ? state.openMobile : false
83
+ };
84
+ }
85
+ case "TOGGLE_DESKTOP": {
86
+ if (state.viewportWidth < 768) return state;
87
+ const currentMode = resolveSidebarMode(
88
+ state.viewportWidth,
89
+ state.desktopPref
90
+ );
91
+ return {
92
+ ...state,
93
+ desktopPref: currentMode === "expanded" ? "collapsed" : "expanded"
94
+ };
95
+ }
96
+ case "OPEN_MOBILE": {
97
+ if (state.viewportWidth >= 768) return state;
98
+ return { ...state, openMobile: true };
99
+ }
100
+ case "CLOSE_MOBILE": {
101
+ if (state.viewportWidth >= 768) return state;
102
+ return { ...state, openMobile: false };
103
+ }
104
+ case "SET_DESKTOP_PREF": {
105
+ return { ...state, desktopPref: event.pref };
106
+ }
107
+ default:
108
+ return state;
109
+ }
110
+ }
111
+ var SidebarContext = React.createContext(null);
112
+ function useSidebar() {
113
+ const context = React.useContext(SidebarContext);
114
+ if (!context) {
115
+ throw new Error("useSidebar must be used within a SidebarProvider.");
116
+ }
117
+ return context;
118
+ }
119
+ var SidebarProvider = React.forwardRef(
120
+ ({
121
+ defaultOpen,
122
+ open: openProp,
123
+ onOpenChange: setOpenProp,
124
+ className,
125
+ style,
126
+ children,
127
+ ...props
128
+ }, ref) => {
129
+ const [machine, dispatch] = React.useReducer(sidebarReducer, {
130
+ viewportWidth: typeof window === "undefined" ? 1024 : window.innerWidth,
131
+ desktopPref: toDesktopPreference(defaultOpen),
132
+ openMobile: false,
133
+ hydrated: typeof window === "undefined"
134
+ });
135
+ React.useLayoutEffect(() => {
136
+ const syncViewport = () => {
137
+ dispatch({ type: "VIEWPORT_CHANGED", width: window.innerWidth });
138
+ };
139
+ syncViewport();
140
+ window.addEventListener("resize", syncViewport);
141
+ return () => window.removeEventListener("resize", syncViewport);
142
+ }, []);
143
+ const controlledDesktopPref = toDesktopPreference(openProp);
144
+ React.useEffect(() => {
145
+ if (controlledDesktopPref) {
146
+ dispatch({ type: "SET_DESKTOP_PREF", pref: controlledDesktopPref });
147
+ }
148
+ }, [controlledDesktopPref]);
149
+ const desktopPref = controlledDesktopPref ?? machine.desktopPref;
150
+ const effectiveMode = React.useMemo(
151
+ () => getEffectiveMode({
152
+ ...machine,
153
+ desktopPref
154
+ }),
155
+ [desktopPref, machine]
156
+ );
157
+ const isMobile = machine.viewportWidth < 768;
158
+ const openMobile = isMobile && machine.openMobile;
159
+ const open = resolveSidebarMode(machine.viewportWidth, desktopPref) === "expanded";
160
+ const setDesktopPreference = React.useCallback(
161
+ (pref) => {
162
+ if (setOpenProp) {
163
+ setOpenProp(pref === "expanded");
164
+ }
165
+ if (openProp === void 0) {
166
+ dispatch({ type: "SET_DESKTOP_PREF", pref });
167
+ }
168
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${pref === "expanded"}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
169
+ },
170
+ [openProp, setOpenProp]
171
+ );
172
+ const setOpen = React.useCallback(
173
+ (nextOpen) => {
174
+ setDesktopPreference(nextOpen ? "expanded" : "collapsed");
175
+ },
176
+ [setDesktopPreference]
177
+ );
178
+ const setOpenMobile = React.useCallback((nextOpen) => {
179
+ dispatch({ type: nextOpen ? "OPEN_MOBILE" : "CLOSE_MOBILE" });
180
+ }, []);
181
+ const toggleSidebar = React.useCallback(() => {
182
+ if (isMobile) {
183
+ dispatch({ type: openMobile ? "CLOSE_MOBILE" : "OPEN_MOBILE" });
184
+ return;
185
+ }
186
+ const nextPref = open ? "collapsed" : "expanded";
187
+ if (setOpenProp) {
188
+ setOpenProp(nextPref === "expanded");
189
+ }
190
+ if (openProp === void 0) {
191
+ dispatch({ type: "TOGGLE_DESKTOP" });
192
+ }
193
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${nextPref === "expanded"}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
194
+ }, [isMobile, open, openMobile, openProp, setOpenProp]);
195
+ React.useEffect(() => {
196
+ const handleKeyDown = (event) => {
197
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
198
+ event.preventDefault();
199
+ toggleSidebar();
200
+ }
201
+ };
202
+ window.addEventListener("keydown", handleKeyDown);
203
+ return () => window.removeEventListener("keydown", handleKeyDown);
204
+ }, [toggleSidebar]);
205
+ const mode = effectiveMode;
206
+ const state = mode === "expanded" ? "expanded" : "collapsed";
207
+ const ready = machine.hydrated;
208
+ const contextValue = React.useMemo(
209
+ () => ({
210
+ state,
211
+ mode,
212
+ open,
213
+ setOpen,
214
+ isMobile,
215
+ openMobile,
216
+ setOpenMobile,
217
+ ready,
218
+ toggleSidebar
219
+ }),
220
+ [
221
+ state,
222
+ mode,
223
+ open,
224
+ setOpen,
225
+ isMobile,
226
+ openMobile,
227
+ setOpenMobile,
228
+ ready,
229
+ toggleSidebar
230
+ ]
231
+ );
232
+ return /* @__PURE__ */ jsx(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(TooltipPrimitive.Provider, { delayDuration: 0, children: /* @__PURE__ */ jsx(
233
+ "div",
234
+ {
235
+ style: {
236
+ "--sidebar-width": SIDEBAR_WIDTH,
237
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
238
+ ...style
239
+ },
240
+ className: cn(
241
+ "group/sidebar-wrapper flex h-full min-h-0 w-full has-data-[variant=inset]:bg-sidebar",
242
+ className
243
+ ),
244
+ ref,
245
+ ...props,
246
+ children
247
+ }
248
+ ) }) });
249
+ }
250
+ );
251
+ SidebarProvider.displayName = "SidebarProvider";
252
+ var Sidebar = React.forwardRef(
253
+ ({
254
+ side = "left",
255
+ variant = "sidebar",
256
+ collapsible = "offcanvas",
257
+ className,
258
+ children,
259
+ ...props
260
+ }, ref) => {
261
+ const { isMobile, state, openMobile, setOpenMobile, ready } = useSidebar();
262
+ if (collapsible === "none") {
263
+ return /* @__PURE__ */ jsx(
264
+ "div",
265
+ {
266
+ className: cn(
267
+ "flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground",
268
+ className
269
+ ),
270
+ ref,
271
+ ...props,
272
+ children
273
+ }
274
+ );
275
+ }
276
+ if (isMobile) {
277
+ return /* @__PURE__ */ jsx(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: /* @__PURE__ */ jsxs(
278
+ SheetContent,
279
+ {
280
+ "data-sidebar": "sidebar",
281
+ "data-mobile": "true",
282
+ className: "w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",
283
+ style: {
284
+ "--sidebar-width": SIDEBAR_WIDTH_MOBILE
285
+ },
286
+ side,
287
+ children: [
288
+ /* @__PURE__ */ jsxs(SheetHeader, { className: "sr-only", children: [
289
+ /* @__PURE__ */ jsx(SheetTitle, { children: "Sidebar" }),
290
+ /* @__PURE__ */ jsx(SheetDescription, { children: "Displays the mobile sidebar." })
291
+ ] }),
292
+ /* @__PURE__ */ jsx("div", { className: "flex h-full w-full flex-col", children })
293
+ ]
294
+ }
295
+ ) });
296
+ }
297
+ return /* @__PURE__ */ jsxs(
298
+ "div",
299
+ {
300
+ ref,
301
+ className: cn(
302
+ "group peer hidden md:block text-sidebar-foreground",
303
+ !ready && "md:invisible [&_*]:!transition-none [&_*]:!duration-0"
304
+ ),
305
+ "data-state": state,
306
+ "data-collapsible": state === "collapsed" ? collapsible : "",
307
+ "data-variant": variant,
308
+ "data-side": side,
309
+ children: [
310
+ /* @__PURE__ */ jsx(
311
+ "div",
312
+ {
313
+ className: cn(
314
+ "duration-200 relative h-svh bg-transparent transition-[width] ease-linear shrink-0",
315
+ "group-data-[collapsible=offcanvas]:w-0",
316
+ "group-data-[side=right]:rotate-180",
317
+ variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+1rem)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"
318
+ ),
319
+ style: {
320
+ width: state === "collapsed" ? void 0 : "var(--sidebar-width)"
321
+ }
322
+ }
323
+ ),
324
+ /* @__PURE__ */ jsx(
325
+ "div",
326
+ {
327
+ className: cn(
328
+ "duration-200 fixed inset-y-0 z-10 hidden h-svh transition-[left,right,width] ease-linear md:flex",
329
+ 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)]",
330
+ // Adjust the padding for floating and inset variants.
331
+ variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+1rem+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",
332
+ className
333
+ ),
334
+ style: {
335
+ width: state === "collapsed" ? void 0 : "var(--sidebar-width)"
336
+ },
337
+ ...props,
338
+ children: /* @__PURE__ */ jsx(
339
+ "div",
340
+ {
341
+ "data-sidebar": "sidebar",
342
+ className: cn(
343
+ "flex h-full w-full flex-col bg-sidebar overflow-x-hidden group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow"
344
+ ),
345
+ children
346
+ }
347
+ )
348
+ }
349
+ )
350
+ ]
351
+ }
352
+ );
353
+ }
354
+ );
355
+ Sidebar.displayName = "Sidebar";
356
+ var SidebarTrigger = React.forwardRef(({ className, onClick, ...props }, ref) => {
357
+ const { toggleSidebar } = useSidebar();
358
+ return /* @__PURE__ */ jsxs(
359
+ "button",
360
+ {
361
+ ref,
362
+ type: "button",
363
+ "data-sidebar": "trigger",
364
+ className: cn(
365
+ "inline-flex h-8 w-8 items-center justify-center rounded-md text-icon transition-colors hover:text-icon-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
366
+ className
367
+ ),
368
+ onClick: (event) => {
369
+ onClick?.(event);
370
+ toggleSidebar();
371
+ },
372
+ ...props,
373
+ children: [
374
+ /* @__PURE__ */ jsx(PanelLeft, { className: "h-4 w-4 transition-transform duration-300 hover:rotate-12" }),
375
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle Sidebar" })
376
+ ]
377
+ }
378
+ );
379
+ });
380
+ SidebarTrigger.displayName = "SidebarTrigger";
381
+ var SidebarRail = React.forwardRef(({ className, ...props }, ref) => {
382
+ const { toggleSidebar } = useSidebar();
383
+ return /* @__PURE__ */ jsx(
384
+ "button",
385
+ {
386
+ ref,
387
+ "data-sidebar": "rail",
388
+ "aria-label": "Toggle Sidebar",
389
+ tabIndex: -1,
390
+ onClick: toggleSidebar,
391
+ title: "Toggle Sidebar",
392
+ className: cn(
393
+ "absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-0.5 group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex",
394
+ "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize",
395
+ "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
396
+ "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar",
397
+ "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
398
+ "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
399
+ className
400
+ ),
401
+ ...props
402
+ }
403
+ );
404
+ });
405
+ SidebarRail.displayName = "SidebarRail";
406
+ var SidebarInset = React.forwardRef(({ className, ...props }, ref) => {
407
+ return /* @__PURE__ */ jsx(
408
+ "main",
409
+ {
410
+ ref,
411
+ className: cn(
412
+ // h-full + min-h-0: inherit height, allow shrinking
413
+ // flex-col: stack header and content vertically
414
+ "relative flex h-full min-h-0 flex-1 flex-col min-w-0 bg-background",
415
+ "peer-data-[variant=inset]:h-[calc(100%-1rem)] peer-data-[variant=inset]:min-h-0 md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
416
+ className
417
+ ),
418
+ ...props
419
+ }
420
+ );
421
+ });
422
+ SidebarInset.displayName = "SidebarInset";
423
+ var SidebarInput = React.forwardRef(({ className, ...props }, ref) => {
424
+ return /* @__PURE__ */ jsx(
425
+ Input,
426
+ {
427
+ ref,
428
+ "data-sidebar": "input",
429
+ className: cn(
430
+ "h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
431
+ className
432
+ ),
433
+ ...props
434
+ }
435
+ );
436
+ });
437
+ SidebarInput.displayName = "SidebarInput";
438
+ var SidebarHeader = React.forwardRef(({ className, ...props }, ref) => {
439
+ return /* @__PURE__ */ jsx(
440
+ "div",
441
+ {
442
+ ref,
443
+ "data-sidebar": "header",
444
+ className: cn("flex flex-col gap-2 p-2", className),
445
+ ...props
446
+ }
447
+ );
448
+ });
449
+ SidebarHeader.displayName = "SidebarHeader";
450
+ var SidebarFooter = React.forwardRef(({ className, ...props }, ref) => {
451
+ return /* @__PURE__ */ jsx(
452
+ "div",
453
+ {
454
+ ref,
455
+ "data-sidebar": "footer",
456
+ className: cn("flex flex-col gap-2 p-2", className),
457
+ ...props
458
+ }
459
+ );
460
+ });
461
+ SidebarFooter.displayName = "SidebarFooter";
462
+ var SidebarSeparator = React.forwardRef(({ className, ...props }, ref) => {
463
+ return /* @__PURE__ */ jsx(
464
+ Separator,
465
+ {
466
+ ref,
467
+ "data-sidebar": "separator",
468
+ className: cn("mx-2 w-auto bg-sidebar-border", className),
469
+ ...props
470
+ }
471
+ );
472
+ });
473
+ SidebarSeparator.displayName = "SidebarSeparator";
474
+ var SidebarContent = React.forwardRef(({ className, ...props }, ref) => {
475
+ return /* @__PURE__ */ jsx(
476
+ "div",
477
+ {
478
+ ref,
479
+ "data-sidebar": "content",
480
+ className: cn(
481
+ "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
482
+ className
483
+ ),
484
+ ...props
485
+ }
486
+ );
487
+ });
488
+ SidebarContent.displayName = "SidebarContent";
489
+ var SidebarGroup = React.forwardRef(({ className, ...props }, ref) => {
490
+ return /* @__PURE__ */ jsx(
491
+ "div",
492
+ {
493
+ ref,
494
+ "data-sidebar": "group",
495
+ className: cn("relative flex w-full min-w-0 flex-col p-2", className),
496
+ ...props
497
+ }
498
+ );
499
+ });
500
+ SidebarGroup.displayName = "SidebarGroup";
501
+ var SidebarGroupLabel = React.forwardRef(({ className, asChild = false, ...props }, ref) => {
502
+ const Comp = asChild ? Slot : "div";
503
+ return /* @__PURE__ */ jsx(
504
+ Comp,
505
+ {
506
+ ref,
507
+ "data-sidebar": "group-label",
508
+ className: cn(
509
+ "duration-200 flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opa] ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
510
+ "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
511
+ className
512
+ ),
513
+ ...props
514
+ }
515
+ );
516
+ });
517
+ SidebarGroupLabel.displayName = "SidebarGroupLabel";
518
+ var SidebarGroupAction = React.forwardRef(({ className, asChild = false, ...props }, ref) => {
519
+ const Comp = asChild ? Slot : "button";
520
+ return /* @__PURE__ */ jsx(
521
+ Comp,
522
+ {
523
+ ref,
524
+ "data-sidebar": "group-action",
525
+ className: cn(
526
+ "absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
527
+ // Increases the hit area of the button on mobile.
528
+ "after:absolute after:-inset-2 after:md:hidden",
529
+ "group-data-[collapsible=icon]:hidden",
530
+ className
531
+ ),
532
+ ...props
533
+ }
534
+ );
535
+ });
536
+ SidebarGroupAction.displayName = "SidebarGroupAction";
537
+ var SidebarGroupContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
538
+ "div",
539
+ {
540
+ ref,
541
+ "data-sidebar": "group-content",
542
+ className: cn("w-full text-sm", className),
543
+ ...props
544
+ }
545
+ ));
546
+ SidebarGroupContent.displayName = "SidebarGroupContent";
547
+ var SidebarMenu = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
548
+ "ul",
549
+ {
550
+ ref,
551
+ "data-sidebar": "menu",
552
+ className: cn("flex w-full min-w-0 flex-col gap-1", className),
553
+ ...props
554
+ }
555
+ ));
556
+ SidebarMenu.displayName = "SidebarMenu";
557
+ var SidebarMenuItem = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
558
+ "li",
559
+ {
560
+ ref,
561
+ "data-sidebar": "menu-item",
562
+ className: cn("group/menu-item relative", className),
563
+ ...props
564
+ }
565
+ ));
566
+ SidebarMenuItem.displayName = "SidebarMenuItem";
567
+ var sidebarMenuButtonVariants = cva(
568
+ "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] 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 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 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 group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
569
+ {
570
+ variants: {
571
+ variant: {
572
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
573
+ 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))]"
574
+ },
575
+ size: {
576
+ default: "h-8 text-sm",
577
+ sm: "h-7 text-xs",
578
+ lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0 group-data-[collapsible=icon]:!gap-0 group-data-[collapsible=icon]:!size-8 [.group[data-collapsible=icon]_&]:hover:!bg-transparent [.group[data-collapsible=icon]_&]:active:!bg-transparent"
579
+ }
580
+ },
581
+ defaultVariants: {
582
+ variant: "default",
583
+ size: "default"
584
+ }
585
+ }
586
+ );
587
+ var SidebarMenuButton = React.forwardRef(
588
+ ({
589
+ asChild = false,
590
+ isActive = false,
591
+ variant = "default",
592
+ size = "default",
593
+ tooltip,
594
+ className,
595
+ ...props
596
+ }, ref) => {
597
+ const Comp = asChild ? Slot : "button";
598
+ const { isMobile, state } = useSidebar();
599
+ const button = /* @__PURE__ */ jsx(
600
+ Comp,
601
+ {
602
+ ref,
603
+ "data-sidebar": "menu-button",
604
+ "data-size": size,
605
+ "data-active": isActive,
606
+ className: cn(sidebarMenuButtonVariants({ variant, size }), className),
607
+ ...props
608
+ }
609
+ );
610
+ if (!tooltip) {
611
+ return button;
612
+ }
613
+ if (typeof tooltip === "string") {
614
+ tooltip = {
615
+ children: tooltip
616
+ };
617
+ }
618
+ return /* @__PURE__ */ jsxs(TooltipPrimitive.Root, { children: [
619
+ /* @__PURE__ */ jsx(TooltipPrimitive.Trigger, { asChild: true, children: button }),
620
+ /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
621
+ TooltipContent,
622
+ {
623
+ side: "right",
624
+ align: "center",
625
+ hidden: state !== "collapsed" || isMobile,
626
+ ...tooltip
627
+ }
628
+ ) })
629
+ ] });
630
+ }
631
+ );
632
+ SidebarMenuButton.displayName = "SidebarMenuButton";
633
+ var TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(
634
+ TooltipPrimitive.Content,
635
+ {
636
+ ref,
637
+ sideOffset,
638
+ className: cn(
639
+ "z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-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",
640
+ className
641
+ ),
642
+ ...props
643
+ }
644
+ ));
645
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
646
+ var SidebarMenuAction = React.forwardRef(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
647
+ const Comp = asChild ? Slot : "button";
648
+ return /* @__PURE__ */ jsx(
649
+ Comp,
650
+ {
651
+ ref,
652
+ "data-sidebar": "menu-action",
653
+ className: cn(
654
+ "absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0",
655
+ // Increases the hit area of the button on mobile.
656
+ "after:absolute after:-inset-2 after:md:hidden",
657
+ "peer-data-[size=sm]/menu-button:top-1",
658
+ "peer-data-[size=default]/menu-button:top-1.5",
659
+ "peer-data-[size=lg]/menu-button:top-2.5",
660
+ "group-data-[collapsible=icon]:hidden",
661
+ showOnHover && "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0",
662
+ className
663
+ ),
664
+ ...props
665
+ }
666
+ );
667
+ });
668
+ SidebarMenuAction.displayName = "SidebarMenuAction";
669
+ var SidebarMenuBadge = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
670
+ "div",
671
+ {
672
+ ref,
673
+ "data-sidebar": "menu-badge",
674
+ className: cn(
675
+ "absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground select-none pointer-events-none",
676
+ "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
677
+ "peer-data-[size=sm]/menu-button:top-1",
678
+ "peer-data-[size=default]/menu-button:top-1.5",
679
+ "peer-data-[size=lg]/menu-button:top-2.5",
680
+ "group-data-[collapsible=icon]:hidden",
681
+ className
682
+ ),
683
+ ...props
684
+ }
685
+ ));
686
+ SidebarMenuBadge.displayName = "SidebarMenuBadge";
687
+ var SidebarMenuSkeleton = React.forwardRef(({ className, showIcon = false, ...props }, ref) => {
688
+ const width = React.useMemo(() => {
689
+ return `${Math.floor(Math.random() * 40) + 50}%`;
690
+ }, []);
691
+ return /* @__PURE__ */ jsxs(
692
+ "div",
693
+ {
694
+ ref,
695
+ "data-sidebar": "menu-skeleton",
696
+ className: cn("rounded-md h-8 flex gap-2 px-2 items-center", className),
697
+ ...props,
698
+ children: [
699
+ showIcon && /* @__PURE__ */ jsx(
700
+ "div",
701
+ {
702
+ className: "size-4 rounded-md bg-sidebar-accent-foreground/10",
703
+ "data-skeleton": "icon"
704
+ }
705
+ ),
706
+ /* @__PURE__ */ jsx(
707
+ "div",
708
+ {
709
+ className: "h-4 flex-1 max-w-[--skeleton-width] rounded-md bg-sidebar-accent-foreground/10",
710
+ "data-skeleton": "text",
711
+ style: {
712
+ "--skeleton-width": width
713
+ }
714
+ }
715
+ )
716
+ ]
717
+ }
718
+ );
719
+ });
720
+ SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
721
+ var SidebarMenuSub = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
722
+ "ul",
723
+ {
724
+ ref,
725
+ "data-sidebar": "menu-sub",
726
+ className: cn(
727
+ "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",
728
+ "group-data-[collapsible=icon]:hidden",
729
+ className
730
+ ),
731
+ ...props
732
+ }
733
+ ));
734
+ SidebarMenuSub.displayName = "SidebarMenuSub";
735
+ var SidebarMenuSubItem = React.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx("li", { ref, ...props }));
736
+ SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
737
+ var SidebarMenuSubButton = React.forwardRef(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
738
+ const Comp = asChild ? Slot : "a";
739
+ return /* @__PURE__ */ jsx(
740
+ Comp,
741
+ {
742
+ ref,
743
+ "data-sidebar": "menu-sub-button",
744
+ "data-size": size,
745
+ "data-active": isActive,
746
+ className: cn(
747
+ "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring 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",
748
+ "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
749
+ size === "sm" && "text-xs",
750
+ size === "md" && "text-sm",
751
+ "group-data-[collapsible=icon]:hidden",
752
+ className
753
+ ),
754
+ ...props
755
+ }
756
+ );
757
+ });
758
+ SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
759
+ function Avatar({
760
+ className,
761
+ ...props
762
+ }) {
763
+ return /* @__PURE__ */ jsx(
764
+ AvatarPrimitive.Root,
765
+ {
766
+ "data-slot": "avatar",
767
+ className: cn(
768
+ "relative flex size-10 shrink-0 overflow-hidden rounded-full",
769
+ className
770
+ ),
771
+ ...props
772
+ }
773
+ );
774
+ }
775
+ function AvatarImage({
776
+ className,
777
+ ...props
778
+ }) {
779
+ return /* @__PURE__ */ jsx(
780
+ AvatarPrimitive.Image,
781
+ {
782
+ "data-slot": "avatar-image",
783
+ className: cn("aspect-square size-full object-cover", className),
784
+ ...props
785
+ }
786
+ );
787
+ }
788
+ function AvatarFallback({
789
+ className,
790
+ ...props
791
+ }) {
792
+ return /* @__PURE__ */ jsx(
793
+ AvatarPrimitive.Fallback,
794
+ {
795
+ "data-slot": "avatar-fallback",
796
+ className: cn(
797
+ "bg-muted flex size-full items-center justify-center rounded-full",
798
+ className
799
+ ),
800
+ ...props
801
+ }
802
+ );
803
+ }
804
+ var sizeClasses = {
805
+ sm: "h-6 w-6",
806
+ md: "h-8 w-8",
807
+ lg: "h-10 w-10"
808
+ };
809
+ var avatarTextSizes = {
810
+ sm: "text-xs",
811
+ md: "text-xs",
812
+ lg: "text-sm"
813
+ };
814
+ function UserAvatarMenu({
815
+ user,
816
+ loading = false,
817
+ items,
818
+ size = "md",
819
+ side = "bottom",
820
+ align = "end",
821
+ open,
822
+ onOpenChange,
823
+ showChevron = false,
824
+ isActive = false,
825
+ trigger,
826
+ header,
827
+ showUserInfo = false,
828
+ menuShortcut,
829
+ menuWidth,
830
+ className = "",
831
+ avatarClassName = "",
832
+ LinkComponent,
833
+ ShortcutComponent
834
+ }) {
835
+ const Shortcut = ShortcutComponent || KeyboardShortcut;
836
+ const sizeClass = sizeClasses[size];
837
+ const textSize = avatarTextSizes[size];
838
+ if (loading) {
839
+ return /* @__PURE__ */ jsx(
840
+ "div",
841
+ {
842
+ className: `inline-flex items-center justify-center rounded-md ${sizeClass} ${className}`,
843
+ children: /* @__PURE__ */ jsx(Spinner, { size: "sm" })
844
+ }
845
+ );
846
+ }
847
+ const { id, email, avatarUrl, name, initials } = user;
848
+ const displayInitials = initials || name?.[0]?.toUpperCase() || "U";
849
+ const gradient = getAvatarGradient(id);
850
+ const avatarContent = /* @__PURE__ */ jsxs(Avatar, { className: `${sizeClass} rounded-full ${avatarClassName}`, children: [
851
+ avatarUrl && /* @__PURE__ */ jsx(AvatarImage, { src: avatarUrl, alt: name || email || "User" }),
852
+ /* @__PURE__ */ jsx(
853
+ AvatarFallback,
854
+ {
855
+ className: `rounded-full font-medium text-white ${textSize}`,
856
+ style: gradient.style,
857
+ children: displayInitials
858
+ }
859
+ )
860
+ ] });
861
+ const defaultTrigger = /* @__PURE__ */ jsxs(
862
+ "button",
863
+ {
864
+ type: "button",
865
+ className: `inline-flex items-center justify-center rounded-full focus:outline-none focus-visible:ring-2 focus-visible:ring-ring transition-all hover:scale-105 ${isActive ? "ring-2 ring-primary" : ""} ${className}`,
866
+ children: [
867
+ avatarContent,
868
+ showChevron && /* @__PURE__ */ jsx(ChevronUp, { className: "ml-1 size-4" }),
869
+ menuShortcut && /* @__PURE__ */ jsx(Shortcut, { className: "ml-auto hidden text-xs text-muted-foreground md:inline-flex", children: menuShortcut }),
870
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "User menu" })
871
+ ]
872
+ }
873
+ );
874
+ const renderMenuItem = (item) => {
875
+ const Icon = item.icon;
876
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
877
+ Icon && /* @__PURE__ */ jsx(Icon, { className: "mr-2 h-4 w-4" }),
878
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: item.label }),
879
+ item.showShortcut !== false && item.shortcut && /* @__PURE__ */ jsx(Shortcut, { className: "text-xs text-muted-foreground", children: item.shortcut })
880
+ ] });
881
+ const menuItemProps = {
882
+ variant: item.destructive ? "destructive" : void 0,
883
+ className: "cursor-pointer"
884
+ };
885
+ if (item.href) {
886
+ if (item.external) {
887
+ return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...menuItemProps, children: /* @__PURE__ */ jsx(
888
+ "a",
889
+ {
890
+ href: item.href,
891
+ target: "_blank",
892
+ rel: "noopener noreferrer",
893
+ className: `cursor-pointer${item.destructive ? "" : " text-muted-foreground"}`,
894
+ children: content
895
+ }
896
+ ) });
897
+ }
898
+ if (LinkComponent) {
899
+ return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...menuItemProps, children: /* @__PURE__ */ jsx(LinkComponent, { href: item.href, className: "cursor-pointer", children: content }) });
900
+ }
901
+ return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...menuItemProps, children: /* @__PURE__ */ jsx(
902
+ "a",
903
+ {
904
+ href: item.href,
905
+ className: `cursor-pointer${item.destructive ? "" : ""}`,
906
+ children: content
907
+ }
908
+ ) });
909
+ }
910
+ return /* @__PURE__ */ jsx(DropdownMenuItem, { onClick: item.onClick, ...menuItemProps, children: content });
911
+ };
912
+ return /* @__PURE__ */ jsxs(DropdownMenu, { open, onOpenChange, children: [
913
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: trigger || defaultTrigger }),
914
+ /* @__PURE__ */ jsxs(
915
+ DropdownMenuContent,
916
+ {
917
+ className: `rounded-lg ${menuWidth || "w-56"}`,
918
+ side,
919
+ align,
920
+ sideOffset: 4,
921
+ children: [
922
+ showUserInfo && /* @__PURE__ */ jsxs(Fragment, { children: [
923
+ /* @__PURE__ */ jsxs("div", { className: "px-2 py-1.5 text-sm", children: [
924
+ /* @__PURE__ */ jsx("div", { className: "font-semibold", children: name || "User" }),
925
+ email && /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: email })
926
+ ] }),
927
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {})
928
+ ] }),
929
+ header,
930
+ items.map((item, index) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
931
+ item.separatorBefore && /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
932
+ renderMenuItem(item)
933
+ ] }, item.label || index))
934
+ ]
935
+ }
936
+ )
937
+ ] });
938
+ }
939
+
940
+ export { Avatar, AvatarFallback, AvatarImage, Kbd, KbdGroup, KeyboardShortcut, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, UserAvatarMenu, useSidebar };