@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
package/src/drawer.tsx ADDED
@@ -0,0 +1,140 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import { Drawer as DrawerPrimitive } from "vaul";
5
+ import { cn } from "./utils";
6
+
7
+ /* -----------------------------------------------------------------------------
8
+ * Component: Drawer
9
+ * -------------------------------------------------------------------------- */
10
+
11
+ function Drawer({
12
+ shouldScaleBackground = true,
13
+ ...props
14
+ }: React.ComponentProps<typeof DrawerPrimitive.Root>): React.JSX.Element {
15
+ return (
16
+ <DrawerPrimitive.Root
17
+ shouldScaleBackground={shouldScaleBackground}
18
+ {...props}
19
+ />
20
+ );
21
+ }
22
+
23
+ /* -----------------------------------------------------------------------------
24
+ * Component: DrawerTrigger
25
+ * -------------------------------------------------------------------------- */
26
+
27
+ const DrawerTrigger = DrawerPrimitive.Trigger;
28
+
29
+ /* -----------------------------------------------------------------------------
30
+ * Component: DrawerClose
31
+ * -------------------------------------------------------------------------- */
32
+
33
+ const DrawerClose = DrawerPrimitive.Close;
34
+
35
+ /* -----------------------------------------------------------------------------
36
+ * Component: DrawerContent
37
+ * -------------------------------------------------------------------------- */
38
+
39
+ const DrawerContent = React.forwardRef<
40
+ React.ElementRef<typeof DrawerPrimitive.Content>,
41
+ React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>
42
+ >(({ className, children, ...props }, ref) => (
43
+ <DrawerPrimitive.Portal>
44
+ <DrawerPrimitive.Overlay className="fixed inset-0 z-50 bg-black/80" />
45
+ <DrawerPrimitive.Content
46
+ ref={ref}
47
+ className={cn(
48
+ "bg-background fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border",
49
+ className,
50
+ )}
51
+ {...props}
52
+ >
53
+ <div className="bg-muted mx-auto mt-4 h-2 w-[100px] rounded-full" />
54
+ {children}
55
+ </DrawerPrimitive.Content>
56
+ </DrawerPrimitive.Portal>
57
+ ));
58
+ DrawerContent.displayName = "DrawerContent";
59
+
60
+ /* -----------------------------------------------------------------------------
61
+ * Component: DrawerHeader
62
+ * -------------------------------------------------------------------------- */
63
+
64
+ function DrawerHeader({
65
+ className,
66
+ ...props
67
+ }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element {
68
+ return (
69
+ <div
70
+ className={cn("grid gap-1.5 p-4 text-center sm:text-left", className)}
71
+ {...props}
72
+ />
73
+ );
74
+ }
75
+
76
+ /* -----------------------------------------------------------------------------
77
+ * Component: DrawerFooter
78
+ * -------------------------------------------------------------------------- */
79
+
80
+ function DrawerFooter({
81
+ className,
82
+ ...props
83
+ }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element {
84
+ return (
85
+ <div
86
+ className={cn("mt-auto flex flex-col gap-2 p-4", className)}
87
+ {...props}
88
+ />
89
+ );
90
+ }
91
+
92
+ /* -----------------------------------------------------------------------------
93
+ * Component: DrawerTitle
94
+ * -------------------------------------------------------------------------- */
95
+
96
+ const DrawerTitle = React.forwardRef<
97
+ React.ElementRef<typeof DrawerPrimitive.Title>,
98
+ React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>
99
+ >(({ className, ...props }, ref) => (
100
+ <DrawerPrimitive.Title
101
+ ref={ref}
102
+ className={cn(
103
+ "text-lg font-semibold leading-none tracking-tight",
104
+ className,
105
+ )}
106
+ {...props}
107
+ />
108
+ ));
109
+ DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
110
+
111
+ /* -----------------------------------------------------------------------------
112
+ * Component: DrawerDescription
113
+ * -------------------------------------------------------------------------- */
114
+
115
+ const DrawerDescription = React.forwardRef<
116
+ React.ElementRef<typeof DrawerPrimitive.Description>,
117
+ React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>
118
+ >(({ className, ...props }, ref) => (
119
+ <DrawerPrimitive.Description
120
+ ref={ref}
121
+ className={cn("text-muted-foreground text-sm", className)}
122
+ {...props}
123
+ />
124
+ ));
125
+ DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
126
+
127
+ /* -----------------------------------------------------------------------------
128
+ * Exports
129
+ * -------------------------------------------------------------------------- */
130
+
131
+ export {
132
+ Drawer,
133
+ DrawerTrigger,
134
+ DrawerClose,
135
+ DrawerContent,
136
+ DrawerHeader,
137
+ DrawerFooter,
138
+ DrawerTitle,
139
+ DrawerDescription,
140
+ };
@@ -0,0 +1,261 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
5
+ import {
6
+ CheckIcon,
7
+ ChevronRightIcon,
8
+ DotFilledIcon,
9
+ } from "@radix-ui/react-icons";
10
+ import { cn } from "./utils";
11
+
12
+ /* -----------------------------------------------------------------------------
13
+ * Component: DropdownMenu
14
+ * -------------------------------------------------------------------------- */
15
+
16
+ const DropdownMenu = DropdownMenuPrimitive.Root;
17
+
18
+ /* -----------------------------------------------------------------------------
19
+ * Component: DropdownMenuTrigger
20
+ * -------------------------------------------------------------------------- */
21
+
22
+ const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
23
+
24
+ /* -----------------------------------------------------------------------------
25
+ * Component: DropdownMenuGroup
26
+ * -------------------------------------------------------------------------- */
27
+
28
+ const DropdownMenuGroup = DropdownMenuPrimitive.Group;
29
+
30
+ /* -----------------------------------------------------------------------------
31
+ * Component: DropdownMenuSub
32
+ * -------------------------------------------------------------------------- */
33
+
34
+ const DropdownMenuSub = DropdownMenuPrimitive.Sub;
35
+
36
+ /* -----------------------------------------------------------------------------
37
+ * Component: DropdownMenuSubTrigger
38
+ * -------------------------------------------------------------------------- */
39
+
40
+ const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
41
+
42
+ /* -----------------------------------------------------------------------------
43
+ * Component: DropdownMenuSubTrigger
44
+ * -------------------------------------------------------------------------- */
45
+
46
+ const DropdownMenuSubTrigger = React.forwardRef<
47
+ React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
48
+ DropdownMenuPrimitive.DropdownMenuSubTriggerProps & {
49
+ inset?: boolean;
50
+ }
51
+ >(({ className, inset, children, ...props }, ref) => (
52
+ <DropdownMenuPrimitive.SubTrigger
53
+ ref={ref}
54
+ className={cn(
55
+ "focus:bg-accent data-[state=open]:bg-accent flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm focus:outline-none",
56
+ inset && "pl-8",
57
+ className,
58
+ )}
59
+ {...props}
60
+ >
61
+ {children}
62
+ <ChevronRightIcon className="ml-auto size-4" />
63
+ </DropdownMenuPrimitive.SubTrigger>
64
+ ));
65
+ DropdownMenuSubTrigger.displayName =
66
+ DropdownMenuPrimitive.SubTrigger.displayName;
67
+
68
+ /* -----------------------------------------------------------------------------
69
+ * Component: DropdownMenuSubContent
70
+ * -------------------------------------------------------------------------- */
71
+
72
+ const DropdownMenuSubContent = React.forwardRef<
73
+ React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
74
+ DropdownMenuPrimitive.DropdownMenuSubContentProps
75
+ >(({ className, ...props }, ref) => (
76
+ <DropdownMenuPrimitive.Portal>
77
+ <DropdownMenuPrimitive.SubContent
78
+ ref={ref}
79
+ className={cn(
80
+ "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=right]:slide-out-to-left-2 data-[state=closed]:data-[side=bottom]:slide-out-to-top-2 data-[state=closed]:data-[side=left]:slide-out-to-right-2 z-50 min-w-[8rem] rounded-md border p-1 shadow-md focus:outline-none",
81
+ className,
82
+ )}
83
+ {...props}
84
+ />
85
+ </DropdownMenuPrimitive.Portal>
86
+ ));
87
+ DropdownMenuSubContent.displayName =
88
+ DropdownMenuPrimitive.SubContent.displayName;
89
+
90
+ /* -----------------------------------------------------------------------------
91
+ * Component: DropdownMenuContent
92
+ * -------------------------------------------------------------------------- */
93
+
94
+ const DropdownMenuContent = React.forwardRef<
95
+ React.ElementRef<typeof DropdownMenuPrimitive.Content>,
96
+ DropdownMenuPrimitive.DropdownMenuContentProps
97
+ >(({ className, sideOffset = 4, ...props }, ref) => (
98
+ <DropdownMenuPrimitive.Portal>
99
+ <DropdownMenuPrimitive.Content
100
+ ref={ref}
101
+ sideOffset={sideOffset}
102
+ className={cn(
103
+ "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=right]:slide-out-to-left-2 data-[state=closed]:data-[side=bottom]:slide-out-to-top-2 data-[state=closed]:data-[side=left]:slide-out-to-right-2 z-50 min-w-[8rem] rounded-md border p-1 shadow-md focus:outline-none",
104
+ className,
105
+ )}
106
+ {...props}
107
+ />
108
+ </DropdownMenuPrimitive.Portal>
109
+ ));
110
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
111
+
112
+ /* -----------------------------------------------------------------------------
113
+ * Component: DropdownMenuItem
114
+ * -------------------------------------------------------------------------- */
115
+
116
+ const DropdownMenuItem = React.forwardRef<
117
+ React.ElementRef<typeof DropdownMenuPrimitive.Item>,
118
+ DropdownMenuPrimitive.DropdownMenuItemProps & {
119
+ inset?: boolean;
120
+ }
121
+ >(({ className, inset, ...props }, ref) => (
122
+ <DropdownMenuPrimitive.Item
123
+ ref={ref}
124
+ className={cn(
125
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm transition-colors focus:outline-none aria-disabled:pointer-events-none aria-disabled:opacity-50",
126
+ inset && "pl-8",
127
+ className,
128
+ )}
129
+ {...props}
130
+ />
131
+ ));
132
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
133
+
134
+ /* -----------------------------------------------------------------------------
135
+ * Component: DropdownMenuCheckboxItem
136
+ * -------------------------------------------------------------------------- */
137
+
138
+ const DropdownMenuCheckboxItem = React.forwardRef<
139
+ React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
140
+ DropdownMenuPrimitive.DropdownMenuCheckboxItemProps
141
+ >(({ className, children, checked, ...props }, ref) => (
142
+ <DropdownMenuPrimitive.CheckboxItem
143
+ ref={ref}
144
+ className={cn(
145
+ "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 transition-colors focus:outline-none aria-disabled:pointer-events-none aria-disabled:opacity-50",
146
+ className,
147
+ )}
148
+ checked={checked}
149
+ {...props}
150
+ >
151
+ <span className="absolute left-2 flex size-3.5 items-center justify-center">
152
+ <DropdownMenuPrimitive.ItemIndicator>
153
+ <CheckIcon className="size-4" />
154
+ </DropdownMenuPrimitive.ItemIndicator>
155
+ </span>
156
+ {children}
157
+ </DropdownMenuPrimitive.CheckboxItem>
158
+ ));
159
+ DropdownMenuCheckboxItem.displayName =
160
+ DropdownMenuPrimitive.CheckboxItem.displayName;
161
+
162
+ /* -----------------------------------------------------------------------------
163
+ * Component: DropdownMenuRadioItem
164
+ * -------------------------------------------------------------------------- */
165
+
166
+ const DropdownMenuRadioItem = React.forwardRef<
167
+ React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
168
+ DropdownMenuPrimitive.DropdownMenuRadioItemProps
169
+ >(({ className, children, ...props }, ref) => (
170
+ <DropdownMenuPrimitive.RadioItem
171
+ ref={ref}
172
+ className={cn(
173
+ "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 transition-colors focus:outline-none aria-disabled:pointer-events-none aria-disabled:opacity-50",
174
+ className,
175
+ )}
176
+ {...props}
177
+ >
178
+ <span className="absolute left-2 flex size-3.5 items-center justify-center">
179
+ <DropdownMenuPrimitive.ItemIndicator>
180
+ <DotFilledIcon className="size-4 fill-current" />
181
+ </DropdownMenuPrimitive.ItemIndicator>
182
+ </span>
183
+ {children}
184
+ </DropdownMenuPrimitive.RadioItem>
185
+ ));
186
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
187
+
188
+ /* -----------------------------------------------------------------------------
189
+ * Component: DropdownMenuLabel
190
+ * -------------------------------------------------------------------------- */
191
+
192
+ const DropdownMenuLabel = React.forwardRef<
193
+ React.ElementRef<typeof DropdownMenuPrimitive.Label>,
194
+ DropdownMenuPrimitive.DropdownMenuLabelProps & {
195
+ inset?: boolean;
196
+ }
197
+ >(({ className, inset, ...props }, ref) => (
198
+ <DropdownMenuPrimitive.Label
199
+ ref={ref}
200
+ className={cn(
201
+ "px-2 py-1.5 text-sm font-semibold",
202
+ inset && "pl-8",
203
+ className,
204
+ )}
205
+ {...props}
206
+ />
207
+ ));
208
+ DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
209
+
210
+ /* -----------------------------------------------------------------------------
211
+ * Component: DropdownMenuSeparator
212
+ * -------------------------------------------------------------------------- */
213
+
214
+ const DropdownMenuSeparator = React.forwardRef<
215
+ React.ElementRef<typeof DropdownMenuPrimitive.Separator>,
216
+ DropdownMenuPrimitive.DropdownMenuSeparatorProps
217
+ >(({ className, ...props }, ref) => (
218
+ <DropdownMenuPrimitive.Separator
219
+ ref={ref}
220
+ className={cn("bg-muted -mx-1 my-1 h-px", className)}
221
+ {...props}
222
+ />
223
+ ));
224
+ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
225
+
226
+ /* -----------------------------------------------------------------------------
227
+ * Component: DropdownMenuShortcut
228
+ * -------------------------------------------------------------------------- */
229
+
230
+ function DropdownMenuShortcut({
231
+ className,
232
+ ...props
233
+ }: React.HTMLAttributes<HTMLSpanElement>): React.JSX.Element {
234
+ return (
235
+ <span
236
+ className={cn("ml-auto text-xs tracking-widest opacity-60", className)}
237
+ {...props}
238
+ />
239
+ );
240
+ }
241
+
242
+ /* -----------------------------------------------------------------------------
243
+ * Exports
244
+ * -------------------------------------------------------------------------- */
245
+
246
+ export {
247
+ DropdownMenu,
248
+ DropdownMenuTrigger,
249
+ DropdownMenuContent,
250
+ DropdownMenuItem,
251
+ DropdownMenuCheckboxItem,
252
+ DropdownMenuRadioItem,
253
+ DropdownMenuLabel,
254
+ DropdownMenuSeparator,
255
+ DropdownMenuShortcut,
256
+ DropdownMenuGroup,
257
+ DropdownMenuSub,
258
+ DropdownMenuSubContent,
259
+ DropdownMenuSubTrigger,
260
+ DropdownMenuRadioGroup,
261
+ };
package/src/form.tsx ADDED
@@ -0,0 +1,224 @@
1
+ import * as React from "react";
2
+ import type * as LabelPrimitive from "@radix-ui/react-label";
3
+ import { Slot } from "@radix-ui/react-slot";
4
+ import {
5
+ Controller,
6
+ type ControllerProps,
7
+ type FieldError,
8
+ type FieldPath,
9
+ type FieldValues,
10
+ FormProvider,
11
+ useFormContext,
12
+ } from "react-hook-form";
13
+ import { cn } from "./utils";
14
+ import { Label } from "./label";
15
+
16
+ /* -----------------------------------------------------------------------------
17
+ * Context: FormItemContext
18
+ * -------------------------------------------------------------------------- */
19
+
20
+ interface FormItemContextValue {
21
+ id: string;
22
+ }
23
+
24
+ const FormItemContext = React.createContext<FormItemContextValue>(
25
+ {} as FormItemContextValue,
26
+ );
27
+
28
+ /* -----------------------------------------------------------------------------
29
+ * Context: FormFieldContext
30
+ * -------------------------------------------------------------------------- */
31
+
32
+ interface FormFieldContextValue<
33
+ TFieldValues extends FieldValues = FieldValues,
34
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
35
+ > {
36
+ name: TName;
37
+ }
38
+
39
+ const FormFieldContext = React.createContext<FormFieldContextValue>(
40
+ {} as FormFieldContextValue,
41
+ );
42
+
43
+ const useFormField = (): {
44
+ invalid: boolean;
45
+ isDirty: boolean;
46
+ isTouched: boolean;
47
+ isValidating: boolean;
48
+ error?: FieldError | undefined;
49
+ id: string;
50
+ name: string;
51
+ formItemId: string;
52
+ formDescriptionId: string;
53
+ formMessageId: string;
54
+ } => {
55
+ const fieldContext = React.useContext(FormFieldContext);
56
+ const itemContext = React.useContext(FormItemContext);
57
+ const { getFieldState, formState } = useFormContext();
58
+
59
+ const fieldState = getFieldState(fieldContext.name, formState);
60
+
61
+ if (!fieldContext) {
62
+ throw new Error("useFormField should be used within <FormField>");
63
+ }
64
+
65
+ const { id } = itemContext;
66
+
67
+ return {
68
+ id,
69
+ name: fieldContext.name,
70
+ formItemId: `form-item-${id}`,
71
+ formDescriptionId: `form-item-description-${id}`,
72
+ formMessageId: `form-item-message-${id}`,
73
+ ...fieldState,
74
+ };
75
+ };
76
+
77
+ /* -----------------------------------------------------------------------------
78
+ * Component: Form
79
+ * -------------------------------------------------------------------------- */
80
+
81
+ const Form = FormProvider;
82
+
83
+ /* -----------------------------------------------------------------------------
84
+ * Component: FormField
85
+ * -------------------------------------------------------------------------- */
86
+
87
+ function FormField<
88
+ TFieldValues extends FieldValues = FieldValues,
89
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
90
+ >({ ...props }: ControllerProps<TFieldValues, TName>): React.JSX.Element {
91
+ return (
92
+ <FormFieldContext.Provider value={{ name: props.name }}>
93
+ <Controller {...props} />
94
+ </FormFieldContext.Provider>
95
+ );
96
+ }
97
+
98
+ /* -----------------------------------------------------------------------------
99
+ * Component: FormItem
100
+ * -------------------------------------------------------------------------- */
101
+
102
+ const FormItem = React.forwardRef<
103
+ HTMLDivElement,
104
+ React.HTMLAttributes<HTMLDivElement>
105
+ >(({ className, ...props }, ref) => {
106
+ const id = React.useId();
107
+
108
+ return (
109
+ <FormItemContext.Provider value={{ id }}>
110
+ <div ref={ref} className={cn("space-y-2", className)} {...props} />
111
+ </FormItemContext.Provider>
112
+ );
113
+ });
114
+ FormItem.displayName = "FormItem";
115
+
116
+ /* -----------------------------------------------------------------------------
117
+ * Component: FormLabel
118
+ * -------------------------------------------------------------------------- */
119
+
120
+ const FormLabel = React.forwardRef<
121
+ React.ElementRef<typeof LabelPrimitive.Root>,
122
+ React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>
123
+ >(({ className, ...props }, ref) => {
124
+ const { error, formItemId } = useFormField();
125
+
126
+ return (
127
+ <Label
128
+ ref={ref}
129
+ className={cn(error && "text-destructive", className)}
130
+ htmlFor={formItemId}
131
+ {...props}
132
+ />
133
+ );
134
+ });
135
+ FormLabel.displayName = "FormLabel";
136
+
137
+ /* -----------------------------------------------------------------------------
138
+ * Component: FormControl
139
+ * -------------------------------------------------------------------------- */
140
+
141
+ const FormControl = React.forwardRef<
142
+ React.ElementRef<typeof Slot>,
143
+ React.ComponentPropsWithoutRef<typeof Slot>
144
+ >(({ ...props }, ref) => {
145
+ const { error, formItemId, formDescriptionId, formMessageId } =
146
+ useFormField();
147
+
148
+ return (
149
+ <Slot
150
+ ref={ref}
151
+ id={formItemId}
152
+ aria-describedby={
153
+ !error ? formDescriptionId : `${formDescriptionId} ${formMessageId}`
154
+ }
155
+ aria-invalid={Boolean(error)}
156
+ {...props}
157
+ />
158
+ );
159
+ });
160
+ FormControl.displayName = "FormControl";
161
+
162
+ /* -----------------------------------------------------------------------------
163
+ * Component: FormDescription
164
+ * -------------------------------------------------------------------------- */
165
+
166
+ const FormDescription = React.forwardRef<
167
+ HTMLParagraphElement,
168
+ React.HTMLAttributes<HTMLParagraphElement>
169
+ >(({ className, ...props }, ref) => {
170
+ const { formDescriptionId } = useFormField();
171
+
172
+ return (
173
+ <p
174
+ ref={ref}
175
+ id={formDescriptionId}
176
+ className={cn("text-muted-foreground text-[0.8rem]", className)}
177
+ {...props}
178
+ />
179
+ );
180
+ });
181
+ FormDescription.displayName = "FormDescription";
182
+
183
+ /* -----------------------------------------------------------------------------
184
+ * Component: FormMessage
185
+ * -------------------------------------------------------------------------- */
186
+
187
+ const FormMessage = React.forwardRef<
188
+ HTMLParagraphElement,
189
+ React.HTMLAttributes<HTMLParagraphElement>
190
+ >(({ className, children, ...props }, ref) => {
191
+ const { error, formMessageId } = useFormField();
192
+ const body = error ? String(error.message) : children;
193
+
194
+ if (!body) {
195
+ return null;
196
+ }
197
+
198
+ return (
199
+ <p
200
+ ref={ref}
201
+ id={formMessageId}
202
+ className={cn("text-destructive text-[0.8rem] font-medium", className)}
203
+ {...props}
204
+ >
205
+ {body}
206
+ </p>
207
+ );
208
+ });
209
+ FormMessage.displayName = "FormMessage";
210
+
211
+ /* -----------------------------------------------------------------------------
212
+ * Exports
213
+ * -------------------------------------------------------------------------- */
214
+
215
+ export {
216
+ useFormField,
217
+ Form,
218
+ FormItem,
219
+ FormLabel,
220
+ FormControl,
221
+ FormDescription,
222
+ FormMessage,
223
+ FormField,
224
+ };
@@ -0,0 +1,46 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
5
+ import { cn } from "./utils";
6
+
7
+ /* -----------------------------------------------------------------------------
8
+ * Component: HoverCard
9
+ * -------------------------------------------------------------------------- */
10
+
11
+ const HoverCard = HoverCardPrimitive.Root;
12
+
13
+ /* -----------------------------------------------------------------------------
14
+ * Component: HoverCardTrigger
15
+ * -------------------------------------------------------------------------- */
16
+
17
+ const HoverCardTrigger = HoverCardPrimitive.Trigger;
18
+
19
+ /* -----------------------------------------------------------------------------
20
+ * Component: HoverCardContent
21
+ * -------------------------------------------------------------------------- */
22
+
23
+ const HoverCardContent = React.forwardRef<
24
+ React.ElementRef<typeof HoverCardPrimitive.Content>,
25
+ HoverCardPrimitive.HoverCardContentProps
26
+ >(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
27
+ <HoverCardPrimitive.Portal>
28
+ <HoverCardPrimitive.Content
29
+ ref={ref}
30
+ align={align}
31
+ sideOffset={sideOffset}
32
+ className={cn(
33
+ "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=left]:slide-in-from-right-2 data-[state=open]:data-[side=bottom]:slide-in-from-top-2 data-[state=open]:data-[side=right]:slide-in-from-left-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-4 shadow-md focus:outline-none",
34
+ className,
35
+ )}
36
+ {...props}
37
+ />
38
+ </HoverCardPrimitive.Portal>
39
+ ));
40
+ HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
41
+
42
+ /* -----------------------------------------------------------------------------
43
+ * Exports
44
+ * -------------------------------------------------------------------------- */
45
+
46
+ export { HoverCard, HoverCardTrigger, HoverCardContent };