@codefast/ui 0.3.11 → 0.3.12-canary.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +4 -0
  3. package/dist/components/accordion.d.ts +11 -29
  4. package/dist/components/accordion.d.ts.map +1 -0
  5. package/dist/components/accordion.js +11 -38
  6. package/dist/components/alert-dialog.d.ts +25 -60
  7. package/dist/components/alert-dialog.d.ts.map +1 -0
  8. package/dist/components/alert-dialog.js +17 -70
  9. package/dist/components/alert.d.ts +16 -27
  10. package/dist/components/alert.d.ts.map +1 -0
  11. package/dist/components/alert.js +33 -31
  12. package/dist/components/aspect-ratio.d.ts +5 -8
  13. package/dist/components/aspect-ratio.d.ts.map +1 -0
  14. package/dist/components/aspect-ratio.js +5 -7
  15. package/dist/components/avatar.d.ts +7 -17
  16. package/dist/components/avatar.d.ts.map +1 -0
  17. package/dist/components/avatar.js +8 -19
  18. package/dist/components/badge.d.ts +15 -21
  19. package/dist/components/badge.d.ts.map +1 -0
  20. package/dist/components/badge.js +53 -21
  21. package/dist/components/breadcrumb.d.ts +13 -35
  22. package/dist/components/breadcrumb.d.ts.map +1 -0
  23. package/dist/components/breadcrumb.js +14 -50
  24. package/dist/components/button-group.d.ts +15 -29
  25. package/dist/components/button-group.d.ts.map +1 -0
  26. package/dist/components/button-group.js +37 -28
  27. package/dist/components/button.d.ts +26 -35
  28. package/dist/components/button.d.ts.map +1 -0
  29. package/dist/components/button.js +87 -52
  30. package/dist/components/calendar.d.ts +10 -24
  31. package/dist/components/calendar.d.ts.map +1 -0
  32. package/dist/components/calendar.js +88 -93
  33. package/dist/components/card.d.ts +11 -34
  34. package/dist/components/card.d.ts.map +1 -0
  35. package/dist/components/card.js +12 -40
  36. package/dist/components/carousel.d.ts +25 -55
  37. package/dist/components/carousel.d.ts.map +1 -0
  38. package/dist/components/carousel.js +83 -115
  39. package/dist/components/chart.d.ts +37 -72
  40. package/dist/components/chart.d.ts.map +1 -0
  41. package/dist/components/chart.js +162 -151
  42. package/dist/components/checkbox-cards.d.ts +9 -15
  43. package/dist/components/checkbox-cards.d.ts.map +1 -0
  44. package/dist/components/checkbox-cards.js +9 -23
  45. package/dist/components/checkbox-group.d.ts +9 -16
  46. package/dist/components/checkbox-group.d.ts.map +1 -0
  47. package/dist/components/checkbox-group.js +8 -20
  48. package/dist/components/checkbox.d.ts +5 -9
  49. package/dist/components/checkbox.d.ts.map +1 -0
  50. package/dist/components/checkbox.js +7 -15
  51. package/dist/components/collapsible.d.ts +7 -14
  52. package/dist/components/collapsible.d.ts.map +1 -0
  53. package/dist/components/collapsible.js +7 -15
  54. package/dist/components/command.d.ts +24 -55
  55. package/dist/components/command.d.ts.map +1 -0
  56. package/dist/components/command.js +19 -70
  57. package/dist/components/context-menu.d.ts +23 -72
  58. package/dist/components/context-menu.d.ts.map +1 -0
  59. package/dist/components/context-menu.js +22 -90
  60. package/dist/components/dialog.d.ts +23 -53
  61. package/dist/components/dialog.d.ts.map +1 -0
  62. package/dist/components/dialog.js +21 -73
  63. package/dist/components/drawer.d.ts +29 -60
  64. package/dist/components/drawer.d.ts.map +1 -0
  65. package/dist/components/drawer.js +17 -59
  66. package/dist/components/dropdown-menu.d.ts +23 -73
  67. package/dist/components/dropdown-menu.d.ts.map +1 -0
  68. package/dist/components/dropdown-menu.js +22 -97
  69. package/dist/components/empty.d.ts +16 -37
  70. package/dist/components/empty.d.ts.map +1 -0
  71. package/dist/components/empty.js +33 -45
  72. package/dist/components/field.d.ts +26 -63
  73. package/dist/components/field.d.ts.map +1 -0
  74. package/dist/components/field.js +61 -90
  75. package/dist/components/form.d.ts +16 -37
  76. package/dist/components/form.d.ts.map +1 -0
  77. package/dist/components/form.js +51 -67
  78. package/dist/components/hover-card.d.ts +8 -21
  79. package/dist/components/hover-card.d.ts.map +1 -0
  80. package/dist/components/hover-card.js +9 -24
  81. package/dist/components/input-group.d.ts +29 -53
  82. package/dist/components/input-group.d.ts.map +1 -0
  83. package/dist/components/input-group.js +110 -67
  84. package/dist/components/input-number.d.ts +8 -28
  85. package/dist/components/input-number.d.ts.map +1 -0
  86. package/dist/components/input-number.js +15 -56
  87. package/dist/components/input-otp.d.ts +11 -24
  88. package/dist/components/input-otp.d.ts.map +1 -0
  89. package/dist/components/input-otp.js +14 -35
  90. package/dist/components/input-password.d.ts +6 -12
  91. package/dist/components/input-password.d.ts.map +1 -0
  92. package/dist/components/input-password.js +11 -31
  93. package/dist/components/input-search.d.ts +9 -18
  94. package/dist/components/input-search.d.ts.map +1 -0
  95. package/dist/components/input-search.js +17 -44
  96. package/dist/components/input.d.ts +5 -10
  97. package/dist/components/input.d.ts.map +1 -0
  98. package/dist/components/input.js +6 -10
  99. package/dist/components/item.d.ts +33 -69
  100. package/dist/components/item.d.ts.map +1 -0
  101. package/dist/components/item.js +69 -91
  102. package/dist/components/kbd.d.ts +6 -13
  103. package/dist/components/kbd.d.ts.map +1 -0
  104. package/dist/components/kbd.js +7 -14
  105. package/dist/components/label.d.ts +5 -9
  106. package/dist/components/label.d.ts.map +1 -0
  107. package/dist/components/label.js +6 -9
  108. package/dist/components/menubar.d.ts +24 -80
  109. package/dist/components/menubar.d.ts.map +1 -0
  110. package/dist/components/menubar.js +24 -100
  111. package/dist/components/native-select.d.ts +7 -16
  112. package/dist/components/native-select.d.ts.map +1 -0
  113. package/dist/components/native-select.js +8 -26
  114. package/dist/components/navigation-menu.d.ts +13 -36
  115. package/dist/components/navigation-menu.d.ts.map +1 -0
  116. package/dist/components/navigation-menu.js +26 -62
  117. package/dist/components/pagination.d.ts +15 -35
  118. package/dist/components/pagination.d.ts.map +1 -0
  119. package/dist/components/pagination.js +14 -56
  120. package/dist/components/popover.d.ts +9 -24
  121. package/dist/components/popover.d.ts.map +1 -0
  122. package/dist/components/popover.js +10 -28
  123. package/dist/components/progress-circle.d.ts +89 -106
  124. package/dist/components/progress-circle.d.ts.map +1 -0
  125. package/dist/components/progress-circle.js +71 -104
  126. package/dist/components/progress.d.ts +5 -10
  127. package/dist/components/progress.d.ts.map +1 -0
  128. package/dist/components/progress.js +8 -14
  129. package/dist/components/radio-cards.d.ts +5 -10
  130. package/dist/components/radio-cards.d.ts.map +1 -0
  131. package/dist/components/radio-cards.js +8 -22
  132. package/dist/components/radio-group.d.ts +6 -13
  133. package/dist/components/radio-group.d.ts.map +1 -0
  134. package/dist/components/radio-group.js +7 -18
  135. package/dist/components/radio.d.ts +6 -12
  136. package/dist/components/radio.d.ts.map +1 -0
  137. package/dist/components/radio.js +6 -11
  138. package/dist/components/resizable.d.ts +8 -18
  139. package/dist/components/resizable.d.ts.map +1 -0
  140. package/dist/components/resizable.js +8 -22
  141. package/dist/components/scroll-area.d.ts +21 -33
  142. package/dist/components/scroll-area.d.ts.map +1 -0
  143. package/dist/components/scroll-area.js +65 -85
  144. package/dist/components/select.d.ts +17 -50
  145. package/dist/components/select.d.ts.map +1 -0
  146. package/dist/components/select.js +27 -79
  147. package/dist/components/separator.d.ts +20 -29
  148. package/dist/components/separator.d.ts.map +1 -0
  149. package/dist/components/separator.js +28 -37
  150. package/dist/components/sheet.d.ts +30 -62
  151. package/dist/components/sheet.d.ts.map +1 -0
  152. package/dist/components/sheet.js +68 -81
  153. package/dist/components/sidebar.d.ts +67 -160
  154. package/dist/components/sidebar.d.ts.map +1 -0
  155. package/dist/components/sidebar.js +184 -302
  156. package/dist/components/skeleton.d.ts +5 -9
  157. package/dist/components/skeleton.d.ts.map +1 -0
  158. package/dist/components/skeleton.js +6 -9
  159. package/dist/components/slider.d.ts +5 -13
  160. package/dist/components/slider.d.ts.map +1 -0
  161. package/dist/components/slider.js +13 -35
  162. package/dist/components/sonner.d.ts +8 -10
  163. package/dist/components/sonner.d.ts.map +1 -0
  164. package/dist/components/sonner.js +14 -16
  165. package/dist/components/spinner.d.ts +6 -12
  166. package/dist/components/spinner.d.ts.map +1 -0
  167. package/dist/components/spinner.js +21 -34
  168. package/dist/components/switch.d.ts +5 -9
  169. package/dist/components/switch.d.ts.map +1 -0
  170. package/dist/components/switch.js +6 -13
  171. package/dist/components/table.d.ts +12 -37
  172. package/dist/components/table.d.ts.map +1 -0
  173. package/dist/components/table.js +13 -48
  174. package/dist/components/tabs.d.ts +8 -21
  175. package/dist/components/tabs.d.ts.map +1 -0
  176. package/dist/components/tabs.js +9 -24
  177. package/dist/components/textarea.d.ts +5 -9
  178. package/dist/components/textarea.d.ts.map +1 -0
  179. package/dist/components/textarea.js +6 -9
  180. package/dist/components/toggle-group.d.ts +10 -24
  181. package/dist/components/toggle-group.d.ts.map +1 -0
  182. package/dist/components/toggle-group.js +21 -39
  183. package/dist/components/toggle.d.ts +18 -25
  184. package/dist/components/toggle.d.ts.map +1 -0
  185. package/dist/components/toggle.js +42 -30
  186. package/dist/components/tooltip.d.ts +9 -24
  187. package/dist/components/tooltip.d.ts.map +1 -0
  188. package/dist/components/tooltip.js +10 -29
  189. package/dist/hooks/use-animated-value.d.ts +2 -4
  190. package/dist/hooks/use-animated-value.d.ts.map +1 -0
  191. package/dist/hooks/use-animated-value.js +67 -58
  192. package/dist/hooks/use-copy-to-clipboard.d.ts +6 -11
  193. package/dist/hooks/use-copy-to-clipboard.d.ts.map +1 -0
  194. package/dist/hooks/use-copy-to-clipboard.js +42 -39
  195. package/dist/hooks/use-is-mobile.d.ts +2 -4
  196. package/dist/hooks/use-is-mobile.d.ts.map +1 -0
  197. package/dist/hooks/use-is-mobile.js +20 -23
  198. package/dist/hooks/use-media-query.d.ts +2 -4
  199. package/dist/hooks/use-media-query.d.ts.map +1 -0
  200. package/dist/hooks/use-media-query.js +49 -46
  201. package/dist/hooks/use-mutation-observer.d.ts +3 -6
  202. package/dist/hooks/use-mutation-observer.d.ts.map +1 -0
  203. package/dist/hooks/use-mutation-observer.js +33 -34
  204. package/dist/hooks/use-pagination.d.ts +15 -22
  205. package/dist/hooks/use-pagination.d.ts.map +1 -0
  206. package/dist/hooks/use-pagination.js +99 -99
  207. package/dist/index.d.ts +131 -69
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/index.js +68 -69
  210. package/dist/lib/utils.d.ts +10 -0
  211. package/dist/lib/utils.d.ts.map +1 -0
  212. package/dist/lib/utils.js +10 -0
  213. package/dist/primitives/checkbox-group.d.ts +84 -105
  214. package/dist/primitives/checkbox-group.d.ts.map +1 -0
  215. package/dist/primitives/checkbox-group.js +91 -105
  216. package/dist/primitives/input-number.d.ts +41 -51
  217. package/dist/primitives/input-number.d.ts.map +1 -0
  218. package/dist/primitives/input-number.js +417 -473
  219. package/dist/primitives/input.d.ts +43 -48
  220. package/dist/primitives/input.d.ts.map +1 -0
  221. package/dist/primitives/input.js +67 -66
  222. package/dist/primitives/progress-circle.d.ts +49 -79
  223. package/dist/primitives/progress-circle.d.ts.map +1 -0
  224. package/dist/primitives/progress-circle.js +134 -149
  225. package/package.json +33 -16
  226. package/{dist → src}/css/preset.css +86 -9
  227. /package/{dist → src}/css/amber.css +0 -0
  228. /package/{dist → src}/css/blue.css +0 -0
  229. /package/{dist → src}/css/cyan.css +0 -0
  230. /package/{dist → src}/css/emerald.css +0 -0
  231. /package/{dist → src}/css/fuchsia.css +0 -0
  232. /package/{dist → src}/css/gray.css +0 -0
  233. /package/{dist → src}/css/green.css +0 -0
  234. /package/{dist → src}/css/indigo.css +0 -0
  235. /package/{dist → src}/css/lime.css +0 -0
  236. /package/{dist → src}/css/neutral.css +0 -0
  237. /package/{dist → src}/css/orange.css +0 -0
  238. /package/{dist → src}/css/pink.css +0 -0
  239. /package/{dist → src}/css/purple.css +0 -0
  240. /package/{dist → src}/css/red.css +0 -0
  241. /package/{dist → src}/css/rose.css +0 -0
  242. /package/{dist → src}/css/sky.css +0 -0
  243. /package/{dist → src}/css/slate.css +0 -0
  244. /package/{dist → src}/css/stone.css +0 -0
  245. /package/{dist → src}/css/style.css +0 -0
  246. /package/{dist → src}/css/teal.css +0 -0
  247. /package/{dist → src}/css/violet.css +0 -0
  248. /package/{dist → src}/css/yellow.css +0 -0
  249. /package/{dist → src}/css/zinc.css +0 -0
@@ -1,359 +1,241 @@
1
1
  "use client";
2
- import { Button } from "./button.js";
3
- import { Separator } from "./separator.js";
4
- import { Input } from "./input.js";
5
- import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from "./sheet.js";
6
- import { Skeleton } from "./skeleton.js";
7
- import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./tooltip.js";
8
- import { useIsMobile } from "../hooks/use-is-mobile.js";
9
- import { cn, tv } from "@codefast/tailwind-variants";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cn, tv } from "#lib/utils";
4
+ import { createContext } from "@radix-ui/react-context";
10
5
  import { Slot } from "@radix-ui/react-slot";
11
6
  import { PanelLeftIcon } from "lucide-react";
12
- import { jsx, jsxs } from "react/jsx-runtime";
13
7
  import { useCallback, useEffect, useState } from "react";
14
- import { createContext } from "@radix-ui/react-context";
15
- //#region src/components/sidebar.tsx
8
+ import { Button } from "#components/button";
9
+ import { Input } from "#components/input";
10
+ import { Separator } from "#components/separator";
11
+ import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from "#components/sheet";
12
+ import { Skeleton } from "#components/skeleton";
13
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "#components/tooltip";
14
+ import { useIsMobile } from "#hooks/use-is-mobile";
15
+ /* -----------------------------------------------------------------------------
16
+ * Variant: SidebarMenuButton
17
+ * -------------------------------------------------------------------------- */
16
18
  const sidebarMenuButtonVariants = tv({
17
- base: "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-3 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",
18
- defaultVariants: {
19
- size: "md",
20
- variant: "default"
21
- },
22
- variants: {
23
- size: {
24
- sm: "h-7 text-xs",
25
- md: "h-8 text-sm",
26
- lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!"
27
- },
28
- variant: {
29
- default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
30
- 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))]"
31
- }
32
- }
19
+ base: [
20
+ "peer/menu-button flex w-full items-center gap-2 overflow-hidden p-2",
21
+ "rounded-md ring-sidebar-ring outline-hidden",
22
+ "text-left text-sm",
23
+ "transition-[width,height,padding]",
24
+ "group-has-data-[sidebar=menu-action]/menu-item:pr-8",
25
+ "group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2!",
26
+ "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
27
+ "focus-visible:ring-3",
28
+ "active:bg-sidebar-accent active:text-sidebar-accent-foreground",
29
+ "disabled:pointer-events-none disabled:opacity-50",
30
+ "aria-disabled:pointer-events-none aria-disabled:opacity-50",
31
+ "data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground",
32
+ "data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground",
33
+ "[&>span:last-child]:truncate",
34
+ "[&>svg]:size-4 [&>svg]:shrink-0",
35
+ ],
36
+ defaultVariants: {
37
+ size: "md",
38
+ variant: "default",
39
+ },
40
+ variants: {
41
+ size: {
42
+ sm: ["h-7", "text-xs"],
43
+ md: ["h-8", "text-sm"],
44
+ lg: ["h-12 text-sm", "group-data-[collapsible=icon]:p-0!"],
45
+ },
46
+ variant: {
47
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
48
+ outline: [
49
+ "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))]",
50
+ "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]",
51
+ ],
52
+ },
53
+ },
33
54
  });
34
55
  const SIDEBAR_COOKIE_NAME = "sidebar_state";
35
- const SIDEBAR_COOKIE_MAX_AGE = 3600 * 24 * 7;
56
+ const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
36
57
  const SIDEBAR_WIDTH = "16rem";
37
58
  const SIDEBAR_WIDTH_MOBILE = "18rem";
38
59
  const SIDEBAR_WIDTH_ICON = "3.0625rem";
39
60
  const SIDEBAR_KEYBOARD_SHORTCUT = "b";
40
- const [SidebarContextProvider, useSidebar] = createContext("SidebarProvider");
61
+ /* -----------------------------------------------------------------------------
62
+ * Context: SidebarProvider
63
+ * -------------------------------------------------------------------------- */
64
+ const SIDEBAR_PROVIDER_NAME = "SidebarProvider";
65
+ const [SidebarContextProvider, useSidebar] = createContext(SIDEBAR_PROVIDER_NAME);
41
66
  function SidebarProvider({ children, className, defaultOpen = true, onOpenChange: setOpenProperty, open: openProperty, style, ...props }) {
42
- const isMobile = useIsMobile();
43
- const [openMobile, setOpenMobile] = useState(false);
44
- const [isOpen, setIsOpen] = useState(defaultOpen);
45
- const open = openProperty ?? isOpen;
46
- const setOpen = useCallback((value) => {
47
- const openState = typeof value === "function" ? value(open) : value;
48
- if (setOpenProperty) setOpenProperty(openState);
49
- else setIsOpen(openState);
50
- document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState.toString()}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE.toString()}`;
51
- }, [setOpenProperty, open]);
52
- const toggleSidebar = useCallback(() => {
53
- if (isMobile) setOpenMobile((currentValue) => !currentValue);
54
- else setOpen((currentValue) => !currentValue);
55
- }, [isMobile, setOpen]);
56
- useEffect(() => {
57
- const handleKeyDown = (event) => {
58
- if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
59
- event.preventDefault();
60
- toggleSidebar();
61
- }
62
- };
63
- window.addEventListener("keydown", handleKeyDown);
64
- return () => {
65
- window.removeEventListener("keydown", handleKeyDown);
66
- };
67
- }, [toggleSidebar]);
68
- return /* @__PURE__ */ jsx(SidebarContextProvider, {
69
- isMobile,
70
- open,
71
- openMobile,
72
- setOpen,
73
- setOpenMobile,
74
- state: open ? "expanded" : "collapsed",
75
- toggleSidebar,
76
- children: /* @__PURE__ */ jsx(TooltipProvider, {
77
- delayDuration: 0,
78
- children: /* @__PURE__ */ jsx("div", {
79
- className: cn("group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar", className),
80
- "data-slot": "sidebar-wrapper",
81
- style: {
82
- "--sidebar-width": SIDEBAR_WIDTH,
83
- "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
84
- ...style
85
- },
86
- ...props,
87
- children
88
- })
89
- })
90
- });
91
- }
67
+ const isMobile = useIsMobile();
68
+ const [openMobile, setOpenMobile] = useState(false);
69
+ // This is the internal state of the sidebar.
70
+ // We use openProp and setOpenProp for control from outside the component.
71
+ const [isOpen, setIsOpen] = useState(defaultOpen);
72
+ const open = openProperty ?? isOpen;
73
+ const setOpen = useCallback((value) => {
74
+ const openState = typeof value === "function" ? value(open) : value;
75
+ if (setOpenProperty) {
76
+ setOpenProperty(openState);
77
+ }
78
+ else {
79
+ setIsOpen(openState);
80
+ }
81
+ //
82
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState.toString()}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE.toString()}`;
83
+ }, [setOpenProperty, open]);
84
+ // Helper to toggle the sidebar.
85
+ const toggleSidebar = useCallback(() => {
86
+ if (isMobile) {
87
+ setOpenMobile((currentValue) => !currentValue);
88
+ }
89
+ else {
90
+ setOpen((currentValue) => !currentValue);
91
+ }
92
+ }, [isMobile, setOpen]);
93
+ // Adds a keyboard shortcut to toggle the sidebar.
94
+ useEffect(() => {
95
+ const handleKeyDown = (event) => {
96
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
97
+ event.preventDefault();
98
+ toggleSidebar();
99
+ }
100
+ };
101
+ window.addEventListener("keydown", handleKeyDown);
102
+ return () => {
103
+ window.removeEventListener("keydown", handleKeyDown);
104
+ };
105
+ }, [toggleSidebar]);
106
+ // We add a state so that we can do data-state="expanded" or "collapsed".
107
+ // This makes it easier to style the sidebar with Tailwind classes.
108
+ const state = open ? "expanded" : "collapsed";
109
+ return (_jsx(SidebarContextProvider, { isMobile: isMobile, open: open, openMobile: openMobile, setOpen: setOpen, setOpenMobile: setOpenMobile, state: state, toggleSidebar: toggleSidebar, children: _jsx(TooltipProvider, { delayDuration: 0, children: _jsx("div", { className: cn("group/sidebar-wrapper flex min-h-svh w-full", "has-data-[variant=inset]:bg-sidebar", className), "data-slot": "sidebar-wrapper", style: {
110
+ "--sidebar-width": SIDEBAR_WIDTH,
111
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
112
+ ...style,
113
+ }, ...props, children: children }) }) }));
114
+ }
115
+ /* -----------------------------------------------------------------------------
116
+ * Component: Sidebar
117
+ * -------------------------------------------------------------------------- */
92
118
  const SIDEBAR_NAME = "Sidebar";
93
119
  function Sidebar({ children, className, collapsible = "offcanvas", side = "left", variant = "sidebar", ...props }) {
94
- const { isMobile, openMobile, setOpenMobile, state } = useSidebar(SIDEBAR_NAME);
95
- if (collapsible === "none") return /* @__PURE__ */ jsx("div", {
96
- className: cn("flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground", className),
97
- "data-slot": "sidebar",
98
- ...props,
99
- children
100
- });
101
- if (isMobile) return /* @__PURE__ */ jsx(Sheet, {
102
- open: openMobile,
103
- onOpenChange: setOpenMobile,
104
- ...props,
105
- children: /* @__PURE__ */ jsxs(SheetContent, {
106
- className: "w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",
107
- "data-mobile": "true",
108
- "data-sidebar": "sidebar",
109
- "data-slot": "sidebar",
110
- side,
111
- style: { "--sidebar-width": SIDEBAR_WIDTH_MOBILE },
112
- children: [/* @__PURE__ */ jsxs(SheetHeader, {
113
- className: "sr-only",
114
- children: [/* @__PURE__ */ jsx(SheetTitle, { children: "Sidebar" }), /* @__PURE__ */ jsx(SheetDescription, { children: "Displays the mobile sidebar." })]
115
- }), /* @__PURE__ */ jsx("div", {
116
- className: "flex h-full w-full flex-col",
117
- children
118
- })]
119
- })
120
- });
121
- return /* @__PURE__ */ jsxs("div", {
122
- className: cn("group peer hidden text-sidebar-foreground md:block", className),
123
- "data-collapsible": state === "collapsed" ? collapsible : "",
124
- "data-side": side,
125
- "data-slot": "sidebar",
126
- "data-state": state,
127
- "data-variant": variant,
128
- children: [/* @__PURE__ */ jsx("div", {
129
- className: cn("relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear group-data-[collapsible=offcanvas]:w-0 group-data-[side=right]:rotate-180", variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"),
130
- "data-slot": "sidebar-gap"
131
- }), /* @__PURE__ */ jsx("div", {
132
- className: cn("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex", 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)]", 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", className),
133
- "data-slot": "sidebar-container",
134
- ...props,
135
- children: /* @__PURE__ */ jsx("div", {
136
- 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",
137
- "data-sidebar": "sidebar",
138
- "data-slot": "sidebar-inner",
139
- children
140
- })
141
- })]
142
- });
143
- }
120
+ const { isMobile, openMobile, setOpenMobile, state } = useSidebar(SIDEBAR_NAME);
121
+ if (collapsible === "none") {
122
+ return (_jsx("div", { className: cn("flex h-full w-(--sidebar-width) flex-col", "bg-sidebar text-sidebar-foreground", className), "data-slot": "sidebar", ...props, children: children }));
123
+ }
124
+ if (isMobile) {
125
+ return (_jsx(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: _jsxs(SheetContent, { className: cn("w-(--sidebar-width) p-0", "bg-sidebar text-sidebar-foreground", "[&>button]:hidden"), "data-mobile": "true", "data-sidebar": "sidebar", "data-slot": "sidebar", side: side, style: {
126
+ "--sidebar-width": SIDEBAR_WIDTH_MOBILE,
127
+ }, children: [_jsxs(SheetHeader, { className: "sr-only", children: [_jsx(SheetTitle, { children: "Sidebar" }), _jsx(SheetDescription, { children: "Displays the mobile sidebar." })] }), _jsx("div", { className: "flex h-full w-full flex-col", children: children })] }) }));
128
+ }
129
+ return (_jsxs("div", { className: cn("group peer hidden", "text-sidebar-foreground", "md:block", className), "data-collapsible": state === "collapsed" ? collapsible : "", "data-side": side, "data-slot": "sidebar", "data-state": state, "data-variant": variant, children: [_jsx("div", { className: cn("relative", "w-(--sidebar-width)", "bg-transparent", "transition-[width] duration-200 ease-linear", "group-data-[collapsible=offcanvas]:w-0", "group-data-side-right:rotate-180", variant === "floating" || variant === "inset"
130
+ ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]"
131
+ : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"), "data-slot": "sidebar-gap" }), _jsx("div", { className: cn("fixed inset-y-0 z-10 hidden", "h-svh w-(--sidebar-width)", "transition-[left,right,width] duration-200 ease-linear", "md:flex", side === "left"
132
+ ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
133
+ : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]", variant === "floating" || variant === "inset"
134
+ ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]"
135
+ : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-side-right:border-l group-data-side-left:border-r", className), "data-slot": "sidebar-container", ...props, children: _jsx("div", { className: cn("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"), "data-sidebar": "sidebar", "data-slot": "sidebar-inner", children: children }) })] }));
136
+ }
137
+ /* -----------------------------------------------------------------------------
138
+ * Component: SidebarTrigger
139
+ * -------------------------------------------------------------------------- */
144
140
  const SIDEBAR_TRIGGER_NAME = "SidebarTrigger";
145
141
  function SidebarTrigger({ className, onClick, ...props }) {
146
- const { toggleSidebar } = useSidebar(SIDEBAR_TRIGGER_NAME);
147
- return /* @__PURE__ */ jsxs(Button, {
148
- className: cn("size-7", className),
149
- "data-sidebar": "trigger",
150
- "data-slot": "sidebar-trigger",
151
- size: "icon",
152
- variant: "ghost",
153
- onClick: (event) => {
154
- onClick?.(event);
155
- toggleSidebar();
156
- },
157
- ...props,
158
- children: [/* @__PURE__ */ jsx(PanelLeftIcon, {}), /* @__PURE__ */ jsx("span", {
159
- className: "sr-only",
160
- children: "Toggle Sidebar"
161
- })]
162
- });
163
- }
142
+ const { toggleSidebar } = useSidebar(SIDEBAR_TRIGGER_NAME);
143
+ return (_jsxs(Button, { className: cn("size-7", className), "data-sidebar": "trigger", "data-slot": "sidebar-trigger", size: "icon", variant: "ghost", onClick: (event) => {
144
+ onClick?.(event);
145
+ toggleSidebar();
146
+ }, ...props, children: [_jsx(PanelLeftIcon, {}), _jsx("span", { className: "sr-only", children: "Toggle Sidebar" })] }));
147
+ }
148
+ /* -----------------------------------------------------------------------------
149
+ * Component: SidebarRail
150
+ * -------------------------------------------------------------------------- */
164
151
  const SIDEBAR_RAIL_NAME = "SidebarRail";
165
152
  function SidebarRail({ className, ...props }) {
166
- const { toggleSidebar } = useSidebar(SIDEBAR_RAIL_NAME);
167
- return /* @__PURE__ */ jsx("button", {
168
- className: cn("absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[collapsible=offcanvas]:translate-x-0 group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-0.5 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar hover:after:bg-sidebar-border in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize sm:flex [[data-side=left][data-collapsible=offcanvas]_&]:-right-2 [[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-collapsible=offcanvas]_&]:-left-2 [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", className),
169
- "data-sidebar": "rail",
170
- "data-slot": "sidebar-rail",
171
- title: "Toggle Sidebar",
172
- type: "button",
173
- onClick: toggleSidebar,
174
- ...props
175
- });
153
+ const { toggleSidebar } = useSidebar(SIDEBAR_RAIL_NAME);
154
+ return (_jsx("button", { className: cn("absolute inset-y-0 z-20 hidden", "w-4 -translate-x-1/2 transition-all ease-linear", "in-data-side-right:cursor-e-resize", "in-data-side-left:cursor-w-resize", "group-data-[collapsible=offcanvas]:translate-x-0", "group-data-side-right:left-0", "group-data-side-left:-right-4", "after:absolute after:inset-y-0 after:left-1/2 after:w-0.5", "group-data-[collapsible=offcanvas]:after:left-full", "hover:group-data-[collapsible=offcanvas]:bg-sidebar", "hover:after:bg-sidebar-border", "sm:flex", "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize", "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", "[[data-side=right][data-state=collapsed]_&]:cursor-w-resize", className), "data-sidebar": "rail", "data-slot": "sidebar-rail", title: "Toggle Sidebar", type: "button", onClick: toggleSidebar, ...props }));
176
155
  }
177
156
  function SidebarInset({ className, ...props }) {
178
- return /* @__PURE__ */ jsx("main", {
179
- className: cn("relative flex w-full min-w-0 flex-1 flex-col bg-background 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", className),
180
- "data-slot": "sidebar-inset",
181
- ...props
182
- });
157
+ return (_jsx("main", { className: cn("relative flex w-full min-w-0 flex-1 flex-col", "bg-background", "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", className), "data-slot": "sidebar-inset", ...props }));
183
158
  }
184
159
  function SidebarInput({ className, ...props }) {
185
- return /* @__PURE__ */ jsx(Input, {
186
- className: cn("h-8 w-full bg-background shadow-none", className),
187
- "data-sidebar": "input",
188
- "data-slot": "sidebar-input",
189
- ...props
190
- });
160
+ return (_jsx(Input, { className: cn("h-8 w-full", "bg-background shadow-none", className), "data-sidebar": "input", "data-slot": "sidebar-input", ...props }));
191
161
  }
192
162
  function SidebarHeader({ className, ...props }) {
193
- return /* @__PURE__ */ jsx("div", {
194
- className: cn("flex flex-col gap-2 p-2", className),
195
- "data-sidebar": "header",
196
- "data-slot": "sidebar-header",
197
- ...props
198
- });
163
+ return (_jsx("div", { className: cn("flex flex-col gap-2", "p-2", className), "data-sidebar": "header", "data-slot": "sidebar-header", ...props }));
199
164
  }
200
165
  function SidebarFooter({ className, ...props }) {
201
- return /* @__PURE__ */ jsx("div", {
202
- className: cn("flex flex-col gap-2 p-2", className),
203
- "data-sidebar": "footer",
204
- "data-slot": "sidebar-footer",
205
- ...props
206
- });
166
+ return (_jsx("div", { className: cn("flex flex-col gap-2", "p-2", className), "data-sidebar": "footer", "data-slot": "sidebar-footer", ...props }));
207
167
  }
208
168
  function SidebarSeparator({ className, ...props }) {
209
- return /* @__PURE__ */ jsx(Separator, {
210
- className: cn("mx-2 w-auto bg-sidebar-border", className),
211
- "data-sidebar": "separator",
212
- "data-slot": "sidebar-separator",
213
- ...props
214
- });
169
+ return (_jsx(Separator, { className: cn("mx-2 w-auto", "bg-sidebar-border", className), "data-sidebar": "separator", "data-slot": "sidebar-separator", ...props }));
215
170
  }
216
171
  function SidebarContent({ className, ...props }) {
217
- return /* @__PURE__ */ jsx("div", {
218
- className: cn("flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", className),
219
- "data-sidebar": "content",
220
- "data-slot": "sidebar-content",
221
- ...props
222
- });
172
+ return (_jsx("div", { className: cn("flex min-h-0 flex-1 flex-col gap-2 overflow-auto", "group-data-[collapsible=icon]:overflow-hidden", className), "data-sidebar": "content", "data-slot": "sidebar-content", ...props }));
223
173
  }
224
174
  function SidebarGroup({ className, ...props }) {
225
- return /* @__PURE__ */ jsx("div", {
226
- className: cn("relative flex w-full min-w-0 flex-col p-2", className),
227
- "data-sidebar": "group",
228
- "data-slot": "sidebar-group",
229
- ...props
230
- });
175
+ return (_jsx("div", { className: cn("relative flex w-full min-w-0 flex-col", "p-2", className), "data-sidebar": "group", "data-slot": "sidebar-group", ...props }));
231
176
  }
232
177
  function SidebarGroupLabel({ asChild = false, className, ...props }) {
233
- return /* @__PURE__ */ jsx(asChild ? Slot : "div", {
234
- className: cn("flex h-8 shrink-0 items-center truncate rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-3 [&>svg]:size-4 [&>svg]:shrink-0", className),
235
- "data-sidebar": "group-label",
236
- "data-slot": "sidebar-group-label",
237
- ...props
238
- });
178
+ const Component = asChild ? Slot : "div";
179
+ return (_jsx(Component, { className: cn("flex h-8 shrink-0 items-center px-2", "rounded-md ring-sidebar-ring outline-hidden", "truncate text-xs font-medium text-sidebar-foreground/70", "transition-[margin,opacity] duration-200 ease-linear", "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0", "focus-visible:ring-3", "[&>svg]:size-4 [&>svg]:shrink-0", className), "data-sidebar": "group-label", "data-slot": "sidebar-group-label", ...props }));
239
180
  }
240
181
  function SidebarGroupAction({ asChild = false, className, ...props }) {
241
- return /* @__PURE__ */ jsx(asChild ? Slot : "button", {
242
- className: cn("absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-3 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0", className),
243
- "data-sidebar": "group-action",
244
- "data-slot": "sidebar-group-action",
245
- ...props
246
- });
182
+ const Component = asChild ? Slot : "button";
183
+ return (_jsx(Component, { className: cn("absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center p-0", "rounded-md ring-sidebar-ring outline-hidden", "text-sidebar-foreground", "transition-transform", "group-data-[collapsible=icon]:hidden", "after:absolute after:-inset-2", "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", "focus-visible:ring-3", "md:after:hidden", "[&>svg]:size-4 [&>svg]:shrink-0", className), "data-sidebar": "group-action", "data-slot": "sidebar-group-action", ...props }));
247
184
  }
248
185
  function SidebarGroupContent({ className, ...props }) {
249
- return /* @__PURE__ */ jsx("div", {
250
- className: cn("w-full text-sm", className),
251
- "data-sidebar": "group-content",
252
- "data-slot": "sidebar-group-content",
253
- ...props
254
- });
186
+ return (_jsx("div", { className: cn("w-full", "text-sm", className), "data-sidebar": "group-content", "data-slot": "sidebar-group-content", ...props }));
255
187
  }
256
188
  function SidebarMenu({ className, ...props }) {
257
- return /* @__PURE__ */ jsx("ul", {
258
- className: cn("flex w-full min-w-0 flex-col gap-1", className),
259
- "data-sidebar": "menu",
260
- "data-slot": "sidebar-menu",
261
- ...props
262
- });
189
+ return (_jsx("ul", { className: cn("flex w-full min-w-0 flex-col gap-1", className), "data-sidebar": "menu", "data-slot": "sidebar-menu", ...props }));
263
190
  }
264
191
  function SidebarMenuItem({ className, ...props }) {
265
- return /* @__PURE__ */ jsx("li", {
266
- className: cn("group/menu-item relative", className),
267
- "data-sidebar": "menu-item",
268
- "data-slot": "sidebar-menu-item",
269
- ...props
270
- });
192
+ return (_jsx("li", { className: cn("group/menu-item relative", className), "data-sidebar": "menu-item", "data-slot": "sidebar-menu-item", ...props }));
271
193
  }
194
+ /* -----------------------------------------------------------------------------
195
+ * Component: SidebarMenuButton
196
+ * -------------------------------------------------------------------------- */
272
197
  const SIDEBAR_MENU_BUTTON_NAME = "SidebarMenuButton";
273
198
  function SidebarMenuButton({ asChild = false, className, isActive = false, size = "md", tooltip, variant = "default", ...props }) {
274
- const Component = asChild ? Slot : "button";
275
- const { isMobile, state } = useSidebar(SIDEBAR_MENU_BUTTON_NAME);
276
- const button = /* @__PURE__ */ jsx(Component, {
277
- className: cn(sidebarMenuButtonVariants({
278
- size,
279
- variant
280
- }), className),
281
- "data-active": isActive,
282
- "data-sidebar": "menu-button",
283
- "data-size": size,
284
- "data-slot": "sidebar-menu-button",
285
- ...props
286
- });
287
- if (!tooltip) return button;
288
- if (typeof tooltip === "string") tooltip = { children: tooltip };
289
- return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
290
- asChild: true,
291
- children: button
292
- }), /* @__PURE__ */ jsx(TooltipContent, {
293
- align: "center",
294
- hidden: state !== "collapsed" || isMobile,
295
- side: "right",
296
- ...tooltip
297
- })] });
199
+ const Component = asChild ? Slot : "button";
200
+ const { isMobile, state } = useSidebar(SIDEBAR_MENU_BUTTON_NAME);
201
+ const button = (_jsx(Component, { className: cn(sidebarMenuButtonVariants({ size, variant }), className), "data-active": isActive, "data-sidebar": "menu-button", "data-size": size, "data-slot": "sidebar-menu-button", ...props }));
202
+ if (!tooltip) {
203
+ return button;
204
+ }
205
+ if (typeof tooltip === "string") {
206
+ tooltip = {
207
+ children: tooltip,
208
+ };
209
+ }
210
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: button }), _jsx(TooltipContent, { align: "center", hidden: state !== "collapsed" || isMobile, side: "right", ...tooltip })] }));
298
211
  }
299
212
  function SidebarMenuAction({ asChild = false, className, showOnHover = false, ...props }) {
300
- return /* @__PURE__ */ jsx(asChild ? Slot : "button", {
301
- className: cn("absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-3 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0", showOnHover && "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground data-[state=open]:opacity-100 md:opacity-0", className),
302
- "data-sidebar": "menu-action",
303
- "data-slot": "sidebar-menu-action",
304
- ...props
305
- });
213
+ const Component = asChild ? Slot : "button";
214
+ return (_jsx(Component, { className: cn("absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center p-0", "rounded-md ring-sidebar-ring outline-hidden", "text-sidebar-foreground", "transition-transform", "group-data-[collapsible=icon]:hidden", "peer-hover/menu-button:text-sidebar-accent-foreground", "peer-data-[size=default]/menu-button:top-1.5", "peer-data-[size=lg]/menu-button:top-2.5", "peer-data-[size=sm]/menu-button:top-1", "after:absolute after:-inset-2", "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", "focus-visible:ring-3", "md:after:hidden", "[&>svg]:size-4 [&>svg]:shrink-0", showOnHover &&
215
+ "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground md:opacity-0 data-open:opacity-100", className), "data-sidebar": "menu-action", "data-slot": "sidebar-menu-action", ...props }));
306
216
  }
307
217
  function SidebarMenuBadge({ className, ...props }) {
308
- return /* @__PURE__ */ jsx("div", {
309
- className: cn("pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1", className),
310
- "data-sidebar": "menu-badge",
311
- "data-slot": "sidebar-menu-badge",
312
- ...props
313
- });
218
+ return (_jsx("div", { className: cn("absolute right-1 flex h-5 min-w-5 items-center justify-center px-1", "rounded-md", "text-xs font-medium text-sidebar-foreground tabular-nums", "pointer-events-none select-none", "group-data-[collapsible=icon]:hidden", "peer-hover/menu-button:text-sidebar-accent-foreground", "peer-data-[size=default]/menu-button:top-1.5", "peer-data-[size=lg]/menu-button:top-2.5", "peer-data-[size=sm]/menu-button:top-1", "peer-data-active/menu-button:text-sidebar-accent-foreground", className), "data-sidebar": "menu-badge", "data-slot": "sidebar-menu-badge", ...props }));
314
219
  }
315
220
  function SidebarMenuSkeleton({ className, showIcon = false, ...props }) {
316
- const [width] = useState(() => `${String(Math.floor(Math.random() * 40) + 50)}%`);
317
- return /* @__PURE__ */ jsxs("div", {
318
- className: cn("flex h-8 items-center gap-2 rounded-md px-2", className),
319
- "data-sidebar": "menu-skeleton",
320
- "data-slot": "sidebar-menu-skeleton",
321
- ...props,
322
- children: [showIcon ? /* @__PURE__ */ jsx(Skeleton, {
323
- className: "size-4 rounded-md",
324
- "data-sidebar": "menu-skeleton-icon"
325
- }) : null, /* @__PURE__ */ jsx(Skeleton, {
326
- className: "h-4 max-w-(--skeleton-width) flex-1",
327
- "data-sidebar": "menu-skeleton-text",
328
- style: { "--skeleton-width": width }
329
- })]
330
- });
221
+ // Random width between 50 to 90% - use useState with lazy initializer to avoid calling Math.random during render
222
+ const [width] = useState(() => `${String(Math.floor(Math.random() * 40) + 50)}%`);
223
+ return (_jsxs("div", { className: cn("flex h-8 items-center gap-2 px-2", "rounded-md", className), "data-sidebar": "menu-skeleton", "data-slot": "sidebar-menu-skeleton", ...props, children: [showIcon ? (_jsx(Skeleton, { className: cn("size-4", "rounded-md"), "data-sidebar": "menu-skeleton-icon" })) : null, _jsx(Skeleton, { className: "h-4 max-w-(--skeleton-width) flex-1", "data-sidebar": "menu-skeleton-text", style: {
224
+ "--skeleton-width": width,
225
+ } })] }));
331
226
  }
332
227
  function SidebarMenuSub({ className, ...props }) {
333
- return /* @__PURE__ */ jsx("ul", {
334
- className: cn("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 group-data-[collapsible=icon]:hidden", className),
335
- "data-sidebar": "menu-sub",
336
- "data-slot": "sidebar-menu-sub",
337
- ...props
338
- });
228
+ return (_jsx("ul", { className: cn("mx-3.5 flex min-w-0 flex-col gap-1 px-2.5 py-0.5", "border-l border-sidebar-border", "translate-x-px", "group-data-[collapsible=icon]:hidden", className), "data-sidebar": "menu-sub", "data-slot": "sidebar-menu-sub", ...props }));
339
229
  }
340
230
  function SidebarMenuSubItem({ className, ...props }) {
341
- return /* @__PURE__ */ jsx("li", {
342
- className: cn("group/menu-sub-item relative", className),
343
- "data-sidebar": "menu-sub-item",
344
- "data-slot": "sidebar-menu-sub-item",
345
- ...props
346
- });
231
+ return (_jsx("li", { className: cn("group/menu-sub-item relative", className), "data-sidebar": "menu-sub-item", "data-slot": "sidebar-menu-sub-item", ...props }));
347
232
  }
348
233
  function SidebarMenuSubButton({ asChild = false, className, isActive = false, size = "md", ...props }) {
349
- return /* @__PURE__ */ jsx(asChild ? Slot : "a", {
350
- className: cn("flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-3 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]:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground", size === "sm" && "text-xs", size === "md" && "text-sm", "group-data-[collapsible=icon]:hidden", className),
351
- "data-active": isActive,
352
- "data-sidebar": "menu-sub-button",
353
- "data-size": size,
354
- "data-slot": "sidebar-menu-sub-button",
355
- ...props
356
- });
357
- }
358
- //#endregion
359
- export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, sidebarMenuButtonVariants, useSidebar };
234
+ const Component = asChild ? Slot : "a";
235
+ return (_jsx(Component, { className: cn("flex h-7 min-w-0 items-center gap-2 overflow-hidden px-2", "rounded-md ring-sidebar-ring outline-hidden", "text-sidebar-foreground", "-translate-x-px", "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", "focus-visible:ring-3", "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:bg-sidebar-accent data-active:text-sidebar-accent-foreground", "group-data-[collapsible=icon]:hidden", "[&>span:last-child]:truncate", "[&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground", size === "sm" && "text-xs", size === "md" && "text-sm", className), "data-active": isActive, "data-sidebar": "menu-sub-button", "data-size": size, "data-slot": "sidebar-menu-sub-button", ...props }));
236
+ }
237
+ /* -----------------------------------------------------------------------------
238
+ * Exports
239
+ * -------------------------------------------------------------------------- */
240
+ export { sidebarMenuButtonVariants };
241
+ export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, };
@@ -1,10 +1,6 @@
1
- import { ComponentProps, JSX } from "react";
2
-
3
- //#region src/components/skeleton.d.ts
1
+ import type { ComponentProps, JSX } from "react";
4
2
  type SkeletonProps = ComponentProps<"div">;
5
- declare function Skeleton({
6
- className,
7
- ...props
8
- }: SkeletonProps): JSX.Element;
9
- //#endregion
10
- export { Skeleton, type SkeletonProps };
3
+ declare function Skeleton({ className, ...props }: SkeletonProps): JSX.Element;
4
+ export { Skeleton };
5
+ export type { SkeletonProps };
6
+ //# sourceMappingURL=skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../src/components/skeleton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAQjD,KAAK,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAE3C,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CAQrE;AAMD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -1,12 +1,9 @@
1
- import { cn } from "@codefast/tailwind-variants";
2
- import { jsx } from "react/jsx-runtime";
3
- //#region src/components/skeleton.tsx
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "#lib/utils";
4
3
  function Skeleton({ className, ...props }) {
5
- return /* @__PURE__ */ jsx("div", {
6
- className: cn("animate-pulse rounded-lg bg-muted", className),
7
- "data-slot": "skeleton",
8
- ...props
9
- });
4
+ return (_jsx("div", { className: cn("rounded-lg", "bg-muted", "animate-pulse", className), "data-slot": "skeleton", ...props }));
10
5
  }
11
- //#endregion
6
+ /* -----------------------------------------------------------------------------
7
+ * Exports
8
+ * -------------------------------------------------------------------------- */
12
9
  export { Skeleton };