@codefast/ui 0.3.16-canary.3 → 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 (281) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +27 -16
  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 +12 -2
  8. package/dist/components/alert.mjs +15 -6
  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.mjs +4 -4
  14. package/dist/components/breadcrumb.d.mts +1 -0
  15. package/dist/components/breadcrumb.mjs +11 -10
  16. package/dist/components/button-group.d.mts +1 -1
  17. package/dist/components/button-group.mjs +6 -7
  18. package/dist/components/button.d.mts +0 -1
  19. package/dist/components/button.mjs +7 -7
  20. package/dist/components/calendar.d.mts +6 -2
  21. package/dist/components/calendar.mjs +39 -43
  22. package/dist/components/card.d.mts +4 -2
  23. package/dist/components/card.mjs +9 -9
  24. package/dist/components/carousel.d.mts +16 -4
  25. package/dist/components/carousel.mjs +24 -11
  26. package/dist/components/chart.d.mts +8 -3
  27. package/dist/components/chart.mjs +21 -15
  28. package/dist/components/checkbox-cards.mjs +4 -4
  29. package/dist/components/checkbox-group.mjs +3 -4
  30. package/dist/components/checkbox.d.mts +2 -2
  31. package/dist/components/checkbox.mjs +6 -7
  32. package/dist/components/collapsible.d.mts +4 -4
  33. package/dist/components/collapsible.mjs +4 -5
  34. package/dist/components/command.d.mts +11 -1
  35. package/dist/components/command.mjs +35 -32
  36. package/dist/components/context-menu.d.mts +22 -15
  37. package/dist/components/context-menu.mjs +44 -39
  38. package/dist/components/dialog.d.mts +19 -23
  39. package/dist/components/dialog.mjs +48 -47
  40. package/dist/components/direction.d.mts +24 -0
  41. package/dist/components/direction.mjs +18 -0
  42. package/dist/components/drawer.d.mts +2 -20
  43. package/dist/components/drawer.mjs +17 -25
  44. package/dist/components/dropdown-menu.d.mts +22 -15
  45. package/dist/components/dropdown-menu.mjs +41 -37
  46. package/dist/components/empty.mjs +5 -5
  47. package/dist/components/field.d.mts +1 -1
  48. package/dist/components/field.mjs +11 -12
  49. package/dist/components/form.d.mts +6 -7
  50. package/dist/components/form.mjs +6 -7
  51. package/dist/components/hover-card.d.mts +5 -5
  52. package/dist/components/hover-card.mjs +14 -12
  53. package/dist/components/input-group.d.mts +1 -1
  54. package/dist/components/input-group.mjs +12 -7
  55. package/dist/components/input-number.d.mts +3 -1
  56. package/dist/components/input-number.mjs +49 -27
  57. package/dist/components/input-otp.mjs +9 -7
  58. package/dist/components/input-password.mjs +1 -4
  59. package/dist/components/input-search.mjs +3 -5
  60. package/dist/components/input.mjs +1 -2
  61. package/dist/components/item.mjs +9 -9
  62. package/dist/components/kbd.mjs +1 -1
  63. package/dist/components/label.d.mts +2 -2
  64. package/dist/components/label.mjs +3 -4
  65. package/dist/components/menubar.d.mts +22 -16
  66. package/dist/components/menubar.mjs +54 -47
  67. package/dist/components/native-select.d.mts +5 -1
  68. package/dist/components/native-select.mjs +9 -6
  69. package/dist/components/navigation-menu.d.mts +30 -8
  70. package/dist/components/navigation-menu.mjs +33 -23
  71. package/dist/components/pagination.d.mts +6 -0
  72. package/dist/components/pagination.mjs +26 -11
  73. package/dist/components/popover.d.mts +40 -7
  74. package/dist/components/popover.mjs +46 -14
  75. package/dist/components/progress-circle.d.mts +1 -1
  76. package/dist/components/progress-circle.mjs +1 -2
  77. package/dist/components/progress.d.mts +2 -2
  78. package/dist/components/progress.mjs +5 -6
  79. package/dist/components/radio-cards.d.mts +3 -3
  80. package/dist/components/radio-cards.mjs +11 -11
  81. package/dist/components/radio-group.d.mts +3 -3
  82. package/dist/components/radio-group.mjs +9 -9
  83. package/dist/components/radio.mjs +2 -3
  84. package/dist/components/resizable.mjs +3 -8
  85. package/dist/components/scroll-area.d.mts +5 -5
  86. package/dist/components/scroll-area.mjs +13 -10
  87. package/dist/components/select.d.mts +14 -14
  88. package/dist/components/select.mjs +47 -47
  89. package/dist/components/separator.d.mts +2 -2
  90. package/dist/components/separator.mjs +3 -4
  91. package/dist/components/sheet.d.mts +13 -14
  92. package/dist/components/sheet.mjs +41 -39
  93. package/dist/components/sidebar.d.mts +2 -3
  94. package/dist/components/sidebar.mjs +46 -46
  95. package/dist/components/skeleton.mjs +1 -1
  96. package/dist/components/slider.d.mts +2 -2
  97. package/dist/components/slider.mjs +9 -11
  98. package/dist/components/sonner.mjs +11 -3
  99. package/dist/components/spinner.mjs +6 -7
  100. package/dist/components/switch.d.mts +5 -2
  101. package/dist/components/switch.mjs +7 -7
  102. package/dist/components/table.mjs +10 -10
  103. package/dist/components/tabs.d.mts +8 -5
  104. package/dist/components/tabs.mjs +18 -12
  105. package/dist/components/textarea.mjs +1 -1
  106. package/dist/components/toggle-group.d.mts +9 -6
  107. package/dist/components/toggle-group.mjs +19 -20
  108. package/dist/components/toggle.d.mts +2 -3
  109. package/dist/components/toggle.mjs +4 -6
  110. package/dist/components/tooltip.d.mts +7 -6
  111. package/dist/components/tooltip.mjs +19 -17
  112. package/dist/hooks/use-animated-value.mjs +0 -1
  113. package/dist/hooks/use-copy-to-clipboard.mjs +0 -1
  114. package/dist/hooks/use-is-mobile.mjs +0 -1
  115. package/dist/hooks/use-media-query.mjs +0 -1
  116. package/dist/hooks/use-mutation-observer.mjs +0 -1
  117. package/dist/hooks/use-pagination.mjs +0 -1
  118. package/dist/index.d.mts +15 -13
  119. package/dist/index.mjs +18 -16
  120. package/dist/primitives/checkbox-group.d.mts +9 -10
  121. package/dist/primitives/checkbox-group.mjs +14 -19
  122. package/dist/primitives/input-number.d.mts +3 -3
  123. package/dist/primitives/input-number.mjs +3 -5
  124. package/dist/primitives/input.d.mts +4 -4
  125. package/dist/primitives/input.mjs +2 -3
  126. package/dist/primitives/progress-circle.d.mts +3 -3
  127. package/dist/primitives/progress-circle.mjs +2 -3
  128. package/dist/variants/alert.d.mts +1 -1
  129. package/dist/variants/alert.mjs +3 -13
  130. package/dist/variants/badge.d.mts +6 -4
  131. package/dist/variants/badge.mjs +7 -34
  132. package/dist/variants/button-group.d.mts +2 -2
  133. package/dist/variants/button-group.mjs +3 -14
  134. package/dist/variants/button.d.mts +12 -10
  135. package/dist/variants/button.mjs +15 -57
  136. package/dist/variants/empty.d.mts +1 -1
  137. package/dist/variants/empty.mjs +2 -7
  138. package/dist/variants/field.d.mts +3 -3
  139. package/dist/variants/field.mjs +4 -22
  140. package/dist/variants/input-group.d.mts +9 -9
  141. package/dist/variants/input-group.mjs +11 -70
  142. package/dist/variants/input-number.d.mts +45 -0
  143. package/dist/variants/input-number.mjs +40 -0
  144. package/dist/variants/item.d.mts +5 -4
  145. package/dist/variants/item.mjs +9 -31
  146. package/dist/variants/navigation-menu.d.mts +1 -1
  147. package/dist/variants/navigation-menu.mjs +1 -5
  148. package/dist/variants/progress-circle.d.mts +1 -1
  149. package/dist/variants/progress-circle.mjs +1 -5
  150. package/dist/variants/scroll-area.d.mts +2 -2
  151. package/dist/variants/scroll-area.mjs +3 -8
  152. package/dist/variants/separator.mjs +6 -6
  153. package/dist/variants/sheet.d.mts +4 -4
  154. package/dist/variants/sheet.mjs +5 -38
  155. package/dist/variants/sidebar.d.mts +4 -4
  156. package/dist/variants/sidebar.mjs +6 -23
  157. package/dist/variants/tabs.d.mts +18 -0
  158. package/dist/variants/tabs.mjs +15 -0
  159. package/dist/variants/toggle.d.mts +4 -4
  160. package/dist/variants/toggle.mjs +9 -27
  161. package/package.json +27 -44
  162. package/src/components/accordion.tsx +26 -68
  163. package/src/components/alert-dialog.tsx +70 -86
  164. package/src/components/alert.tsx +27 -19
  165. package/src/components/aspect-ratio.tsx +1 -4
  166. package/src/components/avatar.tsx +99 -12
  167. package/src/components/badge.tsx +5 -8
  168. package/src/components/breadcrumb.tsx +18 -24
  169. package/src/components/button-group.tsx +10 -20
  170. package/src/components/button.tsx +8 -19
  171. package/src/components/calendar.tsx +77 -132
  172. package/src/components/card.tsx +16 -22
  173. package/src/components/carousel.tsx +38 -56
  174. package/src/components/chart.tsx +41 -92
  175. package/src/components/checkbox-cards.tsx +10 -30
  176. package/src/components/checkbox-group.tsx +5 -28
  177. package/src/components/checkbox.tsx +5 -26
  178. package/src/components/collapsible.tsx +1 -4
  179. package/src/components/command.tsx +52 -65
  180. package/src/components/context-menu.tsx +46 -125
  181. package/src/components/dialog.tsx +49 -101
  182. package/src/components/direction.tsx +32 -0
  183. package/src/components/drawer.tsx +17 -79
  184. package/src/components/dropdown-menu.tsx +39 -118
  185. package/src/components/empty.tsx +6 -20
  186. package/src/components/field.tsx +19 -52
  187. package/src/components/form.tsx +19 -61
  188. package/src/components/hover-card.tsx +4 -27
  189. package/src/components/input-group.tsx +13 -52
  190. package/src/components/input-number.tsx +55 -75
  191. package/src/components/input-otp.tsx +19 -38
  192. package/src/components/input-password.tsx +5 -29
  193. package/src/components/input-search.tsx +6 -23
  194. package/src/components/input.tsx +1 -17
  195. package/src/components/item.tsx +17 -31
  196. package/src/components/kbd.tsx +2 -14
  197. package/src/components/label.tsx +2 -10
  198. package/src/components/menubar.tsx +34 -125
  199. package/src/components/native-select.tsx +21 -30
  200. package/src/components/navigation-menu.tsx +34 -94
  201. package/src/components/pagination.tsx +28 -34
  202. package/src/components/popover.tsx +66 -35
  203. package/src/components/progress-circle.tsx +7 -25
  204. package/src/components/progress.tsx +3 -16
  205. package/src/components/radio-cards.tsx +8 -27
  206. package/src/components/radio-group.tsx +7 -27
  207. package/src/components/radio.tsx +3 -24
  208. package/src/components/resizable.tsx +5 -26
  209. package/src/components/scroll-area.tsx +12 -32
  210. package/src/components/select.tsx +36 -59
  211. package/src/components/separator.tsx +4 -18
  212. package/src/components/sheet.tsx +37 -74
  213. package/src/components/sidebar.tsx +47 -177
  214. package/src/components/skeleton.tsx +1 -3
  215. package/src/components/slider.tsx +7 -36
  216. package/src/components/sonner.tsx +16 -6
  217. package/src/components/spinner.tsx +6 -15
  218. package/src/components/switch.tsx +8 -30
  219. package/src/components/table.tsx +18 -35
  220. package/src/components/tabs.tsx +16 -34
  221. package/src/components/textarea.tsx +1 -15
  222. package/src/components/toggle-group.tsx +34 -38
  223. package/src/components/toggle.tsx +4 -13
  224. package/src/components/tooltip.tsx +11 -37
  225. package/src/css/foundation/base.css +50 -0
  226. package/src/css/foundation/motion.css +36 -0
  227. package/src/css/foundation/source.css +3 -0
  228. package/src/css/foundation/tokens.css +71 -0
  229. package/src/css/foundation/variants.css +113 -0
  230. package/src/css/preset.css +5 -214
  231. package/src/css/style.css +1 -1
  232. package/src/hooks/use-animated-value.ts +1 -7
  233. package/src/hooks/use-copy-to-clipboard.ts +1 -6
  234. package/src/hooks/use-is-mobile.ts +0 -2
  235. package/src/hooks/use-media-query.ts +0 -2
  236. package/src/hooks/use-mutation-observer.ts +0 -3
  237. package/src/hooks/use-pagination.ts +0 -2
  238. package/src/index.ts +39 -80
  239. package/src/primitives/checkbox-group.tsx +25 -39
  240. package/src/primitives/input-number.tsx +17 -63
  241. package/src/primitives/input.tsx +8 -24
  242. package/src/primitives/progress-circle.tsx +13 -43
  243. package/src/variants/alert.ts +3 -14
  244. package/src/variants/badge.ts +8 -35
  245. package/src/variants/button-group.ts +5 -18
  246. package/src/variants/button.ts +21 -58
  247. package/src/variants/empty.ts +2 -11
  248. package/src/variants/field.ts +6 -19
  249. package/src/variants/input-group.ts +12 -64
  250. package/src/variants/input-number.ts +65 -0
  251. package/src/variants/item.ts +10 -32
  252. package/src/variants/navigation-menu.ts +1 -8
  253. package/src/variants/progress-circle.ts +1 -2
  254. package/src/variants/scroll-area.ts +3 -9
  255. package/src/variants/separator.ts +6 -7
  256. package/src/variants/sheet.ts +6 -39
  257. package/src/variants/sidebar.ts +7 -27
  258. package/src/variants/tabs.ts +34 -0
  259. package/src/variants/toggle.ts +9 -28
  260. /package/src/css/{amber.css → themes/amber.css} +0 -0
  261. /package/src/css/{blue.css → themes/blue.css} +0 -0
  262. /package/src/css/{cyan.css → themes/cyan.css} +0 -0
  263. /package/src/css/{emerald.css → themes/emerald.css} +0 -0
  264. /package/src/css/{fuchsia.css → themes/fuchsia.css} +0 -0
  265. /package/src/css/{gray.css → themes/gray.css} +0 -0
  266. /package/src/css/{green.css → themes/green.css} +0 -0
  267. /package/src/css/{indigo.css → themes/indigo.css} +0 -0
  268. /package/src/css/{lime.css → themes/lime.css} +0 -0
  269. /package/src/css/{neutral.css → themes/neutral.css} +0 -0
  270. /package/src/css/{orange.css → themes/orange.css} +0 -0
  271. /package/src/css/{pink.css → themes/pink.css} +0 -0
  272. /package/src/css/{purple.css → themes/purple.css} +0 -0
  273. /package/src/css/{red.css → themes/red.css} +0 -0
  274. /package/src/css/{rose.css → themes/rose.css} +0 -0
  275. /package/src/css/{sky.css → themes/sky.css} +0 -0
  276. /package/src/css/{slate.css → themes/slate.css} +0 -0
  277. /package/src/css/{stone.css → themes/stone.css} +0 -0
  278. /package/src/css/{teal.css → themes/teal.css} +0 -0
  279. /package/src/css/{violet.css → themes/violet.css} +0 -0
  280. /package/src/css/{yellow.css → themes/yellow.css} +0 -0
  281. /package/src/css/{zinc.css → themes/zinc.css} +0 -0
@@ -1,10 +1,8 @@
1
- "use client";
2
-
1
+ import { CheckIcon } from "lucide-react";
2
+ import { Checkbox as CheckboxPrimitive } from "radix-ui";
3
3
  import type { ComponentProps, JSX } from "react";
4
4
 
5
5
  import { cn } from "#/lib/utils";
6
- import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
7
- import { CheckIcon } from "lucide-react";
8
6
 
9
7
  /* -----------------------------------------------------------------------------
10
8
  * Component: Checkbox
@@ -22,36 +20,17 @@ function Checkbox({ className, ...props }: CheckboxProps): JSX.Element {
22
20
  return (
23
21
  <CheckboxPrimitive.Root
24
22
  className={cn(
25
- "peer flex size-4 shrink-0 items-center justify-center",
26
- "rounded-sm border border-input shadow-xs outline-hidden",
27
- "text-primary-foreground",
28
- "transition-[border-color,background-color,box-shadow] duration-150 ease-spring",
29
- "motion-reduce:transition-none motion-reduce:duration-0",
30
- "hover:not-disabled:not-aria-checked:border-ring/60",
31
- "focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50",
32
- "disabled:opacity-50",
33
- "aria-checked:border-primary aria-checked:bg-primary",
34
- "aria-checked:focus-visible:ring-primary/20",
35
- "aria-invalid:border-destructive aria-invalid:ring-destructive/20",
36
- "hover:not-disabled:not-aria-checked:aria-invalid:border-destructive/60",
37
- "aria-checked:aria-invalid:bg-destructive",
38
- "dark:bg-input/30",
39
- "dark:aria-checked:focus-visible:ring-primary/40",
40
- "dark:aria-invalid:ring-destructive/40",
23
+ "peer relative flex size-4 shrink-0 items-center justify-center rounded-sm border border-input shadow-xs transition-shadow outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary",
41
24
  className,
42
25
  )}
43
26
  data-slot="checkbox"
44
27
  {...props}
45
28
  >
46
29
  <CheckboxPrimitive.Indicator
47
- className={cn(
48
- "flex items-center justify-center text-current",
49
- "animate-in duration-150 ease-spring zoom-in-50",
50
- "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
51
- )}
30
+ className="grid place-content-center text-current transition-none [&>svg]:size-3.5"
52
31
  data-slot="checkbox-indicator"
53
32
  >
54
- <CheckIcon className="size-3.5" />
33
+ <CheckIcon />
55
34
  </CheckboxPrimitive.Indicator>
56
35
  </CheckboxPrimitive.Root>
57
36
  );
@@ -1,9 +1,6 @@
1
- "use client";
2
-
1
+ import { Collapsible as CollapsiblePrimitive } from "radix-ui";
3
2
  import type { ComponentProps, JSX } from "react";
4
3
 
5
- import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
6
-
7
4
  /* -----------------------------------------------------------------------------
8
5
  * Component: Collapsible
9
6
  * -------------------------------------------------------------------------- */
@@ -1,13 +1,10 @@
1
- "use client";
2
-
1
+ import { Command as CommandPrimitive } from "cmdk";
2
+ import { CheckIcon, SearchIcon } from "lucide-react";
3
3
  import type { ComponentProps, JSX } from "react";
4
4
 
5
+ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "#/components/dialog";
6
+ import { InputGroup, InputGroupAddon } from "#/components/input-group";
5
7
  import { cn } from "#/lib/utils";
6
- import { VisuallyHidden } from "@radix-ui/react-visually-hidden";
7
- import { Command as CommandPrimitive } from "cmdk";
8
- import { SearchIcon } from "lucide-react";
9
-
10
- import { Dialog, DialogContent, DialogDescription, DialogTitle } from "#/components/dialog";
11
8
 
12
9
  /* -----------------------------------------------------------------------------
13
10
  * Component: Command
@@ -25,9 +22,7 @@ function Command({ className, ...props }: CommandProps): JSX.Element {
25
22
  return (
26
23
  <CommandPrimitive
27
24
  className={cn(
28
- "flex flex-col overflow-hidden",
29
- "rounded-[inherit]",
30
- "bg-popover text-popover-foreground outline-hidden",
25
+ "flex size-full flex-col overflow-hidden rounded-xl! bg-popover p-1 text-popover-foreground",
31
26
  className,
32
27
  )}
33
28
  data-slot="command"
@@ -43,33 +38,36 @@ function Command({ className, ...props }: CommandProps): JSX.Element {
43
38
  /**
44
39
  * @since 0.3.16-canary.0
45
40
  */
46
- type CommandDialogProps = ComponentProps<typeof Dialog>;
41
+ interface CommandDialogProps extends ComponentProps<typeof Dialog> {
42
+ className?: string;
43
+ description?: string;
44
+ showCloseButton?: boolean;
45
+ title?: string;
46
+ }
47
47
 
48
48
  /**
49
49
  * @since 0.3.16-canary.0
50
50
  */
51
- function CommandDialog({ children, ...props }: CommandDialogProps): JSX.Element {
51
+ function CommandDialog({
52
+ children,
53
+ className,
54
+ description = "Search for a command to run...",
55
+ showCloseButton = false,
56
+ title = "Command Palette",
57
+ ...props
58
+ }: CommandDialogProps): JSX.Element {
52
59
  return (
53
60
  <Dialog data-slot="command-dialog" {...props}>
61
+ <DialogHeader className="sr-only">
62
+ <DialogTitle>{title}</DialogTitle>
63
+ <DialogDescription>{description}</DialogDescription>
64
+ </DialogHeader>
54
65
  <DialogContent
55
- className={cn("rounded-t-lg", "sm:rounded-lg")}
66
+ className={cn("top-1/3 translate-y-0 overflow-hidden rounded-xl p-0", className)}
56
67
  data-slot="command-dialog-content"
68
+ showCloseButton={showCloseButton}
57
69
  >
58
- <VisuallyHidden>
59
- <DialogTitle>Search command</DialogTitle>
60
- <DialogDescription>
61
- Use the search bar to find and select the desired command.
62
- </DialogDescription>
63
- </VisuallyHidden>
64
- <Command
65
- className={cn(
66
- "[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
67
- "[&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0",
68
- "[&_[cmdk-input]]:h-12",
69
- )}
70
- >
71
- {children}
72
- </Command>
70
+ {children}
73
71
  </DialogContent>
74
72
  </Dialog>
75
73
  );
@@ -89,25 +87,17 @@ type CommandInputProps = ComponentProps<typeof CommandPrimitive.Input>;
89
87
  */
90
88
  function CommandInput({ className, ...props }: CommandInputProps): JSX.Element {
91
89
  return (
92
- <div
93
- cmdk-input-wrapper
94
- className={cn("flex items-center gap-2", "px-3", "border-b")}
95
- data-slot="command-input-wrapper"
96
- >
97
- <SearchIcon className={cn("size-4 shrink-0", "opacity-50")} />
98
- <CommandPrimitive.Input
99
- className={cn(
100
- "flex h-10 w-full",
101
- "text-base",
102
- "outline-hidden",
103
- "placeholder:text-muted-foreground",
104
- "disabled:opacity-50",
105
- "md:text-sm",
106
- className,
107
- )}
108
- data-slot="command-input"
109
- {...props}
110
- />
90
+ <div className="p-1 pb-0" data-slot="command-input-wrapper">
91
+ <InputGroup className="h-8! rounded-lg! border-input/30 bg-input/30 shadow-none! *:data-[slot=input-group-addon]:pl-2!">
92
+ <CommandPrimitive.Input
93
+ className={cn("w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50", className)}
94
+ data-slot="command-input"
95
+ {...props}
96
+ />
97
+ <InputGroupAddon>
98
+ <SearchIcon className="size-4 shrink-0 opacity-50" />
99
+ </InputGroupAddon>
100
+ </InputGroup>
111
101
  </div>
112
102
  );
113
103
  }
@@ -127,7 +117,7 @@ type CommandListProps = ComponentProps<typeof CommandPrimitive.List>;
127
117
  function CommandList({ className, ...props }: CommandListProps): JSX.Element {
128
118
  return (
129
119
  <CommandPrimitive.List
130
- className={cn("max-h-75 overflow-x-hidden overflow-y-auto", className)}
120
+ className={cn("max-h-72 scroll-py-1 scrollbar-none overflow-x-hidden overflow-y-auto outline-none", className)}
131
121
  data-slot="command-list"
132
122
  {...props}
133
123
  />
@@ -149,7 +139,7 @@ type CommandEmptyProps = ComponentProps<typeof CommandPrimitive.Empty>;
149
139
  function CommandEmpty({ className, ...props }: CommandEmptyProps): JSX.Element {
150
140
  return (
151
141
  <CommandPrimitive.Empty
152
- className={cn("py-6", "text-center text-sm", className)}
142
+ className={cn("py-6 text-center text-sm", className)}
153
143
  data-slot="command-empty"
154
144
  {...props}
155
145
  />
@@ -172,8 +162,7 @@ function CommandGroup({ className, ...props }: CommandGroupProps): JSX.Element {
172
162
  return (
173
163
  <CommandPrimitive.Group
174
164
  className={cn(
175
- "overflow-hidden p-1 text-foreground",
176
- "[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
165
+ "overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground",
177
166
  className,
178
167
  )}
179
168
  data-slot="command-group"
@@ -197,7 +186,7 @@ type CommandSeparatorProps = ComponentProps<typeof CommandPrimitive.Separator>;
197
186
  function CommandSeparator({ className, ...props }: CommandSeparatorProps): JSX.Element {
198
187
  return (
199
188
  <CommandPrimitive.Separator
200
- className={cn("-mx-1 h-px", "bg-border", className)}
189
+ className={cn("-mx-1 h-px w-auto bg-border", className)}
201
190
  data-slot="command-separator"
202
191
  {...props}
203
192
  />
@@ -216,24 +205,19 @@ type CommandItemProps = ComponentProps<typeof CommandPrimitive.Item>;
216
205
  /**
217
206
  * @since 0.3.16-canary.0
218
207
  */
219
- function CommandItem({ className, ...props }: CommandItemProps): JSX.Element {
208
+ function CommandItem({ children, className, ...props }: CommandItemProps): JSX.Element {
220
209
  return (
221
210
  <CommandPrimitive.Item
222
211
  className={cn(
223
- "group/command-item relative flex items-center gap-x-2",
224
- "px-2 py-1.5",
225
- "rounded-sm outline-hidden",
226
- "text-sm",
227
- "cursor-default select-none",
228
- "aria-disabled:opacity-50",
229
- "aria-selected:bg-accent aria-selected:text-accent-foreground",
230
- "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
231
- "[&_svg:not([class*='text-'])]:text-muted-foreground",
212
+ "group/command-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-lg! data-selected:bg-muted data-selected:text-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:**:[svg]:text-foreground",
232
213
  className,
233
214
  )}
234
215
  data-slot="command-item"
235
216
  {...props}
236
- />
217
+ >
218
+ {children}
219
+ <CheckIcon className="ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-checked/command-item:opacity-100" />
220
+ </CommandPrimitive.Item>
237
221
  );
238
222
  }
239
223
 
@@ -252,7 +236,7 @@ type CommandLoadingProps = ComponentProps<typeof CommandPrimitive.Loading>;
252
236
  function CommandLoading({ className, ...props }: CommandLoadingProps): JSX.Element {
253
237
  return (
254
238
  <CommandPrimitive.Loading
255
- className={cn("flex justify-center", "p-2", className)}
239
+ className={cn("flex justify-center p-2", className)}
256
240
  data-slot="command-loading"
257
241
  {...props}
258
242
  />
@@ -274,7 +258,10 @@ type CommandShortcutProps = ComponentProps<"span">;
274
258
  function CommandShortcut({ className, ...props }: CommandShortcutProps): JSX.Element {
275
259
  return (
276
260
  <span
277
- className={cn("ml-auto", "text-xs tracking-widest text-muted-foreground", className)}
261
+ className={cn(
262
+ "ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground",
263
+ className,
264
+ )}
278
265
  data-slot="command-shortcut"
279
266
  {...props}
280
267
  />
@@ -1,10 +1,8 @@
1
- "use client";
2
-
1
+ import { CheckIcon, ChevronRightIcon } from "lucide-react";
2
+ import { ContextMenu as ContextMenuPrimitive } from "radix-ui";
3
3
  import type { ComponentProps, JSX } from "react";
4
4
 
5
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
6
 
9
7
  /* -----------------------------------------------------------------------------
10
8
  * Component: ContextMenu
@@ -34,8 +32,14 @@ type ContextMenuTriggerProps = ComponentProps<typeof ContextMenuPrimitive.Trigge
34
32
  /**
35
33
  * @since 0.3.16-canary.0
36
34
  */
37
- function ContextMenuTrigger({ ...props }: ContextMenuTriggerProps): JSX.Element {
38
- return <ContextMenuPrimitive.Trigger data-slot="context-menu-trigger" {...props} />;
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
+ );
39
43
  }
40
44
 
41
45
  /* -----------------------------------------------------------------------------
@@ -93,33 +97,18 @@ function ContextMenuRadioGroup({ ...props }: ContextMenuRadioGroupProps): JSX.El
93
97
  /**
94
98
  * @since 0.3.16-canary.0
95
99
  */
96
- interface ContextMenuSubTriggerProps extends ComponentProps<
97
- typeof ContextMenuPrimitive.SubTrigger
98
- > {
100
+ interface ContextMenuSubTriggerProps extends ComponentProps<typeof ContextMenuPrimitive.SubTrigger> {
99
101
  inset?: boolean;
100
102
  }
101
103
 
102
104
  /**
103
105
  * @since 0.3.16-canary.0
104
106
  */
105
- function ContextMenuSubTrigger({
106
- children,
107
- className,
108
- inset,
109
- ...props
110
- }: ContextMenuSubTriggerProps): JSX.Element {
107
+ function ContextMenuSubTrigger({ children, className, inset, ...props }: ContextMenuSubTriggerProps): JSX.Element {
111
108
  return (
112
109
  <ContextMenuPrimitive.SubTrigger
113
110
  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",
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",
123
112
  className,
124
113
  )}
125
114
  data-inset={inset}
@@ -127,7 +116,7 @@ function ContextMenuSubTrigger({
127
116
  {...props}
128
117
  >
129
118
  {children}
130
- <ChevronRightIcon className={cn("size-4", "ml-auto")} />
119
+ <ChevronRightIcon className="ml-auto rtl:rotate-180" />
131
120
  </ContextMenuPrimitive.SubTrigger>
132
121
  );
133
122
  }
@@ -146,31 +135,14 @@ type ContextMenuSubContentProps = ComponentProps<typeof ContextMenuPrimitive.Sub
146
135
  */
147
136
  function ContextMenuSubContent({ className, ...props }: ContextMenuSubContentProps): JSX.Element {
148
137
  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>
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
+ />
174
146
  );
175
147
  }
176
148
 
@@ -188,20 +160,10 @@ type ContextMenuContentProps = ComponentProps<typeof ContextMenuPrimitive.Conten
188
160
  */
189
161
  function ContextMenuContent({ className, ...props }: ContextMenuContentProps): JSX.Element {
190
162
  return (
191
- <ContextMenuPrimitive.Portal>
163
+ <ContextMenuPrimitive.Portal data-slot="context-menu-portal">
192
164
  <ContextMenuPrimitive.Content
193
165
  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)",
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",
205
167
  className,
206
168
  )}
207
169
  data-slot="context-menu-content"
@@ -226,29 +188,11 @@ interface ContextMenuItemProps extends ComponentProps<typeof ContextMenuPrimitiv
226
188
  /**
227
189
  * @since 0.3.16-canary.0
228
190
  */
229
- function ContextMenuItem({
230
- className,
231
- inset,
232
- variant,
233
- ...props
234
- }: ContextMenuItemProps): JSX.Element {
191
+ function ContextMenuItem({ className, inset, variant = "default", ...props }: ContextMenuItemProps): JSX.Element {
235
192
  return (
236
193
  <ContextMenuPrimitive.Item
237
194
  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",
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",
252
196
  className,
253
197
  )}
254
198
  data-inset={inset}
@@ -266,7 +210,9 @@ function ContextMenuItem({
266
210
  /**
267
211
  * @since 0.3.16-canary.0
268
212
  */
269
- type ContextMenuCheckboxItemProps = ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>;
213
+ interface ContextMenuCheckboxItemProps extends ComponentProps<typeof ContextMenuPrimitive.CheckboxItem> {
214
+ inset?: boolean;
215
+ }
270
216
 
271
217
  /**
272
218
  * @since 0.3.16-canary.0
@@ -275,28 +221,23 @@ function ContextMenuCheckboxItem({
275
221
  checked,
276
222
  children,
277
223
  className,
224
+ inset,
278
225
  ...props
279
226
  }: ContextMenuCheckboxItemProps): JSX.Element {
280
227
  return (
281
228
  <ContextMenuPrimitive.CheckboxItem
282
229
  checked={checked}
283
230
  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",
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",
292
232
  className,
293
233
  )}
234
+ data-inset={inset}
294
235
  data-slot="context-menu-checkbox-item"
295
236
  {...props}
296
237
  >
297
- <span className={cn("absolute flex items-center justify-center", "left-2")}>
238
+ <span className="pointer-events-none absolute right-2">
298
239
  <ContextMenuPrimitive.ItemIndicator>
299
- <CheckIcon className="size-4" />
240
+ <CheckIcon />
300
241
  </ContextMenuPrimitive.ItemIndicator>
301
242
  </span>
302
243
  {children}
@@ -311,35 +252,27 @@ function ContextMenuCheckboxItem({
311
252
  /**
312
253
  * @since 0.3.16-canary.0
313
254
  */
314
- type ContextMenuRadioItemProps = ComponentProps<typeof ContextMenuPrimitive.RadioItem>;
255
+ interface ContextMenuRadioItemProps extends ComponentProps<typeof ContextMenuPrimitive.RadioItem> {
256
+ inset?: boolean;
257
+ }
315
258
 
316
259
  /**
317
260
  * @since 0.3.16-canary.0
318
261
  */
319
- function ContextMenuRadioItem({
320
- children,
321
- className,
322
- ...props
323
- }: ContextMenuRadioItemProps): JSX.Element {
262
+ function ContextMenuRadioItem({ children, className, inset, ...props }: ContextMenuRadioItemProps): JSX.Element {
324
263
  return (
325
264
  <ContextMenuPrimitive.RadioItem
326
265
  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",
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",
335
267
  className,
336
268
  )}
269
+ data-inset={inset}
337
270
  data-slot="context-menu-radio-item"
338
271
  {...props}
339
272
  >
340
- <span className={cn("absolute flex items-center justify-center", "left-2")}>
273
+ <span className="pointer-events-none absolute right-2">
341
274
  <ContextMenuPrimitive.ItemIndicator>
342
- <DotIcon className={cn("size-4", "fill-current")} />
275
+ <CheckIcon />
343
276
  </ContextMenuPrimitive.ItemIndicator>
344
277
  </span>
345
278
  {children}
@@ -364,13 +297,7 @@ interface ContextMenuLabelProps extends ComponentProps<typeof ContextMenuPrimiti
364
297
  function ContextMenuLabel({ className, inset, ...props }: ContextMenuLabelProps): JSX.Element {
365
298
  return (
366
299
  <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
- )}
300
+ className={cn("px-2 py-1.5 text-xs font-medium text-muted-foreground data-inset:pl-8", className)}
374
301
  data-inset={inset}
375
302
  data-slot="context-menu-label"
376
303
  {...props}
@@ -393,7 +320,7 @@ type ContextMenuSeparatorProps = ComponentProps<typeof ContextMenuPrimitive.Sepa
393
320
  function ContextMenuSeparator({ className, ...props }: ContextMenuSeparatorProps): JSX.Element {
394
321
  return (
395
322
  <ContextMenuPrimitive.Separator
396
- className={cn("mx-2 my-1 h-px", "bg-border", className)}
323
+ className={cn("-mx-1 my-1 h-px bg-border", className)}
397
324
  data-slot="context-menu-separator"
398
325
  {...props}
399
326
  />
@@ -416,9 +343,7 @@ function ContextMenuShortcut({ className, ...props }: ContextMenuShortcutProps):
416
343
  return (
417
344
  <span
418
345
  className={cn(
419
- "ml-auto",
420
- "text-xs tracking-widest text-muted-foreground",
421
- "group-data-[variant=destructive]/context-menu-item:text-destructive/80",
346
+ "ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground",
422
347
  className,
423
348
  )}
424
349
  data-slot="context-menu-shortcut"
@@ -441,11 +366,7 @@ type ContextMenuArrowProps = ComponentProps<typeof ContextMenuPrimitive.Arrow>;
441
366
  */
442
367
  function ContextMenuArrow({ className, ...props }: ContextMenuArrowProps): JSX.Element {
443
368
  return (
444
- <ContextMenuPrimitive.Arrow
445
- className={cn("fill-popover", className)}
446
- data-slot="context-menu-arrow"
447
- {...props}
448
- />
369
+ <ContextMenuPrimitive.Arrow className={cn("fill-popover", className)} data-slot="context-menu-arrow" {...props} />
449
370
  );
450
371
  }
451
372