@codefast/ui 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/dist/accordion.d.mts +9 -0
  2. package/dist/accordion.d.ts +9 -0
  3. package/dist/accordion.js +53 -0
  4. package/dist/accordion.js.map +1 -0
  5. package/dist/accordion.mjs +53 -0
  6. package/dist/accordion.mjs.map +1 -0
  7. package/dist/alert-dialog.d.mts +14 -0
  8. package/dist/alert-dialog.d.ts +14 -0
  9. package/dist/alert-dialog.js +107 -0
  10. package/dist/alert-dialog.js.map +1 -0
  11. package/dist/alert-dialog.mjs +107 -0
  12. package/dist/alert-dialog.mjs.map +1 -0
  13. package/dist/alert.d.mts +64 -0
  14. package/dist/alert.d.ts +64 -0
  15. package/dist/alert.js +55 -0
  16. package/dist/alert.js.map +1 -0
  17. package/dist/alert.mjs +55 -0
  18. package/dist/alert.mjs.map +1 -0
  19. package/dist/aspect-ratio.d.mts +6 -0
  20. package/dist/aspect-ratio.d.ts +6 -0
  21. package/dist/aspect-ratio.js +9 -0
  22. package/dist/aspect-ratio.js.map +1 -0
  23. package/dist/aspect-ratio.mjs +9 -0
  24. package/dist/aspect-ratio.mjs.map +1 -0
  25. package/dist/avatar.d.mts +8 -0
  26. package/dist/avatar.d.ts +8 -0
  27. package/dist/avatar.js +48 -0
  28. package/dist/avatar.js.map +1 -0
  29. package/dist/avatar.mjs +48 -0
  30. package/dist/avatar.mjs.map +1 -0
  31. package/dist/badge.d.mts +62 -0
  32. package/dist/badge.d.ts +62 -0
  33. package/dist/badge.js +31 -0
  34. package/dist/badge.js.map +1 -0
  35. package/dist/badge.mjs +31 -0
  36. package/dist/badge.mjs.map +1 -0
  37. package/dist/breadcrumb.d.mts +15 -0
  38. package/dist/breadcrumb.d.ts +15 -0
  39. package/dist/breadcrumb.js +100 -0
  40. package/dist/breadcrumb.js.map +1 -0
  41. package/dist/breadcrumb.mjs +100 -0
  42. package/dist/breadcrumb.mjs.map +1 -0
  43. package/dist/button.d.mts +1 -1
  44. package/dist/button.d.ts +1 -1
  45. package/dist/button.js +9 -1
  46. package/dist/button.js.map +1 -1
  47. package/dist/button.mjs +9 -1
  48. package/dist/button.mjs.map +1 -1
  49. package/dist/calendar.d.mts +7 -0
  50. package/dist/calendar.d.ts +7 -0
  51. package/dist/calendar.js +83 -0
  52. package/dist/calendar.js.map +1 -0
  53. package/dist/calendar.mjs +83 -0
  54. package/dist/calendar.mjs.map +1 -0
  55. package/dist/card.d.mts +9 -7
  56. package/dist/card.d.ts +9 -7
  57. package/dist/card.js +66 -1
  58. package/dist/card.js.map +1 -1
  59. package/dist/card.mjs +66 -1
  60. package/dist/card.mjs.map +1 -1
  61. package/dist/carousel.d.mts +22 -0
  62. package/dist/carousel.d.ts +22 -0
  63. package/dist/carousel.js +194 -0
  64. package/dist/carousel.js.map +1 -0
  65. package/dist/carousel.mjs +194 -0
  66. package/dist/carousel.mjs.map +1 -0
  67. package/dist/checkbox.d.mts +6 -0
  68. package/dist/checkbox.d.ts +6 -0
  69. package/dist/checkbox.js +27 -0
  70. package/dist/checkbox.js.map +1 -0
  71. package/dist/checkbox.mjs +27 -0
  72. package/dist/checkbox.mjs.map +1 -0
  73. package/dist/chunk-4K26QLS2.js +52 -0
  74. package/dist/chunk-4K26QLS2.js.map +1 -0
  75. package/dist/chunk-5GHZ6EXI.js +41 -0
  76. package/dist/chunk-5GHZ6EXI.js.map +1 -0
  77. package/dist/chunk-EIHWTXQ4.mjs +112 -0
  78. package/dist/chunk-EIHWTXQ4.mjs.map +1 -0
  79. package/dist/chunk-G3NP7M2N.js +19 -0
  80. package/dist/chunk-G3NP7M2N.js.map +1 -0
  81. package/dist/chunk-LDYBRDAY.js +112 -0
  82. package/dist/chunk-LDYBRDAY.js.map +1 -0
  83. package/dist/chunk-PTD4AMHI.mjs +25 -0
  84. package/dist/chunk-PTD4AMHI.mjs.map +1 -0
  85. package/dist/chunk-RTKEO347.js +25 -0
  86. package/dist/chunk-RTKEO347.js.map +1 -0
  87. package/dist/chunk-T52N6ZBP.mjs +41 -0
  88. package/dist/chunk-T52N6ZBP.mjs.map +1 -0
  89. package/dist/chunk-UG3URV2Z.mjs +19 -0
  90. package/dist/chunk-UG3URV2Z.mjs.map +1 -0
  91. package/dist/chunk-Z524G4RY.mjs +52 -0
  92. package/dist/chunk-Z524G4RY.mjs.map +1 -0
  93. package/dist/collapsible.d.mts +8 -0
  94. package/dist/collapsible.d.ts +8 -0
  95. package/dist/collapsible.js +13 -0
  96. package/dist/collapsible.js.map +1 -0
  97. package/dist/collapsible.mjs +13 -0
  98. package/dist/collapsible.mjs.map +1 -0
  99. package/dist/command.d.mts +89 -0
  100. package/dist/command.d.ts +89 -0
  101. package/dist/command.js +132 -0
  102. package/dist/command.js.map +1 -0
  103. package/dist/command.mjs +132 -0
  104. package/dist/command.mjs.map +1 -0
  105. package/dist/context-menu.d.mts +26 -0
  106. package/dist/context-menu.d.ts +26 -0
  107. package/dist/context-menu.js +170 -0
  108. package/dist/context-menu.js.map +1 -0
  109. package/dist/context-menu.mjs +170 -0
  110. package/dist/context-menu.mjs.map +1 -0
  111. package/dist/dialog.d.mts +13 -0
  112. package/dist/dialog.d.ts +13 -0
  113. package/dist/dialog.js +23 -0
  114. package/dist/dialog.mjs +23 -0
  115. package/dist/drawer.d.mts +16 -0
  116. package/dist/drawer.d.ts +16 -0
  117. package/dist/drawer.js +98 -0
  118. package/dist/drawer.js.map +1 -0
  119. package/dist/drawer.mjs +98 -0
  120. package/dist/drawer.mjs.map +1 -0
  121. package/dist/dropdown-menu.d.mts +25 -0
  122. package/dist/dropdown-menu.d.ts +25 -0
  123. package/dist/dropdown-menu.js +158 -0
  124. package/dist/dropdown-menu.js.map +1 -0
  125. package/dist/dropdown-menu.mjs +158 -0
  126. package/dist/dropdown-menu.mjs.map +1 -0
  127. package/dist/form.d.mts +27 -0
  128. package/dist/form.d.ts +27 -0
  129. package/dist/form.js +118 -0
  130. package/dist/form.js.map +1 -0
  131. package/dist/form.mjs +118 -0
  132. package/dist/form.mjs.map +1 -0
  133. package/dist/hover-card.d.mts +8 -0
  134. package/dist/hover-card.d.ts +8 -0
  135. package/dist/hover-card.js +31 -0
  136. package/dist/hover-card.js.map +1 -0
  137. package/dist/hover-card.mjs +31 -0
  138. package/dist/hover-card.mjs.map +1 -0
  139. package/dist/input-otp.d.mts +36 -0
  140. package/dist/input-otp.d.ts +36 -0
  141. package/dist/input-otp.js +60 -0
  142. package/dist/input-otp.js.map +1 -0
  143. package/dist/input-otp.mjs +60 -0
  144. package/dist/input-otp.mjs.map +1 -0
  145. package/dist/input.d.mts +5 -0
  146. package/dist/input.d.ts +5 -0
  147. package/dist/input.js +26 -0
  148. package/dist/input.js.map +1 -0
  149. package/dist/input.mjs +26 -0
  150. package/dist/input.mjs.map +1 -0
  151. package/dist/label.d.mts +6 -0
  152. package/dist/label.d.ts +6 -0
  153. package/dist/label.js +9 -0
  154. package/dist/label.js.map +1 -0
  155. package/dist/label.mjs +9 -0
  156. package/dist/label.mjs.map +1 -0
  157. package/dist/menubar.d.mts +29 -0
  158. package/dist/menubar.d.ts +29 -0
  159. package/dist/menubar.js +189 -0
  160. package/dist/menubar.js.map +1 -0
  161. package/dist/menubar.mjs +189 -0
  162. package/dist/menubar.mjs.map +1 -0
  163. package/dist/navigation-menu.d.mts +68 -0
  164. package/dist/navigation-menu.d.ts +68 -0
  165. package/dist/navigation-menu.js +125 -0
  166. package/dist/navigation-menu.js.map +1 -0
  167. package/dist/navigation-menu.mjs +125 -0
  168. package/dist/navigation-menu.mjs.map +1 -0
  169. package/dist/pagination.d.mts +16 -0
  170. package/dist/pagination.d.ts +16 -0
  171. package/dist/pagination.js +124 -0
  172. package/dist/pagination.js.map +1 -0
  173. package/dist/pagination.mjs +124 -0
  174. package/dist/pagination.mjs.map +1 -0
  175. package/dist/popover.d.mts +10 -0
  176. package/dist/popover.d.ts +10 -0
  177. package/dist/popover.js +43 -0
  178. package/dist/popover.js.map +1 -0
  179. package/dist/popover.mjs +43 -0
  180. package/dist/popover.mjs.map +1 -0
  181. package/dist/progress.d.mts +6 -0
  182. package/dist/progress.d.ts +6 -0
  183. package/dist/progress.js +34 -0
  184. package/dist/progress.js.map +1 -0
  185. package/dist/progress.mjs +34 -0
  186. package/dist/progress.mjs.map +1 -0
  187. package/dist/radio-group.d.mts +7 -0
  188. package/dist/radio-group.d.ts +7 -0
  189. package/dist/radio-group.js +47 -0
  190. package/dist/radio-group.js.map +1 -0
  191. package/dist/radio-group.mjs +47 -0
  192. package/dist/radio-group.mjs.map +1 -0
  193. package/dist/resizable.d.mts +26 -0
  194. package/dist/resizable.d.ts +26 -0
  195. package/dist/resizable.js +48 -0
  196. package/dist/resizable.js.map +1 -0
  197. package/dist/resizable.mjs +48 -0
  198. package/dist/resizable.mjs.map +1 -0
  199. package/dist/scroll-area.d.mts +7 -0
  200. package/dist/scroll-area.d.ts +7 -0
  201. package/dist/scroll-area.js +45 -0
  202. package/dist/scroll-area.js.map +1 -0
  203. package/dist/scroll-area.mjs +45 -0
  204. package/dist/scroll-area.mjs.map +1 -0
  205. package/dist/select.d.mts +15 -0
  206. package/dist/select.d.ts +15 -0
  207. package/dist/select.js +135 -0
  208. package/dist/select.js.map +1 -0
  209. package/dist/select.mjs +135 -0
  210. package/dist/select.mjs.map +1 -0
  211. package/dist/separator.d.mts +6 -0
  212. package/dist/separator.d.ts +6 -0
  213. package/dist/separator.js +30 -0
  214. package/dist/separator.js.map +1 -0
  215. package/dist/separator.mjs +30 -0
  216. package/dist/separator.mjs.map +1 -0
  217. package/dist/sheet.d.mts +73 -0
  218. package/dist/sheet.d.ts +73 -0
  219. package/dist/sheet.js +122 -0
  220. package/dist/sheet.js.map +1 -0
  221. package/dist/sheet.mjs +122 -0
  222. package/dist/sheet.mjs.map +1 -0
  223. package/dist/skeleton.d.mts +5 -0
  224. package/dist/skeleton.d.ts +5 -0
  225. package/dist/skeleton.js +22 -0
  226. package/dist/skeleton.js.map +1 -0
  227. package/dist/skeleton.mjs +22 -0
  228. package/dist/skeleton.mjs.map +1 -0
  229. package/dist/slider.d.mts +6 -0
  230. package/dist/slider.d.ts +6 -0
  231. package/dist/slider.js +29 -0
  232. package/dist/slider.js.map +1 -0
  233. package/dist/slider.mjs +29 -0
  234. package/dist/slider.mjs.map +1 -0
  235. package/dist/sonner.d.mts +8 -0
  236. package/dist/sonner.d.ts +8 -0
  237. package/dist/sonner.js +35 -0
  238. package/dist/sonner.js.map +1 -0
  239. package/dist/sonner.mjs +35 -0
  240. package/dist/sonner.mjs.map +1 -0
  241. package/dist/styles.css +1 -1
  242. package/dist/styles.css.map +1 -1
  243. package/dist/switch.d.mts +6 -0
  244. package/dist/switch.d.ts +6 -0
  245. package/dist/switch.js +26 -0
  246. package/dist/switch.js.map +1 -0
  247. package/dist/switch.mjs +26 -0
  248. package/dist/switch.mjs.map +1 -0
  249. package/dist/table.d.mts +12 -0
  250. package/dist/table.d.ts +12 -0
  251. package/dist/table.js +95 -0
  252. package/dist/table.js.map +1 -0
  253. package/dist/table.mjs +95 -0
  254. package/dist/table.mjs.map +1 -0
  255. package/dist/tabs.d.mts +9 -0
  256. package/dist/tabs.d.ts +9 -0
  257. package/dist/tabs.js +53 -0
  258. package/dist/tabs.js.map +1 -0
  259. package/dist/tabs.mjs +53 -0
  260. package/dist/tabs.mjs.map +1 -0
  261. package/dist/textarea.d.mts +5 -0
  262. package/dist/textarea.d.ts +5 -0
  263. package/dist/textarea.js +25 -0
  264. package/dist/textarea.js.map +1 -0
  265. package/dist/textarea.mjs +25 -0
  266. package/dist/textarea.mjs.map +1 -0
  267. package/dist/toggle-group.d.mts +10 -0
  268. package/dist/toggle-group.d.ts +10 -0
  269. package/dist/toggle-group.js +50 -0
  270. package/dist/toggle-group.js.map +1 -0
  271. package/dist/toggle-group.mjs +50 -0
  272. package/dist/toggle-group.mjs.map +1 -0
  273. package/dist/toggle.d.mts +66 -0
  274. package/dist/toggle.d.ts +66 -0
  275. package/dist/toggle.js +11 -0
  276. package/dist/toggle.js.map +1 -0
  277. package/dist/toggle.mjs +11 -0
  278. package/dist/toggle.mjs.map +1 -0
  279. package/dist/tooltip.d.mts +10 -0
  280. package/dist/tooltip.d.ts +10 -0
  281. package/dist/tooltip.js +42 -0
  282. package/dist/tooltip.js.map +1 -0
  283. package/dist/tooltip.mjs +42 -0
  284. package/dist/tooltip.mjs.map +1 -0
  285. package/dist/{cva.d.mts → utils.d.mts} +2 -2
  286. package/dist/{cva.d.ts → utils.d.ts} +2 -2
  287. package/dist/utils.js +11 -0
  288. package/dist/utils.js.map +1 -0
  289. package/dist/utils.mjs +11 -0
  290. package/dist/utils.mjs.map +1 -0
  291. package/package.json +260 -19
  292. package/src/accordion.tsx +76 -0
  293. package/src/alert-dialog.tsx +159 -0
  294. package/src/alert.tsx +78 -0
  295. package/src/aspect-ratio.tsx +15 -0
  296. package/src/avatar.tsx +65 -0
  297. package/src/badge.tsx +43 -0
  298. package/src/breadcrumb.tsx +148 -0
  299. package/src/button.tsx +7 -7
  300. package/src/calendar.tsx +94 -0
  301. package/src/card.tsx +112 -25
  302. package/src/carousel.tsx +281 -0
  303. package/src/checkbox.tsx +35 -0
  304. package/src/collapsible.tsx +27 -0
  305. package/src/command.tsx +203 -0
  306. package/src/context-menu.tsx +278 -0
  307. package/src/dialog.tsx +148 -0
  308. package/src/drawer.tsx +140 -0
  309. package/src/dropdown-menu.tsx +261 -0
  310. package/src/form.tsx +224 -0
  311. package/src/hover-card.tsx +46 -0
  312. package/src/input-otp.tsx +100 -0
  313. package/src/input.tsx +30 -0
  314. package/src/label.tsx +29 -0
  315. package/src/menubar.tsx +301 -0
  316. package/src/navigation-menu.tsx +176 -0
  317. package/src/pagination.tsx +160 -0
  318. package/src/popover.tsx +68 -0
  319. package/src/progress.tsx +37 -0
  320. package/src/radio-group.tsx +56 -0
  321. package/src/resizable.tsx +64 -0
  322. package/src/scroll-area.tsx +60 -0
  323. package/src/select.tsx +207 -0
  324. package/src/separator.tsx +38 -0
  325. package/src/sheet.tsx +165 -0
  326. package/src/skeleton.tsx +24 -0
  327. package/src/slider.tsx +35 -0
  328. package/src/sonner.tsx +43 -0
  329. package/src/switch.tsx +32 -0
  330. package/src/table.tsx +155 -0
  331. package/src/tabs.tsx +74 -0
  332. package/src/textarea.tsx +29 -0
  333. package/src/toggle-group.tsx +70 -0
  334. package/src/toggle.tsx +53 -0
  335. package/src/tooltip.tsx +73 -0
  336. package/src/{cva.ts → utils.ts} +5 -1
  337. package/tailwind.config.ts +39 -70
  338. package/dist/chunk-33V4YP7I.js +0 -2
  339. package/dist/chunk-33V4YP7I.js.map +0 -1
  340. package/dist/chunk-JVQ3OM5P.mjs +0 -2
  341. package/dist/chunk-JVQ3OM5P.mjs.map +0 -1
  342. package/dist/code.d.mts +0 -3
  343. package/dist/code.d.ts +0 -3
  344. package/dist/code.js +0 -2
  345. package/dist/code.js.map +0 -1
  346. package/dist/code.mjs +0 -2
  347. package/dist/code.mjs.map +0 -1
  348. package/dist/cva.js +0 -2
  349. package/dist/cva.mjs +0 -2
  350. package/src/code.tsx +0 -5
  351. /package/dist/{cva.js.map → dialog.js.map} +0 -0
  352. /package/dist/{cva.mjs.map → dialog.mjs.map} +0 -0
@@ -0,0 +1,100 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import { DotFilledIcon } from "@radix-ui/react-icons";
5
+ import {
6
+ OTPInput,
7
+ OTPInputContext,
8
+ REGEXP_ONLY_DIGITS_AND_CHARS,
9
+ } from "input-otp";
10
+ import { cn } from "./utils";
11
+
12
+ /* -----------------------------------------------------------------------------
13
+ * Component: InputOtp
14
+ * -------------------------------------------------------------------------- */
15
+
16
+ const InputOTP = React.forwardRef<
17
+ React.ElementRef<typeof OTPInput>,
18
+ React.ComponentPropsWithoutRef<typeof OTPInput>
19
+ >(({ className, containerClassName, ...props }, ref) => (
20
+ <OTPInput
21
+ ref={ref}
22
+ containerClassName={cn(
23
+ "flex items-center gap-2 has-[:disabled]:opacity-50",
24
+ containerClassName,
25
+ )}
26
+ className={cn("disabled:cursor-not-allowed", className)}
27
+ {...props}
28
+ />
29
+ ));
30
+ InputOTP.displayName = "InputOTP";
31
+
32
+ /* -----------------------------------------------------------------------------
33
+ * Component: InputOTPGroup
34
+ * -------------------------------------------------------------------------- */
35
+
36
+ const InputOTPGroup = React.forwardRef<
37
+ HTMLDivElement,
38
+ React.HTMLAttributes<HTMLDivElement>
39
+ >(({ className, ...props }, ref) => (
40
+ <div ref={ref} className={cn("flex items-center", className)} {...props} />
41
+ ));
42
+ InputOTPGroup.displayName = "InputOTPGroup";
43
+
44
+ /* -----------------------------------------------------------------------------
45
+ * Component: InputOTPSlot
46
+ * -------------------------------------------------------------------------- */
47
+
48
+ const InputOTPSlot = React.forwardRef<
49
+ HTMLDivElement,
50
+ React.HTMLAttributes<HTMLDivElement> & { index: number }
51
+ >(({ index, className, ...props }, ref) => {
52
+ const inputOTPContext = React.useContext(OTPInputContext);
53
+ const slot = inputOTPContext.slots[index];
54
+
55
+ return (
56
+ <div
57
+ ref={ref}
58
+ className={cn(
59
+ "border-input relative flex size-10 items-center justify-center border-y border-r text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md",
60
+ slot?.isActive && "ring-ring z-10 ring-2",
61
+ className,
62
+ )}
63
+ {...props}
64
+ >
65
+ {slot?.char}
66
+ {slot?.hasFakeCaret ? (
67
+ <div className="pointer-events-none absolute inset-0 flex items-center justify-center">
68
+ <div className="animate-caret-blink bg-foreground h-4 w-px duration-1000" />
69
+ </div>
70
+ ) : null}
71
+ </div>
72
+ );
73
+ });
74
+ InputOTPSlot.displayName = "InputOTPSlot";
75
+
76
+ /* -----------------------------------------------------------------------------
77
+ * Component: InputOTPSeparator
78
+ * -------------------------------------------------------------------------- */
79
+
80
+ const InputOTPSeparator = React.forwardRef<
81
+ HTMLDivElement,
82
+ React.HTMLAttributes<HTMLDivElement>
83
+ >(({ ...props }, ref) => (
84
+ <div ref={ref} role="separator" {...props}>
85
+ <DotFilledIcon />
86
+ </div>
87
+ ));
88
+ InputOTPSeparator.displayName = "InputOTPSeparator";
89
+
90
+ /* -----------------------------------------------------------------------------
91
+ * Exports
92
+ * -------------------------------------------------------------------------- */
93
+
94
+ export {
95
+ InputOTP,
96
+ InputOTPGroup,
97
+ InputOTPSlot,
98
+ InputOTPSeparator,
99
+ REGEXP_ONLY_DIGITS_AND_CHARS,
100
+ };
package/src/input.tsx ADDED
@@ -0,0 +1,30 @@
1
+ import * as React from "react";
2
+ import { cn } from "./utils";
3
+
4
+ /* -----------------------------------------------------------------------------
5
+ * Component: Input
6
+ * -------------------------------------------------------------------------- */
7
+
8
+ const Input = React.forwardRef<
9
+ HTMLInputElement,
10
+ React.InputHTMLAttributes<HTMLInputElement>
11
+ >(({ className, type, ...props }, ref) => {
12
+ return (
13
+ <input
14
+ type={type}
15
+ className={cn(
16
+ "border-input focus-visible:ring-ring focus-visible:ring-offset-background placeholder:text-muted-foreground flex h-10 w-full rounded-md border bg-transparent px-3 py-2 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
17
+ className,
18
+ )}
19
+ ref={ref}
20
+ {...props}
21
+ />
22
+ );
23
+ });
24
+ Input.displayName = "Input";
25
+
26
+ /* -----------------------------------------------------------------------------
27
+ * Exports
28
+ * -------------------------------------------------------------------------- */
29
+
30
+ export { Input };
package/src/label.tsx ADDED
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ import * as LabelPrimitive from "@radix-ui/react-label";
4
+ import { cn } from "./utils";
5
+
6
+ /* -----------------------------------------------------------------------------
7
+ * Component: Label
8
+ * -------------------------------------------------------------------------- */
9
+
10
+ const Label = React.forwardRef<
11
+ React.ElementRef<typeof LabelPrimitive.Root>,
12
+ LabelPrimitive.LabelProps
13
+ >(({ className, ...props }, ref) => (
14
+ <LabelPrimitive.Root
15
+ ref={ref}
16
+ className={cn(
17
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
18
+ className,
19
+ )}
20
+ {...props}
21
+ />
22
+ ));
23
+ Label.displayName = LabelPrimitive.Root.displayName;
24
+
25
+ /* -----------------------------------------------------------------------------
26
+ * Exports
27
+ * -------------------------------------------------------------------------- */
28
+
29
+ export { Label };
@@ -0,0 +1,301 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import {
5
+ CheckIcon,
6
+ ChevronRightIcon,
7
+ DotFilledIcon,
8
+ } from "@radix-ui/react-icons";
9
+ import * as MenubarPrimitive from "@radix-ui/react-menubar";
10
+ import { cn } from "./utils";
11
+
12
+ /* -----------------------------------------------------------------------------
13
+ * Component: MenubarMenu
14
+ * -------------------------------------------------------------------------- */
15
+
16
+ const MenubarMenu = MenubarPrimitive.Menu;
17
+
18
+ /* -----------------------------------------------------------------------------
19
+ * Component: MenubarGroup
20
+ * -------------------------------------------------------------------------- */
21
+
22
+ const MenubarGroup = MenubarPrimitive.Group;
23
+
24
+ /* -----------------------------------------------------------------------------
25
+ * Component: MenubarSub
26
+ * -------------------------------------------------------------------------- */
27
+
28
+ const MenubarSub = MenubarPrimitive.Sub;
29
+
30
+ /* -----------------------------------------------------------------------------
31
+ * Component: MenubarRadioGroup
32
+ * -------------------------------------------------------------------------- */
33
+
34
+ const MenubarRadioGroup = MenubarPrimitive.RadioGroup;
35
+
36
+ /* -----------------------------------------------------------------------------
37
+ * Component: Menubar
38
+ * -------------------------------------------------------------------------- */
39
+
40
+ const Menubar = React.forwardRef<
41
+ React.ElementRef<typeof MenubarPrimitive.Root>,
42
+ MenubarPrimitive.MenubarProps
43
+ >(({ className, ...props }, ref) => (
44
+ <MenubarPrimitive.Root
45
+ ref={ref}
46
+ className={cn(
47
+ "bg-background flex h-10 items-center space-x-1 rounded-md border p-1 shadow-sm",
48
+ className,
49
+ )}
50
+ {...props}
51
+ />
52
+ ));
53
+ Menubar.displayName = MenubarPrimitive.Root.displayName;
54
+
55
+ /* -----------------------------------------------------------------------------
56
+ * Component: MenubarTrigger
57
+ * -------------------------------------------------------------------------- */
58
+
59
+ const MenubarTrigger = React.forwardRef<
60
+ React.ElementRef<typeof MenubarPrimitive.Trigger>,
61
+ MenubarPrimitive.MenubarTriggerProps
62
+ >(({ className, ...props }, ref) => (
63
+ <MenubarPrimitive.Trigger
64
+ ref={ref}
65
+ className={cn(
66
+ "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default select-none items-center rounded-sm px-3 py-1 text-sm font-medium focus:outline-none",
67
+ className,
68
+ )}
69
+ {...props}
70
+ />
71
+ ));
72
+ MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName;
73
+
74
+ /* -----------------------------------------------------------------------------
75
+ * Component: MenubarSubTrigger
76
+ * -------------------------------------------------------------------------- */
77
+
78
+ const MenubarSubTrigger = React.forwardRef<
79
+ React.ElementRef<typeof MenubarPrimitive.SubTrigger>,
80
+ MenubarPrimitive.MenubarSubTriggerProps & {
81
+ inset?: boolean;
82
+ }
83
+ >(({ className, inset, children, ...props }, ref) => (
84
+ <MenubarPrimitive.SubTrigger
85
+ ref={ref}
86
+ className={cn(
87
+ "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm focus:outline-none",
88
+ inset && "pl-8",
89
+ className,
90
+ )}
91
+ {...props}
92
+ >
93
+ {children}
94
+ <ChevronRightIcon className="ml-auto size-4" />
95
+ </MenubarPrimitive.SubTrigger>
96
+ ));
97
+ MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName;
98
+
99
+ /* -----------------------------------------------------------------------------
100
+ * Component: MenubarSubContent
101
+ * -------------------------------------------------------------------------- */
102
+
103
+ const MenubarSubContent = React.forwardRef<
104
+ React.ElementRef<typeof MenubarPrimitive.SubContent>,
105
+ MenubarPrimitive.MenubarSubContentProps
106
+ >(({ className, ...props }, ref) => (
107
+ <MenubarPrimitive.Portal>
108
+ <MenubarPrimitive.SubContent
109
+ ref={ref}
110
+ className={cn(
111
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:data-[side=top]:slide-in-from-bottom-2 data-[state=open]:data-[side=right]:slide-in-from-left-2 data-[state=open]:data-[side=bottom]:slide-in-from-top-2 data-[state=open]:data-[side=left]:slide-in-from-right-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:data-[side=top]:slide-out-to-bottom-2 data-[state=closed]:data-[side=left]:slide-out-to-right-2 data-[state=closed]:data-[side=bottom]:slide-out-to-top-2 data-[state=closed]:data-[side=right]:slide-out-to-left-2 z-50 min-w-[8rem] rounded-md border p-1 shadow-md focus:outline-none",
112
+ className,
113
+ )}
114
+ {...props}
115
+ />
116
+ </MenubarPrimitive.Portal>
117
+ ));
118
+ MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName;
119
+
120
+ /* -----------------------------------------------------------------------------
121
+ * Component: MenubarContent
122
+ * -------------------------------------------------------------------------- */
123
+
124
+ const MenubarContent = React.forwardRef<
125
+ React.ElementRef<typeof MenubarPrimitive.Content>,
126
+ MenubarPrimitive.MenubarContentProps
127
+ >(
128
+ (
129
+ { className, align = "start", alignOffset = -4, sideOffset = 8, ...props },
130
+ ref,
131
+ ) => (
132
+ <MenubarPrimitive.Portal>
133
+ <MenubarPrimitive.Content
134
+ ref={ref}
135
+ align={align}
136
+ alignOffset={alignOffset}
137
+ sideOffset={sideOffset}
138
+ className={cn(
139
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:data-[side=top]:slide-in-from-bottom-2 data-[state=open]:data-[side=right]:slide-in-from-left-2 data-[state=open]:data-[side=bottom]:slide-in-from-top-2 data-[state=open]:data-[side=left]:slide-in-from-right-2 z-50 min-w-[8rem] rounded-md border p-1 shadow-md focus:outline-none",
140
+ className,
141
+ )}
142
+ {...props}
143
+ />
144
+ </MenubarPrimitive.Portal>
145
+ ),
146
+ );
147
+ MenubarContent.displayName = MenubarPrimitive.Content.displayName;
148
+
149
+ /* -----------------------------------------------------------------------------
150
+ * Component: MenubarItem
151
+ * -------------------------------------------------------------------------- */
152
+
153
+ const MenubarItem = React.forwardRef<
154
+ React.ElementRef<typeof MenubarPrimitive.Item>,
155
+ MenubarPrimitive.MenubarItemProps & {
156
+ inset?: boolean;
157
+ }
158
+ >(({ className, inset, ...props }, ref) => (
159
+ <MenubarPrimitive.Item
160
+ ref={ref}
161
+ className={cn(
162
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm focus:outline-none aria-disabled:pointer-events-none aria-disabled:opacity-50",
163
+ inset && "pl-8",
164
+ className,
165
+ )}
166
+ {...props}
167
+ />
168
+ ));
169
+ MenubarItem.displayName = MenubarPrimitive.Item.displayName;
170
+
171
+ /* -----------------------------------------------------------------------------
172
+ * Component: MenubarCheckboxItem
173
+ * -------------------------------------------------------------------------- */
174
+
175
+ const MenubarCheckboxItem = React.forwardRef<
176
+ React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,
177
+ MenubarPrimitive.MenubarCheckboxItemProps
178
+ >(({ className, children, checked, ...props }, ref) => (
179
+ <MenubarPrimitive.CheckboxItem
180
+ ref={ref}
181
+ className={cn(
182
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm focus:outline-none aria-disabled:pointer-events-none aria-disabled:opacity-50",
183
+ className,
184
+ )}
185
+ checked={checked}
186
+ {...props}
187
+ >
188
+ <span className="absolute left-2 flex size-3.5 items-center justify-center">
189
+ <MenubarPrimitive.ItemIndicator>
190
+ <CheckIcon className="size-4" />
191
+ </MenubarPrimitive.ItemIndicator>
192
+ </span>
193
+ {children}
194
+ </MenubarPrimitive.CheckboxItem>
195
+ ));
196
+ MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName;
197
+
198
+ /* -----------------------------------------------------------------------------
199
+ * Component: MenubarRadioItem
200
+ * -------------------------------------------------------------------------- */
201
+
202
+ const MenubarRadioItem = React.forwardRef<
203
+ React.ElementRef<typeof MenubarPrimitive.RadioItem>,
204
+ MenubarPrimitive.MenubarRadioItemProps
205
+ >(({ className, children, ...props }, ref) => (
206
+ <MenubarPrimitive.RadioItem
207
+ ref={ref}
208
+ className={cn(
209
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm focus:outline-none aria-disabled:pointer-events-none aria-disabled:opacity-50",
210
+ className,
211
+ )}
212
+ {...props}
213
+ >
214
+ <span className="absolute left-2 flex size-3.5 items-center justify-center">
215
+ <MenubarPrimitive.ItemIndicator>
216
+ <DotFilledIcon className="size-4 fill-current" />
217
+ </MenubarPrimitive.ItemIndicator>
218
+ </span>
219
+ {children}
220
+ </MenubarPrimitive.RadioItem>
221
+ ));
222
+ MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName;
223
+
224
+ /* -----------------------------------------------------------------------------
225
+ * Component: MenubarLabel
226
+ * -------------------------------------------------------------------------- */
227
+
228
+ const MenubarLabel = React.forwardRef<
229
+ React.ElementRef<typeof MenubarPrimitive.Label>,
230
+ MenubarPrimitive.MenubarLabelProps & {
231
+ inset?: boolean;
232
+ }
233
+ >(({ className, inset, ...props }, ref) => (
234
+ <MenubarPrimitive.Label
235
+ ref={ref}
236
+ className={cn(
237
+ "px-2 py-1.5 text-sm font-semibold",
238
+ inset && "pl-8",
239
+ className,
240
+ )}
241
+ {...props}
242
+ />
243
+ ));
244
+ MenubarLabel.displayName = MenubarPrimitive.Label.displayName;
245
+
246
+ /* -----------------------------------------------------------------------------
247
+ * Component: MenubarSeparator
248
+ * -------------------------------------------------------------------------- */
249
+
250
+ const MenubarSeparator = React.forwardRef<
251
+ React.ElementRef<typeof MenubarPrimitive.Separator>,
252
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>
253
+ >(({ className, ...props }, ref) => (
254
+ <MenubarPrimitive.Separator
255
+ ref={ref}
256
+ className={cn("bg-muted -mx-1 my-1 h-px", className)}
257
+ {...props}
258
+ />
259
+ ));
260
+ MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName;
261
+
262
+ /* -----------------------------------------------------------------------------
263
+ * Component: MenubarShortcut
264
+ * -------------------------------------------------------------------------- */
265
+
266
+ function MenubarShortcut({
267
+ className,
268
+ ...props
269
+ }: React.HTMLAttributes<HTMLSpanElement>): React.JSX.Element {
270
+ return (
271
+ <span
272
+ className={cn(
273
+ "text-muted-foreground ml-auto text-xs tracking-widest",
274
+ className,
275
+ )}
276
+ {...props}
277
+ />
278
+ );
279
+ }
280
+
281
+ /* -----------------------------------------------------------------------------
282
+ * Exports
283
+ * -------------------------------------------------------------------------- */
284
+
285
+ export {
286
+ Menubar,
287
+ MenubarMenu,
288
+ MenubarTrigger,
289
+ MenubarContent,
290
+ MenubarItem,
291
+ MenubarSeparator,
292
+ MenubarLabel,
293
+ MenubarCheckboxItem,
294
+ MenubarRadioGroup,
295
+ MenubarRadioItem,
296
+ MenubarSubContent,
297
+ MenubarSubTrigger,
298
+ MenubarGroup,
299
+ MenubarSub,
300
+ MenubarShortcut,
301
+ };
@@ -0,0 +1,176 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import { ChevronDownIcon } from "@radix-ui/react-icons";
5
+ import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
6
+ import { cn, cva } from "./utils";
7
+
8
+ /* -----------------------------------------------------------------------------
9
+ * Variant: NavigationMenu
10
+ * -------------------------------------------------------------------------- */
11
+
12
+ const navigationMenuTriggerStyle = cva({
13
+ base: "bg-background hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent/50 data-[active]:bg-accent/50 group inline-flex h-10 w-max items-center justify-center rounded-md px-3 py-2 text-sm font-medium transition-colors focus:outline-none disabled:pointer-events-none disabled:opacity-50",
14
+ });
15
+
16
+ /* -----------------------------------------------------------------------------
17
+ * Component: NavigationMenu
18
+ * -------------------------------------------------------------------------- */
19
+
20
+ const NavigationMenu = React.forwardRef<
21
+ React.ElementRef<typeof NavigationMenuPrimitive.Root>,
22
+ NavigationMenuPrimitive.NavigationMenuProps
23
+ >(({ className, children, ...props }, ref) => (
24
+ <NavigationMenuPrimitive.Root
25
+ ref={ref}
26
+ className={cn(
27
+ "relative z-10 flex max-w-max flex-1 items-center justify-center",
28
+ className,
29
+ )}
30
+ {...props}
31
+ >
32
+ {children}
33
+ <NavigationMenuViewport />
34
+ </NavigationMenuPrimitive.Root>
35
+ ));
36
+ NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName;
37
+
38
+ /* -----------------------------------------------------------------------------
39
+ * Component: NavigationMenuList
40
+ * -------------------------------------------------------------------------- */
41
+
42
+ const NavigationMenuList = React.forwardRef<
43
+ React.ElementRef<typeof NavigationMenuPrimitive.List>,
44
+ NavigationMenuPrimitive.NavigationMenuListProps
45
+ >(({ className, ...props }, ref) => (
46
+ <NavigationMenuPrimitive.List
47
+ ref={ref}
48
+ className={cn(
49
+ "group flex flex-1 list-none items-center justify-center space-x-1",
50
+ className,
51
+ )}
52
+ {...props}
53
+ />
54
+ ));
55
+ NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
56
+
57
+ /* -----------------------------------------------------------------------------
58
+ * Component: NavigationMenuItem
59
+ * -------------------------------------------------------------------------- */
60
+
61
+ const NavigationMenuItem = NavigationMenuPrimitive.Item;
62
+
63
+ /* -----------------------------------------------------------------------------
64
+ * Component: NavigationMenuContent
65
+ * -------------------------------------------------------------------------- */
66
+
67
+ const NavigationMenuTrigger = React.forwardRef<
68
+ React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,
69
+ NavigationMenuPrimitive.NavigationMenuTriggerProps
70
+ >(({ className, children, ...props }, ref) => (
71
+ <NavigationMenuPrimitive.Trigger
72
+ ref={ref}
73
+ className={navigationMenuTriggerStyle({
74
+ className: ["group", className],
75
+ })}
76
+ {...props}
77
+ >
78
+ {children}{" "}
79
+ <ChevronDownIcon
80
+ className={cn(
81
+ "relative top-px ml-1 h-3 w-3 transition duration-300 group-data-[state=open]:rotate-180",
82
+ )}
83
+ aria-hidden="true"
84
+ />
85
+ </NavigationMenuPrimitive.Trigger>
86
+ ));
87
+ NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName;
88
+
89
+ /* -----------------------------------------------------------------------------
90
+ * Component: NavigationMenuContent
91
+ * -------------------------------------------------------------------------- */
92
+
93
+ const NavigationMenuContent = React.forwardRef<
94
+ React.ElementRef<typeof NavigationMenuPrimitive.Content>,
95
+ NavigationMenuPrimitive.NavigationMenuContentProps
96
+ >(({ className, ...props }, ref) => (
97
+ <NavigationMenuPrimitive.Content
98
+ ref={ref}
99
+ className={cn(
100
+ "data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 left-0 top-0 w-full focus:outline-none md:absolute md:w-auto",
101
+ className,
102
+ )}
103
+ {...props}
104
+ />
105
+ ));
106
+ NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName;
107
+
108
+ /* -----------------------------------------------------------------------------
109
+ * Component: NavigationMenuLink
110
+ * -------------------------------------------------------------------------- */
111
+
112
+ const NavigationMenuLink = NavigationMenuPrimitive.Link;
113
+
114
+ /* -----------------------------------------------------------------------------
115
+ * Component: NavigationMenuViewport
116
+ * -------------------------------------------------------------------------- */
117
+
118
+ const NavigationMenuViewport = React.forwardRef<
119
+ React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,
120
+ NavigationMenuPrimitive.NavigationMenuViewportProps
121
+ >(({ className, ...props }, ref) => (
122
+ <div
123
+ className={cn(
124
+ "perspective-[2000px] absolute left-0 top-full flex justify-center",
125
+ )}
126
+ >
127
+ <NavigationMenuPrimitive.Viewport
128
+ className={cn(
129
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=open]:zoom-in-90 data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full origin-[top_center] overflow-hidden rounded-md border shadow md:w-[var(--radix-navigation-menu-viewport-width)]",
130
+ className,
131
+ )}
132
+ ref={ref}
133
+ {...props}
134
+ />
135
+ </div>
136
+ ));
137
+ NavigationMenuViewport.displayName =
138
+ NavigationMenuPrimitive.Viewport.displayName;
139
+
140
+ /* -----------------------------------------------------------------------------
141
+ * Component: NavigationMenuIndicator
142
+ * -------------------------------------------------------------------------- */
143
+
144
+ const NavigationMenuIndicator = React.forwardRef<
145
+ React.ElementRef<typeof NavigationMenuPrimitive.Indicator>,
146
+ NavigationMenuPrimitive.NavigationMenuIndicatorProps
147
+ >(({ className, ...props }, ref) => (
148
+ <NavigationMenuPrimitive.Indicator
149
+ ref={ref}
150
+ className={cn(
151
+ "data-[state=visible]:animate-in data-[state=visible]:fade-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden transition",
152
+ className,
153
+ )}
154
+ {...props}
155
+ >
156
+ <div className="bg-border relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm shadow-md" />
157
+ </NavigationMenuPrimitive.Indicator>
158
+ ));
159
+ NavigationMenuIndicator.displayName =
160
+ NavigationMenuPrimitive.Indicator.displayName;
161
+
162
+ /* -----------------------------------------------------------------------------
163
+ * Exports
164
+ * -------------------------------------------------------------------------- */
165
+
166
+ export {
167
+ navigationMenuTriggerStyle,
168
+ NavigationMenu,
169
+ NavigationMenuList,
170
+ NavigationMenuItem,
171
+ NavigationMenuContent,
172
+ NavigationMenuTrigger,
173
+ NavigationMenuLink,
174
+ NavigationMenuIndicator,
175
+ NavigationMenuViewport,
176
+ };