@waveso/ui 0.0.9 → 0.1.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 (288) hide show
  1. package/dist/accordion.d.ts +24 -8
  2. package/dist/accordion.d.ts.map +1 -0
  3. package/dist/accordion.js +50 -73
  4. package/dist/accordion.js.map +1 -1
  5. package/dist/action-bar.d.ts +83 -0
  6. package/dist/action-bar.d.ts.map +1 -0
  7. package/dist/action-bar.js +264 -0
  8. package/dist/action-bar.js.map +1 -0
  9. package/dist/alert-dialog.d.ts +56 -21
  10. package/dist/alert-dialog.d.ts.map +1 -0
  11. package/dist/alert-dialog.js +75 -127
  12. package/dist/alert-dialog.js.map +1 -1
  13. package/dist/alert.d.ts +26 -11
  14. package/dist/alert.d.ts.map +1 -0
  15. package/dist/alert.js +37 -68
  16. package/dist/alert.js.map +1 -1
  17. package/dist/animate.d.ts +117 -75
  18. package/dist/animate.d.ts.map +1 -0
  19. package/dist/animate.js +259 -223
  20. package/dist/animate.js.map +1 -1
  21. package/dist/aspect-ratio.d.ts +11 -6
  22. package/dist/aspect-ratio.d.ts.map +1 -0
  23. package/dist/aspect-ratio.js +12 -14
  24. package/dist/aspect-ratio.js.map +1 -1
  25. package/dist/autocomplete.d.ts +91 -25
  26. package/dist/autocomplete.d.ts.map +1 -0
  27. package/dist/autocomplete.js +119 -181
  28. package/dist/autocomplete.js.map +1 -1
  29. package/dist/avatar.d.ts +32 -11
  30. package/dist/avatar.d.ts.map +1 -0
  31. package/dist/avatar.js +42 -89
  32. package/dist/avatar.js.map +1 -1
  33. package/dist/badge.d.ts +15 -8
  34. package/dist/badge.d.ts.map +1 -0
  35. package/dist/badge.js +34 -48
  36. package/dist/badge.js.map +1 -1
  37. package/dist/breadcrumb.d.ts +35 -11
  38. package/dist/breadcrumb.d.ts.map +1 -0
  39. package/dist/breadcrumb.js +60 -110
  40. package/dist/breadcrumb.js.map +1 -1
  41. package/dist/button-group.d.ts +26 -13
  42. package/dist/button-group.d.ts.map +1 -0
  43. package/dist/button-group.js +38 -76
  44. package/dist/button-group.js.map +1 -1
  45. package/dist/button.d.ts +17 -10
  46. package/dist/button.d.ts.map +1 -0
  47. package/dist/button.js +50 -3
  48. package/dist/button.js.map +1 -1
  49. package/dist/card.d.ts +35 -11
  50. package/dist/card.d.ts.map +1 -0
  51. package/dist/card.js +43 -82
  52. package/dist/card.js.map +1 -1
  53. package/dist/checkbox.d.ts +6 -4
  54. package/dist/checkbox.d.ts.map +1 -0
  55. package/dist/checkbox.js +21 -29
  56. package/dist/checkbox.js.map +1 -1
  57. package/dist/collapsible.d.ts +15 -7
  58. package/dist/collapsible.d.ts.map +1 -0
  59. package/dist/collapsible.js +19 -8
  60. package/dist/collapsible.js.map +1 -1
  61. package/dist/combobox.d.ts +83 -23
  62. package/dist/combobox.d.ts.map +1 -0
  63. package/dist/combobox.js +149 -247
  64. package/dist/combobox.js.map +1 -1
  65. package/dist/context-menu.d.ts +80 -26
  66. package/dist/context-menu.d.ts.map +1 -0
  67. package/dist/context-menu.js +108 -164
  68. package/dist/context-menu.js.map +1 -1
  69. package/dist/count.d.ts +45 -31
  70. package/dist/count.d.ts.map +1 -0
  71. package/dist/count.js +170 -165
  72. package/dist/count.js.map +1 -1
  73. package/dist/dialog.d.ts +61 -28
  74. package/dist/dialog.d.ts.map +1 -0
  75. package/dist/dialog.js +77 -120
  76. package/dist/dialog.js.map +1 -1
  77. package/dist/direction.d.ts +2 -1
  78. package/dist/direction.js +3 -3
  79. package/dist/drawer.d.ts +45 -15
  80. package/dist/drawer.d.ts.map +1 -0
  81. package/dist/drawer.js +93 -5
  82. package/dist/drawer.js.map +1 -1
  83. package/dist/encrypted-text.d.ts +25 -12
  84. package/dist/encrypted-text.d.ts.map +1 -0
  85. package/dist/encrypted-text.js +102 -134
  86. package/dist/encrypted-text.js.map +1 -1
  87. package/dist/field.d.ts +37 -21
  88. package/dist/field.d.ts.map +1 -0
  89. package/dist/field.js +52 -3
  90. package/dist/field.js.map +1 -1
  91. package/dist/film-grain-shader.d.ts +6 -0
  92. package/dist/film-grain-shader.d.ts.map +1 -0
  93. package/dist/film-grain-shader.js +88 -0
  94. package/dist/film-grain-shader.js.map +1 -0
  95. package/dist/film-grain-webgl.d.ts +20 -0
  96. package/dist/film-grain-webgl.d.ts.map +1 -0
  97. package/dist/film-grain-webgl.js +306 -0
  98. package/dist/film-grain-webgl.js.map +1 -0
  99. package/dist/film-grain.d.ts +21 -11
  100. package/dist/film-grain.d.ts.map +1 -0
  101. package/dist/film-grain.js +28 -420
  102. package/dist/film-grain.js.map +1 -1
  103. package/dist/form.d.ts +64 -49
  104. package/dist/form.d.ts.map +1 -0
  105. package/dist/form.js +112 -91
  106. package/dist/form.js.map +1 -1
  107. package/dist/gradient-reveal-text.d.ts +35 -18
  108. package/dist/gradient-reveal-text.d.ts.map +1 -0
  109. package/dist/gradient-reveal-text.js +238 -202
  110. package/dist/gradient-reveal-text.js.map +1 -1
  111. package/dist/hooks/use-mobile.d.ts +3 -1
  112. package/dist/hooks/use-mobile.d.ts.map +1 -0
  113. package/dist/hooks/use-mobile.js +28 -2
  114. package/dist/hooks/use-mobile.js.map +1 -1
  115. package/dist/infinite-scroll.d.ts +29 -15
  116. package/dist/infinite-scroll.d.ts.map +1 -0
  117. package/dist/infinite-scroll.js +69 -99
  118. package/dist/infinite-scroll.js.map +1 -1
  119. package/dist/input-group.d.ts +41 -18
  120. package/dist/input-group.d.ts.map +1 -0
  121. package/dist/input-group.js +80 -6
  122. package/dist/input-group.js.map +1 -1
  123. package/dist/input-otp.d.ts +26 -10
  124. package/dist/input-otp.d.ts.map +1 -0
  125. package/dist/input-otp.js +40 -70
  126. package/dist/input-otp.js.map +1 -1
  127. package/dist/input.d.ts +10 -4
  128. package/dist/input.d.ts.map +1 -0
  129. package/dist/input.js +16 -3
  130. package/dist/input.js.map +1 -1
  131. package/dist/item.d.ts +58 -23
  132. package/dist/item.d.ts.map +1 -0
  133. package/dist/item.js +102 -160
  134. package/dist/item.js.map +1 -1
  135. package/dist/kbd.d.ts +12 -4
  136. package/dist/kbd.d.ts.map +1 -0
  137. package/dist/kbd.js +15 -24
  138. package/dist/kbd.js.map +1 -1
  139. package/dist/label.d.ts +9 -4
  140. package/dist/label.d.ts.map +1 -0
  141. package/dist/label.js +12 -16
  142. package/dist/label.js.map +1 -1
  143. package/dist/lib/focus.d.ts +42 -0
  144. package/dist/lib/focus.d.ts.map +1 -0
  145. package/dist/lib/focus.js +21 -0
  146. package/dist/lib/focus.js.map +1 -0
  147. package/dist/lib/internal-icons.d.ts +32 -0
  148. package/dist/lib/internal-icons.d.ts.map +1 -0
  149. package/dist/lib/internal-icons.js +222 -0
  150. package/dist/lib/internal-icons.js.map +1 -0
  151. package/dist/lib/utils.d.ts +4 -2
  152. package/dist/lib/utils.d.ts.map +1 -0
  153. package/dist/lib/utils.js +12 -2
  154. package/dist/lib/utils.js.map +1 -1
  155. package/dist/masonry.d.ts +25 -11
  156. package/dist/masonry.d.ts.map +1 -0
  157. package/dist/masonry.js +188 -229
  158. package/dist/masonry.js.map +1 -1
  159. package/dist/menu.d.ts +84 -26
  160. package/dist/menu.d.ts.map +1 -0
  161. package/dist/menu.js +141 -4
  162. package/dist/menu.js.map +1 -1
  163. package/dist/menubar.d.ts +60 -22
  164. package/dist/menubar.d.ts.map +1 -0
  165. package/dist/menubar.js +80 -52
  166. package/dist/menubar.js.map +1 -1
  167. package/dist/pagination.d.ts +38 -17
  168. package/dist/pagination.d.ts.map +1 -0
  169. package/dist/pagination.js +68 -107
  170. package/dist/pagination.js.map +1 -1
  171. package/dist/popover.d.ts +56 -14
  172. package/dist/popover.d.ts.map +1 -0
  173. package/dist/popover.js +62 -87
  174. package/dist/popover.js.map +1 -1
  175. package/dist/preview-card.d.ts +28 -9
  176. package/dist/preview-card.d.ts.map +1 -0
  177. package/dist/preview-card.js +40 -60
  178. package/dist/preview-card.js.map +1 -1
  179. package/dist/progress.d.ts +28 -9
  180. package/dist/progress.d.ts.map +1 -0
  181. package/dist/progress.js +35 -60
  182. package/dist/progress.js.map +1 -1
  183. package/dist/radio-group.d.ts +14 -8
  184. package/dist/radio-group.d.ts.map +1 -0
  185. package/dist/radio-group.js +18 -22
  186. package/dist/radio-group.js.map +1 -1
  187. package/dist/radio.d.ts +14 -6
  188. package/dist/radio.d.ts.map +1 -0
  189. package/dist/radio.js +24 -3
  190. package/dist/radio.js.map +1 -1
  191. package/dist/scroll-area.d.ts +16 -6
  192. package/dist/scroll-area.d.ts.map +1 -0
  193. package/dist/scroll-area.js +34 -55
  194. package/dist/scroll-area.js.map +1 -1
  195. package/dist/select.d.ts +66 -18
  196. package/dist/select.d.ts.map +1 -0
  197. package/dist/select.js +105 -185
  198. package/dist/select.js.map +1 -1
  199. package/dist/separator.d.ts +11 -5
  200. package/dist/separator.d.ts.map +1 -0
  201. package/dist/separator.js +17 -3
  202. package/dist/separator.js.map +1 -1
  203. package/dist/sidebar.d.ts +172 -79
  204. package/dist/sidebar.d.ts.map +1 -0
  205. package/dist/sidebar.js +363 -585
  206. package/dist/sidebar.js.map +1 -1
  207. package/dist/skeleton.d.ts +8 -3
  208. package/dist/skeleton.d.ts.map +1 -0
  209. package/dist/skeleton.js +13 -3
  210. package/dist/skeleton.js.map +1 -1
  211. package/dist/slider.d.ts +16 -6
  212. package/dist/slider.d.ts.map +1 -0
  213. package/dist/slider.js +40 -67
  214. package/dist/slider.js.map +1 -1
  215. package/dist/spinner.d.ts +8 -3
  216. package/dist/spinner.d.ts.map +1 -0
  217. package/dist/spinner.js +15 -4
  218. package/dist/spinner.js.map +1 -1
  219. package/dist/switch.d.ts +12 -6
  220. package/dist/switch.d.ts.map +1 -0
  221. package/dist/switch.js +18 -25
  222. package/dist/switch.js.map +1 -1
  223. package/dist/table.d.ts +37 -11
  224. package/dist/table.d.ts.map +1 -0
  225. package/dist/table.js +51 -88
  226. package/dist/table.js.map +1 -1
  227. package/dist/tabs.d.ts +28 -12
  228. package/dist/tabs.d.ts.map +1 -0
  229. package/dist/tabs.js +40 -74
  230. package/dist/tabs.js.map +1 -1
  231. package/dist/textarea.d.ts +13 -6
  232. package/dist/textarea.d.ts.map +1 -0
  233. package/dist/textarea.js +19 -3
  234. package/dist/textarea.js.map +1 -1
  235. package/dist/toast.d.ts +63 -39
  236. package/dist/toast.d.ts.map +1 -0
  237. package/dist/toast.js +177 -215
  238. package/dist/toast.js.map +1 -1
  239. package/dist/toggle-group.d.ts +26 -12
  240. package/dist/toggle-group.d.ts.map +1 -0
  241. package/dist/toggle-group.js +49 -73
  242. package/dist/toggle-group.js.map +1 -1
  243. package/dist/toggle.d.ts +17 -10
  244. package/dist/toggle.d.ts.map +1 -0
  245. package/dist/toggle.js +38 -3
  246. package/dist/toggle.js.map +1 -1
  247. package/dist/tooltip.d.ts +35 -14
  248. package/dist/tooltip.d.ts.map +1 -0
  249. package/dist/tooltip.js +52 -3
  250. package/dist/tooltip.js.map +1 -1
  251. package/dist/typewriter.d.ts +44 -31
  252. package/dist/typewriter.d.ts.map +1 -0
  253. package/dist/typewriter.js +185 -185
  254. package/dist/typewriter.js.map +1 -1
  255. package/package.json +6 -6
  256. package/dist/chunk-45VQAWIM.js +0 -228
  257. package/dist/chunk-45VQAWIM.js.map +0 -1
  258. package/dist/chunk-6Y7LPQMO.js +0 -11
  259. package/dist/chunk-6Y7LPQMO.js.map +0 -1
  260. package/dist/chunk-76UQO56T.js +0 -19
  261. package/dist/chunk-76UQO56T.js.map +0 -1
  262. package/dist/chunk-7F4MPMLJ.js +0 -17
  263. package/dist/chunk-7F4MPMLJ.js.map +0 -1
  264. package/dist/chunk-BKTJYX4M.js +0 -143
  265. package/dist/chunk-BKTJYX4M.js.map +0 -1
  266. package/dist/chunk-D5XPEJ6T.js +0 -36
  267. package/dist/chunk-D5XPEJ6T.js.map +0 -1
  268. package/dist/chunk-DIGOLJIR.js +0 -105
  269. package/dist/chunk-DIGOLJIR.js.map +0 -1
  270. package/dist/chunk-IQ7YQ5XA.js +0 -141
  271. package/dist/chunk-IQ7YQ5XA.js.map +0 -1
  272. package/dist/chunk-NCHHHWTB.js +0 -85
  273. package/dist/chunk-NCHHHWTB.js.map +0 -1
  274. package/dist/chunk-OUFYQLVN.js +0 -56
  275. package/dist/chunk-OUFYQLVN.js.map +0 -1
  276. package/dist/chunk-QFSEK4M6.js +0 -22
  277. package/dist/chunk-QFSEK4M6.js.map +0 -1
  278. package/dist/chunk-QRW37LRP.js +0 -25
  279. package/dist/chunk-QRW37LRP.js.map +0 -1
  280. package/dist/chunk-RPQHL6C5.js +0 -26
  281. package/dist/chunk-RPQHL6C5.js.map +0 -1
  282. package/dist/chunk-V4ZX4YCP.js +0 -66
  283. package/dist/chunk-V4ZX4YCP.js.map +0 -1
  284. package/dist/chunk-YTSQQTSF.js +0 -44
  285. package/dist/chunk-YTSQQTSF.js.map +0 -1
  286. package/dist/chunk-ZZZH3JGW.js +0 -23
  287. package/dist/chunk-ZZZH3JGW.js.map +0 -1
  288. package/dist/direction.js.map +0 -1
package/dist/sidebar.js CHANGED
@@ -1,624 +1,402 @@
1
- import { useIsMobile } from './chunk-ZZZH3JGW.js';
2
- import { TooltipProvider, TooltipTrigger, Tooltip, TooltipContent } from './chunk-V4ZX4YCP.js';
3
- import { Skeleton } from './chunk-7F4MPMLJ.js';
4
- import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription } from './chunk-BKTJYX4M.js';
5
- import { Separator } from './chunk-RPQHL6C5.js';
6
- import { Input } from './chunk-QFSEK4M6.js';
7
- import { SidebarPanelIcon } from './chunk-DIGOLJIR.js';
8
- import { Button } from './chunk-OUFYQLVN.js';
9
- import { cn } from './chunk-76UQO56T.js';
10
- import * as React from 'react';
11
- import { Collapsible } from '@base-ui/react/collapsible';
12
- import { mergeProps } from '@base-ui/react/merge-props';
13
- import { useRender } from '@base-ui/react/use-render';
14
- import { cva } from 'class-variance-authority';
15
- import { jsx, jsxs } from 'react/jsx-runtime';
16
-
17
- var SIDEBAR_WIDTH = "16rem";
18
- var SIDEBAR_WIDTH_MOBILE = "18rem";
19
- var SIDEBAR_WIDTH_ICON = "3rem";
20
- var SIDEBAR_DEFAULT_KEYBOARD_SHORTCUT = "b";
21
- function cookiePersist(name = "sidebar-state", maxAge = 60 * 60 * 24 * 7) {
22
- return (open) => {
23
- document.cookie = `${name}=${open}; path=/; max-age=${maxAge}`;
24
- };
1
+ "use client";
2
+ import { cn } from "./lib/utils.js";
3
+ import { SidebarPanelIcon } from "./lib/internal-icons.js";
4
+ import { Button } from "./button.js";
5
+ import { Separator } from "./separator.js";
6
+ import { Input } from "./input.js";
7
+ import { Drawer, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle } from "./drawer.js";
8
+ import { Skeleton } from "./skeleton.js";
9
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./tooltip.js";
10
+ import { useIsMobile } from "./hooks/use-mobile.js";
11
+ import * as React from "react";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
13
+ import { cva } from "class-variance-authority";
14
+ import { mergeProps } from "@base-ui/react/merge-props";
15
+ import { useRender } from "@base-ui/react/use-render";
16
+ import { Collapsible } from "@base-ui/react/collapsible";
17
+ //#region src/sidebar.tsx
18
+ const SIDEBAR_WIDTH = "16rem";
19
+ const SIDEBAR_WIDTH_MOBILE = "18rem";
20
+ const SIDEBAR_WIDTH_ICON = "3rem";
21
+ const SIDEBAR_DEFAULT_KEYBOARD_SHORTCUT = "b";
22
+ /**
23
+ * Persist sidebar state to a cookie.
24
+ *
25
+ * @param name - Cookie name. Defaults to `"sidebar-state"`.
26
+ * @param maxAge - Cookie max-age in seconds. Defaults to 7 days (604 800).
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * <SidebarProvider persist={cookiePersist()}>
31
+ * <SidebarProvider persist={cookiePersist("my-sidebar", 86400)}>
32
+ * ```
33
+ */
34
+ function cookiePersist(name = "sidebar-state", maxAge = 3600 * 24 * 7) {
35
+ return (open) => {
36
+ document.cookie = `${name}=${open}; path=/; max-age=${maxAge}`;
37
+ };
25
38
  }
39
+ /**
40
+ * Persist sidebar state to localStorage.
41
+ *
42
+ * @param key - Storage key. Defaults to `"sidebar-state"`.
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * <SidebarProvider persist={localStoragePersist()}>
47
+ * <SidebarProvider persist={localStoragePersist("my-sidebar")}>
48
+ * ```
49
+ */
26
50
  function localStoragePersist(key = "sidebar-state") {
27
- return (open) => {
28
- try {
29
- localStorage.setItem(key, String(open));
30
- } catch {
31
- }
32
- };
51
+ return (open) => {
52
+ try {
53
+ localStorage.setItem(key, String(open));
54
+ } catch {}
55
+ };
33
56
  }
34
- var SidebarContext = React.createContext(null);
57
+ const SidebarContext = React.createContext(null);
35
58
  function useSidebar() {
36
- const context = React.useContext(SidebarContext);
37
- if (!context) {
38
- throw new Error("useSidebar must be used within a SidebarProvider.");
39
- }
40
- return context;
59
+ const context = React.useContext(SidebarContext);
60
+ if (!context) throw new Error("useSidebar must be used within a SidebarProvider.");
61
+ return context;
41
62
  }
42
- function SidebarProvider({
43
- defaultOpen = true,
44
- open: openProp,
45
- onOpenChange: setOpenProp,
46
- persist,
47
- keyboardShortcut = SIDEBAR_DEFAULT_KEYBOARD_SHORTCUT,
48
- mobileBreakpoint,
49
- className,
50
- style,
51
- children,
52
- ...props
53
- }) {
54
- const isMobile = useIsMobile(mobileBreakpoint);
55
- const [openMobile, setOpenMobile] = React.useState(false);
56
- const [_open, _setOpen] = React.useState(defaultOpen);
57
- const open = openProp ?? _open;
58
- const persistRef = React.useRef(persist);
59
- persistRef.current = persist;
60
- const setOpen = React.useCallback(
61
- (value) => {
62
- const openState = typeof value === "function" ? value(open) : value;
63
- if (setOpenProp) {
64
- setOpenProp(openState);
65
- } else {
66
- _setOpen(openState);
67
- }
68
- persistRef.current?.(openState);
69
- },
70
- [setOpenProp, open]
71
- );
72
- const toggleSidebar = React.useCallback(() => {
73
- return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2);
74
- }, [isMobile, setOpen, setOpenMobile]);
75
- React.useEffect(() => {
76
- if (keyboardShortcut === false) return;
77
- const handleKeyDown = (event) => {
78
- if (event.key === keyboardShortcut && (event.metaKey || event.ctrlKey)) {
79
- event.preventDefault();
80
- toggleSidebar();
81
- }
82
- };
83
- window.addEventListener("keydown", handleKeyDown);
84
- return () => window.removeEventListener("keydown", handleKeyDown);
85
- }, [toggleSidebar, keyboardShortcut]);
86
- const state = isMobile || open ? "expanded" : "collapsed";
87
- const contextValue = React.useMemo(
88
- () => ({
89
- state,
90
- open,
91
- setOpen,
92
- isMobile,
93
- openMobile,
94
- setOpenMobile,
95
- toggleSidebar
96
- }),
97
- [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
98
- );
99
- return /* @__PURE__ */ jsx(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
100
- "div",
101
- {
102
- "data-slot": "sidebar-wrapper",
103
- style: {
104
- "--sidebar-width": SIDEBAR_WIDTH,
105
- "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
106
- ...style
107
- },
108
- className: cn(
109
- "group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full",
110
- className
111
- ),
112
- ...props,
113
- children
114
- }
115
- ) });
63
+ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, persist, keyboardShortcut = SIDEBAR_DEFAULT_KEYBOARD_SHORTCUT, mobileBreakpoint, className, style, children, ...props }) {
64
+ const isMobile = useIsMobile(mobileBreakpoint);
65
+ const [openMobile, setOpenMobile] = React.useState(false);
66
+ const [_open, _setOpen] = React.useState(defaultOpen);
67
+ const open = openProp ?? _open;
68
+ const persistRef = React.useRef(persist);
69
+ persistRef.current = persist;
70
+ const setOpen = React.useCallback((value) => {
71
+ const openState = typeof value === "function" ? value(open) : value;
72
+ if (setOpenProp) setOpenProp(openState);
73
+ else _setOpen(openState);
74
+ persistRef.current?.(openState);
75
+ }, [setOpenProp, open]);
76
+ const toggleSidebar = React.useCallback(() => {
77
+ return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);
78
+ }, [
79
+ isMobile,
80
+ setOpen,
81
+ setOpenMobile
82
+ ]);
83
+ React.useEffect(() => {
84
+ if (keyboardShortcut === false) return;
85
+ const handleKeyDown = (event) => {
86
+ if (event.key === keyboardShortcut && (event.metaKey || event.ctrlKey)) {
87
+ event.preventDefault();
88
+ toggleSidebar();
89
+ }
90
+ };
91
+ window.addEventListener("keydown", handleKeyDown);
92
+ return () => window.removeEventListener("keydown", handleKeyDown);
93
+ }, [toggleSidebar, keyboardShortcut]);
94
+ const state = isMobile || open ? "expanded" : "collapsed";
95
+ const contextValue = React.useMemo(() => ({
96
+ state,
97
+ open,
98
+ setOpen,
99
+ isMobile,
100
+ openMobile,
101
+ setOpenMobile,
102
+ toggleSidebar
103
+ }), [
104
+ state,
105
+ open,
106
+ setOpen,
107
+ isMobile,
108
+ openMobile,
109
+ setOpenMobile,
110
+ toggleSidebar
111
+ ]);
112
+ return /* @__PURE__ */ jsx(SidebarContext.Provider, {
113
+ value: contextValue,
114
+ children: /* @__PURE__ */ jsx("div", {
115
+ "data-slot": "sidebar-wrapper",
116
+ style: {
117
+ "--sidebar-width": SIDEBAR_WIDTH,
118
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
119
+ ...style
120
+ },
121
+ className: cn("group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full", className),
122
+ ...props,
123
+ children
124
+ })
125
+ });
116
126
  }
117
- function Sidebar({
118
- side = "left",
119
- variant = "sidebar",
120
- collapsible = "offcanvas",
121
- className,
122
- children,
123
- ...props
124
- }) {
125
- const { isMobile, state, open, setOpen, openMobile, setOpenMobile } = useSidebar();
126
- if (collapsible === "none") {
127
- return /* @__PURE__ */ jsx(
128
- "div",
129
- {
130
- "data-slot": "sidebar",
131
- className: cn(
132
- "bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col",
133
- className
134
- ),
135
- ...props,
136
- children
137
- }
138
- );
139
- }
140
- if (isMobile) {
141
- return /* @__PURE__ */ jsx(
142
- Drawer,
143
- {
144
- open: openMobile,
145
- onOpenChange: setOpenMobile,
146
- swipeDirection: side,
147
- children: /* @__PURE__ */ jsxs(
148
- DrawerContent,
149
- {
150
- "data-slot": "sidebar",
151
- "data-mobile": "true",
152
- className: "bg-sidebar text-sidebar-foreground w-(--sidebar-width) max-w-none rounded-none border-0 p-0 sm:max-w-none",
153
- style: {
154
- "--sidebar-width": SIDEBAR_WIDTH_MOBILE
155
- },
156
- children: [
157
- /* @__PURE__ */ jsxs(DrawerHeader, { className: "sr-only", children: [
158
- /* @__PURE__ */ jsx(DrawerTitle, { children: "Sidebar" }),
159
- /* @__PURE__ */ jsx(DrawerDescription, { children: "Displays the mobile sidebar." })
160
- ] }),
161
- /* @__PURE__ */ jsx("div", { className: "flex h-full w-full flex-col", children })
162
- ]
163
- }
164
- )
165
- }
166
- );
167
- }
168
- return /* @__PURE__ */ jsxs(
169
- Collapsible.Root,
170
- {
171
- open,
172
- onOpenChange: setOpen,
173
- className: "group peer text-sidebar-foreground hidden md:block",
174
- "data-state": state,
175
- "data-collapsible": state === "collapsed" ? collapsible : "",
176
- "data-variant": variant,
177
- "data-side": side,
178
- "data-slot": "sidebar",
179
- children: [
180
- /* @__PURE__ */ jsx(
181
- "div",
182
- {
183
- "data-slot": "sidebar-gap",
184
- className: cn(
185
- "relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear",
186
- "group-data-[collapsible=offcanvas]:w-0",
187
- "group-data-[side=right]:rotate-180",
188
- variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"
189
- )
190
- }
191
- ),
192
- /* @__PURE__ */ jsx(
193
- "div",
194
- {
195
- "data-slot": "sidebar-container",
196
- className: cn(
197
- "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex",
198
- 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)]",
199
- 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) after:absolute after:inset-y-0 after:w-px after:bg-sidebar-border" + (side === "left" ? " after:right-0" : " after:left-0"),
200
- className
201
- ),
202
- ...props,
203
- children: /* @__PURE__ */ jsx(TooltipProvider, { delay: 0, closeDelay: 300, children: /* @__PURE__ */ jsx(
204
- "div",
205
- {
206
- "data-slot": "sidebar-inner",
207
- className: "bg-sidebar group-data-[variant=floating]:ring-sidebar-border group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 flex size-full flex-col",
208
- children
209
- }
210
- ) })
211
- }
212
- )
213
- ]
214
- }
215
- );
127
+ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props }) {
128
+ const { isMobile, state, open, setOpen, openMobile, setOpenMobile } = useSidebar();
129
+ if (collapsible === "none") return /* @__PURE__ */ jsx("div", {
130
+ "data-slot": "sidebar",
131
+ className: cn("bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col", className),
132
+ ...props,
133
+ children
134
+ });
135
+ if (isMobile) return /* @__PURE__ */ jsx(Drawer, {
136
+ open: openMobile,
137
+ onOpenChange: setOpenMobile,
138
+ swipeDirection: side,
139
+ children: /* @__PURE__ */ jsxs(DrawerContent, {
140
+ "data-slot": "sidebar",
141
+ "data-mobile": "true",
142
+ className: "bg-sidebar text-sidebar-foreground w-(--sidebar-width) max-w-none rounded-none border-0 p-0 sm:max-w-none",
143
+ style: { "--sidebar-width": SIDEBAR_WIDTH_MOBILE },
144
+ children: [/* @__PURE__ */ jsxs(DrawerHeader, {
145
+ className: "sr-only",
146
+ children: [/* @__PURE__ */ jsx(DrawerTitle, { children: "Sidebar" }), /* @__PURE__ */ jsx(DrawerDescription, { children: "Displays the mobile sidebar." })]
147
+ }), /* @__PURE__ */ jsx("div", {
148
+ className: "flex h-full w-full flex-col",
149
+ children
150
+ })]
151
+ })
152
+ });
153
+ return /* @__PURE__ */ jsxs(Collapsible.Root, {
154
+ open,
155
+ onOpenChange: setOpen,
156
+ className: "group peer text-sidebar-foreground hidden md:block",
157
+ "data-state": state,
158
+ "data-collapsible": state === "collapsed" ? collapsible : "",
159
+ "data-variant": variant,
160
+ "data-side": side,
161
+ "data-slot": "sidebar",
162
+ children: [/* @__PURE__ */ jsx("div", {
163
+ "data-slot": "sidebar-gap",
164
+ 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)")
165
+ }), /* @__PURE__ */ jsx("div", {
166
+ "data-slot": "sidebar-container",
167
+ 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) after:absolute after:inset-y-0 after:w-px after:bg-sidebar-border" + (side === "left" ? " after:right-0" : " after:left-0"), className),
168
+ ...props,
169
+ children: /* @__PURE__ */ jsx(TooltipProvider, {
170
+ delay: 0,
171
+ closeDelay: 300,
172
+ children: /* @__PURE__ */ jsx("div", {
173
+ "data-slot": "sidebar-inner",
174
+ className: "bg-sidebar group-data-[variant=floating]:ring-sidebar-border group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 flex size-full flex-col",
175
+ children
176
+ })
177
+ })
178
+ })]
179
+ });
216
180
  }
217
- function SidebarTrigger({
218
- className,
219
- onClick,
220
- ...props
221
- }) {
222
- const { toggleSidebar } = useSidebar();
223
- return /* @__PURE__ */ jsxs(
224
- Button,
225
- {
226
- "data-slot": "sidebar-trigger",
227
- variant: "ghost",
228
- size: "icon-sm",
229
- className: cn(className),
230
- onClick: (event) => {
231
- onClick?.(event);
232
- toggleSidebar();
233
- },
234
- ...props,
235
- children: [
236
- /* @__PURE__ */ jsx(SidebarPanelIcon, {}),
237
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Toggle Sidebar" })
238
- ]
239
- }
240
- );
181
+ function SidebarTrigger({ className, onClick, ...props }) {
182
+ const { toggleSidebar } = useSidebar();
183
+ return /* @__PURE__ */ jsxs(Button, {
184
+ "data-slot": "sidebar-trigger",
185
+ variant: "ghost",
186
+ size: "icon-sm",
187
+ className: cn(className),
188
+ onClick: (event) => {
189
+ onClick?.(event);
190
+ toggleSidebar();
191
+ },
192
+ ...props,
193
+ children: [/* @__PURE__ */ jsx(SidebarPanelIcon, {}), /* @__PURE__ */ jsx("span", {
194
+ className: "sr-only",
195
+ children: "Toggle Sidebar"
196
+ })]
197
+ });
241
198
  }
242
199
  function SidebarRail({ className, ...props }) {
243
- const { toggleSidebar } = useSidebar();
244
- return /* @__PURE__ */ jsx(
245
- "button",
246
- {
247
- "data-slot": "sidebar-rail",
248
- "aria-label": "Toggle Sidebar",
249
- tabIndex: -1,
250
- onClick: toggleSidebar,
251
- title: "Toggle Sidebar",
252
- className: cn(
253
- "hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex",
254
- "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize",
255
- "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
256
- "hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full",
257
- "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
258
- "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
259
- className
260
- ),
261
- ...props
262
- }
263
- );
200
+ const { toggleSidebar } = useSidebar();
201
+ return /* @__PURE__ */ jsx("button", {
202
+ "data-slot": "sidebar-rail",
203
+ "aria-label": "Toggle Sidebar",
204
+ tabIndex: -1,
205
+ onClick: toggleSidebar,
206
+ title: "Toggle Sidebar",
207
+ className: cn("hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex", "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize", "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", "hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full", "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", className),
208
+ ...props
209
+ });
264
210
  }
265
211
  function SidebarInset({ className, ...props }) {
266
- return /* @__PURE__ */ jsx(
267
- "main",
268
- {
269
- "data-slot": "sidebar-inset",
270
- className: cn(
271
- "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 relative flex min-w-0 w-full flex-1 flex-col",
272
- className
273
- ),
274
- ...props
275
- }
276
- );
212
+ return /* @__PURE__ */ jsx("main", {
213
+ "data-slot": "sidebar-inset",
214
+ className: cn("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 relative flex min-w-0 w-full flex-1 flex-col", className),
215
+ ...props
216
+ });
277
217
  }
278
- function SidebarInput({
279
- className,
280
- ...props
281
- }) {
282
- return /* @__PURE__ */ jsx(
283
- Input,
284
- {
285
- "data-slot": "sidebar-input",
286
- className: cn("bg-background h-8 w-full shadow-none", className),
287
- ...props
288
- }
289
- );
218
+ function SidebarInput({ className, ...props }) {
219
+ return /* @__PURE__ */ jsx(Input, {
220
+ "data-slot": "sidebar-input",
221
+ className: cn("bg-background h-8 w-full shadow-none", className),
222
+ ...props
223
+ });
290
224
  }
291
225
  function SidebarHeader({ className, ...props }) {
292
- return /* @__PURE__ */ jsx(
293
- "div",
294
- {
295
- "data-slot": "sidebar-header",
296
- className: cn("gap-2 p-2 flex flex-col", className),
297
- ...props
298
- }
299
- );
226
+ return /* @__PURE__ */ jsx("div", {
227
+ "data-slot": "sidebar-header",
228
+ className: cn("gap-2 p-2 flex flex-col", className),
229
+ ...props
230
+ });
300
231
  }
301
232
  function SidebarFooter({ className, ...props }) {
302
- return /* @__PURE__ */ jsx(
303
- "div",
304
- {
305
- "data-slot": "sidebar-footer",
306
- className: cn("gap-2 p-2 flex flex-col", className),
307
- ...props
308
- }
309
- );
233
+ return /* @__PURE__ */ jsx("div", {
234
+ "data-slot": "sidebar-footer",
235
+ className: cn("gap-2 p-2 flex flex-col", className),
236
+ ...props
237
+ });
310
238
  }
311
- function SidebarSeparator({
312
- className,
313
- ...props
314
- }) {
315
- return /* @__PURE__ */ jsx(
316
- Separator,
317
- {
318
- "data-slot": "sidebar-separator",
319
- className: cn("bg-sidebar-border mx-2 data-[orientation=horizontal]:w-auto", className),
320
- ...props
321
- }
322
- );
239
+ function SidebarSeparator({ className, ...props }) {
240
+ return /* @__PURE__ */ jsx(Separator, {
241
+ "data-slot": "sidebar-separator",
242
+ className: cn("bg-sidebar-border mx-2 data-[orientation=horizontal]:w-auto", className),
243
+ ...props
244
+ });
323
245
  }
324
246
  function SidebarContent({ className, style, ...props }) {
325
- return /* @__PURE__ */ jsx(
326
- "div",
327
- {
328
- "data-slot": "sidebar-content",
329
- className: cn(
330
- "gap-1 flex min-h-0 flex-1 flex-col overflow-auto scrollbar-none group-data-[collapsible=icon]:overflow-x-hidden",
331
- className
332
- ),
333
- style: {
334
- maskImage: "linear-gradient(to bottom, black calc(100% - 44px), transparent 100%)",
335
- WebkitMaskImage: "linear-gradient(to bottom, black calc(100% - 44px), transparent 100%)",
336
- ...style
337
- },
338
- ...props
339
- }
340
- );
247
+ return /* @__PURE__ */ jsx("div", {
248
+ "data-slot": "sidebar-content",
249
+ className: cn("gap-1 flex min-h-0 flex-1 flex-col overflow-auto scrollbar-none group-data-[collapsible=icon]:overflow-x-hidden", className),
250
+ style: {
251
+ maskImage: "linear-gradient(to bottom, black calc(100% - 44px), transparent 100%)",
252
+ WebkitMaskImage: "linear-gradient(to bottom, black calc(100% - 44px), transparent 100%)",
253
+ ...style
254
+ },
255
+ ...props
256
+ });
341
257
  }
342
258
  function SidebarGroup({ className, ...props }) {
343
- return /* @__PURE__ */ jsx(
344
- "div",
345
- {
346
- "data-slot": "sidebar-group",
347
- className: cn(
348
- "px-2 first:pt-2 last:pb-2 relative flex w-full min-w-0 flex-col",
349
- className
350
- ),
351
- ...props
352
- }
353
- );
259
+ return /* @__PURE__ */ jsx("div", {
260
+ "data-slot": "sidebar-group",
261
+ className: cn("px-2 first:pt-2 last:pb-2 relative flex w-full min-w-0 flex-col", className),
262
+ ...props
263
+ });
354
264
  }
355
- function SidebarGroupLabel({
356
- className,
357
- render,
358
- ...props
359
- }) {
360
- return useRender({
361
- defaultTagName: "div",
362
- props: mergeProps(
363
- {
364
- className: cn(
365
- "text-sidebar-foreground/70 ring-sidebar-ring h-8 rounded-md px-2 text-xs font-medium group-data-[collapsible=icon]:hidden focus-visible:ring-2 [&>svg]:size-4 flex shrink-0 items-center outline-hidden [&>svg]:shrink-0",
366
- className
367
- )
368
- },
369
- props
370
- ),
371
- render,
372
- state: {
373
- slot: "sidebar-group-label"
374
- }
375
- });
265
+ function SidebarGroupLabel({ className, render, ...props }) {
266
+ return useRender({
267
+ defaultTagName: "div",
268
+ props: mergeProps({ className: cn("text-sidebar-foreground/70 ring-sidebar-ring h-8 rounded-md px-2 text-xs font-medium group-data-[collapsible=icon]:hidden focus-visible:ring-2 [&>svg]:size-4 flex shrink-0 items-center outline-hidden [&>svg]:shrink-0", className) }, props),
269
+ render,
270
+ state: { slot: "sidebar-group-label" }
271
+ });
376
272
  }
377
- function SidebarGroupAction({
378
- className,
379
- render,
380
- ...props
381
- }) {
382
- return useRender({
383
- defaultTagName: "button",
384
- props: mergeProps(
385
- {
386
- className: cn(
387
- "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-1.5 right-3 w-5 rounded-xs p-0 focus-visible:ring-2 [&>svg]:size-4 flex aspect-square items-center justify-center outline-hidden transition-transform [&>svg]:shrink-0 after:absolute after:-inset-2 md:after:hidden group-data-[collapsible=icon]:hidden",
388
- className
389
- )
390
- },
391
- props
392
- ),
393
- render,
394
- state: {
395
- slot: "sidebar-group-action"
396
- }
397
- });
273
+ function SidebarGroupAction({ className, render, ...props }) {
274
+ return useRender({
275
+ defaultTagName: "button",
276
+ props: mergeProps({ className: cn("text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-1.5 right-3 w-5 rounded-xs p-0 focus-visible:ring-2 [&>svg]:size-4 flex aspect-square items-center justify-center outline-hidden transition-transform [&>svg]:shrink-0 after:absolute after:-inset-2 md:after:hidden group-data-[collapsible=icon]:hidden", className) }, props),
277
+ render,
278
+ state: { slot: "sidebar-group-action" }
279
+ });
398
280
  }
399
- function SidebarGroupContent({
400
- className,
401
- ...props
402
- }) {
403
- return /* @__PURE__ */ jsx(
404
- "div",
405
- {
406
- "data-slot": "sidebar-group-content",
407
- className: cn("text-sm w-full", className),
408
- ...props
409
- }
410
- );
281
+ function SidebarGroupContent({ className, ...props }) {
282
+ return /* @__PURE__ */ jsx("div", {
283
+ "data-slot": "sidebar-group-content",
284
+ className: cn("text-sm w-full", className),
285
+ ...props
286
+ });
411
287
  }
412
288
  function SidebarMenu({ className, ...props }) {
413
- return /* @__PURE__ */ jsx(
414
- "ul",
415
- {
416
- "data-slot": "sidebar-menu",
417
- className: cn("gap-1 flex w-full min-w-0 flex-col", className),
418
- ...props
419
- }
420
- );
289
+ return /* @__PURE__ */ jsx("ul", {
290
+ "data-slot": "sidebar-menu",
291
+ className: cn("gap-1 flex w-full min-w-0 flex-col", className),
292
+ ...props
293
+ });
421
294
  }
422
295
  function SidebarMenuItem({ className, ...props }) {
423
- return /* @__PURE__ */ jsx(
424
- "li",
425
- {
426
- "data-slot": "sidebar-menu-item",
427
- className: cn("group/menu-item relative has-data-[slot=sidebar-menu-sub]:mb-[-0.25rem]", className),
428
- ...props
429
- }
430
- );
296
+ return /* @__PURE__ */ jsx("li", {
297
+ "data-slot": "sidebar-menu-item",
298
+ className: cn("group/menu-item relative has-data-[slot=sidebar-menu-sub]:mb-[-0.25rem]", className),
299
+ ...props
300
+ });
431
301
  }
432
- var sidebarMenuButtonVariants = cva(
433
- "ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground gap-2 rounded-lg p-2 text-left text-sm transition-[width,height,padding] group-has-data-[slot=sidebar-menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:w-full group-data-[collapsible=icon]:aspect-square group-data-[collapsible=icon]:h-11 focus-visible:ring-2 data-active:font-medium peer/menu-button flex w-full items-center overflow-hidden outline-hidden group/menu-button disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&_svg]:shrink-0",
434
- {
435
- variants: {
436
- variant: {
437
- default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
438
- outline: "bg-background hover:bg-sidebar-accent hover:text-sidebar-accent-foreground ring-1 ring-sidebar-border hover:ring-sidebar-accent"
439
- },
440
- size: {
441
- default: "h-11 text-sm",
442
- sm: "h-8 text-xs",
443
- lg: "h-12 text-sm"
444
- }
445
- },
446
- defaultVariants: {
447
- variant: "default",
448
- size: "default"
449
- }
450
- }
451
- );
452
- function SidebarMenuButton({
453
- render,
454
- isActive = false,
455
- variant = "default",
456
- size = "default",
457
- tooltip,
458
- className,
459
- ...props
460
- }) {
461
- const { isMobile, state } = useSidebar();
462
- if (process.env.NODE_ENV === "development" && tooltip && render) {
463
- console.warn(
464
- "[SidebarMenuButton] Both `render` and `tooltip` were provided. When `tooltip` is set, the button is wrapped in a TooltipTrigger and the `render` prop is ignored."
465
- );
466
- }
467
- const comp = useRender({
468
- defaultTagName: "button",
469
- props: mergeProps(
470
- {
471
- className: cn(sidebarMenuButtonVariants({ variant, size }), className)
472
- },
473
- props
474
- ),
475
- render: !tooltip ? render : TooltipTrigger,
476
- state: {
477
- slot: "sidebar-menu-button",
478
- size,
479
- active: isActive
480
- }
481
- });
482
- if (!tooltip) {
483
- return comp;
484
- }
485
- if (typeof tooltip === "string") {
486
- tooltip = {
487
- children: tooltip
488
- };
489
- }
490
- return /* @__PURE__ */ jsxs(Tooltip, { children: [
491
- comp,
492
- /* @__PURE__ */ jsx(
493
- TooltipContent,
494
- {
495
- side: "right",
496
- align: "center",
497
- hidden: state !== "collapsed" || isMobile,
498
- ...tooltip
499
- }
500
- )
501
- ] });
302
+ const sidebarMenuButtonVariants = cva("ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground gap-2 rounded-lg p-2 text-left text-sm transition-[width,height,padding] group-has-data-[slot=sidebar-menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:w-full group-data-[collapsible=icon]:aspect-square group-data-[collapsible=icon]:h-11 focus-visible:ring-2 data-active:font-medium peer/menu-button flex w-full items-center overflow-hidden outline-hidden group/menu-button disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&_svg]:shrink-0", {
303
+ variants: {
304
+ variant: {
305
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
306
+ outline: "bg-background hover:bg-sidebar-accent hover:text-sidebar-accent-foreground ring-1 ring-sidebar-border hover:ring-sidebar-accent"
307
+ },
308
+ size: {
309
+ default: "h-11 text-sm",
310
+ sm: "h-8 text-xs",
311
+ lg: "h-12 text-sm"
312
+ }
313
+ },
314
+ defaultVariants: {
315
+ variant: "default",
316
+ size: "default"
317
+ }
318
+ });
319
+ function SidebarMenuButton({ render, isActive = false, variant = "default", size = "default", tooltip, className, ...props }) {
320
+ const { isMobile, state } = useSidebar();
321
+ if (process.env.NODE_ENV === "development" && tooltip && render) console.warn("[SidebarMenuButton] Both `render` and `tooltip` were provided. When `tooltip` is set, the button is wrapped in a TooltipTrigger and the `render` prop is ignored.");
322
+ const comp = useRender({
323
+ defaultTagName: "button",
324
+ props: mergeProps({ className: cn(sidebarMenuButtonVariants({
325
+ variant,
326
+ size
327
+ }), className) }, props),
328
+ render: !tooltip ? render : TooltipTrigger,
329
+ state: {
330
+ slot: "sidebar-menu-button",
331
+ size,
332
+ active: isActive
333
+ }
334
+ });
335
+ if (!tooltip) return comp;
336
+ if (typeof tooltip === "string") tooltip = { children: tooltip };
337
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [comp, /* @__PURE__ */ jsx(TooltipContent, {
338
+ side: "right",
339
+ align: "center",
340
+ hidden: state !== "collapsed" || isMobile,
341
+ ...tooltip
342
+ })] });
502
343
  }
503
- function SidebarMenuAction({
504
- className,
505
- render,
506
- showOnHover = false,
507
- ...props
508
- }) {
509
- return useRender({
510
- defaultTagName: "button",
511
- props: mergeProps(
512
- {
513
- className: cn(
514
- "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1/2 -translate-y-1/2 right-1 aspect-square w-5 rounded-xs p-0 focus-visible:ring-2 [&>svg]:size-4 flex items-center justify-center outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 md:after:hidden [&>svg]:shrink-0",
515
- showOnHover && "peer-data-active/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-open:opacity-100 md:opacity-0",
516
- className
517
- )
518
- },
519
- props
520
- ),
521
- render,
522
- state: {
523
- slot: "sidebar-menu-action"
524
- }
525
- });
344
+ function SidebarMenuAction({ className, render, showOnHover = false, ...props }) {
345
+ return useRender({
346
+ defaultTagName: "button",
347
+ props: mergeProps({ className: cn("text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1/2 -translate-y-1/2 right-1 aspect-square w-5 rounded-xs p-0 focus-visible:ring-2 [&>svg]:size-4 flex items-center justify-center outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 md:after:hidden [&>svg]:shrink-0", showOnHover && "peer-data-active/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-open:opacity-100 md:opacity-0", className) }, props),
348
+ render,
349
+ state: { slot: "sidebar-menu-action" }
350
+ });
526
351
  }
527
- function SidebarMenuBadge({
528
- className,
529
- ...props
530
- }) {
531
- return /* @__PURE__ */ jsx(
532
- "div",
533
- {
534
- "data-slot": "sidebar-menu-badge",
535
- className: cn(
536
- "text-sidebar-foreground peer-hover/menu-button:text-sidebar-accent-foreground peer-data-active/menu-button:text-sidebar-accent-foreground pointer-events-none absolute right-1 top-1/2 -translate-y-1/2 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none group-data-[collapsible=icon]:hidden",
537
- className
538
- ),
539
- ...props
540
- }
541
- );
352
+ function SidebarMenuBadge({ className, ...props }) {
353
+ return /* @__PURE__ */ jsx("div", {
354
+ "data-slot": "sidebar-menu-badge",
355
+ className: cn("text-sidebar-foreground peer-hover/menu-button:text-sidebar-accent-foreground peer-data-active/menu-button:text-sidebar-accent-foreground pointer-events-none absolute right-1 top-1/2 -translate-y-1/2 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none group-data-[collapsible=icon]:hidden", className),
356
+ ...props
357
+ });
542
358
  }
543
- function SidebarMenuSkeleton({
544
- className,
545
- showIcon = false,
546
- ...props
547
- }) {
548
- const [width] = React.useState(() => {
549
- return `${Math.floor(Math.random() * 40) + 50}%`;
550
- });
551
- return /* @__PURE__ */ jsxs(
552
- "div",
553
- {
554
- "data-slot": "sidebar-menu-skeleton",
555
- className: cn("h-8 gap-2 rounded-md px-2 flex items-center", className),
556
- ...props,
557
- children: [
558
- showIcon && /* @__PURE__ */ jsx(Skeleton, { className: "size-4 rounded-md" }),
559
- /* @__PURE__ */ jsx(
560
- Skeleton,
561
- {
562
- className: "h-4 max-w-(--skeleton-width) flex-1",
563
- style: {
564
- "--skeleton-width": width
565
- }
566
- }
567
- )
568
- ]
569
- }
570
- );
359
+ function SidebarMenuSkeleton({ className, showIcon = false, ...props }) {
360
+ const [width] = React.useState(() => {
361
+ return `${Math.floor(Math.random() * 40) + 50}%`;
362
+ });
363
+ return /* @__PURE__ */ jsxs("div", {
364
+ "data-slot": "sidebar-menu-skeleton",
365
+ className: cn("h-8 gap-2 rounded-md px-2 flex items-center", className),
366
+ ...props,
367
+ children: [showIcon && /* @__PURE__ */ jsx(Skeleton, { className: "size-4 rounded-md" }), /* @__PURE__ */ jsx(Skeleton, {
368
+ className: "h-4 max-w-(--skeleton-width) flex-1",
369
+ style: { "--skeleton-width": width }
370
+ })]
371
+ });
571
372
  }
572
373
  function SidebarMenuSub({ className, ...props }) {
573
- return /* @__PURE__ */ jsx(
574
- "ul",
575
- {
576
- "data-slot": "sidebar-menu-sub",
577
- className: cn("border-sidebar-border ml-3.5 mr-0 translate-x-px gap-0.5 border-l pl-2.5 pr-0 py-0.5 group-data-[collapsible=icon]:hidden flex min-w-0 flex-col", className),
578
- ...props
579
- }
580
- );
374
+ return /* @__PURE__ */ jsx("ul", {
375
+ "data-slot": "sidebar-menu-sub",
376
+ className: cn("border-sidebar-border ml-3.5 mr-0 translate-x-px gap-0.5 border-l pl-2.5 pr-0 py-0.5 group-data-[collapsible=icon]:hidden flex min-w-0 flex-col", className),
377
+ ...props
378
+ });
581
379
  }
582
- function SidebarMenuSubItem({
583
- className,
584
- ...props
585
- }) {
586
- return /* @__PURE__ */ jsx(
587
- "li",
588
- {
589
- "data-slot": "sidebar-menu-sub-item",
590
- className: cn("group/menu-sub-item relative", className),
591
- ...props
592
- }
593
- );
380
+ function SidebarMenuSubItem({ className, ...props }) {
381
+ return /* @__PURE__ */ jsx("li", {
382
+ "data-slot": "sidebar-menu-sub-item",
383
+ className: cn("group/menu-sub-item relative", className),
384
+ ...props
385
+ });
594
386
  }
595
- function SidebarMenuSubButton({
596
- render,
597
- size = "md",
598
- isActive = false,
599
- className,
600
- ...props
601
- }) {
602
- return useRender({
603
- defaultTagName: "a",
604
- props: mergeProps(
605
- {
606
- className: cn(
607
- "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground h-7 gap-2 rounded-md px-2 focus-visible:ring-2 data-[size=md]:text-sm data-[size=sm]:text-xs [&>svg]:size-4 flex min-w-0 -translate-x-px items-center overflow-hidden outline-hidden group-data-[collapsible=icon]:hidden disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:shrink-0",
608
- className
609
- )
610
- },
611
- props
612
- ),
613
- render,
614
- state: {
615
- slot: "sidebar-menu-sub-button",
616
- size,
617
- active: isActive
618
- }
619
- });
387
+ function SidebarMenuSubButton({ render, size = "md", isActive = false, className, ...props }) {
388
+ return useRender({
389
+ defaultTagName: "a",
390
+ props: mergeProps({ className: cn("text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground h-7 gap-2 rounded-md px-2 focus-visible:ring-2 data-[size=md]:text-sm data-[size=sm]:text-xs [&>svg]:size-4 flex min-w-0 -translate-x-px items-center overflow-hidden outline-hidden group-data-[collapsible=icon]:hidden disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:shrink-0", className) }, props),
391
+ render,
392
+ state: {
393
+ slot: "sidebar-menu-sub-button",
394
+ size,
395
+ active: isActive
396
+ }
397
+ });
620
398
  }
621
-
399
+ //#endregion
622
400
  export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, cookiePersist, localStoragePersist, useSidebar };
623
- //# sourceMappingURL=sidebar.js.map
401
+
624
402
  //# sourceMappingURL=sidebar.js.map