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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +27 -16
  3. package/dist/components/accordion.d.mts +7 -22
  4. package/dist/components/accordion.mjs +26 -29
  5. package/dist/components/alert-dialog.d.mts +27 -26
  6. package/dist/components/alert-dialog.mjs +53 -45
  7. package/dist/components/alert.d.mts +12 -2
  8. package/dist/components/alert.mjs +15 -6
  9. package/dist/components/aspect-ratio.d.mts +2 -2
  10. package/dist/components/aspect-ratio.mjs +2 -3
  11. package/dist/components/avatar.d.mts +41 -5
  12. package/dist/components/avatar.mjs +40 -10
  13. package/dist/components/badge.mjs +4 -4
  14. package/dist/components/breadcrumb.d.mts +1 -0
  15. package/dist/components/breadcrumb.mjs +11 -10
  16. package/dist/components/button-group.d.mts +1 -1
  17. package/dist/components/button-group.mjs +6 -7
  18. package/dist/components/button.d.mts +0 -1
  19. package/dist/components/button.mjs +7 -7
  20. package/dist/components/calendar.d.mts +6 -2
  21. package/dist/components/calendar.mjs +39 -43
  22. package/dist/components/card.d.mts +4 -2
  23. package/dist/components/card.mjs +9 -9
  24. package/dist/components/carousel.d.mts +16 -4
  25. package/dist/components/carousel.mjs +24 -11
  26. package/dist/components/chart.d.mts +8 -3
  27. package/dist/components/chart.mjs +21 -15
  28. package/dist/components/checkbox-cards.mjs +4 -4
  29. package/dist/components/checkbox-group.mjs +3 -4
  30. package/dist/components/checkbox.d.mts +2 -2
  31. package/dist/components/checkbox.mjs +6 -7
  32. package/dist/components/collapsible.d.mts +4 -4
  33. package/dist/components/collapsible.mjs +4 -5
  34. package/dist/components/command.d.mts +11 -1
  35. package/dist/components/command.mjs +35 -32
  36. package/dist/components/context-menu.d.mts +22 -15
  37. package/dist/components/context-menu.mjs +44 -39
  38. package/dist/components/dialog.d.mts +19 -23
  39. package/dist/components/dialog.mjs +48 -47
  40. package/dist/components/direction.d.mts +24 -0
  41. package/dist/components/direction.mjs +18 -0
  42. package/dist/components/drawer.d.mts +2 -20
  43. package/dist/components/drawer.mjs +17 -25
  44. package/dist/components/dropdown-menu.d.mts +22 -15
  45. package/dist/components/dropdown-menu.mjs +41 -37
  46. package/dist/components/empty.mjs +5 -5
  47. package/dist/components/field.d.mts +1 -1
  48. package/dist/components/field.mjs +11 -12
  49. package/dist/components/form.d.mts +6 -7
  50. package/dist/components/form.mjs +6 -7
  51. package/dist/components/hover-card.d.mts +5 -5
  52. package/dist/components/hover-card.mjs +14 -12
  53. package/dist/components/input-group.d.mts +1 -1
  54. package/dist/components/input-group.mjs +12 -7
  55. package/dist/components/input-number.d.mts +3 -1
  56. package/dist/components/input-number.mjs +49 -27
  57. package/dist/components/input-otp.mjs +9 -7
  58. package/dist/components/input-password.mjs +1 -4
  59. package/dist/components/input-search.mjs +3 -5
  60. package/dist/components/input.mjs +1 -2
  61. package/dist/components/item.mjs +9 -9
  62. package/dist/components/kbd.mjs +1 -1
  63. package/dist/components/label.d.mts +2 -2
  64. package/dist/components/label.mjs +3 -4
  65. package/dist/components/menubar.d.mts +22 -16
  66. package/dist/components/menubar.mjs +54 -47
  67. package/dist/components/native-select.d.mts +5 -1
  68. package/dist/components/native-select.mjs +9 -6
  69. package/dist/components/navigation-menu.d.mts +30 -8
  70. package/dist/components/navigation-menu.mjs +33 -23
  71. package/dist/components/pagination.d.mts +6 -0
  72. package/dist/components/pagination.mjs +26 -11
  73. package/dist/components/popover.d.mts +40 -7
  74. package/dist/components/popover.mjs +46 -14
  75. package/dist/components/progress-circle.d.mts +1 -1
  76. package/dist/components/progress-circle.mjs +1 -2
  77. package/dist/components/progress.d.mts +2 -2
  78. package/dist/components/progress.mjs +5 -6
  79. package/dist/components/radio-cards.d.mts +3 -3
  80. package/dist/components/radio-cards.mjs +11 -11
  81. package/dist/components/radio-group.d.mts +3 -3
  82. package/dist/components/radio-group.mjs +9 -9
  83. package/dist/components/radio.mjs +2 -3
  84. package/dist/components/resizable.mjs +3 -8
  85. package/dist/components/scroll-area.d.mts +5 -5
  86. package/dist/components/scroll-area.mjs +13 -10
  87. package/dist/components/select.d.mts +14 -14
  88. package/dist/components/select.mjs +47 -47
  89. package/dist/components/separator.d.mts +2 -2
  90. package/dist/components/separator.mjs +3 -4
  91. package/dist/components/sheet.d.mts +13 -14
  92. package/dist/components/sheet.mjs +41 -39
  93. package/dist/components/sidebar.d.mts +2 -3
  94. package/dist/components/sidebar.mjs +46 -46
  95. package/dist/components/skeleton.mjs +1 -1
  96. package/dist/components/slider.d.mts +2 -2
  97. package/dist/components/slider.mjs +9 -11
  98. package/dist/components/sonner.mjs +11 -3
  99. package/dist/components/spinner.mjs +6 -7
  100. package/dist/components/switch.d.mts +5 -2
  101. package/dist/components/switch.mjs +7 -7
  102. package/dist/components/table.mjs +10 -10
  103. package/dist/components/tabs.d.mts +8 -5
  104. package/dist/components/tabs.mjs +18 -12
  105. package/dist/components/textarea.mjs +1 -1
  106. package/dist/components/toggle-group.d.mts +9 -6
  107. package/dist/components/toggle-group.mjs +19 -20
  108. package/dist/components/toggle.d.mts +2 -3
  109. package/dist/components/toggle.mjs +4 -6
  110. package/dist/components/tooltip.d.mts +7 -6
  111. package/dist/components/tooltip.mjs +19 -17
  112. package/dist/hooks/use-animated-value.mjs +0 -1
  113. package/dist/hooks/use-copy-to-clipboard.mjs +0 -1
  114. package/dist/hooks/use-is-mobile.mjs +0 -1
  115. package/dist/hooks/use-media-query.mjs +0 -1
  116. package/dist/hooks/use-mutation-observer.mjs +0 -1
  117. package/dist/hooks/use-pagination.mjs +0 -1
  118. package/dist/index.d.mts +15 -13
  119. package/dist/index.mjs +18 -16
  120. package/dist/primitives/checkbox-group.d.mts +9 -10
  121. package/dist/primitives/checkbox-group.mjs +14 -19
  122. package/dist/primitives/input-number.d.mts +3 -3
  123. package/dist/primitives/input-number.mjs +3 -5
  124. package/dist/primitives/input.d.mts +4 -4
  125. package/dist/primitives/input.mjs +2 -3
  126. package/dist/primitives/progress-circle.d.mts +3 -3
  127. package/dist/primitives/progress-circle.mjs +2 -3
  128. package/dist/variants/alert.d.mts +1 -1
  129. package/dist/variants/alert.mjs +3 -13
  130. package/dist/variants/badge.d.mts +6 -4
  131. package/dist/variants/badge.mjs +7 -34
  132. package/dist/variants/button-group.d.mts +2 -2
  133. package/dist/variants/button-group.mjs +3 -14
  134. package/dist/variants/button.d.mts +12 -10
  135. package/dist/variants/button.mjs +15 -57
  136. package/dist/variants/empty.d.mts +1 -1
  137. package/dist/variants/empty.mjs +2 -7
  138. package/dist/variants/field.d.mts +3 -3
  139. package/dist/variants/field.mjs +4 -22
  140. package/dist/variants/input-group.d.mts +9 -9
  141. package/dist/variants/input-group.mjs +11 -70
  142. package/dist/variants/input-number.d.mts +45 -0
  143. package/dist/variants/input-number.mjs +40 -0
  144. package/dist/variants/item.d.mts +5 -4
  145. package/dist/variants/item.mjs +9 -31
  146. package/dist/variants/navigation-menu.d.mts +1 -1
  147. package/dist/variants/navigation-menu.mjs +1 -5
  148. package/dist/variants/progress-circle.d.mts +1 -1
  149. package/dist/variants/progress-circle.mjs +1 -5
  150. package/dist/variants/scroll-area.d.mts +2 -2
  151. package/dist/variants/scroll-area.mjs +3 -8
  152. package/dist/variants/separator.mjs +6 -6
  153. package/dist/variants/sheet.d.mts +4 -4
  154. package/dist/variants/sheet.mjs +5 -38
  155. package/dist/variants/sidebar.d.mts +4 -4
  156. package/dist/variants/sidebar.mjs +6 -23
  157. package/dist/variants/tabs.d.mts +18 -0
  158. package/dist/variants/tabs.mjs +15 -0
  159. package/dist/variants/toggle.d.mts +4 -4
  160. package/dist/variants/toggle.mjs +9 -27
  161. package/package.json +27 -44
  162. package/src/components/accordion.tsx +26 -68
  163. package/src/components/alert-dialog.tsx +70 -86
  164. package/src/components/alert.tsx +27 -19
  165. package/src/components/aspect-ratio.tsx +1 -4
  166. package/src/components/avatar.tsx +99 -12
  167. package/src/components/badge.tsx +5 -8
  168. package/src/components/breadcrumb.tsx +18 -24
  169. package/src/components/button-group.tsx +10 -20
  170. package/src/components/button.tsx +8 -19
  171. package/src/components/calendar.tsx +77 -132
  172. package/src/components/card.tsx +16 -22
  173. package/src/components/carousel.tsx +38 -56
  174. package/src/components/chart.tsx +41 -92
  175. package/src/components/checkbox-cards.tsx +10 -30
  176. package/src/components/checkbox-group.tsx +5 -28
  177. package/src/components/checkbox.tsx +5 -26
  178. package/src/components/collapsible.tsx +1 -4
  179. package/src/components/command.tsx +52 -65
  180. package/src/components/context-menu.tsx +46 -125
  181. package/src/components/dialog.tsx +49 -101
  182. package/src/components/direction.tsx +32 -0
  183. package/src/components/drawer.tsx +17 -79
  184. package/src/components/dropdown-menu.tsx +39 -118
  185. package/src/components/empty.tsx +6 -20
  186. package/src/components/field.tsx +19 -52
  187. package/src/components/form.tsx +19 -61
  188. package/src/components/hover-card.tsx +4 -27
  189. package/src/components/input-group.tsx +13 -52
  190. package/src/components/input-number.tsx +55 -75
  191. package/src/components/input-otp.tsx +19 -38
  192. package/src/components/input-password.tsx +5 -29
  193. package/src/components/input-search.tsx +6 -23
  194. package/src/components/input.tsx +1 -17
  195. package/src/components/item.tsx +17 -31
  196. package/src/components/kbd.tsx +2 -14
  197. package/src/components/label.tsx +2 -10
  198. package/src/components/menubar.tsx +34 -125
  199. package/src/components/native-select.tsx +21 -30
  200. package/src/components/navigation-menu.tsx +34 -94
  201. package/src/components/pagination.tsx +28 -34
  202. package/src/components/popover.tsx +66 -35
  203. package/src/components/progress-circle.tsx +7 -25
  204. package/src/components/progress.tsx +3 -16
  205. package/src/components/radio-cards.tsx +8 -27
  206. package/src/components/radio-group.tsx +7 -27
  207. package/src/components/radio.tsx +3 -24
  208. package/src/components/resizable.tsx +5 -26
  209. package/src/components/scroll-area.tsx +12 -32
  210. package/src/components/select.tsx +36 -59
  211. package/src/components/separator.tsx +4 -18
  212. package/src/components/sheet.tsx +37 -74
  213. package/src/components/sidebar.tsx +47 -177
  214. package/src/components/skeleton.tsx +1 -3
  215. package/src/components/slider.tsx +7 -36
  216. package/src/components/sonner.tsx +16 -6
  217. package/src/components/spinner.tsx +6 -15
  218. package/src/components/switch.tsx +8 -30
  219. package/src/components/table.tsx +18 -35
  220. package/src/components/tabs.tsx +16 -34
  221. package/src/components/textarea.tsx +1 -15
  222. package/src/components/toggle-group.tsx +34 -38
  223. package/src/components/toggle.tsx +4 -13
  224. package/src/components/tooltip.tsx +11 -37
  225. package/src/css/foundation/base.css +50 -0
  226. package/src/css/foundation/motion.css +36 -0
  227. package/src/css/foundation/source.css +3 -0
  228. package/src/css/foundation/tokens.css +71 -0
  229. package/src/css/foundation/variants.css +113 -0
  230. package/src/css/preset.css +5 -214
  231. package/src/css/style.css +1 -1
  232. package/src/hooks/use-animated-value.ts +1 -7
  233. package/src/hooks/use-copy-to-clipboard.ts +1 -6
  234. package/src/hooks/use-is-mobile.ts +0 -2
  235. package/src/hooks/use-media-query.ts +0 -2
  236. package/src/hooks/use-mutation-observer.ts +0 -3
  237. package/src/hooks/use-pagination.ts +0 -2
  238. package/src/index.ts +39 -80
  239. package/src/primitives/checkbox-group.tsx +25 -39
  240. package/src/primitives/input-number.tsx +17 -63
  241. package/src/primitives/input.tsx +8 -24
  242. package/src/primitives/progress-circle.tsx +13 -43
  243. package/src/variants/alert.ts +3 -14
  244. package/src/variants/badge.ts +8 -35
  245. package/src/variants/button-group.ts +5 -18
  246. package/src/variants/button.ts +21 -58
  247. package/src/variants/empty.ts +2 -11
  248. package/src/variants/field.ts +6 -19
  249. package/src/variants/input-group.ts +12 -64
  250. package/src/variants/input-number.ts +65 -0
  251. package/src/variants/item.ts +10 -32
  252. package/src/variants/navigation-menu.ts +1 -8
  253. package/src/variants/progress-circle.ts +1 -2
  254. package/src/variants/scroll-area.ts +3 -9
  255. package/src/variants/separator.ts +6 -7
  256. package/src/variants/sheet.ts +6 -39
  257. package/src/variants/sidebar.ts +7 -27
  258. package/src/variants/tabs.ts +34 -0
  259. package/src/variants/toggle.ts +9 -28
  260. /package/src/css/{amber.css → themes/amber.css} +0 -0
  261. /package/src/css/{blue.css → themes/blue.css} +0 -0
  262. /package/src/css/{cyan.css → themes/cyan.css} +0 -0
  263. /package/src/css/{emerald.css → themes/emerald.css} +0 -0
  264. /package/src/css/{fuchsia.css → themes/fuchsia.css} +0 -0
  265. /package/src/css/{gray.css → themes/gray.css} +0 -0
  266. /package/src/css/{green.css → themes/green.css} +0 -0
  267. /package/src/css/{indigo.css → themes/indigo.css} +0 -0
  268. /package/src/css/{lime.css → themes/lime.css} +0 -0
  269. /package/src/css/{neutral.css → themes/neutral.css} +0 -0
  270. /package/src/css/{orange.css → themes/orange.css} +0 -0
  271. /package/src/css/{pink.css → themes/pink.css} +0 -0
  272. /package/src/css/{purple.css → themes/purple.css} +0 -0
  273. /package/src/css/{red.css → themes/red.css} +0 -0
  274. /package/src/css/{rose.css → themes/rose.css} +0 -0
  275. /package/src/css/{sky.css → themes/sky.css} +0 -0
  276. /package/src/css/{slate.css → themes/slate.css} +0 -0
  277. /package/src/css/{stone.css → themes/stone.css} +0 -0
  278. /package/src/css/{teal.css → themes/teal.css} +0 -0
  279. /package/src/css/{violet.css → themes/violet.css} +0 -0
  280. /package/src/css/{yellow.css → themes/yellow.css} +0 -0
  281. /package/src/css/{zinc.css → themes/zinc.css} +0 -0
@@ -1,16 +1,12 @@
1
- "use client";
2
-
3
- import type { Scope } from "@radix-ui/react-context";
4
1
  import type { UseEmblaCarouselType } from "embla-carousel-react";
5
- import type { ComponentProps, JSX, KeyboardEvent } from "react";
6
-
7
- import { cn } from "#/lib/utils";
8
- import { createContextScope } from "@radix-ui/react-context";
9
2
  import useEmblaCarousel from "embla-carousel-react";
10
- import { ArrowLeftIcon, ArrowRightIcon } from "lucide-react";
3
+ import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react";
4
+ import { Context } from "radix-ui/internal";
5
+ import type { ComponentProps, JSX, KeyboardEvent } from "react";
11
6
  import { useCallback, useEffect, useState } from "react";
12
7
 
13
8
  import { Button } from "#/components/button";
9
+ import { cn } from "#/lib/utils";
14
10
 
15
11
  /* -----------------------------------------------------------------------------
16
12
  * Context: Carousel
@@ -18,9 +14,9 @@ import { Button } from "#/components/button";
18
14
 
19
15
  const CAROUSEL_NAME = "Carousel";
20
16
 
21
- type ScopedProps<P> = P & { __scopeCarousel?: Scope };
17
+ type ScopedProps<P> = P & { __scopeCarousel?: Context.Scope };
22
18
 
23
- const [createCarouselContext, createCarouselScope] = createContextScope(CAROUSEL_NAME);
19
+ const [createCarouselContext, createCarouselScope] = Context.createContextScope(CAROUSEL_NAME);
24
20
 
25
21
  /**
26
22
  * @since 0.3.16-canary.0
@@ -46,8 +42,7 @@ type CarouselContextValue = BaseCarouselProps & {
46
42
  scrollPrev: () => void;
47
43
  };
48
44
 
49
- const [CarouselContextProvider, useCarouselContext] =
50
- createCarouselContext<CarouselContextValue>(CAROUSEL_NAME);
45
+ const [CarouselContextProvider, useCarouselContext] = createCarouselContext<CarouselContextValue>(CAROUSEL_NAME);
51
46
 
52
47
  /* -----------------------------------------------------------------------------
53
48
  * Component: Carousel
@@ -150,8 +145,10 @@ function Carousel({
150
145
  scrollPrev={scrollPrevious}
151
146
  >
152
147
  <div
148
+ aria-roledescription="carousel"
153
149
  className={cn("relative", className)}
154
150
  data-slot="carousel"
151
+ role="region"
155
152
  onKeyDownCapture={handleKeyDown}
156
153
  {...props}
157
154
  >
@@ -172,12 +169,26 @@ const CAROUSEL_CONTENT_NAME = "CarouselContent";
172
169
  */
173
170
  interface CarouselContentProps extends ComponentProps<"div"> {
174
171
  classNames?: {
172
+ /** Class applied to the flex track that holds the slides. */
175
173
  content?: string;
174
+ /** Class applied to the scroll viewport (the `overflow-hidden` element). */
176
175
  wrapper?: string;
177
176
  };
178
177
  }
179
178
 
180
179
  /**
180
+ * The scroll viewport requires `overflow-hidden` (Embla hides off-screen slides
181
+ * with it), so any ring/shadow on slide content that sits OUTSIDE the slide's
182
+ * border-box is clipped where the slide meets the viewport edge. This is
183
+ * inherent to every Embla-based carousel — the active slide is flush with both
184
+ * scroll-axis edges, so left/right rings (horizontal) cannot show without
185
+ * revealing the neighbouring slide.
186
+ *
187
+ * To give content shadows/rings breathing room on the CROSS axis (top/bottom
188
+ * for horizontal carousels), add a negative-margin + matching padding via
189
+ * `classNames.wrapper`, e.g. `classNames={{ wrapper: "-my-2 py-2" }}`. This
190
+ * shifts no layout but lets the clip happen `n`px further out.
191
+ *
181
192
  * @since 0.3.16-canary.0
182
193
  */
183
194
  function CarouselContent({
@@ -189,15 +200,11 @@ function CarouselContent({
189
200
  const { carouselRef, orientation } = useCarouselContext(CAROUSEL_CONTENT_NAME, __scopeCarousel);
190
201
 
191
202
  return (
192
- <div
193
- ref={carouselRef}
194
- className={cn("overflow-hidden", classNames?.wrapper)}
195
- data-slot="carousel-content"
196
- >
203
+ <div ref={carouselRef} className={cn("overflow-hidden", classNames?.wrapper)} data-slot="carousel-content">
197
204
  <div
198
205
  className={cn(
199
206
  "flex",
200
- orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col",
207
+ orientation === "horizontal" ? "-ml-4" : "-mt-4 h-full flex-col",
201
208
  classNames?.content,
202
209
  className,
203
210
  )}
@@ -221,21 +228,13 @@ type CarouselItemProps = ComponentProps<"div">;
221
228
  /**
222
229
  * @since 0.3.16-canary.0
223
230
  */
224
- function CarouselItem({
225
- __scopeCarousel,
226
- className,
227
- ...props
228
- }: ScopedProps<CarouselItemProps>): JSX.Element {
231
+ function CarouselItem({ __scopeCarousel, className, ...props }: ScopedProps<CarouselItemProps>): JSX.Element {
229
232
  const { orientation } = useCarouselContext(CAROUSEL_ITEM_NAME, __scopeCarousel);
230
233
 
231
234
  return (
232
235
  <div
233
236
  aria-roledescription="slide"
234
- className={cn(
235
- "min-w-0 shrink-0 grow-0 basis-full",
236
- orientation === "horizontal" ? "pl-4" : "pt-4",
237
- className,
238
- )}
237
+ className={cn("min-w-0 shrink-0 grow-0 basis-full", orientation === "horizontal" ? "pl-4" : "pt-4", className)}
239
238
  data-slot="carousel-item"
240
239
  role="group"
241
240
  {...props}
@@ -260,24 +259,19 @@ type CarouselPreviousProps = ComponentProps<typeof Button>;
260
259
  function CarouselPrevious({
261
260
  __scopeCarousel,
262
261
  className,
263
- size = "icon",
262
+ size = "icon-sm",
264
263
  variant = "outline",
265
264
  ...props
266
265
  }: ScopedProps<CarouselPreviousProps>): JSX.Element {
267
- const { canScrollPrev, orientation, scrollPrev } = useCarouselContext(
268
- CAROUSEL_PREVIOUS_NAME,
269
- __scopeCarousel,
270
- );
266
+ const { canScrollPrev, orientation, scrollPrev } = useCarouselContext(CAROUSEL_PREVIOUS_NAME, __scopeCarousel);
271
267
 
272
268
  return (
273
269
  <Button
274
270
  aria-label="Previous slide"
275
271
  className={cn(
276
- "absolute",
277
- "size-8",
278
- "shadow-none",
272
+ "absolute touch-manipulation rounded-full",
279
273
  orientation === "horizontal"
280
- ? "top-1/2 -left-12 -translate-y-1/2"
274
+ ? "top-1/2 -left-12 -translate-y-1/2 active:not-aria-[haspopup]:translate-y-[calc(-50%+1px)]"
281
275
  : "-top-12 left-1/2 -translate-x-1/2 rotate-90",
282
276
  className,
283
277
  )}
@@ -288,7 +282,7 @@ function CarouselPrevious({
288
282
  onClick={scrollPrev}
289
283
  {...props}
290
284
  >
291
- <ArrowLeftIcon />
285
+ <ChevronLeftIcon className="rtl:rotate-180" />
292
286
  <span className="sr-only">Previous slide</span>
293
287
  </Button>
294
288
  );
@@ -311,24 +305,19 @@ type CarouselNextProps = ComponentProps<typeof Button>;
311
305
  function CarouselNext({
312
306
  __scopeCarousel,
313
307
  className,
314
- size = "icon",
308
+ size = "icon-sm",
315
309
  variant = "outline",
316
310
  ...props
317
311
  }: ScopedProps<CarouselNextProps>): JSX.Element {
318
- const { canScrollNext, orientation, scrollNext } = useCarouselContext(
319
- CAROUSEL_NEXT_NAME,
320
- __scopeCarousel,
321
- );
312
+ const { canScrollNext, orientation, scrollNext } = useCarouselContext(CAROUSEL_NEXT_NAME, __scopeCarousel);
322
313
 
323
314
  return (
324
315
  <Button
325
316
  aria-label="Next slide"
326
317
  className={cn(
327
- "absolute",
328
- "size-8",
329
- "shadow-none",
318
+ "absolute touch-manipulation rounded-full",
330
319
  orientation === "horizontal"
331
- ? "top-1/2 -right-12 -translate-y-1/2"
320
+ ? "top-1/2 -right-12 -translate-y-1/2 active:not-aria-[haspopup]:translate-y-[calc(-50%+1px)]"
332
321
  : "-bottom-12 left-1/2 -translate-x-1/2 rotate-90",
333
322
  className,
334
323
  )}
@@ -339,7 +328,7 @@ function CarouselNext({
339
328
  onClick={scrollNext}
340
329
  {...props}
341
330
  >
342
- <ArrowRightIcon />
331
+ <ChevronRightIcon className="rtl:rotate-180" />
343
332
  <span className="sr-only">Next slide</span>
344
333
  </Button>
345
334
  );
@@ -357,11 +346,4 @@ export type {
357
346
  CarouselPreviousProps,
358
347
  CarouselProps,
359
348
  };
360
- export {
361
- Carousel,
362
- CarouselContent,
363
- CarouselItem,
364
- CarouselNext,
365
- CarouselPrevious,
366
- createCarouselScope,
367
- };
349
+ export { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, createCarouselScope };
@@ -1,14 +1,11 @@
1
- "use client";
2
-
3
- import type { Scope } from "@radix-ui/react-context";
1
+ import { Context } from "radix-ui/internal";
4
2
  import type { ComponentProps, ComponentType, CSSProperties, JSX, ReactNode } from "react";
5
- import type { NameType, Payload, ValueType } from "recharts/types/component/DefaultTooltipContent";
3
+ import { useId, useMemo } from "react";
6
4
  import type { TooltipContentProps, TooltipProps } from "recharts";
5
+ import * as RechartsPrimitive from "recharts";
6
+ import type { NameType, Payload, ValueType } from "recharts/types/component/DefaultTooltipContent";
7
7
 
8
8
  import { cn } from "#/lib/utils";
9
- import { createContextScope } from "@radix-ui/react-context";
10
- import { useId, useMemo } from "react";
11
- import * as RechartsPrimitive from "recharts";
12
9
 
13
10
  /* -----------------------------------------------------------------------------
14
11
  * Type Definitions and Utilities
@@ -24,6 +21,8 @@ type MakeOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
24
21
 
25
22
  const THEMES = { dark: ".dark", light: "" } as const;
26
23
 
24
+ const INITIAL_DIMENSION = { height: 200, width: 320 } as const;
25
+
27
26
  /**
28
27
  * @since 0.3.16-canary.0
29
28
  */
@@ -32,10 +31,7 @@ type ChartConfig = Record<
32
31
  {
33
32
  label?: ReactNode;
34
33
  icon?: ComponentType;
35
- } & (
36
- | { color?: never; theme: Record<keyof typeof THEMES, string> }
37
- | { color?: string; theme?: never }
38
- )
34
+ } & ({ color?: never; theme: Record<keyof typeof THEMES, string> } | { color?: string; theme?: never })
39
35
  >;
40
36
 
41
37
  /* -----------------------------------------------------------------------------
@@ -44,7 +40,7 @@ type ChartConfig = Record<
44
40
 
45
41
  const CHART_PROVIDER_NAME = "ChartProvider";
46
42
 
47
- type ScopedProps<P> = P & { __scopeChart?: Scope };
43
+ type ScopedProps<P> = P & { __scopeChart?: Context.Scope };
48
44
 
49
45
  /**
50
46
  * Value provided by Chart Context
@@ -56,10 +52,9 @@ interface ChartContextValue {
56
52
  config: ChartConfig;
57
53
  }
58
54
 
59
- const [createChartContext, createChartScope] = createContextScope(CHART_PROVIDER_NAME);
55
+ const [createChartContext, createChartScope] = Context.createContextScope(CHART_PROVIDER_NAME);
60
56
 
61
- const [ChartContextProvider, useChartContext] =
62
- createChartContext<ChartContextValue>(CHART_PROVIDER_NAME);
57
+ const [ChartContextProvider, useChartContext] = createChartContext<ChartContextValue>(CHART_PROVIDER_NAME);
63
58
 
64
59
  /* -----------------------------------------------------------------------------
65
60
  * Component: Chart
@@ -71,6 +66,10 @@ const [ChartContextProvider, useChartContext] =
71
66
  interface ChartContainerProps extends ComponentProps<"div"> {
72
67
  children: ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>["children"];
73
68
  config: ChartConfig;
69
+ initialDimension?: {
70
+ height: number;
71
+ width: number;
72
+ };
74
73
  }
75
74
 
76
75
  /**
@@ -82,28 +81,17 @@ function ChartContainer({
82
81
  className,
83
82
  config,
84
83
  id,
84
+ initialDimension = INITIAL_DIMENSION,
85
85
  ...props
86
86
  }: ScopedProps<ChartContainerProps>): JSX.Element {
87
87
  const uniqueId = useId();
88
- const chartId = `chart-${id ?? uniqueId}`;
88
+ const chartId = `chart-${id ?? uniqueId.replace(/:/g, "")}`;
89
89
 
90
90
  return (
91
91
  <ChartContextProvider config={config} scope={__scopeChart}>
92
92
  <div
93
93
  className={cn(
94
- "flex aspect-video justify-center text-xs",
95
- "[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground",
96
- "[&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50",
97
- "[&_.recharts-curve.recharts-tooltip-cursor]:stroke-border",
98
- "[&_.recharts-dot[stroke='#fff']]:stroke-transparent",
99
- "[&_.recharts-layer]:outline-hidden",
100
- "[&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border",
101
- "[&_.recharts-radial-bar-background-sector]:fill-muted",
102
- "[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted",
103
- "[&_.recharts-reference-line_[stroke='#ccc']]:stroke-border",
104
- "[&_.recharts-sector]:outline-hidden",
105
- "[&_.recharts-sector[stroke='#fff']]:stroke-transparent",
106
- "[&_.recharts-surface]:outline-hidden",
94
+ "flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden",
107
95
  className,
108
96
  )}
109
97
  data-chart={chartId}
@@ -111,7 +99,9 @@ function ChartContainer({
111
99
  {...props}
112
100
  >
113
101
  <ChartStyle config={config} id={chartId} />
114
- <RechartsPrimitive.ResponsiveContainer>{children}</RechartsPrimitive.ResponsiveContainer>
102
+ <RechartsPrimitive.ResponsiveContainer initialDimension={initialDimension}>
103
+ {children}
104
+ </RechartsPrimitive.ResponsiveContainer>
115
105
  </div>
116
106
  </ChartContextProvider>
117
107
  );
@@ -133,9 +123,7 @@ interface ChartStyleProps {
133
123
  * @since 0.3.16-canary.0
134
124
  */
135
125
  function ChartStyle({ config, id }: ChartStyleProps): ReactNode {
136
- const colorConfig = Object.entries(config).filter(
137
- ([, itemConfig]) => itemConfig.theme ?? itemConfig.color,
138
- );
126
+ const colorConfig = Object.entries(config).filter(([, itemConfig]) => itemConfig.theme ?? itemConfig.color);
139
127
 
140
128
  if (colorConfig.length === 0) {
141
129
  return null;
@@ -157,10 +145,7 @@ function ChartStyle({ config, id }: ChartStyleProps): ReactNode {
157
145
  /**
158
146
  * @since 0.3.16-canary.0
159
147
  */
160
- type ChartTooltipProps<TValue extends ValueType, TName extends NameType> = TooltipProps<
161
- TValue,
162
- TName
163
- >;
148
+ type ChartTooltipProps<TValue extends ValueType, TName extends NameType> = TooltipProps<TValue, TName>;
164
149
 
165
150
  /**
166
151
  * @since 0.3.16-canary.0
@@ -234,9 +219,7 @@ function ChartTooltipContent<TValue extends ValueType, TName extends NameType>({
234
219
  : itemConfig?.label;
235
220
 
236
221
  if (labelFormatter) {
237
- return (
238
- <div className={cn("font-medium", labelClassName)}>{labelFormatter(value, payload)}</div>
239
- );
222
+ return <div className={cn("font-medium", labelClassName)}>{labelFormatter(value, payload)}</div>;
240
223
  }
241
224
 
242
225
  if (!value) {
@@ -255,9 +238,7 @@ function ChartTooltipContent<TValue extends ValueType, TName extends NameType>({
255
238
  return (
256
239
  <div
257
240
  className={cn(
258
- "grid min-w-[8rem] items-start gap-1.5 px-2.5 py-1.5",
259
- "rounded-lg border border-border/50",
260
- "bg-background text-xs shadow-xl",
241
+ "grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",
261
242
  className,
262
243
  )}
263
244
  >
@@ -268,9 +249,7 @@ function ChartTooltipContent<TValue extends ValueType, TName extends NameType>({
268
249
  const itemConfig = getPayloadConfigFromPayload(config, item, key);
269
250
  const indicatorColor =
270
251
  color ??
271
- (isRecord(item.payload) &&
272
- "fill" in item.payload &&
273
- typeof item.payload.fill === "string"
252
+ (isRecord(item.payload) && "fill" in item.payload && typeof item.payload.fill === "string"
274
253
  ? item.payload.fill
275
254
  : undefined) ??
276
255
  item.color;
@@ -279,8 +258,7 @@ function ChartTooltipContent<TValue extends ValueType, TName extends NameType>({
279
258
  <div
280
259
  key={key}
281
260
  className={cn(
282
- "flex w-full flex-wrap items-stretch gap-2",
283
- "[&>svg]:size-2.5 [&>svg]:text-muted-foreground",
261
+ "flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground",
284
262
  indicator === "dot" && "items-center",
285
263
  )}
286
264
  >
@@ -293,17 +271,12 @@ function ChartTooltipContent<TValue extends ValueType, TName extends NameType>({
293
271
  ) : (
294
272
  !hideIndicator && (
295
273
  <div
296
- className={cn(
297
- "shrink-0",
298
- "rounded-xs border-(--color-border)",
299
- "bg-(--color-bg)",
300
- {
301
- "h-2.5 w-2.5": indicator === "dot",
302
- "my-0.5": nestLabel && indicator === "dashed",
303
- "border-1.5 w-0 border-dashed bg-transparent": indicator === "dashed",
304
- "w-1": indicator === "line",
305
- },
306
- )}
274
+ className={cn("shrink-0 rounded-xs border-(--color-border) bg-(--color-bg)", {
275
+ "h-2.5 w-2.5": indicator === "dot",
276
+ "my-0.5": nestLabel && indicator === "dashed",
277
+ "w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed",
278
+ "w-1": indicator === "line",
279
+ })}
307
280
  style={
308
281
  {
309
282
  "--color-bg": indicatorColor,
@@ -314,23 +287,15 @@ function ChartTooltipContent<TValue extends ValueType, TName extends NameType>({
314
287
  )
315
288
  )}
316
289
  <div
317
- className={cn(
318
- "flex flex-1 justify-between",
319
- "leading-none",
320
- nestLabel ? "items-end" : "items-center",
321
- )}
290
+ className={cn("flex flex-1 justify-between leading-none", nestLabel ? "items-end" : "items-center")}
322
291
  >
323
292
  <div className="grid gap-1.5">
324
293
  {nestLabel ? tooltipLabel : null}
325
- <span className="text-muted-foreground">
326
- {itemConfig?.label ?? item.name}
327
- </span>
294
+ <span className="text-muted-foreground">{itemConfig?.label ?? item.name}</span>
328
295
  </div>
329
296
  {item.value != null && (
330
- <span className={cn("font-mono font-medium text-foreground", "tabular-nums")}>
331
- {typeof item.value === "number"
332
- ? item.value.toLocaleString()
333
- : safeToString(item.value)}
297
+ <span className="font-mono font-medium text-foreground tabular-nums">
298
+ {typeof item.value === "number" ? item.value.toLocaleString() : safeToString(item.value)}
334
299
  </span>
335
300
  )}
336
301
  </div>
@@ -391,13 +356,7 @@ function ChartLegendContent({
391
356
  }
392
357
 
393
358
  return (
394
- <div
395
- className={cn(
396
- "flex items-center justify-center gap-4",
397
- verticalAlign === "top" ? "pb-3" : "pt-3",
398
- className,
399
- )}
400
- >
359
+ <div className={cn("flex items-center justify-center gap-4", verticalAlign === "top" ? "pb-3" : "pt-3", className)}>
401
360
  {payload.map((item) => {
402
361
  let key = "value";
403
362
 
@@ -412,16 +371,13 @@ function ChartLegendContent({
412
371
  return (
413
372
  <div
414
373
  key={nameKey ? safeToString(itemConfig?.color ?? "") : safeToString(item.value ?? "")}
415
- className={cn(
416
- "flex items-center gap-1.5",
417
- "[&>svg]:size-3 [&>svg]:text-muted-foreground",
418
- )}
374
+ className="flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground"
419
375
  >
420
376
  {itemConfig?.icon && !hideIcon ? (
421
377
  <itemConfig.icon />
422
378
  ) : (
423
379
  <div
424
- className={cn("size-2 shrink-0", "rounded-md")}
380
+ className="h-2 w-2 shrink-0 rounded-xs"
425
381
  style={{
426
382
  backgroundColor: item.color,
427
383
  }}
@@ -523,11 +479,7 @@ function getPayloadConfigFromPayload(
523
479
  /**
524
480
  * Generates CSS custom property for a specific theme and config item
525
481
  */
526
- function generateCssVariable(
527
- key: string,
528
- itemConfig: ChartConfig[string],
529
- theme: string,
530
- ): null | string {
482
+ function generateCssVariable(key: string, itemConfig: ChartConfig[string], theme: string): null | string {
531
483
  const color = itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ?? itemConfig.color;
532
484
 
533
485
  return color ? ` --color-${key}: ${color};` : null;
@@ -553,10 +505,7 @@ function generateThemeStyles(
553
505
  /**
554
506
  * Generates complete CSS styles for all themes
555
507
  */
556
- function generateChartStyles(
557
- id: string,
558
- colorConfig: Array<[string, ChartConfig[string]]>,
559
- ): string {
508
+ function generateChartStyles(id: string, colorConfig: Array<[string, ChartConfig[string]]>): string {
560
509
  return Object.entries(THEMES)
561
510
  .map(([theme, prefix]) => generateThemeStyles(theme, prefix, id, colorConfig))
562
511
  .join("\n\n");
@@ -1,11 +1,8 @@
1
- "use client";
2
-
3
- import type { ComponentProps, JSX } from "react";
4
-
5
- import { cn } from "#/lib/utils";
6
1
  import { CheckIcon } from "lucide-react";
2
+ import type { ComponentProps, JSX } from "react";
7
3
 
8
4
  import { Label } from "#/components/label";
5
+ import { cn } from "#/lib/utils";
9
6
  import * as CheckboxGroupPrimitive from "#/primitives/checkbox-group";
10
7
 
11
8
  /* -----------------------------------------------------------------------------
@@ -38,45 +35,28 @@ interface CheckboxCardsItemProps extends ComponentProps<typeof CheckboxGroupPrim
38
35
  /**
39
36
  * @since 0.3.16-canary.0
40
37
  */
41
- function CheckboxCardsItem({
42
- checkboxClassName,
43
- children,
44
- className,
45
- ...props
46
- }: CheckboxCardsItemProps): JSX.Element {
38
+ function CheckboxCardsItem({ checkboxClassName, children, className, ...props }: CheckboxCardsItemProps): JSX.Element {
47
39
  return (
48
40
  <Label
49
41
  className={cn(
50
- "flex items-start gap-3",
51
- "p-3",
52
- "rounded-lg border border-input",
53
- "transition",
54
- "hover:not-has-disabled:not-has-aria-checked:bg-secondary",
55
- "has-focus-visible:border-ring",
56
- "has-disabled:opacity-50",
57
- "has-aria-checked:border-primary has-aria-checked:bg-primary/10",
42
+ "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",
58
43
  className,
59
44
  )}
60
45
  data-slot="checkbox-card"
61
46
  >
62
47
  <CheckboxGroupPrimitive.Item
63
48
  className={cn(
64
- "peer flex size-4 shrink-0",
65
- "rounded-sm border border-input shadow-xs outline-hidden",
66
- "text-primary-foreground",
67
- "transition",
68
- "focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50",
69
- "aria-checked:border-primary aria-checked:bg-primary",
70
- "focus-visible:aria-checked:ring-primary/20",
71
- "dark:bg-input/30",
72
- "dark:focus-visible:aria-checked:ring-primary/40",
49
+ "peer relative flex size-4 shrink-0 items-center justify-center rounded-sm border border-input shadow-xs transition-shadow outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary",
73
50
  checkboxClassName,
74
51
  )}
75
52
  data-slot="checkbox-card-item"
76
53
  {...props}
77
54
  >
78
- <CheckboxGroupPrimitive.CheckboxGroupIndicator data-slot="checkbox-card-indicator">
79
- <CheckIcon className="size-3.5" />
55
+ <CheckboxGroupPrimitive.CheckboxGroupIndicator
56
+ className="grid place-content-center text-current transition-none [&>svg]:size-3.5"
57
+ data-slot="checkbox-card-indicator"
58
+ >
59
+ <CheckIcon />
80
60
  </CheckboxGroupPrimitive.CheckboxGroupIndicator>
81
61
  </CheckboxGroupPrimitive.Item>
82
62
  {children}
@@ -1,10 +1,7 @@
1
- "use client";
2
-
1
+ import { CheckIcon } from "lucide-react";
3
2
  import type { ComponentProps, JSX } from "react";
4
3
 
5
4
  import { cn } from "#/lib/utils";
6
- import { CheckIcon } from "lucide-react";
7
-
8
5
  import * as CheckboxGroupPrimitive from "#/primitives/checkbox-group";
9
6
 
10
7
  /* -----------------------------------------------------------------------------
@@ -20,13 +17,7 @@ type CheckboxGroupProps = ComponentProps<typeof CheckboxGroupPrimitive.Root>;
20
17
  * @since 0.3.16-canary.0
21
18
  */
22
19
  function CheckboxGroup({ className, ...props }: CheckboxGroupProps): JSX.Element {
23
- return (
24
- <CheckboxGroupPrimitive.Root
25
- className={cn("grid gap-2", className)}
26
- data-slot="checkbox-group"
27
- {...props}
28
- />
29
- );
20
+ return <CheckboxGroupPrimitive.Root className={cn("grid gap-2", className)} data-slot="checkbox-group" {...props} />;
30
21
  }
31
22
 
32
23
  /* -----------------------------------------------------------------------------
@@ -45,31 +36,17 @@ function CheckboxGroupItem({ className, ...props }: CheckboxGroupItemProps): JSX
45
36
  return (
46
37
  <CheckboxGroupPrimitive.Item
47
38
  className={cn(
48
- "peer flex size-4 shrink-0 items-center justify-center",
49
- "rounded-sm border border-input shadow-xs outline-hidden",
50
- "text-primary-foreground",
51
- "transition",
52
- "hover:not-disabled:not-aria-checked:border-ring/60",
53
- "focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50",
54
- "disabled:opacity-50",
55
- "aria-checked:border-primary aria-checked:bg-primary",
56
- "focus-visible:aria-checked:ring-primary/20",
57
- "aria-invalid:border-destructive aria-invalid:ring-destructive/20",
58
- "hover:not-disabled:not-aria-checked:aria-invalid:border-destructive/60",
59
- "aria-checked:aria-invalid:bg-destructive",
60
- "dark:bg-input/30",
61
- "dark:focus-visible:aria-checked:ring-primary/40",
62
- "dark:aria-invalid:ring-destructive/40",
39
+ "peer relative flex size-4 shrink-0 items-center justify-center rounded-sm border border-input shadow-xs transition-shadow outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary",
63
40
  className,
64
41
  )}
65
42
  data-slot="checkbox-group-item"
66
43
  {...props}
67
44
  >
68
45
  <CheckboxGroupPrimitive.CheckboxGroupIndicator
69
- className={cn("flex items-center justify-center text-current", "transition-none")}
46
+ className="grid place-content-center text-current transition-none [&>svg]:size-3.5"
70
47
  data-slot="checkbox-group-indicator"
71
48
  >
72
- <CheckIcon className="size-3.5" />
49
+ <CheckIcon />
73
50
  </CheckboxGroupPrimitive.CheckboxGroupIndicator>
74
51
  </CheckboxGroupPrimitive.Item>
75
52
  );