@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.
Files changed (171) hide show
  1. package/README.md +45 -45
  2. package/package.json +1 -1
  3. package/src/components/accordion/Accordion.astro +248 -248
  4. package/src/components/accordion/AccordionContent.astro +26 -26
  5. package/src/components/accordion/AccordionItem.astro +36 -36
  6. package/src/components/accordion/AccordionTrigger.astro +118 -118
  7. package/src/components/alert/Alert.astro +167 -167
  8. package/src/components/alert/AlertDescription.astro +24 -24
  9. package/src/components/alert/AlertTitle.astro +24 -24
  10. package/src/components/avatar/Avatar.astro +197 -197
  11. package/src/components/avatar/AvatarBadge.astro +44 -44
  12. package/src/components/avatar/AvatarFallback.astro +26 -26
  13. package/src/components/avatar/AvatarGroup.astro +26 -26
  14. package/src/components/avatar/AvatarGroupCount.astro +30 -30
  15. package/src/components/avatar/AvatarImage.astro +46 -46
  16. package/src/components/badge/Badge.astro +167 -167
  17. package/src/components/breadcrumb/Breadcrumb.astro +76 -76
  18. package/src/components/breadcrumb/BreadcrumbItem.astro +32 -32
  19. package/src/components/breadcrumb/BreadcrumbList.astro +26 -26
  20. package/src/components/breadcrumb/BreadcrumbSeparator.astro +26 -26
  21. package/src/components/button/Button.astro +233 -233
  22. package/src/components/button-group/ButtonGroup.astro +130 -130
  23. package/src/components/button-group/ButtonGroupSeparator.astro +30 -30
  24. package/src/components/button-group/ButtonGroupText.astro +21 -21
  25. package/src/components/card/Card.astro +182 -182
  26. package/src/components/card/CardAction.astro +26 -26
  27. package/src/components/card/CardContent.astro +28 -28
  28. package/src/components/card/CardDescription.astro +28 -28
  29. package/src/components/card/CardFooter.astro +24 -24
  30. package/src/components/card/CardHeader.astro +30 -30
  31. package/src/components/card/CardMedia.astro +27 -27
  32. package/src/components/card/CardOverlay.astro +32 -32
  33. package/src/components/card/CardTitle.astro +21 -21
  34. package/src/components/carousel/Carousel.astro +106 -106
  35. package/src/components/carousel/CarouselSlide.astro +22 -22
  36. package/src/components/checkbox/Checkbox.astro +159 -159
  37. package/src/components/collapsible/Collapsible.astro +202 -202
  38. package/src/components/collapsible/CollapsibleContent.astro +36 -36
  39. package/src/components/collapsible/CollapsibleTrigger.astro +34 -34
  40. package/src/components/combobox/Combobox.astro +365 -365
  41. package/src/components/combobox/ComboboxContent.astro +37 -37
  42. package/src/components/combobox/ComboboxEmpty.astro +18 -18
  43. package/src/components/combobox/ComboboxGroup.astro +19 -19
  44. package/src/components/combobox/ComboboxInput.astro +74 -74
  45. package/src/components/combobox/ComboboxItem.astro +39 -39
  46. package/src/components/combobox/ComboboxLabel.astro +18 -18
  47. package/src/components/combobox/ComboboxList.astro +21 -21
  48. package/src/components/combobox/ComboboxSeparator.astro +17 -17
  49. package/src/components/combobox/ComboboxTrigger.astro +30 -30
  50. package/src/components/combobox/ComboboxValue.astro +22 -22
  51. package/src/components/date/Date.astro +137 -137
  52. package/src/components/dialog/Dialog.astro +196 -196
  53. package/src/components/dialog/DialogClose.astro +23 -23
  54. package/src/components/dialog/DialogContent.astro +42 -42
  55. package/src/components/dialog/DialogDescription.astro +18 -18
  56. package/src/components/dialog/DialogFooter.astro +18 -18
  57. package/src/components/dialog/DialogHeader.astro +18 -18
  58. package/src/components/dialog/DialogOverlay.astro +19 -19
  59. package/src/components/dialog/DialogTitle.astro +18 -18
  60. package/src/components/dialog/DialogTrigger.astro +37 -37
  61. package/src/components/dropdown-menu/DropdownMenu.astro +226 -226
  62. package/src/components/dropdown-menu/DropdownMenuCheckboxItem.astro +114 -114
  63. package/src/components/dropdown-menu/DropdownMenuContent.astro +42 -42
  64. package/src/components/dropdown-menu/DropdownMenuGroup.astro +19 -19
  65. package/src/components/dropdown-menu/DropdownMenuItem.astro +220 -220
  66. package/src/components/dropdown-menu/DropdownMenuLabel.astro +20 -20
  67. package/src/components/dropdown-menu/DropdownMenuRadioItem.astro +101 -101
  68. package/src/components/dropdown-menu/DropdownMenuSeparator.astro +18 -18
  69. package/src/components/dropdown-menu/DropdownMenuShortcut.astro +18 -18
  70. package/src/components/dropdown-menu/DropdownMenuTrigger.astro +49 -49
  71. package/src/components/field/Field.astro +664 -664
  72. package/src/components/field/FieldContent.astro +20 -20
  73. package/src/components/field/FieldDescription.astro +22 -22
  74. package/src/components/field/FieldError.astro +51 -51
  75. package/src/components/field/FieldGroup.astro +20 -20
  76. package/src/components/field/FieldLabel.astro +22 -22
  77. package/src/components/field/FieldLegend.astro +23 -23
  78. package/src/components/field/FieldSeparator.astro +30 -30
  79. package/src/components/field/FieldSet.astro +20 -20
  80. package/src/components/field/FieldTitle.astro +20 -20
  81. package/src/components/hover-card/HoverCard.astro +235 -235
  82. package/src/components/hover-card/HoverCardContent.astro +54 -54
  83. package/src/components/hover-card/HoverCardTrigger.astro +38 -38
  84. package/src/components/input/Input.astro +130 -130
  85. package/src/components/input-group/InputGroup.astro +135 -135
  86. package/src/components/input-group/InputGroupAddon.astro +49 -49
  87. package/src/components/input-group/InputGroupButton.astro +58 -58
  88. package/src/components/input-group/InputGroupInput.astro +18 -18
  89. package/src/components/input-group/InputGroupText.astro +21 -21
  90. package/src/components/input-group/InputGroupTextarea.astro +17 -17
  91. package/src/components/item/Item.astro +122 -122
  92. package/src/components/item/ItemActions.astro +21 -21
  93. package/src/components/item/ItemContent.astro +25 -25
  94. package/src/components/item/ItemDescription.astro +25 -25
  95. package/src/components/item/ItemFooter.astro +24 -24
  96. package/src/components/item/ItemGroup.astro +24 -24
  97. package/src/components/item/ItemHeader.astro +24 -24
  98. package/src/components/item/ItemMedia.astro +47 -47
  99. package/src/components/item/ItemSeparator.astro +21 -21
  100. package/src/components/item/ItemTitle.astro +25 -25
  101. package/src/components/kbd/Kbd.astro +145 -145
  102. package/src/components/kbd/KbdGroup.astro +55 -55
  103. package/src/components/label/Label.astro +97 -97
  104. package/src/components/link-group/LinkGroup.astro +67 -67
  105. package/src/components/link-group/LinkGroupItem.astro +32 -32
  106. package/src/components/link-group/LinkGroupList.astro +25 -25
  107. package/src/components/link-group/LinkGroupTitle.astro +22 -22
  108. package/src/components/marquee/Marquee.astro +119 -119
  109. package/src/components/native-select/NativeSelect.astro +125 -125
  110. package/src/components/native-select/NativeSelectOptGroup.astro +14 -14
  111. package/src/components/navigation-menu/NavigationMenu.astro +414 -414
  112. package/src/components/navigation-menu/NavigationMenuContent.astro +37 -37
  113. package/src/components/navigation-menu/NavigationMenuIndicator.astro +24 -24
  114. package/src/components/navigation-menu/NavigationMenuItem.astro +22 -22
  115. package/src/components/navigation-menu/NavigationMenuLink.astro +18 -18
  116. package/src/components/navigation-menu/NavigationMenuList.astro +21 -21
  117. package/src/components/navigation-menu/NavigationMenuPositioner.astro +44 -44
  118. package/src/components/navigation-menu/NavigationMenuTrigger.astro +30 -30
  119. package/src/components/navigation-menu/NavigationMenuViewport.astro +19 -19
  120. package/src/components/popover/CHANGELOG.md +17 -2
  121. package/src/components/popover/Popover.astro +211 -210
  122. package/src/components/popover/PopoverClose.astro +18 -18
  123. package/src/components/popover/PopoverContent.astro +50 -49
  124. package/src/components/popover/PopoverDescription.astro +18 -18
  125. package/src/components/popover/PopoverHeader.astro +18 -18
  126. package/src/components/popover/PopoverTitle.astro +18 -18
  127. package/src/components/popover/PopoverTrigger.astro +35 -29
  128. package/src/components/radio-group/CHANGELOG.md +23 -1
  129. package/src/components/radio-group/RadioGroup.astro +81 -81
  130. package/src/components/radio-group/RadioGroupItem.astro +51 -42
  131. package/src/components/select/Select.astro +373 -373
  132. package/src/components/select/SelectContent.astro +91 -91
  133. package/src/components/select/SelectGroup.astro +19 -19
  134. package/src/components/select/SelectItem.astro +48 -48
  135. package/src/components/select/SelectLabel.astro +18 -18
  136. package/src/components/select/SelectSeparator.astro +17 -17
  137. package/src/components/select/SelectTrigger.astro +34 -34
  138. package/src/components/select/SelectValue.astro +22 -22
  139. package/src/components/separator/Separator.astro +60 -60
  140. package/src/components/skeleton/Skeleton.astro +121 -121
  141. package/src/components/slider/Slider.astro +198 -198
  142. package/src/components/spinner/CHANGELOG.md +14 -1
  143. package/src/components/spinner/Spinner.astro +135 -134
  144. package/src/components/sticky-surface/StickySurface.astro +152 -152
  145. package/src/components/switch/CHANGELOG.md +20 -0
  146. package/src/components/switch/Switch.astro +106 -106
  147. package/src/components/table/CHANGELOG.md +21 -2
  148. package/src/components/table/Table.astro +251 -250
  149. package/src/components/table/TableBody.astro +18 -18
  150. package/src/components/table/TableCaption.astro +17 -17
  151. package/src/components/table/TableCell.astro +21 -21
  152. package/src/components/table/TableFooter.astro +21 -21
  153. package/src/components/table/TableHead.astro +21 -21
  154. package/src/components/table/TableHeader.astro +17 -17
  155. package/src/components/table/TableRow.astro +21 -21
  156. package/src/components/tabs/Tabs.astro +306 -306
  157. package/src/components/tabs/TabsContent.astro +47 -47
  158. package/src/components/tabs/TabsList.astro +69 -69
  159. package/src/components/tabs/TabsTrigger.astro +40 -40
  160. package/src/components/textarea/CHANGELOG.md +18 -1
  161. package/src/components/textarea/Textarea.astro +58 -36
  162. package/src/components/toggle/CHANGELOG.md +19 -1
  163. package/src/components/toggle/Toggle.astro +150 -138
  164. package/src/components/toggle-group/CHANGELOG.md +14 -1
  165. package/src/components/toggle-group/ToggleGroup.astro +236 -224
  166. package/src/components/toggle-group/ToggleGroupItem.astro +48 -48
  167. package/src/components/tooltip/CHANGELOG.md +19 -2
  168. package/src/components/tooltip/Tooltip.astro +357 -331
  169. package/src/components/tooltip/TooltipContent.astro +85 -60
  170. package/src/components/tooltip/TooltipTrigger.astro +34 -34
  171. 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>