@cl-light-ds/ui 0.1.0 → 0.2.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 +45 -45
- package/package.json +1 -1
- package/src/components/accordion/Accordion.astro +248 -248
- package/src/components/accordion/AccordionContent.astro +26 -26
- package/src/components/accordion/AccordionItem.astro +36 -36
- package/src/components/accordion/AccordionTrigger.astro +118 -118
- package/src/components/alert/Alert.astro +167 -167
- package/src/components/alert/AlertDescription.astro +24 -24
- package/src/components/alert/AlertTitle.astro +24 -24
- package/src/components/avatar/Avatar.astro +197 -197
- package/src/components/avatar/AvatarBadge.astro +44 -44
- package/src/components/avatar/AvatarFallback.astro +26 -26
- package/src/components/avatar/AvatarGroup.astro +26 -26
- package/src/components/avatar/AvatarGroupCount.astro +30 -30
- package/src/components/avatar/AvatarImage.astro +46 -46
- package/src/components/badge/Badge.astro +167 -167
- package/src/components/breadcrumb/Breadcrumb.astro +76 -76
- package/src/components/breadcrumb/BreadcrumbItem.astro +32 -32
- package/src/components/breadcrumb/BreadcrumbList.astro +26 -26
- package/src/components/breadcrumb/BreadcrumbSeparator.astro +26 -26
- package/src/components/button/Button.astro +233 -233
- package/src/components/button-group/ButtonGroup.astro +130 -130
- package/src/components/button-group/ButtonGroupSeparator.astro +30 -30
- package/src/components/button-group/ButtonGroupText.astro +21 -21
- package/src/components/card/Card.astro +182 -182
- package/src/components/card/CardAction.astro +26 -26
- package/src/components/card/CardContent.astro +28 -28
- package/src/components/card/CardDescription.astro +28 -28
- package/src/components/card/CardFooter.astro +24 -24
- package/src/components/card/CardHeader.astro +30 -30
- package/src/components/card/CardMedia.astro +27 -27
- package/src/components/card/CardOverlay.astro +32 -32
- package/src/components/card/CardTitle.astro +21 -21
- package/src/components/carousel/Carousel.astro +106 -106
- package/src/components/carousel/CarouselSlide.astro +22 -22
- package/src/components/checkbox/Checkbox.astro +159 -159
- package/src/components/collapsible/Collapsible.astro +202 -202
- package/src/components/collapsible/CollapsibleContent.astro +36 -36
- package/src/components/collapsible/CollapsibleTrigger.astro +34 -34
- package/src/components/combobox/Combobox.astro +365 -365
- package/src/components/combobox/ComboboxContent.astro +37 -37
- package/src/components/combobox/ComboboxEmpty.astro +18 -18
- package/src/components/combobox/ComboboxGroup.astro +19 -19
- package/src/components/combobox/ComboboxInput.astro +74 -74
- package/src/components/combobox/ComboboxItem.astro +39 -39
- package/src/components/combobox/ComboboxLabel.astro +18 -18
- package/src/components/combobox/ComboboxList.astro +21 -21
- package/src/components/combobox/ComboboxSeparator.astro +17 -17
- package/src/components/combobox/ComboboxTrigger.astro +30 -30
- package/src/components/combobox/ComboboxValue.astro +22 -22
- package/src/components/date/Date.astro +137 -137
- package/src/components/dialog/Dialog.astro +196 -196
- package/src/components/dialog/DialogClose.astro +23 -23
- package/src/components/dialog/DialogContent.astro +42 -42
- package/src/components/dialog/DialogDescription.astro +18 -18
- package/src/components/dialog/DialogFooter.astro +18 -18
- package/src/components/dialog/DialogHeader.astro +18 -18
- package/src/components/dialog/DialogOverlay.astro +19 -19
- package/src/components/dialog/DialogTitle.astro +18 -18
- package/src/components/dialog/DialogTrigger.astro +37 -37
- package/src/components/dropdown-menu/DropdownMenu.astro +226 -226
- package/src/components/dropdown-menu/DropdownMenuCheckboxItem.astro +114 -114
- package/src/components/dropdown-menu/DropdownMenuContent.astro +42 -42
- package/src/components/dropdown-menu/DropdownMenuGroup.astro +19 -19
- package/src/components/dropdown-menu/DropdownMenuItem.astro +220 -220
- package/src/components/dropdown-menu/DropdownMenuLabel.astro +20 -20
- package/src/components/dropdown-menu/DropdownMenuRadioItem.astro +101 -101
- package/src/components/dropdown-menu/DropdownMenuSeparator.astro +18 -18
- package/src/components/dropdown-menu/DropdownMenuShortcut.astro +18 -18
- package/src/components/dropdown-menu/DropdownMenuTrigger.astro +49 -49
- package/src/components/field/Field.astro +664 -664
- package/src/components/field/FieldContent.astro +20 -20
- package/src/components/field/FieldDescription.astro +22 -22
- package/src/components/field/FieldError.astro +51 -51
- package/src/components/field/FieldGroup.astro +20 -20
- package/src/components/field/FieldLabel.astro +22 -22
- package/src/components/field/FieldLegend.astro +23 -23
- package/src/components/field/FieldSeparator.astro +30 -30
- package/src/components/field/FieldSet.astro +20 -20
- package/src/components/field/FieldTitle.astro +20 -20
- package/src/components/hover-card/HoverCard.astro +235 -235
- package/src/components/hover-card/HoverCardContent.astro +54 -54
- package/src/components/hover-card/HoverCardTrigger.astro +38 -38
- package/src/components/input/Input.astro +130 -130
- package/src/components/input-group/InputGroup.astro +135 -135
- package/src/components/input-group/InputGroupAddon.astro +49 -49
- package/src/components/input-group/InputGroupButton.astro +58 -58
- package/src/components/input-group/InputGroupInput.astro +18 -18
- package/src/components/input-group/InputGroupText.astro +21 -21
- package/src/components/input-group/InputGroupTextarea.astro +17 -17
- package/src/components/item/Item.astro +122 -122
- package/src/components/item/ItemActions.astro +21 -21
- package/src/components/item/ItemContent.astro +25 -25
- package/src/components/item/ItemDescription.astro +25 -25
- package/src/components/item/ItemFooter.astro +24 -24
- package/src/components/item/ItemGroup.astro +24 -24
- package/src/components/item/ItemHeader.astro +24 -24
- package/src/components/item/ItemMedia.astro +47 -47
- package/src/components/item/ItemSeparator.astro +21 -21
- package/src/components/item/ItemTitle.astro +25 -25
- package/src/components/kbd/Kbd.astro +145 -145
- package/src/components/kbd/KbdGroup.astro +55 -55
- package/src/components/label/Label.astro +97 -97
- package/src/components/link-group/LinkGroup.astro +67 -67
- package/src/components/link-group/LinkGroupItem.astro +32 -32
- package/src/components/link-group/LinkGroupList.astro +25 -25
- package/src/components/link-group/LinkGroupTitle.astro +22 -22
- package/src/components/marquee/Marquee.astro +119 -119
- package/src/components/native-select/NativeSelect.astro +125 -125
- package/src/components/native-select/NativeSelectOptGroup.astro +14 -14
- package/src/components/navigation-menu/NavigationMenu.astro +414 -414
- package/src/components/navigation-menu/NavigationMenuContent.astro +37 -37
- package/src/components/navigation-menu/NavigationMenuIndicator.astro +24 -24
- package/src/components/navigation-menu/NavigationMenuItem.astro +22 -22
- package/src/components/navigation-menu/NavigationMenuLink.astro +18 -18
- package/src/components/navigation-menu/NavigationMenuList.astro +21 -21
- package/src/components/navigation-menu/NavigationMenuPositioner.astro +44 -44
- package/src/components/navigation-menu/NavigationMenuTrigger.astro +30 -30
- package/src/components/navigation-menu/NavigationMenuViewport.astro +19 -19
- package/src/components/popover/CHANGELOG.md +17 -2
- package/src/components/popover/Popover.astro +211 -210
- package/src/components/popover/PopoverClose.astro +18 -18
- package/src/components/popover/PopoverContent.astro +50 -49
- package/src/components/popover/PopoverDescription.astro +18 -18
- package/src/components/popover/PopoverHeader.astro +18 -18
- package/src/components/popover/PopoverTitle.astro +18 -18
- package/src/components/popover/PopoverTrigger.astro +35 -29
- package/src/components/radio-group/CHANGELOG.md +23 -1
- package/src/components/radio-group/RadioGroup.astro +81 -81
- package/src/components/radio-group/RadioGroupItem.astro +51 -42
- package/src/components/select/Select.astro +373 -373
- package/src/components/select/SelectContent.astro +91 -91
- package/src/components/select/SelectGroup.astro +19 -19
- package/src/components/select/SelectItem.astro +48 -48
- package/src/components/select/SelectLabel.astro +18 -18
- package/src/components/select/SelectSeparator.astro +17 -17
- package/src/components/select/SelectTrigger.astro +34 -34
- package/src/components/select/SelectValue.astro +22 -22
- package/src/components/separator/Separator.astro +60 -60
- package/src/components/skeleton/Skeleton.astro +121 -121
- package/src/components/slider/Slider.astro +198 -198
- package/src/components/spinner/CHANGELOG.md +14 -1
- package/src/components/spinner/Spinner.astro +135 -134
- package/src/components/sticky-surface/StickySurface.astro +152 -152
- package/src/components/switch/CHANGELOG.md +20 -0
- package/src/components/switch/Switch.astro +106 -106
- package/src/components/table/CHANGELOG.md +21 -2
- package/src/components/table/Table.astro +251 -250
- package/src/components/table/TableBody.astro +18 -18
- package/src/components/table/TableCaption.astro +17 -17
- package/src/components/table/TableCell.astro +21 -21
- package/src/components/table/TableFooter.astro +21 -21
- package/src/components/table/TableHead.astro +21 -21
- package/src/components/table/TableHeader.astro +17 -17
- package/src/components/table/TableRow.astro +21 -21
- package/src/components/tabs/Tabs.astro +306 -306
- package/src/components/tabs/TabsContent.astro +47 -47
- package/src/components/tabs/TabsList.astro +69 -69
- package/src/components/tabs/TabsTrigger.astro +40 -40
- package/src/components/textarea/CHANGELOG.md +18 -1
- package/src/components/textarea/Textarea.astro +58 -36
- package/src/components/toggle/CHANGELOG.md +19 -1
- package/src/components/toggle/Toggle.astro +150 -138
- package/src/components/toggle-group/CHANGELOG.md +14 -1
- package/src/components/toggle-group/ToggleGroup.astro +236 -224
- package/src/components/toggle-group/ToggleGroupItem.astro +48 -48
- package/src/components/tooltip/CHANGELOG.md +19 -2
- package/src/components/tooltip/Tooltip.astro +357 -331
- package/src/components/tooltip/TooltipContent.astro +85 -60
- package/src/components/tooltip/TooltipTrigger.astro +34 -34
- package/src/lib/toggle-shared.ts +3 -2
|
@@ -1,182 +1,182 @@
|
|
|
1
|
-
---
|
|
2
|
-
/**
|
|
3
|
-
* @component Card
|
|
4
|
-
* @title Card
|
|
5
|
-
* @description UI container for grouping content with header, footer, etc.
|
|
6
|
-
* @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=54-1310
|
|
7
|
-
* @preview
|
|
8
|
-
*
|
|
9
|
-
* <Card class="w-full max-w-sm">
|
|
10
|
-
* <CardMedia>
|
|
11
|
-
* <img src="/mount-fuji.png" alt="Mount Fuji at sunset" width="374" height="250" loading="lazy" />
|
|
12
|
-
* </CardMedia>
|
|
13
|
-
* <CardHeader>
|
|
14
|
-
* <div class="flex items-center gap-2 justify-between">
|
|
15
|
-
* <div class="*:data-[slot=avatar]:ring-background flex -space-x-2 *:data-[slot=avatar]:ring-2">
|
|
16
|
-
* <Avatar>
|
|
17
|
-
* <AvatarImage>
|
|
18
|
-
* <img src="https://gradient.bejamas.com/presets/bejamas/marine.png" alt="grdient avatar" />
|
|
19
|
-
* </AvatarImage>
|
|
20
|
-
* <AvatarFallback>AW</AvatarFallback>
|
|
21
|
-
* </Avatar>
|
|
22
|
-
* </div>
|
|
23
|
-
* <Date date="2025-08-24T12:00:00Z" class="text-sm text-muted-foreground" />
|
|
24
|
-
* </div>
|
|
25
|
-
* </CardHeader>
|
|
26
|
-
* <CardContent>
|
|
27
|
-
* <div class="flex flex-col gap-6 group-data-[size=large]/card:gap-3">
|
|
28
|
-
* <CardTitle>Strong Foundations, Built to Scale</CardTitle>
|
|
29
|
-
* <CardDescription>Like any enduring system, a scalable design system relies on clear structure, solid foundations, and careful layering over time.</CardDescription>
|
|
30
|
-
* </div>
|
|
31
|
-
* <Button variant="outline" as="a" href="#">Read more</Button>
|
|
32
|
-
* </CardContent>
|
|
33
|
-
* <Separator />
|
|
34
|
-
* <CardFooter>
|
|
35
|
-
* <p class="text-sm text-muted-foreground">Categories</p>
|
|
36
|
-
* <div class="flex items-center gap-1">
|
|
37
|
-
* <Badge variant="secondary" shape="sharp">Marketing</Badge>
|
|
38
|
-
* <Badge variant="secondary" shape="sharp">UI Design</Badge>
|
|
39
|
-
* </div>
|
|
40
|
-
* </CardFooter>
|
|
41
|
-
* </Card>
|
|
42
|
-
*
|
|
43
|
-
* @usage
|
|
44
|
-
*
|
|
45
|
-
* ```astro nocollapse
|
|
46
|
-
* ---
|
|
47
|
-
* import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@bejamas/ui/components/card';
|
|
48
|
-
* import { Separator } from '@bejamas/ui/components/separator';
|
|
49
|
-
* ---
|
|
50
|
-
*
|
|
51
|
-
* <Card>
|
|
52
|
-
* <CardHeader>
|
|
53
|
-
* <CardTitle>Card Title</CardTitle>
|
|
54
|
-
* <CardDescription>Card Description</CardDescription>
|
|
55
|
-
* </CardHeader>
|
|
56
|
-
* <CardContent>
|
|
57
|
-
* Card content goes here.
|
|
58
|
-
* </CardContent>
|
|
59
|
-
* <Separator />
|
|
60
|
-
* <CardFooter>
|
|
61
|
-
* <button>OK</button>
|
|
62
|
-
* </CardFooter>
|
|
63
|
-
* </Card>
|
|
64
|
-
* ```
|
|
65
|
-
*
|
|
66
|
-
* @examples
|
|
67
|
-
*
|
|
68
|
-
* ### Sizes
|
|
69
|
-
*
|
|
70
|
-
* Use `size="default"` (compact, the default) or `size="large"` for more generous padding and larger title/description text.
|
|
71
|
-
*
|
|
72
|
-
* <Card size="large">...</Card>
|
|
73
|
-
*
|
|
74
|
-
* ### Ghost
|
|
75
|
-
*
|
|
76
|
-
* `variant="ghost"` removes the card's border, background, and shadow — useful for embedding a card's content inline without visual chrome. Ghost also supports `orientation="horizontal"` for a side-by-side media + content layout.
|
|
77
|
-
*
|
|
78
|
-
* <Card variant="ghost" orientation="horizontal">...</Card>
|
|
79
|
-
*
|
|
80
|
-
* ### Overlay
|
|
81
|
-
*
|
|
82
|
-
* `variant="overlay"` renders `<CardMedia>` as a full-bleed background behind the card's content — no separate prop is needed on `CardMedia` itself, `Card` handles the positioning. Pair with `text-primary-foreground` content since it always sits on a photo.
|
|
83
|
-
*
|
|
84
|
-
* <Card variant="overlay">...</Card>
|
|
85
|
-
*
|
|
86
|
-
* ### As a link
|
|
87
|
-
*
|
|
88
|
-
* Pass `as="a"` (with `href`) to render the whole card as a real, natively focusable anchor — this is how to make Figma's Focus state reachable via keyboard, since a plain `<div>` can't receive `:focus-visible`.
|
|
89
|
-
*
|
|
90
|
-
* <Card as="a" href="#">...</Card>
|
|
91
|
-
*/
|
|
92
|
-
|
|
93
|
-
import { cva } from "class-variance-authority";
|
|
94
|
-
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
95
|
-
import type { HTMLAttributes } from "astro/types";
|
|
96
|
-
|
|
97
|
-
type CardVariant = "default" | "ghost" | "overlay";
|
|
98
|
-
type CardSize = "default" | "large";
|
|
99
|
-
type CardOrientation = "vertical" | "horizontal";
|
|
100
|
-
|
|
101
|
-
type CardAsDiv = {
|
|
102
|
-
as?: "div";
|
|
103
|
-
} & HTMLAttributes<"div">;
|
|
104
|
-
|
|
105
|
-
type CardAsAnchor = {
|
|
106
|
-
as: "a";
|
|
107
|
-
} & HTMLAttributes<"a">;
|
|
108
|
-
|
|
109
|
-
type CardOwnProps = {
|
|
110
|
-
variant?: CardVariant;
|
|
111
|
-
size?: CardSize;
|
|
112
|
-
orientation?: CardOrientation;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
export type Props = (CardAsDiv | CardAsAnchor) & CardOwnProps;
|
|
116
|
-
|
|
117
|
-
const {
|
|
118
|
-
as: Tag = "div",
|
|
119
|
-
class: className = "",
|
|
120
|
-
variant = "default",
|
|
121
|
-
size = "default",
|
|
122
|
-
orientation = "vertical",
|
|
123
|
-
...rest
|
|
124
|
-
} = Astro.props as Props;
|
|
125
|
-
|
|
126
|
-
const cardVariants = cva(
|
|
127
|
-
"group/card relative flex overflow-clip rounded-lg text-sm text-card-foreground outline-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-chart-1",
|
|
128
|
-
{
|
|
129
|
-
variants: {
|
|
130
|
-
variant: {
|
|
131
|
-
default: "bg-card border border-border",
|
|
132
|
-
ghost: "",
|
|
133
|
-
overlay: "",
|
|
134
|
-
},
|
|
135
|
-
size: {
|
|
136
|
-
default: "",
|
|
137
|
-
large: "",
|
|
138
|
-
},
|
|
139
|
-
orientation: {
|
|
140
|
-
vertical: "flex-col",
|
|
141
|
-
horizontal: "flex-row items-start",
|
|
142
|
-
},
|
|
143
|
-
},
|
|
144
|
-
compoundVariants: [
|
|
145
|
-
{ variant: "overlay", size: "default", class: "justify-between p-8 aspect-[360/260]" },
|
|
146
|
-
{ variant: "overlay", size: "large", class: "justify-between p-8 aspect-[481/576]" },
|
|
147
|
-
{ variant: "ghost", orientation: "horizontal", class: "gap-8 p-2" },
|
|
148
|
-
],
|
|
149
|
-
defaultVariants: {
|
|
150
|
-
variant: "default",
|
|
151
|
-
size: "default",
|
|
152
|
-
orientation: "vertical",
|
|
153
|
-
},
|
|
154
|
-
},
|
|
155
|
-
);
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
{
|
|
159
|
-
/*
|
|
160
|
-
TS can't reconcile our discriminated union props with a dynamic intrinsic Tag.
|
|
161
|
-
The public Props type *is* strict (href only allowed when as="a"),
|
|
162
|
-
but JSX wants an intersection of button+anchor attributes here.
|
|
163
|
-
We deliberately suppress this internal error and rely on Props for caller safety.
|
|
164
|
-
*/
|
|
165
|
-
}
|
|
166
|
-
<!-- @ts-expect-error – union Props + dynamic Tag confuse JSX typing (see comment above) -->
|
|
167
|
-
<Tag
|
|
168
|
-
{...rest}
|
|
169
|
-
data-slot="card"
|
|
170
|
-
data-variant={variant}
|
|
171
|
-
data-size={size}
|
|
172
|
-
data-orientation={orientation}
|
|
173
|
-
class={cn(
|
|
174
|
-
cardVariants({ variant, size, orientation }),
|
|
175
|
-
"*:[img:first-child]:rounded-t-lg *:[img:last-child]:rounded-b-lg",
|
|
176
|
-
variant === "overlay" &&
|
|
177
|
-
"[&_[data-slot=card-media]]:absolute [&_[data-slot=card-media]]:inset-0 [&_[data-slot=card-media]]:z-0 [&_[data-slot=card-media]]:rounded-lg [&_[data-slot=card-media]]:p-0 [&_[data-slot=card-media]_img]:rounded-lg",
|
|
178
|
-
className,
|
|
179
|
-
)}
|
|
180
|
-
>
|
|
181
|
-
<slot />
|
|
182
|
-
</Tag>
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* @component Card
|
|
4
|
+
* @title Card
|
|
5
|
+
* @description UI container for grouping content with header, footer, etc.
|
|
6
|
+
* @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=54-1310
|
|
7
|
+
* @preview
|
|
8
|
+
*
|
|
9
|
+
* <Card class="w-full max-w-sm">
|
|
10
|
+
* <CardMedia>
|
|
11
|
+
* <img src="/mount-fuji.png" alt="Mount Fuji at sunset" width="374" height="250" loading="lazy" />
|
|
12
|
+
* </CardMedia>
|
|
13
|
+
* <CardHeader>
|
|
14
|
+
* <div class="flex items-center gap-2 justify-between">
|
|
15
|
+
* <div class="*:data-[slot=avatar]:ring-background flex -space-x-2 *:data-[slot=avatar]:ring-2">
|
|
16
|
+
* <Avatar>
|
|
17
|
+
* <AvatarImage>
|
|
18
|
+
* <img src="https://gradient.bejamas.com/presets/bejamas/marine.png" alt="grdient avatar" />
|
|
19
|
+
* </AvatarImage>
|
|
20
|
+
* <AvatarFallback>AW</AvatarFallback>
|
|
21
|
+
* </Avatar>
|
|
22
|
+
* </div>
|
|
23
|
+
* <Date date="2025-08-24T12:00:00Z" class="text-sm text-muted-foreground" />
|
|
24
|
+
* </div>
|
|
25
|
+
* </CardHeader>
|
|
26
|
+
* <CardContent>
|
|
27
|
+
* <div class="flex flex-col gap-6 group-data-[size=large]/card:gap-3">
|
|
28
|
+
* <CardTitle>Strong Foundations, Built to Scale</CardTitle>
|
|
29
|
+
* <CardDescription>Like any enduring system, a scalable design system relies on clear structure, solid foundations, and careful layering over time.</CardDescription>
|
|
30
|
+
* </div>
|
|
31
|
+
* <Button variant="outline" as="a" href="#">Read more</Button>
|
|
32
|
+
* </CardContent>
|
|
33
|
+
* <Separator />
|
|
34
|
+
* <CardFooter>
|
|
35
|
+
* <p class="text-sm text-muted-foreground">Categories</p>
|
|
36
|
+
* <div class="flex items-center gap-1">
|
|
37
|
+
* <Badge variant="secondary" shape="sharp">Marketing</Badge>
|
|
38
|
+
* <Badge variant="secondary" shape="sharp">UI Design</Badge>
|
|
39
|
+
* </div>
|
|
40
|
+
* </CardFooter>
|
|
41
|
+
* </Card>
|
|
42
|
+
*
|
|
43
|
+
* @usage
|
|
44
|
+
*
|
|
45
|
+
* ```astro nocollapse
|
|
46
|
+
* ---
|
|
47
|
+
* import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@bejamas/ui/components/card';
|
|
48
|
+
* import { Separator } from '@bejamas/ui/components/separator';
|
|
49
|
+
* ---
|
|
50
|
+
*
|
|
51
|
+
* <Card>
|
|
52
|
+
* <CardHeader>
|
|
53
|
+
* <CardTitle>Card Title</CardTitle>
|
|
54
|
+
* <CardDescription>Card Description</CardDescription>
|
|
55
|
+
* </CardHeader>
|
|
56
|
+
* <CardContent>
|
|
57
|
+
* Card content goes here.
|
|
58
|
+
* </CardContent>
|
|
59
|
+
* <Separator />
|
|
60
|
+
* <CardFooter>
|
|
61
|
+
* <button>OK</button>
|
|
62
|
+
* </CardFooter>
|
|
63
|
+
* </Card>
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* @examples
|
|
67
|
+
*
|
|
68
|
+
* ### Sizes
|
|
69
|
+
*
|
|
70
|
+
* Use `size="default"` (compact, the default) or `size="large"` for more generous padding and larger title/description text.
|
|
71
|
+
*
|
|
72
|
+
* <Card size="large">...</Card>
|
|
73
|
+
*
|
|
74
|
+
* ### Ghost
|
|
75
|
+
*
|
|
76
|
+
* `variant="ghost"` removes the card's border, background, and shadow — useful for embedding a card's content inline without visual chrome. Ghost also supports `orientation="horizontal"` for a side-by-side media + content layout.
|
|
77
|
+
*
|
|
78
|
+
* <Card variant="ghost" orientation="horizontal">...</Card>
|
|
79
|
+
*
|
|
80
|
+
* ### Overlay
|
|
81
|
+
*
|
|
82
|
+
* `variant="overlay"` renders `<CardMedia>` as a full-bleed background behind the card's content — no separate prop is needed on `CardMedia` itself, `Card` handles the positioning. Pair with `text-primary-foreground` content since it always sits on a photo.
|
|
83
|
+
*
|
|
84
|
+
* <Card variant="overlay">...</Card>
|
|
85
|
+
*
|
|
86
|
+
* ### As a link
|
|
87
|
+
*
|
|
88
|
+
* Pass `as="a"` (with `href`) to render the whole card as a real, natively focusable anchor — this is how to make Figma's Focus state reachable via keyboard, since a plain `<div>` can't receive `:focus-visible`.
|
|
89
|
+
*
|
|
90
|
+
* <Card as="a" href="#">...</Card>
|
|
91
|
+
*/
|
|
92
|
+
|
|
93
|
+
import { cva } from "class-variance-authority";
|
|
94
|
+
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
95
|
+
import type { HTMLAttributes } from "astro/types";
|
|
96
|
+
|
|
97
|
+
type CardVariant = "default" | "ghost" | "overlay";
|
|
98
|
+
type CardSize = "default" | "large";
|
|
99
|
+
type CardOrientation = "vertical" | "horizontal";
|
|
100
|
+
|
|
101
|
+
type CardAsDiv = {
|
|
102
|
+
as?: "div";
|
|
103
|
+
} & HTMLAttributes<"div">;
|
|
104
|
+
|
|
105
|
+
type CardAsAnchor = {
|
|
106
|
+
as: "a";
|
|
107
|
+
} & HTMLAttributes<"a">;
|
|
108
|
+
|
|
109
|
+
type CardOwnProps = {
|
|
110
|
+
variant?: CardVariant;
|
|
111
|
+
size?: CardSize;
|
|
112
|
+
orientation?: CardOrientation;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export type Props = (CardAsDiv | CardAsAnchor) & CardOwnProps;
|
|
116
|
+
|
|
117
|
+
const {
|
|
118
|
+
as: Tag = "div",
|
|
119
|
+
class: className = "",
|
|
120
|
+
variant = "default",
|
|
121
|
+
size = "default",
|
|
122
|
+
orientation = "vertical",
|
|
123
|
+
...rest
|
|
124
|
+
} = Astro.props as Props;
|
|
125
|
+
|
|
126
|
+
const cardVariants = cva(
|
|
127
|
+
"group/card relative flex overflow-clip rounded-lg text-sm text-card-foreground outline-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-chart-1",
|
|
128
|
+
{
|
|
129
|
+
variants: {
|
|
130
|
+
variant: {
|
|
131
|
+
default: "bg-card border border-border",
|
|
132
|
+
ghost: "",
|
|
133
|
+
overlay: "",
|
|
134
|
+
},
|
|
135
|
+
size: {
|
|
136
|
+
default: "",
|
|
137
|
+
large: "",
|
|
138
|
+
},
|
|
139
|
+
orientation: {
|
|
140
|
+
vertical: "flex-col",
|
|
141
|
+
horizontal: "flex-row items-start",
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
compoundVariants: [
|
|
145
|
+
{ variant: "overlay", size: "default", class: "justify-between p-8 aspect-[360/260]" },
|
|
146
|
+
{ variant: "overlay", size: "large", class: "justify-between p-8 aspect-[481/576]" },
|
|
147
|
+
{ variant: "ghost", orientation: "horizontal", class: "gap-8 p-2" },
|
|
148
|
+
],
|
|
149
|
+
defaultVariants: {
|
|
150
|
+
variant: "default",
|
|
151
|
+
size: "default",
|
|
152
|
+
orientation: "vertical",
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
);
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
{
|
|
159
|
+
/*
|
|
160
|
+
TS can't reconcile our discriminated union props with a dynamic intrinsic Tag.
|
|
161
|
+
The public Props type *is* strict (href only allowed when as="a"),
|
|
162
|
+
but JSX wants an intersection of button+anchor attributes here.
|
|
163
|
+
We deliberately suppress this internal error and rely on Props for caller safety.
|
|
164
|
+
*/
|
|
165
|
+
}
|
|
166
|
+
<!-- @ts-expect-error – union Props + dynamic Tag confuse JSX typing (see comment above) -->
|
|
167
|
+
<Tag
|
|
168
|
+
{...rest}
|
|
169
|
+
data-slot="card"
|
|
170
|
+
data-variant={variant}
|
|
171
|
+
data-size={size}
|
|
172
|
+
data-orientation={orientation}
|
|
173
|
+
class={cn(
|
|
174
|
+
cardVariants({ variant, size, orientation }),
|
|
175
|
+
"*:[img:first-child]:rounded-t-lg *:[img:last-child]:rounded-b-lg",
|
|
176
|
+
variant === "overlay" &&
|
|
177
|
+
"[&_[data-slot=card-media]]:absolute [&_[data-slot=card-media]]:inset-0 [&_[data-slot=card-media]]:z-0 [&_[data-slot=card-media]]:rounded-lg [&_[data-slot=card-media]]:p-0 [&_[data-slot=card-media]_img]:rounded-lg",
|
|
178
|
+
className,
|
|
179
|
+
)}
|
|
180
|
+
>
|
|
181
|
+
<slot />
|
|
182
|
+
</Tag>
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { cva } from "class-variance-authority";
|
|
3
|
-
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
4
|
-
import type { HTMLAttributes } from "astro/types";
|
|
5
|
-
|
|
6
|
-
interface Props extends HTMLAttributes<"div"> {
|
|
7
|
-
class?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const {
|
|
11
|
-
class: className = "",
|
|
12
|
-
...rest
|
|
13
|
-
} = Astro.props as Props;
|
|
14
|
-
|
|
15
|
-
const actionVariants = cva(
|
|
16
|
-
"col-start-2 row-span-2 row-start-1 self-start justify-self-end",
|
|
17
|
-
);
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
<div
|
|
21
|
-
{...rest}
|
|
22
|
-
data-slot="card-action"
|
|
23
|
-
class={cn("", actionVariants(), className)}
|
|
24
|
-
>
|
|
25
|
-
<slot />
|
|
26
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
4
|
+
import type { HTMLAttributes } from "astro/types";
|
|
5
|
+
|
|
6
|
+
interface Props extends HTMLAttributes<"div"> {
|
|
7
|
+
class?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const {
|
|
11
|
+
class: className = "",
|
|
12
|
+
...rest
|
|
13
|
+
} = Astro.props as Props;
|
|
14
|
+
|
|
15
|
+
const actionVariants = cva(
|
|
16
|
+
"col-start-2 row-span-2 row-start-1 self-start justify-self-end",
|
|
17
|
+
);
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
<div
|
|
21
|
+
{...rest}
|
|
22
|
+
data-slot="card-action"
|
|
23
|
+
class={cn("", actionVariants(), className)}
|
|
24
|
+
>
|
|
25
|
+
<slot />
|
|
26
|
+
</div>
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { cva } from "class-variance-authority";
|
|
3
|
-
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
4
|
-
import type { HTMLAttributes } from "astro/types";
|
|
5
|
-
|
|
6
|
-
interface Props extends HTMLAttributes<"div"> {
|
|
7
|
-
class?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const {
|
|
11
|
-
class: className = "",
|
|
12
|
-
...rest
|
|
13
|
-
} = Astro.props as Props;
|
|
14
|
-
|
|
15
|
-
const contentVariants = cva("");
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
<div
|
|
19
|
-
{...rest}
|
|
20
|
-
data-slot="card-content"
|
|
21
|
-
class={cn(
|
|
22
|
-
"flex flex-col gap-8 px-6 pt-8 pb-6 group-data-[orientation=horizontal]/card:flex-1 group-data-[orientation=horizontal]/card:justify-between group-data-[orientation=horizontal]/card:self-stretch group-data-[orientation=horizontal]/card:px-0 group-data-[orientation=horizontal]/card:py-3 group-data-[variant=overlay]/card:relative group-data-[variant=overlay]/card:z-10 group-data-[variant=overlay]/card:flex-row group-data-[variant=overlay]/card:items-end group-data-[variant=overlay]/card:justify-between group-data-[variant=overlay]/card:px-0 group-data-[variant=overlay]/card:pt-0 group-data-[variant=overlay]/card:pb-0 group-data-[variant=overlay]/card:text-primary-foreground",
|
|
23
|
-
contentVariants(),
|
|
24
|
-
className,
|
|
25
|
-
)}
|
|
26
|
-
>
|
|
27
|
-
<slot />
|
|
28
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
4
|
+
import type { HTMLAttributes } from "astro/types";
|
|
5
|
+
|
|
6
|
+
interface Props extends HTMLAttributes<"div"> {
|
|
7
|
+
class?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const {
|
|
11
|
+
class: className = "",
|
|
12
|
+
...rest
|
|
13
|
+
} = Astro.props as Props;
|
|
14
|
+
|
|
15
|
+
const contentVariants = cva("");
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
<div
|
|
19
|
+
{...rest}
|
|
20
|
+
data-slot="card-content"
|
|
21
|
+
class={cn(
|
|
22
|
+
"flex flex-col gap-8 px-6 pt-8 pb-6 group-data-[orientation=horizontal]/card:flex-1 group-data-[orientation=horizontal]/card:justify-between group-data-[orientation=horizontal]/card:self-stretch group-data-[orientation=horizontal]/card:px-0 group-data-[orientation=horizontal]/card:py-3 group-data-[variant=overlay]/card:relative group-data-[variant=overlay]/card:z-10 group-data-[variant=overlay]/card:flex-row group-data-[variant=overlay]/card:items-end group-data-[variant=overlay]/card:justify-between group-data-[variant=overlay]/card:px-0 group-data-[variant=overlay]/card:pt-0 group-data-[variant=overlay]/card:pb-0 group-data-[variant=overlay]/card:text-primary-foreground",
|
|
23
|
+
contentVariants(),
|
|
24
|
+
className,
|
|
25
|
+
)}
|
|
26
|
+
>
|
|
27
|
+
<slot />
|
|
28
|
+
</div>
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { cva } from "class-variance-authority";
|
|
3
|
-
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
4
|
-
import type { HTMLAttributes } from "astro/types";
|
|
5
|
-
|
|
6
|
-
interface Props extends HTMLAttributes<"div"> {
|
|
7
|
-
class?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const {
|
|
11
|
-
class: className = "",
|
|
12
|
-
...rest
|
|
13
|
-
} = Astro.props as Props;
|
|
14
|
-
|
|
15
|
-
const descriptionVariants = cva("");
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
<div
|
|
19
|
-
{...rest}
|
|
20
|
-
data-slot="card-description"
|
|
21
|
-
class={cn(
|
|
22
|
-
"text-muted-foreground text-sm group-data-[size=large]/card:group-data-[orientation=vertical]/card:text-base group-data-[variant=overlay]/card:text-primary-foreground",
|
|
23
|
-
descriptionVariants(),
|
|
24
|
-
className,
|
|
25
|
-
)}
|
|
26
|
-
>
|
|
27
|
-
<slot />
|
|
28
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
4
|
+
import type { HTMLAttributes } from "astro/types";
|
|
5
|
+
|
|
6
|
+
interface Props extends HTMLAttributes<"div"> {
|
|
7
|
+
class?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const {
|
|
11
|
+
class: className = "",
|
|
12
|
+
...rest
|
|
13
|
+
} = Astro.props as Props;
|
|
14
|
+
|
|
15
|
+
const descriptionVariants = cva("");
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
<div
|
|
19
|
+
{...rest}
|
|
20
|
+
data-slot="card-description"
|
|
21
|
+
class={cn(
|
|
22
|
+
"text-muted-foreground text-sm group-data-[size=large]/card:group-data-[orientation=vertical]/card:text-base group-data-[variant=overlay]/card:text-primary-foreground",
|
|
23
|
+
descriptionVariants(),
|
|
24
|
+
className,
|
|
25
|
+
)}
|
|
26
|
+
>
|
|
27
|
+
<slot />
|
|
28
|
+
</div>
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { cva } from "class-variance-authority";
|
|
3
|
-
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
4
|
-
import type { HTMLAttributes } from "astro/types";
|
|
5
|
-
|
|
6
|
-
interface Props extends HTMLAttributes<"div"> {
|
|
7
|
-
class?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const {
|
|
11
|
-
class: className = "",
|
|
12
|
-
...rest
|
|
13
|
-
} = Astro.props as Props;
|
|
14
|
-
|
|
15
|
-
const footerVariants = cva("flex items-center justify-between");
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
<div
|
|
19
|
-
{...rest}
|
|
20
|
-
data-slot="card-footer"
|
|
21
|
-
class={cn("gap-6 p-6 group-data-[orientation=horizontal]/card:hidden", footerVariants(), className)}
|
|
22
|
-
>
|
|
23
|
-
<slot />
|
|
24
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
4
|
+
import type { HTMLAttributes } from "astro/types";
|
|
5
|
+
|
|
6
|
+
interface Props extends HTMLAttributes<"div"> {
|
|
7
|
+
class?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const {
|
|
11
|
+
class: className = "",
|
|
12
|
+
...rest
|
|
13
|
+
} = Astro.props as Props;
|
|
14
|
+
|
|
15
|
+
const footerVariants = cva("flex items-center justify-between");
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
<div
|
|
19
|
+
{...rest}
|
|
20
|
+
data-slot="card-footer"
|
|
21
|
+
class={cn("gap-6 p-6 group-data-[orientation=horizontal]/card:hidden", footerVariants(), className)}
|
|
22
|
+
>
|
|
23
|
+
<slot />
|
|
24
|
+
</div>
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { cva } from "class-variance-authority";
|
|
3
|
-
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
4
|
-
import type { HTMLAttributes } from "astro/types";
|
|
5
|
-
|
|
6
|
-
interface Props extends HTMLAttributes<"div"> {
|
|
7
|
-
class?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const {
|
|
11
|
-
class: className = "",
|
|
12
|
-
...rest
|
|
13
|
-
} = Astro.props as Props;
|
|
14
|
-
|
|
15
|
-
const headerVariants = cva(
|
|
16
|
-
"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start has-data-[slot=card-action]:grid-cols-[1fr_auto]",
|
|
17
|
-
);
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
<div
|
|
21
|
-
{...rest}
|
|
22
|
-
data-slot="card-header"
|
|
23
|
-
class={cn(
|
|
24
|
-
"gap-1.5 px-6 pt-6 pb-0 group-data-[size=large]/card:pt-8 group-data-[variant=overlay]/card:relative group-data-[variant=overlay]/card:z-10 group-data-[variant=overlay]/card:px-0 group-data-[variant=overlay]/card:pt-0 group-data-[variant=overlay]/card:pb-0",
|
|
25
|
-
headerVariants(),
|
|
26
|
-
className,
|
|
27
|
-
)}
|
|
28
|
-
>
|
|
29
|
-
<slot />
|
|
30
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
4
|
+
import type { HTMLAttributes } from "astro/types";
|
|
5
|
+
|
|
6
|
+
interface Props extends HTMLAttributes<"div"> {
|
|
7
|
+
class?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const {
|
|
11
|
+
class: className = "",
|
|
12
|
+
...rest
|
|
13
|
+
} = Astro.props as Props;
|
|
14
|
+
|
|
15
|
+
const headerVariants = cva(
|
|
16
|
+
"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start has-data-[slot=card-action]:grid-cols-[1fr_auto]",
|
|
17
|
+
);
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
<div
|
|
21
|
+
{...rest}
|
|
22
|
+
data-slot="card-header"
|
|
23
|
+
class={cn(
|
|
24
|
+
"gap-1.5 px-6 pt-6 pb-0 group-data-[size=large]/card:pt-8 group-data-[variant=overlay]/card:relative group-data-[variant=overlay]/card:z-10 group-data-[variant=overlay]/card:px-0 group-data-[variant=overlay]/card:pt-0 group-data-[variant=overlay]/card:pb-0",
|
|
25
|
+
headerVariants(),
|
|
26
|
+
className,
|
|
27
|
+
)}
|
|
28
|
+
>
|
|
29
|
+
<slot />
|
|
30
|
+
</div>
|