@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
@@ -0,0 +1,290 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
5
+ import {
6
+ CheckIcon,
7
+ ChevronRightIcon,
8
+ DotFilledIcon,
9
+ } from "@radix-ui/react-icons";
10
+ import { cn } from "./utils";
11
+
12
+ /* -----------------------------------------------------------------------------
13
+ * Component: ContextMenu
14
+ * -------------------------------------------------------------------------- */
15
+
16
+ const ContextMenu = ContextMenuPrimitive.Root;
17
+
18
+ /* -----------------------------------------------------------------------------
19
+ * Component: ContextMenuTrigger
20
+ * -------------------------------------------------------------------------- */
21
+
22
+ const ContextMenuTrigger = ContextMenuPrimitive.Trigger;
23
+
24
+ /* -----------------------------------------------------------------------------
25
+ * Component: ContextMenuGroup
26
+ * -------------------------------------------------------------------------- */
27
+
28
+ const ContextMenuGroup = ContextMenuPrimitive.Group;
29
+
30
+ /* -----------------------------------------------------------------------------
31
+ * Component: ContextMenuPortal
32
+ * -------------------------------------------------------------------------- */
33
+
34
+ const ContextMenuPortal = ContextMenuPrimitive.Portal;
35
+
36
+ /* -----------------------------------------------------------------------------
37
+ * Component: ContextMenuSub
38
+ * -------------------------------------------------------------------------- */
39
+
40
+ const ContextMenuSub = ContextMenuPrimitive.Sub;
41
+
42
+ /* -----------------------------------------------------------------------------
43
+ * Component: ContextMenuRadioGroup
44
+ * -------------------------------------------------------------------------- */
45
+
46
+ const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;
47
+
48
+ /* -----------------------------------------------------------------------------
49
+ * Component: ContextMenuSubTrigger
50
+ * -------------------------------------------------------------------------- */
51
+
52
+ const ContextMenuSubTrigger = React.forwardRef<
53
+ React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,
54
+ ContextMenuPrimitive.ContextMenuSubTriggerProps & {
55
+ inset?: boolean;
56
+ }
57
+ >(({ className, inset, children, ...props }, ref) => (
58
+ <ContextMenuPrimitive.SubTrigger
59
+ ref={ref}
60
+ className={cn(
61
+ "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",
62
+ "data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
63
+ inset && "pl-8",
64
+ className,
65
+ )}
66
+ {...props}
67
+ >
68
+ {children}
69
+ <ChevronRightIcon className="ml-auto size-4" />
70
+ </ContextMenuPrimitive.SubTrigger>
71
+ ));
72
+ ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName;
73
+
74
+ /* -----------------------------------------------------------------------------
75
+ * Component: ContextMenuSubContent
76
+ * -------------------------------------------------------------------------- */
77
+
78
+ const ContextMenuSubContent = React.forwardRef<
79
+ React.ElementRef<typeof ContextMenuPrimitive.SubContent>,
80
+ ContextMenuPrimitive.ContextMenuSubContentProps
81
+ >(({ className, ...props }, ref) => (
82
+ <ContextMenuPrimitive.SubContent
83
+ ref={ref}
84
+ className={cn(
85
+ "bg-popover text-popover-foreground z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg",
86
+ "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
87
+ "data-[state=open]:data-[side=top]:slide-in-from-bottom-2",
88
+ "data-[state=open]:data-[side=right]:slide-in-from-left-2",
89
+ "data-[state=open]:data-[side=bottom]:slide-in-from-top-2",
90
+ "data-[state=open]:data-[side=left]:slide-in-from-right-2",
91
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
92
+ "data-[state=closed]:data-[side=top]:slide-out-to-bottom-2",
93
+ "data-[state=closed]:data-[side=right]:slide-out-to-left-2",
94
+ "data-[state=closed]:data-[side=bottom]:slide-out-to-top-2",
95
+ "data-[state=closed]:data-[side=left]:slide-out-to-right-2",
96
+ className,
97
+ )}
98
+ {...props}
99
+ />
100
+ ));
101
+ ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName;
102
+
103
+ /* -----------------------------------------------------------------------------
104
+ * Component: ContextMenuContent
105
+ * -------------------------------------------------------------------------- */
106
+
107
+ const ContextMenuContent = React.forwardRef<
108
+ React.ElementRef<typeof ContextMenuPrimitive.Content>,
109
+ ContextMenuPrimitive.ContextMenuContentProps
110
+ >(({ className, ...props }, ref) => (
111
+ <ContextMenuPrimitive.Portal>
112
+ <ContextMenuPrimitive.Content
113
+ ref={ref}
114
+ className={cn(
115
+ "bg-popover text-popover-foreground z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-md",
116
+ "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
117
+ "data-[state=open]:data-[side=top]:slide-in-from-bottom-2",
118
+ "data-[state=open]:data-[side=right]:slide-in-from-left-2",
119
+ "data-[state=open]:data-[side=bottom]:slide-in-from-top-2",
120
+ "data-[state=open]:data-[side=left]:slide-in-from-right-2",
121
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
122
+ "data-[state=closed]:data-[side=top]:slide-out-to-bottom-2",
123
+ "data-[state=closed]:data-[side=right]:slide-out-to-left-2",
124
+ "data-[state=closed]:data-[side=bottom]:slide-out-to-top-2",
125
+ "data-[state=closed]:data-[side=left]:slide-out-to-right-2",
126
+ className,
127
+ )}
128
+ {...props}
129
+ />
130
+ </ContextMenuPrimitive.Portal>
131
+ ));
132
+ ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName;
133
+
134
+ /* -----------------------------------------------------------------------------
135
+ * Component: ContextMenuItem
136
+ * -------------------------------------------------------------------------- */
137
+
138
+ const ContextMenuItem = React.forwardRef<
139
+ React.ElementRef<typeof ContextMenuPrimitive.Item>,
140
+ ContextMenuPrimitive.ContextMenuItemProps & {
141
+ inset?: boolean;
142
+ }
143
+ >(({ className, inset, ...props }, ref) => (
144
+ <ContextMenuPrimitive.Item
145
+ ref={ref}
146
+ className={cn(
147
+ "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",
148
+ "aria-disabled:pointer-events-none aria-disabled:opacity-50",
149
+ inset && "pl-8",
150
+ className,
151
+ )}
152
+ {...props}
153
+ />
154
+ ));
155
+ ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName;
156
+
157
+ /* -----------------------------------------------------------------------------
158
+ * Component: ContextMenuCheckboxItem
159
+ * -------------------------------------------------------------------------- */
160
+
161
+ const ContextMenuCheckboxItem = React.forwardRef<
162
+ React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,
163
+ ContextMenuPrimitive.ContextMenuCheckboxItemProps
164
+ >(({ className, children, checked, ...props }, ref) => (
165
+ <ContextMenuPrimitive.CheckboxItem
166
+ ref={ref}
167
+ className={cn(
168
+ "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",
169
+ "aria-disabled:pointer-events-none aria-disabled:opacity-50",
170
+ className,
171
+ )}
172
+ checked={checked}
173
+ {...props}
174
+ >
175
+ <span className="absolute left-2 flex size-3.5 items-center justify-center">
176
+ <ContextMenuPrimitive.ItemIndicator>
177
+ <CheckIcon className="size-4" />
178
+ </ContextMenuPrimitive.ItemIndicator>
179
+ </span>
180
+ {children}
181
+ </ContextMenuPrimitive.CheckboxItem>
182
+ ));
183
+ ContextMenuCheckboxItem.displayName =
184
+ ContextMenuPrimitive.CheckboxItem.displayName;
185
+
186
+ /* -----------------------------------------------------------------------------
187
+ * Component: ContextMenuRadioItem
188
+ * -------------------------------------------------------------------------- */
189
+
190
+ const ContextMenuRadioItem = React.forwardRef<
191
+ React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,
192
+ ContextMenuPrimitive.ContextMenuRadioItemProps
193
+ >(({ className, children, ...props }, ref) => (
194
+ <ContextMenuPrimitive.RadioItem
195
+ ref={ref}
196
+ className={cn(
197
+ "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",
198
+ "aria-disabled:pointer-events-none aria-disabled:opacity-50",
199
+ className,
200
+ )}
201
+ {...props}
202
+ >
203
+ <span className="absolute left-2 flex size-3.5 items-center justify-center">
204
+ <ContextMenuPrimitive.ItemIndicator>
205
+ <DotFilledIcon className="size-4 fill-current" />
206
+ </ContextMenuPrimitive.ItemIndicator>
207
+ </span>
208
+ {children}
209
+ </ContextMenuPrimitive.RadioItem>
210
+ ));
211
+ ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName;
212
+
213
+ /* -----------------------------------------------------------------------------
214
+ * Component: ContextMenuLabel
215
+ * -------------------------------------------------------------------------- */
216
+
217
+ const ContextMenuLabel = React.forwardRef<
218
+ React.ElementRef<typeof ContextMenuPrimitive.Label>,
219
+ ContextMenuPrimitive.ContextMenuLabelProps & {
220
+ inset?: boolean;
221
+ }
222
+ >(({ className, inset, ...props }, ref) => (
223
+ <ContextMenuPrimitive.Label
224
+ ref={ref}
225
+ className={cn(
226
+ "text-foreground px-2 py-1.5 text-sm font-semibold",
227
+ inset && "pl-8",
228
+ className,
229
+ )}
230
+ {...props}
231
+ />
232
+ ));
233
+ ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName;
234
+
235
+ /* -----------------------------------------------------------------------------
236
+ * Component: ContextMenuSeparator
237
+ * -------------------------------------------------------------------------- */
238
+
239
+ const ContextMenuSeparator = React.forwardRef<
240
+ React.ElementRef<typeof ContextMenuPrimitive.Separator>,
241
+ ContextMenuPrimitive.ContextMenuSeparatorProps
242
+ >(({ className, ...props }, ref) => (
243
+ <ContextMenuPrimitive.Separator
244
+ ref={ref}
245
+ className={cn("bg-border -mx-1 my-1 h-px", className)}
246
+ {...props}
247
+ />
248
+ ));
249
+ ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName;
250
+
251
+ /* -----------------------------------------------------------------------------
252
+ * Component: ContextMenuShortcut
253
+ * -------------------------------------------------------------------------- */
254
+
255
+ function ContextMenuShortcut({
256
+ className,
257
+ ...props
258
+ }: React.HTMLAttributes<HTMLSpanElement>): React.JSX.Element {
259
+ return (
260
+ <span
261
+ className={cn(
262
+ "text-muted-foreground ml-auto text-xs tracking-widest",
263
+ className,
264
+ )}
265
+ {...props}
266
+ />
267
+ );
268
+ }
269
+
270
+ /* -----------------------------------------------------------------------------
271
+ * Exports
272
+ * -------------------------------------------------------------------------- */
273
+
274
+ export {
275
+ ContextMenu,
276
+ ContextMenuTrigger,
277
+ ContextMenuContent,
278
+ ContextMenuItem,
279
+ ContextMenuCheckboxItem,
280
+ ContextMenuRadioItem,
281
+ ContextMenuLabel,
282
+ ContextMenuSeparator,
283
+ ContextMenuShortcut,
284
+ ContextMenuGroup,
285
+ ContextMenuPortal,
286
+ ContextMenuSub,
287
+ ContextMenuSubContent,
288
+ ContextMenuSubTrigger,
289
+ ContextMenuRadioGroup,
290
+ };
package/src/dialog.tsx ADDED
@@ -0,0 +1,176 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
5
+ import { Cross2Icon } from "@radix-ui/react-icons";
6
+ import { cn } from "./utils";
7
+
8
+ /* -----------------------------------------------------------------------------
9
+ * Component: Dialog
10
+ * -------------------------------------------------------------------------- */
11
+
12
+ const Dialog = DialogPrimitive.Root;
13
+
14
+ /* -----------------------------------------------------------------------------
15
+ * Component: DialogTrigger
16
+ * -------------------------------------------------------------------------- */
17
+
18
+ const DialogTrigger = DialogPrimitive.Trigger;
19
+
20
+ /* -----------------------------------------------------------------------------
21
+ * Component: DialogPortal
22
+ * -------------------------------------------------------------------------- */
23
+
24
+ const DialogPortal = DialogPrimitive.Portal;
25
+
26
+ /* -----------------------------------------------------------------------------
27
+ * Component: DialogClose
28
+ * -------------------------------------------------------------------------- */
29
+
30
+ const DialogClose = DialogPrimitive.Close;
31
+
32
+ /* -----------------------------------------------------------------------------
33
+ * Component: DialogOverlay
34
+ * -------------------------------------------------------------------------- */
35
+
36
+ const DialogOverlay = React.forwardRef<
37
+ React.ElementRef<typeof DialogPrimitive.Overlay>,
38
+ DialogPrimitive.DialogOverlayProps
39
+ >(({ className, ...props }, ref) => (
40
+ <DialogPrimitive.Overlay
41
+ ref={ref}
42
+ className={cn(
43
+ "fixed inset-0 z-50 bg-black/80",
44
+ "data-[state=open]:animate-in data-[state=open]:fade-in-0",
45
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0",
46
+ className,
47
+ )}
48
+ {...props}
49
+ />
50
+ ));
51
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
52
+
53
+ /* -----------------------------------------------------------------------------
54
+ * Component: DialogContent
55
+ * -------------------------------------------------------------------------- */
56
+
57
+ const DialogContent = React.forwardRef<
58
+ React.ElementRef<typeof DialogPrimitive.Content>,
59
+ DialogPrimitive.DialogContentProps
60
+ >(({ className, children, ...props }, ref) => (
61
+ <DialogPortal>
62
+ <DialogOverlay />
63
+ <DialogPrimitive.Content
64
+ ref={ref}
65
+ className={cn(
66
+ "bg-background fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg",
67
+ "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
68
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%]",
69
+ className,
70
+ )}
71
+ {...props}
72
+ >
73
+ {children}
74
+ <DialogPrimitive.Close
75
+ className={cn(
76
+ "ring-offset-background focus:ring-ring absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:pointer-events-none",
77
+ "data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",
78
+ )}
79
+ >
80
+ <Cross2Icon className="size-4" />
81
+ <span className="sr-only">Close</span>
82
+ </DialogPrimitive.Close>
83
+ </DialogPrimitive.Content>
84
+ </DialogPortal>
85
+ ));
86
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
87
+
88
+ /* -----------------------------------------------------------------------------
89
+ * Component: DialogHeader
90
+ * -------------------------------------------------------------------------- */
91
+
92
+ function DialogHeader({
93
+ className,
94
+ ...props
95
+ }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element {
96
+ return (
97
+ <div
98
+ className={cn(
99
+ "flex flex-col space-y-1.5 text-center sm:text-left",
100
+ className,
101
+ )}
102
+ {...props}
103
+ />
104
+ );
105
+ }
106
+
107
+ /* -----------------------------------------------------------------------------
108
+ * Component: DialogFooter
109
+ * -------------------------------------------------------------------------- */
110
+
111
+ function DialogFooter({
112
+ className,
113
+ ...props
114
+ }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element {
115
+ return (
116
+ <div
117
+ className={cn(
118
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
119
+ className,
120
+ )}
121
+ {...props}
122
+ />
123
+ );
124
+ }
125
+
126
+ /* -----------------------------------------------------------------------------
127
+ * Component: DialogTitle
128
+ * -------------------------------------------------------------------------- */
129
+
130
+ const DialogTitle = React.forwardRef<
131
+ React.ElementRef<typeof DialogPrimitive.Title>,
132
+ DialogPrimitive.DialogTitleProps
133
+ >(({ className, ...props }, ref) => (
134
+ <DialogPrimitive.Title
135
+ ref={ref}
136
+ className={cn(
137
+ "text-lg font-semibold leading-none tracking-tight",
138
+ className,
139
+ )}
140
+ {...props}
141
+ />
142
+ ));
143
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
144
+
145
+ /* -----------------------------------------------------------------------------
146
+ * Component: DialogDescription
147
+ * -------------------------------------------------------------------------- */
148
+
149
+ const DialogDescription = React.forwardRef<
150
+ React.ElementRef<typeof DialogPrimitive.Description>,
151
+ DialogPrimitive.DialogDescriptionProps
152
+ >(({ className, ...props }, ref) => (
153
+ <DialogPrimitive.Description
154
+ ref={ref}
155
+ className={cn("text-muted-foreground text-sm", className)}
156
+ {...props}
157
+ />
158
+ ));
159
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
160
+
161
+ /* -----------------------------------------------------------------------------
162
+ * Exports
163
+ * -------------------------------------------------------------------------- */
164
+
165
+ export {
166
+ Dialog,
167
+ DialogPortal,
168
+ DialogOverlay,
169
+ DialogTrigger,
170
+ DialogClose,
171
+ DialogContent,
172
+ DialogHeader,
173
+ DialogFooter,
174
+ DialogTitle,
175
+ DialogDescription,
176
+ };
package/src/drawer.tsx ADDED
@@ -0,0 +1,164 @@
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: DrawerPortal
31
+ * -------------------------------------------------------------------------- */
32
+
33
+ const DrawerPortal = DrawerPrimitive.Portal;
34
+
35
+ /* -----------------------------------------------------------------------------
36
+ * Component: DrawerClose
37
+ * -------------------------------------------------------------------------- */
38
+
39
+ const DrawerClose = DrawerPrimitive.Close;
40
+
41
+ /* -----------------------------------------------------------------------------
42
+ * Component: DrawerOverlay
43
+ * -------------------------------------------------------------------------- */
44
+
45
+ const DrawerOverlay = React.forwardRef<
46
+ React.ElementRef<typeof DrawerPrimitive.Overlay>,
47
+ React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>
48
+ >(({ className, ...props }, ref) => (
49
+ <DrawerPrimitive.Overlay
50
+ ref={ref}
51
+ className={cn("fixed inset-0 z-50 bg-black/80", className)}
52
+ {...props}
53
+ />
54
+ ));
55
+ DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;
56
+
57
+ /* -----------------------------------------------------------------------------
58
+ * Component: DrawerContent
59
+ * -------------------------------------------------------------------------- */
60
+
61
+ const DrawerContent = React.forwardRef<
62
+ React.ElementRef<typeof DrawerPrimitive.Content>,
63
+ React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>
64
+ >(({ className, children, ...props }, ref) => (
65
+ <DrawerPortal>
66
+ <DrawerOverlay />
67
+ <DrawerPrimitive.Content
68
+ ref={ref}
69
+ className={cn(
70
+ "bg-background fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border",
71
+ className,
72
+ )}
73
+ {...props}
74
+ >
75
+ <div className="bg-muted mx-auto mt-4 h-2 w-[100px] rounded-full" />
76
+ {children}
77
+ </DrawerPrimitive.Content>
78
+ </DrawerPortal>
79
+ ));
80
+ DrawerContent.displayName = "DrawerContent";
81
+
82
+ /* -----------------------------------------------------------------------------
83
+ * Component: DrawerHeader
84
+ * -------------------------------------------------------------------------- */
85
+
86
+ function DrawerHeader({
87
+ className,
88
+ ...props
89
+ }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element {
90
+ return (
91
+ <div
92
+ className={cn("grid gap-1.5 p-4 text-center sm:text-left", className)}
93
+ {...props}
94
+ />
95
+ );
96
+ }
97
+
98
+ /* -----------------------------------------------------------------------------
99
+ * Component: DrawerFooter
100
+ * -------------------------------------------------------------------------- */
101
+
102
+ function DrawerFooter({
103
+ className,
104
+ ...props
105
+ }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element {
106
+ return (
107
+ <div
108
+ className={cn("mt-auto flex flex-col gap-2 p-4", className)}
109
+ {...props}
110
+ />
111
+ );
112
+ }
113
+
114
+ /* -----------------------------------------------------------------------------
115
+ * Component: DrawerTitle
116
+ * -------------------------------------------------------------------------- */
117
+
118
+ const DrawerTitle = React.forwardRef<
119
+ React.ElementRef<typeof DrawerPrimitive.Title>,
120
+ React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>
121
+ >(({ className, ...props }, ref) => (
122
+ <DrawerPrimitive.Title
123
+ ref={ref}
124
+ className={cn(
125
+ "text-lg font-semibold leading-none tracking-tight",
126
+ className,
127
+ )}
128
+ {...props}
129
+ />
130
+ ));
131
+ DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
132
+
133
+ /* -----------------------------------------------------------------------------
134
+ * Component: DrawerDescription
135
+ * -------------------------------------------------------------------------- */
136
+
137
+ const DrawerDescription = React.forwardRef<
138
+ React.ElementRef<typeof DrawerPrimitive.Description>,
139
+ React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>
140
+ >(({ className, ...props }, ref) => (
141
+ <DrawerPrimitive.Description
142
+ ref={ref}
143
+ className={cn("text-muted-foreground text-sm", className)}
144
+ {...props}
145
+ />
146
+ ));
147
+ DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
148
+
149
+ /* -----------------------------------------------------------------------------
150
+ * Exports
151
+ * -------------------------------------------------------------------------- */
152
+
153
+ export {
154
+ Drawer,
155
+ DrawerPortal,
156
+ DrawerOverlay,
157
+ DrawerTrigger,
158
+ DrawerClose,
159
+ DrawerContent,
160
+ DrawerHeader,
161
+ DrawerFooter,
162
+ DrawerTitle,
163
+ DrawerDescription,
164
+ };