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