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

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 +112 -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 +25 -12
  26. package/dist/components/chart.d.mts +8 -3
  27. package/dist/components/chart.mjs +21 -15
  28. package/dist/components/checkbox-cards.mjs +6 -6
  29. package/dist/components/checkbox-group.mjs +6 -7
  30. package/dist/components/checkbox.d.mts +2 -2
  31. package/dist/components/checkbox.mjs +8 -9
  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 +40 -58
  174. package/src/components/chart.tsx +41 -92
  175. package/src/components/checkbox-cards.tsx +11 -30
  176. package/src/components/checkbox-group.tsx +6 -28
  177. package/src/components/checkbox.tsx +6 -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 +37 -60
  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 +74 -0
  226. package/src/css/foundation/motion.css +69 -0
  227. package/src/css/foundation/source.css +10 -0
  228. package/src/css/foundation/tokens.css +107 -0
  229. package/src/css/foundation/variants.css +121 -0
  230. package/src/css/preset.css +13 -214
  231. package/src/css/style.css +9 -1
  232. package/src/css/{amber.css → themes/amber.css} +29 -0
  233. package/src/css/{blue.css → themes/blue.css} +29 -0
  234. package/src/css/{cyan.css → themes/cyan.css} +29 -0
  235. package/src/css/{emerald.css → themes/emerald.css} +29 -0
  236. package/src/css/{fuchsia.css → themes/fuchsia.css} +29 -0
  237. package/src/css/{gray.css → themes/gray.css} +29 -0
  238. package/src/css/{green.css → themes/green.css} +29 -0
  239. package/src/css/{indigo.css → themes/indigo.css} +29 -0
  240. package/src/css/{lime.css → themes/lime.css} +29 -0
  241. package/src/css/{neutral.css → themes/neutral.css} +29 -0
  242. package/src/css/{orange.css → themes/orange.css} +29 -0
  243. package/src/css/{pink.css → themes/pink.css} +29 -0
  244. package/src/css/{purple.css → themes/purple.css} +29 -0
  245. package/src/css/{red.css → themes/red.css} +29 -0
  246. package/src/css/{rose.css → themes/rose.css} +29 -0
  247. package/src/css/{sky.css → themes/sky.css} +29 -0
  248. package/src/css/{slate.css → themes/slate.css} +29 -0
  249. package/src/css/{stone.css → themes/stone.css} +29 -0
  250. package/src/css/{teal.css → themes/teal.css} +29 -0
  251. package/src/css/{violet.css → themes/violet.css} +29 -0
  252. package/src/css/{yellow.css → themes/yellow.css} +29 -0
  253. package/src/css/{zinc.css → themes/zinc.css} +29 -0
  254. package/src/hooks/use-animated-value.ts +1 -7
  255. package/src/hooks/use-copy-to-clipboard.ts +1 -6
  256. package/src/hooks/use-is-mobile.ts +0 -2
  257. package/src/hooks/use-media-query.ts +0 -2
  258. package/src/hooks/use-mutation-observer.ts +0 -3
  259. package/src/hooks/use-pagination.ts +0 -2
  260. package/src/index.ts +39 -80
  261. package/src/primitives/checkbox-group.tsx +25 -39
  262. package/src/primitives/input-number.tsx +17 -63
  263. package/src/primitives/input.tsx +8 -24
  264. package/src/primitives/progress-circle.tsx +13 -43
  265. package/src/variants/alert.ts +3 -14
  266. package/src/variants/badge.ts +8 -35
  267. package/src/variants/button-group.ts +5 -18
  268. package/src/variants/button.ts +21 -58
  269. package/src/variants/empty.ts +2 -11
  270. package/src/variants/field.ts +6 -19
  271. package/src/variants/input-group.ts +12 -64
  272. package/src/variants/input-number.ts +65 -0
  273. package/src/variants/item.ts +10 -32
  274. package/src/variants/navigation-menu.ts +1 -8
  275. package/src/variants/progress-circle.ts +1 -2
  276. package/src/variants/scroll-area.ts +3 -9
  277. package/src/variants/separator.ts +6 -7
  278. package/src/variants/sheet.ts +6 -39
  279. package/src/variants/sidebar.ts +7 -27
  280. package/src/variants/tabs.ts +34 -0
  281. package/src/variants/toggle.ts +9 -28
@@ -1,9 +1,7 @@
1
- "use client";
2
-
1
+ import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
3
2
  import type { ComponentProps, JSX } from "react";
4
3
 
5
4
  import { cn } from "#/lib/utils";
6
- import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
7
5
 
8
6
  /* -----------------------------------------------------------------------------
9
7
  * Component: RadioGroup
@@ -18,13 +16,7 @@ type RadioGroupProps = ComponentProps<typeof RadioGroupPrimitive.Root>;
18
16
  * @since 0.3.16-canary.0
19
17
  */
20
18
  function RadioGroup({ className, ...props }: RadioGroupProps): JSX.Element {
21
- return (
22
- <RadioGroupPrimitive.Root
23
- className={cn("grid gap-2", className)}
24
- data-slot="radio-group"
25
- {...props}
26
- />
27
- );
19
+ return <RadioGroupPrimitive.Root className={cn("grid w-full gap-3", className)} data-slot="radio-group" {...props} />;
28
20
  }
29
21
 
30
22
  /* -----------------------------------------------------------------------------
@@ -43,30 +35,18 @@ function RadioGroupItem({ className, ...props }: RadioGroupItemProps): JSX.Eleme
43
35
  return (
44
36
  <RadioGroupPrimitive.Item
45
37
  className={cn(
46
- "peer inline-flex size-4 shrink-0 items-center justify-center",
47
- "rounded-full border border-input shadow-xs outline-hidden",
48
- "transition-[border-color,background-color,box-shadow] duration-150 ease-spring",
49
- "motion-reduce:transition-none motion-reduce:duration-0",
50
- "hover:not-disabled:not-aria-checked:border-ring/60",
51
- "focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50",
52
- "disabled:opacity-50",
53
- "aria-checked:border-primary aria-checked:bg-primary",
54
- "focus-visible:aria-checked:ring-primary/20",
55
- "aria-invalid:border-destructive aria-invalid:ring-destructive/20",
56
- "hover:not-disabled:not-aria-checked:aria-invalid:border-destructive/60",
57
- "aria-checked:aria-invalid:bg-destructive",
58
- "dark:bg-input/30",
59
- "dark:focus-visible:aria-checked:ring-primary/40",
60
- "dark:aria-invalid:ring-destructive/40",
38
+ "group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary",
61
39
  className,
62
40
  )}
63
41
  data-slot="radio-group-item"
64
42
  {...props}
65
43
  >
66
44
  <RadioGroupPrimitive.Indicator
67
- className={cn("size-1", "rounded-full", "bg-background")}
45
+ className="flex size-4 items-center justify-center"
68
46
  data-slot="radio-group-indicator"
69
- />
47
+ >
48
+ <span className="absolute start-1/2 top-1/2 size-2 -translate-x-1/2 -translate-y-1/2 animate-in rounded-full bg-primary-foreground duration-control-indicator ease-spring zoom-in-50 rtl:translate-x-1/2" />
49
+ </RadioGroupPrimitive.Indicator>
70
50
  </RadioGroupPrimitive.Item>
71
51
  );
72
52
  }
@@ -1,9 +1,7 @@
1
- "use client";
2
-
1
+ import { composeEventHandlers } from "radix-ui/internal";
3
2
  import type { ComponentProps, JSX } from "react";
4
3
 
5
4
  import { cn } from "#/lib/utils";
6
- import { composeEventHandlers } from "@radix-ui/primitive";
7
5
 
8
6
  /* -----------------------------------------------------------------------------
9
7
  * Component: Radio
@@ -23,31 +21,12 @@ function Radio({ className, onChange, onValueChange, ...props }: RadioProps): JS
23
21
  return (
24
22
  <input
25
23
  className={cn(
26
- "peer inline-flex size-4 shrink-0 items-center justify-center",
27
- "rounded-full border border-input shadow-xs outline-hidden",
28
- "appearance-none",
29
- "after:size-full after:rounded-full after:bg-background after:transition-[width,height] after:duration-200 after:ease-spring",
30
- "motion-reduce:after:transition-none motion-reduce:after:duration-0",
31
- "checked:border-primary checked:bg-primary",
32
- "checked:after:size-1",
33
- "hover:not-disabled:not-checked:border-ring/60",
34
- "focus-visible:ring-3 focus-visible:ring-ring/50",
35
- "focus-visible:not-checked:border-ring",
36
- "focus-visible:checked:ring-primary/20",
37
- "disabled:opacity-50",
38
- "aria-invalid:border-destructive aria-invalid:ring-destructive/20",
39
- "checked:aria-invalid:bg-destructive",
40
- "hover:not-disabled:not-checked:aria-invalid:border-destructive/60",
41
- "dark:not-checked:after:bg-input/30",
42
- "dark:focus-visible:checked:ring-primary/40",
43
- "dark:aria-invalid:ring-destructive/40",
24
+ "peer relative flex size-4 shrink-0 appearance-none items-center justify-center rounded-full border border-input bg-background shadow-xs outline-none before:size-2 before:scale-0 before:rounded-full before:bg-primary-foreground before:transition-transform before:duration-control-indicator before:ease-spring after:absolute after:-inset-x-3 after:-inset-y-2 checked:border-primary checked:bg-primary checked:before:scale-100 focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:not-checked:border-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 checked:aria-invalid:bg-destructive dark:not-checked:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
44
25
  className,
45
26
  )}
46
27
  data-slot="radio"
47
28
  type="radio"
48
- onChange={composeEventHandlers(onChange, (event) =>
49
- onValueChange?.(event.currentTarget.value),
50
- )}
29
+ onChange={composeEventHandlers(onChange, (event) => onValueChange?.(event.currentTarget.value))}
51
30
  {...props}
52
31
  />
53
32
  );
@@ -1,10 +1,7 @@
1
- "use client";
2
-
3
1
  import type { ComponentProps, JSX } from "react";
2
+ import * as ResizablePrimitive from "react-resizable-panels";
4
3
 
5
4
  import { cn } from "#/lib/utils";
6
- import { GripVerticalIcon } from "lucide-react";
7
- import * as ResizablePrimitive from "react-resizable-panels";
8
5
 
9
6
  /* -----------------------------------------------------------------------------
10
7
  * Component: ResizableGroup
@@ -21,7 +18,7 @@ type ResizableGroupProps = ComponentProps<typeof ResizablePrimitive.Group>;
21
18
  function ResizableGroup({ className, ...props }: ResizableGroupProps): JSX.Element {
22
19
  return (
23
20
  <ResizablePrimitive.Group
24
- className={cn("flex size-full", className)}
21
+ className={cn("flex h-full w-full aria-[orientation=vertical]:flex-col", className)}
25
22
  data-slot="resizable-group"
26
23
  {...props}
27
24
  />
@@ -58,35 +55,17 @@ interface ResizableSeparatorProps extends ComponentProps<typeof ResizablePrimiti
58
55
  /**
59
56
  * @since 0.3.16-canary.0
60
57
  */
61
- function ResizableSeparator({
62
- className,
63
- withHandle,
64
- ...props
65
- }: ResizableSeparatorProps): JSX.Element {
58
+ function ResizableSeparator({ className, withHandle, ...props }: ResizableSeparatorProps): JSX.Element {
66
59
  return (
67
60
  <ResizablePrimitive.Separator
68
61
  className={cn(
69
- "flex items-center justify-center",
70
- "bg-border outline-hidden",
71
- "focus-visible:bg-ring focus-visible:ring-3 focus-visible:ring-ring/50",
72
- "aria-[orientation=horizontal]:h-px",
73
- "aria-[orientation=vertical]:w-px",
62
+ "relative flex w-px items-center justify-center bg-border ring-offset-background after:absolute after:inset-y-0 after:start-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:start-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 rtl:after:translate-x-1/2 rtl:aria-[orientation=horizontal]:after:-translate-x-0 [&[aria-orientation=horizontal]>div]:rotate-90",
74
63
  className,
75
64
  )}
76
65
  data-slot="resizable-separator"
77
66
  {...props}
78
67
  >
79
- {withHandle ? (
80
- <div
81
- className={cn(
82
- "z-10 flex h-4 w-3 items-center justify-center",
83
- "rounded-sm border",
84
- "bg-border",
85
- )}
86
- >
87
- <GripVerticalIcon className="size-2.5" />
88
- </div>
89
- ) : null}
68
+ {withHandle ? <div className="z-10 flex h-6 w-1 shrink-0 rounded-lg bg-border" /> : null}
90
69
  </ResizablePrimitive.Separator>
91
70
  );
92
71
  }
@@ -1,14 +1,10 @@
1
- "use client";
2
-
3
- import type { ScrollAreaScrollbarVariants } from "#/variants/scroll-area";
4
- import type { Scope } from "@radix-ui/react-context";
1
+ import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
2
+ import { Context } from "radix-ui/internal";
5
3
  import type { ComponentProps, JSX } from "react";
6
4
 
7
5
  import { cn } from "#/lib/utils";
8
-
6
+ import type { ScrollAreaScrollbarVariants } from "#/variants/scroll-area";
9
7
  import { scrollAreaScrollbarVariants } from "#/variants/scroll-area";
10
- import { createContextScope } from "@radix-ui/react-context";
11
- import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
12
8
 
13
9
  /* -----------------------------------------------------------------------------
14
10
  * Context: ScrollArea
@@ -16,9 +12,9 @@ import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
16
12
 
17
13
  const SCROLL_AREA_NAME = "ScrollArea";
18
14
 
19
- type ScopedProps<P> = P & { __scopeScrollArea?: Scope };
15
+ type ScopedProps<P> = P & { __scopeScrollArea?: Context.Scope };
20
16
 
21
- const [createScrollAreaContext] = createContextScope(SCROLL_AREA_NAME);
17
+ const [createScrollAreaContext] = Context.createContextScope(SCROLL_AREA_NAME);
22
18
 
23
19
  type ScrollAreaContextValue = Pick<ScrollAreaScrollbarVariants, "size">;
24
20
 
@@ -32,35 +28,17 @@ const [ScrollAreaContextProvider, useScrollAreaContext] =
32
28
  /**
33
29
  * @since 0.3.16-canary.0
34
30
  */
35
- type ScrollAreaProps = ScopedProps<
36
- ComponentProps<typeof ScrollAreaPrimitive.Root> & ScrollAreaContextValue
37
- >;
31
+ type ScrollAreaProps = ScopedProps<ComponentProps<typeof ScrollAreaPrimitive.Root> & ScrollAreaContextValue>;
38
32
 
39
33
  /**
40
34
  * @since 0.3.16-canary.0
41
35
  */
42
- function ScrollArea({
43
- __scopeScrollArea,
44
- children,
45
- className,
46
- size,
47
- ...props
48
- }: ScrollAreaProps): JSX.Element {
36
+ function ScrollArea({ __scopeScrollArea, children, className, size, ...props }: ScrollAreaProps): JSX.Element {
49
37
  return (
50
38
  <ScrollAreaContextProvider scope={__scopeScrollArea} size={size}>
51
- <ScrollAreaPrimitive.Root
52
- className={cn("relative", className)}
53
- data-slot="scroll-area"
54
- {...props}
55
- >
39
+ <ScrollAreaPrimitive.Root className={cn("relative", className)} data-slot="scroll-area" {...props}>
56
40
  <ScrollAreaPrimitive.Viewport
57
- className={cn(
58
- "size-full",
59
- "rounded-[inherit] ring-ring/50 outline-ring",
60
- "transition-[box-shadow] duration-150 ease-snappy",
61
- "motion-reduce:transition-none motion-reduce:duration-0",
62
- "focus-visible:ring-4 focus-visible:outline-1",
63
- )}
41
+ className="size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1"
64
42
  data-slot="scroll-area-viewport"
65
43
  >
66
44
  {children}
@@ -96,12 +74,14 @@ function ScrollAreaScrollbar({
96
74
  return (
97
75
  <ScrollAreaPrimitive.Scrollbar
98
76
  className={scrollAreaScrollbarVariants({ className, orientation, size })}
77
+ data-orientation={orientation}
99
78
  data-slot="scroll-area-scrollbar"
100
79
  orientation={orientation}
101
80
  {...props}
102
81
  >
103
82
  <ScrollAreaPrimitive.ScrollAreaThumb
104
- className={cn("relative flex-1", "rounded-full", "bg-border")}
83
+ className="relative flex-1 rounded-full bg-border"
84
+ data-slot="scroll-area-thumb"
105
85
  />
106
86
  </ScrollAreaPrimitive.Scrollbar>
107
87
  );
@@ -1,12 +1,8 @@
1
- "use client";
2
-
3
- import type { VariantProps } from "#/lib/utils";
4
- import { cn } from "#/lib/utils";
5
- import type { ComponentProps, JSX } from "react";
6
- import * as SelectPrimitive from "@radix-ui/react-select";
7
1
  import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react";
2
+ import { Select as SelectPrimitive } from "radix-ui";
3
+ import type { ComponentProps, JSX } from "react";
8
4
 
9
- import { buttonVariants } from "#/variants/button";
5
+ import { cn } from "#/lib/utils";
10
6
 
11
7
  /* -----------------------------------------------------------------------------
12
8
  * Component: Select
@@ -36,8 +32,8 @@ type SelectGroupProps = ComponentProps<typeof SelectPrimitive.Group>;
36
32
  /**
37
33
  * @since 0.3.16-canary.0
38
34
  */
39
- function SelectGroup({ ...props }: SelectGroupProps): JSX.Element {
40
- return <SelectPrimitive.Group data-slot="select-group" {...props} />;
35
+ function SelectGroup({ className, ...props }: SelectGroupProps): JSX.Element {
36
+ return <SelectPrimitive.Group className={cn("scroll-my-1 p-1", className)} data-slot="select-group" {...props} />;
41
37
  }
42
38
 
43
39
  /* -----------------------------------------------------------------------------
@@ -64,30 +60,26 @@ function SelectValue({ ...props }: SelectValueProps): JSX.Element {
64
60
  * @since 0.3.16-canary.0
65
61
  */
66
62
  interface SelectTriggerProps extends ComponentProps<typeof SelectPrimitive.Trigger> {
67
- size?: VariantProps<typeof buttonVariants>["size"];
63
+ size?: "default" | "sm";
68
64
  }
69
65
 
70
66
  /**
71
67
  * @since 0.3.16-canary.0
72
68
  */
73
- function SelectTrigger({ children, className, size, ...props }: SelectTriggerProps): JSX.Element {
69
+ function SelectTrigger({ children, className, size = "default", ...props }: SelectTriggerProps): JSX.Element {
74
70
  return (
75
71
  <SelectPrimitive.Trigger
76
- className={buttonVariants({
77
- className: [
78
- "[&_svg:not([class*='text-'])]:text-muted-foreground focus:ring-ring/50 focus:border-ring w-fit justify-between px-3 font-normal focus:ring-3 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 *:data-[slot=select-value]:truncate",
79
- className,
80
- ],
81
- size,
82
- variant: "outline",
83
- })}
72
+ className={cn(
73
+ "flex w-fit items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 ps-2.5 pe-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
74
+ className,
75
+ )}
84
76
  data-size={size}
85
77
  data-slot="select-trigger"
86
78
  {...props}
87
79
  >
88
80
  {children}
89
- <SelectPrimitive.Icon asChild className={cn("size-4 shrink-0", "opacity-50")}>
90
- <ChevronDownIcon />
81
+ <SelectPrimitive.Icon asChild>
82
+ <ChevronDownIcon className="pointer-events-none size-4 text-muted-foreground" />
91
83
  </SelectPrimitive.Icon>
92
84
  </SelectPrimitive.Trigger>
93
85
  );
@@ -108,11 +100,14 @@ type SelectScrollUpButtonProps = ComponentProps<typeof SelectPrimitive.ScrollUpB
108
100
  function SelectScrollUpButton({ className, ...props }: SelectScrollUpButtonProps): JSX.Element {
109
101
  return (
110
102
  <SelectPrimitive.ScrollUpButton
111
- className={cn("flex items-center justify-center", "py-1", "text-muted-foreground", className)}
103
+ className={cn(
104
+ "z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",
105
+ className,
106
+ )}
112
107
  data-slot="select-scroll-up-button"
113
108
  {...props}
114
109
  >
115
- <ChevronUpIcon size={16} />
110
+ <ChevronUpIcon />
116
111
  </SelectPrimitive.ScrollUpButton>
117
112
  );
118
113
  }
@@ -132,11 +127,14 @@ type SelectScrollDownButtonProps = ComponentProps<typeof SelectPrimitive.ScrollD
132
127
  function SelectScrollDownButton({ className, ...props }: SelectScrollDownButtonProps): JSX.Element {
133
128
  return (
134
129
  <SelectPrimitive.ScrollDownButton
135
- className={cn("flex items-center justify-center", "py-1", "text-muted-foreground", className)}
130
+ className={cn(
131
+ "z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",
132
+ className,
133
+ )}
136
134
  data-slot="select-scroll-down-button"
137
135
  {...props}
138
136
  >
139
- <ChevronDownIcon size={16} />
137
+ <ChevronDownIcon />
140
138
  </SelectPrimitive.ScrollDownButton>
141
139
  );
142
140
  }
@@ -154,35 +152,23 @@ type SelectContentProps = ComponentProps<typeof SelectPrimitive.Content>;
154
152
  * @since 0.3.16-canary.0
155
153
  */
156
154
  function SelectContent({
155
+ align = "center",
157
156
  children,
158
157
  className,
159
158
  position = "item-aligned",
160
159
  ...props
161
160
  }: SelectContentProps): JSX.Element {
162
161
  return (
163
- <SelectPrimitive.Portal>
162
+ <SelectPrimitive.Portal data-slot="select-portal">
164
163
  <SelectPrimitive.Content
164
+ align={align}
165
165
  className={cn(
166
- "relative z-50",
167
- "max-h-(--radix-select-content-available-height) min-w-32 overflow-hidden",
168
- "rounded-lg border",
169
- "bg-popover text-popover-foreground shadow-lg",
170
- "ease-ui data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95",
171
- "data-open:data-side-top:slide-in-from-bottom-2",
172
- "data-open:data-side-right:slide-in-from-left-2",
173
- "data-open:data-side-bottom:slide-in-from-top-2",
174
- "data-open:data-side-left:slide-in-from-right-2",
175
- "data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
176
- "data-closed:data-side-top:slide-out-to-bottom-2",
177
- "data-closed:data-side-right:slide-out-to-left-2",
178
- "data-closed:data-side-bottom:slide-out-to-top-2",
179
- "data-closed:data-side-left:slide-out-to-right-2",
180
- "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
181
- "origin-(--radix-select-content-transform-origin)",
166
+ "relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 ease-snappy data-[align-trigger=true]:animate-none data-open:animate-in data-open:animation-duration-menu-in data-open:fade-in-0 data-open:zoom-in-95 data-open:data-side-top:slide-in-from-bottom-2 data-open:data-side-right:slide-in-from-left-2 data-open:data-side-bottom:slide-in-from-top-2 data-open:data-side-left:slide-in-from-right-2 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-menu-out data-closed:fade-out-0 data-closed:zoom-out-95 data-closed:data-side-top:slide-out-to-bottom-2 data-closed:data-side-right:slide-out-to-left-2 data-closed:data-side-bottom:slide-out-to-top-2 data-closed:data-side-left:slide-out-to-right-2",
182
167
  position === "popper" &&
183
- "data-side-top:-translate-y-1 data-side-right:translate-x-1 data-side-bottom:translate-y-1 data-side-left:-translate-x-1",
168
+ "data-side-top:-translate-y-1 data-side-right:translate-x-1 rtl:data-side-right:-translate-x-1 data-side-bottom:translate-y-1 data-side-left:-translate-x-1 rtl:data-side-left:translate-x-1",
184
169
  className,
185
170
  )}
171
+ data-align-trigger={position === "item-aligned"}
186
172
  data-slot="select-content"
187
173
  position={position}
188
174
  {...props}
@@ -190,10 +176,10 @@ function SelectContent({
190
176
  <SelectScrollUpButton />
191
177
  <SelectPrimitive.Viewport
192
178
  className={cn(
193
- "p-1",
194
- position === "popper" &&
195
- "h-(--radix-select-trigger-height) w-full min-w-(--radix-select-trigger-width) scroll-my-1",
179
+ "data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)",
180
+ position === "popper" && "",
196
181
  )}
182
+ data-position={position}
197
183
  >
198
184
  {children}
199
185
  </SelectPrimitive.Viewport>
@@ -218,7 +204,7 @@ type SelectLabelProps = ComponentProps<typeof SelectPrimitive.Label>;
218
204
  function SelectLabel({ className, ...props }: SelectLabelProps): JSX.Element {
219
205
  return (
220
206
  <SelectPrimitive.Label
221
- className={cn("flex items-center gap-x-2", "px-2 py-1.5", "text-sm font-semibold", className)}
207
+ className={cn("px-2 py-1.5 text-xs text-muted-foreground", className)}
222
208
  data-slot="select-label"
223
209
  {...props}
224
210
  />
@@ -241,24 +227,15 @@ function SelectItem({ children, className, ...props }: SelectItemProps): JSX.Ele
241
227
  return (
242
228
  <SelectPrimitive.Item
243
229
  className={cn(
244
- "relative flex w-full items-center py-1.5 pr-8 pl-2",
245
- "rounded-sm outline-hidden",
246
- "text-sm",
247
- "cursor-default select-none",
248
- "focus:bg-accent focus:text-accent-foreground",
249
- "aria-disabled:opacity-50",
250
- "data-[variant=destructive]:[&_svg:not([class*='text-'])]:text-destructive/80",
251
- "*:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
252
- "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
253
- "[&_svg:not([class*='text-'])]:text-muted-foreground",
230
+ "relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 ps-2 pe-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
254
231
  className,
255
232
  )}
256
233
  data-slot="select-item"
257
234
  {...props}
258
235
  >
259
- <span className={cn("absolute flex items-center justify-center", "right-2")}>
236
+ <span className="pointer-events-none absolute end-2 flex size-4 items-center justify-center">
260
237
  <SelectPrimitive.ItemIndicator>
261
- <CheckIcon className="size-4" />
238
+ <CheckIcon className="pointer-events-none" />
262
239
  </SelectPrimitive.ItemIndicator>
263
240
  </span>
264
241
  <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
@@ -281,7 +258,7 @@ type SelectSeparatorProps = ComponentProps<typeof SelectPrimitive.Separator>;
281
258
  function SelectSeparator({ className, ...props }: SelectSeparatorProps): JSX.Element {
282
259
  return (
283
260
  <SelectPrimitive.Separator
284
- className={cn("mx-2 my-1 h-px", "bg-border", className)}
261
+ className={cn("pointer-events-none -mx-1 my-1 h-px bg-border", className)}
285
262
  data-slot="select-separator"
286
263
  {...props}
287
264
  />
@@ -1,12 +1,9 @@
1
- "use client";
2
-
3
- import type { SeparatorVariants } from "#/variants/separator";
1
+ import { Separator as SeparatorPrimitive } from "radix-ui";
4
2
  import type { ComponentProps, JSX } from "react";
5
3
 
6
4
  import { cn } from "#/lib/utils";
7
-
5
+ import type { SeparatorVariants } from "#/variants/separator";
8
6
  import { separatorVariants } from "#/variants/separator";
9
- import * as SeparatorPrimitive from "@radix-ui/react-separator";
10
7
 
11
8
  /* -----------------------------------------------------------------------------
12
9
  * Component: Separator
@@ -21,13 +18,7 @@ interface SeparatorProps
21
18
  /**
22
19
  * @since 0.3.16-canary.0
23
20
  */
24
- function Separator({
25
- align,
26
- className,
27
- decorative = true,
28
- orientation,
29
- ...props
30
- }: SeparatorProps): JSX.Element {
21
+ function Separator({ align, className, decorative = true, orientation, ...props }: SeparatorProps): JSX.Element {
31
22
  return (
32
23
  <SeparatorPrimitive.Root
33
24
  className={separatorVariants({ align, className, orientation })}
@@ -54,12 +45,7 @@ type SeparatorItemProps = ComponentProps<"div">;
54
45
  function SeparatorItem({ className, ...props }: SeparatorItemProps): JSX.Element {
55
46
  return (
56
47
  <div
57
- className={cn(
58
- "absolute",
59
- "mx-2 px-2",
60
- "bg-background text-sm text-muted-foreground",
61
- className,
62
- )}
48
+ className={cn("absolute mx-2 bg-background px-2 text-sm text-muted-foreground", className)}
63
49
  data-slot="separator-item"
64
50
  {...props}
65
51
  />