@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,185 @@
1
+ import type { ComponentProps, CSSProperties, JSX } from "react";
2
+ import { useCallback, useMemo } from "react";
3
+
4
+ import { useAnimatedValue } from "#/hooks/use-animated-value";
5
+ import * as ProgressCirclePrimitive from "#/primitives/progress-circle";
6
+ import type { ProgressCircleVariants } from "#/variants/progress-circle";
7
+ import { progressCircleVariants } from "#/variants/progress-circle";
8
+
9
+ /* -------------------------------------------------------------------------------------------------
10
+ * Component: ProgressCircle
11
+ * ----------------------------------------------------------------------------------------------- */
12
+
13
+ /**
14
+ * @since 0.3.16-canary.0
15
+ */
16
+ interface ProgressCircleProps
17
+ extends Omit<ComponentProps<typeof ProgressCirclePrimitive.Provider>, "children" | "size">, ProgressCircleVariants {
18
+ /**
19
+ * Enables animation effect when value changes
20
+ */
21
+ animate?: boolean;
22
+
23
+ /**
24
+ * Duration of the animation in milliseconds
25
+ */
26
+ animationDuration?: number;
27
+
28
+ /**
29
+ * CSS class to customize the entire component
30
+ */
31
+ className?: string;
32
+
33
+ /**
34
+ * CSS classes to customize specific parts of the component
35
+ */
36
+ classNames?: {
37
+ /**
38
+ * Class for the progress indicator
39
+ */
40
+ indicator?: string;
41
+
42
+ /**
43
+ * Class for the label in the center of the circle
44
+ */
45
+ label?: string;
46
+
47
+ /**
48
+ * Class for the root element of the component
49
+ */
50
+ root?: string;
51
+
52
+ /**
53
+ * Class for the SVG element
54
+ */
55
+ svg?: string;
56
+
57
+ /**
58
+ * Class for the circle track
59
+ */
60
+ track?: string;
61
+ };
62
+
63
+ /**
64
+ * Custom function to render content in the center of the circle
65
+ * @param value - Current value of the component
66
+ * @returns React element to display in the center of the circle
67
+ */
68
+ customLabel?: ({ value }: { value: number }) => JSX.Element;
69
+
70
+ /**
71
+ * Display the numeric value in the center of the circle
72
+ */
73
+ showValue?: boolean;
74
+
75
+ /**
76
+ * Custom size in pixels
77
+ * When provided, this value overrides the size variant option
78
+ */
79
+ sizeInPixels?: number;
80
+ }
81
+
82
+ /**
83
+ * @since 0.3.16-canary.0
84
+ */
85
+ function ProgressCircle({
86
+ animate = true,
87
+ animationDuration = 1000,
88
+ className,
89
+ classNames,
90
+ customLabel,
91
+ showValue = false,
92
+ size,
93
+ sizeInPixels,
94
+ strokeWidth,
95
+ thickness = "regular",
96
+ value = 0,
97
+ variant = "default",
98
+ ...props
99
+ }: ProgressCircleProps): JSX.Element {
100
+ const displayValue = useAnimatedValue(value, animationDuration, animate);
101
+
102
+ const actualSize = useMemo(() => sizeInPixels ?? getActualSize(size), [sizeInPixels, size]);
103
+
104
+ const actualThickness = useMemo(
105
+ () => strokeWidth ?? getStrokeWidth(thickness, actualSize),
106
+ [strokeWidth, thickness, actualSize],
107
+ );
108
+
109
+ const slots = useMemo(() => progressCircleVariants({ size, thickness, variant }), [variant, size, thickness]);
110
+
111
+ const shouldShowLabel = showValue || Boolean(customLabel);
112
+
113
+ const renderLabel = useCallback(() => {
114
+ if (customLabel) {
115
+ return customLabel({ value: displayValue });
116
+ }
117
+
118
+ return `${displayValue.toString()}%`;
119
+ }, [customLabel, displayValue]);
120
+
121
+ return (
122
+ <ProgressCirclePrimitive.Provider size={actualSize} strokeWidth={actualThickness} value={value} {...props}>
123
+ <ProgressCirclePrimitive.Root className={slots.root({ className: [className, classNames?.root] })}>
124
+ <ProgressCirclePrimitive.SVG className={slots.svg({ className: classNames?.svg })}>
125
+ <ProgressCirclePrimitive.Track className={slots.track({ className: classNames?.track })} />
126
+ <ProgressCirclePrimitive.Indicator
127
+ className={slots.indicator({ className: classNames?.indicator })}
128
+ style={
129
+ {
130
+ transitionDuration: `${animationDuration.toString()}ms`,
131
+ transitionProperty: "stroke-dashoffset",
132
+ } as CSSProperties
133
+ }
134
+ />
135
+ </ProgressCirclePrimitive.SVG>
136
+ {shouldShowLabel ? (
137
+ <ProgressCirclePrimitive.Value className={slots.label({ className: classNames?.label })}>
138
+ {renderLabel()}
139
+ </ProgressCirclePrimitive.Value>
140
+ ) : null}
141
+ </ProgressCirclePrimitive.Root>
142
+ </ProgressCirclePrimitive.Provider>
143
+ );
144
+ }
145
+
146
+ ProgressCircle.displayName = "ProgressCircle";
147
+
148
+ /* -----------------------------------------------------------------------------
149
+ * Helpers
150
+ * -------------------------------------------------------------------------- */
151
+
152
+ /**
153
+ * Maps size variants to actual pixel sizes
154
+ */
155
+ const getActualSize = (size?: ProgressCircleVariants["size"]): number => {
156
+ const sizeMap: Record<NonNullable<typeof size>, number> = {
157
+ "2xl": 128,
158
+ lg: 64,
159
+ md: 48,
160
+ sm: 32,
161
+ xl: 96,
162
+ };
163
+
164
+ return size ? sizeMap[size] : 48;
165
+ };
166
+
167
+ /**
168
+ * Calculates stroke width based on thickness variant and circle size
169
+ */
170
+ const getStrokeWidth = (thickness: ProgressCircleVariants["thickness"], size: number): number => {
171
+ const thicknessMap: Record<NonNullable<typeof thickness>, number> = {
172
+ regular: Math.max(3, size * 0.05),
173
+ thick: Math.max(4, size * 0.075),
174
+ thin: Math.max(2, size * 0.025),
175
+ };
176
+
177
+ return thickness ? thicknessMap[thickness] : Math.max(3, size * 0.05);
178
+ };
179
+
180
+ /* -----------------------------------------------------------------------------
181
+ * Exports
182
+ * -------------------------------------------------------------------------- */
183
+
184
+ export { ProgressCircle };
185
+ export type { ProgressCircleProps };
@@ -0,0 +1,41 @@
1
+ import { Progress as ProgressPrimitive } from "radix-ui";
2
+ import type { ComponentProps, JSX } from "react";
3
+
4
+ import { cn } from "#/lib/utils";
5
+
6
+ /* -----------------------------------------------------------------------------
7
+ * Component: Progress
8
+ * -------------------------------------------------------------------------- */
9
+
10
+ /**
11
+ * @since 0.3.16-canary.0
12
+ */
13
+ type ProgressProps = ComponentProps<typeof ProgressPrimitive.Root>;
14
+
15
+ /**
16
+ * @since 0.3.16-canary.0
17
+ */
18
+ function Progress({ className, value, ...props }: ProgressProps): JSX.Element {
19
+ return (
20
+ <ProgressPrimitive.Root
21
+ className={cn("relative flex h-1.5 w-full items-center overflow-x-hidden rounded-full bg-muted", className)}
22
+ data-slot="progress"
23
+ {...props}
24
+ >
25
+ <ProgressPrimitive.Indicator
26
+ className="size-full flex-1 bg-primary transition-all"
27
+ data-slot="progress-indicator"
28
+ style={{
29
+ transform: `translateX(-${(100 - (value ?? 0)).toString()}%)`,
30
+ }}
31
+ />
32
+ </ProgressPrimitive.Root>
33
+ );
34
+ }
35
+
36
+ /* -----------------------------------------------------------------------------
37
+ * Exports
38
+ * -------------------------------------------------------------------------- */
39
+
40
+ export { Progress };
41
+ export type { ProgressProps };
@@ -0,0 +1,66 @@
1
+ import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
2
+ import type { ComponentProps, JSX } from "react";
3
+
4
+ import { Label } from "#/components/label";
5
+ import { cn } from "#/lib/utils";
6
+
7
+ /* -----------------------------------------------------------------------------
8
+ * Component: RadioCards
9
+ * -------------------------------------------------------------------------- */
10
+
11
+ /**
12
+ * @since 0.3.16-canary.0
13
+ */
14
+ type RadioCardsProps = ComponentProps<typeof RadioGroupPrimitive.Root>;
15
+
16
+ /**
17
+ * @since 0.3.16-canary.0
18
+ */
19
+ function RadioCards(props: RadioCardsProps): JSX.Element {
20
+ return <RadioGroupPrimitive.Root data-slot="radio-cards" {...props} />;
21
+ }
22
+
23
+ /* -----------------------------------------------------------------------------
24
+ * Component: RadioCardsItem
25
+ * -------------------------------------------------------------------------- */
26
+
27
+ /**
28
+ * @since 0.3.16-canary.0
29
+ */
30
+ type RadioCardsItemProps = ComponentProps<typeof RadioGroupPrimitive.Item>;
31
+
32
+ /**
33
+ * @since 0.3.16-canary.0
34
+ */
35
+ function RadioCardsItem({ children, className, ...props }: RadioCardsItemProps): JSX.Element {
36
+ return (
37
+ <Label
38
+ className="flex items-start gap-3 rounded-md border border-input p-3 transition has-focus-visible:border-ring has-disabled:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5"
39
+ data-slot="radio-card"
40
+ >
41
+ <RadioGroupPrimitive.Item
42
+ className={cn(
43
+ "peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none 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",
44
+ className,
45
+ )}
46
+ data-slot="radio-card-item"
47
+ {...props}
48
+ >
49
+ <RadioGroupPrimitive.Indicator
50
+ className="flex size-4 items-center justify-center"
51
+ data-slot="radio-card-indicator"
52
+ >
53
+ <span className="absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground" />
54
+ </RadioGroupPrimitive.Indicator>
55
+ </RadioGroupPrimitive.Item>
56
+ {children}
57
+ </Label>
58
+ );
59
+ }
60
+
61
+ /* -----------------------------------------------------------------------------
62
+ * Exports
63
+ * -------------------------------------------------------------------------- */
64
+
65
+ export { RadioCards, RadioCardsItem };
66
+ export type { RadioCardsItemProps, RadioCardsProps };
@@ -0,0 +1,59 @@
1
+ import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
2
+ import type { ComponentProps, JSX } from "react";
3
+
4
+ import { cn } from "#/lib/utils";
5
+
6
+ /* -----------------------------------------------------------------------------
7
+ * Component: RadioGroup
8
+ * -------------------------------------------------------------------------- */
9
+
10
+ /**
11
+ * @since 0.3.16-canary.0
12
+ */
13
+ type RadioGroupProps = ComponentProps<typeof RadioGroupPrimitive.Root>;
14
+
15
+ /**
16
+ * @since 0.3.16-canary.0
17
+ */
18
+ function RadioGroup({ className, ...props }: RadioGroupProps): JSX.Element {
19
+ return <RadioGroupPrimitive.Root className={cn("grid w-full gap-3", className)} data-slot="radio-group" {...props} />;
20
+ }
21
+
22
+ /* -----------------------------------------------------------------------------
23
+ * Component: RadioGroupItem
24
+ * -------------------------------------------------------------------------- */
25
+
26
+ /**
27
+ * @since 0.3.16-canary.0
28
+ */
29
+ type RadioGroupItemProps = ComponentProps<typeof RadioGroupPrimitive.Item>;
30
+
31
+ /**
32
+ * @since 0.3.16-canary.0
33
+ */
34
+ function RadioGroupItem({ className, ...props }: RadioGroupItemProps): JSX.Element {
35
+ return (
36
+ <RadioGroupPrimitive.Item
37
+ className={cn(
38
+ "group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none 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",
39
+ className,
40
+ )}
41
+ data-slot="radio-group-item"
42
+ {...props}
43
+ >
44
+ <RadioGroupPrimitive.Indicator
45
+ className="flex size-4 items-center justify-center"
46
+ data-slot="radio-group-indicator"
47
+ >
48
+ <span className="absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground" />
49
+ </RadioGroupPrimitive.Indicator>
50
+ </RadioGroupPrimitive.Item>
51
+ );
52
+ }
53
+
54
+ /* -----------------------------------------------------------------------------
55
+ * Exports
56
+ * -------------------------------------------------------------------------- */
57
+
58
+ export { RadioGroup, RadioGroupItem };
59
+ export type { RadioGroupItemProps, RadioGroupProps };
@@ -0,0 +1,40 @@
1
+ import { composeEventHandlers } from "radix-ui/internal";
2
+ import type { ComponentProps, JSX } from "react";
3
+
4
+ import { cn } from "#/lib/utils";
5
+
6
+ /* -----------------------------------------------------------------------------
7
+ * Component: Radio
8
+ * -------------------------------------------------------------------------- */
9
+
10
+ /**
11
+ * @since 0.3.16-canary.0
12
+ */
13
+ interface RadioProps extends Omit<ComponentProps<"input">, "type"> {
14
+ onValueChange?: (value: string) => void;
15
+ }
16
+
17
+ /**
18
+ * @since 0.3.16-canary.0
19
+ */
20
+ function Radio({ className, onChange, onValueChange, ...props }: RadioProps): JSX.Element {
21
+ return (
22
+ <input
23
+ className={cn(
24
+ "peer relative flex size-4 shrink-0 appearance-none items-center justify-center rounded-full border border-input shadow-xs outline-none before:size-full before:rounded-full before:bg-background after:absolute after:-inset-x-3 after:-inset-y-2 checked:border-primary checked:bg-primary checked:before:size-2 checked:before:bg-primary-foreground focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:not-checked:border-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 checked:aria-invalid:bg-destructive dark:not-checked:before:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
25
+ className,
26
+ )}
27
+ data-slot="radio"
28
+ type="radio"
29
+ onChange={composeEventHandlers(onChange, (event) => onValueChange?.(event.currentTarget.value))}
30
+ {...props}
31
+ />
32
+ );
33
+ }
34
+
35
+ /* -----------------------------------------------------------------------------
36
+ * Exports
37
+ * -------------------------------------------------------------------------- */
38
+
39
+ export { Radio };
40
+ export type { RadioProps };
@@ -0,0 +1,78 @@
1
+ import type { ComponentProps, JSX } from "react";
2
+ import * as ResizablePrimitive from "react-resizable-panels";
3
+
4
+ import { cn } from "#/lib/utils";
5
+
6
+ /* -----------------------------------------------------------------------------
7
+ * Component: ResizableGroup
8
+ * -------------------------------------------------------------------------- */
9
+
10
+ /**
11
+ * @since 0.3.16-canary.0
12
+ */
13
+ type ResizableGroupProps = ComponentProps<typeof ResizablePrimitive.Group>;
14
+
15
+ /**
16
+ * @since 0.3.16-canary.0
17
+ */
18
+ function ResizableGroup({ className, ...props }: ResizableGroupProps): JSX.Element {
19
+ return (
20
+ <ResizablePrimitive.Group
21
+ className={cn("flex h-full w-full aria-[orientation=vertical]:flex-col", className)}
22
+ data-slot="resizable-group"
23
+ {...props}
24
+ />
25
+ );
26
+ }
27
+
28
+ /* -----------------------------------------------------------------------------
29
+ * Component: ResizablePanel
30
+ * -------------------------------------------------------------------------- */
31
+
32
+ /**
33
+ * @since 0.3.16-canary.0
34
+ */
35
+ type ResizablePanelProps = ComponentProps<typeof ResizablePrimitive.Panel>;
36
+
37
+ /**
38
+ * @since 0.3.16-canary.0
39
+ */
40
+ function ResizablePanel({ ...props }: ResizablePanelProps): JSX.Element {
41
+ return <ResizablePrimitive.Panel data-slot="resizable-panel" {...props} />;
42
+ }
43
+
44
+ /* -----------------------------------------------------------------------------
45
+ * Component: ResizableSeparator
46
+ * -------------------------------------------------------------------------- */
47
+
48
+ /**
49
+ * @since 0.3.16-canary.0
50
+ */
51
+ interface ResizableSeparatorProps extends ComponentProps<typeof ResizablePrimitive.Separator> {
52
+ withHandle?: boolean;
53
+ }
54
+
55
+ /**
56
+ * @since 0.3.16-canary.0
57
+ */
58
+ function ResizableSeparator({ className, withHandle, ...props }: ResizableSeparatorProps): JSX.Element {
59
+ return (
60
+ <ResizablePrimitive.Separator
61
+ className={cn(
62
+ "relative flex w-px items-center justify-center bg-border ring-offset-background after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:left-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 [&[aria-orientation=horizontal]>div]:rotate-90",
63
+ className,
64
+ )}
65
+ data-slot="resizable-separator"
66
+ {...props}
67
+ >
68
+ {withHandle ? <div className="z-10 flex h-6 w-1 shrink-0 rounded-lg bg-border" /> : null}
69
+ </ResizablePrimitive.Separator>
70
+ );
71
+ }
72
+
73
+ /* -----------------------------------------------------------------------------
74
+ * Exports
75
+ * -------------------------------------------------------------------------- */
76
+
77
+ export { ResizableGroup, ResizablePanel, ResizableSeparator };
78
+ export type { ResizableGroupProps, ResizablePanelProps, ResizableSeparatorProps };
@@ -0,0 +1,95 @@
1
+ import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
2
+ import { Context } from "radix-ui/internal";
3
+ import type { ComponentProps, JSX } from "react";
4
+
5
+ import { cn } from "#/lib/utils";
6
+ import type { ScrollAreaScrollbarVariants } from "#/variants/scroll-area";
7
+ import { scrollAreaScrollbarVariants } from "#/variants/scroll-area";
8
+
9
+ /* -----------------------------------------------------------------------------
10
+ * Context: ScrollArea
11
+ * -------------------------------------------------------------------------- */
12
+
13
+ const SCROLL_AREA_NAME = "ScrollArea";
14
+
15
+ type ScopedProps<P> = P & { __scopeScrollArea?: Context.Scope };
16
+
17
+ const [createScrollAreaContext] = Context.createContextScope(SCROLL_AREA_NAME);
18
+
19
+ type ScrollAreaContextValue = Pick<ScrollAreaScrollbarVariants, "size">;
20
+
21
+ const [ScrollAreaContextProvider, useScrollAreaContext] =
22
+ createScrollAreaContext<ScrollAreaContextValue>(SCROLL_AREA_NAME);
23
+
24
+ /* -----------------------------------------------------------------------------
25
+ * Component: ScrollArea
26
+ * -------------------------------------------------------------------------- */
27
+
28
+ /**
29
+ * @since 0.3.16-canary.0
30
+ */
31
+ type ScrollAreaProps = ScopedProps<ComponentProps<typeof ScrollAreaPrimitive.Root> & ScrollAreaContextValue>;
32
+
33
+ /**
34
+ * @since 0.3.16-canary.0
35
+ */
36
+ function ScrollArea({ __scopeScrollArea, children, className, size, ...props }: ScrollAreaProps): JSX.Element {
37
+ return (
38
+ <ScrollAreaContextProvider scope={__scopeScrollArea} size={size}>
39
+ <ScrollAreaPrimitive.Root className={cn("relative", className)} data-slot="scroll-area" {...props}>
40
+ <ScrollAreaPrimitive.Viewport
41
+ className="size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1"
42
+ data-slot="scroll-area-viewport"
43
+ >
44
+ {children}
45
+ </ScrollAreaPrimitive.Viewport>
46
+ <ScrollAreaScrollbar orientation="vertical" />
47
+ <ScrollAreaScrollbar orientation="horizontal" />
48
+ <ScrollAreaPrimitive.Corner />
49
+ </ScrollAreaPrimitive.Root>
50
+ </ScrollAreaContextProvider>
51
+ );
52
+ }
53
+
54
+ /* -----------------------------------------------------------------------------
55
+ * Component: ScrollAreaScrollbar
56
+ * -------------------------------------------------------------------------- */
57
+
58
+ /**
59
+ * @since 0.3.16-canary.0
60
+ */
61
+ type ScrollAreaScrollbarProps = ScopedProps<ComponentProps<typeof ScrollAreaPrimitive.Scrollbar>>;
62
+
63
+ /**
64
+ * @since 0.3.16-canary.0
65
+ */
66
+ function ScrollAreaScrollbar({
67
+ __scopeScrollArea,
68
+ className,
69
+ orientation,
70
+ ...props
71
+ }: ScrollAreaScrollbarProps): JSX.Element {
72
+ const { size } = useScrollAreaContext(SCROLL_AREA_NAME, __scopeScrollArea);
73
+
74
+ return (
75
+ <ScrollAreaPrimitive.Scrollbar
76
+ className={scrollAreaScrollbarVariants({ className, orientation, size })}
77
+ data-orientation={orientation}
78
+ data-slot="scroll-area-scrollbar"
79
+ orientation={orientation}
80
+ {...props}
81
+ >
82
+ <ScrollAreaPrimitive.ScrollAreaThumb
83
+ className="relative flex-1 rounded-full bg-border"
84
+ data-slot="scroll-area-thumb"
85
+ />
86
+ </ScrollAreaPrimitive.Scrollbar>
87
+ );
88
+ }
89
+
90
+ /* -----------------------------------------------------------------------------
91
+ * Exports
92
+ * -------------------------------------------------------------------------- */
93
+
94
+ export { ScrollArea, ScrollAreaScrollbar };
95
+ export type { ScrollAreaProps, ScrollAreaScrollbarProps };