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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +28 -17
  3. package/dist/components/accordion.d.mts +7 -22
  4. package/dist/components/accordion.mjs +26 -29
  5. package/dist/components/alert-dialog.d.mts +27 -26
  6. package/dist/components/alert-dialog.mjs +53 -45
  7. package/dist/components/alert.d.mts +14 -14
  8. package/dist/components/alert.mjs +17 -28
  9. package/dist/components/aspect-ratio.d.mts +2 -2
  10. package/dist/components/aspect-ratio.mjs +2 -3
  11. package/dist/components/avatar.d.mts +41 -5
  12. package/dist/components/avatar.mjs +40 -10
  13. package/dist/components/badge.d.mts +3 -15
  14. package/dist/components/badge.mjs +6 -48
  15. package/dist/components/breadcrumb.d.mts +1 -0
  16. package/dist/components/breadcrumb.mjs +11 -10
  17. package/dist/components/button-group.d.mts +3 -13
  18. package/dist/components/button-group.mjs +9 -31
  19. package/dist/components/button.d.mts +3 -26
  20. package/dist/components/button.mjs +9 -79
  21. package/dist/components/calendar.d.mts +6 -2
  22. package/dist/components/calendar.mjs +41 -44
  23. package/dist/components/card.d.mts +4 -2
  24. package/dist/components/card.mjs +9 -9
  25. package/dist/components/carousel.d.mts +16 -5
  26. package/dist/components/carousel.mjs +24 -11
  27. package/dist/components/chart.d.mts +9 -6
  28. package/dist/components/chart.mjs +21 -15
  29. package/dist/components/checkbox-cards.mjs +4 -4
  30. package/dist/components/checkbox-group.mjs +3 -4
  31. package/dist/components/checkbox.d.mts +2 -2
  32. package/dist/components/checkbox.mjs +6 -7
  33. package/dist/components/collapsible.d.mts +4 -4
  34. package/dist/components/collapsible.mjs +4 -5
  35. package/dist/components/command.d.mts +11 -1
  36. package/dist/components/command.mjs +35 -32
  37. package/dist/components/context-menu.d.mts +22 -15
  38. package/dist/components/context-menu.mjs +44 -39
  39. package/dist/components/dialog.d.mts +19 -23
  40. package/dist/components/dialog.mjs +48 -47
  41. package/dist/components/direction.d.mts +24 -0
  42. package/dist/components/direction.mjs +18 -0
  43. package/dist/components/drawer.d.mts +3 -21
  44. package/dist/components/drawer.mjs +19 -27
  45. package/dist/components/dropdown-menu.d.mts +22 -15
  46. package/dist/components/dropdown-menu.mjs +41 -37
  47. package/dist/components/empty.d.mts +3 -13
  48. package/dist/components/empty.mjs +8 -23
  49. package/dist/components/field.d.mts +3 -14
  50. package/dist/components/field.mjs +14 -44
  51. package/dist/components/form.d.mts +7 -10
  52. package/dist/components/form.mjs +6 -7
  53. package/dist/components/hover-card.d.mts +5 -5
  54. package/dist/components/hover-card.mjs +14 -12
  55. package/dist/components/input-group.d.mts +4 -31
  56. package/dist/components/input-group.mjs +14 -96
  57. package/dist/components/input-number.d.mts +3 -1
  58. package/dist/components/input-number.mjs +50 -28
  59. package/dist/components/input-otp.mjs +9 -7
  60. package/dist/components/input-password.mjs +1 -4
  61. package/dist/components/input-search.mjs +3 -5
  62. package/dist/components/input.mjs +1 -2
  63. package/dist/components/item.d.mts +4 -29
  64. package/dist/components/item.mjs +12 -65
  65. package/dist/components/kbd.mjs +1 -1
  66. package/dist/components/label.d.mts +2 -2
  67. package/dist/components/label.mjs +3 -4
  68. package/dist/components/menubar.d.mts +22 -16
  69. package/dist/components/menubar.mjs +54 -47
  70. package/dist/components/native-select.d.mts +5 -1
  71. package/dist/components/native-select.mjs +9 -6
  72. package/dist/components/navigation-menu.d.mts +30 -13
  73. package/dist/components/navigation-menu.mjs +35 -32
  74. package/dist/components/pagination.d.mts +7 -1
  75. package/dist/components/pagination.mjs +27 -12
  76. package/dist/components/popover.d.mts +40 -7
  77. package/dist/components/popover.mjs +46 -14
  78. package/dist/components/progress-circle.d.mts +3 -47
  79. package/dist/components/progress-circle.mjs +2 -48
  80. package/dist/components/progress.d.mts +2 -2
  81. package/dist/components/progress.mjs +5 -6
  82. package/dist/components/radio-cards.d.mts +3 -3
  83. package/dist/components/radio-cards.mjs +11 -11
  84. package/dist/components/radio-group.d.mts +3 -3
  85. package/dist/components/radio-group.mjs +9 -9
  86. package/dist/components/radio.mjs +2 -3
  87. package/dist/components/resizable.mjs +3 -8
  88. package/dist/components/scroll-area.d.mts +8 -24
  89. package/dist/components/scroll-area.mjs +16 -70
  90. package/dist/components/select.d.mts +14 -14
  91. package/dist/components/select.mjs +47 -47
  92. package/dist/components/separator.d.mts +4 -19
  93. package/dist/components/separator.mjs +6 -27
  94. package/dist/components/sheet.d.mts +18 -31
  95. package/dist/components/sheet.mjs +46 -87
  96. package/dist/components/sidebar.d.mts +3 -19
  97. package/dist/components/sidebar.mjs +48 -84
  98. package/dist/components/skeleton.mjs +1 -1
  99. package/dist/components/slider.d.mts +2 -2
  100. package/dist/components/slider.mjs +9 -11
  101. package/dist/components/sonner.mjs +11 -3
  102. package/dist/components/spinner.mjs +6 -7
  103. package/dist/components/switch.d.mts +5 -2
  104. package/dist/components/switch.mjs +7 -7
  105. package/dist/components/table.mjs +10 -10
  106. package/dist/components/tabs.d.mts +8 -5
  107. package/dist/components/tabs.mjs +18 -12
  108. package/dist/components/textarea.mjs +1 -1
  109. package/dist/components/toggle-group.d.mts +11 -7
  110. package/dist/components/toggle-group.mjs +20 -21
  111. package/dist/components/toggle.d.mts +4 -24
  112. package/dist/components/toggle.mjs +6 -45
  113. package/dist/components/tooltip.d.mts +7 -6
  114. package/dist/components/tooltip.mjs +19 -17
  115. package/dist/hooks/use-animated-value.mjs +0 -1
  116. package/dist/hooks/use-copy-to-clipboard.mjs +0 -1
  117. package/dist/hooks/use-is-mobile.mjs +0 -1
  118. package/dist/hooks/use-media-query.mjs +0 -1
  119. package/dist/hooks/use-mutation-observer.mjs +0 -1
  120. package/dist/hooks/use-pagination.mjs +0 -1
  121. package/dist/index.d.mts +38 -21
  122. package/dist/index.mjs +40 -23
  123. package/dist/lib/utils.d.mts +1 -12
  124. package/dist/lib/utils.mjs +1 -9
  125. package/dist/primitives/checkbox-group.d.mts +9 -11
  126. package/dist/primitives/checkbox-group.mjs +14 -19
  127. package/dist/primitives/input-number.d.mts +3 -4
  128. package/dist/primitives/input-number.mjs +3 -5
  129. package/dist/primitives/input.d.mts +4 -5
  130. package/dist/primitives/input.mjs +2 -3
  131. package/dist/primitives/progress-circle.d.mts +3 -4
  132. package/dist/primitives/progress-circle.mjs +2 -3
  133. package/dist/variants/alert.d.mts +18 -0
  134. package/dist/variants/alert.mjs +15 -0
  135. package/dist/variants/badge.d.mts +22 -0
  136. package/dist/variants/badge.mjs +19 -0
  137. package/dist/variants/button-group.d.mts +18 -0
  138. package/dist/variants/button-group.mjs +15 -0
  139. package/dist/variants/button.d.mts +32 -0
  140. package/dist/variants/button.mjs +34 -0
  141. package/dist/variants/empty.d.mts +18 -0
  142. package/dist/variants/empty.mjs +15 -0
  143. package/dist/variants/field.d.mts +19 -0
  144. package/dist/variants/field.mjs +16 -0
  145. package/dist/variants/input-group.d.mts +43 -0
  146. package/dist/variants/input-group.mjs +34 -0
  147. package/dist/variants/input-number.d.mts +45 -0
  148. package/dist/variants/input-number.mjs +40 -0
  149. package/dist/variants/item.d.mts +38 -0
  150. package/dist/variants/item.mjs +38 -0
  151. package/dist/variants/navigation-menu.d.mts +13 -0
  152. package/dist/variants/navigation-menu.mjs +8 -0
  153. package/dist/variants/progress-circle.d.mts +52 -0
  154. package/dist/variants/progress-circle.mjs +45 -0
  155. package/dist/variants/scroll-area.d.mts +24 -0
  156. package/dist/variants/scroll-area.mjs +58 -0
  157. package/dist/variants/separator.d.mts +23 -0
  158. package/dist/variants/separator.mjs +25 -0
  159. package/dist/variants/sheet.d.mts +20 -0
  160. package/dist/variants/sheet.mjs +17 -0
  161. package/dist/variants/sidebar.d.mts +23 -0
  162. package/dist/variants/sidebar.mjs +25 -0
  163. package/dist/variants/tabs.d.mts +18 -0
  164. package/dist/variants/tabs.mjs +15 -0
  165. package/dist/variants/toggle.d.mts +23 -0
  166. package/dist/variants/toggle.mjs +25 -0
  167. package/package.json +186 -55
  168. package/src/components/accordion.tsx +114 -0
  169. package/src/components/alert-dialog.tsx +298 -0
  170. package/src/components/alert.tsx +94 -0
  171. package/src/components/aspect-ratio.tsx +25 -0
  172. package/src/components/avatar.tsx +171 -0
  173. package/src/components/badge.tsx +35 -0
  174. package/src/components/breadcrumb.tsx +191 -0
  175. package/src/components/button-group.tsx +97 -0
  176. package/src/components/button.tsx +55 -0
  177. package/src/components/calendar.tsx +222 -0
  178. package/src/components/card.tsx +169 -0
  179. package/src/components/carousel.tsx +349 -0
  180. package/src/components/chart.tsx +536 -0
  181. package/src/components/checkbox-cards.tsx +72 -0
  182. package/src/components/checkbox-group.tsx +60 -0
  183. package/src/components/checkbox.tsx +44 -0
  184. package/src/components/collapsible.tsx +57 -0
  185. package/src/components/command.tsx +298 -0
  186. package/src/components/context-menu.tsx +410 -0
  187. package/src/components/dialog.tsx +243 -0
  188. package/src/components/direction.tsx +32 -0
  189. package/src/components/drawer.tsx +209 -0
  190. package/src/components/dropdown-menu.tsx +419 -0
  191. package/src/components/empty.tsx +155 -0
  192. package/src/components/field.tsx +329 -0
  193. package/src/components/form.tsx +258 -0
  194. package/src/components/hover-card.tsx +93 -0
  195. package/src/components/input-group.tsx +185 -0
  196. package/src/components/input-number.tsx +141 -0
  197. package/src/components/input-otp.tsx +132 -0
  198. package/src/components/input-password.tsx +50 -0
  199. package/src/components/input-search.tsx +81 -0
  200. package/src/components/input.tsx +36 -0
  201. package/src/components/item.tsx +266 -0
  202. package/src/components/kbd.tsx +47 -0
  203. package/src/components/label.tsx +36 -0
  204. package/src/components/menubar.tsx +440 -0
  205. package/src/components/native-select.tsx +87 -0
  206. package/src/components/navigation-menu.tsx +235 -0
  207. package/src/components/pagination.tsx +198 -0
  208. package/src/components/popover.tsx +170 -0
  209. package/src/components/progress-circle.tsx +185 -0
  210. package/src/components/progress.tsx +41 -0
  211. package/src/components/radio-cards.tsx +66 -0
  212. package/src/components/radio-group.tsx +59 -0
  213. package/src/components/radio.tsx +40 -0
  214. package/src/components/resizable.tsx +78 -0
  215. package/src/components/scroll-area.tsx +95 -0
  216. package/src/components/select.tsx +296 -0
  217. package/src/components/separator.tsx +60 -0
  218. package/src/components/sheet.tsx +241 -0
  219. package/src/components/sidebar.tsx +926 -0
  220. package/src/components/skeleton.tsx +35 -0
  221. package/src/components/slider.tsx +66 -0
  222. package/src/components/sonner.tsx +57 -0
  223. package/src/components/spinner.tsx +66 -0
  224. package/src/components/switch.tsx +44 -0
  225. package/src/components/table.tsx +183 -0
  226. package/src/components/tabs.tsx +110 -0
  227. package/src/components/textarea.tsx +35 -0
  228. package/src/components/toggle-group.tsx +137 -0
  229. package/src/components/toggle.tsx +30 -0
  230. package/src/components/tooltip.tsx +115 -0
  231. package/src/css/foundation/base.css +50 -0
  232. package/src/css/foundation/motion.css +36 -0
  233. package/src/css/foundation/source.css +3 -0
  234. package/src/css/foundation/tokens.css +71 -0
  235. package/src/css/foundation/variants.css +113 -0
  236. package/src/css/preset.css +5 -195
  237. package/src/css/style.css +1 -1
  238. package/src/css/{amber.css → themes/amber.css} +59 -22
  239. package/src/css/{blue.css → themes/blue.css} +59 -22
  240. package/src/css/{cyan.css → themes/cyan.css} +59 -22
  241. package/src/css/{emerald.css → themes/emerald.css} +59 -22
  242. package/src/css/{fuchsia.css → themes/fuchsia.css} +59 -22
  243. package/src/css/{gray.css → themes/gray.css} +59 -22
  244. package/src/css/{green.css → themes/green.css} +59 -22
  245. package/src/css/{indigo.css → themes/indigo.css} +59 -22
  246. package/src/css/{lime.css → themes/lime.css} +59 -22
  247. package/src/css/{neutral.css → themes/neutral.css} +59 -22
  248. package/src/css/{orange.css → themes/orange.css} +59 -22
  249. package/src/css/{pink.css → themes/pink.css} +59 -22
  250. package/src/css/{purple.css → themes/purple.css} +59 -22
  251. package/src/css/{red.css → themes/red.css} +59 -22
  252. package/src/css/{rose.css → themes/rose.css} +59 -22
  253. package/src/css/{sky.css → themes/sky.css} +59 -22
  254. package/src/css/{slate.css → themes/slate.css} +59 -22
  255. package/src/css/{stone.css → themes/stone.css} +59 -22
  256. package/src/css/{teal.css → themes/teal.css} +59 -22
  257. package/src/css/{violet.css → themes/violet.css} +59 -22
  258. package/src/css/{yellow.css → themes/yellow.css} +59 -22
  259. package/src/css/{zinc.css → themes/zinc.css} +59 -22
  260. package/src/hooks/use-animated-value.ts +91 -0
  261. package/src/hooks/use-copy-to-clipboard.ts +58 -0
  262. package/src/hooks/use-is-mobile.ts +25 -0
  263. package/src/hooks/use-media-query.ts +69 -0
  264. package/src/hooks/use-mutation-observer.ts +51 -0
  265. package/src/hooks/use-pagination.ts +164 -0
  266. package/src/index.ts +679 -0
  267. package/src/lib/utils.ts +5 -0
  268. package/src/primitives/checkbox-group.tsx +346 -0
  269. package/src/primitives/input-number.tsx +967 -0
  270. package/src/primitives/input.tsx +227 -0
  271. package/src/primitives/progress-circle.tsx +507 -0
  272. package/src/variants/alert.ts +34 -0
  273. package/src/variants/badge.ts +39 -0
  274. package/src/variants/button-group.ts +36 -0
  275. package/src/variants/button.ts +56 -0
  276. package/src/variants/empty.ts +34 -0
  277. package/src/variants/field.ts +37 -0
  278. package/src/variants/input-group.ts +80 -0
  279. package/src/variants/input-number.ts +65 -0
  280. package/src/variants/item.ts +68 -0
  281. package/src/variants/navigation-menu.ts +25 -0
  282. package/src/variants/progress-circle.ts +46 -0
  283. package/src/variants/scroll-area.ts +73 -0
  284. package/src/variants/separator.ts +40 -0
  285. package/src/variants/sheet.ts +37 -0
  286. package/src/variants/sidebar.ts +41 -0
  287. package/src/variants/tabs.ts +34 -0
  288. package/src/variants/toggle.ts +40 -0
  289. package/dist/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts +0 -6
@@ -0,0 +1,114 @@
1
+ import { ChevronDownIcon, ChevronUpIcon } from "lucide-react";
2
+ import { Accordion as AccordionPrimitive } from "radix-ui";
3
+ import type { ComponentProps, JSX } from "react";
4
+
5
+ import { cn } from "#/lib/utils";
6
+
7
+ /* -----------------------------------------------------------------------------
8
+ * Component: Accordion
9
+ * -------------------------------------------------------------------------- */
10
+
11
+ /**
12
+ * @since 0.3.16-canary.0
13
+ */
14
+ type AccordionProps = ComponentProps<typeof AccordionPrimitive.Root>;
15
+
16
+ /**
17
+ * @since 0.3.16-canary.0
18
+ */
19
+ function Accordion({ className, ...props }: AccordionProps): JSX.Element {
20
+ return <AccordionPrimitive.Root className={cn("flex w-full flex-col", className)} data-slot="accordion" {...props} />;
21
+ }
22
+
23
+ /* -----------------------------------------------------------------------------
24
+ * Component: AccordionItem
25
+ * -------------------------------------------------------------------------- */
26
+
27
+ /**
28
+ * @since 0.3.16-canary.0
29
+ */
30
+ type AccordionItemProps = ComponentProps<typeof AccordionPrimitive.Item>;
31
+
32
+ /**
33
+ * @since 0.3.16-canary.0
34
+ */
35
+ function AccordionItem({ className, ...props }: AccordionItemProps): JSX.Element {
36
+ return (
37
+ <AccordionPrimitive.Item className={cn("not-last:border-b", className)} data-slot="accordion-item" {...props} />
38
+ );
39
+ }
40
+
41
+ /* -----------------------------------------------------------------------------
42
+ * Component: AccordionTrigger
43
+ * -------------------------------------------------------------------------- */
44
+
45
+ /**
46
+ * @since 0.3.16-canary.0
47
+ */
48
+ type AccordionTriggerProps = ComponentProps<typeof AccordionPrimitive.Trigger>;
49
+
50
+ /**
51
+ * @since 0.3.16-canary.0
52
+ */
53
+ function AccordionTrigger({ children, className, ...props }: AccordionTriggerProps): JSX.Element {
54
+ return (
55
+ <AccordionPrimitive.Header className="flex">
56
+ <AccordionPrimitive.Trigger
57
+ className={cn(
58
+ "group/accordion-trigger relative flex flex-1 items-start justify-between rounded-md border border-transparent py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:after:border-ring disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground",
59
+ className,
60
+ )}
61
+ data-slot="accordion-trigger"
62
+ {...props}
63
+ >
64
+ {children}
65
+ <ChevronDownIcon
66
+ className="pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
67
+ data-slot="accordion-trigger-icon"
68
+ />
69
+ <ChevronUpIcon
70
+ className="pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
71
+ data-slot="accordion-trigger-icon"
72
+ />
73
+ </AccordionPrimitive.Trigger>
74
+ </AccordionPrimitive.Header>
75
+ );
76
+ }
77
+
78
+ /* -----------------------------------------------------------------------------
79
+ * Component: AccordionContent
80
+ * -------------------------------------------------------------------------- */
81
+
82
+ /**
83
+ * @since 0.3.16-canary.0
84
+ */
85
+ type AccordionContentProps = ComponentProps<typeof AccordionPrimitive.Content>;
86
+
87
+ /**
88
+ * @since 0.3.16-canary.0
89
+ */
90
+ function AccordionContent({ children, className, ...props }: AccordionContentProps): JSX.Element {
91
+ return (
92
+ <AccordionPrimitive.Content
93
+ className="overflow-hidden text-sm ease-snappy data-open:animate-accordion-down data-open:animation-duration-expand-in data-closed:animate-accordion-up data-closed:ease-exit data-closed:animation-duration-expand-out"
94
+ data-slot="accordion-content"
95
+ {...props}
96
+ >
97
+ <div
98
+ className={cn(
99
+ "h-(--radix-accordion-content-height) pt-0 pb-4 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
100
+ className,
101
+ )}
102
+ >
103
+ {children}
104
+ </div>
105
+ </AccordionPrimitive.Content>
106
+ );
107
+ }
108
+
109
+ /* -----------------------------------------------------------------------------
110
+ * Exports
111
+ * -------------------------------------------------------------------------- */
112
+
113
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger };
114
+ export type { AccordionContentProps, AccordionItemProps, AccordionProps, AccordionTriggerProps };
@@ -0,0 +1,298 @@
1
+ import { AlertDialog as AlertDialogPrimitive } from "radix-ui";
2
+ import type { ComponentProps, JSX } from "react";
3
+
4
+ import { Button } from "#/components/button";
5
+ import type { ButtonProps } from "#/components/button";
6
+ import { cn } from "#/lib/utils";
7
+
8
+ /* -----------------------------------------------------------------------------
9
+ * Component: AlertDialog
10
+ * -------------------------------------------------------------------------- */
11
+
12
+ /**
13
+ * @since 0.3.16-canary.0
14
+ */
15
+ type AlertDialogProps = ComponentProps<typeof AlertDialogPrimitive.Root>;
16
+
17
+ /**
18
+ * @since 0.3.16-canary.0
19
+ */
20
+ function AlertDialog({ ...props }: AlertDialogProps): JSX.Element {
21
+ return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />;
22
+ }
23
+
24
+ /* -----------------------------------------------------------------------------
25
+ * Component: AlertDialogTrigger
26
+ * -------------------------------------------------------------------------- */
27
+
28
+ /**
29
+ * @since 0.3.16-canary.0
30
+ */
31
+ type AlertDialogTriggerProps = ComponentProps<typeof AlertDialogPrimitive.Trigger>;
32
+
33
+ /**
34
+ * @since 0.3.16-canary.0
35
+ */
36
+ function AlertDialogTrigger({ ...props }: AlertDialogTriggerProps): JSX.Element {
37
+ return <AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} />;
38
+ }
39
+
40
+ /* -----------------------------------------------------------------------------
41
+ * Component: AlertDialogContent
42
+ * -------------------------------------------------------------------------- */
43
+
44
+ /**
45
+ * @since 0.3.16-canary.0
46
+ */
47
+ interface AlertDialogContentProps extends ComponentProps<typeof AlertDialogPrimitive.Content> {
48
+ size?: "default" | "sm";
49
+ }
50
+
51
+ /**
52
+ * @since 0.3.16-canary.0
53
+ */
54
+ function AlertDialogContent({ className, size = "default", ...props }: AlertDialogContentProps): JSX.Element {
55
+ return (
56
+ <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal">
57
+ <AlertDialogPrimitive.Overlay
58
+ className={
59
+ "fixed inset-0 z-50 bg-black/10 ease-gentle supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:animation-duration-overlay-in data-open:fade-in-0 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-overlay-out data-closed:fade-out-0"
60
+ }
61
+ data-slot="alert-dialog-overlay"
62
+ />
63
+ <AlertDialogPrimitive.Content
64
+ className={cn(
65
+ "group/alert-dialog-content fixed top-1/2 left-1/2 z-50 flex max-h-[calc(100dvh-2rem)] w-full -translate-x-1/2 -translate-y-1/2 flex-col gap-6 overflow-y-auto rounded-xl bg-popover p-6 text-popover-foreground ring-1 ring-foreground/10 ease-ui outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg data-open:animate-in data-open:animation-duration-overlay-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:ease-exit data-closed:animation-duration-overlay-out data-closed:fade-out-0 data-closed:zoom-out-95",
66
+ className,
67
+ )}
68
+ data-size={size}
69
+ data-slot="alert-dialog-content"
70
+ {...props}
71
+ />
72
+ </AlertDialogPrimitive.Portal>
73
+ );
74
+ }
75
+
76
+ /* -----------------------------------------------------------------------------
77
+ * Component: AlertDialogHeader
78
+ * -------------------------------------------------------------------------- */
79
+
80
+ /**
81
+ * @since 0.3.16-canary.0
82
+ */
83
+ type AlertDialogHeaderProps = ComponentProps<"div">;
84
+
85
+ /**
86
+ * @since 0.3.16-canary.0
87
+ */
88
+ function AlertDialogHeader({ className, ...props }: AlertDialogHeaderProps): JSX.Element {
89
+ return (
90
+ <div
91
+ className={cn(
92
+ "grid shrink-0 grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]",
93
+ className,
94
+ )}
95
+ data-slot="alert-dialog-header"
96
+ {...props}
97
+ />
98
+ );
99
+ }
100
+
101
+ /* -----------------------------------------------------------------------------
102
+ * Component: AlertDialogMedia
103
+ * -------------------------------------------------------------------------- */
104
+
105
+ /**
106
+ * @since 0.3.16-canary.0
107
+ */
108
+ type AlertDialogMediaProps = ComponentProps<"div">;
109
+
110
+ /**
111
+ * @since 0.3.16-canary.0
112
+ */
113
+ function AlertDialogMedia({ className, ...props }: AlertDialogMediaProps): JSX.Element {
114
+ return (
115
+ <div
116
+ className={cn(
117
+ "mb-2 inline-flex size-16 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-8",
118
+ className,
119
+ )}
120
+ data-slot="alert-dialog-media"
121
+ {...props}
122
+ />
123
+ );
124
+ }
125
+
126
+ /* -----------------------------------------------------------------------------
127
+ * Component: AlertDialogBody
128
+ * -------------------------------------------------------------------------- */
129
+
130
+ /**
131
+ * Optional scrollable region for long content. When used, the Header and Footer
132
+ * stay pinned (shrink-0) and only this body scrolls; without it, the whole
133
+ * Content scrolls via its own max-height. A codefast enhancement over radix-vega.
134
+ *
135
+ * @since 0.3.16-canary.0
136
+ */
137
+ type AlertDialogBodyProps = ComponentProps<"div">;
138
+
139
+ /**
140
+ * @since 0.3.16-canary.0
141
+ */
142
+ function AlertDialogBody({ className, ...props }: AlertDialogBodyProps): JSX.Element {
143
+ return (
144
+ <div
145
+ className={cn("-mx-6 min-h-0 flex-1 overflow-y-auto px-6", className)}
146
+ data-slot="alert-dialog-body"
147
+ {...props}
148
+ />
149
+ );
150
+ }
151
+
152
+ /* -----------------------------------------------------------------------------
153
+ * Component: AlertDialogFooter
154
+ * -------------------------------------------------------------------------- */
155
+
156
+ /**
157
+ * @since 0.3.16-canary.0
158
+ */
159
+ type AlertDialogFooterProps = ComponentProps<"div">;
160
+
161
+ /**
162
+ * @since 0.3.16-canary.0
163
+ */
164
+ function AlertDialogFooter({ className, ...props }: AlertDialogFooterProps): JSX.Element {
165
+ return (
166
+ <div
167
+ className={cn(
168
+ "flex shrink-0 flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end",
169
+ className,
170
+ )}
171
+ data-slot="alert-dialog-footer"
172
+ {...props}
173
+ />
174
+ );
175
+ }
176
+
177
+ /* -----------------------------------------------------------------------------
178
+ * Component: AlertDialogTitle
179
+ * -------------------------------------------------------------------------- */
180
+
181
+ /**
182
+ * @since 0.3.16-canary.0
183
+ */
184
+ type AlertDialogTitleProps = ComponentProps<typeof AlertDialogPrimitive.Title>;
185
+
186
+ /**
187
+ * @since 0.3.16-canary.0
188
+ */
189
+ function AlertDialogTitle({ className, ...props }: AlertDialogTitleProps): JSX.Element {
190
+ return (
191
+ <AlertDialogPrimitive.Title
192
+ className={cn(
193
+ "font-heading text-lg font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2",
194
+ className,
195
+ )}
196
+ data-slot="alert-dialog-title"
197
+ {...props}
198
+ />
199
+ );
200
+ }
201
+
202
+ /* -----------------------------------------------------------------------------
203
+ * Component: AlertDialogDescription
204
+ * -------------------------------------------------------------------------- */
205
+
206
+ /**
207
+ * @since 0.3.16-canary.0
208
+ */
209
+ type AlertDialogDescriptionProps = ComponentProps<typeof AlertDialogPrimitive.Description>;
210
+
211
+ /**
212
+ * @since 0.3.16-canary.0
213
+ */
214
+ function AlertDialogDescription({ className, ...props }: AlertDialogDescriptionProps): JSX.Element {
215
+ return (
216
+ <AlertDialogPrimitive.Description
217
+ className={cn(
218
+ "text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
219
+ className,
220
+ )}
221
+ data-slot="alert-dialog-description"
222
+ {...props}
223
+ />
224
+ );
225
+ }
226
+
227
+ /* -----------------------------------------------------------------------------
228
+ * Component: AlertDialogAction
229
+ * -------------------------------------------------------------------------- */
230
+
231
+ /**
232
+ * @since 0.3.16-canary.0
233
+ */
234
+ interface AlertDialogActionProps
235
+ extends ComponentProps<typeof AlertDialogPrimitive.Action>, Pick<ButtonProps, "size" | "variant"> {}
236
+
237
+ /**
238
+ * @since 0.3.16-canary.0
239
+ */
240
+ function AlertDialogAction({ size = "default", variant = "default", ...props }: AlertDialogActionProps): JSX.Element {
241
+ return (
242
+ <Button asChild size={size} variant={variant}>
243
+ <AlertDialogPrimitive.Action data-slot="alert-dialog-action" {...props} />
244
+ </Button>
245
+ );
246
+ }
247
+
248
+ /* -----------------------------------------------------------------------------
249
+ * Component: AlertDialogCancel
250
+ * -------------------------------------------------------------------------- */
251
+
252
+ /**
253
+ * @since 0.3.16-canary.0
254
+ */
255
+ interface AlertDialogCancelProps
256
+ extends ComponentProps<typeof AlertDialogPrimitive.Cancel>, Pick<ButtonProps, "size" | "variant"> {}
257
+
258
+ /**
259
+ * @since 0.3.16-canary.0
260
+ */
261
+ function AlertDialogCancel({ size = "default", variant = "outline", ...props }: AlertDialogCancelProps): JSX.Element {
262
+ return (
263
+ <Button asChild size={size} variant={variant}>
264
+ <AlertDialogPrimitive.Cancel data-slot="alert-dialog-cancel" {...props} />
265
+ </Button>
266
+ );
267
+ }
268
+
269
+ /* -----------------------------------------------------------------------------
270
+ * Exports
271
+ * -------------------------------------------------------------------------- */
272
+
273
+ export {
274
+ AlertDialog,
275
+ AlertDialogAction,
276
+ AlertDialogBody,
277
+ AlertDialogCancel,
278
+ AlertDialogContent,
279
+ AlertDialogDescription,
280
+ AlertDialogFooter,
281
+ AlertDialogHeader,
282
+ AlertDialogMedia,
283
+ AlertDialogTitle,
284
+ AlertDialogTrigger,
285
+ };
286
+ export type {
287
+ AlertDialogActionProps,
288
+ AlertDialogBodyProps,
289
+ AlertDialogCancelProps,
290
+ AlertDialogContentProps,
291
+ AlertDialogDescriptionProps,
292
+ AlertDialogFooterProps,
293
+ AlertDialogHeaderProps,
294
+ AlertDialogMediaProps,
295
+ AlertDialogProps,
296
+ AlertDialogTitleProps,
297
+ AlertDialogTriggerProps,
298
+ };
@@ -0,0 +1,94 @@
1
+ import type { ComponentProps, JSX } from "react";
2
+
3
+ import { cn } from "#/lib/utils";
4
+ import type { AlertVariants } from "#/variants/alert";
5
+ import { alertVariants } from "#/variants/alert";
6
+
7
+ /* -----------------------------------------------------------------------------
8
+ * Component: Alert
9
+ * -------------------------------------------------------------------------- */
10
+
11
+ /**
12
+ * @since 0.3.16-canary.0
13
+ */
14
+ interface AlertProps extends ComponentProps<"div">, AlertVariants {}
15
+
16
+ /**
17
+ * @since 0.3.16-canary.0
18
+ */
19
+ function Alert({ className, variant, ...props }: AlertProps): JSX.Element {
20
+ return <div className={alertVariants({ className, variant })} data-slot="alert" role="alert" {...props} />;
21
+ }
22
+
23
+ /* -----------------------------------------------------------------------------
24
+ * Component: AlertTitle
25
+ * -------------------------------------------------------------------------- */
26
+
27
+ /**
28
+ * @since 0.3.16-canary.0
29
+ */
30
+ type AlertTitleProps = ComponentProps<"div">;
31
+
32
+ /**
33
+ * @since 0.3.16-canary.0
34
+ */
35
+ function AlertTitle({ className, ...props }: AlertTitleProps): JSX.Element {
36
+ return (
37
+ <div
38
+ className={cn(
39
+ "font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
40
+ className,
41
+ )}
42
+ data-slot="alert-title"
43
+ {...props}
44
+ />
45
+ );
46
+ }
47
+
48
+ /* -----------------------------------------------------------------------------
49
+ * Component: AlertDescription
50
+ * -------------------------------------------------------------------------- */
51
+
52
+ /**
53
+ * @since 0.3.16-canary.0
54
+ */
55
+ type AlertDescriptionProps = ComponentProps<"div">;
56
+
57
+ /**
58
+ * @since 0.3.16-canary.0
59
+ */
60
+ function AlertDescription({ className, ...props }: AlertDescriptionProps): JSX.Element {
61
+ return (
62
+ <div
63
+ className={cn(
64
+ "text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
65
+ className,
66
+ )}
67
+ data-slot="alert-description"
68
+ {...props}
69
+ />
70
+ );
71
+ }
72
+
73
+ /* -----------------------------------------------------------------------------
74
+ * Component: AlertAction
75
+ * -------------------------------------------------------------------------- */
76
+
77
+ /**
78
+ * @since 0.3.16-canary.0
79
+ */
80
+ type AlertActionProps = ComponentProps<"div">;
81
+
82
+ /**
83
+ * @since 0.3.16-canary.0
84
+ */
85
+ function AlertAction({ className, ...props }: AlertActionProps): JSX.Element {
86
+ return <div className={cn("absolute top-2.5 right-3", className)} data-slot="alert-action" {...props} />;
87
+ }
88
+
89
+ /* -----------------------------------------------------------------------------
90
+ * Exports
91
+ * -------------------------------------------------------------------------- */
92
+
93
+ export { Alert, AlertAction, AlertDescription, AlertTitle };
94
+ export type { AlertActionProps, AlertDescriptionProps, AlertProps, AlertTitleProps };
@@ -0,0 +1,25 @@
1
+ import { AspectRatio as AspectRatioPrimitive } from "radix-ui";
2
+ import type { ComponentProps, JSX } from "react";
3
+
4
+ /* -----------------------------------------------------------------------------
5
+ * Component: AspectRatio
6
+ * -------------------------------------------------------------------------- */
7
+
8
+ /**
9
+ * @since 0.3.16-canary.0
10
+ */
11
+ type AspectRatioProps = ComponentProps<typeof AspectRatioPrimitive.Root>;
12
+
13
+ /**
14
+ * @since 0.3.16-canary.0
15
+ */
16
+ function AspectRatio({ ...props }: AspectRatioProps): JSX.Element {
17
+ return <AspectRatioPrimitive.Root data-slot="aspect-ratio" {...props} />;
18
+ }
19
+
20
+ /* -----------------------------------------------------------------------------
21
+ * Exports
22
+ * -------------------------------------------------------------------------- */
23
+
24
+ export { AspectRatio };
25
+ export type { AspectRatioProps };
@@ -0,0 +1,171 @@
1
+ import { Avatar as AvatarPrimitive } from "radix-ui";
2
+ import type { ComponentProps, JSX } from "react";
3
+
4
+ import { cn } from "#/lib/utils";
5
+
6
+ /* -----------------------------------------------------------------------------
7
+ * Component: Avatar
8
+ * -------------------------------------------------------------------------- */
9
+
10
+ /**
11
+ * @since 0.3.16-canary.0
12
+ */
13
+ type AvatarProps = ComponentProps<typeof AvatarPrimitive.Root> & {
14
+ size?: "default" | "sm" | "lg";
15
+ };
16
+
17
+ /**
18
+ * @since 0.3.16-canary.0
19
+ */
20
+ function Avatar({ className, size = "default", ...props }: AvatarProps): JSX.Element {
21
+ return (
22
+ <AvatarPrimitive.Root
23
+ className={cn(
24
+ "group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten",
25
+ className,
26
+ )}
27
+ data-size={size}
28
+ data-slot="avatar"
29
+ {...props}
30
+ />
31
+ );
32
+ }
33
+
34
+ /* -----------------------------------------------------------------------------
35
+ * Component: AvatarImage
36
+ * -------------------------------------------------------------------------- */
37
+
38
+ /**
39
+ * @since 0.3.16-canary.0
40
+ */
41
+ type AvatarImageProps = ComponentProps<typeof AvatarPrimitive.Image>;
42
+
43
+ /**
44
+ * @since 0.3.16-canary.0
45
+ */
46
+ function AvatarImage({ className, ...props }: AvatarImageProps): JSX.Element {
47
+ return (
48
+ <AvatarPrimitive.Image
49
+ className={cn("aspect-square size-full rounded-full object-cover", className)}
50
+ data-slot="avatar-image"
51
+ {...props}
52
+ />
53
+ );
54
+ }
55
+
56
+ /* -----------------------------------------------------------------------------
57
+ * Component: AvatarFallback
58
+ * -------------------------------------------------------------------------- */
59
+
60
+ /**
61
+ * @since 0.3.16-canary.0
62
+ */
63
+ type AvatarFallbackProps = ComponentProps<typeof AvatarPrimitive.Fallback>;
64
+
65
+ /**
66
+ * @since 0.3.16-canary.0
67
+ */
68
+ function AvatarFallback({ className, ...props }: AvatarFallbackProps): JSX.Element {
69
+ return (
70
+ <AvatarPrimitive.Fallback
71
+ className={cn(
72
+ "flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs",
73
+ className,
74
+ )}
75
+ data-slot="avatar-fallback"
76
+ {...props}
77
+ />
78
+ );
79
+ }
80
+
81
+ /* -----------------------------------------------------------------------------
82
+ * Component: AvatarBadge
83
+ * -------------------------------------------------------------------------- */
84
+
85
+ /**
86
+ * @since 0.3.16-canary.0
87
+ */
88
+ type AvatarBadgeProps = ComponentProps<"span">;
89
+
90
+ /**
91
+ * @since 0.3.16-canary.0
92
+ */
93
+ function AvatarBadge({ className, ...props }: AvatarBadgeProps): JSX.Element {
94
+ return (
95
+ <span
96
+ className={cn(
97
+ "absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none",
98
+ "group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden",
99
+ "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2",
100
+ "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2",
101
+ className,
102
+ )}
103
+ data-slot="avatar-badge"
104
+ {...props}
105
+ />
106
+ );
107
+ }
108
+
109
+ /* -----------------------------------------------------------------------------
110
+ * Component: AvatarGroup
111
+ * -------------------------------------------------------------------------- */
112
+
113
+ /**
114
+ * @since 0.3.16-canary.0
115
+ */
116
+ type AvatarGroupProps = ComponentProps<"div">;
117
+
118
+ /**
119
+ * @since 0.3.16-canary.0
120
+ */
121
+ function AvatarGroup({ className, ...props }: AvatarGroupProps): JSX.Element {
122
+ return (
123
+ <div
124
+ className={cn(
125
+ "group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background",
126
+ className,
127
+ )}
128
+ data-slot="avatar-group"
129
+ {...props}
130
+ />
131
+ );
132
+ }
133
+
134
+ /* -----------------------------------------------------------------------------
135
+ * Component: AvatarGroupCount
136
+ * -------------------------------------------------------------------------- */
137
+
138
+ /**
139
+ * @since 0.3.16-canary.0
140
+ */
141
+ type AvatarGroupCountProps = ComponentProps<"div">;
142
+
143
+ /**
144
+ * @since 0.3.16-canary.0
145
+ */
146
+ function AvatarGroupCount({ className, ...props }: AvatarGroupCountProps): JSX.Element {
147
+ return (
148
+ <div
149
+ className={cn(
150
+ "relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
151
+ className,
152
+ )}
153
+ data-slot="avatar-group-count"
154
+ {...props}
155
+ />
156
+ );
157
+ }
158
+
159
+ /* -----------------------------------------------------------------------------
160
+ * Exports
161
+ * -------------------------------------------------------------------------- */
162
+
163
+ export { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage };
164
+ export type {
165
+ AvatarBadgeProps,
166
+ AvatarFallbackProps,
167
+ AvatarGroupCountProps,
168
+ AvatarGroupProps,
169
+ AvatarImageProps,
170
+ AvatarProps,
171
+ };