@codefast/ui 0.3.16-canary.3 → 0.4.0-canary.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +112 -0
- package/README.md +27 -16
- package/dist/components/accordion.d.mts +7 -22
- package/dist/components/accordion.mjs +26 -29
- package/dist/components/alert-dialog.d.mts +27 -26
- package/dist/components/alert-dialog.mjs +53 -45
- package/dist/components/alert.d.mts +12 -2
- package/dist/components/alert.mjs +15 -6
- package/dist/components/aspect-ratio.d.mts +2 -2
- package/dist/components/aspect-ratio.mjs +2 -3
- package/dist/components/avatar.d.mts +41 -5
- package/dist/components/avatar.mjs +40 -10
- package/dist/components/badge.mjs +4 -4
- package/dist/components/breadcrumb.d.mts +1 -0
- package/dist/components/breadcrumb.mjs +11 -10
- package/dist/components/button-group.d.mts +1 -1
- package/dist/components/button-group.mjs +6 -7
- package/dist/components/button.d.mts +0 -1
- package/dist/components/button.mjs +7 -7
- package/dist/components/calendar.d.mts +6 -2
- package/dist/components/calendar.mjs +39 -43
- package/dist/components/card.d.mts +4 -2
- package/dist/components/card.mjs +9 -9
- package/dist/components/carousel.d.mts +16 -4
- package/dist/components/carousel.mjs +25 -12
- package/dist/components/chart.d.mts +8 -3
- package/dist/components/chart.mjs +21 -15
- package/dist/components/checkbox-cards.mjs +6 -6
- package/dist/components/checkbox-group.mjs +6 -7
- package/dist/components/checkbox.d.mts +2 -2
- package/dist/components/checkbox.mjs +8 -9
- package/dist/components/collapsible.d.mts +4 -4
- package/dist/components/collapsible.mjs +4 -5
- package/dist/components/command.d.mts +11 -1
- package/dist/components/command.mjs +35 -32
- package/dist/components/context-menu.d.mts +22 -15
- package/dist/components/context-menu.mjs +44 -39
- package/dist/components/dialog.d.mts +19 -23
- package/dist/components/dialog.mjs +48 -47
- package/dist/components/direction.d.mts +24 -0
- package/dist/components/direction.mjs +18 -0
- package/dist/components/drawer.d.mts +2 -20
- package/dist/components/drawer.mjs +17 -25
- package/dist/components/dropdown-menu.d.mts +22 -15
- package/dist/components/dropdown-menu.mjs +41 -37
- package/dist/components/empty.mjs +5 -5
- package/dist/components/field.d.mts +1 -1
- package/dist/components/field.mjs +11 -12
- package/dist/components/form.d.mts +6 -7
- package/dist/components/form.mjs +6 -7
- package/dist/components/hover-card.d.mts +5 -5
- package/dist/components/hover-card.mjs +14 -12
- package/dist/components/input-group.d.mts +1 -1
- package/dist/components/input-group.mjs +12 -7
- package/dist/components/input-number.d.mts +3 -1
- package/dist/components/input-number.mjs +49 -27
- package/dist/components/input-otp.mjs +9 -7
- package/dist/components/input-password.mjs +1 -4
- package/dist/components/input-search.mjs +3 -5
- package/dist/components/input.mjs +1 -2
- package/dist/components/item.mjs +9 -9
- package/dist/components/kbd.mjs +1 -1
- package/dist/components/label.d.mts +2 -2
- package/dist/components/label.mjs +3 -4
- package/dist/components/menubar.d.mts +22 -16
- package/dist/components/menubar.mjs +54 -47
- package/dist/components/native-select.d.mts +5 -1
- package/dist/components/native-select.mjs +9 -6
- package/dist/components/navigation-menu.d.mts +30 -8
- package/dist/components/navigation-menu.mjs +33 -23
- package/dist/components/pagination.d.mts +6 -0
- package/dist/components/pagination.mjs +26 -11
- package/dist/components/popover.d.mts +40 -7
- package/dist/components/popover.mjs +46 -14
- package/dist/components/progress-circle.d.mts +1 -1
- package/dist/components/progress-circle.mjs +1 -2
- package/dist/components/progress.d.mts +2 -2
- package/dist/components/progress.mjs +5 -6
- package/dist/components/radio-cards.d.mts +3 -3
- package/dist/components/radio-cards.mjs +11 -11
- package/dist/components/radio-group.d.mts +3 -3
- package/dist/components/radio-group.mjs +9 -9
- package/dist/components/radio.mjs +2 -3
- package/dist/components/resizable.mjs +3 -8
- package/dist/components/scroll-area.d.mts +5 -5
- package/dist/components/scroll-area.mjs +13 -10
- package/dist/components/select.d.mts +14 -14
- package/dist/components/select.mjs +47 -47
- package/dist/components/separator.d.mts +2 -2
- package/dist/components/separator.mjs +3 -4
- package/dist/components/sheet.d.mts +13 -14
- package/dist/components/sheet.mjs +41 -39
- package/dist/components/sidebar.d.mts +2 -3
- package/dist/components/sidebar.mjs +46 -46
- package/dist/components/skeleton.mjs +1 -1
- package/dist/components/slider.d.mts +2 -2
- package/dist/components/slider.mjs +9 -11
- package/dist/components/sonner.mjs +11 -3
- package/dist/components/spinner.mjs +6 -7
- package/dist/components/switch.d.mts +5 -2
- package/dist/components/switch.mjs +7 -7
- package/dist/components/table.mjs +10 -10
- package/dist/components/tabs.d.mts +8 -5
- package/dist/components/tabs.mjs +18 -12
- package/dist/components/textarea.mjs +1 -1
- package/dist/components/toggle-group.d.mts +9 -6
- package/dist/components/toggle-group.mjs +19 -20
- package/dist/components/toggle.d.mts +2 -3
- package/dist/components/toggle.mjs +4 -6
- package/dist/components/tooltip.d.mts +7 -6
- package/dist/components/tooltip.mjs +19 -17
- package/dist/hooks/use-animated-value.mjs +0 -1
- package/dist/hooks/use-copy-to-clipboard.mjs +0 -1
- package/dist/hooks/use-is-mobile.mjs +0 -1
- package/dist/hooks/use-media-query.mjs +0 -1
- package/dist/hooks/use-mutation-observer.mjs +0 -1
- package/dist/hooks/use-pagination.mjs +0 -1
- package/dist/index.d.mts +15 -13
- package/dist/index.mjs +18 -16
- package/dist/primitives/checkbox-group.d.mts +9 -10
- package/dist/primitives/checkbox-group.mjs +14 -19
- package/dist/primitives/input-number.d.mts +3 -3
- package/dist/primitives/input-number.mjs +3 -5
- package/dist/primitives/input.d.mts +4 -4
- package/dist/primitives/input.mjs +2 -3
- package/dist/primitives/progress-circle.d.mts +3 -3
- package/dist/primitives/progress-circle.mjs +2 -3
- package/dist/variants/alert.d.mts +1 -1
- package/dist/variants/alert.mjs +3 -13
- package/dist/variants/badge.d.mts +6 -4
- package/dist/variants/badge.mjs +7 -34
- package/dist/variants/button-group.d.mts +2 -2
- package/dist/variants/button-group.mjs +3 -14
- package/dist/variants/button.d.mts +12 -10
- package/dist/variants/button.mjs +15 -57
- package/dist/variants/empty.d.mts +1 -1
- package/dist/variants/empty.mjs +2 -7
- package/dist/variants/field.d.mts +3 -3
- package/dist/variants/field.mjs +4 -22
- package/dist/variants/input-group.d.mts +9 -9
- package/dist/variants/input-group.mjs +11 -70
- package/dist/variants/input-number.d.mts +45 -0
- package/dist/variants/input-number.mjs +40 -0
- package/dist/variants/item.d.mts +5 -4
- package/dist/variants/item.mjs +9 -31
- package/dist/variants/navigation-menu.d.mts +1 -1
- package/dist/variants/navigation-menu.mjs +1 -5
- package/dist/variants/progress-circle.d.mts +1 -1
- package/dist/variants/progress-circle.mjs +1 -5
- package/dist/variants/scroll-area.d.mts +2 -2
- package/dist/variants/scroll-area.mjs +3 -8
- package/dist/variants/separator.mjs +6 -6
- package/dist/variants/sheet.d.mts +4 -4
- package/dist/variants/sheet.mjs +5 -38
- package/dist/variants/sidebar.d.mts +4 -4
- package/dist/variants/sidebar.mjs +6 -23
- package/dist/variants/tabs.d.mts +18 -0
- package/dist/variants/tabs.mjs +15 -0
- package/dist/variants/toggle.d.mts +4 -4
- package/dist/variants/toggle.mjs +9 -27
- package/package.json +27 -44
- package/src/components/accordion.tsx +26 -68
- package/src/components/alert-dialog.tsx +70 -86
- package/src/components/alert.tsx +27 -19
- package/src/components/aspect-ratio.tsx +1 -4
- package/src/components/avatar.tsx +99 -12
- package/src/components/badge.tsx +5 -8
- package/src/components/breadcrumb.tsx +18 -24
- package/src/components/button-group.tsx +10 -20
- package/src/components/button.tsx +8 -19
- package/src/components/calendar.tsx +77 -132
- package/src/components/card.tsx +16 -22
- package/src/components/carousel.tsx +40 -58
- package/src/components/chart.tsx +41 -92
- package/src/components/checkbox-cards.tsx +11 -30
- package/src/components/checkbox-group.tsx +6 -28
- package/src/components/checkbox.tsx +6 -26
- package/src/components/collapsible.tsx +1 -4
- package/src/components/command.tsx +52 -65
- package/src/components/context-menu.tsx +46 -125
- package/src/components/dialog.tsx +49 -101
- package/src/components/direction.tsx +32 -0
- package/src/components/drawer.tsx +17 -79
- package/src/components/dropdown-menu.tsx +39 -118
- package/src/components/empty.tsx +6 -20
- package/src/components/field.tsx +19 -52
- package/src/components/form.tsx +19 -61
- package/src/components/hover-card.tsx +4 -27
- package/src/components/input-group.tsx +13 -52
- package/src/components/input-number.tsx +55 -75
- package/src/components/input-otp.tsx +19 -38
- package/src/components/input-password.tsx +5 -29
- package/src/components/input-search.tsx +6 -23
- package/src/components/input.tsx +1 -17
- package/src/components/item.tsx +17 -31
- package/src/components/kbd.tsx +2 -14
- package/src/components/label.tsx +2 -10
- package/src/components/menubar.tsx +34 -125
- package/src/components/native-select.tsx +21 -30
- package/src/components/navigation-menu.tsx +34 -94
- package/src/components/pagination.tsx +28 -34
- package/src/components/popover.tsx +66 -35
- package/src/components/progress-circle.tsx +7 -25
- package/src/components/progress.tsx +3 -16
- package/src/components/radio-cards.tsx +8 -27
- package/src/components/radio-group.tsx +7 -27
- package/src/components/radio.tsx +3 -24
- package/src/components/resizable.tsx +5 -26
- package/src/components/scroll-area.tsx +12 -32
- package/src/components/select.tsx +37 -60
- package/src/components/separator.tsx +4 -18
- package/src/components/sheet.tsx +37 -74
- package/src/components/sidebar.tsx +47 -177
- package/src/components/skeleton.tsx +1 -3
- package/src/components/slider.tsx +7 -36
- package/src/components/sonner.tsx +16 -6
- package/src/components/spinner.tsx +6 -15
- package/src/components/switch.tsx +8 -30
- package/src/components/table.tsx +18 -35
- package/src/components/tabs.tsx +16 -34
- package/src/components/textarea.tsx +1 -15
- package/src/components/toggle-group.tsx +34 -38
- package/src/components/toggle.tsx +4 -13
- package/src/components/tooltip.tsx +11 -37
- package/src/css/foundation/base.css +74 -0
- package/src/css/foundation/motion.css +69 -0
- package/src/css/foundation/source.css +10 -0
- package/src/css/foundation/tokens.css +107 -0
- package/src/css/foundation/variants.css +121 -0
- package/src/css/preset.css +13 -214
- package/src/css/style.css +9 -1
- package/src/css/{amber.css → themes/amber.css} +29 -0
- package/src/css/{blue.css → themes/blue.css} +29 -0
- package/src/css/{cyan.css → themes/cyan.css} +29 -0
- package/src/css/{emerald.css → themes/emerald.css} +29 -0
- package/src/css/{fuchsia.css → themes/fuchsia.css} +29 -0
- package/src/css/{gray.css → themes/gray.css} +29 -0
- package/src/css/{green.css → themes/green.css} +29 -0
- package/src/css/{indigo.css → themes/indigo.css} +29 -0
- package/src/css/{lime.css → themes/lime.css} +29 -0
- package/src/css/{neutral.css → themes/neutral.css} +29 -0
- package/src/css/{orange.css → themes/orange.css} +29 -0
- package/src/css/{pink.css → themes/pink.css} +29 -0
- package/src/css/{purple.css → themes/purple.css} +29 -0
- package/src/css/{red.css → themes/red.css} +29 -0
- package/src/css/{rose.css → themes/rose.css} +29 -0
- package/src/css/{sky.css → themes/sky.css} +29 -0
- package/src/css/{slate.css → themes/slate.css} +29 -0
- package/src/css/{stone.css → themes/stone.css} +29 -0
- package/src/css/{teal.css → themes/teal.css} +29 -0
- package/src/css/{violet.css → themes/violet.css} +29 -0
- package/src/css/{yellow.css → themes/yellow.css} +29 -0
- package/src/css/{zinc.css → themes/zinc.css} +29 -0
- package/src/hooks/use-animated-value.ts +1 -7
- package/src/hooks/use-copy-to-clipboard.ts +1 -6
- package/src/hooks/use-is-mobile.ts +0 -2
- package/src/hooks/use-media-query.ts +0 -2
- package/src/hooks/use-mutation-observer.ts +0 -3
- package/src/hooks/use-pagination.ts +0 -2
- package/src/index.ts +39 -80
- package/src/primitives/checkbox-group.tsx +25 -39
- package/src/primitives/input-number.tsx +17 -63
- package/src/primitives/input.tsx +8 -24
- package/src/primitives/progress-circle.tsx +13 -43
- package/src/variants/alert.ts +3 -14
- package/src/variants/badge.ts +8 -35
- package/src/variants/button-group.ts +5 -18
- package/src/variants/button.ts +21 -58
- package/src/variants/empty.ts +2 -11
- package/src/variants/field.ts +6 -19
- package/src/variants/input-group.ts +12 -64
- package/src/variants/input-number.ts +65 -0
- package/src/variants/item.ts +10 -32
- package/src/variants/navigation-menu.ts +1 -8
- package/src/variants/progress-circle.ts +1 -2
- package/src/variants/scroll-area.ts +3 -9
- package/src/variants/separator.ts +6 -7
- package/src/variants/sheet.ts +6 -39
- package/src/variants/sidebar.ts +7 -27
- package/src/variants/tabs.ts +34 -0
- package/src/variants/toggle.ts +9 -28
|
@@ -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 {
|
|
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" ? "-
|
|
207
|
+
orientation === "horizontal" ? "-ms-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" ? "ps-4" : "pt-4", className)}
|
|
239
238
|
data-slot="carousel-item"
|
|
240
239
|
role="group"
|
|
241
240
|
{...props}
|
|
@@ -260,25 +259,20 @@ 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 -
|
|
281
|
-
: "-top-12
|
|
274
|
+
? "-start-12 top-1/2 -translate-y-1/2 active:not-aria-[haspopup]:translate-y-[calc(-50%+1px)]"
|
|
275
|
+
: "start-1/2 -top-12 -translate-x-1/2 rotate-90 rtl:translate-x-1/2",
|
|
282
276
|
className,
|
|
283
277
|
)}
|
|
284
278
|
data-slot="carousel-previous"
|
|
@@ -288,7 +282,7 @@ function CarouselPrevious({
|
|
|
288
282
|
onClick={scrollPrev}
|
|
289
283
|
{...props}
|
|
290
284
|
>
|
|
291
|
-
<
|
|
285
|
+
<ChevronLeftIcon className="rtl:rotate-180" />
|
|
292
286
|
<span className="sr-only">Previous slide</span>
|
|
293
287
|
</Button>
|
|
294
288
|
);
|
|
@@ -311,25 +305,20 @@ 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 -
|
|
332
|
-
: "-bottom-12
|
|
320
|
+
? "-end-12 top-1/2 -translate-y-1/2 active:not-aria-[haspopup]:translate-y-[calc(-50%+1px)]"
|
|
321
|
+
: "start-1/2 -bottom-12 -translate-x-1/2 rotate-90 rtl:translate-x-1/2",
|
|
333
322
|
className,
|
|
334
323
|
)}
|
|
335
324
|
data-slot="carousel-next"
|
|
@@ -339,7 +328,7 @@ function CarouselNext({
|
|
|
339
328
|
onClick={scrollNext}
|
|
340
329
|
{...props}
|
|
341
330
|
>
|
|
342
|
-
<
|
|
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 };
|
package/src/components/chart.tsx
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
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
|
|
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
|
|
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-
|
|
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
|
-
"
|
|
298
|
-
"
|
|
299
|
-
"
|
|
300
|
-
|
|
301
|
-
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
-
|
|
2
|
-
|
|
1
|
+
import { CheckIcon, MinusIcon } from "lucide-react";
|
|
3
2
|
import type { ComponentProps, JSX } from "react";
|
|
4
3
|
|
|
5
|
-
import { cn } from "#/lib/utils";
|
|
6
|
-
import { CheckIcon } from "lucide-react";
|
|
7
|
-
|
|
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,29 @@ 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 has-data-indeterminate:border-primary/30 has-data-indeterminate: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 duration-control ease-snappy 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 data-indeterminate:border-primary data-indeterminate:bg-primary data-indeterminate:text-primary-foreground dark:data-indeterminate:bg-primary",
|
|
73
50
|
checkboxClassName,
|
|
74
51
|
)}
|
|
75
52
|
data-slot="checkbox-card-item"
|
|
76
53
|
{...props}
|
|
77
54
|
>
|
|
78
|
-
<CheckboxGroupPrimitive.CheckboxGroupIndicator
|
|
79
|
-
|
|
55
|
+
<CheckboxGroupPrimitive.CheckboxGroupIndicator
|
|
56
|
+
className="group/checkbox-card-indicator grid animate-in place-content-center text-current duration-control-indicator ease-spring zoom-in-50 [&>svg]:size-3.5"
|
|
57
|
+
data-slot="checkbox-card-indicator"
|
|
58
|
+
>
|
|
59
|
+
<CheckIcon className="group-data-indeterminate/checkbox-card-indicator:hidden" />
|
|
60
|
+
<MinusIcon className="hidden group-data-indeterminate/checkbox-card-indicator:block" />
|
|
80
61
|
</CheckboxGroupPrimitive.CheckboxGroupIndicator>
|
|
81
62
|
</CheckboxGroupPrimitive.Item>
|
|
82
63
|
{children}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { CheckIcon, MinusIcon } 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,18 @@ 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 duration-control ease-snappy 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 data-indeterminate:border-primary data-indeterminate:bg-primary data-indeterminate:text-primary-foreground dark:data-indeterminate: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=
|
|
46
|
+
className="group/checkbox-group-indicator grid animate-in place-content-center text-current duration-control-indicator ease-spring zoom-in-50 [&>svg]:size-3.5"
|
|
70
47
|
data-slot="checkbox-group-indicator"
|
|
71
48
|
>
|
|
72
|
-
<CheckIcon className="
|
|
49
|
+
<CheckIcon className="group-data-indeterminate/checkbox-group-indicator:hidden" />
|
|
50
|
+
<MinusIcon className="hidden group-data-indeterminate/checkbox-group-indicator:block" />
|
|
73
51
|
</CheckboxGroupPrimitive.CheckboxGroupIndicator>
|
|
74
52
|
</CheckboxGroupPrimitive.Item>
|
|
75
53
|
);
|