@logickernel/frame 0.1.0 → 0.2.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 (50) hide show
  1. package/README.md +1 -1
  2. package/dist/index.d.mts +143 -11
  3. package/dist/index.d.ts +143 -11
  4. package/dist/index.js +851 -73
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +793 -21
  7. package/dist/index.mjs.map +1 -1
  8. package/package.json +10 -22
  9. package/dist/adapters/nextjs.js +0 -31
  10. package/dist/adapters/nextjs.js.map +0 -1
  11. package/dist/adapters/nextjs.mjs +0 -25
  12. package/dist/adapters/nextjs.mjs.map +0 -1
  13. package/dist/components/AppSidebar.js +0 -467
  14. package/dist/components/AppSidebar.js.map +0 -1
  15. package/dist/components/AppSidebar.mjs +0 -446
  16. package/dist/components/AppSidebar.mjs.map +0 -1
  17. package/dist/components/NavMain.js +0 -133
  18. package/dist/components/NavMain.js.map +0 -1
  19. package/dist/components/NavMain.mjs +0 -112
  20. package/dist/components/NavMain.mjs.map +0 -1
  21. package/dist/components/NavUser.js +0 -88
  22. package/dist/components/NavUser.js.map +0 -1
  23. package/dist/components/NavUser.mjs +0 -86
  24. package/dist/components/NavUser.mjs.map +0 -1
  25. package/dist/components/TeamSwitcher.js +0 -164
  26. package/dist/components/TeamSwitcher.js.map +0 -1
  27. package/dist/components/TeamSwitcher.mjs +0 -162
  28. package/dist/components/TeamSwitcher.mjs.map +0 -1
  29. package/dist/hooks/useNavigation.d.mts +0 -24
  30. package/dist/hooks/useNavigation.d.ts +0 -24
  31. package/dist/hooks/useNavigation.js +0 -59
  32. package/dist/hooks/useNavigation.js.map +0 -1
  33. package/dist/hooks/useNavigation.mjs +0 -57
  34. package/dist/hooks/useNavigation.mjs.map +0 -1
  35. package/dist/types/index.d.mts +0 -85
  36. package/dist/types/index.d.ts +0 -85
  37. package/dist/types/index.js +0 -4
  38. package/dist/types/index.js.map +0 -1
  39. package/dist/types/index.mjs +0 -3
  40. package/dist/types/index.mjs.map +0 -1
  41. package/dist/types/ui-components.d.js +0 -4
  42. package/dist/types/ui-components.d.js.map +0 -1
  43. package/dist/types/ui-components.d.mjs +0 -3
  44. package/dist/types/ui-components.d.mjs.map +0 -1
  45. package/dist/utils/iconMapper.d.mts +0 -16
  46. package/dist/utils/iconMapper.d.ts +0 -16
  47. package/dist/utils/iconMapper.js +0 -52
  48. package/dist/utils/iconMapper.js.map +0 -1
  49. package/dist/utils/iconMapper.mjs +0 -30
  50. package/dist/utils/iconMapper.mjs.map +0 -1
package/dist/index.mjs CHANGED
@@ -1,16 +1,627 @@
1
- import * as LucideIcons from 'lucide-react';
2
- import { ChevronRight, ChevronsUpDown, BadgeCheck, LogOut, GalleryVerticalEnd, Check } from 'lucide-react';
3
- import { Collapsible, CollapsibleTrigger, CollapsibleContent } from '@/components/ui/collapsible';
4
- import { SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarMenuSub, SidebarMenuSubItem, SidebarMenuSubButton, useSidebar, Sidebar, SidebarHeader, SidebarContent, SidebarFooter, SidebarRail } from '@/components/ui/sidebar';
5
- import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
6
- import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar';
7
- import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuItem } from '@/components/ui/dropdown-menu';
1
+ import * as React2 from 'react';
8
2
  import { useState, useEffect } from 'react';
9
3
  import Link from 'next/link';
10
4
  import { usePathname, useRouter } from 'next/navigation';
11
5
  import { signOut } from 'next-auth/react';
6
+ import * as LucideIcons from 'lucide-react';
7
+ import { PanelLeft, ChevronRight, Check, Circle, ChevronsUpDown, BadgeCheck, LogOut, GalleryVerticalEnd } from 'lucide-react';
8
+ import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';
9
+ import { Slot } from '@radix-ui/react-slot';
10
+ import { cva } from 'class-variance-authority';
11
+ import { clsx } from 'clsx';
12
+ import { twMerge } from 'tailwind-merge';
13
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
14
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
15
+ import * as AvatarPrimitive from '@radix-ui/react-avatar';
16
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
12
17
 
13
- // src/components/NavMain.tsx
18
+ // src/components/AppSidebar.tsx
19
+ var Collapsible = CollapsiblePrimitive.Root;
20
+ var CollapsibleTrigger2 = CollapsiblePrimitive.CollapsibleTrigger;
21
+ var CollapsibleContent2 = CollapsiblePrimitive.CollapsibleContent;
22
+ function cn(...inputs) {
23
+ return twMerge(clsx(inputs));
24
+ }
25
+ var TooltipProvider = TooltipPrimitive.Provider;
26
+ var Tooltip = TooltipPrimitive.Root;
27
+ var TooltipTrigger = TooltipPrimitive.Trigger;
28
+ var TooltipContent = React2.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
29
+ TooltipPrimitive.Content,
30
+ {
31
+ ref,
32
+ sideOffset,
33
+ className: cn(
34
+ "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",
35
+ className
36
+ ),
37
+ ...props
38
+ }
39
+ ) }));
40
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
41
+ var SIDEBAR_COOKIE_NAME = "sidebar_state";
42
+ var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
43
+ var SIDEBAR_WIDTH = "16rem";
44
+ var SIDEBAR_WIDTH_MOBILE = "18rem";
45
+ var SIDEBAR_WIDTH_ICON = "3rem";
46
+ var SIDEBAR_KEYBOARD_SHORTCUT = "b";
47
+ var SidebarContext = React2.createContext(null);
48
+ function useSidebar() {
49
+ const context = React2.useContext(SidebarContext);
50
+ if (!context) {
51
+ throw new Error("useSidebar must be used within a SidebarProvider.");
52
+ }
53
+ return context;
54
+ }
55
+ function useIsMobile() {
56
+ const [isMobile, setIsMobile] = React2.useState(false);
57
+ React2.useEffect(() => {
58
+ const mql = window.matchMedia("(max-width: 768px)");
59
+ const onChange = () => setIsMobile(mql.matches);
60
+ mql.addEventListener("change", onChange);
61
+ setIsMobile(mql.matches);
62
+ return () => mql.removeEventListener("change", onChange);
63
+ }, []);
64
+ return isMobile;
65
+ }
66
+ var SidebarProvider = React2.forwardRef(
67
+ ({
68
+ defaultOpen = true,
69
+ open: openProp,
70
+ onOpenChange: setOpenProp,
71
+ className,
72
+ style,
73
+ children,
74
+ ...props
75
+ }, ref) => {
76
+ const isMobile = useIsMobile();
77
+ const [openMobile, setOpenMobile] = React2.useState(false);
78
+ const [_open, _setOpen] = React2.useState(defaultOpen);
79
+ const open = openProp ?? _open;
80
+ const setOpen = React2.useCallback(
81
+ (value) => {
82
+ const openState = typeof value === "function" ? value(open) : value;
83
+ if (setOpenProp) {
84
+ setOpenProp(openState);
85
+ } else {
86
+ _setOpen(openState);
87
+ }
88
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
89
+ },
90
+ [setOpenProp, open]
91
+ );
92
+ const toggleSidebar = React2.useCallback(() => {
93
+ return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2);
94
+ }, [isMobile, setOpen, setOpenMobile]);
95
+ React2.useEffect(() => {
96
+ const handleKeyDown = (event) => {
97
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
98
+ event.preventDefault();
99
+ toggleSidebar();
100
+ }
101
+ };
102
+ window.addEventListener("keydown", handleKeyDown);
103
+ return () => window.removeEventListener("keydown", handleKeyDown);
104
+ }, [toggleSidebar]);
105
+ const state = open ? "expanded" : "collapsed";
106
+ const contextValue = React2.useMemo(
107
+ () => ({
108
+ state,
109
+ open,
110
+ setOpen,
111
+ isMobile,
112
+ openMobile,
113
+ setOpenMobile,
114
+ toggleSidebar
115
+ }),
116
+ [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
117
+ );
118
+ return /* @__PURE__ */ jsx(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsx(
119
+ "div",
120
+ {
121
+ style: {
122
+ "--sidebar-width": SIDEBAR_WIDTH,
123
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
124
+ ...style
125
+ },
126
+ className: cn(
127
+ "group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar",
128
+ className
129
+ ),
130
+ ref,
131
+ ...props,
132
+ children
133
+ }
134
+ ) }) });
135
+ }
136
+ );
137
+ SidebarProvider.displayName = "SidebarProvider";
138
+ var Sidebar = React2.forwardRef(
139
+ ({
140
+ side = "left",
141
+ variant = "sidebar",
142
+ collapsible = "offcanvas",
143
+ className,
144
+ children,
145
+ ...props
146
+ }, ref) => {
147
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
148
+ if (collapsible === "none") {
149
+ return /* @__PURE__ */ jsx(
150
+ "div",
151
+ {
152
+ className: cn(
153
+ "flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground",
154
+ className
155
+ ),
156
+ ref,
157
+ ...props,
158
+ children
159
+ }
160
+ );
161
+ }
162
+ if (isMobile) {
163
+ return /* @__PURE__ */ jsx(
164
+ "div",
165
+ {
166
+ className: cn(
167
+ "fixed inset-0 z-50 bg-black/80",
168
+ openMobile ? "block" : "hidden"
169
+ ),
170
+ onClick: () => setOpenMobile(false),
171
+ children: /* @__PURE__ */ jsx(
172
+ "div",
173
+ {
174
+ "data-sidebar": "sidebar",
175
+ "data-mobile": "true",
176
+ className: cn(
177
+ "fixed inset-y-0 z-50 flex h-svh w-[--sidebar-width] flex-col bg-sidebar p-2 text-sidebar-foreground",
178
+ side === "left" ? "left-0 border-r" : "right-0 border-l",
179
+ className
180
+ ),
181
+ style: {
182
+ "--sidebar-width": SIDEBAR_WIDTH_MOBILE
183
+ },
184
+ onClick: (e) => e.stopPropagation(),
185
+ ref,
186
+ ...props,
187
+ children
188
+ }
189
+ )
190
+ }
191
+ );
192
+ }
193
+ return /* @__PURE__ */ jsxs(
194
+ "div",
195
+ {
196
+ ref,
197
+ className: "group peer hidden md:block text-sidebar-foreground",
198
+ "data-state": state,
199
+ "data-collapsible": state === "collapsed" ? collapsible : "",
200
+ "data-variant": variant,
201
+ "data-side": side,
202
+ children: [
203
+ /* @__PURE__ */ jsx(
204
+ "div",
205
+ {
206
+ className: cn(
207
+ "duration-200 relative h-svh w-[--sidebar-width] bg-transparent transition-[width] ease-linear",
208
+ "group-data-[collapsible=offcanvas]:w-0",
209
+ "group-data-[side=right]:rotate-180",
210
+ variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]" : "group-data-[collapsible=icon]:w-[--sidebar-width-icon]"
211
+ )
212
+ }
213
+ ),
214
+ /* @__PURE__ */ jsx(
215
+ "div",
216
+ {
217
+ className: cn(
218
+ "duration-200 fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] ease-linear md:flex",
219
+ 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)]",
220
+ // Adjust the padding for floating and inset variants.
221
+ variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]" : "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l",
222
+ className
223
+ ),
224
+ ...props,
225
+ children: /* @__PURE__ */ jsx(
226
+ "div",
227
+ {
228
+ "data-sidebar": "sidebar",
229
+ 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",
230
+ children
231
+ }
232
+ )
233
+ }
234
+ )
235
+ ]
236
+ }
237
+ );
238
+ }
239
+ );
240
+ Sidebar.displayName = "Sidebar";
241
+ var SidebarTrigger = React2.forwardRef(({ className, onClick, ...props }, ref) => {
242
+ const { toggleSidebar } = useSidebar();
243
+ return /* @__PURE__ */ jsxs(
244
+ "button",
245
+ {
246
+ ref,
247
+ "data-sidebar": "trigger",
248
+ className: cn("h-7 w-7", className),
249
+ onClick: (event) => {
250
+ onClick?.(event);
251
+ toggleSidebar();
252
+ },
253
+ ...props,
254
+ children: [
255
+ /* @__PURE__ */ jsx(PanelLeft, {}),
256
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle Sidebar" })
257
+ ]
258
+ }
259
+ );
260
+ });
261
+ SidebarTrigger.displayName = "SidebarTrigger";
262
+ var SidebarRail = React2.forwardRef(({ className, ...props }, ref) => {
263
+ const { toggleSidebar } = useSidebar();
264
+ return /* @__PURE__ */ jsx(
265
+ "button",
266
+ {
267
+ ref,
268
+ "data-sidebar": "rail",
269
+ "aria-label": "Toggle Sidebar",
270
+ tabIndex: -1,
271
+ onClick: toggleSidebar,
272
+ title: "Toggle Sidebar",
273
+ className: cn(
274
+ "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-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex",
275
+ "[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize",
276
+ "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
277
+ "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar",
278
+ "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
279
+ "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
280
+ className
281
+ ),
282
+ ...props
283
+ }
284
+ );
285
+ });
286
+ SidebarRail.displayName = "SidebarRail";
287
+ var SidebarInset = React2.forwardRef(({ className, ...props }, ref) => {
288
+ return /* @__PURE__ */ jsx(
289
+ "main",
290
+ {
291
+ ref,
292
+ className: cn(
293
+ "relative flex min-h-svh flex-1 flex-col bg-background",
294
+ "peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] 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",
295
+ className
296
+ ),
297
+ ...props
298
+ }
299
+ );
300
+ });
301
+ SidebarInset.displayName = "SidebarInset";
302
+ var SidebarInput = React2.forwardRef(({ className, ...props }, ref) => {
303
+ return /* @__PURE__ */ jsx(
304
+ "input",
305
+ {
306
+ ref,
307
+ "data-sidebar": "input",
308
+ className: cn(
309
+ "h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
310
+ className
311
+ ),
312
+ ...props
313
+ }
314
+ );
315
+ });
316
+ SidebarInput.displayName = "SidebarInput";
317
+ var SidebarHeader = React2.forwardRef(({ className, ...props }, ref) => {
318
+ return /* @__PURE__ */ jsx(
319
+ "div",
320
+ {
321
+ ref,
322
+ "data-sidebar": "header",
323
+ className: cn("flex flex-col gap-2 p-2", className),
324
+ ...props
325
+ }
326
+ );
327
+ });
328
+ SidebarHeader.displayName = "SidebarHeader";
329
+ var SidebarFooter = React2.forwardRef(({ className, ...props }, ref) => {
330
+ return /* @__PURE__ */ jsx(
331
+ "div",
332
+ {
333
+ ref,
334
+ "data-sidebar": "footer",
335
+ className: cn("flex flex-col gap-2 p-2", className),
336
+ ...props
337
+ }
338
+ );
339
+ });
340
+ SidebarFooter.displayName = "SidebarFooter";
341
+ var SidebarSeparator = React2.forwardRef(({ className, ...props }, ref) => {
342
+ return /* @__PURE__ */ jsx(
343
+ "hr",
344
+ {
345
+ ref,
346
+ "data-sidebar": "separator",
347
+ className: cn("mx-2 w-auto bg-sidebar-border", className),
348
+ ...props
349
+ }
350
+ );
351
+ });
352
+ SidebarSeparator.displayName = "SidebarSeparator";
353
+ var SidebarContent = React2.forwardRef(({ className, ...props }, ref) => {
354
+ return /* @__PURE__ */ jsx(
355
+ "div",
356
+ {
357
+ ref,
358
+ "data-sidebar": "content",
359
+ className: cn(
360
+ "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
361
+ className
362
+ ),
363
+ ...props
364
+ }
365
+ );
366
+ });
367
+ SidebarContent.displayName = "SidebarContent";
368
+ var SidebarGroup = React2.forwardRef(({ className, ...props }, ref) => {
369
+ return /* @__PURE__ */ jsx(
370
+ "div",
371
+ {
372
+ ref,
373
+ "data-sidebar": "group",
374
+ className: cn("relative flex w-full min-w-0 flex-col p-2", className),
375
+ ...props
376
+ }
377
+ );
378
+ });
379
+ SidebarGroup.displayName = "SidebarGroup";
380
+ var SidebarGroupLabel = React2.forwardRef(({ className, asChild = false, ...props }, ref) => {
381
+ const Comp = asChild ? Slot : "div";
382
+ return /* @__PURE__ */ jsx(
383
+ Comp,
384
+ {
385
+ ref,
386
+ "data-sidebar": "group-label",
387
+ className: cn(
388
+ "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",
389
+ "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
390
+ className
391
+ ),
392
+ ...props
393
+ }
394
+ );
395
+ });
396
+ SidebarGroupLabel.displayName = "SidebarGroupLabel";
397
+ var SidebarGroupAction = React2.forwardRef(({ className, asChild = false, ...props }, ref) => {
398
+ const Comp = asChild ? Slot : "button";
399
+ return /* @__PURE__ */ jsx(
400
+ Comp,
401
+ {
402
+ ref,
403
+ "data-sidebar": "group-action",
404
+ className: cn(
405
+ "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",
406
+ // Increases the hit area of the button on mobile.
407
+ "after:absolute after:-inset-2 after:md:hidden",
408
+ "group-data-[collapsible=icon]:hidden",
409
+ className
410
+ ),
411
+ ...props
412
+ }
413
+ );
414
+ });
415
+ SidebarGroupAction.displayName = "SidebarGroupAction";
416
+ var SidebarGroupContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
417
+ "div",
418
+ {
419
+ ref,
420
+ "data-sidebar": "group-content",
421
+ className: cn("w-full text-sm", className),
422
+ ...props
423
+ }
424
+ ));
425
+ SidebarGroupContent.displayName = "SidebarGroupContent";
426
+ var SidebarMenu = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
427
+ "ul",
428
+ {
429
+ ref,
430
+ "data-sidebar": "menu",
431
+ className: cn("flex w-full min-w-0 flex-col gap-1", className),
432
+ ...props
433
+ }
434
+ ));
435
+ SidebarMenu.displayName = "SidebarMenu";
436
+ var SidebarMenuItem = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
437
+ "li",
438
+ {
439
+ ref,
440
+ "data-sidebar": "menu-item",
441
+ className: cn("group/menu-item relative", className),
442
+ ...props
443
+ }
444
+ ));
445
+ SidebarMenuItem.displayName = "SidebarMenuItem";
446
+ var sidebarMenuButtonVariants = cva(
447
+ "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",
448
+ {
449
+ variants: {
450
+ variant: {
451
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
452
+ 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))]"
453
+ },
454
+ size: {
455
+ default: "h-8 text-sm",
456
+ sm: "h-7 text-xs",
457
+ lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0"
458
+ }
459
+ },
460
+ defaultVariants: {
461
+ variant: "default",
462
+ size: "default"
463
+ }
464
+ }
465
+ );
466
+ var SidebarMenuButton = React2.forwardRef(
467
+ ({
468
+ asChild = false,
469
+ isActive = false,
470
+ variant = "default",
471
+ size = "default",
472
+ tooltip,
473
+ className,
474
+ ...props
475
+ }, ref) => {
476
+ const Comp = asChild ? Slot : "button";
477
+ const { isMobile, state } = useSidebar();
478
+ const button = /* @__PURE__ */ jsx(
479
+ Comp,
480
+ {
481
+ ref,
482
+ "data-sidebar": "menu-button",
483
+ "data-size": size,
484
+ "data-active": isActive,
485
+ className: cn(sidebarMenuButtonVariants({ variant, size }), className),
486
+ ...props
487
+ }
488
+ );
489
+ if (!tooltip) {
490
+ return button;
491
+ }
492
+ if (typeof tooltip === "string") {
493
+ tooltip = {
494
+ children: tooltip
495
+ };
496
+ }
497
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
498
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: button }),
499
+ /* @__PURE__ */ jsx(
500
+ TooltipContent,
501
+ {
502
+ side: "right",
503
+ align: "center",
504
+ hidden: state !== "collapsed" || isMobile,
505
+ ...tooltip
506
+ }
507
+ )
508
+ ] });
509
+ }
510
+ );
511
+ SidebarMenuButton.displayName = "SidebarMenuButton";
512
+ var SidebarMenuAction = React2.forwardRef(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
513
+ const Comp = asChild ? Slot : "button";
514
+ return /* @__PURE__ */ jsx(
515
+ Comp,
516
+ {
517
+ ref,
518
+ "data-sidebar": "menu-action",
519
+ className: cn(
520
+ "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",
521
+ // Increases the hit area of the button on mobile.
522
+ "after:absolute after:-inset-2 after:md:hidden",
523
+ "peer-data-[size=sm]/menu-button:top-1",
524
+ "peer-data-[size=default]/menu-button:top-1.5",
525
+ "peer-data-[size=lg]/menu-button:top-2.5",
526
+ "group-data-[collapsible=icon]:hidden",
527
+ 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",
528
+ className
529
+ ),
530
+ ...props
531
+ }
532
+ );
533
+ });
534
+ SidebarMenuAction.displayName = "SidebarMenuAction";
535
+ var SidebarMenuBadge = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
536
+ "div",
537
+ {
538
+ ref,
539
+ "data-sidebar": "menu-badge",
540
+ className: cn(
541
+ "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",
542
+ "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
543
+ "peer-data-[size=sm]/menu-button:top-1",
544
+ "peer-data-[size=default]/menu-button:top-1.5",
545
+ "peer-data-[size=lg]/menu-button:top-2.5",
546
+ "group-data-[collapsible=icon]:hidden",
547
+ className
548
+ ),
549
+ ...props
550
+ }
551
+ ));
552
+ SidebarMenuBadge.displayName = "SidebarMenuBadge";
553
+ var SidebarMenuSkeleton = React2.forwardRef(({ className, showIcon = false, ...props }, ref) => {
554
+ const width = React2.useMemo(() => {
555
+ return `${Math.floor(Math.random() * 40) + 50}%`;
556
+ }, []);
557
+ return /* @__PURE__ */ jsxs(
558
+ "div",
559
+ {
560
+ ref,
561
+ "data-sidebar": "menu-skeleton",
562
+ className: cn("rounded-md h-8 flex gap-2 px-2 items-center", className),
563
+ ...props,
564
+ children: [
565
+ showIcon && /* @__PURE__ */ jsx(
566
+ "div",
567
+ {
568
+ className: "size-4 rounded-md bg-sidebar-accent-foreground/10",
569
+ "data-sidebar": "menu-skeleton-icon"
570
+ }
571
+ ),
572
+ /* @__PURE__ */ jsx(
573
+ "div",
574
+ {
575
+ className: "h-4 flex-1 max-w-[--skeleton-width] rounded-md bg-sidebar-accent-foreground/10",
576
+ "data-sidebar": "menu-skeleton-text",
577
+ style: {
578
+ "--skeleton-width": width
579
+ }
580
+ }
581
+ )
582
+ ]
583
+ }
584
+ );
585
+ });
586
+ SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
587
+ var SidebarMenuSub = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
588
+ "ul",
589
+ {
590
+ ref,
591
+ "data-sidebar": "menu-sub",
592
+ className: cn(
593
+ "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",
594
+ "group-data-[collapsible=icon]:hidden",
595
+ className
596
+ ),
597
+ ...props
598
+ }
599
+ ));
600
+ SidebarMenuSub.displayName = "SidebarMenuSub";
601
+ var SidebarMenuSubItem = React2.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx("li", { ref, ...props }));
602
+ SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
603
+ var SidebarMenuSubButton = React2.forwardRef(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
604
+ const Comp = asChild ? Slot : "a";
605
+ return /* @__PURE__ */ jsx(
606
+ Comp,
607
+ {
608
+ ref,
609
+ "data-sidebar": "menu-sub-button",
610
+ "data-size": size,
611
+ "data-active": isActive,
612
+ className: cn(
613
+ "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",
614
+ "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
615
+ size === "sm" && "text-xs",
616
+ size === "md" && "text-sm",
617
+ "group-data-[collapsible=icon]:hidden",
618
+ className
619
+ ),
620
+ ...props
621
+ }
622
+ );
623
+ });
624
+ SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
14
625
  var ICON_MAP = {
15
626
  Home: LucideIcons.Home,
16
627
  Users: LucideIcons.Users,
@@ -36,7 +647,7 @@ function getIconComponent(icon) {
36
647
  }
37
648
  function NavMain({ items, adapter }) {
38
649
  const pathname = adapter.usePathname();
39
- const Link2 = adapter.Link;
650
+ const Link3 = adapter.Link;
40
651
  const groups = [];
41
652
  let currentGroup = {
42
653
  items: []
@@ -80,7 +691,7 @@ function NavMain({ items, adapter }) {
80
691
  defaultOpen: isActive,
81
692
  className: "group/collapsible",
82
693
  children: /* @__PURE__ */ jsxs(SidebarMenuItem, { children: [
83
- /* @__PURE__ */ jsx(CollapsibleTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
694
+ /* @__PURE__ */ jsx(CollapsibleTrigger2, { asChild: true, children: /* @__PURE__ */ jsxs(
84
695
  SidebarMenuButton,
85
696
  {
86
697
  tooltip: item.title,
@@ -92,7 +703,7 @@ function NavMain({ items, adapter }) {
92
703
  ]
93
704
  }
94
705
  ) }),
95
- /* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx(SidebarMenuSub, { children: item.items?.map((subItem) => /* @__PURE__ */ jsx(SidebarMenuSubItem, { children: /* @__PURE__ */ jsx(SidebarMenuSubButton, { asChild: true, children: /* @__PURE__ */ jsx(Link2, { href: subItem.url, children: /* @__PURE__ */ jsx("span", { children: subItem.title }) }) }) }, subItem.title)) }) })
706
+ /* @__PURE__ */ jsx(CollapsibleContent2, { children: /* @__PURE__ */ jsx(SidebarMenuSub, { children: item.items?.map((subItem) => /* @__PURE__ */ jsx(SidebarMenuSubItem, { children: /* @__PURE__ */ jsx(SidebarMenuSubButton, { asChild: true, children: /* @__PURE__ */ jsx(Link3, { href: subItem.url, children: /* @__PURE__ */ jsx("span", { children: subItem.title }) }) }) }, subItem.title)) }) })
96
707
  ] })
97
708
  },
98
709
  item.title
@@ -104,7 +715,7 @@ function NavMain({ items, adapter }) {
104
715
  asChild: true,
105
716
  tooltip: item.title,
106
717
  isActive,
107
- children: /* @__PURE__ */ jsxs(Link2, { href: item.url, children: [
718
+ children: /* @__PURE__ */ jsxs(Link3, { href: item.url, children: [
108
719
  item.icon && /* @__PURE__ */ jsx(item.icon, {}),
109
720
  /* @__PURE__ */ jsx("span", { children: item.title })
110
721
  ] })
@@ -113,6 +724,153 @@ function NavMain({ items, adapter }) {
113
724
  }) })
114
725
  ] }, groupIndex)) });
115
726
  }
727
+ var Avatar = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
728
+ AvatarPrimitive.Root,
729
+ {
730
+ ref,
731
+ className: cn(
732
+ "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
733
+ className
734
+ ),
735
+ ...props
736
+ }
737
+ ));
738
+ Avatar.displayName = AvatarPrimitive.Root.displayName;
739
+ var AvatarImage = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
740
+ AvatarPrimitive.Image,
741
+ {
742
+ ref,
743
+ className: cn("aspect-square h-full w-full", className),
744
+ ...props
745
+ }
746
+ ));
747
+ AvatarImage.displayName = AvatarPrimitive.Image.displayName;
748
+ var AvatarFallback = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
749
+ AvatarPrimitive.Fallback,
750
+ {
751
+ ref,
752
+ className: cn(
753
+ "flex h-full w-full items-center justify-center rounded-full bg-muted",
754
+ className
755
+ ),
756
+ ...props
757
+ }
758
+ ));
759
+ AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
760
+ var DropdownMenu = DropdownMenuPrimitive.Root;
761
+ var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
762
+ var DropdownMenuGroup = DropdownMenuPrimitive.Group;
763
+ var DropdownMenuSubTrigger = React2.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
764
+ DropdownMenuPrimitive.SubTrigger,
765
+ {
766
+ ref,
767
+ className: cn(
768
+ "flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
769
+ inset && "pl-8",
770
+ className
771
+ ),
772
+ ...props,
773
+ children: [
774
+ children,
775
+ /* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto" })
776
+ ]
777
+ }
778
+ ));
779
+ DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
780
+ var DropdownMenuSubContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
781
+ DropdownMenuPrimitive.SubContent,
782
+ {
783
+ ref,
784
+ className: cn(
785
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
786
+ className
787
+ ),
788
+ ...props
789
+ }
790
+ ));
791
+ DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
792
+ var DropdownMenuContent = React2.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
793
+ DropdownMenuPrimitive.Content,
794
+ {
795
+ ref,
796
+ sideOffset,
797
+ className: cn(
798
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",
799
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
800
+ className
801
+ ),
802
+ ...props
803
+ }
804
+ ) }));
805
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
806
+ var DropdownMenuItem = React2.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
807
+ DropdownMenuPrimitive.Item,
808
+ {
809
+ ref,
810
+ className: cn(
811
+ "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0",
812
+ inset && "pl-8",
813
+ className
814
+ ),
815
+ ...props
816
+ }
817
+ ));
818
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
819
+ var DropdownMenuCheckboxItem = React2.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
820
+ DropdownMenuPrimitive.CheckboxItem,
821
+ {
822
+ ref,
823
+ className: cn(
824
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
825
+ className
826
+ ),
827
+ checked,
828
+ ...props,
829
+ children: [
830
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" }) }) }),
831
+ children
832
+ ]
833
+ }
834
+ ));
835
+ DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
836
+ var DropdownMenuRadioItem = React2.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
837
+ DropdownMenuPrimitive.RadioItem,
838
+ {
839
+ ref,
840
+ className: cn(
841
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
842
+ className
843
+ ),
844
+ ...props,
845
+ children: [
846
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Circle, { className: "h-2 w-2 fill-current" }) }) }),
847
+ children
848
+ ]
849
+ }
850
+ ));
851
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
852
+ var DropdownMenuLabel = React2.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
853
+ DropdownMenuPrimitive.Label,
854
+ {
855
+ ref,
856
+ className: cn(
857
+ "px-2 py-1.5 text-sm font-semibold",
858
+ inset && "pl-8",
859
+ className
860
+ ),
861
+ ...props
862
+ }
863
+ ));
864
+ DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
865
+ var DropdownMenuSeparator = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
866
+ DropdownMenuPrimitive.Separator,
867
+ {
868
+ ref,
869
+ className: cn("-mx-1 my-1 h-px bg-muted", className),
870
+ ...props
871
+ }
872
+ ));
873
+ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
116
874
  function getInitials(name, email) {
117
875
  if (name) {
118
876
  const parts = name.trim().split(/\s+/);
@@ -393,18 +1151,32 @@ function useNavigation({
393
1151
  }, [organizationId, apiBaseUrl, enabled]);
394
1152
  return { items, organizations, loading, error };
395
1153
  }
1154
+ var NextJSLink = ({ href, children, className }) => /* @__PURE__ */ jsx(Link, { href, className, children });
396
1155
  function AppSidebar({
397
1156
  user,
398
- adapter,
1157
+ adapter: externalAdapter,
399
1158
  data,
400
1159
  organizationId,
401
1160
  apiBaseUrl,
402
1161
  ...props
403
1162
  }) {
404
- const pathname = adapter.usePathname();
1163
+ const pathname = usePathname();
1164
+ const nextRouter = useRouter();
1165
+ const router = React2.useMemo(() => ({
1166
+ push: (path) => nextRouter.push(path),
1167
+ refresh: () => nextRouter.refresh()
1168
+ }), [nextRouter]);
1169
+ const internalAdapter = React2.useMemo(() => ({
1170
+ usePathname: () => pathname,
1171
+ useRouter: () => router,
1172
+ Link: NextJSLink,
1173
+ signOut
1174
+ }), [pathname, router]);
1175
+ const adapter = externalAdapter ?? internalAdapter;
1176
+ const currentPathname = adapter.usePathname();
405
1177
  const isPropsMode = data !== void 0;
406
- const pathSegments = pathname.split("/");
407
- const isAppOrgRoute = pathname.startsWith("/app/") && pathSegments.length > 2 && pathSegments[2] !== "user";
1178
+ const pathSegments = currentPathname.split("/");
1179
+ const isAppOrgRoute = currentPathname.startsWith("/app/") && pathSegments.length > 2 && pathSegments[2] !== "user";
408
1180
  const pathOrgId = isAppOrgRoute ? pathSegments[2] : null;
409
1181
  const {
410
1182
  items: apiNavigationItems,
@@ -445,9 +1217,9 @@ function AppSidebar({
445
1217
  ] });
446
1218
  }
447
1219
  function createNextJSAdapter() {
448
- const NextJSLink = ({ href, children, className }) => /* @__PURE__ */ jsx(Link, { href, className, children });
1220
+ const NextJSLink2 = ({ href, children, className }) => /* @__PURE__ */ jsx(Link, { href, className, children });
449
1221
  return {
450
- usePathname,
1222
+ usePathname: usePathname,
451
1223
  useRouter: () => {
452
1224
  const router = useRouter();
453
1225
  return {
@@ -455,11 +1227,11 @@ function createNextJSAdapter() {
455
1227
  refresh: () => router.refresh()
456
1228
  };
457
1229
  },
458
- Link: NextJSLink,
459
- signOut
1230
+ Link: NextJSLink2,
1231
+ signOut: signOut
460
1232
  };
461
1233
  }
462
1234
 
463
- export { AppSidebar, NavMain, NavUser, TeamSwitcher, createNextJSAdapter, getIconComponent, useNavigation };
1235
+ export { AppSidebar, NavMain, NavUser, SidebarProvider, TeamSwitcher, createNextJSAdapter, getIconComponent, useNavigation, useSidebar };
464
1236
  //# sourceMappingURL=index.mjs.map
465
1237
  //# sourceMappingURL=index.mjs.map