@music-vine/cadence 2.6.2 → 3.0.0
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/README.md +5 -44
- package/dist/components/accordion.d.ts +71 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +2 -2
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/badge.d.ts +62 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +1 -1
- package/dist/components/badge.js.map +1 -1
- package/dist/components/breadcrumb.d.ts +42 -0
- package/dist/components/breadcrumb.d.ts.map +1 -0
- package/dist/components/button.d.ts +117 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +3 -3
- package/dist/components/button.js.map +1 -1
- package/dist/components/card.d.ts +56 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js.map +1 -1
- package/dist/components/carousel-dots.d.ts +17 -0
- package/dist/components/carousel-dots.d.ts.map +1 -0
- package/dist/components/carousel-dots.js +1 -1
- package/dist/components/carousel-dots.js.map +1 -1
- package/dist/components/carousel.d.ts +99 -0
- package/dist/components/carousel.d.ts.map +1 -0
- package/dist/components/carousel.js +2 -2
- package/dist/components/carousel.js.map +1 -1
- package/dist/components/checkbox.d.ts +34 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +1 -1
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/context-menu.d.ts +126 -0
- package/dist/components/context-menu.d.ts.map +1 -0
- package/dist/components/context-menu.js +6 -6
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/dialog.d.ts +85 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +1 -1
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/drawer.d.ts +90 -0
- package/dist/components/drawer.d.ts.map +1 -0
- package/dist/components/drawer.js.map +1 -1
- package/dist/components/index.d.ts +36 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/input.d.ts +69 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +61 -57
- package/dist/components/input.js.map +2 -2
- package/dist/components/label.d.ts +36 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/popover.d.ts +61 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +1 -1
- package/dist/components/popover.js.map +1 -1
- package/dist/components/price-tag.d.ts +31 -0
- package/dist/components/price-tag.d.ts.map +1 -0
- package/dist/components/price-tag.js.map +1 -1
- package/dist/components/radio-group.d.ts +15 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +1 -1
- package/dist/components/radio-group.js.map +1 -1
- package/dist/components/scroll-area.d.ts +33 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/scroll-drum.d.ts +96 -0
- package/dist/components/scroll-drum.d.ts.map +1 -0
- package/dist/components/scroll-drum.js +63 -34
- package/dist/components/scroll-drum.js.map +2 -2
- package/dist/components/select.d.ts +49 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +1 -1
- package/dist/components/select.js.map +1 -1
- package/dist/components/separator.d.ts +35 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/skeleton.d.ts +44 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/slider.d.ts +21 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +1 -1
- package/dist/components/slider.js.map +1 -1
- package/dist/components/stacking-card.d.ts +89 -0
- package/dist/components/stacking-card.d.ts.map +1 -0
- package/dist/components/stacking-card.js +3 -3
- package/dist/components/stacking-card.js.map +2 -2
- package/dist/components/tabs.d.ts +46 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +2 -2
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/textarea.d.ts +34 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/toast.d.ts +67 -0
- package/dist/components/toast.d.ts.map +1 -0
- package/dist/components/toast.js +2 -2
- package/dist/components/toast.js.map +2 -2
- package/dist/components/toggle-button.d.ts +54 -0
- package/dist/components/toggle-button.d.ts.map +1 -0
- package/dist/components/toggle-button.js.map +1 -1
- package/dist/components/typography/heading.d.ts +20 -0
- package/dist/components/typography/heading.d.ts.map +1 -0
- package/dist/components/typography/heading.js.map +1 -1
- package/dist/components/typography/index.d.ts +5 -0
- package/dist/components/typography/index.d.ts.map +1 -0
- package/dist/components/typography/list.d.ts +23 -0
- package/dist/components/typography/list.d.ts.map +1 -0
- package/dist/components/typography/list.js +1 -1
- package/dist/components/typography/list.js.map +2 -2
- package/dist/components/typography/prose.d.ts +8 -0
- package/dist/components/typography/prose.d.ts.map +1 -0
- package/dist/components/typography/text.d.ts +13 -0
- package/dist/components/typography/text.d.ts.map +1 -0
- package/dist/icons/custom/boards-indicator.d.ts +6 -0
- package/dist/icons/custom/boards-indicator.d.ts.map +1 -0
- package/dist/icons/custom/boards-indicator.js +7 -2
- package/dist/icons/custom/boards-indicator.js.map +2 -2
- package/dist/icons/custom/download-history.d.ts +5 -0
- package/dist/icons/custom/download-history.d.ts.map +1 -0
- package/dist/icons/custom/download-history.js +3 -4
- package/dist/icons/custom/download-history.js.map +2 -2
- package/dist/icons/custom/exclamation-mark-in-octagon.d.ts +5 -0
- package/dist/icons/custom/exclamation-mark-in-octagon.d.ts.map +1 -0
- package/dist/icons/custom/exclamation-mark-in-octagon.js +6 -3
- package/dist/icons/custom/exclamation-mark-in-octagon.js.map +2 -2
- package/dist/icons/custom/horizontal-orientation.d.ts +5 -0
- package/dist/icons/custom/horizontal-orientation.d.ts.map +1 -0
- package/dist/icons/custom/horizontal-orientation.js +4 -3
- package/dist/icons/custom/horizontal-orientation.js.map +2 -2
- package/dist/icons/custom/lightning-bolt.d.ts +5 -0
- package/dist/icons/custom/lightning-bolt.d.ts.map +1 -0
- package/dist/icons/custom/lightning-bolt.js +24 -27
- package/dist/icons/custom/lightning-bolt.js.map +2 -2
- package/dist/icons/custom/music-file.d.ts +5 -0
- package/dist/icons/custom/music-file.d.ts.map +1 -0
- package/dist/icons/custom/music-file.js +17 -0
- package/dist/icons/custom/music-file.js.map +7 -0
- package/dist/icons/custom/pin.d.ts +5 -0
- package/dist/icons/custom/pin.d.ts.map +1 -0
- package/dist/icons/custom/pin.js +4 -1
- package/dist/icons/custom/pin.js.map +2 -2
- package/dist/icons/custom/premium-star.d.ts +11 -0
- package/dist/icons/custom/premium-star.d.ts.map +1 -0
- package/dist/icons/custom/premium-star.js +3 -1
- package/dist/icons/custom/premium-star.js.map +2 -2
- package/dist/icons/custom/social/discord.d.ts +5 -0
- package/dist/icons/custom/social/discord.d.ts.map +1 -0
- package/dist/icons/custom/social/discord.js +3 -4
- package/dist/icons/custom/social/discord.js.map +2 -2
- package/dist/icons/custom/social/index.d.ts +4 -0
- package/dist/icons/custom/social/index.d.ts.map +1 -0
- package/dist/icons/custom/social/tiktok.d.ts +5 -0
- package/dist/icons/custom/social/tiktok.d.ts.map +1 -0
- package/dist/icons/custom/social/tiktok.js +3 -4
- package/dist/icons/custom/social/tiktok.js.map +2 -2
- package/dist/icons/custom/social/twitter-x.d.ts +5 -0
- package/dist/icons/custom/social/twitter-x.d.ts.map +1 -0
- package/dist/icons/custom/social/twitter-x.js +19 -22
- package/dist/icons/custom/social/twitter-x.js.map +2 -2
- package/dist/icons/custom/square-aspect-ratio.d.ts +5 -0
- package/dist/icons/custom/square-aspect-ratio.d.ts.map +1 -0
- package/dist/icons/custom/square-aspect-ratio.js +4 -1
- package/dist/icons/custom/square-aspect-ratio.js.map +2 -2
- package/dist/icons/custom/tick-in-circle.d.ts +8 -0
- package/dist/icons/custom/tick-in-circle.d.ts.map +1 -0
- package/dist/icons/custom/tick-in-circle.js +25 -25
- package/dist/icons/custom/tick-in-circle.js.map +2 -2
- package/dist/icons/custom/tick-small.d.ts +5 -0
- package/dist/icons/custom/tick-small.d.ts.map +1 -0
- package/dist/icons/custom/tick-small.js +8 -10
- package/dist/icons/custom/tick-small.js.map +2 -2
- package/dist/icons/custom/tick.d.ts +5 -0
- package/dist/icons/custom/tick.d.ts.map +1 -0
- package/dist/icons/custom/tick.js +2 -2
- package/dist/icons/custom/tick.js.map +2 -2
- package/dist/icons/custom/types.d.ts +3 -0
- package/dist/icons/custom/types.d.ts.map +1 -0
- package/dist/icons/custom/types.js +1 -0
- package/dist/icons/custom/types.js.map +7 -0
- package/dist/icons/custom/ultra-wide-aspect-ratio.d.ts +5 -0
- package/dist/icons/custom/ultra-wide-aspect-ratio.d.ts.map +1 -0
- package/dist/icons/custom/ultra-wide-aspect-ratio.js +4 -1
- package/dist/icons/custom/ultra-wide-aspect-ratio.js.map +2 -2
- package/dist/icons/custom/uppbeat-credit.d.ts +5 -0
- package/dist/icons/custom/uppbeat-credit.d.ts.map +1 -0
- package/dist/icons/custom/uppbeat-credit.js +2 -4
- package/dist/icons/custom/uppbeat-credit.js.map +2 -2
- package/dist/icons/custom/vertical-orientation.d.ts +5 -0
- package/dist/icons/custom/vertical-orientation.d.ts.map +1 -0
- package/dist/icons/custom/vertical-orientation.js +4 -1
- package/dist/icons/custom/vertical-orientation.js.map +2 -2
- package/dist/icons/custom/view-credit-note.d.ts +5 -0
- package/dist/icons/custom/view-credit-note.d.ts.map +1 -0
- package/dist/icons/custom/view-credit-note.js +4 -1
- package/dist/icons/custom/view-credit-note.js.map +2 -2
- package/dist/icons/index.d.ts +28 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +4 -5
- package/dist/icons/index.js.map +2 -2
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +12 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +7 -17
- package/dist/lib/utils.js.map +2 -2
- package/dist/styles/index.css +16 -3
- package/dist/styles/storybook.css +2 -2
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/theme/index.d.ts +142 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +1 -1
- package/dist/theme/index.js.map +2 -2
- package/package.json +4 -9
- package/{tailwind.config.v4.css → tailwind.config.css} +35 -14
- package/dist/styles/index.v4.css +0 -49
- package/tailwind.config.ts +0 -313
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module Separator
|
|
3
|
+
*
|
|
4
|
+
* Visual divider for separating content. Built on Radix UI Separator primitive.
|
|
5
|
+
*
|
|
6
|
+
* @see {@link https://ui.shadcn.com/docs/components/separator Shadcn Separator}
|
|
7
|
+
* @see {@link https://www.radix-ui.com/primitives/docs/components/separator Radix Separator}
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // Horizontal separator
|
|
11
|
+
* <Separator />
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // Vertical separator
|
|
15
|
+
* <Separator orientation="vertical" className="h-4" />
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* // Between sections
|
|
19
|
+
* <div>Section 1</div>
|
|
20
|
+
* <Separator className="my-4" />
|
|
21
|
+
* <div>Section 2</div>
|
|
22
|
+
*/
|
|
23
|
+
import { Separator as SeparatorPrimitive } from "radix-ui";
|
|
24
|
+
import type { Ref } from "react";
|
|
25
|
+
/**
|
|
26
|
+
* Visual divider line, horizontal or vertical.
|
|
27
|
+
* @param orientation - `"horizontal"` (default) or `"vertical"`
|
|
28
|
+
* @param decorative - If true, removes from accessibility tree (default: true)
|
|
29
|
+
*/
|
|
30
|
+
interface SeparatorProps extends React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root> {
|
|
31
|
+
ref?: Ref<React.ElementRef<typeof SeparatorPrimitive.Root>>;
|
|
32
|
+
}
|
|
33
|
+
declare const Separator: ({ className, orientation, decorative, ref, ...props }: SeparatorProps) => import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
export { Separator };
|
|
35
|
+
//# sourceMappingURL=separator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"separator.d.ts","sourceRoot":"","sources":["../../src/components/separator.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGjC;;;;GAIG;AACH,UAAU,cACR,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC;IACtE,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;CAC7D;AAED,QAAA,MAAM,SAAS,GAAI,uDAMhB,cAAc,4CAYhB,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module Skeleton
|
|
3
|
+
*
|
|
4
|
+
* Loading placeholder with pulse animation. Use to indicate content is loading.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* // Single skeleton
|
|
8
|
+
* <Skeleton className="h-4 w-48" />
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // Multiple skeletons
|
|
12
|
+
* <Skeleton className="h-4 w-full" items={3} />
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Complex loading state with SkeletonFragment
|
|
16
|
+
* <SkeletonFragment items={3}>
|
|
17
|
+
* <div className="flex gap-2">
|
|
18
|
+
* <Skeleton className="h-12 w-12 rounded-full" />
|
|
19
|
+
* <div className="space-y-2">
|
|
20
|
+
* <Skeleton className="h-4 w-32" />
|
|
21
|
+
* <Skeleton className="h-4 w-24" />
|
|
22
|
+
* </div>
|
|
23
|
+
* </div>
|
|
24
|
+
* </SkeletonFragment>
|
|
25
|
+
*/
|
|
26
|
+
import type { ReactNode } from "react";
|
|
27
|
+
/**
|
|
28
|
+
* Animated loading placeholder.
|
|
29
|
+
* @param items - Number of skeleton elements to render (default: 1)
|
|
30
|
+
*/
|
|
31
|
+
declare const Skeleton: ({ className, items, ref, ...props }: React.HTMLAttributes<HTMLDivElement> & {
|
|
32
|
+
items?: number;
|
|
33
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
34
|
+
}) => import("react/jsx-runtime").JSX.Element[];
|
|
35
|
+
/**
|
|
36
|
+
* Repeats children multiple times for complex loading layouts.
|
|
37
|
+
* @param items - Number of times to repeat children (default: 1)
|
|
38
|
+
*/
|
|
39
|
+
declare const SkeletonFragment: ({ items, children, }: {
|
|
40
|
+
items?: number;
|
|
41
|
+
children?: ReactNode;
|
|
42
|
+
}) => import("react/jsx-runtime").JSX.Element[];
|
|
43
|
+
export { Skeleton, SkeletonFragment };
|
|
44
|
+
//# sourceMappingURL=skeleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../src/components/skeleton.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC;;;GAGG;AACH,QAAA,MAAM,QAAQ,GAAI,qCAKf,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;CACjC,8CAWG,CAAC;AAEL;;;GAGG;AACH,QAAA,MAAM,gBAAgB,GAAI,sBAGvB;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,8CAGG,CAAC;AAEL,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Slider as SliderPrimitive } from "radix-ui";
|
|
2
|
+
import type { Ref } from "react";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
declare const sliderVariants: (props?: ({
|
|
5
|
+
variant?: "default" | "dynamic" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
/**
|
|
8
|
+
* Props for the Slider component.
|
|
9
|
+
* @property variant - Visual style: `"default"` or `"dynamic"`
|
|
10
|
+
* @property showValue - Display current value next to slider (horizontal only)
|
|
11
|
+
*/
|
|
12
|
+
interface SliderProps extends React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root> {
|
|
13
|
+
ref?: Ref<React.ElementRef<typeof SliderPrimitive.Root>>;
|
|
14
|
+
/** Display the current value to the right of the slider */
|
|
15
|
+
showValue?: boolean;
|
|
16
|
+
variant?: "default" | "dynamic";
|
|
17
|
+
}
|
|
18
|
+
declare const Slider: React.MemoExoticComponent<({ className, orientation, variant, showValue, ref, ...props }: SliderProps) => import("react/jsx-runtime").JSX.Element>;
|
|
19
|
+
export type { SliderProps };
|
|
20
|
+
export { Slider, sliderVariants };
|
|
21
|
+
//# sourceMappingURL=slider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../src/components/slider.tsx"],"names":[],"mappings":"AA2BA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,QAAA,MAAM,cAAc;;8EAanB,CAAC;AAsBF;;;;GAIG;AACH,UAAU,WACR,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC;IACnE,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACjC;AAED,QAAA,MAAM,MAAM,4FAQP,WAAW,6CAyCf,CAAC;AAEF,YAAY,EAAE,WAAW,EAAE,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -72,7 +72,7 @@ const Slider = React.memo(
|
|
|
72
72
|
(props.value ?? props.defaultValue ?? []).map((_, index) => /* @__PURE__ */ jsx(
|
|
73
73
|
SliderPrimitive.Thumb,
|
|
74
74
|
{
|
|
75
|
-
className: "block h-3 w-3 rounded-full border-2 border-
|
|
75
|
+
className: "block h-3 w-3 rounded-full border-2 border-brand-primary bg-brand-primary ring-offset-white transition-colors hover:cursor-grab focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 active:cursor-grabbing disabled:pointer-events-none disabled:opacity-50 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300"
|
|
76
76
|
},
|
|
77
77
|
index
|
|
78
78
|
))
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/slider.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * @module Slider\n *\n * Range input slider with draggable thumb. Built on Radix UI Slider primitive.\n *\n * @see {@link https://ui.shadcn.com/docs/components/slider Shadcn Slider}\n * @see {@link https://www.radix-ui.com/primitives/docs/components/slider Radix Slider}\n *\n * @example\n * // Basic slider\n * <Slider defaultValue={[50]} max={100} step={1} />\n *\n * @example\n * // With value display\n * <Slider defaultValue={[50]} max={100} showValue />\n *\n * @example\n * // Controlled slider\n * const [value, setValue] = useState([25]);\n *\n * <Slider value={value} onValueChange={setValue} max={100} />\n *\n * @example\n * // Vertical orientation\n * <Slider orientation=\"vertical\" className=\"h-48\" />\n */\nimport { cva } from \"class-variance-authority\";\nimport { Slider as SliderPrimitive } from \"radix-ui\";\nimport type { Ref } from \"react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst sliderVariants = cva(\n \"relative flex h-full w-full touch-none select-none items-center justify-center\",\n {\n variants: {\n variant: {\n default: \"\",\n dynamic: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nconst trackVariants = cva(\n \"relative overflow-hidden rounded-full bg-gray-200 hover:cursor-pointer\",\n {\n variants: {\n variant: {\n default: \"bg-gray-200\",\n dynamic: \"bg-gray-100 dark:bg-gray-700\",\n },\n orientation: {\n horizontal: \"h-1 w-full\",\n vertical: \"h-full w-1\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n orientation: \"horizontal\",\n },\n }\n);\n\n/**\n * Props for the Slider component.\n * @property variant - Visual style: `\"default\"` or `\"dynamic\"`\n * @property showValue - Display current value next to slider (horizontal only)\n */\ninterface SliderProps\n extends React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root> {\n
|
|
4
|
+
"sourcesContent": ["/**\n * @module Slider\n *\n * Range input slider with draggable thumb. Built on Radix UI Slider primitive.\n *\n * @see {@link https://ui.shadcn.com/docs/components/slider Shadcn Slider}\n * @see {@link https://www.radix-ui.com/primitives/docs/components/slider Radix Slider}\n *\n * @example\n * // Basic slider\n * <Slider defaultValue={[50]} max={100} step={1} />\n *\n * @example\n * // With value display\n * <Slider defaultValue={[50]} max={100} showValue />\n *\n * @example\n * // Controlled slider\n * const [value, setValue] = useState([25]);\n *\n * <Slider value={value} onValueChange={setValue} max={100} />\n *\n * @example\n * // Vertical orientation\n * <Slider orientation=\"vertical\" className=\"h-48\" />\n */\nimport { cva } from \"class-variance-authority\";\nimport { Slider as SliderPrimitive } from \"radix-ui\";\nimport type { Ref } from \"react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst sliderVariants = cva(\n \"relative flex h-full w-full touch-none select-none items-center justify-center\",\n {\n variants: {\n variant: {\n default: \"\",\n dynamic: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nconst trackVariants = cva(\n \"relative overflow-hidden rounded-full bg-gray-200 hover:cursor-pointer\",\n {\n variants: {\n variant: {\n default: \"bg-gray-200\",\n dynamic: \"bg-gray-100 dark:bg-gray-700\",\n },\n orientation: {\n horizontal: \"h-1 w-full\",\n vertical: \"h-full w-1\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n orientation: \"horizontal\",\n },\n }\n);\n\n/**\n * Props for the Slider component.\n * @property variant - Visual style: `\"default\"` or `\"dynamic\"`\n * @property showValue - Display current value next to slider (horizontal only)\n */\ninterface SliderProps\n extends React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root> {\n ref?: Ref<React.ElementRef<typeof SliderPrimitive.Root>>;\n /** Display the current value to the right of the slider */\n showValue?: boolean;\n variant?: \"default\" | \"dynamic\";\n}\n\nconst Slider = React.memo(\n ({\n className,\n orientation = \"horizontal\",\n variant,\n showValue = false,\n ref,\n ...props\n }: SliderProps) => {\n const sliderElement = (\n <SliderPrimitive.Root\n className={cn(sliderVariants({ variant, className }))}\n orientation={orientation}\n ref={ref}\n {...props}\n >\n <SliderPrimitive.Track\n className={cn(trackVariants({ variant, orientation }))}\n >\n <SliderPrimitive.Range\n className={cn(\n \"absolute bg-brand-primary\",\n orientation === \"horizontal\" ? \"h-full\" : \"right-0 w-full\"\n )}\n data-orientation={orientation}\n />\n </SliderPrimitive.Track>\n {(props.value ?? props.defaultValue ?? []).map((_, index) => (\n <SliderPrimitive.Thumb\n className=\"block h-3 w-3 rounded-full border-2 border-brand-primary bg-brand-primary ring-offset-white transition-colors hover:cursor-grab focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 active:cursor-grabbing disabled:pointer-events-none disabled:opacity-50 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300\"\n key={index}\n />\n ))}\n </SliderPrimitive.Root>\n );\n\n if (showValue && orientation === \"horizontal\") {\n return (\n <div className=\"flex items-center gap-3\">\n {sliderElement}\n <span className=\"min-w-[2rem] text-right text-gray-700 text-sm tabular-nums dark:text-gray-200\">\n {props.value?.at(0) ?? props.defaultValue?.at(0) ?? 0}\n </span>\n </div>\n );\n }\n\n return sliderElement;\n }\n);\n\nexport type { SliderProps };\nexport { Slider, sliderVariants };\n"],
|
|
5
5
|
"mappings": "AA2FM,SASI,KATJ;AAjEN,SAAS,WAAW;AACpB,SAAS,UAAU,uBAAuB;AAE1C,YAAY,WAAW;AAEvB,SAAS,UAAU;AAEnB,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,MAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,aAAa;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAeA,MAAM,SAAS,MAAM;AAAA,EACnB,CAAC;AAAA,IACC;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,MAAmB;AACjB,UAAM,gBACJ;AAAA,MAAC,gBAAgB;AAAA,MAAhB;AAAA,QACC,WAAW,GAAG,eAAe,EAAE,SAAS,UAAU,CAAC,CAAC;AAAA,QACpD;AAAA,QACA;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC,gBAAgB;AAAA,YAAhB;AAAA,cACC,WAAW,GAAG,cAAc,EAAE,SAAS,YAAY,CAAC,CAAC;AAAA,cAErD;AAAA,gBAAC,gBAAgB;AAAA,gBAAhB;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,gBAAgB,eAAe,WAAW;AAAA,kBAC5C;AAAA,kBACA,oBAAkB;AAAA;AAAA,cACpB;AAAA;AAAA,UACF;AAAA,WACE,MAAM,SAAS,MAAM,gBAAgB,CAAC,GAAG,IAAI,CAAC,GAAG,UACjD;AAAA,YAAC,gBAAgB;AAAA,YAAhB;AAAA,cACC,WAAU;AAAA;AAAA,YACL;AAAA,UACP,CACD;AAAA;AAAA;AAAA,IACH;AAGF,QAAI,aAAa,gBAAgB,cAAc;AAC7C,aACE,qBAAC,SAAI,WAAU,2BACZ;AAAA;AAAA,QACD,oBAAC,UAAK,WAAU,iFACb,gBAAM,OAAO,GAAG,CAAC,KAAK,MAAM,cAAc,GAAG,CAAC,KAAK,GACtD;AAAA,SACF;AAAA,IAEJ;AAEA,WAAO;AAAA,EACT;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module StackingCard
|
|
3
|
+
*
|
|
4
|
+
* Selectable card component with collapsible content. Supports single selection groups.
|
|
5
|
+
* Features animated expand/collapse and accessible keyboard navigation.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* // Single selectable card
|
|
9
|
+
* <StackingCard selectable selected={isSelected} onSelectedChange={setSelected}>
|
|
10
|
+
* <StackingCardHeader>
|
|
11
|
+
* <StackingCardTitle>Premium Plan</StackingCardTitle>
|
|
12
|
+
* </StackingCardHeader>
|
|
13
|
+
* <StackingCardContent collapsible>
|
|
14
|
+
* <StackingCardList>
|
|
15
|
+
* <StackingCardListItem>Unlimited downloads</StackingCardListItem>
|
|
16
|
+
* <StackingCardListItem>Priority support</StackingCardListItem>
|
|
17
|
+
* </StackingCardList>
|
|
18
|
+
* </StackingCardContent>
|
|
19
|
+
* </StackingCard>
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // Radio group of cards
|
|
23
|
+
* <StackingCardGroup value={plan} onValueChange={setPlan}>
|
|
24
|
+
* <StackingCard value="basic" selectable>
|
|
25
|
+
* <StackingCardHeader>
|
|
26
|
+
* <StackingCardTitle>Basic</StackingCardTitle>
|
|
27
|
+
* </StackingCardHeader>
|
|
28
|
+
* </StackingCard>
|
|
29
|
+
* <StackingCard value="pro" selectable>
|
|
30
|
+
* <StackingCardHeader>
|
|
31
|
+
* <StackingCardTitle>Pro</StackingCardTitle>
|
|
32
|
+
* </StackingCardHeader>
|
|
33
|
+
* </StackingCard>
|
|
34
|
+
* </StackingCardGroup>
|
|
35
|
+
*/
|
|
36
|
+
import type { LucideProps } from "lucide-react";
|
|
37
|
+
import * as React from "react";
|
|
38
|
+
import type { ListItemProps, ListProps } from "./typography/list";
|
|
39
|
+
interface StackingCardProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
40
|
+
"aria-describedby"?: string;
|
|
41
|
+
"aria-label"?: string;
|
|
42
|
+
"aria-labelledby"?: string;
|
|
43
|
+
initiallyCollapsed?: boolean;
|
|
44
|
+
onSelectedChange?: (selected: boolean) => void;
|
|
45
|
+
selectable?: boolean;
|
|
46
|
+
selected?: boolean;
|
|
47
|
+
value?: string;
|
|
48
|
+
variant?: "default" | "selected";
|
|
49
|
+
}
|
|
50
|
+
declare function StackingCard({ className, children, selectable, selected, onSelectedChange, variant, onClick, value, onKeyDown, initiallyCollapsed, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, "aria-describedby": ariaDescribedby, ref, ...props }: StackingCardProps & {
|
|
51
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
52
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
53
|
+
type StackingCardHeaderProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
54
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
55
|
+
};
|
|
56
|
+
declare function StackingCardHeader({ className, children, ref, ...props }: StackingCardHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
57
|
+
type StackingCardTitleProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
58
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
59
|
+
};
|
|
60
|
+
declare function StackingCardTitle({ className, ref, ...props }: StackingCardTitleProps): import("react/jsx-runtime").JSX.Element;
|
|
61
|
+
type StackingCardDescriptionProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
62
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
63
|
+
};
|
|
64
|
+
declare function StackingCardDescription({ className, ref, ...props }: StackingCardDescriptionProps): import("react/jsx-runtime").JSX.Element;
|
|
65
|
+
interface StackingCardContentProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
66
|
+
collapsible?: boolean;
|
|
67
|
+
description?: React.ReactNode;
|
|
68
|
+
minimal?: boolean;
|
|
69
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
70
|
+
}
|
|
71
|
+
declare function StackingCardContent({ className, children, collapsible, minimal, description, ref, ...props }: StackingCardContentProps): import("react/jsx-runtime").JSX.Element;
|
|
72
|
+
declare function StackingCardList({ className, children, ref, ...props }: ListProps & {
|
|
73
|
+
ref?: React.Ref<HTMLUListElement | HTMLOListElement>;
|
|
74
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
75
|
+
declare const StackingCardCheck: React.NamedExoticComponent<LucideProps>;
|
|
76
|
+
declare function StackingCardListItem({ className, children, ref, ...props }: ListItemProps & {
|
|
77
|
+
ref?: React.Ref<HTMLLIElement>;
|
|
78
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
79
|
+
interface StackingCardGroupProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
80
|
+
"aria-label"?: string;
|
|
81
|
+
"aria-labelledby"?: string;
|
|
82
|
+
defaultValue?: string;
|
|
83
|
+
onValueChange?: (value: string) => void;
|
|
84
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
85
|
+
value?: string;
|
|
86
|
+
}
|
|
87
|
+
declare function StackingCardGroup({ className, children, value, onValueChange, defaultValue, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, ref, ...props }: StackingCardGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
88
|
+
export { StackingCard, StackingCardCheck, StackingCardContent, StackingCardDescription, StackingCardGroup, StackingCardHeader, StackingCardList, StackingCardListItem, StackingCardTitle, };
|
|
89
|
+
//# sourceMappingURL=stacking-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stacking-card.d.ts","sourceRoot":"","sources":["../../src/components/stacking-card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -233,7 +233,7 @@ function StackingCard({
|
|
|
233
233
|
"aria-pressed": !isInGroup && selectable ? isSelected : void 0,
|
|
234
234
|
className: cn(
|
|
235
235
|
"relative flex w-full min-w-64 max-w-96 flex-col overflow-hidden border border-solid",
|
|
236
|
-
"rounded-2xl shadow-
|
|
236
|
+
"rounded-2xl shadow-xs transition-colors",
|
|
237
237
|
selectable && "cursor-pointer",
|
|
238
238
|
isSelected ? "border-gray-950 dark:border-white" : "border-gray-150 dark:border-gray-800",
|
|
239
239
|
"focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2",
|
|
@@ -498,8 +498,8 @@ function StackingCardGroup({
|
|
|
498
498
|
);
|
|
499
499
|
const [internalExpandedValue, setInternalExpandedValue] = React.useState(defaultValue ?? null);
|
|
500
500
|
const [controlledExpandedValue, setControlledExpandedValue] = React.useState(value ?? null);
|
|
501
|
-
const effectiveSelectedValue = value
|
|
502
|
-
const effectiveExpandedValue = value
|
|
501
|
+
const effectiveSelectedValue = value === void 0 ? internalSelectedValue : value;
|
|
502
|
+
const effectiveExpandedValue = value === void 0 ? internalExpandedValue : controlledExpandedValue;
|
|
503
503
|
React.useEffect(() => {
|
|
504
504
|
if (value !== void 0) {
|
|
505
505
|
setControlledExpandedValue(value);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/stacking-card.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * @module StackingCard\n *\n * Selectable card component with collapsible content. Supports single selection groups.\n * Features animated expand/collapse and accessible keyboard navigation.\n *\n * @example\n * // Single selectable card\n * <StackingCard selectable selected={isSelected} onSelectedChange={setSelected}>\n * <StackingCardHeader>\n * <StackingCardTitle>Premium Plan</StackingCardTitle>\n * </StackingCardHeader>\n * <StackingCardContent collapsible>\n * <StackingCardList>\n * <StackingCardListItem>Unlimited downloads</StackingCardListItem>\n * <StackingCardListItem>Priority support</StackingCardListItem>\n * </StackingCardList>\n * </StackingCardContent>\n * </StackingCard>\n *\n * @example\n * // Radio group of cards\n * <StackingCardGroup value={plan} onValueChange={setPlan}>\n * <StackingCard value=\"basic\" selectable>\n * <StackingCardHeader>\n * <StackingCardTitle>Basic</StackingCardTitle>\n * </StackingCardHeader>\n * </StackingCard>\n * <StackingCard value=\"pro\" selectable>\n * <StackingCardHeader>\n * <StackingCardTitle>Pro</StackingCardTitle>\n * </StackingCardHeader>\n * </StackingCard>\n * </StackingCardGroup>\n */\nimport type { LucideProps } from \"lucide-react\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport type { Variants } from \"motion/react\";\nimport { motion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { DummyCheckbox } from \"./checkbox\";\nimport { Separator } from \"./separator\";\n\nimport type { ListItemProps, ListProps } from \"./typography/list\";\nimport { List, ListItem } from \"./typography/list\";\nimport { Text } from \"./typography/text\";\n\n// Motion transition configuration\nconst motionTransition = {\n duration: 0.4,\n type: \"spring\" as const,\n bounce: 0,\n};\n\nconst motionVariantsChevron: Variants = {\n collapsed: {\n rotate: 0,\n transition: motionTransition,\n },\n expanded: {\n rotate: 180,\n transition: motionTransition,\n },\n};\n\n// Hook to handle auto height animation for collapsible content\nconst useAutoHeight = () => {\n const [height, setHeight] = React.useState<number | \"auto\">(\"auto\");\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (!ref.current) {\n return;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n\n if (entry) {\n setHeight(entry.contentRect.height);\n }\n });\n\n resizeObserver.observe(ref.current);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n const variants: Variants = React.useMemo(\n () => ({\n collapsed: {\n height: 0,\n opacity: 0,\n transition: motionTransition,\n },\n expanded: {\n height: height === \"auto\" ? \"auto\" : height,\n opacity: 1,\n transition: motionTransition,\n },\n }),\n [height]\n );\n\n return { ref, variants };\n};\n\ninterface StackingCardGroupContextValue {\n selectedValue: string;\n expandedValue: string | null;\n onValueChange?: (value: string) => void;\n onExpandedChange?: (value: string | null) => void;\n registerCardRef?: (value: string, element: HTMLElement | null) => void;\n}\n\nconst StackingCardGroupContext =\n React.createContext<StackingCardGroupContextValue | null>(null);\n\nconst useStackingCardGroup = () => {\n const context = React.useContext(StackingCardGroupContext);\n\n return context;\n};\n\ninterface StackingCardContextValue {\n isSelected?: boolean;\n isCollapsed?: boolean;\n selectable?: boolean;\n onSelectedChange?: (selected: boolean) => void;\n onToggleCollapse?: () => void;\n setHasCollapsibleContent?: (hasCollapsible: boolean) => void;\n contentId?: string;\n}\n\nconst StackingCardContext = React.createContext<StackingCardContextValue>({});\n\nconst useStackingCard = () => {\n const context = React.useContext(StackingCardContext);\n\n return context;\n};\n\ninterface StackingCardProps extends React.HTMLAttributes<HTMLDivElement> {\n selectable?: boolean;\n selected?: boolean;\n onSelectedChange?: (selected: boolean) => void;\n variant?: \"default\" | \"selected\";\n value?: string;\n initiallyCollapsed?: boolean;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Complex component with many state interactions\nfunction StackingCard({\n className,\n children,\n selectable = false,\n selected = false,\n onSelectedChange,\n variant,\n onClick,\n value,\n onKeyDown,\n initiallyCollapsed = true,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n \"aria-describedby\": ariaDescribedby,\n ref,\n ...props\n}: StackingCardProps & { ref?: React.Ref<HTMLDivElement> }) {\n const [isCollapsed, setIsCollapsed] = React.useState(true);\n const [hasCollapsibleContent, setHasCollapsibleContent] =\n React.useState(false);\n\n const [wasSelected, setWasSelected] = React.useState(false);\n\n const ignoreInitiallyCollapsedAfterRenderRef = React.useRef(false);\n const timeoutRef = React.useRef<NodeJS.Timeout | null>(null);\n\n // Generate unique ID for this card instance\n const cardId = React.useId();\n const contentId = `${cardId}-content`;\n\n const group = useStackingCardGroup();\n\n // Determine if we're in a group\n const isInGroup = group !== null;\n\n // Determine selection state\n const isSelected = isInGroup\n ? group.selectedValue === value\n : variant === \"selected\" || selected;\n\n // Auto-expand logic: if card becomes selected and has collapsible content, expand it\n // This is calculated during render, not in useEffect\n const justBecameSelected = isSelected && !wasSelected;\n\n if (justBecameSelected && hasCollapsibleContent) {\n if (isInGroup) {\n // In group mode, expand this card\n group?.onExpandedChange?.(value ?? null);\n } else {\n // In standalone mode, expand this card\n setIsCollapsed(false);\n }\n }\n\n // Update wasSelected for next render (this is safe during render)\n if (isSelected !== wasSelected) {\n setWasSelected(isSelected);\n }\n\n // Determine collapse state\n let shouldBeCollapsed = isCollapsed;\n\n if (initiallyCollapsed && !ignoreInitiallyCollapsedAfterRenderRef.current) {\n shouldBeCollapsed = true;\n } else if (isInGroup) {\n shouldBeCollapsed = group.expandedValue !== value;\n }\n\n const ignoreInitiallyCollapsedRef = React.useCallback(() => {\n if (initiallyCollapsed && !ignoreInitiallyCollapsedAfterRenderRef.current) {\n ignoreInitiallyCollapsedAfterRenderRef.current = true;\n }\n }, [initiallyCollapsed]);\n\n const handleSelect = React.useCallback(() => {\n if (selectable) {\n if (isInGroup && value) {\n group?.onValueChange?.(value);\n } else if (!isInGroup && onSelectedChange) {\n onSelectedChange(!selected);\n }\n }\n }, [selectable, isInGroup, value, onSelectedChange, group, selected]);\n\n const handleToggleCollapse = React.useCallback(() => {\n if (isInGroup) {\n // In group mode, toggle between this card and null (all collapsed)\n group?.onExpandedChange?.(\n group.expandedValue === value ? null : (value ?? null)\n );\n } else {\n setIsCollapsed(!isCollapsed);\n }\n }, [isInGroup, group, value, isCollapsed]);\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n // Immediately mark that we're no longer in the initial state\n ignoreInitiallyCollapsedRef();\n\n if (selectable && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n handleSelect();\n }\n\n onKeyDown?.(e);\n },\n [selectable, handleSelect, onKeyDown, ignoreInitiallyCollapsedRef]\n );\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n\n // Immediately mark that we're no longer in the initial state\n ignoreInitiallyCollapsedRef();\n\n handleSelect();\n\n if (isSelected) {\n handleToggleCollapse();\n }\n\n onClick?.(e);\n },\n [\n handleSelect,\n onClick,\n isSelected,\n handleToggleCollapse,\n ignoreInitiallyCollapsedRef,\n ]\n );\n\n const contextValue: StackingCardContextValue = React.useMemo(\n () => ({\n isSelected,\n isCollapsed: shouldBeCollapsed,\n selectable,\n onSelectedChange,\n onToggleCollapse: handleToggleCollapse,\n setHasCollapsibleContent,\n contentId,\n }),\n [\n isSelected,\n shouldBeCollapsed,\n selectable,\n onSelectedChange,\n handleToggleCollapse,\n contentId,\n ]\n );\n\n // Generate accessible label if not provided\n const accessibleLabel = ariaLabel ?? (isInGroup ? `Option ${value}` : \"Card\");\n\n // Compute role separately to avoid nested ternary\n const computeRole = (): \"radio\" | \"button\" | undefined => {\n if (isInGroup) {\n return \"radio\";\n }\n if (selectable) {\n return \"button\";\n }\n return;\n };\n const cardRole = computeRole();\n\n // Combined ref callback that handles both forwarded ref and group registration\n const combinedRef = React.useCallback(\n (element: HTMLDivElement | null) => {\n // Handle forwarded ref\n if (typeof ref === \"function\") {\n ref(element);\n } else if (ref) {\n ref.current = element;\n }\n\n // Register with group if needed\n if (isInGroup && value && group?.registerCardRef) {\n group.registerCardRef(value, element);\n }\n },\n [ref, isInGroup, value, group]\n );\n\n React.useEffect(() => {\n if (initiallyCollapsed && !ignoreInitiallyCollapsedAfterRenderRef.current) {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n ignoreInitiallyCollapsedAfterRenderRef.current = true;\n }, 1500); // delay to allow for rapid re-renders to settle\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [initiallyCollapsed]);\n\n return (\n <StackingCardContext.Provider value={contextValue}>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Role is dynamically assigned based on context */}\n {/* biome-ignore lint/a11y/noNoninteractiveElementInteractions: Interactive behavior with proper role */}\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: aria-checked is valid for radio role */}\n <div\n aria-checked={isInGroup ? isSelected : undefined}\n aria-describedby={ariaDescribedby}\n aria-expanded={hasCollapsibleContent ? !shouldBeCollapsed : undefined}\n aria-label={accessibleLabel}\n aria-labelledby={ariaLabelledby}\n aria-pressed={!isInGroup && selectable ? isSelected : undefined}\n className={cn(\n \"relative flex w-full min-w-64 max-w-96 flex-col overflow-hidden border border-solid\",\n \"rounded-2xl shadow-sm transition-colors\",\n selectable && \"cursor-pointer\",\n isSelected\n ? \"border-gray-950 dark:border-white\"\n : \"border-gray-150 dark:border-gray-800\",\n \"focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2\",\n className\n )}\n key={value}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n ref={combinedRef}\n role={cardRole}\n style={props.style}\n tabIndex={selectable ? 0 : undefined}\n {...props}\n >\n {children}\n </div>\n </StackingCardContext.Provider>\n );\n}\n\ntype StackingCardHeaderProps = React.HTMLAttributes<HTMLDivElement> & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\nfunction StackingCardHeader({\n className,\n children,\n ref,\n ...props\n}: StackingCardHeaderProps) {\n const { selectable, isSelected } = useStackingCard();\n\n return (\n <div\n className={cn(\n \"flex items-center justify-between gap-2 px-6 pt-4 pb-1\",\n isSelected && \"bg-gray-100 dark:bg-gray-800\",\n className\n )}\n ref={ref}\n {...props}\n >\n <div className=\"flex flex-1 items-center gap-2\">\n {selectable && (\n <DummyCheckbox checked={isSelected} tabIndex={-1} variant=\"rounded\" />\n )}\n {children}\n </div>\n </div>\n );\n}\n\ntype StackingCardTitleProps = React.HTMLAttributes<HTMLDivElement> & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\nfunction StackingCardTitle({\n className,\n ref,\n ...props\n}: StackingCardTitleProps) {\n return (\n <Text\n className={cn(\n \"font-sans font-semibold text-gray-950 text-sm leading-6 dark:text-white\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n}\n\ntype StackingCardDescriptionProps = React.HTMLAttributes<HTMLDivElement> & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\nfunction StackingCardDescription({\n className,\n ref,\n ...props\n}: StackingCardDescriptionProps) {\n return (\n <Text\n className={cn(\"text-gray-700 text-sm dark:text-gray-200\", className)}\n ref={ref}\n {...props}\n />\n );\n}\n\nconst MotionChevron = ({ isCollapsed }: { isCollapsed: boolean }) => (\n <motion.div\n animate={isCollapsed ? \"collapsed\" : \"expanded\"}\n className=\"flex items-center justify-center\"\n initial=\"collapsed\"\n variants={motionVariantsChevron}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </motion.div>\n);\n\ninterface StackingCardContentProps\n extends React.HTMLAttributes<HTMLDivElement> {\n collapsible?: boolean;\n minimal?: boolean;\n description?: React.ReactNode;\n ref?: React.Ref<HTMLDivElement>;\n}\n\nfunction StackingCardContent({\n className,\n children,\n collapsible = false,\n minimal = false,\n description,\n ref,\n ...props\n}: StackingCardContentProps) {\n const {\n isCollapsed,\n isSelected,\n onToggleCollapse,\n setHasCollapsibleContent,\n contentId,\n } = useStackingCard();\n\n const { ref: autoHeightRef, variants: autoHeightVariants } = useAutoHeight();\n\n // Register this component as having collapsible content\n React.useEffect(() => {\n if (collapsible) {\n setHasCollapsibleContent?.(true);\n }\n\n return () => {\n setHasCollapsibleContent?.(false);\n };\n }, [collapsible, setHasCollapsibleContent]);\n\n if (!collapsible) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-1.5 px-6 pt-0 pb-4\",\n isSelected && \"bg-gray-100 dark:bg-gray-800\",\n className\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n return (\n <>\n <div\n className={cn(\n \"flex items-center justify-between gap-2 px-6 pb-4\",\n isSelected && \"bg-gray-100 dark:bg-gray-800\"\n )}\n >\n {description ? (\n <div className=\"flex-1\">{description}</div>\n ) : (\n <div aria-hidden className=\"flex-1\" />\n )}\n <Button\n aria-controls={contentId}\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? \"Show details\" : \"Hide details\"}\n borderRadius=\"full\"\n className={cn(isSelected && \"bg-white dark:bg-gray-900\", \"h-3\")}\n onClick={(e) => {\n e.stopPropagation();\n onToggleCollapse?.();\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.stopPropagation();\n }\n }}\n size=\"xs\"\n variant=\"light\"\n >\n <span className={cn({ \"sr-only\": minimal })}>Details</span>\n <MotionChevron isCollapsed={isCollapsed ?? false} />\n </Button>\n </div>\n <motion.div\n animate={isCollapsed ? \"collapsed\" : \"expanded\"}\n aria-hidden={isCollapsed}\n className=\"overflow-hidden\"\n id={contentId}\n initial=\"collapsed\"\n variants={autoHeightVariants}\n >\n <div className=\"flex flex-col\" ref={autoHeightRef}>\n <Separator\n className={cn(\n \"mt-0 mb-0\",\n isSelected\n ? \"bg-gray-950 dark:bg-white\"\n : \"border-gray-150 dark:border-gray-800\"\n )}\n />\n <div\n className={cn(\"flex flex-col gap-1.5\", className)}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n </div>\n </motion.div>\n </>\n );\n}\n\nfunction StackingCardList({\n className,\n children,\n ref,\n ...props\n}: ListProps & { ref?: React.Ref<HTMLUListElement | HTMLOListElement> }) {\n return (\n <List\n className={cn(\"list-none px-6 pt-3 pb-5\", className)}\n ref={ref}\n {...props}\n >\n {children}\n </List>\n );\n}\n\nconst StackingCardCheck = React.memo<LucideProps>(({ className, ...props }) => {\n const { selectable, isSelected } = useStackingCard();\n\n return (\n <Check\n className={cn(\n \"-mt-0.5 size-[14px]\",\n {\n \"text-current\": !selectable,\n \"text-brand-primary\": isSelected && selectable,\n \"text-gray-950 dark:text-white\": !isSelected && selectable,\n },\n className\n )}\n {...props}\n />\n );\n});\n\nStackingCardCheck.displayName = \"StackingCardCheck\";\n\nfunction StackingCardListItem({\n className,\n children,\n ref,\n ...props\n}: ListItemProps & { ref?: React.Ref<HTMLLIElement> }) {\n return (\n <ListItem\n className={cn(\n \"flex font-sans text-gray-700 text-sm first:mt-0 dark:text-gray-200\",\n className\n )}\n customBullet={<StackingCardCheck />}\n ref={ref}\n {...props}\n >\n {children}\n </ListItem>\n );\n}\n\ninterface StackingCardGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string;\n onValueChange?: (value: string) => void;\n defaultValue?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n ref?: React.Ref<HTMLDivElement>;\n}\n\nfunction StackingCardGroup({\n className,\n children,\n value,\n onValueChange,\n defaultValue,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n ref,\n ...props\n}: StackingCardGroupProps) {\n const [internalSelectedValue, setInternalSelectedValue] = React.useState(\n defaultValue ?? \"\"\n );\n\n const [internalExpandedValue, setInternalExpandedValue] = React.useState<\n string | null\n >(defaultValue ?? null);\n\n // For controlled mode, we need to manage expansion state separately\n const [controlledExpandedValue, setControlledExpandedValue] = React.useState<\n string | null\n >(value ?? null);\n\n // Calculate effective values during render (controlled vs uncontrolled pattern)\n const effectiveSelectedValue =\n value !== undefined ? value : internalSelectedValue;\n\n const effectiveExpandedValue =\n value !== undefined ? controlledExpandedValue : internalExpandedValue;\n\n // Auto-expand selected card in controlled mode\n React.useEffect(() => {\n if (value !== undefined) {\n setControlledExpandedValue(value);\n }\n }, [value]);\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n // Only update internal state if uncontrolled\n if (value === undefined) {\n setInternalSelectedValue(newValue);\n setInternalExpandedValue(newValue);\n } else {\n // In controlled mode, auto-expand the newly selected card\n setControlledExpandedValue(newValue);\n }\n\n onValueChange?.(newValue);\n },\n [value, onValueChange]\n );\n\n const handleExpandedChange = React.useCallback(\n (newExpandedValue: string | null) => {\n if (value === undefined) {\n // Uncontrolled mode\n setInternalExpandedValue(newExpandedValue);\n } else {\n // Controlled mode\n setControlledExpandedValue(newExpandedValue);\n }\n },\n [value]\n );\n\n // Extract card values from children for arrow key navigation\n const cardValues = React.useMemo(() => {\n const values: string[] = [];\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const childValue = (child.props as { value?: unknown }).value;\n\n if (typeof childValue === \"string\") {\n values.push(childValue);\n }\n }\n });\n\n return values;\n }, [children]);\n\n // Store card refs for navigation\n const cardRefsRef = React.useRef<Map<string, HTMLElement>>(new Map());\n\n const registerCardRef = React.useCallback(\n (cardValue: string, element: HTMLElement | null) => {\n if (element) {\n cardRefsRef.current.set(cardValue, element);\n } else {\n cardRefsRef.current.delete(cardValue);\n }\n },\n []\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (cardValues.length === 0) {\n return;\n }\n\n const currentIndex = cardValues.indexOf(effectiveSelectedValue);\n let nextIndex = currentIndex;\n\n switch (e.key) {\n case \"ArrowDown\":\n case \"ArrowRight\":\n e.preventDefault();\n nextIndex =\n currentIndex < cardValues.length - 1 ? currentIndex + 1 : 0;\n break;\n case \"ArrowUp\":\n case \"ArrowLeft\":\n e.preventDefault();\n nextIndex =\n currentIndex > 0 ? currentIndex - 1 : cardValues.length - 1;\n break;\n case \"Home\":\n e.preventDefault();\n nextIndex = 0;\n break;\n case \"End\":\n e.preventDefault();\n nextIndex = cardValues.length - 1;\n break;\n default:\n return;\n }\n\n const nextValue = cardValues[nextIndex];\n\n if (nextValue && nextValue !== effectiveSelectedValue) {\n handleValueChange(nextValue);\n\n // Focus the newly selected card using registered ref\n setTimeout(() => {\n const targetCard = cardRefsRef.current.get(nextValue);\n\n targetCard?.focus();\n }, 0);\n }\n },\n [cardValues, effectiveSelectedValue, handleValueChange]\n );\n\n const contextValue: StackingCardGroupContextValue = React.useMemo(\n () => ({\n selectedValue: effectiveSelectedValue,\n expandedValue: effectiveExpandedValue,\n onValueChange: handleValueChange,\n onExpandedChange: handleExpandedChange,\n registerCardRef,\n }),\n [\n effectiveSelectedValue,\n effectiveExpandedValue,\n handleValueChange,\n handleExpandedChange,\n registerCardRef,\n ]\n );\n\n // Generate accessible label if not provided\n const accessibleLabel = ariaLabel ?? \"Select an option\";\n\n return (\n <StackingCardGroupContext.Provider value={contextValue}>\n <div\n aria-label={accessibleLabel}\n aria-labelledby={ariaLabelledby}\n className={cn(\"flex flex-col gap-4\", className)}\n onKeyDown={handleKeyDown}\n ref={ref}\n role=\"radiogroup\"\n tabIndex={-1}\n {...props}\n >\n {children}\n </div>\n </StackingCardGroupContext.Provider>\n );\n}\n\nexport {\n StackingCard,\n StackingCardCheck,\n StackingCardContent,\n StackingCardDescription,\n StackingCardGroup,\n StackingCardHeader,\n StackingCardList,\n StackingCardListItem,\n StackingCardTitle,\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * @module StackingCard\n *\n * Selectable card component with collapsible content. Supports single selection groups.\n * Features animated expand/collapse and accessible keyboard navigation.\n *\n * @example\n * // Single selectable card\n * <StackingCard selectable selected={isSelected} onSelectedChange={setSelected}>\n * <StackingCardHeader>\n * <StackingCardTitle>Premium Plan</StackingCardTitle>\n * </StackingCardHeader>\n * <StackingCardContent collapsible>\n * <StackingCardList>\n * <StackingCardListItem>Unlimited downloads</StackingCardListItem>\n * <StackingCardListItem>Priority support</StackingCardListItem>\n * </StackingCardList>\n * </StackingCardContent>\n * </StackingCard>\n *\n * @example\n * // Radio group of cards\n * <StackingCardGroup value={plan} onValueChange={setPlan}>\n * <StackingCard value=\"basic\" selectable>\n * <StackingCardHeader>\n * <StackingCardTitle>Basic</StackingCardTitle>\n * </StackingCardHeader>\n * </StackingCard>\n * <StackingCard value=\"pro\" selectable>\n * <StackingCardHeader>\n * <StackingCardTitle>Pro</StackingCardTitle>\n * </StackingCardHeader>\n * </StackingCard>\n * </StackingCardGroup>\n */\nimport type { LucideProps } from \"lucide-react\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport type { Variants } from \"motion/react\";\nimport { motion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { DummyCheckbox } from \"./checkbox\";\nimport { Separator } from \"./separator\";\n\nimport type { ListItemProps, ListProps } from \"./typography/list\";\nimport { List, ListItem } from \"./typography/list\";\nimport { Text } from \"./typography/text\";\n\n// Motion transition configuration\nconst motionTransition = {\n duration: 0.4,\n type: \"spring\" as const,\n bounce: 0,\n};\n\nconst motionVariantsChevron: Variants = {\n collapsed: {\n rotate: 0,\n transition: motionTransition,\n },\n expanded: {\n rotate: 180,\n transition: motionTransition,\n },\n};\n\n// Hook to handle auto height animation for collapsible content\nconst useAutoHeight = () => {\n const [height, setHeight] = React.useState<number | \"auto\">(\"auto\");\n const ref = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (!ref.current) {\n return;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n\n if (entry) {\n setHeight(entry.contentRect.height);\n }\n });\n\n resizeObserver.observe(ref.current);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n const variants: Variants = React.useMemo(\n () => ({\n collapsed: {\n height: 0,\n opacity: 0,\n transition: motionTransition,\n },\n expanded: {\n height: height === \"auto\" ? \"auto\" : height,\n opacity: 1,\n transition: motionTransition,\n },\n }),\n [height]\n );\n\n return { ref, variants };\n};\n\ninterface StackingCardGroupContextValue {\n expandedValue: string | null;\n onExpandedChange?: (value: string | null) => void;\n onValueChange?: (value: string) => void;\n registerCardRef?: (value: string, element: HTMLElement | null) => void;\n selectedValue: string;\n}\n\nconst StackingCardGroupContext =\n React.createContext<StackingCardGroupContextValue | null>(null);\n\nconst useStackingCardGroup = () => {\n const context = React.useContext(StackingCardGroupContext);\n\n return context;\n};\n\ninterface StackingCardContextValue {\n contentId?: string;\n isCollapsed?: boolean;\n isSelected?: boolean;\n onSelectedChange?: (selected: boolean) => void;\n onToggleCollapse?: () => void;\n selectable?: boolean;\n setHasCollapsibleContent?: (hasCollapsible: boolean) => void;\n}\n\nconst StackingCardContext = React.createContext<StackingCardContextValue>({});\n\nconst useStackingCard = () => {\n const context = React.useContext(StackingCardContext);\n\n return context;\n};\n\ninterface StackingCardProps extends React.HTMLAttributes<HTMLDivElement> {\n \"aria-describedby\"?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n initiallyCollapsed?: boolean;\n onSelectedChange?: (selected: boolean) => void;\n selectable?: boolean;\n selected?: boolean;\n value?: string;\n variant?: \"default\" | \"selected\";\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Complex component with many state interactions\nfunction StackingCard({\n className,\n children,\n selectable = false,\n selected = false,\n onSelectedChange,\n variant,\n onClick,\n value,\n onKeyDown,\n initiallyCollapsed = true,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n \"aria-describedby\": ariaDescribedby,\n ref,\n ...props\n}: StackingCardProps & { ref?: React.Ref<HTMLDivElement> }) {\n const [isCollapsed, setIsCollapsed] = React.useState(true);\n const [hasCollapsibleContent, setHasCollapsibleContent] =\n React.useState(false);\n\n const [wasSelected, setWasSelected] = React.useState(false);\n\n const ignoreInitiallyCollapsedAfterRenderRef = React.useRef(false);\n const timeoutRef = React.useRef<NodeJS.Timeout | null>(null);\n\n // Generate unique ID for this card instance\n const cardId = React.useId();\n const contentId = `${cardId}-content`;\n\n const group = useStackingCardGroup();\n\n // Determine if we're in a group\n const isInGroup = group !== null;\n\n // Determine selection state\n const isSelected = isInGroup\n ? group.selectedValue === value\n : variant === \"selected\" || selected;\n\n // Auto-expand logic: if card becomes selected and has collapsible content, expand it\n // This is calculated during render, not in useEffect\n const justBecameSelected = isSelected && !wasSelected;\n\n if (justBecameSelected && hasCollapsibleContent) {\n if (isInGroup) {\n // In group mode, expand this card\n group?.onExpandedChange?.(value ?? null);\n } else {\n // In standalone mode, expand this card\n setIsCollapsed(false);\n }\n }\n\n // Update wasSelected for next render (this is safe during render)\n if (isSelected !== wasSelected) {\n setWasSelected(isSelected);\n }\n\n // Determine collapse state\n let shouldBeCollapsed = isCollapsed;\n\n if (initiallyCollapsed && !ignoreInitiallyCollapsedAfterRenderRef.current) {\n shouldBeCollapsed = true;\n } else if (isInGroup) {\n shouldBeCollapsed = group.expandedValue !== value;\n }\n\n const ignoreInitiallyCollapsedRef = React.useCallback(() => {\n if (initiallyCollapsed && !ignoreInitiallyCollapsedAfterRenderRef.current) {\n ignoreInitiallyCollapsedAfterRenderRef.current = true;\n }\n }, [initiallyCollapsed]);\n\n const handleSelect = React.useCallback(() => {\n if (selectable) {\n if (isInGroup && value) {\n group?.onValueChange?.(value);\n } else if (!isInGroup && onSelectedChange) {\n onSelectedChange(!selected);\n }\n }\n }, [selectable, isInGroup, value, onSelectedChange, group, selected]);\n\n const handleToggleCollapse = React.useCallback(() => {\n if (isInGroup) {\n // In group mode, toggle between this card and null (all collapsed)\n group?.onExpandedChange?.(\n group.expandedValue === value ? null : (value ?? null)\n );\n } else {\n setIsCollapsed(!isCollapsed);\n }\n }, [isInGroup, group, value, isCollapsed]);\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n // Immediately mark that we're no longer in the initial state\n ignoreInitiallyCollapsedRef();\n\n if (selectable && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n handleSelect();\n }\n\n onKeyDown?.(e);\n },\n [selectable, handleSelect, onKeyDown, ignoreInitiallyCollapsedRef]\n );\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n\n // Immediately mark that we're no longer in the initial state\n ignoreInitiallyCollapsedRef();\n\n handleSelect();\n\n if (isSelected) {\n handleToggleCollapse();\n }\n\n onClick?.(e);\n },\n [\n handleSelect,\n onClick,\n isSelected,\n handleToggleCollapse,\n ignoreInitiallyCollapsedRef,\n ]\n );\n\n const contextValue: StackingCardContextValue = React.useMemo(\n () => ({\n isSelected,\n isCollapsed: shouldBeCollapsed,\n selectable,\n onSelectedChange,\n onToggleCollapse: handleToggleCollapse,\n setHasCollapsibleContent,\n contentId,\n }),\n [\n isSelected,\n shouldBeCollapsed,\n selectable,\n onSelectedChange,\n handleToggleCollapse,\n contentId,\n ]\n );\n\n // Generate accessible label if not provided\n const accessibleLabel = ariaLabel ?? (isInGroup ? `Option ${value}` : \"Card\");\n\n // Compute role separately to avoid nested ternary\n const computeRole = (): \"radio\" | \"button\" | undefined => {\n if (isInGroup) {\n return \"radio\";\n }\n if (selectable) {\n return \"button\";\n }\n return;\n };\n const cardRole = computeRole();\n\n // Combined ref callback that handles both forwarded ref and group registration\n const combinedRef = React.useCallback(\n (element: HTMLDivElement | null) => {\n // Handle forwarded ref\n if (typeof ref === \"function\") {\n ref(element);\n } else if (ref) {\n ref.current = element;\n }\n\n // Register with group if needed\n if (isInGroup && value && group?.registerCardRef) {\n group.registerCardRef(value, element);\n }\n },\n [ref, isInGroup, value, group]\n );\n\n React.useEffect(() => {\n if (initiallyCollapsed && !ignoreInitiallyCollapsedAfterRenderRef.current) {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n ignoreInitiallyCollapsedAfterRenderRef.current = true;\n }, 1500); // delay to allow for rapid re-renders to settle\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [initiallyCollapsed]);\n\n return (\n <StackingCardContext.Provider value={contextValue}>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Role is dynamically assigned based on context */}\n {/* biome-ignore lint/a11y/noNoninteractiveElementInteractions: Interactive behavior with proper role */}\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: aria-checked is valid for radio role */}\n <div\n aria-checked={isInGroup ? isSelected : undefined}\n aria-describedby={ariaDescribedby}\n aria-expanded={hasCollapsibleContent ? !shouldBeCollapsed : undefined}\n aria-label={accessibleLabel}\n aria-labelledby={ariaLabelledby}\n aria-pressed={!isInGroup && selectable ? isSelected : undefined}\n className={cn(\n \"relative flex w-full min-w-64 max-w-96 flex-col overflow-hidden border border-solid\",\n \"rounded-2xl shadow-xs transition-colors\",\n selectable && \"cursor-pointer\",\n isSelected\n ? \"border-gray-950 dark:border-white\"\n : \"border-gray-150 dark:border-gray-800\",\n \"focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2\",\n className\n )}\n key={value}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n ref={combinedRef}\n role={cardRole}\n style={props.style}\n tabIndex={selectable ? 0 : undefined}\n {...props}\n >\n {children}\n </div>\n </StackingCardContext.Provider>\n );\n}\n\ntype StackingCardHeaderProps = React.HTMLAttributes<HTMLDivElement> & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\nfunction StackingCardHeader({\n className,\n children,\n ref,\n ...props\n}: StackingCardHeaderProps) {\n const { selectable, isSelected } = useStackingCard();\n\n return (\n <div\n className={cn(\n \"flex items-center justify-between gap-2 px-6 pt-4 pb-1\",\n isSelected && \"bg-gray-100 dark:bg-gray-800\",\n className\n )}\n ref={ref}\n {...props}\n >\n <div className=\"flex flex-1 items-center gap-2\">\n {selectable && (\n <DummyCheckbox checked={isSelected} tabIndex={-1} variant=\"rounded\" />\n )}\n {children}\n </div>\n </div>\n );\n}\n\ntype StackingCardTitleProps = React.HTMLAttributes<HTMLDivElement> & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\nfunction StackingCardTitle({\n className,\n ref,\n ...props\n}: StackingCardTitleProps) {\n return (\n <Text\n className={cn(\n \"font-sans font-semibold text-gray-950 text-sm leading-6 dark:text-white\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n}\n\ntype StackingCardDescriptionProps = React.HTMLAttributes<HTMLDivElement> & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\nfunction StackingCardDescription({\n className,\n ref,\n ...props\n}: StackingCardDescriptionProps) {\n return (\n <Text\n className={cn(\"text-gray-700 text-sm dark:text-gray-200\", className)}\n ref={ref}\n {...props}\n />\n );\n}\n\nconst MotionChevron = ({ isCollapsed }: { isCollapsed: boolean }) => (\n <motion.div\n animate={isCollapsed ? \"collapsed\" : \"expanded\"}\n className=\"flex items-center justify-center\"\n initial=\"collapsed\"\n variants={motionVariantsChevron}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </motion.div>\n);\n\ninterface StackingCardContentProps\n extends React.HTMLAttributes<HTMLDivElement> {\n collapsible?: boolean;\n description?: React.ReactNode;\n minimal?: boolean;\n ref?: React.Ref<HTMLDivElement>;\n}\n\nfunction StackingCardContent({\n className,\n children,\n collapsible = false,\n minimal = false,\n description,\n ref,\n ...props\n}: StackingCardContentProps) {\n const {\n isCollapsed,\n isSelected,\n onToggleCollapse,\n setHasCollapsibleContent,\n contentId,\n } = useStackingCard();\n\n const { ref: autoHeightRef, variants: autoHeightVariants } = useAutoHeight();\n\n // Register this component as having collapsible content\n React.useEffect(() => {\n if (collapsible) {\n setHasCollapsibleContent?.(true);\n }\n\n return () => {\n setHasCollapsibleContent?.(false);\n };\n }, [collapsible, setHasCollapsibleContent]);\n\n if (!collapsible) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-1.5 px-6 pt-0 pb-4\",\n isSelected && \"bg-gray-100 dark:bg-gray-800\",\n className\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n return (\n <>\n <div\n className={cn(\n \"flex items-center justify-between gap-2 px-6 pb-4\",\n isSelected && \"bg-gray-100 dark:bg-gray-800\"\n )}\n >\n {description ? (\n <div className=\"flex-1\">{description}</div>\n ) : (\n <div aria-hidden className=\"flex-1\" />\n )}\n <Button\n aria-controls={contentId}\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? \"Show details\" : \"Hide details\"}\n borderRadius=\"full\"\n className={cn(isSelected && \"bg-white dark:bg-gray-900\", \"h-3\")}\n onClick={(e) => {\n e.stopPropagation();\n onToggleCollapse?.();\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.stopPropagation();\n }\n }}\n size=\"xs\"\n variant=\"light\"\n >\n <span className={cn({ \"sr-only\": minimal })}>Details</span>\n <MotionChevron isCollapsed={isCollapsed ?? false} />\n </Button>\n </div>\n <motion.div\n animate={isCollapsed ? \"collapsed\" : \"expanded\"}\n aria-hidden={isCollapsed}\n className=\"overflow-hidden\"\n id={contentId}\n initial=\"collapsed\"\n variants={autoHeightVariants}\n >\n <div className=\"flex flex-col\" ref={autoHeightRef}>\n <Separator\n className={cn(\n \"mt-0 mb-0\",\n isSelected\n ? \"bg-gray-950 dark:bg-white\"\n : \"border-gray-150 dark:border-gray-800\"\n )}\n />\n <div\n className={cn(\"flex flex-col gap-1.5\", className)}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n </div>\n </motion.div>\n </>\n );\n}\n\nfunction StackingCardList({\n className,\n children,\n ref,\n ...props\n}: ListProps & { ref?: React.Ref<HTMLUListElement | HTMLOListElement> }) {\n return (\n <List\n className={cn(\"list-none px-6 pt-3 pb-5\", className)}\n ref={ref}\n {...props}\n >\n {children}\n </List>\n );\n}\n\nconst StackingCardCheck = React.memo<LucideProps>(({ className, ...props }) => {\n const { selectable, isSelected } = useStackingCard();\n\n return (\n <Check\n className={cn(\n \"-mt-0.5 size-[14px]\",\n {\n \"text-current\": !selectable,\n \"text-brand-primary\": isSelected && selectable,\n \"text-gray-950 dark:text-white\": !isSelected && selectable,\n },\n className\n )}\n {...props}\n />\n );\n});\n\nStackingCardCheck.displayName = \"StackingCardCheck\";\n\nfunction StackingCardListItem({\n className,\n children,\n ref,\n ...props\n}: ListItemProps & { ref?: React.Ref<HTMLLIElement> }) {\n return (\n <ListItem\n className={cn(\n \"flex font-sans text-gray-700 text-sm first:mt-0 dark:text-gray-200\",\n className\n )}\n customBullet={<StackingCardCheck />}\n ref={ref}\n {...props}\n >\n {children}\n </ListItem>\n );\n}\n\ninterface StackingCardGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n ref?: React.Ref<HTMLDivElement>;\n value?: string;\n}\n\nfunction StackingCardGroup({\n className,\n children,\n value,\n onValueChange,\n defaultValue,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n ref,\n ...props\n}: StackingCardGroupProps) {\n const [internalSelectedValue, setInternalSelectedValue] = React.useState(\n defaultValue ?? \"\"\n );\n\n const [internalExpandedValue, setInternalExpandedValue] = React.useState<\n string | null\n >(defaultValue ?? null);\n\n // For controlled mode, we need to manage expansion state separately\n const [controlledExpandedValue, setControlledExpandedValue] = React.useState<\n string | null\n >(value ?? null);\n\n // Calculate effective values during render (controlled vs uncontrolled pattern)\n const effectiveSelectedValue =\n value === undefined ? internalSelectedValue : value;\n\n const effectiveExpandedValue =\n value === undefined ? internalExpandedValue : controlledExpandedValue;\n\n // Auto-expand selected card in controlled mode\n React.useEffect(() => {\n if (value !== undefined) {\n setControlledExpandedValue(value);\n }\n }, [value]);\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n // Only update internal state if uncontrolled\n if (value === undefined) {\n setInternalSelectedValue(newValue);\n setInternalExpandedValue(newValue);\n } else {\n // In controlled mode, auto-expand the newly selected card\n setControlledExpandedValue(newValue);\n }\n\n onValueChange?.(newValue);\n },\n [value, onValueChange]\n );\n\n const handleExpandedChange = React.useCallback(\n (newExpandedValue: string | null) => {\n if (value === undefined) {\n // Uncontrolled mode\n setInternalExpandedValue(newExpandedValue);\n } else {\n // Controlled mode\n setControlledExpandedValue(newExpandedValue);\n }\n },\n [value]\n );\n\n // Extract card values from children for arrow key navigation\n const cardValues = React.useMemo(() => {\n const values: string[] = [];\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const childValue = (child.props as { value?: unknown }).value;\n\n if (typeof childValue === \"string\") {\n values.push(childValue);\n }\n }\n });\n\n return values;\n }, [children]);\n\n // Store card refs for navigation\n const cardRefsRef = React.useRef<Map<string, HTMLElement>>(new Map());\n\n const registerCardRef = React.useCallback(\n (cardValue: string, element: HTMLElement | null) => {\n if (element) {\n cardRefsRef.current.set(cardValue, element);\n } else {\n cardRefsRef.current.delete(cardValue);\n }\n },\n []\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (cardValues.length === 0) {\n return;\n }\n\n const currentIndex = cardValues.indexOf(effectiveSelectedValue);\n let nextIndex = currentIndex;\n\n switch (e.key) {\n case \"ArrowDown\":\n case \"ArrowRight\":\n e.preventDefault();\n nextIndex =\n currentIndex < cardValues.length - 1 ? currentIndex + 1 : 0;\n break;\n case \"ArrowUp\":\n case \"ArrowLeft\":\n e.preventDefault();\n nextIndex =\n currentIndex > 0 ? currentIndex - 1 : cardValues.length - 1;\n break;\n case \"Home\":\n e.preventDefault();\n nextIndex = 0;\n break;\n case \"End\":\n e.preventDefault();\n nextIndex = cardValues.length - 1;\n break;\n default:\n return;\n }\n\n const nextValue = cardValues[nextIndex];\n\n if (nextValue && nextValue !== effectiveSelectedValue) {\n handleValueChange(nextValue);\n\n // Focus the newly selected card using registered ref\n setTimeout(() => {\n const targetCard = cardRefsRef.current.get(nextValue);\n\n targetCard?.focus();\n }, 0);\n }\n },\n [cardValues, effectiveSelectedValue, handleValueChange]\n );\n\n const contextValue: StackingCardGroupContextValue = React.useMemo(\n () => ({\n selectedValue: effectiveSelectedValue,\n expandedValue: effectiveExpandedValue,\n onValueChange: handleValueChange,\n onExpandedChange: handleExpandedChange,\n registerCardRef,\n }),\n [\n effectiveSelectedValue,\n effectiveExpandedValue,\n handleValueChange,\n handleExpandedChange,\n registerCardRef,\n ]\n );\n\n // Generate accessible label if not provided\n const accessibleLabel = ariaLabel ?? \"Select an option\";\n\n return (\n <StackingCardGroupContext.Provider value={contextValue}>\n <div\n aria-label={accessibleLabel}\n aria-labelledby={ariaLabelledby}\n className={cn(\"flex flex-col gap-4\", className)}\n onKeyDown={handleKeyDown}\n ref={ref}\n role=\"radiogroup\"\n tabIndex={-1}\n {...props}\n >\n {children}\n </div>\n </StackingCardGroupContext.Provider>\n );\n}\n\nexport {\n StackingCard,\n StackingCardCheck,\n StackingCardContent,\n StackingCardDescription,\n StackingCardGroup,\n StackingCardHeader,\n StackingCardList,\n StackingCardListItem,\n StackingCardTitle,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module Tabs
|
|
3
|
+
*
|
|
4
|
+
* Tabbed interface for switching between content panels. Built on Radix UI Tabs primitive.
|
|
5
|
+
*
|
|
6
|
+
* @see {@link https://ui.shadcn.com/docs/components/tabs Shadcn Tabs}
|
|
7
|
+
* @see {@link https://www.radix-ui.com/primitives/docs/components/tabs Radix Tabs}
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // Basic tabs
|
|
11
|
+
* <Tabs defaultValue="tab1">
|
|
12
|
+
* <TabsList>
|
|
13
|
+
* <TabsTrigger value="tab1">Tab 1</TabsTrigger>
|
|
14
|
+
* <TabsTrigger value="tab2">Tab 2</TabsTrigger>
|
|
15
|
+
* </TabsList>
|
|
16
|
+
* <TabsContent value="tab1">Content 1</TabsContent>
|
|
17
|
+
* <TabsContent value="tab2">Content 2</TabsContent>
|
|
18
|
+
* </Tabs>
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Controlled tabs
|
|
22
|
+
* const [activeTab, setActiveTab] = useState("settings");
|
|
23
|
+
*
|
|
24
|
+
* <Tabs value={activeTab} onValueChange={setActiveTab}>
|
|
25
|
+
* ...
|
|
26
|
+
* </Tabs>
|
|
27
|
+
*/
|
|
28
|
+
import { Tabs as TabsPrimitive } from "radix-ui";
|
|
29
|
+
import type * as React from "react";
|
|
30
|
+
import type { Ref } from "react";
|
|
31
|
+
/** Root component that manages tab selection state. */
|
|
32
|
+
declare const Tabs: React.ForwardRefExoticComponent<TabsPrimitive.TabsProps & React.RefAttributes<HTMLDivElement>>;
|
|
33
|
+
/** Container for tab trigger buttons. */
|
|
34
|
+
declare const TabsList: ({ className, ref, ...props }: React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> & {
|
|
35
|
+
ref?: Ref<React.ElementRef<typeof TabsPrimitive.List>>;
|
|
36
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
/** Button that activates its associated tab content. */
|
|
38
|
+
declare const TabsTrigger: ({ className, ref, ...props }: React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> & {
|
|
39
|
+
ref?: Ref<React.ElementRef<typeof TabsPrimitive.Trigger>>;
|
|
40
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
/** Content panel shown when its associated tab is active. */
|
|
42
|
+
declare const TabsContent: ({ className, ref, ...props }: React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content> & {
|
|
43
|
+
ref?: Ref<React.ElementRef<typeof TabsPrimitive.Content>>;
|
|
44
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
export { Tabs, TabsContent, TabsList, TabsTrigger };
|
|
46
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/components/tabs.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIjC,uDAAuD;AACvD,QAAA,MAAM,IAAI,gGAAqB,CAAC;AAEhC,yCAAyC;AACzC,QAAA,MAAM,QAAQ,GAAI,8BAIf,KAAK,CAAC,wBAAwB,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG;IAC7D,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;CACxD,4CASA,CAAC;AAEF,wDAAwD;AACxD,QAAA,MAAM,WAAW,GAAI,8BAIlB,KAAK,CAAC,wBAAwB,CAAC,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG;IAChE,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;CAC3D,4CASA,CAAC;AAEF,6DAA6D;AAC7D,QAAA,MAAM,WAAW,GAAI,8BAIlB,KAAK,CAAC,wBAAwB,CAAC,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG;IAChE,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;CAC3D,4CASA,CAAC;AAEF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/components/tabs.js
CHANGED
|
@@ -25,7 +25,7 @@ const TabsTrigger = ({
|
|
|
25
25
|
TabsPrimitive.Trigger,
|
|
26
26
|
{
|
|
27
27
|
className: cn(
|
|
28
|
-
"inline-flex items-center justify-center whitespace-nowrap rounded-
|
|
28
|
+
"inline-flex items-center justify-center whitespace-nowrap rounded-xs px-3 py-1.5 font-semibold text-sm ring-offset-gray-100 transition-all focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-white data-[state=active]:text-gray-950 data-[state=active]:shadow-xs dark:ring-offset-gray-900 dark:data-[state=active]:bg-gray-800 dark:data-[state=active]:text-gray-50 dark:focus-visible:ring-[var(--focus-ring)]",
|
|
29
29
|
className
|
|
30
30
|
),
|
|
31
31
|
ref,
|
|
@@ -40,7 +40,7 @@ const TabsContent = ({
|
|
|
40
40
|
TabsPrimitive.Content,
|
|
41
41
|
{
|
|
42
42
|
className: cn(
|
|
43
|
-
"mt-2 ring-offset-gray-100 focus-visible:outline-
|
|
43
|
+
"mt-2 ring-offset-gray-100 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 dark:ring-offset-gray-900 dark:focus-visible:ring-[var(--focus-ring)]",
|
|
44
44
|
className
|
|
45
45
|
),
|
|
46
46
|
ref,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/tabs.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * @module Tabs\n *\n * Tabbed interface for switching between content panels. Built on Radix UI Tabs primitive.\n *\n * @see {@link https://ui.shadcn.com/docs/components/tabs Shadcn Tabs}\n * @see {@link https://www.radix-ui.com/primitives/docs/components/tabs Radix Tabs}\n *\n * @example\n * // Basic tabs\n * <Tabs defaultValue=\"tab1\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n *\n * @example\n * // Controlled tabs\n * const [activeTab, setActiveTab] = useState(\"settings\");\n *\n * <Tabs value={activeTab} onValueChange={setActiveTab}>\n * ...\n * </Tabs>\n */\nimport { Tabs as TabsPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport type { Ref } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/** Root component that manages tab selection state. */\nconst Tabs = TabsPrimitive.Root;\n\n/** Container for tab trigger buttons. */\nconst TabsList = ({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> & {\n ref?: Ref<React.ElementRef<typeof TabsPrimitive.List>>;\n}) => (\n <TabsPrimitive.List\n className={cn(\n \"inline-flex h-10 items-center justify-center rounded-md bg-gray-100 p-1 text-gray-900 dark:bg-gray-900 dark:text-gray-100\",\n className\n )}\n ref={ref}\n {...props}\n />\n);\n\n/** Button that activates its associated tab content. */\nconst TabsTrigger = ({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> & {\n ref?: Ref<React.ElementRef<typeof TabsPrimitive.Trigger>>;\n}) => (\n <TabsPrimitive.Trigger\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-
|
|
4
|
+
"sourcesContent": ["/**\n * @module Tabs\n *\n * Tabbed interface for switching between content panels. Built on Radix UI Tabs primitive.\n *\n * @see {@link https://ui.shadcn.com/docs/components/tabs Shadcn Tabs}\n * @see {@link https://www.radix-ui.com/primitives/docs/components/tabs Radix Tabs}\n *\n * @example\n * // Basic tabs\n * <Tabs defaultValue=\"tab1\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n *\n * @example\n * // Controlled tabs\n * const [activeTab, setActiveTab] = useState(\"settings\");\n *\n * <Tabs value={activeTab} onValueChange={setActiveTab}>\n * ...\n * </Tabs>\n */\nimport { Tabs as TabsPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport type { Ref } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/** Root component that manages tab selection state. */\nconst Tabs = TabsPrimitive.Root;\n\n/** Container for tab trigger buttons. */\nconst TabsList = ({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> & {\n ref?: Ref<React.ElementRef<typeof TabsPrimitive.List>>;\n}) => (\n <TabsPrimitive.List\n className={cn(\n \"inline-flex h-10 items-center justify-center rounded-md bg-gray-100 p-1 text-gray-900 dark:bg-gray-900 dark:text-gray-100\",\n className\n )}\n ref={ref}\n {...props}\n />\n);\n\n/** Button that activates its associated tab content. */\nconst TabsTrigger = ({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> & {\n ref?: Ref<React.ElementRef<typeof TabsPrimitive.Trigger>>;\n}) => (\n <TabsPrimitive.Trigger\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-xs px-3 py-1.5 font-semibold text-sm ring-offset-gray-100 transition-all focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-white data-[state=active]:text-gray-950 data-[state=active]:shadow-xs dark:ring-offset-gray-900 dark:data-[state=active]:bg-gray-800 dark:data-[state=active]:text-gray-50 dark:focus-visible:ring-[var(--focus-ring)]\",\n className\n )}\n ref={ref}\n {...props}\n />\n);\n\n/** Content panel shown when its associated tab is active. */\nconst TabsContent = ({\n className,\n ref,\n ...props\n}: React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content> & {\n ref?: Ref<React.ElementRef<typeof TabsPrimitive.Content>>;\n}) => (\n <TabsPrimitive.Content\n className={cn(\n \"mt-2 ring-offset-gray-100 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 dark:ring-offset-gray-900 dark:focus-visible:ring-[var(--focus-ring)]\",\n className\n )}\n ref={ref}\n {...props}\n />\n);\n\nexport { Tabs, TabsContent, TabsList, TabsTrigger };\n"],
|
|
5
5
|
"mappings": "AA4CE;AAjBF,SAAS,QAAQ,qBAAqB;AAItC,SAAS,UAAU;AAGnB,MAAM,OAAO,cAAc;AAG3B,MAAM,WAAW,CAAC;AAAA,EAChB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAGE;AAAA,EAAC,cAAc;AAAA,EAAd;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACC,GAAG;AAAA;AACN;AAIF,MAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAGE;AAAA,EAAC,cAAc;AAAA,EAAd;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACC,GAAG;AAAA;AACN;AAIF,MAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAGE;AAAA,EAAC,cAAc;AAAA,EAAd;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACC,GAAG;AAAA;AACN;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module Textarea
|
|
3
|
+
*
|
|
4
|
+
* Multi-line text input field. Inherits styling from Input component.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* // Basic textarea
|
|
8
|
+
* <Textarea placeholder="Enter description..." />
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // Resizable textarea
|
|
12
|
+
* <Textarea resize="vertical" />
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Small size
|
|
16
|
+
* <Textarea size="sm" rows={3} />
|
|
17
|
+
*/
|
|
18
|
+
import { type VariantProps } from "class-variance-authority";
|
|
19
|
+
import type { Ref } from "react";
|
|
20
|
+
declare const textareaVariants: (props?: ({
|
|
21
|
+
size?: "sm" | "default" | null | undefined;
|
|
22
|
+
resize?: "none" | "horizontal" | "vertical" | "both" | null | undefined;
|
|
23
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
24
|
+
/**
|
|
25
|
+
* Props for Textarea component.
|
|
26
|
+
* @property size - Input size: `"default"` or `"sm"`
|
|
27
|
+
* @property resize - Resize behavior: `"none"` (default), `"vertical"`, `"horizontal"`, or `"both"`
|
|
28
|
+
*/
|
|
29
|
+
export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement>, VariantProps<typeof textareaVariants> {
|
|
30
|
+
ref?: Ref<HTMLTextAreaElement>;
|
|
31
|
+
}
|
|
32
|
+
declare const Textarea: ({ className, resize, size, ref, ...props }: TextareaProps) => import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
export { Textarea, textareaVariants };
|
|
34
|
+
//# sourceMappingURL=textarea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea.d.ts","sourceRoot":"","sources":["../../src/components/textarea.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAKjC,QAAA,MAAM,gBAAgB;;;8EAoBrB,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,aACf,SAAQ,KAAK,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EACvD,YAAY,CAAC,OAAO,gBAAgB,CAAC;IACvC,GAAG,CAAC,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;CAChC;AAED,QAAA,MAAM,QAAQ,GAAI,4CAMf,aAAa,4CAMf,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC"}
|