@codefast/ui 0.3.16-canary.3 → 0.4.0-canary.4

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 (281) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +27 -16
  3. package/dist/components/accordion.d.mts +7 -22
  4. package/dist/components/accordion.mjs +26 -29
  5. package/dist/components/alert-dialog.d.mts +27 -26
  6. package/dist/components/alert-dialog.mjs +53 -45
  7. package/dist/components/alert.d.mts +12 -2
  8. package/dist/components/alert.mjs +15 -6
  9. package/dist/components/aspect-ratio.d.mts +2 -2
  10. package/dist/components/aspect-ratio.mjs +2 -3
  11. package/dist/components/avatar.d.mts +41 -5
  12. package/dist/components/avatar.mjs +40 -10
  13. package/dist/components/badge.mjs +4 -4
  14. package/dist/components/breadcrumb.d.mts +1 -0
  15. package/dist/components/breadcrumb.mjs +11 -10
  16. package/dist/components/button-group.d.mts +1 -1
  17. package/dist/components/button-group.mjs +6 -7
  18. package/dist/components/button.d.mts +0 -1
  19. package/dist/components/button.mjs +7 -7
  20. package/dist/components/calendar.d.mts +6 -2
  21. package/dist/components/calendar.mjs +39 -43
  22. package/dist/components/card.d.mts +4 -2
  23. package/dist/components/card.mjs +9 -9
  24. package/dist/components/carousel.d.mts +16 -4
  25. package/dist/components/carousel.mjs +24 -11
  26. package/dist/components/chart.d.mts +8 -3
  27. package/dist/components/chart.mjs +21 -15
  28. package/dist/components/checkbox-cards.mjs +4 -4
  29. package/dist/components/checkbox-group.mjs +3 -4
  30. package/dist/components/checkbox.d.mts +2 -2
  31. package/dist/components/checkbox.mjs +6 -7
  32. package/dist/components/collapsible.d.mts +4 -4
  33. package/dist/components/collapsible.mjs +4 -5
  34. package/dist/components/command.d.mts +11 -1
  35. package/dist/components/command.mjs +35 -32
  36. package/dist/components/context-menu.d.mts +22 -15
  37. package/dist/components/context-menu.mjs +44 -39
  38. package/dist/components/dialog.d.mts +19 -23
  39. package/dist/components/dialog.mjs +48 -47
  40. package/dist/components/direction.d.mts +24 -0
  41. package/dist/components/direction.mjs +18 -0
  42. package/dist/components/drawer.d.mts +2 -20
  43. package/dist/components/drawer.mjs +17 -25
  44. package/dist/components/dropdown-menu.d.mts +22 -15
  45. package/dist/components/dropdown-menu.mjs +41 -37
  46. package/dist/components/empty.mjs +5 -5
  47. package/dist/components/field.d.mts +1 -1
  48. package/dist/components/field.mjs +11 -12
  49. package/dist/components/form.d.mts +6 -7
  50. package/dist/components/form.mjs +6 -7
  51. package/dist/components/hover-card.d.mts +5 -5
  52. package/dist/components/hover-card.mjs +14 -12
  53. package/dist/components/input-group.d.mts +1 -1
  54. package/dist/components/input-group.mjs +12 -7
  55. package/dist/components/input-number.d.mts +3 -1
  56. package/dist/components/input-number.mjs +49 -27
  57. package/dist/components/input-otp.mjs +9 -7
  58. package/dist/components/input-password.mjs +1 -4
  59. package/dist/components/input-search.mjs +3 -5
  60. package/dist/components/input.mjs +1 -2
  61. package/dist/components/item.mjs +9 -9
  62. package/dist/components/kbd.mjs +1 -1
  63. package/dist/components/label.d.mts +2 -2
  64. package/dist/components/label.mjs +3 -4
  65. package/dist/components/menubar.d.mts +22 -16
  66. package/dist/components/menubar.mjs +54 -47
  67. package/dist/components/native-select.d.mts +5 -1
  68. package/dist/components/native-select.mjs +9 -6
  69. package/dist/components/navigation-menu.d.mts +30 -8
  70. package/dist/components/navigation-menu.mjs +33 -23
  71. package/dist/components/pagination.d.mts +6 -0
  72. package/dist/components/pagination.mjs +26 -11
  73. package/dist/components/popover.d.mts +40 -7
  74. package/dist/components/popover.mjs +46 -14
  75. package/dist/components/progress-circle.d.mts +1 -1
  76. package/dist/components/progress-circle.mjs +1 -2
  77. package/dist/components/progress.d.mts +2 -2
  78. package/dist/components/progress.mjs +5 -6
  79. package/dist/components/radio-cards.d.mts +3 -3
  80. package/dist/components/radio-cards.mjs +11 -11
  81. package/dist/components/radio-group.d.mts +3 -3
  82. package/dist/components/radio-group.mjs +9 -9
  83. package/dist/components/radio.mjs +2 -3
  84. package/dist/components/resizable.mjs +3 -8
  85. package/dist/components/scroll-area.d.mts +5 -5
  86. package/dist/components/scroll-area.mjs +13 -10
  87. package/dist/components/select.d.mts +14 -14
  88. package/dist/components/select.mjs +47 -47
  89. package/dist/components/separator.d.mts +2 -2
  90. package/dist/components/separator.mjs +3 -4
  91. package/dist/components/sheet.d.mts +13 -14
  92. package/dist/components/sheet.mjs +41 -39
  93. package/dist/components/sidebar.d.mts +2 -3
  94. package/dist/components/sidebar.mjs +46 -46
  95. package/dist/components/skeleton.mjs +1 -1
  96. package/dist/components/slider.d.mts +2 -2
  97. package/dist/components/slider.mjs +9 -11
  98. package/dist/components/sonner.mjs +11 -3
  99. package/dist/components/spinner.mjs +6 -7
  100. package/dist/components/switch.d.mts +5 -2
  101. package/dist/components/switch.mjs +7 -7
  102. package/dist/components/table.mjs +10 -10
  103. package/dist/components/tabs.d.mts +8 -5
  104. package/dist/components/tabs.mjs +18 -12
  105. package/dist/components/textarea.mjs +1 -1
  106. package/dist/components/toggle-group.d.mts +9 -6
  107. package/dist/components/toggle-group.mjs +19 -20
  108. package/dist/components/toggle.d.mts +2 -3
  109. package/dist/components/toggle.mjs +4 -6
  110. package/dist/components/tooltip.d.mts +7 -6
  111. package/dist/components/tooltip.mjs +19 -17
  112. package/dist/hooks/use-animated-value.mjs +0 -1
  113. package/dist/hooks/use-copy-to-clipboard.mjs +0 -1
  114. package/dist/hooks/use-is-mobile.mjs +0 -1
  115. package/dist/hooks/use-media-query.mjs +0 -1
  116. package/dist/hooks/use-mutation-observer.mjs +0 -1
  117. package/dist/hooks/use-pagination.mjs +0 -1
  118. package/dist/index.d.mts +15 -13
  119. package/dist/index.mjs +18 -16
  120. package/dist/primitives/checkbox-group.d.mts +9 -10
  121. package/dist/primitives/checkbox-group.mjs +14 -19
  122. package/dist/primitives/input-number.d.mts +3 -3
  123. package/dist/primitives/input-number.mjs +3 -5
  124. package/dist/primitives/input.d.mts +4 -4
  125. package/dist/primitives/input.mjs +2 -3
  126. package/dist/primitives/progress-circle.d.mts +3 -3
  127. package/dist/primitives/progress-circle.mjs +2 -3
  128. package/dist/variants/alert.d.mts +1 -1
  129. package/dist/variants/alert.mjs +3 -13
  130. package/dist/variants/badge.d.mts +6 -4
  131. package/dist/variants/badge.mjs +7 -34
  132. package/dist/variants/button-group.d.mts +2 -2
  133. package/dist/variants/button-group.mjs +3 -14
  134. package/dist/variants/button.d.mts +12 -10
  135. package/dist/variants/button.mjs +15 -57
  136. package/dist/variants/empty.d.mts +1 -1
  137. package/dist/variants/empty.mjs +2 -7
  138. package/dist/variants/field.d.mts +3 -3
  139. package/dist/variants/field.mjs +4 -22
  140. package/dist/variants/input-group.d.mts +9 -9
  141. package/dist/variants/input-group.mjs +11 -70
  142. package/dist/variants/input-number.d.mts +45 -0
  143. package/dist/variants/input-number.mjs +40 -0
  144. package/dist/variants/item.d.mts +5 -4
  145. package/dist/variants/item.mjs +9 -31
  146. package/dist/variants/navigation-menu.d.mts +1 -1
  147. package/dist/variants/navigation-menu.mjs +1 -5
  148. package/dist/variants/progress-circle.d.mts +1 -1
  149. package/dist/variants/progress-circle.mjs +1 -5
  150. package/dist/variants/scroll-area.d.mts +2 -2
  151. package/dist/variants/scroll-area.mjs +3 -8
  152. package/dist/variants/separator.mjs +6 -6
  153. package/dist/variants/sheet.d.mts +4 -4
  154. package/dist/variants/sheet.mjs +5 -38
  155. package/dist/variants/sidebar.d.mts +4 -4
  156. package/dist/variants/sidebar.mjs +6 -23
  157. package/dist/variants/tabs.d.mts +18 -0
  158. package/dist/variants/tabs.mjs +15 -0
  159. package/dist/variants/toggle.d.mts +4 -4
  160. package/dist/variants/toggle.mjs +9 -27
  161. package/package.json +27 -44
  162. package/src/components/accordion.tsx +26 -68
  163. package/src/components/alert-dialog.tsx +70 -86
  164. package/src/components/alert.tsx +27 -19
  165. package/src/components/aspect-ratio.tsx +1 -4
  166. package/src/components/avatar.tsx +99 -12
  167. package/src/components/badge.tsx +5 -8
  168. package/src/components/breadcrumb.tsx +18 -24
  169. package/src/components/button-group.tsx +10 -20
  170. package/src/components/button.tsx +8 -19
  171. package/src/components/calendar.tsx +77 -132
  172. package/src/components/card.tsx +16 -22
  173. package/src/components/carousel.tsx +38 -56
  174. package/src/components/chart.tsx +41 -92
  175. package/src/components/checkbox-cards.tsx +10 -30
  176. package/src/components/checkbox-group.tsx +5 -28
  177. package/src/components/checkbox.tsx +5 -26
  178. package/src/components/collapsible.tsx +1 -4
  179. package/src/components/command.tsx +52 -65
  180. package/src/components/context-menu.tsx +46 -125
  181. package/src/components/dialog.tsx +49 -101
  182. package/src/components/direction.tsx +32 -0
  183. package/src/components/drawer.tsx +17 -79
  184. package/src/components/dropdown-menu.tsx +39 -118
  185. package/src/components/empty.tsx +6 -20
  186. package/src/components/field.tsx +19 -52
  187. package/src/components/form.tsx +19 -61
  188. package/src/components/hover-card.tsx +4 -27
  189. package/src/components/input-group.tsx +13 -52
  190. package/src/components/input-number.tsx +55 -75
  191. package/src/components/input-otp.tsx +19 -38
  192. package/src/components/input-password.tsx +5 -29
  193. package/src/components/input-search.tsx +6 -23
  194. package/src/components/input.tsx +1 -17
  195. package/src/components/item.tsx +17 -31
  196. package/src/components/kbd.tsx +2 -14
  197. package/src/components/label.tsx +2 -10
  198. package/src/components/menubar.tsx +34 -125
  199. package/src/components/native-select.tsx +21 -30
  200. package/src/components/navigation-menu.tsx +34 -94
  201. package/src/components/pagination.tsx +28 -34
  202. package/src/components/popover.tsx +66 -35
  203. package/src/components/progress-circle.tsx +7 -25
  204. package/src/components/progress.tsx +3 -16
  205. package/src/components/radio-cards.tsx +8 -27
  206. package/src/components/radio-group.tsx +7 -27
  207. package/src/components/radio.tsx +3 -24
  208. package/src/components/resizable.tsx +5 -26
  209. package/src/components/scroll-area.tsx +12 -32
  210. package/src/components/select.tsx +36 -59
  211. package/src/components/separator.tsx +4 -18
  212. package/src/components/sheet.tsx +37 -74
  213. package/src/components/sidebar.tsx +47 -177
  214. package/src/components/skeleton.tsx +1 -3
  215. package/src/components/slider.tsx +7 -36
  216. package/src/components/sonner.tsx +16 -6
  217. package/src/components/spinner.tsx +6 -15
  218. package/src/components/switch.tsx +8 -30
  219. package/src/components/table.tsx +18 -35
  220. package/src/components/tabs.tsx +16 -34
  221. package/src/components/textarea.tsx +1 -15
  222. package/src/components/toggle-group.tsx +34 -38
  223. package/src/components/toggle.tsx +4 -13
  224. package/src/components/tooltip.tsx +11 -37
  225. package/src/css/foundation/base.css +50 -0
  226. package/src/css/foundation/motion.css +36 -0
  227. package/src/css/foundation/source.css +3 -0
  228. package/src/css/foundation/tokens.css +71 -0
  229. package/src/css/foundation/variants.css +113 -0
  230. package/src/css/preset.css +5 -214
  231. package/src/css/style.css +1 -1
  232. package/src/hooks/use-animated-value.ts +1 -7
  233. package/src/hooks/use-copy-to-clipboard.ts +1 -6
  234. package/src/hooks/use-is-mobile.ts +0 -2
  235. package/src/hooks/use-media-query.ts +0 -2
  236. package/src/hooks/use-mutation-observer.ts +0 -3
  237. package/src/hooks/use-pagination.ts +0 -2
  238. package/src/index.ts +39 -80
  239. package/src/primitives/checkbox-group.tsx +25 -39
  240. package/src/primitives/input-number.tsx +17 -63
  241. package/src/primitives/input.tsx +8 -24
  242. package/src/primitives/progress-circle.tsx +13 -43
  243. package/src/variants/alert.ts +3 -14
  244. package/src/variants/badge.ts +8 -35
  245. package/src/variants/button-group.ts +5 -18
  246. package/src/variants/button.ts +21 -58
  247. package/src/variants/empty.ts +2 -11
  248. package/src/variants/field.ts +6 -19
  249. package/src/variants/input-group.ts +12 -64
  250. package/src/variants/input-number.ts +65 -0
  251. package/src/variants/item.ts +10 -32
  252. package/src/variants/navigation-menu.ts +1 -8
  253. package/src/variants/progress-circle.ts +1 -2
  254. package/src/variants/scroll-area.ts +3 -9
  255. package/src/variants/separator.ts +6 -7
  256. package/src/variants/sheet.ts +6 -39
  257. package/src/variants/sidebar.ts +7 -27
  258. package/src/variants/tabs.ts +34 -0
  259. package/src/variants/toggle.ts +9 -28
  260. /package/src/css/{amber.css → themes/amber.css} +0 -0
  261. /package/src/css/{blue.css → themes/blue.css} +0 -0
  262. /package/src/css/{cyan.css → themes/cyan.css} +0 -0
  263. /package/src/css/{emerald.css → themes/emerald.css} +0 -0
  264. /package/src/css/{fuchsia.css → themes/fuchsia.css} +0 -0
  265. /package/src/css/{gray.css → themes/gray.css} +0 -0
  266. /package/src/css/{green.css → themes/green.css} +0 -0
  267. /package/src/css/{indigo.css → themes/indigo.css} +0 -0
  268. /package/src/css/{lime.css → themes/lime.css} +0 -0
  269. /package/src/css/{neutral.css → themes/neutral.css} +0 -0
  270. /package/src/css/{orange.css → themes/orange.css} +0 -0
  271. /package/src/css/{pink.css → themes/pink.css} +0 -0
  272. /package/src/css/{purple.css → themes/purple.css} +0 -0
  273. /package/src/css/{red.css → themes/red.css} +0 -0
  274. /package/src/css/{rose.css → themes/rose.css} +0 -0
  275. /package/src/css/{sky.css → themes/sky.css} +0 -0
  276. /package/src/css/{slate.css → themes/slate.css} +0 -0
  277. /package/src/css/{stone.css → themes/stone.css} +0 -0
  278. /package/src/css/{teal.css → themes/teal.css} +0 -0
  279. /package/src/css/{violet.css → themes/violet.css} +0 -0
  280. /package/src/css/{yellow.css → themes/yellow.css} +0 -0
  281. /package/src/css/{zinc.css → themes/zinc.css} +0 -0
@@ -1,14 +1,12 @@
1
- "use client";
1
+ import { XIcon } from "lucide-react";
2
+ import { Dialog as SheetPrimitive } from "radix-ui";
3
+ import type { ComponentProps, JSX } from "react";
2
4
 
5
+ import { cn } from "#/lib/utils";
3
6
  import type { ButtonVariants } from "#/variants/button";
4
7
  import { buttonVariants } from "#/variants/button";
5
8
  import type { SheetContentVariants } from "#/variants/sheet";
6
9
  import { sheetContentVariants } from "#/variants/sheet";
7
- import type { ComponentProps, JSX } from "react";
8
-
9
- import { cn } from "#/lib/utils";
10
- import * as SheetPrimitive from "@radix-ui/react-dialog";
11
- import { XIcon } from "lucide-react";
12
10
 
13
11
  /* -----------------------------------------------------------------------------
14
12
  * Component: Sheet
@@ -22,12 +20,8 @@ type SheetProps = ComponentProps<typeof SheetPrimitive.Root>;
22
20
  /**
23
21
  * @since 0.3.16-canary.0
24
22
  */
25
- function Sheet({ children, ...props }: SheetProps): JSX.Element {
26
- return (
27
- <SheetPrimitive.Root data-slot="sheet" {...props}>
28
- {children}
29
- </SheetPrimitive.Root>
30
- );
23
+ function Sheet({ ...props }: SheetProps): JSX.Element {
24
+ return <SheetPrimitive.Root data-slot="sheet" {...props} />;
31
25
  }
32
26
 
33
27
  /* -----------------------------------------------------------------------------
@@ -53,13 +47,8 @@ function SheetTrigger({ ...props }: SheetTriggerProps): JSX.Element {
53
47
  /**
54
48
  * @since 0.3.16-canary.0
55
49
  */
56
- interface SheetContentProps
57
- extends ComponentProps<typeof SheetPrimitive.Content>, SheetContentVariants {
58
- classNames?: {
59
- close?: string;
60
- content?: string;
61
- overlay?: string;
62
- };
50
+ interface SheetContentProps extends ComponentProps<typeof SheetPrimitive.Content>, SheetContentVariants {
51
+ showCloseButton?: boolean;
63
52
  }
64
53
 
65
54
  /**
@@ -68,40 +57,38 @@ interface SheetContentProps
68
57
  function SheetContent({
69
58
  children,
70
59
  className,
71
- classNames,
60
+ showCloseButton = true,
72
61
  side = "right",
73
62
  ...props
74
63
  }: SheetContentProps): JSX.Element {
75
64
  return (
76
- <SheetPrimitive.Portal>
65
+ <SheetPrimitive.Portal data-slot="sheet-portal">
77
66
  <SheetPrimitive.Overlay
78
- className={cn(
79
- "fixed inset-0 z-50",
80
- "bg-black/40 backdrop-blur-sm",
81
- "ease-gentle data-open:animate-in data-open:animation-duration-380 data-open:fade-in-0",
82
- "data-closed:animate-out data-closed:animation-duration-280 data-closed:fade-out-0",
83
- "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
84
- classNames?.overlay,
85
- )}
67
+ className={
68
+ "fixed inset-0 z-50 bg-black/10 ease-gentle supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:animation-duration-panel-in data-open:fade-in-0 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-panel-out data-closed:fade-out-0"
69
+ }
86
70
  data-slot="sheet-overlay"
87
71
  />
88
72
  <SheetPrimitive.Content
89
- className={sheetContentVariants({ className: [classNames?.content, className], side })}
73
+ className={sheetContentVariants({ className, side })}
74
+ data-side={side}
90
75
  data-slot="sheet-content"
91
76
  {...props}
92
77
  >
93
78
  {children}
94
- <SheetPrimitive.Close
95
- className={buttonVariants({
96
- className: ["absolute top-4 right-4 size-7", classNames?.close],
97
- size: "icon",
98
- variant: "ghost",
99
- })}
100
- data-slot="sheet-close"
101
- >
102
- <XIcon className="size-4" />
103
- <span className="sr-only">Close</span>
104
- </SheetPrimitive.Close>
79
+ {showCloseButton ? (
80
+ <SheetPrimitive.Close
81
+ className={buttonVariants({
82
+ className: "absolute top-4 right-4",
83
+ size: "icon-sm",
84
+ variant: "ghost",
85
+ })}
86
+ data-slot="sheet-close"
87
+ >
88
+ <XIcon />
89
+ <span className="sr-only">Close</span>
90
+ </SheetPrimitive.Close>
91
+ ) : null}
105
92
  </SheetPrimitive.Content>
106
93
  </SheetPrimitive.Portal>
107
94
  );
@@ -120,17 +107,7 @@ type SheetHeaderProps = ComponentProps<"div">;
120
107
  * @since 0.3.16-canary.0
121
108
  */
122
109
  function SheetHeader({ className, ...props }: SheetHeaderProps): JSX.Element {
123
- return (
124
- <header
125
- className={cn(
126
- "flex shrink-0 flex-col gap-1.5 px-6 pt-6 pb-4 text-center",
127
- "sm:text-left",
128
- className,
129
- )}
130
- data-slot="sheet-header"
131
- {...props}
132
- />
133
- );
110
+ return <div className={cn("flex shrink-0 flex-col gap-1.5 p-4", className)} data-slot="sheet-header" {...props} />;
134
111
  }
135
112
 
136
113
  /* -----------------------------------------------------------------------------
@@ -138,6 +115,10 @@ function SheetHeader({ className, ...props }: SheetHeaderProps): JSX.Element {
138
115
  * -------------------------------------------------------------------------- */
139
116
 
140
117
  /**
118
+ * Optional scrollable region for long content. When used, the Header and Footer
119
+ * stay pinned (shrink-0) and only this body scrolls. A codefast enhancement over
120
+ * radix-vega.
121
+ *
141
122
  * @since 0.3.16-canary.0
142
123
  */
143
124
  type SheetBodyProps = ComponentProps<"div">;
@@ -146,13 +127,7 @@ type SheetBodyProps = ComponentProps<"div">;
146
127
  * @since 0.3.16-canary.0
147
128
  */
148
129
  function SheetBody({ className, ...props }: SheetBodyProps): JSX.Element {
149
- return (
150
- <main
151
- className={cn("overflow-auto", "px-6 py-2", className)}
152
- data-slot="sheet-body"
153
- {...props}
154
- />
155
- );
130
+ return <div className={cn("min-h-0 flex-1 overflow-y-auto px-4", className)} data-slot="sheet-body" {...props} />;
156
131
  }
157
132
 
158
133
  /* -----------------------------------------------------------------------------
@@ -169,15 +144,7 @@ type SheetFooterProps = ComponentProps<"div">;
169
144
  */
170
145
  function SheetFooter({ className, ...props }: SheetFooterProps): JSX.Element {
171
146
  return (
172
- <footer
173
- className={cn(
174
- "flex shrink-0 flex-col-reverse gap-2 px-6 pt-4 pb-6",
175
- "sm:flex-row sm:justify-end",
176
- className,
177
- )}
178
- data-slot="sheet-footer"
179
- {...props}
180
- />
147
+ <div className={cn("mt-auto flex shrink-0 flex-col gap-2 p-4", className)} data-slot="sheet-footer" {...props} />
181
148
  );
182
149
  }
183
150
 
@@ -196,7 +163,7 @@ type SheetTitleProps = ComponentProps<typeof SheetPrimitive.Title>;
196
163
  function SheetTitle({ className, ...props }: SheetTitleProps): JSX.Element {
197
164
  return (
198
165
  <SheetPrimitive.Title
199
- className={cn("text-lg font-semibold text-foreground", className)}
166
+ className={cn("font-heading font-medium text-foreground", className)}
200
167
  data-slot="sheet-title"
201
168
  {...props}
202
169
  />
@@ -242,11 +209,7 @@ interface SheetCloseProps extends ComponentProps<typeof SheetPrimitive.Close> {
242
209
  */
243
210
  function SheetClose({ className, size, variant, ...props }: SheetCloseProps): JSX.Element {
244
211
  return (
245
- <SheetPrimitive.Close
246
- className={buttonVariants({ className, size, variant })}
247
- data-slot="sheet-close"
248
- {...props}
249
- />
212
+ <SheetPrimitive.Close className={buttonVariants({ className, size, variant })} data-slot="sheet-close" {...props} />
250
213
  );
251
214
  }
252
215
 
@@ -1,14 +1,7 @@
1
- "use client";
2
-
3
- import type { SidebarMenuButtonVariants } from "#/variants/sidebar";
4
- import type { ComponentProps, CSSProperties, Dispatch, JSX, SetStateAction } from "react";
5
-
6
- import { cn } from "#/lib/utils";
7
-
8
- import { sidebarMenuButtonVariants } from "#/variants/sidebar";
9
- import { createContext } from "@radix-ui/react-context";
10
- import { Slot } from "@radix-ui/react-slot";
11
1
  import { PanelLeftIcon } from "lucide-react";
2
+ import { Slot } from "radix-ui";
3
+ import { Context } from "radix-ui/internal";
4
+ import type { ComponentProps, CSSProperties, Dispatch, JSX, SetStateAction } from "react";
12
5
  import { useCallback, useEffect, useState } from "react";
13
6
 
14
7
  import { Button } from "#/components/button";
@@ -18,6 +11,9 @@ import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from "
18
11
  import { Skeleton } from "#/components/skeleton";
19
12
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "#/components/tooltip";
20
13
  import { useIsMobile } from "#/hooks/use-is-mobile";
14
+ import { cn } from "#/lib/utils";
15
+ import type { SidebarMenuButtonVariants } from "#/variants/sidebar";
16
+ import { sidebarMenuButtonVariants } from "#/variants/sidebar";
21
17
 
22
18
  const SIDEBAR_COOKIE_NAME = "sidebar_state";
23
19
  const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
@@ -42,8 +38,7 @@ interface SidebarContextValue {
42
38
 
43
39
  const SIDEBAR_PROVIDER_NAME = "SidebarProvider";
44
40
 
45
- const [SidebarContextProvider, useSidebar] =
46
- createContext<SidebarContextValue>(SIDEBAR_PROVIDER_NAME);
41
+ const [SidebarContextProvider, useSidebar] = Context.createContext<SidebarContextValue>(SIDEBAR_PROVIDER_NAME);
47
42
 
48
43
  /* -----------------------------------------------------------------------------
49
44
  * Component: SidebarProvider
@@ -134,11 +129,7 @@ function SidebarProvider({
134
129
  >
135
130
  <TooltipProvider delayDuration={0}>
136
131
  <div
137
- className={cn(
138
- "group/sidebar-wrapper flex min-h-svh w-full",
139
- "has-data-[variant=inset]:bg-sidebar",
140
- className,
141
- )}
132
+ className={cn("group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar", className)}
142
133
  data-slot="sidebar-wrapper"
143
134
  style={
144
135
  {
@@ -187,11 +178,7 @@ function Sidebar({
187
178
  if (collapsible === "none") {
188
179
  return (
189
180
  <div
190
- className={cn(
191
- "flex h-full w-(--sidebar-width) flex-col",
192
- "bg-sidebar text-sidebar-foreground",
193
- className,
194
- )}
181
+ className={cn("flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground", className)}
195
182
  data-slot="sidebar"
196
183
  {...props}
197
184
  >
@@ -204,11 +191,7 @@ function Sidebar({
204
191
  return (
205
192
  <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
206
193
  <SheetContent
207
- className={cn(
208
- "w-(--sidebar-width) p-0",
209
- "bg-sidebar text-sidebar-foreground",
210
- "[&>button]:hidden",
211
- )}
194
+ className="w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
212
195
  data-mobile="true"
213
196
  data-sidebar="sidebar"
214
197
  data-slot="sidebar"
@@ -231,7 +214,7 @@ function Sidebar({
231
214
 
232
215
  return (
233
216
  <div
234
- className={cn("group peer hidden", "text-sidebar-foreground", "md:block", className)}
217
+ className={cn("group peer hidden text-sidebar-foreground md:block", className)}
235
218
  data-collapsible={state === "collapsed" ? collapsible : ""}
236
219
  data-side={side}
237
220
  data-slot="sidebar"
@@ -241,13 +224,7 @@ function Sidebar({
241
224
  {/* This is what handles the sidebar gap on desktop */}
242
225
  <div
243
226
  className={cn(
244
- "relative",
245
- "w-(--sidebar-width)",
246
- "bg-transparent",
247
- "transition-[width] duration-200 ease-linear",
248
- "motion-reduce:transition-none motion-reduce:duration-0",
249
- "group-data-[collapsible=offcanvas]:w-0",
250
- "group-data-side-right:rotate-180",
227
+ "relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-gentle group-data-[collapsible=offcanvas]:w-0 group-data-side-right:rotate-180",
251
228
  variant === "floating" || variant === "inset"
252
229
  ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]"
253
230
  : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)",
@@ -256,28 +233,18 @@ function Sidebar({
256
233
  />
257
234
  <div
258
235
  className={cn(
259
- "fixed inset-y-0 z-10 hidden",
260
- "h-svh w-(--sidebar-width)",
261
- "transition-[left,right,width] duration-200 ease-linear",
262
- "motion-reduce:transition-none motion-reduce:duration-0",
263
- "md:flex",
264
- side === "left"
265
- ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
266
- : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
236
+ "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-gentle md:flex data-side-right:right-0 data-side-right:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] data-side-left:left-0 data-side-left:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]",
267
237
  variant === "floating" || variant === "inset"
268
238
  ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]"
269
239
  : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-side-right:border-l group-data-side-left:border-r",
270
240
  className,
271
241
  )}
242
+ data-side={side}
272
243
  data-slot="sidebar-container"
273
244
  {...props}
274
245
  >
275
246
  <div
276
- className={cn(
277
- "flex h-full w-full flex-col",
278
- "bg-sidebar",
279
- "group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow-sm",
280
- )}
247
+ className="flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border"
281
248
  data-sidebar="sidebar"
282
249
  data-slot="sidebar-inner"
283
250
  >
@@ -302,15 +269,14 @@ type SidebarTriggerProps = ComponentProps<typeof Button>;
302
269
  /**
303
270
  * @since 0.3.16-canary.0
304
271
  */
305
- function SidebarTrigger({ className, onClick, ...props }: SidebarTriggerProps): JSX.Element {
272
+ function SidebarTrigger({ onClick, ...props }: SidebarTriggerProps): JSX.Element {
306
273
  const { toggleSidebar } = useSidebar(SIDEBAR_TRIGGER_NAME);
307
274
 
308
275
  return (
309
276
  <Button
310
- className={cn("size-7", className)}
311
277
  data-sidebar="trigger"
312
278
  data-slot="sidebar-trigger"
313
- size="icon"
279
+ size="icon-sm"
314
280
  variant="ghost"
315
281
  onClick={(event) => {
316
282
  onClick?.(event);
@@ -318,7 +284,7 @@ function SidebarTrigger({ className, onClick, ...props }: SidebarTriggerProps):
318
284
  }}
319
285
  {...props}
320
286
  >
321
- <PanelLeftIcon />
287
+ <PanelLeftIcon className="rtl:rotate-180" />
322
288
  <span className="sr-only">Toggle Sidebar</span>
323
289
  </Button>
324
290
  );
@@ -344,23 +310,7 @@ function SidebarRail({ className, ...props }: SidebarRailProps): JSX.Element {
344
310
  return (
345
311
  <button
346
312
  className={cn(
347
- "absolute inset-y-0 z-20 hidden",
348
- "w-4 -translate-x-1/2 transition-all ease-linear",
349
- "motion-reduce:transition-none",
350
- "in-data-side-right:cursor-e-resize",
351
- "in-data-side-left:cursor-w-resize",
352
- "group-data-[collapsible=offcanvas]:translate-x-0",
353
- "group-data-side-right:left-0",
354
- "group-data-side-left:-right-4",
355
- "after:absolute after:inset-y-0 after:left-1/2 after:w-0.5",
356
- "group-data-[collapsible=offcanvas]:after:left-full",
357
- "hover:group-data-[collapsible=offcanvas]:bg-sidebar",
358
- "hover:after:bg-sidebar-border",
359
- "sm:flex",
360
- "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
361
- "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize",
362
- "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
363
- "[[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
313
+ "absolute inset-y-0 z-20 hidden w-4 transition-all ease-gentle 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:inset-s-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-right:cursor-e-resize in-data-side-left:cursor-w-resize sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2 [[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",
364
314
  className,
365
315
  )}
366
316
  data-sidebar="rail"
@@ -389,10 +339,7 @@ function SidebarInset({ className, ...props }: SidebarInsetProps): JSX.Element {
389
339
  return (
390
340
  <main
391
341
  className={cn(
392
- "relative flex w-full min-w-0 flex-1 flex-col",
393
- "bg-background",
394
- "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",
395
- "md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2",
342
+ "relative flex w-full 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-collapsed:ml-2",
396
343
  className,
397
344
  )}
398
345
  data-slot="sidebar-inset"
@@ -416,7 +363,7 @@ type SidebarInputProps = ComponentProps<typeof Input>;
416
363
  function SidebarInput({ className, ...props }: SidebarInputProps): JSX.Element {
417
364
  return (
418
365
  <Input
419
- className={cn("h-8 w-full", "bg-background shadow-none", className)}
366
+ className={cn("h-8 w-full bg-background shadow-none", className)}
420
367
  data-sidebar="input"
421
368
  data-slot="sidebar-input"
422
369
  {...props}
@@ -439,7 +386,7 @@ type SidebarHeaderProps = ComponentProps<"div">;
439
386
  function SidebarHeader({ className, ...props }: SidebarHeaderProps): JSX.Element {
440
387
  return (
441
388
  <div
442
- className={cn("flex flex-col gap-2", "p-2", className)}
389
+ className={cn("flex flex-col gap-2 p-2", className)}
443
390
  data-sidebar="header"
444
391
  data-slot="sidebar-header"
445
392
  {...props}
@@ -462,7 +409,7 @@ type SidebarFooterProps = ComponentProps<"div">;
462
409
  function SidebarFooter({ className, ...props }: SidebarFooterProps): JSX.Element {
463
410
  return (
464
411
  <div
465
- className={cn("flex flex-col gap-2", "p-2", className)}
412
+ className={cn("flex flex-col gap-2 p-2", className)}
466
413
  data-sidebar="footer"
467
414
  data-slot="sidebar-footer"
468
415
  {...props}
@@ -485,7 +432,7 @@ type SidebarSeparatorProps = ComponentProps<typeof Separator>;
485
432
  function SidebarSeparator({ className, ...props }: SidebarSeparatorProps): JSX.Element {
486
433
  return (
487
434
  <Separator
488
- className={cn("mx-2 w-auto", "bg-sidebar-border", className)}
435
+ className={cn("mx-2 w-auto bg-sidebar-border", className)}
489
436
  data-sidebar="separator"
490
437
  data-slot="sidebar-separator"
491
438
  {...props}
@@ -509,8 +456,7 @@ function SidebarContent({ className, ...props }: SidebarContentProps): JSX.Eleme
509
456
  return (
510
457
  <div
511
458
  className={cn(
512
- "flex min-h-0 flex-1 flex-col gap-2 overflow-auto",
513
- "group-data-[collapsible=icon]:overflow-hidden",
459
+ "flex min-h-0 flex-1 scrollbar-none flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
514
460
  className,
515
461
  )}
516
462
  data-sidebar="content"
@@ -535,7 +481,7 @@ type SidebarGroupProps = ComponentProps<"div">;
535
481
  function SidebarGroup({ className, ...props }: SidebarGroupProps): JSX.Element {
536
482
  return (
537
483
  <div
538
- className={cn("relative flex w-full min-w-0 flex-col", "p-2", className)}
484
+ className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
539
485
  data-sidebar="group"
540
486
  data-slot="sidebar-group"
541
487
  {...props}
@@ -557,24 +503,13 @@ interface SidebarGroupLabelProps extends ComponentProps<"div"> {
557
503
  /**
558
504
  * @since 0.3.16-canary.0
559
505
  */
560
- function SidebarGroupLabel({
561
- asChild = false,
562
- className,
563
- ...props
564
- }: SidebarGroupLabelProps): JSX.Element {
565
- const Component = asChild ? Slot : "div";
506
+ function SidebarGroupLabel({ asChild = false, className, ...props }: SidebarGroupLabelProps): JSX.Element {
507
+ const Component = asChild ? Slot.Root : "div";
566
508
 
567
509
  return (
568
510
  <Component
569
511
  className={cn(
570
- "flex h-8 shrink-0 items-center px-2",
571
- "rounded-md ring-sidebar-ring outline-hidden",
572
- "truncate text-xs font-medium text-sidebar-foreground/70",
573
- "transition-[margin,opacity] duration-200 ease-linear",
574
- "motion-reduce:transition-none motion-reduce:duration-0",
575
- "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
576
- "focus-visible:ring-3",
577
- "[&>svg]:size-4 [&>svg]:shrink-0",
512
+ "flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-gentle group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
578
513
  className,
579
514
  )}
580
515
  data-sidebar="group-label"
@@ -598,27 +533,13 @@ interface SidebarGroupActionProps extends ComponentProps<"button"> {
598
533
  /**
599
534
  * @since 0.3.16-canary.0
600
535
  */
601
- function SidebarGroupAction({
602
- asChild = false,
603
- className,
604
- ...props
605
- }: SidebarGroupActionProps): JSX.Element {
606
- const Component = asChild ? Slot : "button";
536
+ function SidebarGroupAction({ asChild = false, className, ...props }: SidebarGroupActionProps): JSX.Element {
537
+ const Component = asChild ? Slot.Root : "button";
607
538
 
608
539
  return (
609
540
  <Component
610
541
  className={cn(
611
- "absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center p-0",
612
- "rounded-md ring-sidebar-ring outline-hidden",
613
- "text-sidebar-foreground",
614
- "transition-transform",
615
- "motion-reduce:transition-none",
616
- "group-data-[collapsible=icon]:hidden",
617
- "after:absolute after:-inset-2",
618
- "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
619
- "focus-visible:ring-3",
620
- "md:after:hidden",
621
- "[&>svg]:size-4 [&>svg]:shrink-0",
542
+ "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-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0",
622
543
  className,
623
544
  )}
624
545
  data-sidebar="group-action"
@@ -643,7 +564,7 @@ type SidebarGroupContentProps = ComponentProps<"div">;
643
564
  function SidebarGroupContent({ className, ...props }: SidebarGroupContentProps): JSX.Element {
644
565
  return (
645
566
  <div
646
- className={cn("w-full", "text-sm", className)}
567
+ className={cn("w-full text-sm", className)}
647
568
  data-sidebar="group-content"
648
569
  data-slot="sidebar-group-content"
649
570
  {...props}
@@ -719,17 +640,17 @@ function SidebarMenuButton({
719
640
  asChild = false,
720
641
  className,
721
642
  isActive = false,
722
- size = "md",
643
+ size = "default",
723
644
  tooltip,
724
645
  variant = "default",
725
646
  ...props
726
647
  }: SidebarMenuButtonProps): JSX.Element {
727
- const Component = asChild ? Slot : "button";
648
+ const Component = asChild ? Slot.Root : "button";
728
649
  const { isMobile, state } = useSidebar(SIDEBAR_MENU_BUTTON_NAME);
729
650
 
730
651
  const button = (
731
652
  <Component
732
- className={cn(sidebarMenuButtonVariants({ size, variant }), className)}
653
+ className={sidebarMenuButtonVariants({ size, variant, className })}
733
654
  data-active={isActive}
734
655
  data-sidebar="menu-button"
735
656
  data-size={size}
@@ -751,12 +672,7 @@ function SidebarMenuButton({
751
672
  return (
752
673
  <Tooltip>
753
674
  <TooltipTrigger asChild>{button}</TooltipTrigger>
754
- <TooltipContent
755
- align="center"
756
- hidden={state !== "collapsed" || isMobile}
757
- side="right"
758
- {...tooltip}
759
- />
675
+ <TooltipContent align="center" hidden={state !== "collapsed" || isMobile} side="right" {...tooltip} />
760
676
  </Tooltip>
761
677
  );
762
678
  }
@@ -782,28 +698,14 @@ function SidebarMenuAction({
782
698
  showOnHover = false,
783
699
  ...props
784
700
  }: SidebarMenuActionProps): JSX.Element {
785
- const Component = asChild ? Slot : "button";
701
+ const Component = asChild ? Slot.Root : "button";
786
702
 
787
703
  return (
788
704
  <Component
789
705
  className={cn(
790
- "absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center p-0",
791
- "rounded-md ring-sidebar-ring outline-hidden",
792
- "text-sidebar-foreground",
793
- "transition-transform",
794
- "motion-reduce:transition-none",
795
- "group-data-[collapsible=icon]:hidden",
796
- "peer-hover/menu-button:text-sidebar-accent-foreground",
797
- "peer-data-[size=default]/menu-button:top-1.5",
798
- "peer-data-[size=lg]/menu-button:top-2.5",
799
- "peer-data-[size=sm]/menu-button:top-1",
800
- "after:absolute after:-inset-2",
801
- "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
802
- "focus-visible:ring-3",
803
- "md:after:hidden",
804
- "[&>svg]:size-4 [&>svg]:shrink-0",
706
+ "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-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0",
805
707
  showOnHover &&
806
- "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",
708
+ "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0",
807
709
  className,
808
710
  )}
809
711
  data-sidebar="menu-action"
@@ -829,16 +731,7 @@ function SidebarMenuBadge({ className, ...props }: SidebarMenuBadgeProps): JSX.E
829
731
  return (
830
732
  <div
831
733
  className={cn(
832
- "absolute right-1 flex h-5 min-w-5 items-center justify-center px-1",
833
- "rounded-md",
834
- "text-xs font-medium text-sidebar-foreground tabular-nums",
835
- "pointer-events-none select-none",
836
- "group-data-[collapsible=icon]:hidden",
837
- "peer-hover/menu-button:text-sidebar-accent-foreground",
838
- "peer-data-[size=default]/menu-button:top-1.5",
839
- "peer-data-[size=lg]/menu-button:top-2.5",
840
- "peer-data-[size=sm]/menu-button:top-1",
841
- "peer-data-active/menu-button:text-sidebar-accent-foreground",
734
+ "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-[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",
842
735
  className,
843
736
  )}
844
737
  data-sidebar="menu-badge"
@@ -862,24 +755,18 @@ interface SidebarMenuSkeletonProps extends ComponentProps<"div"> {
862
755
  /**
863
756
  * @since 0.3.16-canary.0
864
757
  */
865
- function SidebarMenuSkeleton({
866
- className,
867
- showIcon = false,
868
- ...props
869
- }: SidebarMenuSkeletonProps): JSX.Element {
758
+ function SidebarMenuSkeleton({ className, showIcon = false, ...props }: SidebarMenuSkeletonProps): JSX.Element {
870
759
  // Random width between 50 to 90% - use useState with lazy initializer to avoid calling Math.random during render
871
760
  const [width] = useState(() => `${String(Math.floor(Math.random() * 40) + 50)}%`);
872
761
 
873
762
  return (
874
763
  <div
875
- className={cn("flex h-8 items-center gap-2 px-2", "rounded-md", className)}
764
+ className={cn("flex h-8 items-center gap-2 rounded-md px-2", className)}
876
765
  data-sidebar="menu-skeleton"
877
766
  data-slot="sidebar-menu-skeleton"
878
767
  {...props}
879
768
  >
880
- {showIcon ? (
881
- <Skeleton className={cn("size-4", "rounded-md")} data-sidebar="menu-skeleton-icon" />
882
- ) : null}
769
+ {showIcon ? <Skeleton className="size-4 rounded-md" data-sidebar="menu-skeleton-icon" /> : null}
883
770
  <Skeleton
884
771
  className="h-4 max-w-(--skeleton-width) flex-1"
885
772
  data-sidebar="menu-skeleton-text"
@@ -909,10 +796,7 @@ function SidebarMenuSub({ className, ...props }: SidebarMenuSubProps): JSX.Eleme
909
796
  return (
910
797
  <ul
911
798
  className={cn(
912
- "mx-3.5 flex min-w-0 flex-col gap-1 px-2.5 py-0.5",
913
- "border-l border-sidebar-border",
914
- "translate-x-px",
915
- "group-data-[collapsible=icon]:hidden",
799
+ "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",
916
800
  className,
917
801
  )}
918
802
  data-sidebar="menu-sub"
@@ -968,26 +852,12 @@ function SidebarMenuSubButton({
968
852
  size = "md",
969
853
  ...props
970
854
  }: SidebarMenuSubButtonProps): JSX.Element {
971
- const Component = asChild ? Slot : "a";
855
+ const Component = asChild ? Slot.Root : "a";
972
856
 
973
857
  return (
974
858
  <Component
975
859
  className={cn(
976
- "flex h-7 min-w-0 items-center gap-2 overflow-hidden px-2",
977
- "rounded-md ring-sidebar-ring outline-hidden",
978
- "text-sidebar-foreground",
979
- "-translate-x-px",
980
- "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
981
- "focus-visible:ring-3",
982
- "active:bg-sidebar-accent active:text-sidebar-accent-foreground",
983
- "disabled:pointer-events-none disabled:opacity-50",
984
- "aria-disabled:pointer-events-none aria-disabled:opacity-50",
985
- "data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground",
986
- "group-data-[collapsible=icon]:hidden",
987
- "[&>span:last-child]:truncate",
988
- "[&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
989
- size === "sm" && "text-xs",
990
- size === "md" && "text-sm",
860
+ "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 group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
991
861
  className,
992
862
  )}
993
863
  data-active={isActive}
@@ -18,9 +18,7 @@ function Skeleton({ className, ...props }: SkeletonProps): JSX.Element {
18
18
  return (
19
19
  <div
20
20
  className={cn(
21
- "rounded-lg",
22
- "bg-gradient-to-r from-muted via-white/15 to-muted bg-[length:400%_100%]",
23
- "animate-shimmer motion-reduce:animate-none",
21
+ "animate-shimmer rounded-md bg-linear-to-r from-muted via-white/15 to-muted bg-size-[400%_100%]",
24
22
  className,
25
23
  )}
26
24
  data-slot="skeleton"