@codefast/ui 0.3.16-canary.2 → 0.4.0-canary.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +28 -17
  3. package/dist/components/accordion.d.mts +7 -22
  4. package/dist/components/accordion.mjs +26 -29
  5. package/dist/components/alert-dialog.d.mts +27 -26
  6. package/dist/components/alert-dialog.mjs +53 -45
  7. package/dist/components/alert.d.mts +14 -14
  8. package/dist/components/alert.mjs +17 -28
  9. package/dist/components/aspect-ratio.d.mts +2 -2
  10. package/dist/components/aspect-ratio.mjs +2 -3
  11. package/dist/components/avatar.d.mts +41 -5
  12. package/dist/components/avatar.mjs +40 -10
  13. package/dist/components/badge.d.mts +3 -15
  14. package/dist/components/badge.mjs +6 -48
  15. package/dist/components/breadcrumb.d.mts +1 -0
  16. package/dist/components/breadcrumb.mjs +11 -10
  17. package/dist/components/button-group.d.mts +3 -13
  18. package/dist/components/button-group.mjs +9 -31
  19. package/dist/components/button.d.mts +3 -26
  20. package/dist/components/button.mjs +9 -79
  21. package/dist/components/calendar.d.mts +6 -2
  22. package/dist/components/calendar.mjs +41 -44
  23. package/dist/components/card.d.mts +4 -2
  24. package/dist/components/card.mjs +9 -9
  25. package/dist/components/carousel.d.mts +16 -5
  26. package/dist/components/carousel.mjs +24 -11
  27. package/dist/components/chart.d.mts +9 -6
  28. package/dist/components/chart.mjs +21 -15
  29. package/dist/components/checkbox-cards.mjs +4 -4
  30. package/dist/components/checkbox-group.mjs +3 -4
  31. package/dist/components/checkbox.d.mts +2 -2
  32. package/dist/components/checkbox.mjs +6 -7
  33. package/dist/components/collapsible.d.mts +4 -4
  34. package/dist/components/collapsible.mjs +4 -5
  35. package/dist/components/command.d.mts +11 -1
  36. package/dist/components/command.mjs +35 -32
  37. package/dist/components/context-menu.d.mts +22 -15
  38. package/dist/components/context-menu.mjs +44 -39
  39. package/dist/components/dialog.d.mts +19 -23
  40. package/dist/components/dialog.mjs +48 -47
  41. package/dist/components/direction.d.mts +24 -0
  42. package/dist/components/direction.mjs +18 -0
  43. package/dist/components/drawer.d.mts +3 -21
  44. package/dist/components/drawer.mjs +19 -27
  45. package/dist/components/dropdown-menu.d.mts +22 -15
  46. package/dist/components/dropdown-menu.mjs +41 -37
  47. package/dist/components/empty.d.mts +3 -13
  48. package/dist/components/empty.mjs +8 -23
  49. package/dist/components/field.d.mts +3 -14
  50. package/dist/components/field.mjs +14 -44
  51. package/dist/components/form.d.mts +7 -10
  52. package/dist/components/form.mjs +6 -7
  53. package/dist/components/hover-card.d.mts +5 -5
  54. package/dist/components/hover-card.mjs +14 -12
  55. package/dist/components/input-group.d.mts +4 -31
  56. package/dist/components/input-group.mjs +14 -96
  57. package/dist/components/input-number.d.mts +3 -1
  58. package/dist/components/input-number.mjs +50 -28
  59. package/dist/components/input-otp.mjs +9 -7
  60. package/dist/components/input-password.mjs +1 -4
  61. package/dist/components/input-search.mjs +3 -5
  62. package/dist/components/input.mjs +1 -2
  63. package/dist/components/item.d.mts +4 -29
  64. package/dist/components/item.mjs +12 -65
  65. package/dist/components/kbd.mjs +1 -1
  66. package/dist/components/label.d.mts +2 -2
  67. package/dist/components/label.mjs +3 -4
  68. package/dist/components/menubar.d.mts +22 -16
  69. package/dist/components/menubar.mjs +54 -47
  70. package/dist/components/native-select.d.mts +5 -1
  71. package/dist/components/native-select.mjs +9 -6
  72. package/dist/components/navigation-menu.d.mts +30 -13
  73. package/dist/components/navigation-menu.mjs +35 -32
  74. package/dist/components/pagination.d.mts +7 -1
  75. package/dist/components/pagination.mjs +27 -12
  76. package/dist/components/popover.d.mts +40 -7
  77. package/dist/components/popover.mjs +46 -14
  78. package/dist/components/progress-circle.d.mts +3 -47
  79. package/dist/components/progress-circle.mjs +2 -48
  80. package/dist/components/progress.d.mts +2 -2
  81. package/dist/components/progress.mjs +5 -6
  82. package/dist/components/radio-cards.d.mts +3 -3
  83. package/dist/components/radio-cards.mjs +11 -11
  84. package/dist/components/radio-group.d.mts +3 -3
  85. package/dist/components/radio-group.mjs +9 -9
  86. package/dist/components/radio.mjs +2 -3
  87. package/dist/components/resizable.mjs +3 -8
  88. package/dist/components/scroll-area.d.mts +8 -24
  89. package/dist/components/scroll-area.mjs +16 -70
  90. package/dist/components/select.d.mts +14 -14
  91. package/dist/components/select.mjs +47 -47
  92. package/dist/components/separator.d.mts +4 -19
  93. package/dist/components/separator.mjs +6 -27
  94. package/dist/components/sheet.d.mts +18 -31
  95. package/dist/components/sheet.mjs +46 -87
  96. package/dist/components/sidebar.d.mts +3 -19
  97. package/dist/components/sidebar.mjs +48 -84
  98. package/dist/components/skeleton.mjs +1 -1
  99. package/dist/components/slider.d.mts +2 -2
  100. package/dist/components/slider.mjs +9 -11
  101. package/dist/components/sonner.mjs +11 -3
  102. package/dist/components/spinner.mjs +6 -7
  103. package/dist/components/switch.d.mts +5 -2
  104. package/dist/components/switch.mjs +7 -7
  105. package/dist/components/table.mjs +10 -10
  106. package/dist/components/tabs.d.mts +8 -5
  107. package/dist/components/tabs.mjs +18 -12
  108. package/dist/components/textarea.mjs +1 -1
  109. package/dist/components/toggle-group.d.mts +11 -7
  110. package/dist/components/toggle-group.mjs +20 -21
  111. package/dist/components/toggle.d.mts +4 -24
  112. package/dist/components/toggle.mjs +6 -45
  113. package/dist/components/tooltip.d.mts +7 -6
  114. package/dist/components/tooltip.mjs +19 -17
  115. package/dist/hooks/use-animated-value.mjs +0 -1
  116. package/dist/hooks/use-copy-to-clipboard.mjs +0 -1
  117. package/dist/hooks/use-is-mobile.mjs +0 -1
  118. package/dist/hooks/use-media-query.mjs +0 -1
  119. package/dist/hooks/use-mutation-observer.mjs +0 -1
  120. package/dist/hooks/use-pagination.mjs +0 -1
  121. package/dist/index.d.mts +38 -21
  122. package/dist/index.mjs +40 -23
  123. package/dist/lib/utils.d.mts +1 -12
  124. package/dist/lib/utils.mjs +1 -9
  125. package/dist/primitives/checkbox-group.d.mts +9 -11
  126. package/dist/primitives/checkbox-group.mjs +14 -19
  127. package/dist/primitives/input-number.d.mts +3 -4
  128. package/dist/primitives/input-number.mjs +3 -5
  129. package/dist/primitives/input.d.mts +4 -5
  130. package/dist/primitives/input.mjs +2 -3
  131. package/dist/primitives/progress-circle.d.mts +3 -4
  132. package/dist/primitives/progress-circle.mjs +2 -3
  133. package/dist/variants/alert.d.mts +18 -0
  134. package/dist/variants/alert.mjs +15 -0
  135. package/dist/variants/badge.d.mts +22 -0
  136. package/dist/variants/badge.mjs +19 -0
  137. package/dist/variants/button-group.d.mts +18 -0
  138. package/dist/variants/button-group.mjs +15 -0
  139. package/dist/variants/button.d.mts +32 -0
  140. package/dist/variants/button.mjs +34 -0
  141. package/dist/variants/empty.d.mts +18 -0
  142. package/dist/variants/empty.mjs +15 -0
  143. package/dist/variants/field.d.mts +19 -0
  144. package/dist/variants/field.mjs +16 -0
  145. package/dist/variants/input-group.d.mts +43 -0
  146. package/dist/variants/input-group.mjs +34 -0
  147. package/dist/variants/input-number.d.mts +45 -0
  148. package/dist/variants/input-number.mjs +40 -0
  149. package/dist/variants/item.d.mts +38 -0
  150. package/dist/variants/item.mjs +38 -0
  151. package/dist/variants/navigation-menu.d.mts +13 -0
  152. package/dist/variants/navigation-menu.mjs +8 -0
  153. package/dist/variants/progress-circle.d.mts +52 -0
  154. package/dist/variants/progress-circle.mjs +45 -0
  155. package/dist/variants/scroll-area.d.mts +24 -0
  156. package/dist/variants/scroll-area.mjs +58 -0
  157. package/dist/variants/separator.d.mts +23 -0
  158. package/dist/variants/separator.mjs +25 -0
  159. package/dist/variants/sheet.d.mts +20 -0
  160. package/dist/variants/sheet.mjs +17 -0
  161. package/dist/variants/sidebar.d.mts +23 -0
  162. package/dist/variants/sidebar.mjs +25 -0
  163. package/dist/variants/tabs.d.mts +18 -0
  164. package/dist/variants/tabs.mjs +15 -0
  165. package/dist/variants/toggle.d.mts +23 -0
  166. package/dist/variants/toggle.mjs +25 -0
  167. package/package.json +186 -55
  168. package/src/components/accordion.tsx +114 -0
  169. package/src/components/alert-dialog.tsx +298 -0
  170. package/src/components/alert.tsx +94 -0
  171. package/src/components/aspect-ratio.tsx +25 -0
  172. package/src/components/avatar.tsx +171 -0
  173. package/src/components/badge.tsx +35 -0
  174. package/src/components/breadcrumb.tsx +191 -0
  175. package/src/components/button-group.tsx +97 -0
  176. package/src/components/button.tsx +55 -0
  177. package/src/components/calendar.tsx +222 -0
  178. package/src/components/card.tsx +169 -0
  179. package/src/components/carousel.tsx +349 -0
  180. package/src/components/chart.tsx +536 -0
  181. package/src/components/checkbox-cards.tsx +72 -0
  182. package/src/components/checkbox-group.tsx +60 -0
  183. package/src/components/checkbox.tsx +44 -0
  184. package/src/components/collapsible.tsx +57 -0
  185. package/src/components/command.tsx +298 -0
  186. package/src/components/context-menu.tsx +410 -0
  187. package/src/components/dialog.tsx +243 -0
  188. package/src/components/direction.tsx +32 -0
  189. package/src/components/drawer.tsx +209 -0
  190. package/src/components/dropdown-menu.tsx +419 -0
  191. package/src/components/empty.tsx +155 -0
  192. package/src/components/field.tsx +329 -0
  193. package/src/components/form.tsx +258 -0
  194. package/src/components/hover-card.tsx +93 -0
  195. package/src/components/input-group.tsx +185 -0
  196. package/src/components/input-number.tsx +141 -0
  197. package/src/components/input-otp.tsx +132 -0
  198. package/src/components/input-password.tsx +50 -0
  199. package/src/components/input-search.tsx +81 -0
  200. package/src/components/input.tsx +36 -0
  201. package/src/components/item.tsx +266 -0
  202. package/src/components/kbd.tsx +47 -0
  203. package/src/components/label.tsx +36 -0
  204. package/src/components/menubar.tsx +440 -0
  205. package/src/components/native-select.tsx +87 -0
  206. package/src/components/navigation-menu.tsx +235 -0
  207. package/src/components/pagination.tsx +198 -0
  208. package/src/components/popover.tsx +170 -0
  209. package/src/components/progress-circle.tsx +185 -0
  210. package/src/components/progress.tsx +41 -0
  211. package/src/components/radio-cards.tsx +66 -0
  212. package/src/components/radio-group.tsx +59 -0
  213. package/src/components/radio.tsx +40 -0
  214. package/src/components/resizable.tsx +78 -0
  215. package/src/components/scroll-area.tsx +95 -0
  216. package/src/components/select.tsx +296 -0
  217. package/src/components/separator.tsx +60 -0
  218. package/src/components/sheet.tsx +241 -0
  219. package/src/components/sidebar.tsx +926 -0
  220. package/src/components/skeleton.tsx +35 -0
  221. package/src/components/slider.tsx +66 -0
  222. package/src/components/sonner.tsx +57 -0
  223. package/src/components/spinner.tsx +66 -0
  224. package/src/components/switch.tsx +44 -0
  225. package/src/components/table.tsx +183 -0
  226. package/src/components/tabs.tsx +110 -0
  227. package/src/components/textarea.tsx +35 -0
  228. package/src/components/toggle-group.tsx +137 -0
  229. package/src/components/toggle.tsx +30 -0
  230. package/src/components/tooltip.tsx +115 -0
  231. package/src/css/foundation/base.css +50 -0
  232. package/src/css/foundation/motion.css +36 -0
  233. package/src/css/foundation/source.css +3 -0
  234. package/src/css/foundation/tokens.css +71 -0
  235. package/src/css/foundation/variants.css +113 -0
  236. package/src/css/preset.css +5 -195
  237. package/src/css/style.css +1 -1
  238. package/src/css/{amber.css → themes/amber.css} +59 -22
  239. package/src/css/{blue.css → themes/blue.css} +59 -22
  240. package/src/css/{cyan.css → themes/cyan.css} +59 -22
  241. package/src/css/{emerald.css → themes/emerald.css} +59 -22
  242. package/src/css/{fuchsia.css → themes/fuchsia.css} +59 -22
  243. package/src/css/{gray.css → themes/gray.css} +59 -22
  244. package/src/css/{green.css → themes/green.css} +59 -22
  245. package/src/css/{indigo.css → themes/indigo.css} +59 -22
  246. package/src/css/{lime.css → themes/lime.css} +59 -22
  247. package/src/css/{neutral.css → themes/neutral.css} +59 -22
  248. package/src/css/{orange.css → themes/orange.css} +59 -22
  249. package/src/css/{pink.css → themes/pink.css} +59 -22
  250. package/src/css/{purple.css → themes/purple.css} +59 -22
  251. package/src/css/{red.css → themes/red.css} +59 -22
  252. package/src/css/{rose.css → themes/rose.css} +59 -22
  253. package/src/css/{sky.css → themes/sky.css} +59 -22
  254. package/src/css/{slate.css → themes/slate.css} +59 -22
  255. package/src/css/{stone.css → themes/stone.css} +59 -22
  256. package/src/css/{teal.css → themes/teal.css} +59 -22
  257. package/src/css/{violet.css → themes/violet.css} +59 -22
  258. package/src/css/{yellow.css → themes/yellow.css} +59 -22
  259. package/src/css/{zinc.css → themes/zinc.css} +59 -22
  260. package/src/hooks/use-animated-value.ts +91 -0
  261. package/src/hooks/use-copy-to-clipboard.ts +58 -0
  262. package/src/hooks/use-is-mobile.ts +25 -0
  263. package/src/hooks/use-media-query.ts +69 -0
  264. package/src/hooks/use-mutation-observer.ts +51 -0
  265. package/src/hooks/use-pagination.ts +164 -0
  266. package/src/index.ts +679 -0
  267. package/src/lib/utils.ts +5 -0
  268. package/src/primitives/checkbox-group.tsx +346 -0
  269. package/src/primitives/input-number.tsx +967 -0
  270. package/src/primitives/input.tsx +227 -0
  271. package/src/primitives/progress-circle.tsx +507 -0
  272. package/src/variants/alert.ts +34 -0
  273. package/src/variants/badge.ts +39 -0
  274. package/src/variants/button-group.ts +36 -0
  275. package/src/variants/button.ts +56 -0
  276. package/src/variants/empty.ts +34 -0
  277. package/src/variants/field.ts +37 -0
  278. package/src/variants/input-group.ts +80 -0
  279. package/src/variants/input-number.ts +65 -0
  280. package/src/variants/item.ts +68 -0
  281. package/src/variants/navigation-menu.ts +25 -0
  282. package/src/variants/progress-circle.ts +46 -0
  283. package/src/variants/scroll-area.ts +73 -0
  284. package/src/variants/separator.ts +40 -0
  285. package/src/variants/sheet.ts +37 -0
  286. package/src/variants/sidebar.ts +41 -0
  287. package/src/variants/tabs.ts +34 -0
  288. package/src/variants/toggle.ts +40 -0
  289. package/dist/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts +0 -6
@@ -0,0 +1,410 @@
1
+ import { CheckIcon, ChevronRightIcon } from "lucide-react";
2
+ import { ContextMenu as ContextMenuPrimitive } from "radix-ui";
3
+ import type { ComponentProps, JSX } from "react";
4
+
5
+ import { cn } from "#/lib/utils";
6
+
7
+ /* -----------------------------------------------------------------------------
8
+ * Component: ContextMenu
9
+ * -------------------------------------------------------------------------- */
10
+
11
+ /**
12
+ * @since 0.3.16-canary.0
13
+ */
14
+ type ContextMenuProps = ComponentProps<typeof ContextMenuPrimitive.Root>;
15
+
16
+ /**
17
+ * @since 0.3.16-canary.0
18
+ */
19
+ function ContextMenu({ ...props }: ContextMenuProps): JSX.Element {
20
+ return <ContextMenuPrimitive.Root data-slot="context-menu" {...props} />;
21
+ }
22
+
23
+ /* -----------------------------------------------------------------------------
24
+ * Component: ContextMenuTrigger
25
+ * -------------------------------------------------------------------------- */
26
+
27
+ /**
28
+ * @since 0.3.16-canary.0
29
+ */
30
+ type ContextMenuTriggerProps = ComponentProps<typeof ContextMenuPrimitive.Trigger>;
31
+
32
+ /**
33
+ * @since 0.3.16-canary.0
34
+ */
35
+ function ContextMenuTrigger({ className, ...props }: ContextMenuTriggerProps): JSX.Element {
36
+ return (
37
+ <ContextMenuPrimitive.Trigger
38
+ className={cn("select-none", className)}
39
+ data-slot="context-menu-trigger"
40
+ {...props}
41
+ />
42
+ );
43
+ }
44
+
45
+ /* -----------------------------------------------------------------------------
46
+ * Component: ContextMenuGroup
47
+ * -------------------------------------------------------------------------- */
48
+
49
+ /**
50
+ * @since 0.3.16-canary.0
51
+ */
52
+ type ContextMenuGroupProps = ComponentProps<typeof ContextMenuPrimitive.Group>;
53
+
54
+ /**
55
+ * @since 0.3.16-canary.0
56
+ */
57
+ function ContextMenuGroup({ ...props }: ContextMenuGroupProps): JSX.Element {
58
+ return <ContextMenuPrimitive.Group data-slot="context-menu-group" {...props} />;
59
+ }
60
+
61
+ /* -----------------------------------------------------------------------------
62
+ * Component: ContextMenuSub
63
+ * -------------------------------------------------------------------------- */
64
+
65
+ /**
66
+ * @since 0.3.16-canary.0
67
+ */
68
+ type ContextMenuSubProps = ComponentProps<typeof ContextMenuPrimitive.Sub>;
69
+
70
+ /**
71
+ * @since 0.3.16-canary.0
72
+ */
73
+ function ContextMenuSub({ ...props }: ContextMenuSubProps): JSX.Element {
74
+ return <ContextMenuPrimitive.Sub data-slot="context-menu-sub" {...props} />;
75
+ }
76
+
77
+ /* -----------------------------------------------------------------------------
78
+ * Component: ContextMenuRadioGroup
79
+ * -------------------------------------------------------------------------- */
80
+
81
+ /**
82
+ * @since 0.3.16-canary.0
83
+ */
84
+ type ContextMenuRadioGroupProps = ComponentProps<typeof ContextMenuPrimitive.RadioGroup>;
85
+
86
+ /**
87
+ * @since 0.3.16-canary.0
88
+ */
89
+ function ContextMenuRadioGroup({ ...props }: ContextMenuRadioGroupProps): JSX.Element {
90
+ return <ContextMenuPrimitive.RadioGroup data-slot="context-menu-radio-group" {...props} />;
91
+ }
92
+
93
+ /* -----------------------------------------------------------------------------
94
+ * Component: ContextMenuSubTrigger
95
+ * -------------------------------------------------------------------------- */
96
+
97
+ /**
98
+ * @since 0.3.16-canary.0
99
+ */
100
+ interface ContextMenuSubTriggerProps extends ComponentProps<typeof ContextMenuPrimitive.SubTrigger> {
101
+ inset?: boolean;
102
+ }
103
+
104
+ /**
105
+ * @since 0.3.16-canary.0
106
+ */
107
+ function ContextMenuSubTrigger({ children, className, inset, ...props }: ContextMenuSubTriggerProps): JSX.Element {
108
+ return (
109
+ <ContextMenuPrimitive.SubTrigger
110
+ className={cn(
111
+ "flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
112
+ className,
113
+ )}
114
+ data-inset={inset}
115
+ data-slot="context-menu-sub-trigger"
116
+ {...props}
117
+ >
118
+ {children}
119
+ <ChevronRightIcon className="ml-auto rtl:rotate-180" />
120
+ </ContextMenuPrimitive.SubTrigger>
121
+ );
122
+ }
123
+
124
+ /* -----------------------------------------------------------------------------
125
+ * Component: ContextMenuSubContent
126
+ * -------------------------------------------------------------------------- */
127
+
128
+ /**
129
+ * @since 0.3.16-canary.0
130
+ */
131
+ type ContextMenuSubContentProps = ComponentProps<typeof ContextMenuPrimitive.SubContent>;
132
+
133
+ /**
134
+ * @since 0.3.16-canary.0
135
+ */
136
+ function ContextMenuSubContent({ className, ...props }: ContextMenuSubContentProps): JSX.Element {
137
+ return (
138
+ <ContextMenuPrimitive.SubContent
139
+ className={cn(
140
+ "z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg ease-snappy data-open:animate-in data-open:animation-duration-menu-in data-open:fade-in-0 data-open:zoom-in-95 data-open:data-side-top:slide-in-from-bottom-2 data-open:data-side-right:slide-in-from-left-2 data-open:data-side-bottom:slide-in-from-top-2 data-open:data-side-left:slide-in-from-right-2 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-menu-out data-closed:fade-out-0 data-closed:zoom-out-95 data-closed:data-side-top:slide-out-to-bottom-2 data-closed:data-side-right:slide-out-to-left-2 data-closed:data-side-bottom:slide-out-to-top-2 data-closed:data-side-left:slide-out-to-right-2",
141
+ className,
142
+ )}
143
+ data-slot="context-menu-sub-content"
144
+ {...props}
145
+ />
146
+ );
147
+ }
148
+
149
+ /* -----------------------------------------------------------------------------
150
+ * Component: ContextMenuContent
151
+ * -------------------------------------------------------------------------- */
152
+
153
+ /**
154
+ * @since 0.3.16-canary.0
155
+ */
156
+ type ContextMenuContentProps = ComponentProps<typeof ContextMenuPrimitive.Content>;
157
+
158
+ /**
159
+ * @since 0.3.16-canary.0
160
+ */
161
+ function ContextMenuContent({ className, ...props }: ContextMenuContentProps): JSX.Element {
162
+ return (
163
+ <ContextMenuPrimitive.Portal data-slot="context-menu-portal">
164
+ <ContextMenuPrimitive.Content
165
+ className={cn(
166
+ "z-50 max-h-(--radix-context-menu-content-available-height) min-w-36 origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 ease-snappy data-open:animate-in data-open:animation-duration-menu-in data-open:fade-in-0 data-open:zoom-in-95 data-open:data-side-top:slide-in-from-bottom-2 data-open:data-side-right:slide-in-from-left-2 data-open:data-side-bottom:slide-in-from-top-2 data-open:data-side-left:slide-in-from-right-2 data-closed:ease-exit",
167
+ className,
168
+ )}
169
+ data-slot="context-menu-content"
170
+ {...props}
171
+ />
172
+ </ContextMenuPrimitive.Portal>
173
+ );
174
+ }
175
+
176
+ /* -----------------------------------------------------------------------------
177
+ * Component: ContextMenuItem
178
+ * -------------------------------------------------------------------------- */
179
+
180
+ /**
181
+ * @since 0.3.16-canary.0
182
+ */
183
+ interface ContextMenuItemProps extends ComponentProps<typeof ContextMenuPrimitive.Item> {
184
+ inset?: boolean;
185
+ variant?: "default" | "destructive";
186
+ }
187
+
188
+ /**
189
+ * @since 0.3.16-canary.0
190
+ */
191
+ function ContextMenuItem({ className, inset, variant = "default", ...props }: ContextMenuItemProps): JSX.Element {
192
+ return (
193
+ <ContextMenuPrimitive.Item
194
+ className={cn(
195
+ "group/context-menu-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive",
196
+ className,
197
+ )}
198
+ data-inset={inset}
199
+ data-slot="context-menu-item"
200
+ data-variant={variant}
201
+ {...props}
202
+ />
203
+ );
204
+ }
205
+
206
+ /* -----------------------------------------------------------------------------
207
+ * Component: ContextMenuCheckboxItem
208
+ * -------------------------------------------------------------------------- */
209
+
210
+ /**
211
+ * @since 0.3.16-canary.0
212
+ */
213
+ interface ContextMenuCheckboxItemProps extends ComponentProps<typeof ContextMenuPrimitive.CheckboxItem> {
214
+ inset?: boolean;
215
+ }
216
+
217
+ /**
218
+ * @since 0.3.16-canary.0
219
+ */
220
+ function ContextMenuCheckboxItem({
221
+ checked,
222
+ children,
223
+ className,
224
+ inset,
225
+ ...props
226
+ }: ContextMenuCheckboxItemProps): JSX.Element {
227
+ return (
228
+ <ContextMenuPrimitive.CheckboxItem
229
+ checked={checked}
230
+ className={cn(
231
+ "relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
232
+ className,
233
+ )}
234
+ data-inset={inset}
235
+ data-slot="context-menu-checkbox-item"
236
+ {...props}
237
+ >
238
+ <span className="pointer-events-none absolute right-2">
239
+ <ContextMenuPrimitive.ItemIndicator>
240
+ <CheckIcon />
241
+ </ContextMenuPrimitive.ItemIndicator>
242
+ </span>
243
+ {children}
244
+ </ContextMenuPrimitive.CheckboxItem>
245
+ );
246
+ }
247
+
248
+ /* -----------------------------------------------------------------------------
249
+ * Component: ContextMenuRadioItem
250
+ * -------------------------------------------------------------------------- */
251
+
252
+ /**
253
+ * @since 0.3.16-canary.0
254
+ */
255
+ interface ContextMenuRadioItemProps extends ComponentProps<typeof ContextMenuPrimitive.RadioItem> {
256
+ inset?: boolean;
257
+ }
258
+
259
+ /**
260
+ * @since 0.3.16-canary.0
261
+ */
262
+ function ContextMenuRadioItem({ children, className, inset, ...props }: ContextMenuRadioItemProps): JSX.Element {
263
+ return (
264
+ <ContextMenuPrimitive.RadioItem
265
+ className={cn(
266
+ "relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
267
+ className,
268
+ )}
269
+ data-inset={inset}
270
+ data-slot="context-menu-radio-item"
271
+ {...props}
272
+ >
273
+ <span className="pointer-events-none absolute right-2">
274
+ <ContextMenuPrimitive.ItemIndicator>
275
+ <CheckIcon />
276
+ </ContextMenuPrimitive.ItemIndicator>
277
+ </span>
278
+ {children}
279
+ </ContextMenuPrimitive.RadioItem>
280
+ );
281
+ }
282
+
283
+ /* -----------------------------------------------------------------------------
284
+ * Component: ContextMenuLabel
285
+ * -------------------------------------------------------------------------- */
286
+
287
+ /**
288
+ * @since 0.3.16-canary.0
289
+ */
290
+ interface ContextMenuLabelProps extends ComponentProps<typeof ContextMenuPrimitive.Label> {
291
+ inset?: boolean;
292
+ }
293
+
294
+ /**
295
+ * @since 0.3.16-canary.0
296
+ */
297
+ function ContextMenuLabel({ className, inset, ...props }: ContextMenuLabelProps): JSX.Element {
298
+ return (
299
+ <ContextMenuPrimitive.Label
300
+ className={cn("px-2 py-1.5 text-xs font-medium text-muted-foreground data-inset:pl-8", className)}
301
+ data-inset={inset}
302
+ data-slot="context-menu-label"
303
+ {...props}
304
+ />
305
+ );
306
+ }
307
+
308
+ /* -----------------------------------------------------------------------------
309
+ * Component: ContextMenuSeparator
310
+ * -------------------------------------------------------------------------- */
311
+
312
+ /**
313
+ * @since 0.3.16-canary.0
314
+ */
315
+ type ContextMenuSeparatorProps = ComponentProps<typeof ContextMenuPrimitive.Separator>;
316
+
317
+ /**
318
+ * @since 0.3.16-canary.0
319
+ */
320
+ function ContextMenuSeparator({ className, ...props }: ContextMenuSeparatorProps): JSX.Element {
321
+ return (
322
+ <ContextMenuPrimitive.Separator
323
+ className={cn("-mx-1 my-1 h-px bg-border", className)}
324
+ data-slot="context-menu-separator"
325
+ {...props}
326
+ />
327
+ );
328
+ }
329
+
330
+ /* -----------------------------------------------------------------------------
331
+ * Component: ContextMenuShortcut
332
+ * -------------------------------------------------------------------------- */
333
+
334
+ /**
335
+ * @since 0.3.16-canary.0
336
+ */
337
+ type ContextMenuShortcutProps = ComponentProps<"span">;
338
+
339
+ /**
340
+ * @since 0.3.16-canary.0
341
+ */
342
+ function ContextMenuShortcut({ className, ...props }: ContextMenuShortcutProps): JSX.Element {
343
+ return (
344
+ <span
345
+ className={cn(
346
+ "ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground",
347
+ className,
348
+ )}
349
+ data-slot="context-menu-shortcut"
350
+ {...props}
351
+ />
352
+ );
353
+ }
354
+
355
+ /* -----------------------------------------------------------------------------
356
+ * Component: ContextMenuArrow
357
+ * -------------------------------------------------------------------------- */
358
+
359
+ /**
360
+ * @since 0.3.16-canary.0
361
+ */
362
+ type ContextMenuArrowProps = ComponentProps<typeof ContextMenuPrimitive.Arrow>;
363
+
364
+ /**
365
+ * @since 0.3.16-canary.0
366
+ */
367
+ function ContextMenuArrow({ className, ...props }: ContextMenuArrowProps): JSX.Element {
368
+ return (
369
+ <ContextMenuPrimitive.Arrow className={cn("fill-popover", className)} data-slot="context-menu-arrow" {...props} />
370
+ );
371
+ }
372
+
373
+ /* -----------------------------------------------------------------------------
374
+ * Exports
375
+ * -------------------------------------------------------------------------- */
376
+
377
+ export {
378
+ ContextMenu,
379
+ ContextMenuArrow,
380
+ ContextMenuCheckboxItem,
381
+ ContextMenuContent,
382
+ ContextMenuGroup,
383
+ ContextMenuItem,
384
+ ContextMenuLabel,
385
+ ContextMenuRadioGroup,
386
+ ContextMenuRadioItem,
387
+ ContextMenuSeparator,
388
+ ContextMenuShortcut,
389
+ ContextMenuSub,
390
+ ContextMenuSubContent,
391
+ ContextMenuSubTrigger,
392
+ ContextMenuTrigger,
393
+ };
394
+ export type {
395
+ ContextMenuArrowProps,
396
+ ContextMenuCheckboxItemProps,
397
+ ContextMenuContentProps,
398
+ ContextMenuGroupProps,
399
+ ContextMenuItemProps,
400
+ ContextMenuLabelProps,
401
+ ContextMenuProps,
402
+ ContextMenuRadioGroupProps,
403
+ ContextMenuRadioItemProps,
404
+ ContextMenuSeparatorProps,
405
+ ContextMenuShortcutProps,
406
+ ContextMenuSubContentProps,
407
+ ContextMenuSubProps,
408
+ ContextMenuSubTriggerProps,
409
+ ContextMenuTriggerProps,
410
+ };
@@ -0,0 +1,243 @@
1
+ import { XIcon } from "lucide-react";
2
+ import { Dialog as DialogPrimitive } from "radix-ui";
3
+ import type { ComponentProps, JSX } from "react";
4
+
5
+ import { Button } from "#/components/button";
6
+ import { cn } from "#/lib/utils";
7
+
8
+ /* -----------------------------------------------------------------------------
9
+ * Component: Dialog
10
+ * -------------------------------------------------------------------------- */
11
+
12
+ /**
13
+ * @since 0.3.16-canary.0
14
+ */
15
+ type DialogProps = ComponentProps<typeof DialogPrimitive.Root>;
16
+
17
+ /**
18
+ * @since 0.3.16-canary.0
19
+ */
20
+ function Dialog({ ...props }: DialogProps): JSX.Element {
21
+ return <DialogPrimitive.Root data-slot="dialog" {...props} />;
22
+ }
23
+
24
+ /* -----------------------------------------------------------------------------
25
+ * Component: DialogTrigger
26
+ * -------------------------------------------------------------------------- */
27
+
28
+ /**
29
+ * @since 0.3.16-canary.0
30
+ */
31
+ type DialogTriggerProps = ComponentProps<typeof DialogPrimitive.Trigger>;
32
+
33
+ /**
34
+ * @since 0.3.16-canary.0
35
+ */
36
+ function DialogTrigger({ ...props }: DialogTriggerProps): JSX.Element {
37
+ return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />;
38
+ }
39
+
40
+ /* -----------------------------------------------------------------------------
41
+ * Component: DialogContent
42
+ * -------------------------------------------------------------------------- */
43
+
44
+ /**
45
+ * @since 0.3.16-canary.0
46
+ */
47
+ interface DialogContentProps extends ComponentProps<typeof DialogPrimitive.Content> {
48
+ showCloseButton?: boolean;
49
+ }
50
+
51
+ /**
52
+ * @since 0.3.16-canary.0
53
+ */
54
+ function DialogContent({ children, className, showCloseButton = true, ...props }: DialogContentProps): JSX.Element {
55
+ return (
56
+ <DialogPrimitive.Portal data-slot="dialog-portal">
57
+ <DialogPrimitive.Overlay
58
+ className={
59
+ "fixed inset-0 isolate z-50 bg-black/10 ease-gentle supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:animation-duration-overlay-in data-open:fade-in-0 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-overlay-out data-closed:fade-out-0"
60
+ }
61
+ data-slot="dialog-overlay"
62
+ />
63
+ <DialogPrimitive.Content
64
+ className={cn(
65
+ "fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100dvh-2rem)] w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 flex-col gap-6 overflow-y-auto rounded-xl bg-popover p-6 text-sm text-popover-foreground ring-1 ring-foreground/10 ease-ui outline-none sm:max-w-md data-open:animate-in data-open:animation-duration-overlay-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-overlay-out data-closed:fade-out-0 data-closed:zoom-out-95",
66
+ className,
67
+ )}
68
+ data-slot="dialog-content"
69
+ {...props}
70
+ >
71
+ {children}
72
+ {showCloseButton ? (
73
+ <DialogPrimitive.Close asChild data-slot="dialog-close">
74
+ <Button className="absolute top-4 right-4" size="icon-sm" variant="ghost">
75
+ <XIcon />
76
+ <span className="sr-only">Close</span>
77
+ </Button>
78
+ </DialogPrimitive.Close>
79
+ ) : null}
80
+ </DialogPrimitive.Content>
81
+ </DialogPrimitive.Portal>
82
+ );
83
+ }
84
+
85
+ /* -----------------------------------------------------------------------------
86
+ * Component: DialogHeader
87
+ * -------------------------------------------------------------------------- */
88
+
89
+ /**
90
+ * @since 0.3.16-canary.0
91
+ */
92
+ type DialogHeaderProps = ComponentProps<"div">;
93
+
94
+ /**
95
+ * @since 0.3.16-canary.0
96
+ */
97
+ function DialogHeader({ className, ...props }: DialogHeaderProps): JSX.Element {
98
+ return <div className={cn("flex shrink-0 flex-col gap-2", className)} data-slot="dialog-header" {...props} />;
99
+ }
100
+
101
+ /* -----------------------------------------------------------------------------
102
+ * Component: DialogBody
103
+ * -------------------------------------------------------------------------- */
104
+
105
+ /**
106
+ * Optional scrollable region for long content. When used, the Header and Footer
107
+ * stay pinned (shrink-0) and only this body scrolls; without it, the whole
108
+ * Content scrolls via its own max-height. This is a codefast enhancement over
109
+ * radix-vega, which has no scroll handling for tall dialogs.
110
+ *
111
+ * @since 0.3.16-canary.0
112
+ */
113
+ type DialogBodyProps = ComponentProps<"div">;
114
+
115
+ /**
116
+ * @since 0.3.16-canary.0
117
+ */
118
+ function DialogBody({ className, ...props }: DialogBodyProps): JSX.Element {
119
+ return (
120
+ <div className={cn("-mx-6 min-h-0 flex-1 overflow-y-auto px-6", className)} data-slot="dialog-body" {...props} />
121
+ );
122
+ }
123
+
124
+ /* -----------------------------------------------------------------------------
125
+ * Component: DialogFooter
126
+ * -------------------------------------------------------------------------- */
127
+
128
+ /**
129
+ * @since 0.3.16-canary.0
130
+ */
131
+ interface DialogFooterProps extends ComponentProps<"div"> {
132
+ showCloseButton?: boolean;
133
+ }
134
+
135
+ /**
136
+ * @since 0.3.16-canary.0
137
+ */
138
+ function DialogFooter({ children, className, showCloseButton = false, ...props }: DialogFooterProps): JSX.Element {
139
+ return (
140
+ <div
141
+ className={cn("flex shrink-0 flex-col-reverse gap-2 sm:flex-row sm:justify-end", className)}
142
+ data-slot="dialog-footer"
143
+ {...props}
144
+ >
145
+ {children}
146
+ {showCloseButton ? (
147
+ <DialogPrimitive.Close asChild>
148
+ <Button variant="outline">Close</Button>
149
+ </DialogPrimitive.Close>
150
+ ) : null}
151
+ </div>
152
+ );
153
+ }
154
+
155
+ /* -----------------------------------------------------------------------------
156
+ * Component: DialogTitle
157
+ * -------------------------------------------------------------------------- */
158
+
159
+ /**
160
+ * @since 0.3.16-canary.0
161
+ */
162
+ type DialogTitleProps = ComponentProps<typeof DialogPrimitive.Title>;
163
+
164
+ /**
165
+ * @since 0.3.16-canary.0
166
+ */
167
+ function DialogTitle({ className, ...props }: DialogTitleProps): JSX.Element {
168
+ return (
169
+ <DialogPrimitive.Title
170
+ className={cn("font-heading leading-none font-medium", className)}
171
+ data-slot="dialog-title"
172
+ {...props}
173
+ />
174
+ );
175
+ }
176
+
177
+ /* -----------------------------------------------------------------------------
178
+ * Component: DialogDescription
179
+ * -------------------------------------------------------------------------- */
180
+
181
+ /**
182
+ * @since 0.3.16-canary.0
183
+ */
184
+ type DialogDescriptionProps = ComponentProps<typeof DialogPrimitive.Description>;
185
+
186
+ /**
187
+ * @since 0.3.16-canary.0
188
+ */
189
+ function DialogDescription({ className, ...props }: DialogDescriptionProps): JSX.Element {
190
+ return (
191
+ <DialogPrimitive.Description
192
+ className={cn(
193
+ "text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
194
+ className,
195
+ )}
196
+ data-slot="dialog-description"
197
+ {...props}
198
+ />
199
+ );
200
+ }
201
+
202
+ /* -----------------------------------------------------------------------------
203
+ * Component: DialogClose
204
+ * -------------------------------------------------------------------------- */
205
+
206
+ /**
207
+ * @since 0.3.16-canary.0
208
+ */
209
+ type DialogCloseProps = ComponentProps<typeof DialogPrimitive.Close>;
210
+
211
+ /**
212
+ * @since 0.3.16-canary.0
213
+ */
214
+ function DialogClose({ ...props }: DialogCloseProps): JSX.Element {
215
+ return <DialogPrimitive.Close data-slot="dialog-close" {...props} />;
216
+ }
217
+
218
+ /* -----------------------------------------------------------------------------
219
+ * Exports
220
+ * -------------------------------------------------------------------------- */
221
+
222
+ export {
223
+ Dialog,
224
+ DialogBody,
225
+ DialogClose,
226
+ DialogContent,
227
+ DialogDescription,
228
+ DialogFooter,
229
+ DialogHeader,
230
+ DialogTitle,
231
+ DialogTrigger,
232
+ };
233
+ export type {
234
+ DialogBodyProps,
235
+ DialogCloseProps,
236
+ DialogContentProps,
237
+ DialogDescriptionProps,
238
+ DialogFooterProps,
239
+ DialogHeaderProps,
240
+ DialogProps,
241
+ DialogTitleProps,
242
+ DialogTriggerProps,
243
+ };
@@ -0,0 +1,32 @@
1
+ import { Direction } from "radix-ui";
2
+ import type { ComponentProps } from "react";
3
+
4
+ /* -----------------------------------------------------------------------------
5
+ * Component: DirectionProvider
6
+ * -------------------------------------------------------------------------- */
7
+
8
+ /**
9
+ * @since 0.4.0-canary.4
10
+ */
11
+ type DirectionProviderProps = ComponentProps<typeof Direction.DirectionProvider> & {
12
+ direction?: ComponentProps<typeof Direction.DirectionProvider>["dir"];
13
+ };
14
+
15
+ /**
16
+ * @since 0.4.0-canary.4
17
+ */
18
+ function DirectionProvider({ dir, direction, children }: DirectionProviderProps) {
19
+ return <Direction.DirectionProvider dir={direction ?? dir}>{children}</Direction.DirectionProvider>;
20
+ }
21
+
22
+ /**
23
+ * @since 0.4.0-canary.4
24
+ */
25
+ const useDirection = Direction.useDirection;
26
+
27
+ /* -----------------------------------------------------------------------------
28
+ * Exports
29
+ * -------------------------------------------------------------------------- */
30
+
31
+ export { DirectionProvider, useDirection };
32
+ export type { DirectionProviderProps };