@codefast/ui 0.3.16-canary.2 → 0.3.16-canary.3

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 (223) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +1 -1
  3. package/dist/components/accordion.mjs +2 -2
  4. package/dist/components/alert-dialog.d.mts +1 -1
  5. package/dist/components/alert-dialog.mjs +4 -4
  6. package/dist/components/alert.d.mts +3 -13
  7. package/dist/components/alert.mjs +3 -23
  8. package/dist/components/badge.d.mts +3 -15
  9. package/dist/components/badge.mjs +2 -44
  10. package/dist/components/breadcrumb.mjs +1 -1
  11. package/dist/components/button-group.d.mts +3 -13
  12. package/dist/components/button-group.mjs +3 -24
  13. package/dist/components/button.d.mts +3 -25
  14. package/dist/components/button.mjs +2 -72
  15. package/dist/components/calendar.mjs +2 -1
  16. package/dist/components/carousel.d.mts +1 -2
  17. package/dist/components/chart.d.mts +2 -4
  18. package/dist/components/checkbox.mjs +2 -2
  19. package/dist/components/context-menu.mjs +2 -2
  20. package/dist/components/dialog.d.mts +1 -1
  21. package/dist/components/dialog.mjs +4 -4
  22. package/dist/components/drawer.d.mts +1 -1
  23. package/dist/components/drawer.mjs +2 -2
  24. package/dist/components/dropdown-menu.mjs +2 -2
  25. package/dist/components/empty.d.mts +3 -13
  26. package/dist/components/empty.mjs +3 -18
  27. package/dist/components/field.d.mts +3 -14
  28. package/dist/components/field.mjs +3 -32
  29. package/dist/components/form.d.mts +2 -4
  30. package/dist/components/hover-card.mjs +1 -1
  31. package/dist/components/input-group.d.mts +4 -31
  32. package/dist/components/input-group.mjs +3 -90
  33. package/dist/components/input-number.mjs +4 -4
  34. package/dist/components/input-otp.mjs +2 -2
  35. package/dist/components/input.mjs +1 -1
  36. package/dist/components/item.d.mts +4 -29
  37. package/dist/components/item.mjs +3 -56
  38. package/dist/components/menubar.mjs +2 -2
  39. package/dist/components/native-select.mjs +1 -1
  40. package/dist/components/navigation-menu.d.mts +1 -6
  41. package/dist/components/navigation-menu.mjs +8 -15
  42. package/dist/components/pagination.d.mts +1 -1
  43. package/dist/components/pagination.mjs +1 -1
  44. package/dist/components/popover.mjs +1 -1
  45. package/dist/components/progress-circle.d.mts +3 -47
  46. package/dist/components/progress-circle.mjs +2 -47
  47. package/dist/components/progress.mjs +1 -1
  48. package/dist/components/radio-group.mjs +1 -1
  49. package/dist/components/radio.mjs +1 -1
  50. package/dist/components/scroll-area.d.mts +3 -19
  51. package/dist/components/scroll-area.mjs +4 -61
  52. package/dist/components/select.d.mts +1 -1
  53. package/dist/components/select.mjs +3 -3
  54. package/dist/components/separator.d.mts +3 -18
  55. package/dist/components/separator.mjs +3 -23
  56. package/dist/components/sheet.d.mts +6 -18
  57. package/dist/components/sheet.mjs +6 -49
  58. package/dist/components/sidebar.d.mts +4 -19
  59. package/dist/components/sidebar.mjs +10 -46
  60. package/dist/components/skeleton.mjs +1 -1
  61. package/dist/components/slider.mjs +1 -1
  62. package/dist/components/spinner.mjs +1 -1
  63. package/dist/components/switch.mjs +2 -2
  64. package/dist/components/table.mjs +1 -1
  65. package/dist/components/tabs.mjs +1 -1
  66. package/dist/components/textarea.mjs +1 -1
  67. package/dist/components/toggle-group.d.mts +3 -2
  68. package/dist/components/toggle-group.mjs +1 -1
  69. package/dist/components/toggle.d.mts +2 -21
  70. package/dist/components/toggle.mjs +2 -39
  71. package/dist/components/tooltip.mjs +1 -1
  72. package/dist/index.d.mts +31 -16
  73. package/dist/index.mjs +30 -15
  74. package/dist/lib/utils.d.mts +1 -12
  75. package/dist/lib/utils.mjs +1 -9
  76. package/dist/primitives/checkbox-group.d.mts +1 -2
  77. package/dist/primitives/input-number.d.mts +1 -2
  78. package/dist/primitives/input.d.mts +1 -2
  79. package/dist/primitives/progress-circle.d.mts +1 -2
  80. package/dist/variants/alert.d.mts +18 -0
  81. package/dist/variants/alert.mjs +25 -0
  82. package/dist/variants/badge.d.mts +20 -0
  83. package/dist/variants/badge.mjs +46 -0
  84. package/dist/variants/button-group.d.mts +18 -0
  85. package/dist/variants/button-group.mjs +26 -0
  86. package/dist/variants/button.d.mts +30 -0
  87. package/dist/variants/button.mjs +76 -0
  88. package/dist/variants/empty.d.mts +18 -0
  89. package/dist/variants/empty.mjs +20 -0
  90. package/dist/variants/field.d.mts +19 -0
  91. package/dist/variants/field.mjs +34 -0
  92. package/dist/variants/input-group.d.mts +43 -0
  93. package/dist/variants/input-group.mjs +93 -0
  94. package/dist/variants/item.d.mts +37 -0
  95. package/dist/variants/item.mjs +60 -0
  96. package/dist/variants/navigation-menu.d.mts +13 -0
  97. package/dist/variants/navigation-menu.mjs +12 -0
  98. package/dist/variants/progress-circle.d.mts +52 -0
  99. package/dist/variants/progress-circle.mjs +49 -0
  100. package/dist/variants/scroll-area.d.mts +24 -0
  101. package/dist/variants/scroll-area.mjs +63 -0
  102. package/dist/variants/separator.d.mts +23 -0
  103. package/dist/variants/separator.mjs +25 -0
  104. package/dist/variants/sheet.d.mts +20 -0
  105. package/dist/variants/sheet.mjs +50 -0
  106. package/dist/variants/sidebar.d.mts +23 -0
  107. package/dist/variants/sidebar.mjs +42 -0
  108. package/dist/variants/toggle.d.mts +23 -0
  109. package/dist/variants/toggle.mjs +43 -0
  110. package/package.json +168 -20
  111. package/src/components/accordion.tsx +156 -0
  112. package/src/components/alert-dialog.tsx +314 -0
  113. package/src/components/alert.tsx +86 -0
  114. package/src/components/aspect-ratio.tsx +28 -0
  115. package/src/components/avatar.tsx +84 -0
  116. package/src/components/badge.tsx +38 -0
  117. package/src/components/breadcrumb.tsx +197 -0
  118. package/src/components/button-group.tsx +107 -0
  119. package/src/components/button.tsx +66 -0
  120. package/src/components/calendar.tsx +277 -0
  121. package/src/components/card.tsx +175 -0
  122. package/src/components/carousel.tsx +367 -0
  123. package/src/components/chart.tsx +587 -0
  124. package/src/components/checkbox-cards.tsx +92 -0
  125. package/src/components/checkbox-group.tsx +83 -0
  126. package/src/components/checkbox.tsx +65 -0
  127. package/src/components/collapsible.tsx +60 -0
  128. package/src/components/command.tsx +311 -0
  129. package/src/components/context-menu.tsx +489 -0
  130. package/src/components/dialog.tsx +295 -0
  131. package/src/components/drawer.tsx +271 -0
  132. package/src/components/dropdown-menu.tsx +498 -0
  133. package/src/components/empty.tsx +169 -0
  134. package/src/components/field.tsx +362 -0
  135. package/src/components/form.tsx +300 -0
  136. package/src/components/hover-card.tsx +116 -0
  137. package/src/components/input-group.tsx +224 -0
  138. package/src/components/input-number.tsx +161 -0
  139. package/src/components/input-otp.tsx +151 -0
  140. package/src/components/input-password.tsx +74 -0
  141. package/src/components/input-search.tsx +98 -0
  142. package/src/components/input.tsx +52 -0
  143. package/src/components/item.tsx +280 -0
  144. package/src/components/kbd.tsx +59 -0
  145. package/src/components/label.tsx +44 -0
  146. package/src/components/menubar.tsx +531 -0
  147. package/src/components/native-select.tsx +96 -0
  148. package/src/components/navigation-menu.tsx +295 -0
  149. package/src/components/pagination.tsx +204 -0
  150. package/src/components/popover.tsx +139 -0
  151. package/src/components/progress-circle.tsx +203 -0
  152. package/src/components/progress.tsx +54 -0
  153. package/src/components/radio-cards.tsx +85 -0
  154. package/src/components/radio-group.tsx +79 -0
  155. package/src/components/radio.tsx +61 -0
  156. package/src/components/resizable.tsx +99 -0
  157. package/src/components/scroll-area.tsx +115 -0
  158. package/src/components/select.tsx +319 -0
  159. package/src/components/separator.tsx +74 -0
  160. package/src/components/sheet.tsx +278 -0
  161. package/src/components/sidebar.tsx +1056 -0
  162. package/src/components/skeleton.tsx +37 -0
  163. package/src/components/slider.tsx +95 -0
  164. package/src/components/sonner.tsx +47 -0
  165. package/src/components/spinner.tsx +75 -0
  166. package/src/components/switch.tsx +66 -0
  167. package/src/components/table.tsx +200 -0
  168. package/src/components/tabs.tsx +128 -0
  169. package/src/components/textarea.tsx +49 -0
  170. package/src/components/toggle-group.tsx +141 -0
  171. package/src/components/toggle.tsx +39 -0
  172. package/src/components/tooltip.tsx +141 -0
  173. package/src/css/amber.css +59 -22
  174. package/src/css/blue.css +59 -22
  175. package/src/css/cyan.css +59 -22
  176. package/src/css/emerald.css +59 -22
  177. package/src/css/fuchsia.css +59 -22
  178. package/src/css/gray.css +59 -22
  179. package/src/css/green.css +59 -22
  180. package/src/css/indigo.css +59 -22
  181. package/src/css/lime.css +59 -22
  182. package/src/css/neutral.css +59 -22
  183. package/src/css/orange.css +59 -22
  184. package/src/css/pink.css +59 -22
  185. package/src/css/preset.css +32 -13
  186. package/src/css/purple.css +59 -22
  187. package/src/css/red.css +59 -22
  188. package/src/css/rose.css +59 -22
  189. package/src/css/sky.css +59 -22
  190. package/src/css/slate.css +59 -22
  191. package/src/css/stone.css +59 -22
  192. package/src/css/teal.css +59 -22
  193. package/src/css/violet.css +59 -22
  194. package/src/css/yellow.css +59 -22
  195. package/src/css/zinc.css +59 -22
  196. package/src/hooks/use-animated-value.ts +97 -0
  197. package/src/hooks/use-copy-to-clipboard.ts +63 -0
  198. package/src/hooks/use-is-mobile.ts +27 -0
  199. package/src/hooks/use-media-query.ts +71 -0
  200. package/src/hooks/use-mutation-observer.ts +54 -0
  201. package/src/hooks/use-pagination.ts +166 -0
  202. package/src/index.ts +720 -0
  203. package/src/lib/utils.ts +5 -0
  204. package/src/primitives/checkbox-group.tsx +360 -0
  205. package/src/primitives/input-number.tsx +1013 -0
  206. package/src/primitives/input.tsx +243 -0
  207. package/src/primitives/progress-circle.tsx +537 -0
  208. package/src/variants/alert.ts +45 -0
  209. package/src/variants/badge.ts +66 -0
  210. package/src/variants/button-group.ts +49 -0
  211. package/src/variants/button.ts +93 -0
  212. package/src/variants/empty.ts +43 -0
  213. package/src/variants/field.ts +50 -0
  214. package/src/variants/input-group.ts +132 -0
  215. package/src/variants/item.ts +90 -0
  216. package/src/variants/navigation-menu.ts +32 -0
  217. package/src/variants/progress-circle.ts +47 -0
  218. package/src/variants/scroll-area.ts +79 -0
  219. package/src/variants/separator.ts +41 -0
  220. package/src/variants/sheet.ts +70 -0
  221. package/src/variants/sidebar.ts +61 -0
  222. package/src/variants/toggle.ts +59 -0
  223. package/dist/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts +0 -6
@@ -0,0 +1,489 @@
1
+ "use client";
2
+
3
+ import type { ComponentProps, JSX } from "react";
4
+
5
+ import { cn } from "#/lib/utils";
6
+ import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
7
+ import { CheckIcon, ChevronRightIcon, DotIcon } from "lucide-react";
8
+
9
+ /* -----------------------------------------------------------------------------
10
+ * Component: ContextMenu
11
+ * -------------------------------------------------------------------------- */
12
+
13
+ /**
14
+ * @since 0.3.16-canary.0
15
+ */
16
+ type ContextMenuProps = ComponentProps<typeof ContextMenuPrimitive.Root>;
17
+
18
+ /**
19
+ * @since 0.3.16-canary.0
20
+ */
21
+ function ContextMenu({ ...props }: ContextMenuProps): JSX.Element {
22
+ return <ContextMenuPrimitive.Root data-slot="context-menu" {...props} />;
23
+ }
24
+
25
+ /* -----------------------------------------------------------------------------
26
+ * Component: ContextMenuTrigger
27
+ * -------------------------------------------------------------------------- */
28
+
29
+ /**
30
+ * @since 0.3.16-canary.0
31
+ */
32
+ type ContextMenuTriggerProps = ComponentProps<typeof ContextMenuPrimitive.Trigger>;
33
+
34
+ /**
35
+ * @since 0.3.16-canary.0
36
+ */
37
+ function ContextMenuTrigger({ ...props }: ContextMenuTriggerProps): JSX.Element {
38
+ return <ContextMenuPrimitive.Trigger data-slot="context-menu-trigger" {...props} />;
39
+ }
40
+
41
+ /* -----------------------------------------------------------------------------
42
+ * Component: ContextMenuGroup
43
+ * -------------------------------------------------------------------------- */
44
+
45
+ /**
46
+ * @since 0.3.16-canary.0
47
+ */
48
+ type ContextMenuGroupProps = ComponentProps<typeof ContextMenuPrimitive.Group>;
49
+
50
+ /**
51
+ * @since 0.3.16-canary.0
52
+ */
53
+ function ContextMenuGroup({ ...props }: ContextMenuGroupProps): JSX.Element {
54
+ return <ContextMenuPrimitive.Group data-slot="context-menu-group" {...props} />;
55
+ }
56
+
57
+ /* -----------------------------------------------------------------------------
58
+ * Component: ContextMenuSub
59
+ * -------------------------------------------------------------------------- */
60
+
61
+ /**
62
+ * @since 0.3.16-canary.0
63
+ */
64
+ type ContextMenuSubProps = ComponentProps<typeof ContextMenuPrimitive.Sub>;
65
+
66
+ /**
67
+ * @since 0.3.16-canary.0
68
+ */
69
+ function ContextMenuSub({ ...props }: ContextMenuSubProps): JSX.Element {
70
+ return <ContextMenuPrimitive.Sub data-slot="context-menu-sub" {...props} />;
71
+ }
72
+
73
+ /* -----------------------------------------------------------------------------
74
+ * Component: ContextMenuRadioGroup
75
+ * -------------------------------------------------------------------------- */
76
+
77
+ /**
78
+ * @since 0.3.16-canary.0
79
+ */
80
+ type ContextMenuRadioGroupProps = ComponentProps<typeof ContextMenuPrimitive.RadioGroup>;
81
+
82
+ /**
83
+ * @since 0.3.16-canary.0
84
+ */
85
+ function ContextMenuRadioGroup({ ...props }: ContextMenuRadioGroupProps): JSX.Element {
86
+ return <ContextMenuPrimitive.RadioGroup data-slot="context-menu-radio-group" {...props} />;
87
+ }
88
+
89
+ /* -----------------------------------------------------------------------------
90
+ * Component: ContextMenuSubTrigger
91
+ * -------------------------------------------------------------------------- */
92
+
93
+ /**
94
+ * @since 0.3.16-canary.0
95
+ */
96
+ interface ContextMenuSubTriggerProps extends ComponentProps<
97
+ typeof ContextMenuPrimitive.SubTrigger
98
+ > {
99
+ inset?: boolean;
100
+ }
101
+
102
+ /**
103
+ * @since 0.3.16-canary.0
104
+ */
105
+ function ContextMenuSubTrigger({
106
+ children,
107
+ className,
108
+ inset,
109
+ ...props
110
+ }: ContextMenuSubTriggerProps): JSX.Element {
111
+ return (
112
+ <ContextMenuPrimitive.SubTrigger
113
+ className={cn(
114
+ "flex items-center gap-x-2",
115
+ "px-2 py-1.5",
116
+ "rounded-sm outline-hidden",
117
+ "text-sm",
118
+ "cursor-default select-none",
119
+ "focus:bg-accent focus:text-accent-foreground",
120
+ "data-inset:pl-8",
121
+ "data-open:bg-accent data-open:text-accent-foreground",
122
+ "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
123
+ className,
124
+ )}
125
+ data-inset={inset}
126
+ data-slot="context-menu-sub-trigger"
127
+ {...props}
128
+ >
129
+ {children}
130
+ <ChevronRightIcon className={cn("size-4", "ml-auto")} />
131
+ </ContextMenuPrimitive.SubTrigger>
132
+ );
133
+ }
134
+
135
+ /* -----------------------------------------------------------------------------
136
+ * Component: ContextMenuSubContent
137
+ * -------------------------------------------------------------------------- */
138
+
139
+ /**
140
+ * @since 0.3.16-canary.0
141
+ */
142
+ type ContextMenuSubContentProps = ComponentProps<typeof ContextMenuPrimitive.SubContent>;
143
+
144
+ /**
145
+ * @since 0.3.16-canary.0
146
+ */
147
+ function ContextMenuSubContent({ className, ...props }: ContextMenuSubContentProps): JSX.Element {
148
+ return (
149
+ <ContextMenuPrimitive.Portal>
150
+ <ContextMenuPrimitive.SubContent
151
+ className={cn(
152
+ "z-50",
153
+ "min-w-32 overflow-hidden p-1",
154
+ "rounded-lg border",
155
+ "bg-popover text-popover-foreground shadow-lg",
156
+ "ease-snappy data-open:animate-in data-open:duration-200 data-open:fade-in-0 data-open:zoom-in-95",
157
+ "data-open:data-side-top:slide-in-from-bottom-2",
158
+ "data-open:data-side-right:slide-in-from-left-2",
159
+ "data-open:data-side-bottom:slide-in-from-top-2",
160
+ "data-open:data-side-left:slide-in-from-right-2",
161
+ "data-closed:animate-out data-closed:duration-150 data-closed:fade-out-0 data-closed:zoom-out-95",
162
+ "data-closed:data-side-top:slide-out-to-bottom-2",
163
+ "data-closed:data-side-right:slide-out-to-left-2",
164
+ "data-closed:data-side-bottom:slide-out-to-top-2",
165
+ "data-closed:data-side-left:slide-out-to-right-2",
166
+ "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
167
+ "origin-(--radix-context-menu-content-transform-origin)",
168
+ className,
169
+ )}
170
+ data-slot="context-menu-sub-content"
171
+ {...props}
172
+ />
173
+ </ContextMenuPrimitive.Portal>
174
+ );
175
+ }
176
+
177
+ /* -----------------------------------------------------------------------------
178
+ * Component: ContextMenuContent
179
+ * -------------------------------------------------------------------------- */
180
+
181
+ /**
182
+ * @since 0.3.16-canary.0
183
+ */
184
+ type ContextMenuContentProps = ComponentProps<typeof ContextMenuPrimitive.Content>;
185
+
186
+ /**
187
+ * @since 0.3.16-canary.0
188
+ */
189
+ function ContextMenuContent({ className, ...props }: ContextMenuContentProps): JSX.Element {
190
+ return (
191
+ <ContextMenuPrimitive.Portal>
192
+ <ContextMenuPrimitive.Content
193
+ className={cn(
194
+ "z-50",
195
+ "max-h-(--radix-context-menu-content-available-height) min-w-32 overflow-x-hidden overflow-y-auto p-1",
196
+ "rounded-lg border",
197
+ "bg-popover text-popover-foreground shadow-lg",
198
+ "ease-snappy data-open:animate-in data-open:duration-200 data-open:fade-in-0 data-open:zoom-in-95",
199
+ "data-open:data-side-top:slide-in-from-bottom-2",
200
+ "data-open:data-side-right:slide-in-from-left-2",
201
+ "data-open:data-side-bottom:slide-in-from-top-2",
202
+ "data-open:data-side-left:slide-in-from-right-2",
203
+ "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
204
+ "origin-(--radix-context-menu-content-transform-origin)",
205
+ className,
206
+ )}
207
+ data-slot="context-menu-content"
208
+ {...props}
209
+ />
210
+ </ContextMenuPrimitive.Portal>
211
+ );
212
+ }
213
+
214
+ /* -----------------------------------------------------------------------------
215
+ * Component: ContextMenuItem
216
+ * -------------------------------------------------------------------------- */
217
+
218
+ /**
219
+ * @since 0.3.16-canary.0
220
+ */
221
+ interface ContextMenuItemProps extends ComponentProps<typeof ContextMenuPrimitive.Item> {
222
+ inset?: boolean;
223
+ variant?: "default" | "destructive";
224
+ }
225
+
226
+ /**
227
+ * @since 0.3.16-canary.0
228
+ */
229
+ function ContextMenuItem({
230
+ className,
231
+ inset,
232
+ variant,
233
+ ...props
234
+ }: ContextMenuItemProps): JSX.Element {
235
+ return (
236
+ <ContextMenuPrimitive.Item
237
+ className={cn(
238
+ "group/context-menu-item relative flex items-center gap-x-2",
239
+ "px-2 py-1.5",
240
+ "rounded-sm outline-hidden",
241
+ "text-sm",
242
+ "cursor-default select-none",
243
+ "focus:bg-accent focus:text-accent-foreground",
244
+ "aria-disabled:opacity-50",
245
+ "data-inset:pl-8",
246
+ "data-[variant=destructive]:text-destructive",
247
+ "data-[variant=destructive]:focus:bg-destructive/10",
248
+ "dark:data-[variant=destructive]:focus:bg-destructive/20",
249
+ "data-[variant=destructive]:[&_svg:not([class*='text-'])]:text-destructive/80",
250
+ "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
251
+ "[&_svg:not([class*='text-'])]:text-muted-foreground",
252
+ className,
253
+ )}
254
+ data-inset={inset}
255
+ data-slot="context-menu-item"
256
+ data-variant={variant}
257
+ {...props}
258
+ />
259
+ );
260
+ }
261
+
262
+ /* -----------------------------------------------------------------------------
263
+ * Component: ContextMenuCheckboxItem
264
+ * -------------------------------------------------------------------------- */
265
+
266
+ /**
267
+ * @since 0.3.16-canary.0
268
+ */
269
+ type ContextMenuCheckboxItemProps = ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>;
270
+
271
+ /**
272
+ * @since 0.3.16-canary.0
273
+ */
274
+ function ContextMenuCheckboxItem({
275
+ checked,
276
+ children,
277
+ className,
278
+ ...props
279
+ }: ContextMenuCheckboxItemProps): JSX.Element {
280
+ return (
281
+ <ContextMenuPrimitive.CheckboxItem
282
+ checked={checked}
283
+ className={cn(
284
+ "group/context-menu-item relative flex items-center gap-x-2",
285
+ "py-1.5 pr-2 pl-8",
286
+ "rounded-sm outline-hidden",
287
+ "text-sm",
288
+ "cursor-default select-none",
289
+ "focus:bg-accent focus:text-accent-foreground",
290
+ "aria-disabled:opacity-50",
291
+ "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
292
+ className,
293
+ )}
294
+ data-slot="context-menu-checkbox-item"
295
+ {...props}
296
+ >
297
+ <span className={cn("absolute flex items-center justify-center", "left-2")}>
298
+ <ContextMenuPrimitive.ItemIndicator>
299
+ <CheckIcon className="size-4" />
300
+ </ContextMenuPrimitive.ItemIndicator>
301
+ </span>
302
+ {children}
303
+ </ContextMenuPrimitive.CheckboxItem>
304
+ );
305
+ }
306
+
307
+ /* -----------------------------------------------------------------------------
308
+ * Component: ContextMenuRadioItem
309
+ * -------------------------------------------------------------------------- */
310
+
311
+ /**
312
+ * @since 0.3.16-canary.0
313
+ */
314
+ type ContextMenuRadioItemProps = ComponentProps<typeof ContextMenuPrimitive.RadioItem>;
315
+
316
+ /**
317
+ * @since 0.3.16-canary.0
318
+ */
319
+ function ContextMenuRadioItem({
320
+ children,
321
+ className,
322
+ ...props
323
+ }: ContextMenuRadioItemProps): JSX.Element {
324
+ return (
325
+ <ContextMenuPrimitive.RadioItem
326
+ className={cn(
327
+ "group/context-menu-item relative flex items-center gap-x-2",
328
+ "py-1.5 pr-2 pl-8",
329
+ "rounded-sm outline-hidden",
330
+ "text-sm",
331
+ "cursor-default select-none",
332
+ "focus:bg-accent focus:text-accent-foreground",
333
+ "aria-disabled:opacity-50",
334
+ "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
335
+ className,
336
+ )}
337
+ data-slot="context-menu-radio-item"
338
+ {...props}
339
+ >
340
+ <span className={cn("absolute flex items-center justify-center", "left-2")}>
341
+ <ContextMenuPrimitive.ItemIndicator>
342
+ <DotIcon className={cn("size-4", "fill-current")} />
343
+ </ContextMenuPrimitive.ItemIndicator>
344
+ </span>
345
+ {children}
346
+ </ContextMenuPrimitive.RadioItem>
347
+ );
348
+ }
349
+
350
+ /* -----------------------------------------------------------------------------
351
+ * Component: ContextMenuLabel
352
+ * -------------------------------------------------------------------------- */
353
+
354
+ /**
355
+ * @since 0.3.16-canary.0
356
+ */
357
+ interface ContextMenuLabelProps extends ComponentProps<typeof ContextMenuPrimitive.Label> {
358
+ inset?: boolean;
359
+ }
360
+
361
+ /**
362
+ * @since 0.3.16-canary.0
363
+ */
364
+ function ContextMenuLabel({ className, inset, ...props }: ContextMenuLabelProps): JSX.Element {
365
+ return (
366
+ <ContextMenuPrimitive.Label
367
+ className={cn(
368
+ "flex items-center gap-x-2",
369
+ "px-2 py-1.5",
370
+ "text-sm font-semibold",
371
+ "data-inset:pl-8",
372
+ className,
373
+ )}
374
+ data-inset={inset}
375
+ data-slot="context-menu-label"
376
+ {...props}
377
+ />
378
+ );
379
+ }
380
+
381
+ /* -----------------------------------------------------------------------------
382
+ * Component: ContextMenuSeparator
383
+ * -------------------------------------------------------------------------- */
384
+
385
+ /**
386
+ * @since 0.3.16-canary.0
387
+ */
388
+ type ContextMenuSeparatorProps = ComponentProps<typeof ContextMenuPrimitive.Separator>;
389
+
390
+ /**
391
+ * @since 0.3.16-canary.0
392
+ */
393
+ function ContextMenuSeparator({ className, ...props }: ContextMenuSeparatorProps): JSX.Element {
394
+ return (
395
+ <ContextMenuPrimitive.Separator
396
+ className={cn("mx-2 my-1 h-px", "bg-border", className)}
397
+ data-slot="context-menu-separator"
398
+ {...props}
399
+ />
400
+ );
401
+ }
402
+
403
+ /* -----------------------------------------------------------------------------
404
+ * Component: ContextMenuShortcut
405
+ * -------------------------------------------------------------------------- */
406
+
407
+ /**
408
+ * @since 0.3.16-canary.0
409
+ */
410
+ type ContextMenuShortcutProps = ComponentProps<"span">;
411
+
412
+ /**
413
+ * @since 0.3.16-canary.0
414
+ */
415
+ function ContextMenuShortcut({ className, ...props }: ContextMenuShortcutProps): JSX.Element {
416
+ return (
417
+ <span
418
+ className={cn(
419
+ "ml-auto",
420
+ "text-xs tracking-widest text-muted-foreground",
421
+ "group-data-[variant=destructive]/context-menu-item:text-destructive/80",
422
+ className,
423
+ )}
424
+ data-slot="context-menu-shortcut"
425
+ {...props}
426
+ />
427
+ );
428
+ }
429
+
430
+ /* -----------------------------------------------------------------------------
431
+ * Component: ContextMenuArrow
432
+ * -------------------------------------------------------------------------- */
433
+
434
+ /**
435
+ * @since 0.3.16-canary.0
436
+ */
437
+ type ContextMenuArrowProps = ComponentProps<typeof ContextMenuPrimitive.Arrow>;
438
+
439
+ /**
440
+ * @since 0.3.16-canary.0
441
+ */
442
+ function ContextMenuArrow({ className, ...props }: ContextMenuArrowProps): JSX.Element {
443
+ return (
444
+ <ContextMenuPrimitive.Arrow
445
+ className={cn("fill-popover", className)}
446
+ data-slot="context-menu-arrow"
447
+ {...props}
448
+ />
449
+ );
450
+ }
451
+
452
+ /* -----------------------------------------------------------------------------
453
+ * Exports
454
+ * -------------------------------------------------------------------------- */
455
+
456
+ export {
457
+ ContextMenu,
458
+ ContextMenuArrow,
459
+ ContextMenuCheckboxItem,
460
+ ContextMenuContent,
461
+ ContextMenuGroup,
462
+ ContextMenuItem,
463
+ ContextMenuLabel,
464
+ ContextMenuRadioGroup,
465
+ ContextMenuRadioItem,
466
+ ContextMenuSeparator,
467
+ ContextMenuShortcut,
468
+ ContextMenuSub,
469
+ ContextMenuSubContent,
470
+ ContextMenuSubTrigger,
471
+ ContextMenuTrigger,
472
+ };
473
+ export type {
474
+ ContextMenuArrowProps,
475
+ ContextMenuCheckboxItemProps,
476
+ ContextMenuContentProps,
477
+ ContextMenuGroupProps,
478
+ ContextMenuItemProps,
479
+ ContextMenuLabelProps,
480
+ ContextMenuProps,
481
+ ContextMenuRadioGroupProps,
482
+ ContextMenuRadioItemProps,
483
+ ContextMenuSeparatorProps,
484
+ ContextMenuShortcutProps,
485
+ ContextMenuSubContentProps,
486
+ ContextMenuSubProps,
487
+ ContextMenuSubTriggerProps,
488
+ ContextMenuTriggerProps,
489
+ };