@codefast/ui 0.0.3 → 0.0.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 (351) hide show
  1. package/dist/accordion.d.mts +9 -0
  2. package/dist/accordion.d.ts +9 -0
  3. package/dist/accordion.js +2 -0
  4. package/dist/accordion.js.map +1 -0
  5. package/dist/accordion.mjs +2 -0
  6. package/dist/accordion.mjs.map +1 -0
  7. package/dist/alert-dialog.d.mts +16 -0
  8. package/dist/alert-dialog.d.ts +16 -0
  9. package/dist/alert-dialog.js +2 -0
  10. package/dist/alert-dialog.js.map +1 -0
  11. package/dist/alert-dialog.mjs +2 -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 +2 -0
  16. package/dist/alert.js.map +1 -0
  17. package/dist/alert.mjs +2 -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 +2 -0
  22. package/dist/aspect-ratio.js.map +1 -0
  23. package/dist/aspect-ratio.mjs +2 -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 +2 -0
  28. package/dist/avatar.js.map +1 -0
  29. package/dist/avatar.mjs +2 -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 +2 -0
  34. package/dist/badge.js.map +1 -0
  35. package/dist/badge.mjs +2 -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 +2 -0
  40. package/dist/breadcrumb.js.map +1 -0
  41. package/dist/breadcrumb.mjs +2 -0
  42. package/dist/breadcrumb.mjs.map +1 -0
  43. package/dist/button.d.mts +2 -2
  44. package/dist/button.d.ts +2 -2
  45. package/dist/button.js +1 -1
  46. package/dist/button.js.map +1 -1
  47. package/dist/button.mjs +1 -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 +2 -0
  52. package/dist/calendar.js.map +1 -0
  53. package/dist/calendar.mjs +2 -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 +1 -1
  58. package/dist/card.js.map +1 -1
  59. package/dist/card.mjs +1 -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 +2 -0
  64. package/dist/carousel.js.map +1 -0
  65. package/dist/carousel.mjs +2 -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 +2 -0
  70. package/dist/checkbox.js.map +1 -0
  71. package/dist/checkbox.mjs +2 -0
  72. package/dist/checkbox.mjs.map +1 -0
  73. package/dist/chunk-4ZL55G6C.js +2 -0
  74. package/dist/chunk-4ZL55G6C.js.map +1 -0
  75. package/dist/chunk-76AASLTX.mjs +2 -0
  76. package/dist/chunk-76AASLTX.mjs.map +1 -0
  77. package/dist/chunk-7UVSBFQU.js +2 -0
  78. package/dist/chunk-7UVSBFQU.js.map +1 -0
  79. package/dist/chunk-BP7PEVLB.js +2 -0
  80. package/dist/chunk-BP7PEVLB.js.map +1 -0
  81. package/dist/chunk-BPCLLQ62.mjs +2 -0
  82. package/dist/chunk-BPCLLQ62.mjs.map +1 -0
  83. package/dist/chunk-CAGY2ZSE.js +2 -0
  84. package/dist/chunk-CAGY2ZSE.js.map +1 -0
  85. package/dist/chunk-JTI7KCLO.mjs +2 -0
  86. package/dist/chunk-JTI7KCLO.mjs.map +1 -0
  87. package/dist/{chunk-33V4YP7I.js → chunk-QZCQ42BP.js} +2 -2
  88. package/dist/chunk-QZCQ42BP.js.map +1 -0
  89. package/dist/chunk-WZ4XIF6U.mjs +2 -0
  90. package/dist/chunk-WZ4XIF6U.mjs.map +1 -0
  91. package/dist/chunk-YQJHVJVX.mjs +2 -0
  92. package/dist/chunk-YQJHVJVX.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 +2 -0
  96. package/dist/collapsible.js.map +1 -0
  97. package/dist/collapsible.mjs +2 -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 +2 -0
  102. package/dist/command.js.map +1 -0
  103. package/dist/command.mjs +2 -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 +2 -0
  108. package/dist/context-menu.js.map +1 -0
  109. package/dist/context-menu.mjs +2 -0
  110. package/dist/context-menu.mjs.map +1 -0
  111. package/dist/dialog.d.mts +15 -0
  112. package/dist/dialog.d.ts +15 -0
  113. package/dist/dialog.js +2 -0
  114. package/dist/dialog.mjs +2 -0
  115. package/dist/drawer.d.mts +18 -0
  116. package/dist/drawer.d.ts +18 -0
  117. package/dist/drawer.js +2 -0
  118. package/dist/drawer.js.map +1 -0
  119. package/dist/drawer.mjs +2 -0
  120. package/dist/drawer.mjs.map +1 -0
  121. package/dist/dropdown-menu.d.mts +26 -0
  122. package/dist/dropdown-menu.d.ts +26 -0
  123. package/dist/dropdown-menu.js +2 -0
  124. package/dist/dropdown-menu.js.map +1 -0
  125. package/dist/dropdown-menu.mjs +2 -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 +2 -0
  130. package/dist/form.js.map +1 -0
  131. package/dist/form.mjs +2 -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 +2 -0
  136. package/dist/hover-card.js.map +1 -0
  137. package/dist/hover-card.mjs +2 -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 +2 -0
  142. package/dist/input-otp.js.map +1 -0
  143. package/dist/input-otp.mjs +2 -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 +2 -0
  148. package/dist/input.js.map +1 -0
  149. package/dist/input.mjs +2 -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 +2 -0
  154. package/dist/label.js.map +1 -0
  155. package/dist/label.mjs +2 -0
  156. package/dist/label.mjs.map +1 -0
  157. package/dist/menubar.d.mts +30 -0
  158. package/dist/menubar.d.ts +30 -0
  159. package/dist/menubar.js +2 -0
  160. package/dist/menubar.js.map +1 -0
  161. package/dist/menubar.mjs +2 -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 +2 -0
  166. package/dist/navigation-menu.js.map +1 -0
  167. package/dist/navigation-menu.mjs +2 -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 +2 -0
  172. package/dist/pagination.js.map +1 -0
  173. package/dist/pagination.mjs +2 -0
  174. package/dist/pagination.mjs.map +1 -0
  175. package/dist/popover.d.mts +9 -0
  176. package/dist/popover.d.ts +9 -0
  177. package/dist/popover.js +2 -0
  178. package/dist/popover.js.map +1 -0
  179. package/dist/popover.mjs +2 -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 +2 -0
  184. package/dist/progress.js.map +1 -0
  185. package/dist/progress.mjs +2 -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 +2 -0
  190. package/dist/radio-group.js.map +1 -0
  191. package/dist/radio-group.mjs +2 -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 +2 -0
  196. package/dist/resizable.js.map +1 -0
  197. package/dist/resizable.mjs +2 -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 +2 -0
  202. package/dist/scroll-area.js.map +1 -0
  203. package/dist/scroll-area.mjs +2 -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 +2 -0
  208. package/dist/select.js.map +1 -0
  209. package/dist/select.mjs +2 -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 +2 -0
  214. package/dist/separator.js.map +1 -0
  215. package/dist/separator.mjs +2 -0
  216. package/dist/separator.mjs.map +1 -0
  217. package/dist/sheet.d.mts +75 -0
  218. package/dist/sheet.d.ts +75 -0
  219. package/dist/sheet.js +2 -0
  220. package/dist/sheet.js.map +1 -0
  221. package/dist/sheet.mjs +2 -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 +2 -0
  226. package/dist/skeleton.js.map +1 -0
  227. package/dist/skeleton.mjs +2 -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 +2 -0
  232. package/dist/slider.js.map +1 -0
  233. package/dist/slider.mjs +2 -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 +2 -0
  238. package/dist/sonner.js.map +1 -0
  239. package/dist/sonner.mjs +2 -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 +2 -0
  246. package/dist/switch.js.map +1 -0
  247. package/dist/switch.mjs +2 -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 +2 -0
  252. package/dist/table.js.map +1 -0
  253. package/dist/table.mjs +2 -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 +2 -0
  258. package/dist/tabs.js.map +1 -0
  259. package/dist/tabs.mjs +2 -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 +2 -0
  264. package/dist/textarea.js.map +1 -0
  265. package/dist/textarea.mjs +2 -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 +2 -0
  270. package/dist/toggle-group.js.map +1 -0
  271. package/dist/toggle-group.mjs +2 -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 +2 -0
  276. package/dist/toggle.js.map +1 -0
  277. package/dist/toggle.mjs +2 -0
  278. package/dist/toggle.mjs.map +1 -0
  279. package/dist/tooltip.d.mts +11 -0
  280. package/dist/tooltip.d.ts +11 -0
  281. package/dist/tooltip.js +2 -0
  282. package/dist/tooltip.js.map +1 -0
  283. package/dist/tooltip.mjs +2 -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 +2 -0
  288. package/dist/utils.js.map +1 -0
  289. package/dist/utils.mjs +2 -0
  290. package/dist/utils.mjs.map +1 -0
  291. package/package.json +259 -18
  292. package/src/accordion.tsx +80 -0
  293. package/src/alert-dialog.tsx +190 -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 +3 -3
  300. package/src/calendar.tsx +95 -0
  301. package/src/card.tsx +112 -25
  302. package/src/carousel.tsx +281 -0
  303. package/src/checkbox.tsx +36 -0
  304. package/src/collapsible.tsx +27 -0
  305. package/src/command.tsx +214 -0
  306. package/src/context-menu.tsx +290 -0
  307. package/src/dialog.tsx +176 -0
  308. package/src/drawer.tsx +164 -0
  309. package/src/dropdown-menu.tsx +290 -0
  310. package/src/form.tsx +225 -0
  311. package/src/hover-card.tsx +54 -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 +326 -0
  316. package/src/navigation-menu.tsx +189 -0
  317. package/src/pagination.tsx +162 -0
  318. package/src/popover.tsx +62 -0
  319. package/src/progress.tsx +35 -0
  320. package/src/radio-group.tsx +54 -0
  321. package/src/resizable.tsx +67 -0
  322. package/src/scroll-area.tsx +60 -0
  323. package/src/select.tsx +216 -0
  324. package/src/separator.tsx +38 -0
  325. package/src/sheet.tsx +209 -0
  326. package/src/skeleton.tsx +24 -0
  327. package/src/slider.tsx +35 -0
  328. package/src/sonner.tsx +41 -0
  329. package/src/switch.tsx +38 -0
  330. package/src/table.tsx +155 -0
  331. package/src/tabs.tsx +75 -0
  332. package/src/textarea.tsx +29 -0
  333. package/src/toggle-group.tsx +70 -0
  334. package/src/toggle.tsx +56 -0
  335. package/src/tooltip.tsx +84 -0
  336. package/src/{cva.ts → utils.ts} +5 -1
  337. package/tailwind.config.ts +39 -70
  338. package/dist/chunk-33V4YP7I.js.map +0 -1
  339. package/dist/chunk-JVQ3OM5P.mjs +0 -2
  340. package/dist/chunk-JVQ3OM5P.mjs.map +0 -1
  341. package/dist/code.d.mts +0 -3
  342. package/dist/code.d.ts +0 -3
  343. package/dist/code.js +0 -2
  344. package/dist/code.js.map +0 -1
  345. package/dist/code.mjs +0 -2
  346. package/dist/code.mjs.map +0 -1
  347. package/dist/cva.js +0 -2
  348. package/dist/cva.mjs +0 -2
  349. package/src/code.tsx +0 -5
  350. /package/dist/{cva.js.map → dialog.js.map} +0 -0
  351. /package/dist/{cva.mjs.map → dialog.mjs.map} +0 -0
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,326 @@
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: MenubarPortal
26
+ * -------------------------------------------------------------------------- */
27
+
28
+ const MenubarPortal = MenubarPrimitive.Portal;
29
+
30
+ /* -----------------------------------------------------------------------------
31
+ * Component: MenubarSub
32
+ * -------------------------------------------------------------------------- */
33
+
34
+ const MenubarSub = MenubarPrimitive.Sub;
35
+
36
+ /* -----------------------------------------------------------------------------
37
+ * Component: MenubarRadioGroup
38
+ * -------------------------------------------------------------------------- */
39
+
40
+ const MenubarRadioGroup = MenubarPrimitive.RadioGroup;
41
+
42
+ /* -----------------------------------------------------------------------------
43
+ * Component: Menubar
44
+ * -------------------------------------------------------------------------- */
45
+
46
+ const Menubar = React.forwardRef<
47
+ React.ElementRef<typeof MenubarPrimitive.Root>,
48
+ MenubarPrimitive.MenubarProps
49
+ >(({ className, ...props }, ref) => (
50
+ <MenubarPrimitive.Root
51
+ ref={ref}
52
+ className={cn(
53
+ "bg-background flex h-9 items-center space-x-1 rounded-md border p-1 shadow-sm",
54
+ className,
55
+ )}
56
+ {...props}
57
+ />
58
+ ));
59
+ Menubar.displayName = MenubarPrimitive.Root.displayName;
60
+
61
+ /* -----------------------------------------------------------------------------
62
+ * Component: MenubarTrigger
63
+ * -------------------------------------------------------------------------- */
64
+
65
+ const MenubarTrigger = React.forwardRef<
66
+ React.ElementRef<typeof MenubarPrimitive.Trigger>,
67
+ MenubarPrimitive.MenubarTriggerProps
68
+ >(({ className, ...props }, ref) => (
69
+ <MenubarPrimitive.Trigger
70
+ ref={ref}
71
+ className={cn(
72
+ "focus:bg-accent focus:text-accent-foreground flex cursor-default select-none items-center rounded-sm px-3 py-1 text-sm font-medium outline-none",
73
+ "data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
74
+ className,
75
+ )}
76
+ {...props}
77
+ />
78
+ ));
79
+ MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName;
80
+
81
+ /* -----------------------------------------------------------------------------
82
+ * Component: MenubarSubTrigger
83
+ * -------------------------------------------------------------------------- */
84
+
85
+ const MenubarSubTrigger = React.forwardRef<
86
+ React.ElementRef<typeof MenubarPrimitive.SubTrigger>,
87
+ MenubarPrimitive.MenubarSubTriggerProps & {
88
+ inset?: boolean;
89
+ }
90
+ >(({ className, inset, children, ...props }, ref) => (
91
+ <MenubarPrimitive.SubTrigger
92
+ ref={ref}
93
+ className={cn(
94
+ "focus:bg-accent focus:text-accent-foreground flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none",
95
+ "data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
96
+ inset && "pl-8",
97
+ className,
98
+ )}
99
+ {...props}
100
+ >
101
+ {children}
102
+ <ChevronRightIcon className="ml-auto size-4" />
103
+ </MenubarPrimitive.SubTrigger>
104
+ ));
105
+ MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName;
106
+
107
+ /* -----------------------------------------------------------------------------
108
+ * Component: MenubarSubContent
109
+ * -------------------------------------------------------------------------- */
110
+
111
+ const MenubarSubContent = React.forwardRef<
112
+ React.ElementRef<typeof MenubarPrimitive.SubContent>,
113
+ MenubarPrimitive.MenubarSubContentProps
114
+ >(({ className, ...props }, ref) => (
115
+ <MenubarPrimitive.SubContent
116
+ ref={ref}
117
+ className={cn(
118
+ "bg-popover text-popover-foreground z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg",
119
+ "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
120
+ "data-[state=open]:data-[side=top]:slide-in-from-bottom-2",
121
+ "data-[state=open]:data-[side=right]:slide-in-from-left-2",
122
+ "data-[state=open]:data-[side=bottom]:slide-in-from-top-2",
123
+ "data-[state=open]:data-[side=left]:slide-in-from-right-2",
124
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
125
+ "data-[state=closed]:data-[side=top]:slide-out-to-bottom-2",
126
+ "data-[state=closed]:data-[side=left]:slide-out-to-right-2",
127
+ "data-[state=closed]:data-[side=bottom]:slide-out-to-top-2",
128
+ "data-[state=closed]:data-[side=right]:slide-out-to-left-2",
129
+ className,
130
+ )}
131
+ {...props}
132
+ />
133
+ ));
134
+ MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName;
135
+
136
+ /* -----------------------------------------------------------------------------
137
+ * Component: MenubarContent
138
+ * -------------------------------------------------------------------------- */
139
+
140
+ const MenubarContent = React.forwardRef<
141
+ React.ElementRef<typeof MenubarPrimitive.Content>,
142
+ MenubarPrimitive.MenubarContentProps
143
+ >(
144
+ (
145
+ { className, align = "start", alignOffset = -4, sideOffset = 8, ...props },
146
+ ref,
147
+ ) => (
148
+ <MenubarPrimitive.Portal>
149
+ <MenubarPrimitive.Content
150
+ ref={ref}
151
+ align={align}
152
+ alignOffset={alignOffset}
153
+ sideOffset={sideOffset}
154
+ className={cn(
155
+ "bg-popover text-popover-foreground z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md",
156
+ "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
157
+ "data-[state=open]:data-[side=top]:slide-in-from-bottom-2",
158
+ "data-[state=open]:data-[side=right]:slide-in-from-left-2",
159
+ "data-[state=open]:data-[side=bottom]:slide-in-from-top-2",
160
+ "data-[state=open]:data-[side=left]:slide-in-from-right-2",
161
+ className,
162
+ )}
163
+ {...props}
164
+ />
165
+ </MenubarPrimitive.Portal>
166
+ ),
167
+ );
168
+ MenubarContent.displayName = MenubarPrimitive.Content.displayName;
169
+
170
+ /* -----------------------------------------------------------------------------
171
+ * Component: MenubarItem
172
+ * -------------------------------------------------------------------------- */
173
+
174
+ const MenubarItem = React.forwardRef<
175
+ React.ElementRef<typeof MenubarPrimitive.Item>,
176
+ MenubarPrimitive.MenubarItemProps & {
177
+ inset?: boolean;
178
+ }
179
+ >(({ className, inset, ...props }, ref) => (
180
+ <MenubarPrimitive.Item
181
+ ref={ref}
182
+ className={cn(
183
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none",
184
+ "aria-disabled:pointer-events-none aria-disabled:opacity-50",
185
+ inset && "pl-8",
186
+ className,
187
+ )}
188
+ {...props}
189
+ />
190
+ ));
191
+ MenubarItem.displayName = MenubarPrimitive.Item.displayName;
192
+
193
+ /* -----------------------------------------------------------------------------
194
+ * Component: MenubarCheckboxItem
195
+ * -------------------------------------------------------------------------- */
196
+
197
+ const MenubarCheckboxItem = React.forwardRef<
198
+ React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,
199
+ MenubarPrimitive.MenubarCheckboxItemProps
200
+ >(({ className, children, checked, ...props }, ref) => (
201
+ <MenubarPrimitive.CheckboxItem
202
+ ref={ref}
203
+ className={cn(
204
+ "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 outline-none",
205
+ "aria-disabled:pointer-events-none aria-disabled:opacity-50",
206
+ className,
207
+ )}
208
+ checked={checked}
209
+ {...props}
210
+ >
211
+ <span className="absolute left-2 flex size-3.5 items-center justify-center">
212
+ <MenubarPrimitive.ItemIndicator>
213
+ <CheckIcon className="size-4" />
214
+ </MenubarPrimitive.ItemIndicator>
215
+ </span>
216
+ {children}
217
+ </MenubarPrimitive.CheckboxItem>
218
+ ));
219
+ MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName;
220
+
221
+ /* -----------------------------------------------------------------------------
222
+ * Component: MenubarRadioItem
223
+ * -------------------------------------------------------------------------- */
224
+
225
+ const MenubarRadioItem = React.forwardRef<
226
+ React.ElementRef<typeof MenubarPrimitive.RadioItem>,
227
+ MenubarPrimitive.MenubarRadioItemProps
228
+ >(({ className, children, ...props }, ref) => (
229
+ <MenubarPrimitive.RadioItem
230
+ ref={ref}
231
+ className={cn(
232
+ "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 outline-none",
233
+ "aria-disabled:pointer-events-none aria-disabled:opacity-50",
234
+ className,
235
+ )}
236
+ {...props}
237
+ >
238
+ <span className="absolute left-2 flex size-3.5 items-center justify-center">
239
+ <MenubarPrimitive.ItemIndicator>
240
+ <DotFilledIcon className="size-4 fill-current" />
241
+ </MenubarPrimitive.ItemIndicator>
242
+ </span>
243
+ {children}
244
+ </MenubarPrimitive.RadioItem>
245
+ ));
246
+ MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName;
247
+
248
+ /* -----------------------------------------------------------------------------
249
+ * Component: MenubarLabel
250
+ * -------------------------------------------------------------------------- */
251
+
252
+ const MenubarLabel = React.forwardRef<
253
+ React.ElementRef<typeof MenubarPrimitive.Label>,
254
+ MenubarPrimitive.MenubarLabelProps & {
255
+ inset?: boolean;
256
+ }
257
+ >(({ className, inset, ...props }, ref) => (
258
+ <MenubarPrimitive.Label
259
+ ref={ref}
260
+ className={cn(
261
+ "px-2 py-1.5 text-sm font-semibold",
262
+ inset && "pl-8",
263
+ className,
264
+ )}
265
+ {...props}
266
+ />
267
+ ));
268
+ MenubarLabel.displayName = MenubarPrimitive.Label.displayName;
269
+
270
+ /* -----------------------------------------------------------------------------
271
+ * Component: MenubarSeparator
272
+ * -------------------------------------------------------------------------- */
273
+
274
+ const MenubarSeparator = React.forwardRef<
275
+ React.ElementRef<typeof MenubarPrimitive.Separator>,
276
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>
277
+ >(({ className, ...props }, ref) => (
278
+ <MenubarPrimitive.Separator
279
+ ref={ref}
280
+ className={cn("bg-muted -mx-1 my-1 h-px", className)}
281
+ {...props}
282
+ />
283
+ ));
284
+ MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName;
285
+
286
+ /* -----------------------------------------------------------------------------
287
+ * Component: MenubarShortcut
288
+ * -------------------------------------------------------------------------- */
289
+
290
+ function MenubarShortcut({
291
+ className,
292
+ ...props
293
+ }: React.HTMLAttributes<HTMLSpanElement>): React.JSX.Element {
294
+ return (
295
+ <span
296
+ className={cn(
297
+ "text-muted-foreground ml-auto text-xs tracking-widest",
298
+ className,
299
+ )}
300
+ {...props}
301
+ />
302
+ );
303
+ }
304
+
305
+ /* -----------------------------------------------------------------------------
306
+ * Exports
307
+ * -------------------------------------------------------------------------- */
308
+
309
+ export {
310
+ Menubar,
311
+ MenubarMenu,
312
+ MenubarTrigger,
313
+ MenubarContent,
314
+ MenubarItem,
315
+ MenubarSeparator,
316
+ MenubarLabel,
317
+ MenubarCheckboxItem,
318
+ MenubarRadioGroup,
319
+ MenubarRadioItem,
320
+ MenubarPortal,
321
+ MenubarSubContent,
322
+ MenubarSubTrigger,
323
+ MenubarGroup,
324
+ MenubarSub,
325
+ MenubarShortcut,
326
+ };
@@ -0,0 +1,189 @@
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: [
14
+ "bg-background hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground group inline-flex h-9 w-max items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors focus:outline-none disabled:pointer-events-none disabled:opacity-50",
15
+ "data-[state=open]:bg-accent/50",
16
+ "data-[active]:bg-accent/50",
17
+ ],
18
+ });
19
+
20
+ /* -----------------------------------------------------------------------------
21
+ * Component: NavigationMenu
22
+ * -------------------------------------------------------------------------- */
23
+
24
+ const NavigationMenu = React.forwardRef<
25
+ React.ElementRef<typeof NavigationMenuPrimitive.Root>,
26
+ NavigationMenuPrimitive.NavigationMenuProps
27
+ >(({ className, children, ...props }, ref) => (
28
+ <NavigationMenuPrimitive.Root
29
+ ref={ref}
30
+ className={cn(
31
+ "relative z-10 flex max-w-max flex-1 items-center justify-center",
32
+ className,
33
+ )}
34
+ {...props}
35
+ >
36
+ {children}
37
+ <NavigationMenuViewport />
38
+ </NavigationMenuPrimitive.Root>
39
+ ));
40
+ NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName;
41
+
42
+ /* -----------------------------------------------------------------------------
43
+ * Component: NavigationMenuList
44
+ * -------------------------------------------------------------------------- */
45
+
46
+ const NavigationMenuList = React.forwardRef<
47
+ React.ElementRef<typeof NavigationMenuPrimitive.List>,
48
+ NavigationMenuPrimitive.NavigationMenuListProps
49
+ >(({ className, ...props }, ref) => (
50
+ <NavigationMenuPrimitive.List
51
+ ref={ref}
52
+ className={cn(
53
+ "group flex flex-1 list-none items-center justify-center space-x-1",
54
+ className,
55
+ )}
56
+ {...props}
57
+ />
58
+ ));
59
+ NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
60
+
61
+ /* -----------------------------------------------------------------------------
62
+ * Component: NavigationMenuItem
63
+ * -------------------------------------------------------------------------- */
64
+
65
+ const NavigationMenuItem = NavigationMenuPrimitive.Item;
66
+
67
+ /* -----------------------------------------------------------------------------
68
+ * Component: NavigationMenuContent
69
+ * -------------------------------------------------------------------------- */
70
+
71
+ const NavigationMenuTrigger = React.forwardRef<
72
+ React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,
73
+ NavigationMenuPrimitive.NavigationMenuTriggerProps
74
+ >(({ className, children, ...props }, ref) => (
75
+ <NavigationMenuPrimitive.Trigger
76
+ ref={ref}
77
+ className={navigationMenuTriggerStyle({
78
+ className: cn("group", className),
79
+ })}
80
+ {...props}
81
+ >
82
+ {children}{" "}
83
+ <ChevronDownIcon
84
+ className={cn(
85
+ "relative top-px ml-1 h-3 w-3 transition duration-300",
86
+ "group-data-[state=open]:rotate-180",
87
+ )}
88
+ aria-hidden="true"
89
+ />
90
+ </NavigationMenuPrimitive.Trigger>
91
+ ));
92
+ NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName;
93
+
94
+ /* -----------------------------------------------------------------------------
95
+ * Component: NavigationMenuContent
96
+ * -------------------------------------------------------------------------- */
97
+
98
+ const NavigationMenuContent = React.forwardRef<
99
+ React.ElementRef<typeof NavigationMenuPrimitive.Content>,
100
+ NavigationMenuPrimitive.NavigationMenuContentProps
101
+ >(({ className, ...props }, ref) => (
102
+ <NavigationMenuPrimitive.Content
103
+ ref={ref}
104
+ className={cn(
105
+ "left-0 top-0 w-full md:absolute md:w-auto",
106
+ "data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in",
107
+ "data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52",
108
+ "data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out",
109
+ "data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52",
110
+ className,
111
+ )}
112
+ {...props}
113
+ />
114
+ ));
115
+ NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName;
116
+
117
+ /* -----------------------------------------------------------------------------
118
+ * Component: NavigationMenuLink
119
+ * -------------------------------------------------------------------------- */
120
+
121
+ const NavigationMenuLink = NavigationMenuPrimitive.Link;
122
+
123
+ /* -----------------------------------------------------------------------------
124
+ * Component: NavigationMenuViewport
125
+ * -------------------------------------------------------------------------- */
126
+
127
+ const NavigationMenuViewport = React.forwardRef<
128
+ React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,
129
+ NavigationMenuPrimitive.NavigationMenuViewportProps
130
+ >(({ className, ...props }, ref) => (
131
+ <div
132
+ className={cn(
133
+ "perspective-[2000px] absolute left-0 top-full flex justify-center",
134
+ )}
135
+ >
136
+ <NavigationMenuPrimitive.Viewport
137
+ className={cn(
138
+ "bg-popover text-popover-foreground 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)]",
139
+ "data-[state=open]:animate-in data-[state=open]:zoom-in-90",
140
+ "data-[state=closed]:animate-out data-[state=closed]:zoom-out-95",
141
+ className,
142
+ )}
143
+ ref={ref}
144
+ {...props}
145
+ />
146
+ </div>
147
+ ));
148
+ NavigationMenuViewport.displayName =
149
+ NavigationMenuPrimitive.Viewport.displayName;
150
+
151
+ /* -----------------------------------------------------------------------------
152
+ * Component: NavigationMenuIndicator
153
+ * -------------------------------------------------------------------------- */
154
+
155
+ const NavigationMenuIndicator = React.forwardRef<
156
+ React.ElementRef<typeof NavigationMenuPrimitive.Indicator>,
157
+ NavigationMenuPrimitive.NavigationMenuIndicatorProps
158
+ >(({ className, ...props }, ref) => (
159
+ <NavigationMenuPrimitive.Indicator
160
+ ref={ref}
161
+ className={cn(
162
+ "top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden transition",
163
+ "data-[state=visible]:animate-in data-[state=visible]:fade-in",
164
+ "data-[state=hidden]:animate-out data-[state=hidden]:fade-out",
165
+ className,
166
+ )}
167
+ {...props}
168
+ >
169
+ <div className="bg-border relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm shadow-md" />
170
+ </NavigationMenuPrimitive.Indicator>
171
+ ));
172
+ NavigationMenuIndicator.displayName =
173
+ NavigationMenuPrimitive.Indicator.displayName;
174
+
175
+ /* -----------------------------------------------------------------------------
176
+ * Exports
177
+ * -------------------------------------------------------------------------- */
178
+
179
+ export {
180
+ navigationMenuTriggerStyle,
181
+ NavigationMenu,
182
+ NavigationMenuList,
183
+ NavigationMenuItem,
184
+ NavigationMenuContent,
185
+ NavigationMenuTrigger,
186
+ NavigationMenuLink,
187
+ NavigationMenuIndicator,
188
+ NavigationMenuViewport,
189
+ };
@@ -0,0 +1,162 @@
1
+ import * as React from "react";
2
+ import {
3
+ ChevronLeftIcon,
4
+ ChevronRightIcon,
5
+ DotsHorizontalIcon,
6
+ } from "@radix-ui/react-icons";
7
+ import { cn } from "./utils";
8
+ import { type ButtonProps, buttonVariants } from "./button";
9
+
10
+ /* -----------------------------------------------------------------------------
11
+ * Component: Pagination
12
+ * -------------------------------------------------------------------------- */
13
+
14
+ function Pagination({
15
+ className,
16
+ ...props
17
+ }: React.ComponentProps<"nav">): React.JSX.Element {
18
+ return (
19
+ <nav
20
+ role="navigation"
21
+ aria-label="pagination"
22
+ className={cn("mx-auto flex w-full justify-center", className)}
23
+ {...props}
24
+ />
25
+ );
26
+ }
27
+
28
+ /* -----------------------------------------------------------------------------
29
+ * Component: PaginationContent
30
+ * -------------------------------------------------------------------------- */
31
+
32
+ const PaginationContent = React.forwardRef<
33
+ HTMLUListElement,
34
+ React.HTMLAttributes<HTMLUListElement>
35
+ >(({ className, ...props }, ref) => (
36
+ <ul
37
+ ref={ref}
38
+ className={cn("flex flex-row items-center gap-1", className)}
39
+ {...props}
40
+ />
41
+ ));
42
+ PaginationContent.displayName = "PaginationContent";
43
+
44
+ /* -----------------------------------------------------------------------------
45
+ * Component: PaginationItem
46
+ * -------------------------------------------------------------------------- */
47
+
48
+ const PaginationItem = React.forwardRef<
49
+ HTMLLIElement,
50
+ React.LiHTMLAttributes<HTMLLIElement>
51
+ >(({ className, ...props }, ref) => (
52
+ <li ref={ref} className={cn("", className)} {...props} />
53
+ ));
54
+ PaginationItem.displayName = "PaginationItem";
55
+
56
+ /* -----------------------------------------------------------------------------
57
+ * Component: PaginationLink
58
+ * -------------------------------------------------------------------------- */
59
+
60
+ interface PaginationLinkProps
61
+ extends React.AnchorHTMLAttributes<HTMLAnchorElement>,
62
+ Pick<ButtonProps, "size"> {
63
+ isActive?: boolean;
64
+ }
65
+
66
+ function PaginationLink({
67
+ className,
68
+ isActive,
69
+ size = "icon",
70
+ children,
71
+ ...props
72
+ }: PaginationLinkProps): React.JSX.Element {
73
+ return (
74
+ <a
75
+ aria-current={isActive ? "page" : undefined}
76
+ className={buttonVariants({
77
+ variant: isActive ? "outline" : "ghost",
78
+ size,
79
+ className,
80
+ })}
81
+ {...props}
82
+ >
83
+ {children}
84
+ </a>
85
+ );
86
+ }
87
+
88
+ /* -----------------------------------------------------------------------------
89
+ * Component: PaginationPrevious
90
+ * -------------------------------------------------------------------------- */
91
+
92
+ function PaginationPrevious({
93
+ className,
94
+ ...props
95
+ }: PaginationLinkProps): React.JSX.Element {
96
+ return (
97
+ <PaginationLink
98
+ aria-label="Go to previous page"
99
+ size="default"
100
+ className={cn("gap-1 pl-2.5", className)}
101
+ {...props}
102
+ >
103
+ <ChevronLeftIcon className="size-4" />
104
+ <span>Previous</span>
105
+ </PaginationLink>
106
+ );
107
+ }
108
+
109
+ /* -----------------------------------------------------------------------------
110
+ * Component: PaginationNext
111
+ * -------------------------------------------------------------------------- */
112
+
113
+ function PaginationNext({
114
+ className,
115
+ ...props
116
+ }: PaginationLinkProps): React.JSX.Element {
117
+ return (
118
+ <PaginationLink
119
+ aria-label="Go to next page"
120
+ size="default"
121
+ className={cn("gap-1 pr-2.5", className)}
122
+ {...props}
123
+ >
124
+ <span>Next</span>
125
+ <ChevronRightIcon className="size-4" />
126
+ </PaginationLink>
127
+ );
128
+ }
129
+
130
+ /* -----------------------------------------------------------------------------
131
+ * Component: PaginationEllipsis
132
+ * -------------------------------------------------------------------------- */
133
+
134
+ function PaginationEllipsis({
135
+ className,
136
+ ...props
137
+ }: React.HTMLAttributes<HTMLSpanElement>): React.JSX.Element {
138
+ return (
139
+ <span
140
+ aria-hidden
141
+ className={cn("flex h-9 w-9 items-center justify-center", className)}
142
+ {...props}
143
+ >
144
+ <DotsHorizontalIcon className="size-4" />
145
+ <span className="sr-only">More pages</span>
146
+ </span>
147
+ );
148
+ }
149
+
150
+ /* -----------------------------------------------------------------------------
151
+ * Exports
152
+ * -------------------------------------------------------------------------- */
153
+
154
+ export {
155
+ Pagination,
156
+ PaginationContent,
157
+ PaginationLink,
158
+ PaginationItem,
159
+ PaginationPrevious,
160
+ PaginationNext,
161
+ PaginationEllipsis,
162
+ };