@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,10 +1,8 @@
1
- "use client";
2
-
1
+ import { CheckIcon, ChevronRightIcon } from "lucide-react";
2
+ import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
3
3
  import type { ComponentProps, JSX } from "react";
4
4
 
5
5
  import { cn } from "#/lib/utils";
6
- import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
7
- import { CheckIcon, ChevronRightIcon, DotIcon } from "lucide-react";
8
6
 
9
7
  /* -----------------------------------------------------------------------------
10
8
  * Component: DropdownMenu
@@ -71,7 +69,7 @@ function DropdownMenuSub({ ...props }: DropdownMenuSubProps): JSX.Element {
71
69
  }
72
70
 
73
71
  /* -----------------------------------------------------------------------------
74
- * Component: DropdownMenuSubTrigger
72
+ * Component: DropdownMenuRadioGroup
75
73
  * -------------------------------------------------------------------------- */
76
74
 
77
75
  /**
@@ -93,32 +91,18 @@ function DropdownMenuRadioGroup({ ...props }: DropdownMenuRadioGroupProps): JSX.
93
91
  /**
94
92
  * @since 0.3.16-canary.0
95
93
  */
96
- interface DropdownMenuSubTriggerProps extends ComponentProps<
97
- typeof DropdownMenuPrimitive.SubTrigger
98
- > {
94
+ interface DropdownMenuSubTriggerProps extends ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> {
99
95
  inset?: boolean;
100
96
  }
101
97
 
102
98
  /**
103
99
  * @since 0.3.16-canary.0
104
100
  */
105
- function DropdownMenuSubTrigger({
106
- children,
107
- className,
108
- inset,
109
- ...props
110
- }: DropdownMenuSubTriggerProps): JSX.Element {
101
+ function DropdownMenuSubTrigger({ children, className, inset, ...props }: DropdownMenuSubTriggerProps): JSX.Element {
111
102
  return (
112
103
  <DropdownMenuPrimitive.SubTrigger
113
104
  className={cn(
114
- "flex items-center gap-x-2",
115
- "px-2 py-1.5",
116
- "rounded-sm outline-hidden",
117
- "text-sm",
118
- "cursor-default select-none",
119
- "focus:bg-accent focus:text-accent-foreground",
120
- "data-inset:pl-8",
121
- "data-open:bg-accent data-open:text-accent-foreground",
105
+ "flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-8 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
122
106
  className,
123
107
  )}
124
108
  data-inset={inset}
@@ -126,7 +110,7 @@ function DropdownMenuSubTrigger({
126
110
  {...props}
127
111
  >
128
112
  {children}
129
- <ChevronRightIcon className={cn("size-4", "ml-auto")} />
113
+ <ChevronRightIcon className="ml-auto rtl:rotate-180" />
130
114
  </DropdownMenuPrimitive.SubTrigger>
131
115
  );
132
116
  }
@@ -148,22 +132,7 @@ function DropdownMenuSubContent({ className, ...props }: DropdownMenuSubContentP
148
132
  <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal">
149
133
  <DropdownMenuPrimitive.SubContent
150
134
  className={cn(
151
- "z-50",
152
- "min-w-32 overflow-hidden p-1",
153
- "rounded-lg border",
154
- "bg-popover text-popover-foreground shadow-lg",
155
- "ease-snappy data-open:animate-in data-open:duration-200 data-open:fade-in-0 data-open:zoom-in-95",
156
- "data-open:data-side-top:slide-in-from-bottom-2",
157
- "data-open:data-side-right:slide-in-from-left-2",
158
- "data-open:data-side-bottom:slide-in-from-top-2",
159
- "data-open:data-side-left:slide-in-from-right-2",
160
- "data-closed:animate-out data-closed:duration-150 data-closed:fade-out-0 data-closed:zoom-out-95",
161
- "data-closed:data-side-top:slide-out-to-bottom-2",
162
- "data-closed:data-side-right:slide-out-to-left-2",
163
- "data-closed:data-side-bottom:slide-out-to-top-2",
164
- "data-closed:data-side-left:slide-out-to-right-2",
165
- "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
166
- "origin-(--radix-dropdown-menu-content-transform-origin)",
135
+ "z-50 min-w-24 origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 ease-snappy 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",
167
136
  className,
168
137
  )}
169
138
  data-slot="dropdown-menu-sub-content"
@@ -186,6 +155,7 @@ type DropdownMenuContentProps = ComponentProps<typeof DropdownMenuPrimitive.Cont
186
155
  * @since 0.3.16-canary.0
187
156
  */
188
157
  function DropdownMenuContent({
158
+ align = "start",
189
159
  className,
190
160
  sideOffset = 4,
191
161
  ...props
@@ -193,23 +163,9 @@ function DropdownMenuContent({
193
163
  return (
194
164
  <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal">
195
165
  <DropdownMenuPrimitive.Content
166
+ align={align}
196
167
  className={cn(
197
- "z-50",
198
- "max-h-(--radix-dropdown-menu-content-available-height) min-w-32 overflow-x-hidden overflow-y-auto p-1",
199
- "rounded-lg border",
200
- "bg-popover text-popover-foreground shadow-lg",
201
- "ease-snappy data-open:animate-in data-open:duration-200 data-open:fade-in-0 data-open:zoom-in-95",
202
- "data-open:data-side-top:slide-in-from-bottom-2",
203
- "data-open:data-side-right:slide-in-from-left-2",
204
- "data-open:data-side-bottom:slide-in-from-top-2",
205
- "data-open:data-side-left:slide-in-from-right-2",
206
- "data-closed:animate-out data-closed:duration-150 data-closed:fade-out-0 data-closed:zoom-out-95",
207
- "data-closed:data-side-top:slide-out-to-bottom-2",
208
- "data-closed:data-side-right:slide-out-to-left-2",
209
- "data-closed:data-side-bottom:slide-out-to-top-2",
210
- "data-closed:data-side-left:slide-out-to-right-2",
211
- "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
212
- "origin-(--radix-dropdown-menu-content-transform-origin)",
168
+ "z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) min-w-32 origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 ease-snappy 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",
213
169
  className,
214
170
  )}
215
171
  data-slot="dropdown-menu-content"
@@ -235,29 +191,11 @@ interface DropdownMenuItemProps extends ComponentProps<typeof DropdownMenuPrimit
235
191
  /**
236
192
  * @since 0.3.16-canary.0
237
193
  */
238
- function DropdownMenuItem({
239
- className,
240
- inset,
241
- variant,
242
- ...props
243
- }: DropdownMenuItemProps): JSX.Element {
194
+ function DropdownMenuItem({ className, inset, variant = "default", ...props }: DropdownMenuItemProps): JSX.Element {
244
195
  return (
245
196
  <DropdownMenuPrimitive.Item
246
197
  className={cn(
247
- "group/dropdown-menu-item relative flex items-center gap-x-2",
248
- "px-2 py-1.5",
249
- "rounded-sm outline-hidden",
250
- "text-sm",
251
- "cursor-default select-none",
252
- "focus:bg-accent focus:text-accent-foreground",
253
- "aria-disabled:opacity-50",
254
- "data-inset:pl-8",
255
- "data-[variant=destructive]:text-destructive",
256
- "data-[variant=destructive]:focus:bg-destructive/10",
257
- "dark:data-[variant=destructive]:focus:bg-destructive/20",
258
- "data-[variant=destructive]:[&_svg:not([class*='text-'])]:text-destructive/80",
259
- "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
260
- "[&_svg:not([class*='text-'])]:text-muted-foreground",
198
+ "group/dropdown-menu-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",
261
199
  className,
262
200
  )}
263
201
  data-inset={inset}
@@ -275,7 +213,9 @@ function DropdownMenuItem({
275
213
  /**
276
214
  * @since 0.3.16-canary.0
277
215
  */
278
- type DropdownMenuCheckboxItemProps = ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>;
216
+ interface DropdownMenuCheckboxItemProps extends ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> {
217
+ inset?: boolean;
218
+ }
279
219
 
280
220
  /**
281
221
  * @since 0.3.16-canary.0
@@ -284,28 +224,26 @@ function DropdownMenuCheckboxItem({
284
224
  checked,
285
225
  children,
286
226
  className,
227
+ inset,
287
228
  ...props
288
229
  }: DropdownMenuCheckboxItemProps): JSX.Element {
289
230
  return (
290
231
  <DropdownMenuPrimitive.CheckboxItem
291
232
  checked={checked}
292
233
  className={cn(
293
- "group/dropdown-menu-item relative flex items-center gap-x-2",
294
- "py-1.5 pr-2 pl-8",
295
- "rounded-sm outline-hidden",
296
- "text-sm",
297
- "cursor-default select-none",
298
- "focus:bg-accent focus:text-accent-foreground",
299
- "aria-disabled:opacity-50",
300
- "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
234
+ "relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
301
235
  className,
302
236
  )}
237
+ data-inset={inset}
303
238
  data-slot="dropdown-menu-checkbox-item"
304
239
  {...props}
305
240
  >
306
- <span className={cn("absolute flex items-center justify-center", "left-2")}>
241
+ <span
242
+ className="pointer-events-none absolute right-2 flex items-center justify-center"
243
+ data-slot="dropdown-menu-checkbox-item-indicator"
244
+ >
307
245
  <DropdownMenuPrimitive.ItemIndicator>
308
- <CheckIcon className="size-4" />
246
+ <CheckIcon />
309
247
  </DropdownMenuPrimitive.ItemIndicator>
310
248
  </span>
311
249
  {children}
@@ -320,35 +258,30 @@ function DropdownMenuCheckboxItem({
320
258
  /**
321
259
  * @since 0.3.16-canary.0
322
260
  */
323
- type DropdownMenuRadioItemProps = ComponentProps<typeof DropdownMenuPrimitive.RadioItem>;
261
+ interface DropdownMenuRadioItemProps extends ComponentProps<typeof DropdownMenuPrimitive.RadioItem> {
262
+ inset?: boolean;
263
+ }
324
264
 
325
265
  /**
326
266
  * @since 0.3.16-canary.0
327
267
  */
328
- function DropdownMenuRadioItem({
329
- children,
330
- className,
331
- ...props
332
- }: DropdownMenuRadioItemProps): JSX.Element {
268
+ function DropdownMenuRadioItem({ children, className, inset, ...props }: DropdownMenuRadioItemProps): JSX.Element {
333
269
  return (
334
270
  <DropdownMenuPrimitive.RadioItem
335
271
  className={cn(
336
- "group/dropdown-menu-item relative flex items-center gap-x-2",
337
- "py-1.5 pr-2 pl-8",
338
- "rounded-sm outline-hidden",
339
- "text-sm",
340
- "cursor-default select-none",
341
- "focus:bg-accent focus:text-accent-foreground",
342
- "aria-disabled:opacity-50",
343
- "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
272
+ "relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
344
273
  className,
345
274
  )}
275
+ data-inset={inset}
346
276
  data-slot="dropdown-menu-radio-item"
347
277
  {...props}
348
278
  >
349
- <span className={cn("absolute flex items-center justify-center", "left-2")}>
279
+ <span
280
+ className="pointer-events-none absolute right-2 flex items-center justify-center"
281
+ data-slot="dropdown-menu-radio-item-indicator"
282
+ >
350
283
  <DropdownMenuPrimitive.ItemIndicator>
351
- <DotIcon className={cn("size-4", "fill-current")} />
284
+ <CheckIcon />
352
285
  </DropdownMenuPrimitive.ItemIndicator>
353
286
  </span>
354
287
  {children}
@@ -373,13 +306,7 @@ interface DropdownMenuLabelProps extends ComponentProps<typeof DropdownMenuPrimi
373
306
  function DropdownMenuLabel({ className, inset, ...props }: DropdownMenuLabelProps): JSX.Element {
374
307
  return (
375
308
  <DropdownMenuPrimitive.Label
376
- className={cn(
377
- "flex items-center gap-x-2",
378
- "px-2 py-1.5",
379
- "text-sm font-semibold",
380
- "data-inset:pl-8",
381
- className,
382
- )}
309
+ className={cn("px-2 py-1.5 text-xs font-medium text-muted-foreground data-inset:pl-8", className)}
383
310
  data-inset={inset}
384
311
  data-slot="dropdown-menu-label"
385
312
  {...props}
@@ -402,7 +329,7 @@ type DropdownMenuSeparatorProps = ComponentProps<typeof DropdownMenuPrimitive.Se
402
329
  function DropdownMenuSeparator({ className, ...props }: DropdownMenuSeparatorProps): JSX.Element {
403
330
  return (
404
331
  <DropdownMenuPrimitive.Separator
405
- className={cn("mx-2 my-1 h-px", "bg-border", className)}
332
+ className={cn("-mx-1 my-1 h-px bg-border", className)}
406
333
  data-slot="dropdown-menu-separator"
407
334
  {...props}
408
335
  />
@@ -425,9 +352,7 @@ function DropdownMenuShortcut({ className, ...props }: DropdownMenuShortcutProps
425
352
  return (
426
353
  <span
427
354
  className={cn(
428
- "ml-auto",
429
- "text-xs tracking-widest text-muted-foreground",
430
- "group-data-[variant=destructive]/dropdown-menu-item:text-destructive/80",
355
+ "ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground",
431
356
  className,
432
357
  )}
433
358
  data-slot="dropdown-menu-shortcut"
@@ -450,11 +375,7 @@ type DropdownMenuArrowProps = ComponentProps<typeof DropdownMenuPrimitive.Arrow>
450
375
  */
451
376
  function DropdownMenuArrow({ className, ...props }: DropdownMenuArrowProps): JSX.Element {
452
377
  return (
453
- <DropdownMenuPrimitive.Arrow
454
- className={cn("fill-popover", className)}
455
- data-slot="dropdown-menu-arrow"
456
- {...props}
457
- />
378
+ <DropdownMenuPrimitive.Arrow className={cn("fill-popover", className)} data-slot="dropdown-menu-arrow" {...props} />
458
379
  );
459
380
  }
460
381
 
@@ -1,8 +1,7 @@
1
- import type { EmptyMediaVariants } from "#/variants/empty";
2
1
  import type { ComponentProps, JSX } from "react";
3
2
 
4
3
  import { cn } from "#/lib/utils";
5
-
4
+ import type { EmptyMediaVariants } from "#/variants/empty";
6
5
  import { emptyMediaVariants } from "#/variants/empty";
7
6
 
8
7
  /* -----------------------------------------------------------------------------
@@ -21,10 +20,7 @@ function Empty({ className, ...props }: EmptyProps): JSX.Element {
21
20
  return (
22
21
  <div
23
22
  className={cn(
24
- "flex min-w-0 flex-1 flex-col items-center justify-center gap-6 p-6",
25
- "rounded-xl border-dashed",
26
- "text-center text-balance",
27
- "md:p-12",
23
+ "flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-lg border-dashed p-12 text-center text-balance",
28
24
  className,
29
25
  )}
30
26
  data-slot="empty"
@@ -47,11 +43,7 @@ type EmptyHeaderProps = ComponentProps<"div">;
47
43
  */
48
44
  function EmptyHeader({ className, ...props }: EmptyHeaderProps): JSX.Element {
49
45
  return (
50
- <div
51
- className={cn("flex max-w-sm flex-col items-center gap-2", "text-center", className)}
52
- data-slot="empty-header"
53
- {...props}
54
- />
46
+ <div className={cn("flex max-w-sm flex-col items-center gap-2", className)} data-slot="empty-header" {...props} />
55
47
  );
56
48
  }
57
49
 
@@ -93,7 +85,7 @@ type EmptyTitleProps = ComponentProps<"div">;
93
85
  function EmptyTitle({ className, ...props }: EmptyTitleProps): JSX.Element {
94
86
  return (
95
87
  <div
96
- className={cn("text-lg font-medium tracking-tight", className)}
88
+ className={cn("font-heading text-lg font-medium tracking-tight", className)}
97
89
  data-slot="empty-title"
98
90
  {...props}
99
91
  />
@@ -116,9 +108,7 @@ function EmptyDescription({ className, ...props }: EmptyDescriptionProps): JSX.E
116
108
  return (
117
109
  <p
118
110
  className={cn(
119
- "text-sm/relaxed text-muted-foreground",
120
- "[&>a]:underline [&>a]:underline-offset-4",
121
- "[&>a:hover]:text-primary",
111
+ "text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
122
112
  className,
123
113
  )}
124
114
  data-slot="empty-description"
@@ -142,11 +132,7 @@ type EmptyContentProps = ComponentProps<"div">;
142
132
  function EmptyContent({ className, ...props }: EmptyContentProps): JSX.Element {
143
133
  return (
144
134
  <div
145
- className={cn(
146
- "flex w-full max-w-sm min-w-0 flex-col items-center gap-4",
147
- "text-sm text-balance",
148
- className,
149
- )}
135
+ className={cn("flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance", className)}
150
136
  data-slot="empty-content"
151
137
  {...props}
152
138
  />
@@ -1,15 +1,11 @@
1
- "use client";
2
-
3
- import type { FieldVariants } from "#/variants/field";
4
1
  import type { ComponentProps, JSX, ReactNode } from "react";
5
-
6
- import { cn } from "#/lib/utils";
7
-
8
- import { fieldVariants } from "#/variants/field";
9
2
  import { useMemo } from "react";
10
3
 
11
4
  import { Label } from "#/components/label";
12
5
  import { Separator } from "#/components/separator";
6
+ import { cn } from "#/lib/utils";
7
+ import type { FieldVariants } from "#/variants/field";
8
+ import { fieldVariants } from "#/variants/field";
13
9
 
14
10
  /* -----------------------------------------------------------------------------
15
11
  * Component: FieldSet
@@ -27,9 +23,7 @@ function FieldSet({ className, ...props }: FieldSetProps): JSX.Element {
27
23
  return (
28
24
  <fieldset
29
25
  className={cn(
30
- "flex flex-col gap-6",
31
- "has-[>[data-slot=checkbox-group]]:gap-3",
32
- "has-[>[data-slot=radio-group]]:gap-3",
26
+ "flex flex-col gap-6 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3",
33
27
  className,
34
28
  )}
35
29
  data-slot="field-set"
@@ -55,7 +49,7 @@ type FieldLegendProps = ComponentProps<"legend"> & {
55
49
  function FieldLegend({ className, variant = "legend", ...props }: FieldLegendProps): JSX.Element {
56
50
  return (
57
51
  <legend
58
- className={cn("mb-3", "text-base font-medium", "data-[variant=label]:text-sm", className)}
52
+ className={cn("mb-3 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base", className)}
59
53
  data-slot="field-legend"
60
54
  data-variant={variant}
61
55
  {...props}
@@ -79,9 +73,7 @@ function FieldGroup({ className, ...props }: FieldGroupProps): JSX.Element {
79
73
  return (
80
74
  <div
81
75
  className={cn(
82
- "group/field-group @container/field-group flex w-full flex-col gap-7",
83
- "data-[slot=checkbox-group]:gap-3",
84
- "[&>[data-slot=field-group]]:gap-4",
76
+ "group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4",
85
77
  className,
86
78
  )}
87
79
  data-slot="field-group"
@@ -129,7 +121,7 @@ type FieldContentProps = ComponentProps<"div">;
129
121
  function FieldContent({ className, ...props }: FieldContentProps): JSX.Element {
130
122
  return (
131
123
  <div
132
- className={cn("group/field-content flex flex-1 flex-col gap-1.5", "leading-snug", className)}
124
+ className={cn("group/field-content flex flex-1 flex-col gap-1 leading-snug", className)}
133
125
  data-slot="field-content"
134
126
  {...props}
135
127
  />
@@ -152,12 +144,8 @@ function FieldLabel({ className, ...props }: FieldLabelProps): JSX.Element {
152
144
  return (
153
145
  <Label
154
146
  className={cn(
155
- "group/field-label peer/field-label flex w-fit gap-2 leading-snug",
156
- "group-data-disabled/field:opacity-50",
157
- "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border",
158
- "has-data-checked:border-primary has-data-checked:bg-primary/5",
159
- "dark:has-data-checked:bg-primary/10",
160
- "[&>*]:data-[slot=field]:p-4",
147
+ "group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-disabled/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border *:data-[slot=field]:p-3 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10",
148
+ "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col",
161
149
  className,
162
150
  )}
163
151
  data-slot="field-label"
@@ -182,8 +170,7 @@ function FieldTitle({ className, ...props }: FieldTitleProps): JSX.Element {
182
170
  return (
183
171
  <div
184
172
  className={cn(
185
- "flex w-fit items-center gap-2 text-sm leading-snug font-medium",
186
- "group-data-disabled/field:opacity-50",
173
+ "flex w-fit items-center gap-2 text-sm font-medium group-data-disabled/field:opacity-50",
187
174
  className,
188
175
  )}
189
176
  data-slot="field-label"
@@ -208,13 +195,9 @@ function FieldDescription({ className, ...props }: FieldDescriptionProps): JSX.E
208
195
  return (
209
196
  <p
210
197
  className={cn(
211
- "text-sm leading-normal font-normal text-muted-foreground",
212
- "group-has-data-[orientation=horizontal]/field:text-balance",
213
- "last:mt-0",
214
- "nth-last-2:-mt-1",
215
- "[&>a]:underline [&>a]:underline-offset-4",
216
- "[&>a:hover]:text-primary",
217
- "[[data-variant=legend]+&]:-mt-1.5",
198
+ "text-left text-sm leading-normal font-normal text-muted-foreground group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5",
199
+ "last:mt-0 nth-last-2:-mt-1",
200
+ "[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
218
201
  className,
219
202
  )}
220
203
  data-slot="field-description"
@@ -242,24 +225,15 @@ function FieldSeparator({ children, className, ...props }: FieldSeparatorProps):
242
225
 
243
226
  return (
244
227
  <div
245
- className={cn(
246
- "relative",
247
- "-my-2 h-5 text-sm",
248
- "group-data-[variant=outline]/field-group:-mb-2",
249
- className,
250
- )}
228
+ className={cn("relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2", className)}
251
229
  data-content={hasContent}
252
230
  data-slot="field-separator"
253
231
  {...props}
254
232
  >
255
- <Separator className={cn("absolute", "inset-0 top-1/2")} />
233
+ <Separator className="absolute inset-0 top-1/2" />
256
234
  {hasContent ? (
257
235
  <span
258
- className={cn(
259
- "relative block",
260
- "mx-auto w-fit px-2",
261
- "bg-background text-muted-foreground",
262
- )}
236
+ className="relative mx-auto block w-fit bg-background px-2 text-muted-foreground"
263
237
  data-slot="field-separator-content"
264
238
  >
265
239
  {children}
@@ -287,12 +261,7 @@ interface FieldErrorProps extends ComponentProps<"div"> {
287
261
  /**
288
262
  * @since 0.3.16-canary.0
289
263
  */
290
- function FieldError({
291
- children,
292
- className,
293
- errors,
294
- ...props
295
- }: FieldErrorProps): JSX.Element | null {
264
+ function FieldError({ children, className, errors, ...props }: FieldErrorProps): JSX.Element | null {
296
265
  const fallbackContent = useMemo<null | ReactNode>(() => {
297
266
  if (!errors?.length) {
298
267
  return null;
@@ -305,10 +274,8 @@ function FieldError({
305
274
  }
306
275
 
307
276
  return (
308
- <ul className={cn("flex flex-col gap-1", "ml-4", "list-disc")}>
309
- {uniqueErrors.map((error) =>
310
- error?.message ? <li key={error.message}>{error.message}</li> : null,
311
- )}
277
+ <ul className="ml-4 flex list-disc flex-col gap-1">
278
+ {uniqueErrors.map((error) => (error?.message ? <li key={error.message}>{error.message}</li> : null))}
312
279
  </ul>
313
280
  );
314
281
  }, [errors]);