@codefast/ui 0.3.16-canary.1 → 0.3.16-canary.3

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 (223) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +1 -1
  3. package/dist/components/accordion.mjs +2 -2
  4. package/dist/components/alert-dialog.d.mts +1 -1
  5. package/dist/components/alert-dialog.mjs +4 -4
  6. package/dist/components/alert.d.mts +3 -13
  7. package/dist/components/alert.mjs +3 -23
  8. package/dist/components/badge.d.mts +3 -15
  9. package/dist/components/badge.mjs +2 -44
  10. package/dist/components/breadcrumb.mjs +1 -1
  11. package/dist/components/button-group.d.mts +3 -13
  12. package/dist/components/button-group.mjs +3 -24
  13. package/dist/components/button.d.mts +3 -25
  14. package/dist/components/button.mjs +2 -72
  15. package/dist/components/calendar.mjs +2 -1
  16. package/dist/components/carousel.d.mts +1 -2
  17. package/dist/components/chart.d.mts +2 -4
  18. package/dist/components/checkbox.mjs +2 -2
  19. package/dist/components/context-menu.mjs +2 -2
  20. package/dist/components/dialog.d.mts +1 -1
  21. package/dist/components/dialog.mjs +4 -4
  22. package/dist/components/drawer.d.mts +1 -1
  23. package/dist/components/drawer.mjs +2 -2
  24. package/dist/components/dropdown-menu.mjs +2 -2
  25. package/dist/components/empty.d.mts +3 -13
  26. package/dist/components/empty.mjs +3 -18
  27. package/dist/components/field.d.mts +3 -14
  28. package/dist/components/field.mjs +3 -32
  29. package/dist/components/form.d.mts +2 -4
  30. package/dist/components/hover-card.mjs +1 -1
  31. package/dist/components/input-group.d.mts +4 -31
  32. package/dist/components/input-group.mjs +3 -90
  33. package/dist/components/input-number.mjs +4 -4
  34. package/dist/components/input-otp.mjs +2 -2
  35. package/dist/components/input.mjs +1 -1
  36. package/dist/components/item.d.mts +4 -29
  37. package/dist/components/item.mjs +3 -56
  38. package/dist/components/menubar.mjs +2 -2
  39. package/dist/components/native-select.mjs +1 -1
  40. package/dist/components/navigation-menu.d.mts +1 -6
  41. package/dist/components/navigation-menu.mjs +8 -15
  42. package/dist/components/pagination.d.mts +1 -1
  43. package/dist/components/pagination.mjs +1 -1
  44. package/dist/components/popover.mjs +1 -1
  45. package/dist/components/progress-circle.d.mts +3 -47
  46. package/dist/components/progress-circle.mjs +2 -47
  47. package/dist/components/progress.mjs +1 -1
  48. package/dist/components/radio-group.mjs +1 -1
  49. package/dist/components/radio.mjs +1 -1
  50. package/dist/components/scroll-area.d.mts +3 -19
  51. package/dist/components/scroll-area.mjs +4 -61
  52. package/dist/components/select.d.mts +1 -1
  53. package/dist/components/select.mjs +3 -3
  54. package/dist/components/separator.d.mts +3 -18
  55. package/dist/components/separator.mjs +3 -23
  56. package/dist/components/sheet.d.mts +6 -18
  57. package/dist/components/sheet.mjs +6 -49
  58. package/dist/components/sidebar.d.mts +4 -19
  59. package/dist/components/sidebar.mjs +10 -46
  60. package/dist/components/skeleton.mjs +1 -1
  61. package/dist/components/slider.mjs +1 -1
  62. package/dist/components/spinner.mjs +1 -1
  63. package/dist/components/switch.mjs +2 -2
  64. package/dist/components/table.mjs +1 -1
  65. package/dist/components/tabs.mjs +1 -1
  66. package/dist/components/textarea.mjs +1 -1
  67. package/dist/components/toggle-group.d.mts +3 -2
  68. package/dist/components/toggle-group.mjs +1 -1
  69. package/dist/components/toggle.d.mts +2 -21
  70. package/dist/components/toggle.mjs +2 -39
  71. package/dist/components/tooltip.mjs +1 -1
  72. package/dist/index.d.mts +31 -16
  73. package/dist/index.mjs +30 -15
  74. package/dist/lib/utils.d.mts +1 -12
  75. package/dist/lib/utils.mjs +1 -9
  76. package/dist/primitives/checkbox-group.d.mts +1 -2
  77. package/dist/primitives/input-number.d.mts +1 -2
  78. package/dist/primitives/input.d.mts +1 -2
  79. package/dist/primitives/progress-circle.d.mts +1 -2
  80. package/dist/variants/alert.d.mts +18 -0
  81. package/dist/variants/alert.mjs +25 -0
  82. package/dist/variants/badge.d.mts +20 -0
  83. package/dist/variants/badge.mjs +46 -0
  84. package/dist/variants/button-group.d.mts +18 -0
  85. package/dist/variants/button-group.mjs +26 -0
  86. package/dist/variants/button.d.mts +30 -0
  87. package/dist/variants/button.mjs +76 -0
  88. package/dist/variants/empty.d.mts +18 -0
  89. package/dist/variants/empty.mjs +20 -0
  90. package/dist/variants/field.d.mts +19 -0
  91. package/dist/variants/field.mjs +34 -0
  92. package/dist/variants/input-group.d.mts +43 -0
  93. package/dist/variants/input-group.mjs +93 -0
  94. package/dist/variants/item.d.mts +37 -0
  95. package/dist/variants/item.mjs +60 -0
  96. package/dist/variants/navigation-menu.d.mts +13 -0
  97. package/dist/variants/navigation-menu.mjs +12 -0
  98. package/dist/variants/progress-circle.d.mts +52 -0
  99. package/dist/variants/progress-circle.mjs +49 -0
  100. package/dist/variants/scroll-area.d.mts +24 -0
  101. package/dist/variants/scroll-area.mjs +63 -0
  102. package/dist/variants/separator.d.mts +23 -0
  103. package/dist/variants/separator.mjs +25 -0
  104. package/dist/variants/sheet.d.mts +20 -0
  105. package/dist/variants/sheet.mjs +50 -0
  106. package/dist/variants/sidebar.d.mts +23 -0
  107. package/dist/variants/sidebar.mjs +42 -0
  108. package/dist/variants/toggle.d.mts +23 -0
  109. package/dist/variants/toggle.mjs +43 -0
  110. package/package.json +169 -21
  111. package/src/components/accordion.tsx +156 -0
  112. package/src/components/alert-dialog.tsx +314 -0
  113. package/src/components/alert.tsx +86 -0
  114. package/src/components/aspect-ratio.tsx +28 -0
  115. package/src/components/avatar.tsx +84 -0
  116. package/src/components/badge.tsx +38 -0
  117. package/src/components/breadcrumb.tsx +197 -0
  118. package/src/components/button-group.tsx +107 -0
  119. package/src/components/button.tsx +66 -0
  120. package/src/components/calendar.tsx +277 -0
  121. package/src/components/card.tsx +175 -0
  122. package/src/components/carousel.tsx +367 -0
  123. package/src/components/chart.tsx +587 -0
  124. package/src/components/checkbox-cards.tsx +92 -0
  125. package/src/components/checkbox-group.tsx +83 -0
  126. package/src/components/checkbox.tsx +65 -0
  127. package/src/components/collapsible.tsx +60 -0
  128. package/src/components/command.tsx +311 -0
  129. package/src/components/context-menu.tsx +489 -0
  130. package/src/components/dialog.tsx +295 -0
  131. package/src/components/drawer.tsx +271 -0
  132. package/src/components/dropdown-menu.tsx +498 -0
  133. package/src/components/empty.tsx +169 -0
  134. package/src/components/field.tsx +362 -0
  135. package/src/components/form.tsx +300 -0
  136. package/src/components/hover-card.tsx +116 -0
  137. package/src/components/input-group.tsx +224 -0
  138. package/src/components/input-number.tsx +161 -0
  139. package/src/components/input-otp.tsx +151 -0
  140. package/src/components/input-password.tsx +74 -0
  141. package/src/components/input-search.tsx +98 -0
  142. package/src/components/input.tsx +52 -0
  143. package/src/components/item.tsx +280 -0
  144. package/src/components/kbd.tsx +59 -0
  145. package/src/components/label.tsx +44 -0
  146. package/src/components/menubar.tsx +531 -0
  147. package/src/components/native-select.tsx +96 -0
  148. package/src/components/navigation-menu.tsx +295 -0
  149. package/src/components/pagination.tsx +204 -0
  150. package/src/components/popover.tsx +139 -0
  151. package/src/components/progress-circle.tsx +203 -0
  152. package/src/components/progress.tsx +54 -0
  153. package/src/components/radio-cards.tsx +85 -0
  154. package/src/components/radio-group.tsx +79 -0
  155. package/src/components/radio.tsx +61 -0
  156. package/src/components/resizable.tsx +99 -0
  157. package/src/components/scroll-area.tsx +115 -0
  158. package/src/components/select.tsx +319 -0
  159. package/src/components/separator.tsx +74 -0
  160. package/src/components/sheet.tsx +278 -0
  161. package/src/components/sidebar.tsx +1056 -0
  162. package/src/components/skeleton.tsx +37 -0
  163. package/src/components/slider.tsx +95 -0
  164. package/src/components/sonner.tsx +47 -0
  165. package/src/components/spinner.tsx +75 -0
  166. package/src/components/switch.tsx +66 -0
  167. package/src/components/table.tsx +200 -0
  168. package/src/components/tabs.tsx +128 -0
  169. package/src/components/textarea.tsx +49 -0
  170. package/src/components/toggle-group.tsx +141 -0
  171. package/src/components/toggle.tsx +39 -0
  172. package/src/components/tooltip.tsx +141 -0
  173. package/src/css/amber.css +59 -22
  174. package/src/css/blue.css +59 -22
  175. package/src/css/cyan.css +59 -22
  176. package/src/css/emerald.css +59 -22
  177. package/src/css/fuchsia.css +59 -22
  178. package/src/css/gray.css +59 -22
  179. package/src/css/green.css +59 -22
  180. package/src/css/indigo.css +59 -22
  181. package/src/css/lime.css +59 -22
  182. package/src/css/neutral.css +59 -22
  183. package/src/css/orange.css +59 -22
  184. package/src/css/pink.css +59 -22
  185. package/src/css/preset.css +32 -13
  186. package/src/css/purple.css +59 -22
  187. package/src/css/red.css +59 -22
  188. package/src/css/rose.css +59 -22
  189. package/src/css/sky.css +59 -22
  190. package/src/css/slate.css +59 -22
  191. package/src/css/stone.css +59 -22
  192. package/src/css/teal.css +59 -22
  193. package/src/css/violet.css +59 -22
  194. package/src/css/yellow.css +59 -22
  195. package/src/css/zinc.css +59 -22
  196. package/src/hooks/use-animated-value.ts +97 -0
  197. package/src/hooks/use-copy-to-clipboard.ts +63 -0
  198. package/src/hooks/use-is-mobile.ts +27 -0
  199. package/src/hooks/use-media-query.ts +71 -0
  200. package/src/hooks/use-mutation-observer.ts +54 -0
  201. package/src/hooks/use-pagination.ts +166 -0
  202. package/src/index.ts +720 -0
  203. package/src/lib/utils.ts +5 -0
  204. package/src/primitives/checkbox-group.tsx +360 -0
  205. package/src/primitives/input-number.tsx +1013 -0
  206. package/src/primitives/input.tsx +243 -0
  207. package/src/primitives/progress-circle.tsx +537 -0
  208. package/src/variants/alert.ts +45 -0
  209. package/src/variants/badge.ts +66 -0
  210. package/src/variants/button-group.ts +49 -0
  211. package/src/variants/button.ts +93 -0
  212. package/src/variants/empty.ts +43 -0
  213. package/src/variants/field.ts +50 -0
  214. package/src/variants/input-group.ts +132 -0
  215. package/src/variants/item.ts +90 -0
  216. package/src/variants/navigation-menu.ts +32 -0
  217. package/src/variants/progress-circle.ts +47 -0
  218. package/src/variants/scroll-area.ts +79 -0
  219. package/src/variants/separator.ts +41 -0
  220. package/src/variants/sheet.ts +70 -0
  221. package/src/variants/sidebar.ts +61 -0
  222. package/src/variants/toggle.ts +59 -0
  223. package/dist/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts +0 -6
@@ -0,0 +1,531 @@
1
+ "use client";
2
+
3
+ import type { ComponentProps, JSX } from "react";
4
+
5
+ import { cn } from "#/lib/utils";
6
+ import * as MenubarPrimitive from "@radix-ui/react-menubar";
7
+ import { CheckIcon, ChevronRightIcon, DotIcon } from "lucide-react";
8
+
9
+ /* -----------------------------------------------------------------------------
10
+ * Component: Menubar
11
+ * -------------------------------------------------------------------------- */
12
+
13
+ /**
14
+ * @since 0.3.16-canary.0
15
+ */
16
+ type MenubarProps = ComponentProps<typeof MenubarPrimitive.Root>;
17
+
18
+ /**
19
+ * @since 0.3.16-canary.0
20
+ */
21
+ function Menubar({ className, ...props }: MenubarProps): JSX.Element {
22
+ return (
23
+ <MenubarPrimitive.Root
24
+ className={cn(
25
+ "flex items-center space-x-1",
26
+ "p-1",
27
+ "rounded-lg border",
28
+ "bg-background",
29
+ className,
30
+ )}
31
+ data-slot="menubar"
32
+ {...props}
33
+ />
34
+ );
35
+ }
36
+
37
+ /* -----------------------------------------------------------------------------
38
+ * Component: MenubarMenu
39
+ * -------------------------------------------------------------------------- */
40
+
41
+ /**
42
+ * @since 0.3.16-canary.0
43
+ */
44
+ type MenubarMenuProps = ComponentProps<typeof MenubarPrimitive.Menu>;
45
+
46
+ /**
47
+ * @since 0.3.16-canary.0
48
+ */
49
+ function MenubarMenu({ ...props }: MenubarMenuProps): JSX.Element {
50
+ return <MenubarPrimitive.Menu data-slot="menubar-menu" {...props} />;
51
+ }
52
+
53
+ /* -----------------------------------------------------------------------------
54
+ * Component: MenubarGroup
55
+ * -------------------------------------------------------------------------- */
56
+
57
+ /**
58
+ * @since 0.3.16-canary.0
59
+ */
60
+ type MenubarGroupProps = ComponentProps<typeof MenubarPrimitive.Group>;
61
+
62
+ /**
63
+ * @since 0.3.16-canary.0
64
+ */
65
+ function MenubarGroup({ ...props }: MenubarGroupProps): JSX.Element {
66
+ return <MenubarPrimitive.Group data-slot="menubar-group" {...props} />;
67
+ }
68
+
69
+ /* -----------------------------------------------------------------------------
70
+ * Component: MenubarSub
71
+ * -------------------------------------------------------------------------- */
72
+
73
+ /**
74
+ * @since 0.3.16-canary.0
75
+ */
76
+ type MenubarSubProps = ComponentProps<typeof MenubarPrimitive.Sub>;
77
+
78
+ /**
79
+ * @since 0.3.16-canary.0
80
+ */
81
+ function MenubarSub({ ...props }: MenubarSubProps): JSX.Element {
82
+ return <MenubarPrimitive.Sub data-slot="menubar-sub" {...props} />;
83
+ }
84
+
85
+ /* -----------------------------------------------------------------------------
86
+ * Component: MenubarRadioGroup
87
+ * -------------------------------------------------------------------------- */
88
+
89
+ /**
90
+ * @since 0.3.16-canary.0
91
+ */
92
+ type MenubarRadioGroupProps = ComponentProps<typeof MenubarPrimitive.RadioGroup>;
93
+
94
+ /**
95
+ * @since 0.3.16-canary.0
96
+ */
97
+ function MenubarRadioGroup({ ...props }: MenubarRadioGroupProps): JSX.Element {
98
+ return <MenubarPrimitive.RadioGroup data-slot="menubar-radio-group" {...props} />;
99
+ }
100
+
101
+ /* -----------------------------------------------------------------------------
102
+ * Component: MenubarTrigger
103
+ * -------------------------------------------------------------------------- */
104
+
105
+ /**
106
+ * @since 0.3.16-canary.0
107
+ */
108
+ type MenubarTriggerProps = ComponentProps<typeof MenubarPrimitive.Trigger>;
109
+
110
+ /**
111
+ * @since 0.3.16-canary.0
112
+ */
113
+ function MenubarTrigger({ className, ...props }: MenubarTriggerProps): JSX.Element {
114
+ return (
115
+ <MenubarPrimitive.Trigger
116
+ className={cn(
117
+ "flex items-center gap-x-2",
118
+ "px-2 py-1.5",
119
+ "rounded-sm outline-hidden",
120
+ "text-sm font-medium",
121
+ "select-none",
122
+ "focus:bg-accent focus:text-accent-foreground",
123
+ "data-open:bg-accent data-open:text-accent-foreground",
124
+ className,
125
+ )}
126
+ data-slot="menubar-trigger"
127
+ {...props}
128
+ />
129
+ );
130
+ }
131
+
132
+ /* -----------------------------------------------------------------------------
133
+ * Component: MenubarSubTrigger
134
+ * -------------------------------------------------------------------------- */
135
+
136
+ /**
137
+ * @since 0.3.16-canary.0
138
+ */
139
+ interface MenubarSubTriggerProps extends ComponentProps<typeof MenubarPrimitive.SubTrigger> {
140
+ inset?: boolean;
141
+ }
142
+
143
+ /**
144
+ * @since 0.3.16-canary.0
145
+ */
146
+ function MenubarSubTrigger({
147
+ children,
148
+ className,
149
+ inset,
150
+ ...props
151
+ }: MenubarSubTriggerProps): JSX.Element {
152
+ return (
153
+ <MenubarPrimitive.SubTrigger
154
+ className={cn(
155
+ "flex items-center gap-x-2",
156
+ "px-2 py-1.5",
157
+ "rounded-sm outline-hidden",
158
+ "text-sm",
159
+ "cursor-default select-none",
160
+ "focus:bg-accent focus:text-accent-foreground",
161
+ "data-inset:pl-8",
162
+ "data-open:bg-accent data-open:text-accent-foreground",
163
+ className,
164
+ )}
165
+ data-inset={inset}
166
+ data-slot="menubar-sub-trigger"
167
+ {...props}
168
+ >
169
+ {children}
170
+ <ChevronRightIcon className={cn("size-4", "ml-auto")} />
171
+ </MenubarPrimitive.SubTrigger>
172
+ );
173
+ }
174
+
175
+ /* -----------------------------------------------------------------------------
176
+ * Component: MenubarSubContent
177
+ * -------------------------------------------------------------------------- */
178
+
179
+ /**
180
+ * @since 0.3.16-canary.0
181
+ */
182
+ type MenubarSubContentProps = ComponentProps<typeof MenubarPrimitive.SubContent>;
183
+
184
+ /**
185
+ * @since 0.3.16-canary.0
186
+ */
187
+ function MenubarSubContent({ className, ...props }: MenubarSubContentProps): JSX.Element {
188
+ return (
189
+ <MenubarPrimitive.Portal>
190
+ <MenubarPrimitive.SubContent
191
+ className={cn(
192
+ "z-50",
193
+ "min-w-32 overflow-hidden p-1",
194
+ "rounded-lg border",
195
+ "bg-popover text-popover-foreground shadow-lg",
196
+ "ease-snappy data-open:animate-in data-open:duration-200 data-open:fade-in-0 data-open:zoom-in-95",
197
+ "data-open:data-side-top:slide-in-from-bottom-2",
198
+ "data-open:data-side-right:slide-in-from-left-2",
199
+ "data-open:data-side-bottom:slide-in-from-top-2",
200
+ "data-open:data-side-left:slide-in-from-right-2",
201
+ "data-closed:animate-out data-closed:duration-150 data-closed:fade-out-0 data-closed:zoom-out-95",
202
+ "data-closed:data-side-top:slide-out-to-bottom-2",
203
+ "data-closed:data-side-right:slide-out-to-left-2",
204
+ "data-closed:data-side-bottom:slide-out-to-top-2",
205
+ "data-closed:data-side-left:slide-out-to-right-2",
206
+ "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
207
+ "origin-(--radix-menubar-content-transform-origin)",
208
+ className,
209
+ )}
210
+ data-slot="menubar-sub-content"
211
+ {...props}
212
+ />
213
+ </MenubarPrimitive.Portal>
214
+ );
215
+ }
216
+
217
+ /* -----------------------------------------------------------------------------
218
+ * Component: MenubarContent
219
+ * -------------------------------------------------------------------------- */
220
+
221
+ /**
222
+ * @since 0.3.16-canary.0
223
+ */
224
+ type MenubarContentProps = ComponentProps<typeof MenubarPrimitive.Content>;
225
+
226
+ /**
227
+ * @since 0.3.16-canary.0
228
+ */
229
+ function MenubarContent({
230
+ align = "start",
231
+ alignOffset = -4,
232
+ className,
233
+ sideOffset = 4,
234
+ ...props
235
+ }: MenubarContentProps): JSX.Element {
236
+ return (
237
+ <MenubarPrimitive.Portal>
238
+ <MenubarPrimitive.Content
239
+ align={align}
240
+ alignOffset={alignOffset}
241
+ className={cn(
242
+ "z-50",
243
+ "min-w-32 overflow-hidden p-1",
244
+ "rounded-lg border",
245
+ "bg-popover text-popover-foreground shadow-lg",
246
+ "ease-snappy data-open:animate-in data-open:duration-200 data-open:fade-in-0 data-open:zoom-in-95",
247
+ "data-open:data-side-top:slide-in-from-bottom-2",
248
+ "data-open:data-side-right:slide-in-from-left-2",
249
+ "data-open:data-side-bottom:slide-in-from-top-2",
250
+ "data-open:data-side-left:slide-in-from-right-2",
251
+ "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
252
+ "origin-(--radix-menubar-content-transform-origin)",
253
+ className,
254
+ )}
255
+ data-slot="menubar-content"
256
+ sideOffset={sideOffset}
257
+ {...props}
258
+ />
259
+ </MenubarPrimitive.Portal>
260
+ );
261
+ }
262
+
263
+ /* -----------------------------------------------------------------------------
264
+ * Component: MenubarItem
265
+ * -------------------------------------------------------------------------- */
266
+
267
+ /**
268
+ * @since 0.3.16-canary.0
269
+ */
270
+ interface MenubarItemProps extends ComponentProps<typeof MenubarPrimitive.Item> {
271
+ inset?: boolean;
272
+ variant?: "default" | "destructive";
273
+ }
274
+
275
+ /**
276
+ * @since 0.3.16-canary.0
277
+ */
278
+ function MenubarItem({ className, inset, variant, ...props }: MenubarItemProps): JSX.Element {
279
+ return (
280
+ <MenubarPrimitive.Item
281
+ className={cn(
282
+ "group/menubar-item relative flex items-center gap-x-2",
283
+ "px-2 py-1.5",
284
+ "rounded-sm outline-hidden",
285
+ "text-sm",
286
+ "cursor-default select-none",
287
+ "focus:bg-accent focus:text-accent-foreground",
288
+ "aria-disabled:opacity-50",
289
+ "data-inset:pl-8",
290
+ "data-[variant=destructive]:text-destructive",
291
+ "data-[variant=destructive]:focus:bg-destructive/10",
292
+ "dark:data-[variant=destructive]:focus:bg-destructive/20",
293
+ "data-[variant=destructive]:[&_svg:not([class*='text-'])]:text-destructive/80",
294
+ "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
295
+ "[&_svg:not([class*='text-'])]:text-muted-foreground",
296
+ className,
297
+ )}
298
+ data-inset={inset}
299
+ data-slot="menubar-item"
300
+ data-variant={variant}
301
+ {...props}
302
+ />
303
+ );
304
+ }
305
+
306
+ /* -----------------------------------------------------------------------------
307
+ * Component: MenubarCheckboxItem
308
+ * -------------------------------------------------------------------------- */
309
+
310
+ /**
311
+ * @since 0.3.16-canary.0
312
+ */
313
+ type MenubarCheckboxItemProps = ComponentProps<typeof MenubarPrimitive.CheckboxItem>;
314
+
315
+ /**
316
+ * @since 0.3.16-canary.0
317
+ */
318
+ function MenubarCheckboxItem({
319
+ checked,
320
+ children,
321
+ className,
322
+ ...props
323
+ }: MenubarCheckboxItemProps): JSX.Element {
324
+ return (
325
+ <MenubarPrimitive.CheckboxItem
326
+ checked={checked}
327
+ className={cn(
328
+ "group/menubar-item relative flex items-center gap-x-2",
329
+ "py-1.5 pr-2 pl-8",
330
+ "rounded-sm outline-hidden",
331
+ "text-sm",
332
+ "cursor-default select-none",
333
+ "focus:bg-accent focus:text-accent-foreground",
334
+ "aria-disabled:opacity-50",
335
+ "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
336
+ className,
337
+ )}
338
+ data-slot="menubar-checkbox-item"
339
+ {...props}
340
+ >
341
+ <span className={cn("absolute flex items-center justify-center", "left-2")}>
342
+ <MenubarPrimitive.ItemIndicator>
343
+ <CheckIcon className="size-4" />
344
+ </MenubarPrimitive.ItemIndicator>
345
+ </span>
346
+ {children}
347
+ </MenubarPrimitive.CheckboxItem>
348
+ );
349
+ }
350
+
351
+ /* -----------------------------------------------------------------------------
352
+ * Component: MenubarRadioItem
353
+ * -------------------------------------------------------------------------- */
354
+
355
+ /**
356
+ * @since 0.3.16-canary.0
357
+ */
358
+ type MenubarRadioItemProps = ComponentProps<typeof MenubarPrimitive.RadioItem>;
359
+
360
+ /**
361
+ * @since 0.3.16-canary.0
362
+ */
363
+ function MenubarRadioItem({ children, className, ...props }: MenubarRadioItemProps): JSX.Element {
364
+ return (
365
+ <MenubarPrimitive.RadioItem
366
+ className={cn(
367
+ "group/menubar-item relative flex items-center gap-x-2",
368
+ "py-1.5 pr-2 pl-8",
369
+ "rounded-sm outline-hidden",
370
+ "text-sm",
371
+ "cursor-default select-none",
372
+ "focus:bg-accent focus:text-accent-foreground",
373
+ "aria-disabled:opacity-50",
374
+ "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
375
+ className,
376
+ )}
377
+ data-slot="menubar-radio-item"
378
+ {...props}
379
+ >
380
+ <span className={cn("absolute flex items-center justify-center", "left-2")}>
381
+ <MenubarPrimitive.ItemIndicator>
382
+ <DotIcon className={cn("size-4", "fill-current")} />
383
+ </MenubarPrimitive.ItemIndicator>
384
+ </span>
385
+ {children}
386
+ </MenubarPrimitive.RadioItem>
387
+ );
388
+ }
389
+
390
+ /* -----------------------------------------------------------------------------
391
+ * Component: MenubarLabel
392
+ * -------------------------------------------------------------------------- */
393
+
394
+ /**
395
+ * @since 0.3.16-canary.0
396
+ */
397
+ interface MenubarLabelProps extends ComponentProps<typeof MenubarPrimitive.Label> {
398
+ inset?: boolean;
399
+ }
400
+
401
+ /**
402
+ * @since 0.3.16-canary.0
403
+ */
404
+ function MenubarLabel({ className, inset, ...props }: MenubarLabelProps): JSX.Element {
405
+ return (
406
+ <MenubarPrimitive.Label
407
+ className={cn(
408
+ "flex items-center gap-x-2",
409
+ "px-2 py-1.5",
410
+ "text-sm font-semibold",
411
+ "data-inset:pl-8",
412
+ className,
413
+ )}
414
+ data-inset={inset}
415
+ data-slot="menubar-label"
416
+ {...props}
417
+ />
418
+ );
419
+ }
420
+
421
+ /* -----------------------------------------------------------------------------
422
+ * Component: MenubarSeparator
423
+ * -------------------------------------------------------------------------- */
424
+
425
+ /**
426
+ * @since 0.3.16-canary.0
427
+ */
428
+ type MenubarSeparatorProps = ComponentProps<typeof MenubarPrimitive.Separator>;
429
+
430
+ /**
431
+ * @since 0.3.16-canary.0
432
+ */
433
+ function MenubarSeparator({ className, ...props }: MenubarSeparatorProps): JSX.Element {
434
+ return (
435
+ <MenubarPrimitive.Separator
436
+ className={cn("mx-2 my-1 h-px", "bg-border", className)}
437
+ data-slot="menubar-separator"
438
+ {...props}
439
+ />
440
+ );
441
+ }
442
+
443
+ /* -----------------------------------------------------------------------------
444
+ * Component: MenubarShortcut
445
+ * -------------------------------------------------------------------------- */
446
+
447
+ /**
448
+ * @since 0.3.16-canary.0
449
+ */
450
+ type MenubarShortcutProps = ComponentProps<"span">;
451
+
452
+ /**
453
+ * @since 0.3.16-canary.0
454
+ */
455
+ function MenubarShortcut({ className, ...props }: MenubarShortcutProps): JSX.Element {
456
+ return (
457
+ <span
458
+ className={cn(
459
+ "ml-auto",
460
+ "text-xs tracking-widest text-muted-foreground",
461
+ "group-data-[variant=destructive]/menubar-item:text-destructive/80",
462
+ className,
463
+ )}
464
+ data-slot="menubar-shortcut"
465
+ {...props}
466
+ />
467
+ );
468
+ }
469
+
470
+ /* -----------------------------------------------------------------------------
471
+ * Component: MenubarArrow
472
+ * -------------------------------------------------------------------------- */
473
+
474
+ /**
475
+ * @since 0.3.16-canary.0
476
+ */
477
+ type MenubarArrowProps = ComponentProps<typeof MenubarPrimitive.Arrow>;
478
+
479
+ /**
480
+ * @since 0.3.16-canary.0
481
+ */
482
+ function MenubarArrow({ className, ...props }: MenubarArrowProps): JSX.Element {
483
+ return (
484
+ <MenubarPrimitive.Arrow
485
+ className={cn("fill-popover", className)}
486
+ data-slot="menubar-arrow"
487
+ {...props}
488
+ />
489
+ );
490
+ }
491
+
492
+ /* -----------------------------------------------------------------------------
493
+ * Exports
494
+ * -------------------------------------------------------------------------- */
495
+
496
+ export {
497
+ Menubar,
498
+ MenubarArrow,
499
+ MenubarCheckboxItem,
500
+ MenubarContent,
501
+ MenubarGroup,
502
+ MenubarItem,
503
+ MenubarLabel,
504
+ MenubarMenu,
505
+ MenubarRadioGroup,
506
+ MenubarRadioItem,
507
+ MenubarSeparator,
508
+ MenubarShortcut,
509
+ MenubarSub,
510
+ MenubarSubContent,
511
+ MenubarSubTrigger,
512
+ MenubarTrigger,
513
+ };
514
+ export type {
515
+ MenubarArrowProps,
516
+ MenubarCheckboxItemProps,
517
+ MenubarContentProps,
518
+ MenubarGroupProps,
519
+ MenubarItemProps,
520
+ MenubarLabelProps,
521
+ MenubarMenuProps,
522
+ MenubarProps,
523
+ MenubarRadioGroupProps,
524
+ MenubarRadioItemProps,
525
+ MenubarSeparatorProps,
526
+ MenubarShortcutProps,
527
+ MenubarSubContentProps,
528
+ MenubarSubProps,
529
+ MenubarSubTriggerProps,
530
+ MenubarTriggerProps,
531
+ };
@@ -0,0 +1,96 @@
1
+ import type { ComponentProps, JSX } from "react";
2
+
3
+ import { cn } from "#/lib/utils";
4
+ import { ChevronDownIcon } from "lucide-react";
5
+
6
+ /* -----------------------------------------------------------------------------
7
+ * Component: NativeSelect
8
+ * -------------------------------------------------------------------------- */
9
+
10
+ /**
11
+ * @since 0.3.16-canary.0
12
+ */
13
+ type NativeSelectProps = ComponentProps<"select">;
14
+
15
+ /**
16
+ * @since 0.3.16-canary.0
17
+ */
18
+ function NativeSelect({ className, ...props }: NativeSelectProps): JSX.Element {
19
+ return (
20
+ <div
21
+ className={cn("group/native-select relative", "w-fit", "has-[select:disabled]:opacity-50")}
22
+ data-slot="native-select-wrapper"
23
+ >
24
+ <select
25
+ className={cn(
26
+ "h-9 w-full min-w-0 px-3 py-2 pr-9",
27
+ "rounded-lg border border-input",
28
+ "bg-transparent shadow-xs outline-none",
29
+ "text-sm",
30
+ "appearance-none transition-[color,box-shadow]",
31
+ "motion-reduce:transition-none",
32
+ "selection:bg-primary selection:text-primary-foreground",
33
+ "placeholder:text-muted-foreground",
34
+ "disabled:pointer-events-none disabled:cursor-not-allowed",
35
+ "dark:bg-input/30",
36
+ "dark:hover:bg-input/50",
37
+ "focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50",
38
+ "aria-invalid:border-destructive aria-invalid:ring-destructive/20",
39
+ "dark:aria-invalid:ring-destructive/40",
40
+ className,
41
+ )}
42
+ data-slot="native-select"
43
+ {...props}
44
+ />
45
+ <ChevronDownIcon
46
+ aria-hidden="true"
47
+ className={cn(
48
+ "absolute top-1/2 right-3.5",
49
+ "size-4 text-muted-foreground",
50
+ "-translate-y-1/2 opacity-50",
51
+ "pointer-events-none select-none",
52
+ )}
53
+ data-slot="native-select-icon"
54
+ />
55
+ </div>
56
+ );
57
+ }
58
+
59
+ /* -----------------------------------------------------------------------------
60
+ * Component: NativeSelectOption
61
+ * -------------------------------------------------------------------------- */
62
+
63
+ /**
64
+ * @since 0.3.16-canary.0
65
+ */
66
+ type NativeSelectOptionProps = ComponentProps<"option">;
67
+
68
+ /**
69
+ * @since 0.3.16-canary.0
70
+ */
71
+ function NativeSelectOption({ ...props }: NativeSelectOptionProps): JSX.Element {
72
+ return <option data-slot="native-select-option" {...props} />;
73
+ }
74
+
75
+ /* -----------------------------------------------------------------------------
76
+ * Component: NativeSelectOptGroup
77
+ * -------------------------------------------------------------------------- */
78
+
79
+ /**
80
+ * @since 0.3.16-canary.0
81
+ */
82
+ type NativeSelectOptGroupProps = ComponentProps<"optgroup">;
83
+
84
+ /**
85
+ * @since 0.3.16-canary.0
86
+ */
87
+ function NativeSelectOptGroup({ className, ...props }: NativeSelectOptGroupProps): JSX.Element {
88
+ return <optgroup className={cn(className)} data-slot="native-select-optgroup" {...props} />;
89
+ }
90
+
91
+ /* -----------------------------------------------------------------------------
92
+ * Exports
93
+ * -------------------------------------------------------------------------- */
94
+
95
+ export { NativeSelect, NativeSelectOptGroup, NativeSelectOption };
96
+ export type { NativeSelectOptGroupProps, NativeSelectOptionProps, NativeSelectProps };