@codefast/ui 0.3.16-canary.3 → 0.4.0-canary.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/CHANGELOG.md +112 -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 +25 -12
  26. package/dist/components/chart.d.mts +8 -3
  27. package/dist/components/chart.mjs +21 -15
  28. package/dist/components/checkbox-cards.mjs +6 -6
  29. package/dist/components/checkbox-group.mjs +6 -7
  30. package/dist/components/checkbox.d.mts +2 -2
  31. package/dist/components/checkbox.mjs +8 -9
  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 +40 -58
  174. package/src/components/chart.tsx +41 -92
  175. package/src/components/checkbox-cards.tsx +11 -30
  176. package/src/components/checkbox-group.tsx +6 -28
  177. package/src/components/checkbox.tsx +6 -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 +37 -60
  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 +74 -0
  226. package/src/css/foundation/motion.css +69 -0
  227. package/src/css/foundation/source.css +10 -0
  228. package/src/css/foundation/tokens.css +107 -0
  229. package/src/css/foundation/variants.css +121 -0
  230. package/src/css/preset.css +13 -214
  231. package/src/css/style.css +9 -1
  232. package/src/css/{amber.css → themes/amber.css} +29 -0
  233. package/src/css/{blue.css → themes/blue.css} +29 -0
  234. package/src/css/{cyan.css → themes/cyan.css} +29 -0
  235. package/src/css/{emerald.css → themes/emerald.css} +29 -0
  236. package/src/css/{fuchsia.css → themes/fuchsia.css} +29 -0
  237. package/src/css/{gray.css → themes/gray.css} +29 -0
  238. package/src/css/{green.css → themes/green.css} +29 -0
  239. package/src/css/{indigo.css → themes/indigo.css} +29 -0
  240. package/src/css/{lime.css → themes/lime.css} +29 -0
  241. package/src/css/{neutral.css → themes/neutral.css} +29 -0
  242. package/src/css/{orange.css → themes/orange.css} +29 -0
  243. package/src/css/{pink.css → themes/pink.css} +29 -0
  244. package/src/css/{purple.css → themes/purple.css} +29 -0
  245. package/src/css/{red.css → themes/red.css} +29 -0
  246. package/src/css/{rose.css → themes/rose.css} +29 -0
  247. package/src/css/{sky.css → themes/sky.css} +29 -0
  248. package/src/css/{slate.css → themes/slate.css} +29 -0
  249. package/src/css/{stone.css → themes/stone.css} +29 -0
  250. package/src/css/{teal.css → themes/teal.css} +29 -0
  251. package/src/css/{violet.css → themes/violet.css} +29 -0
  252. package/src/css/{yellow.css → themes/yellow.css} +29 -0
  253. package/src/css/{zinc.css → themes/zinc.css} +29 -0
  254. package/src/hooks/use-animated-value.ts +1 -7
  255. package/src/hooks/use-copy-to-clipboard.ts +1 -6
  256. package/src/hooks/use-is-mobile.ts +0 -2
  257. package/src/hooks/use-media-query.ts +0 -2
  258. package/src/hooks/use-mutation-observer.ts +0 -3
  259. package/src/hooks/use-pagination.ts +0 -2
  260. package/src/index.ts +39 -80
  261. package/src/primitives/checkbox-group.tsx +25 -39
  262. package/src/primitives/input-number.tsx +17 -63
  263. package/src/primitives/input.tsx +8 -24
  264. package/src/primitives/progress-circle.tsx +13 -43
  265. package/src/variants/alert.ts +3 -14
  266. package/src/variants/badge.ts +8 -35
  267. package/src/variants/button-group.ts +5 -18
  268. package/src/variants/button.ts +21 -58
  269. package/src/variants/empty.ts +2 -11
  270. package/src/variants/field.ts +6 -19
  271. package/src/variants/input-group.ts +12 -64
  272. package/src/variants/input-number.ts +65 -0
  273. package/src/variants/item.ts +10 -32
  274. package/src/variants/navigation-menu.ts +1 -8
  275. package/src/variants/progress-circle.ts +1 -2
  276. package/src/variants/scroll-area.ts +3 -9
  277. package/src/variants/separator.ts +6 -7
  278. package/src/variants/sheet.ts +6 -39
  279. package/src/variants/sidebar.ts +7 -27
  280. package/src/variants/tabs.ts +34 -0
  281. package/src/variants/toggle.ts +9 -28
@@ -1,13 +1,9 @@
1
- "use client";
2
-
3
- import type { VariantProps } from "#/lib/utils";
1
+ import { XIcon } from "lucide-react";
2
+ import { Dialog as DialogPrimitive } from "radix-ui";
4
3
  import type { ComponentProps, JSX } from "react";
5
4
 
5
+ import { Button } from "#/components/button";
6
6
  import { cn } from "#/lib/utils";
7
- import * as DialogPrimitive from "@radix-ui/react-dialog";
8
- import { XIcon } from "lucide-react";
9
-
10
- import { buttonVariants } from "#/variants/button";
11
7
 
12
8
  /* -----------------------------------------------------------------------------
13
9
  * Component: Dialog
@@ -49,76 +45,38 @@ function DialogTrigger({ ...props }: DialogTriggerProps): JSX.Element {
49
45
  * @since 0.3.16-canary.0
50
46
  */
51
47
  interface DialogContentProps extends ComponentProps<typeof DialogPrimitive.Content> {
52
- classNames?: {
53
- close?: string;
54
- content?: string;
55
- overlay?: string;
56
- wrapper?: string;
57
- };
48
+ showCloseButton?: boolean;
58
49
  }
59
50
 
60
51
  /**
61
52
  * @since 0.3.16-canary.0
62
53
  */
63
- function DialogContent({
64
- children,
65
- className,
66
- classNames,
67
- ...props
68
- }: DialogContentProps): JSX.Element {
54
+ function DialogContent({ children, className, showCloseButton = true, ...props }: DialogContentProps): JSX.Element {
69
55
  return (
70
- <DialogPrimitive.Portal>
56
+ <DialogPrimitive.Portal data-slot="dialog-portal">
71
57
  <DialogPrimitive.Overlay
72
- className={cn(
73
- "fixed inset-0 z-50",
74
- "bg-black/40 backdrop-blur-sm",
75
- "ease-gentle data-open:animate-in data-open:duration-300 data-open:fade-in-0",
76
- "data-closed:animate-out data-closed:duration-200 data-closed:fade-out-0",
77
- "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
78
- classNames?.overlay,
79
- )}
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
+ }
80
61
  data-slot="dialog-overlay"
81
62
  />
82
63
  <DialogPrimitive.Content
83
64
  className={cn(
84
- "fixed inset-0 z-50 grid grid-rows-[1fr_auto] justify-items-center overflow-auto",
85
- "sm:grid-rows-[1fr_auto_3fr] sm:p-4",
86
- "ease-gentle data-open:animate-in data-open:duration-300",
87
- "max-sm:data-open:animation-duration-380 max-sm:data-open:slide-in-from-bottom",
88
- "sm:data-open:fade-in-0 sm:data-open:zoom-in-95",
89
- "data-closed:animate-out data-closed:duration-200",
90
- "max-sm:data-closed:animation-duration-280 max-sm:data-closed:slide-out-to-bottom",
91
- "sm:data-closed:fade-out-0 sm:data-closed:zoom-out-95",
92
- "motion-reduce:animate-none motion-reduce:transition-none motion-reduce:duration-0",
93
- classNames?.wrapper,
65
+ "fixed start-1/2 top-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 rtl:translate-x-1/2 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,
94
67
  )}
95
- data-slot="dialog-content-wrapper"
68
+ data-slot="dialog-content"
96
69
  {...props}
97
70
  >
98
- <div
99
- className={cn(
100
- "relative row-start-2 flex w-full flex-col",
101
- "rounded-t-2xl border",
102
- "bg-popover text-popover-foreground shadow-lg",
103
- "sm:max-w-lg sm:rounded-2xl",
104
- classNames?.content,
105
- className,
106
- )}
107
- data-slot="dialog-content"
108
- >
109
- {children}
110
- <DialogPrimitive.Close
111
- className={buttonVariants({
112
- className: ["absolute top-2.5 right-2.5 size-7", classNames?.close],
113
- size: "icon",
114
- variant: "ghost",
115
- })}
116
- data-slot="dialog-close"
117
- >
118
- <XIcon className="size-4" />
119
- <span className="sr-only">Close</span>
71
+ {children}
72
+ {showCloseButton ? (
73
+ <DialogPrimitive.Close asChild data-slot="dialog-close">
74
+ <Button className="absolute end-4 top-4" size="icon-sm" variant="ghost">
75
+ <XIcon />
76
+ <span className="sr-only">Close</span>
77
+ </Button>
120
78
  </DialogPrimitive.Close>
121
- </div>
79
+ ) : null}
122
80
  </DialogPrimitive.Content>
123
81
  </DialogPrimitive.Portal>
124
82
  );
@@ -137,17 +95,7 @@ type DialogHeaderProps = ComponentProps<"div">;
137
95
  * @since 0.3.16-canary.0
138
96
  */
139
97
  function DialogHeader({ className, ...props }: DialogHeaderProps): JSX.Element {
140
- return (
141
- <header
142
- className={cn(
143
- "flex shrink-0 flex-col gap-1.5 px-6 pt-6 pb-2 text-center",
144
- "sm:text-left",
145
- className,
146
- )}
147
- data-slot="dialog-header"
148
- {...props}
149
- />
150
- );
98
+ return <div className={cn("flex shrink-0 flex-col gap-2", className)} data-slot="dialog-header" {...props} />;
151
99
  }
152
100
 
153
101
  /* -----------------------------------------------------------------------------
@@ -155,6 +103,11 @@ function DialogHeader({ className, ...props }: DialogHeaderProps): JSX.Element {
155
103
  * -------------------------------------------------------------------------- */
156
104
 
157
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
+ *
158
111
  * @since 0.3.16-canary.0
159
112
  */
160
113
  type DialogBodyProps = ComponentProps<"div">;
@@ -164,11 +117,7 @@ type DialogBodyProps = ComponentProps<"div">;
164
117
  */
165
118
  function DialogBody({ className, ...props }: DialogBodyProps): JSX.Element {
166
119
  return (
167
- <main
168
- className={cn("overflow-auto", "px-6 py-2", className)}
169
- data-slot="dialog-body"
170
- {...props}
171
- />
120
+ <div className={cn("-mx-6 min-h-0 flex-1 overflow-y-auto px-6", className)} data-slot="dialog-body" {...props} />
172
121
  );
173
122
  }
174
123
 
@@ -179,22 +128,27 @@ function DialogBody({ className, ...props }: DialogBodyProps): JSX.Element {
179
128
  /**
180
129
  * @since 0.3.16-canary.0
181
130
  */
182
- type DialogFooterProps = ComponentProps<"div">;
131
+ interface DialogFooterProps extends ComponentProps<"div"> {
132
+ showCloseButton?: boolean;
133
+ }
183
134
 
184
135
  /**
185
136
  * @since 0.3.16-canary.0
186
137
  */
187
- function DialogFooter({ className, ...props }: DialogFooterProps): JSX.Element {
138
+ function DialogFooter({ children, className, showCloseButton = false, ...props }: DialogFooterProps): JSX.Element {
188
139
  return (
189
- <footer
190
- className={cn(
191
- "flex shrink-0 flex-col-reverse gap-2 px-6 pt-2 pb-6",
192
- "sm:flex-row sm:justify-end",
193
- className,
194
- )}
140
+ <div
141
+ className={cn("flex shrink-0 flex-col-reverse gap-2 sm:flex-row sm:justify-end", className)}
195
142
  data-slot="dialog-footer"
196
143
  {...props}
197
- />
144
+ >
145
+ {children}
146
+ {showCloseButton ? (
147
+ <DialogPrimitive.Close asChild>
148
+ <Button variant="outline">Close</Button>
149
+ </DialogPrimitive.Close>
150
+ ) : null}
151
+ </div>
198
152
  );
199
153
  }
200
154
 
@@ -213,7 +167,7 @@ type DialogTitleProps = ComponentProps<typeof DialogPrimitive.Title>;
213
167
  function DialogTitle({ className, ...props }: DialogTitleProps): JSX.Element {
214
168
  return (
215
169
  <DialogPrimitive.Title
216
- className={cn("text-lg leading-none font-semibold tracking-tight", className)}
170
+ className={cn("font-heading leading-none font-medium", className)}
217
171
  data-slot="dialog-title"
218
172
  {...props}
219
173
  />
@@ -235,7 +189,10 @@ type DialogDescriptionProps = ComponentProps<typeof DialogPrimitive.Description>
235
189
  function DialogDescription({ className, ...props }: DialogDescriptionProps): JSX.Element {
236
190
  return (
237
191
  <DialogPrimitive.Description
238
- className={cn("text-sm text-muted-foreground", className)}
192
+ className={cn(
193
+ "text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
194
+ className,
195
+ )}
239
196
  data-slot="dialog-description"
240
197
  {...props}
241
198
  />
@@ -249,22 +206,13 @@ function DialogDescription({ className, ...props }: DialogDescriptionProps): JSX
249
206
  /**
250
207
  * @since 0.3.16-canary.0
251
208
  */
252
- interface DialogCloseProps extends Omit<ComponentProps<typeof DialogPrimitive.Close>, "ref"> {
253
- size?: VariantProps<typeof buttonVariants>["size"];
254
- variant?: VariantProps<typeof buttonVariants>["variant"];
255
- }
209
+ type DialogCloseProps = ComponentProps<typeof DialogPrimitive.Close>;
256
210
 
257
211
  /**
258
212
  * @since 0.3.16-canary.0
259
213
  */
260
- function DialogClose({ className, size, variant, ...props }: DialogCloseProps): JSX.Element {
261
- return (
262
- <DialogPrimitive.Close
263
- className={buttonVariants({ className, size, variant })}
264
- data-slot="dialog-close"
265
- {...props}
266
- />
267
- );
214
+ function DialogClose({ ...props }: DialogCloseProps): JSX.Element {
215
+ return <DialogPrimitive.Close data-slot="dialog-close" {...props} />;
268
216
  }
269
217
 
270
218
  /* -----------------------------------------------------------------------------
@@ -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 };
@@ -1,11 +1,8 @@
1
- "use client";
2
-
3
- import type { VariantProps } from "#/lib/utils";
4
1
  import type { ComponentProps, JSX } from "react";
5
-
6
- import { cn } from "#/lib/utils";
7
2
  import { Drawer as DrawerPrimitive } from "vaul";
8
3
 
4
+ import type { VariantProps } from "#/lib/utils";
5
+ import { cn } from "#/lib/utils";
9
6
  import { buttonVariants } from "#/variants/button";
10
7
 
11
8
  /* -----------------------------------------------------------------------------
@@ -21,13 +18,7 @@ type DrawerProps = ComponentProps<typeof DrawerPrimitive.Root>;
21
18
  * @since 0.3.16-canary.0
22
19
  */
23
20
  function Drawer({ shouldScaleBackground = true, ...props }: DrawerProps): JSX.Element {
24
- return (
25
- <DrawerPrimitive.Root
26
- data-slot="drawer"
27
- shouldScaleBackground={shouldScaleBackground}
28
- {...props}
29
- />
30
- );
21
+ return <DrawerPrimitive.Root data-slot="drawer" shouldScaleBackground={shouldScaleBackground} {...props} />;
31
22
  }
32
23
 
33
24
  /* -----------------------------------------------------------------------------
@@ -53,55 +44,29 @@ function DrawerTrigger({ ...props }: DrawerTriggerProps): JSX.Element {
53
44
  /**
54
45
  * @since 0.3.16-canary.0
55
46
  */
56
- interface DrawerContentProps extends ComponentProps<typeof DrawerPrimitive.Content> {
57
- classNames?: {
58
- content?: string;
59
- handle?: string;
60
- overlay?: string;
61
- };
62
- }
47
+ type DrawerContentProps = ComponentProps<typeof DrawerPrimitive.Content>;
63
48
 
64
49
  /**
65
50
  * @since 0.3.16-canary.0
66
51
  */
67
- function DrawerContent({
68
- children,
69
- className,
70
- classNames,
71
- ...props
72
- }: DrawerContentProps): JSX.Element {
52
+ function DrawerContent({ children, className, ...props }: DrawerContentProps): JSX.Element {
73
53
  return (
74
- <DrawerPrimitive.Portal>
54
+ <DrawerPrimitive.Portal data-slot="drawer-portal">
75
55
  <DrawerPrimitive.Overlay
76
- className={cn("fixed inset-0 z-50", "bg-black/50", classNames?.overlay)}
56
+ className={
57
+ "fixed inset-0 z-50 bg-black/10 ease-gentle supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:animation-duration-panel-in data-open:fade-in-0 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-panel-out data-closed:fade-out-0"
58
+ }
77
59
  data-slot="drawer-overlay"
78
60
  />
79
61
  <DrawerPrimitive.Content
80
62
  className={cn(
81
- "group/drawer-content fixed z-50 flex h-auto flex-col",
82
- "bg-background",
83
- "data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-2xl",
84
- "data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4",
85
- "data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4",
86
- "data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-2xl",
87
- "data-[vaul-drawer-direction=left]:sm:max-w-sm",
88
- "data-[vaul-drawer-direction=right]:sm:max-w-sm",
89
- classNames?.content,
63
+ "group/drawer-content fixed z-50 flex h-auto flex-col bg-popover text-sm text-popover-foreground data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-xl data-[vaul-drawer-direction=bottom]:border-t data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:start-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:rounded-e-xl data-[vaul-drawer-direction=left]:border-e data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:end-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:rounded-s-xl data-[vaul-drawer-direction=right]:border-s data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-xl data-[vaul-drawer-direction=top]:border-b data-[vaul-drawer-direction=left]:sm:max-w-sm data-[vaul-drawer-direction=right]:sm:max-w-sm",
90
64
  className,
91
65
  )}
92
66
  data-slot="drawer-content"
93
67
  {...props}
94
68
  >
95
- <div
96
- className={cn(
97
- "hidden",
98
- "mx-auto mt-4 h-1.5 w-12 shrink-0",
99
- "rounded-full",
100
- "bg-muted",
101
- "group-data-[vaul-drawer-direction=bottom]/drawer-content:block",
102
- classNames?.handle,
103
- )}
104
- />
69
+ <div className="mx-auto mt-4 hidden h-1.5 w-25 shrink-0 rounded-full bg-muted group-data-[vaul-drawer-direction=bottom]/drawer-content:block" />
105
70
  {children}
106
71
  </DrawerPrimitive.Content>
107
72
  </DrawerPrimitive.Portal>
@@ -123,35 +88,16 @@ type DrawerHeaderProps = ComponentProps<"div">;
123
88
  function DrawerHeader({ className, ...props }: DrawerHeaderProps): JSX.Element {
124
89
  return (
125
90
  <div
126
- className={cn("flex flex-col gap-1.5", "p-4", className)}
91
+ className={cn(
92
+ "flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-1.5 md:text-start",
93
+ className,
94
+ )}
127
95
  data-slot="drawer-header"
128
96
  {...props}
129
97
  />
130
98
  );
131
99
  }
132
100
 
133
- /* -----------------------------------------------------------------------------
134
- * Component: DrawerBody
135
- * -------------------------------------------------------------------------- */
136
-
137
- /**
138
- * @since 0.3.16-canary.0
139
- */
140
- type DrawerBodyProps = ComponentProps<"div">;
141
-
142
- /**
143
- * @since 0.3.16-canary.0
144
- */
145
- function DrawerBody({ className, ...props }: DrawerBodyProps): JSX.Element {
146
- return (
147
- <main
148
- className={cn("overflow-auto", "px-6 py-2", className)}
149
- data-slot="drawer-body"
150
- {...props}
151
- />
152
- );
153
- }
154
-
155
101
  /* -----------------------------------------------------------------------------
156
102
  * Component: DrawerFooter
157
103
  * -------------------------------------------------------------------------- */
@@ -165,13 +111,7 @@ type DrawerFooterProps = ComponentProps<"div">;
165
111
  * @since 0.3.16-canary.0
166
112
  */
167
113
  function DrawerFooter({ className, ...props }: DrawerFooterProps): JSX.Element {
168
- return (
169
- <div
170
- className={cn("flex flex-col gap-2", "mt-auto p-4", className)}
171
- data-slot="drawer-footer"
172
- {...props}
173
- />
174
- );
114
+ return <div className={cn("mt-auto flex flex-col gap-2 p-4", className)} data-slot="drawer-footer" {...props} />;
175
115
  }
176
116
 
177
117
  /* -----------------------------------------------------------------------------
@@ -189,7 +129,7 @@ type DrawerTitleProps = ComponentProps<typeof DrawerPrimitive.Title>;
189
129
  function DrawerTitle({ className, ...props }: DrawerTitleProps): JSX.Element {
190
130
  return (
191
131
  <DrawerPrimitive.Title
192
- className={cn("font-semibold text-foreground", className)}
132
+ className={cn("font-heading font-medium text-foreground", className)}
193
133
  data-slot="drawer-title"
194
134
  {...props}
195
135
  />
@@ -249,7 +189,6 @@ function DrawerClose({ className, size, variant, ...props }: DrawerCloseProps):
249
189
 
250
190
  export {
251
191
  Drawer,
252
- DrawerBody,
253
192
  DrawerClose,
254
193
  DrawerContent,
255
194
  DrawerDescription,
@@ -259,7 +198,6 @@ export {
259
198
  DrawerTrigger,
260
199
  };
261
200
  export type {
262
- DrawerBodyProps,
263
201
  DrawerCloseProps,
264
202
  DrawerContentProps,
265
203
  DrawerDescriptionProps,