@cl-light-ds/ui 0.2.0 → 0.3.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 (283) 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/accordion/CHANGELOG.md +41 -41
  8. package/src/components/accordion/index.ts +4 -4
  9. package/src/components/alert/Alert.astro +167 -167
  10. package/src/components/alert/AlertDescription.astro +24 -24
  11. package/src/components/alert/AlertTitle.astro +24 -24
  12. package/src/components/alert/CHANGELOG.md +5 -5
  13. package/src/components/alert/index.ts +4 -4
  14. package/src/components/avatar/Avatar.astro +197 -197
  15. package/src/components/avatar/AvatarBadge.astro +44 -44
  16. package/src/components/avatar/AvatarFallback.astro +26 -26
  17. package/src/components/avatar/AvatarGroup.astro +26 -26
  18. package/src/components/avatar/AvatarGroupCount.astro +30 -30
  19. package/src/components/avatar/AvatarImage.astro +46 -46
  20. package/src/components/avatar/CHANGELOG.md +44 -44
  21. package/src/components/avatar/index.ts +6 -6
  22. package/src/components/badge/Badge.astro +167 -167
  23. package/src/components/badge/CHANGELOG.md +49 -49
  24. package/src/components/badge/index.ts +2 -2
  25. package/src/components/breadcrumb/Breadcrumb.astro +76 -76
  26. package/src/components/breadcrumb/BreadcrumbItem.astro +32 -32
  27. package/src/components/breadcrumb/BreadcrumbList.astro +26 -26
  28. package/src/components/breadcrumb/BreadcrumbSeparator.astro +26 -26
  29. package/src/components/breadcrumb/CHANGELOG.md +24 -24
  30. package/src/components/breadcrumb/index.ts +5 -5
  31. package/src/components/button/Button.astro +233 -233
  32. package/src/components/button/CHANGELOG.md +41 -41
  33. package/src/components/button/index.ts +2 -2
  34. package/src/components/button-group/ButtonGroup.astro +130 -130
  35. package/src/components/button-group/ButtonGroupSeparator.astro +30 -30
  36. package/src/components/button-group/ButtonGroupText.astro +21 -21
  37. package/src/components/button-group/CHANGELOG.md +34 -34
  38. package/src/components/button-group/index.ts +3 -3
  39. package/src/components/card/CHANGELOG.md +162 -119
  40. package/src/components/card/Card.astro +197 -182
  41. package/src/components/card/CardAction.astro +26 -26
  42. package/src/components/card/CardContent.astro +28 -28
  43. package/src/components/card/CardDescription.astro +28 -28
  44. package/src/components/card/CardFooter.astro +24 -24
  45. package/src/components/card/CardHeader.astro +30 -30
  46. package/src/components/card/CardMedia.astro +27 -27
  47. package/src/components/card/CardMediaActions.astro +21 -0
  48. package/src/components/card/CardMediaSelect.astro +21 -0
  49. package/src/components/card/CardOverlay.astro +32 -32
  50. package/src/components/card/CardTitle.astro +21 -21
  51. package/src/components/card/index.ts +12 -10
  52. package/src/components/carousel/CHANGELOG.md +5 -5
  53. package/src/components/carousel/Carousel.astro +106 -106
  54. package/src/components/carousel/CarouselSlide.astro +22 -22
  55. package/src/components/carousel/index.ts +3 -3
  56. package/src/components/checkbox/CHANGELOG.md +58 -58
  57. package/src/components/checkbox/Checkbox.astro +159 -159
  58. package/src/components/checkbox/index.ts +1 -1
  59. package/src/components/collapsible/CHANGELOG.md +5 -5
  60. package/src/components/collapsible/Collapsible.astro +202 -202
  61. package/src/components/collapsible/CollapsibleContent.astro +36 -36
  62. package/src/components/collapsible/CollapsibleTrigger.astro +34 -34
  63. package/src/components/collapsible/index.ts +4 -4
  64. package/src/components/combobox/CHANGELOG.md +27 -27
  65. package/src/components/combobox/Combobox.astro +365 -365
  66. package/src/components/combobox/ComboboxContent.astro +37 -37
  67. package/src/components/combobox/ComboboxEmpty.astro +18 -18
  68. package/src/components/combobox/ComboboxGroup.astro +19 -19
  69. package/src/components/combobox/ComboboxInput.astro +74 -74
  70. package/src/components/combobox/ComboboxItem.astro +39 -39
  71. package/src/components/combobox/ComboboxLabel.astro +18 -18
  72. package/src/components/combobox/ComboboxList.astro +21 -21
  73. package/src/components/combobox/ComboboxSeparator.astro +17 -17
  74. package/src/components/combobox/ComboboxTrigger.astro +30 -30
  75. package/src/components/combobox/ComboboxValue.astro +22 -22
  76. package/src/components/combobox/index.ts +11 -11
  77. package/src/components/date/CHANGELOG.md +18 -18
  78. package/src/components/date/Date.astro +137 -137
  79. package/src/components/date/index.ts +2 -2
  80. package/src/components/dialog/CHANGELOG.md +39 -39
  81. package/src/components/dialog/Dialog.astro +196 -196
  82. package/src/components/dialog/DialogClose.astro +23 -23
  83. package/src/components/dialog/DialogContent.astro +42 -42
  84. package/src/components/dialog/DialogDescription.astro +18 -18
  85. package/src/components/dialog/DialogFooter.astro +18 -18
  86. package/src/components/dialog/DialogHeader.astro +18 -18
  87. package/src/components/dialog/DialogOverlay.astro +19 -19
  88. package/src/components/dialog/DialogTitle.astro +18 -18
  89. package/src/components/dialog/DialogTrigger.astro +37 -37
  90. package/src/components/dialog/index.ts +9 -9
  91. package/src/components/dropdown-menu/CHANGELOG.md +194 -194
  92. package/src/components/dropdown-menu/DropdownMenu.astro +226 -226
  93. package/src/components/dropdown-menu/DropdownMenuCheckboxItem.astro +114 -114
  94. package/src/components/dropdown-menu/DropdownMenuContent.astro +42 -42
  95. package/src/components/dropdown-menu/DropdownMenuGroup.astro +19 -19
  96. package/src/components/dropdown-menu/DropdownMenuItem.astro +220 -220
  97. package/src/components/dropdown-menu/DropdownMenuItemContent.astro +79 -79
  98. package/src/components/dropdown-menu/DropdownMenuLabel.astro +20 -20
  99. package/src/components/dropdown-menu/DropdownMenuPortal.astro +13 -13
  100. package/src/components/dropdown-menu/DropdownMenuRadioGroup.astro +13 -13
  101. package/src/components/dropdown-menu/DropdownMenuRadioItem.astro +101 -101
  102. package/src/components/dropdown-menu/DropdownMenuSeparator.astro +18 -18
  103. package/src/components/dropdown-menu/DropdownMenuShortcut.astro +18 -18
  104. package/src/components/dropdown-menu/DropdownMenuTrigger.astro +49 -49
  105. package/src/components/dropdown-menu/dropdown-menu-item-variants.ts +24 -24
  106. package/src/components/dropdown-menu/index.ts +12 -12
  107. package/src/components/field/CHANGELOG.md +33 -33
  108. package/src/components/field/Field.astro +664 -664
  109. package/src/components/field/FieldContent.astro +20 -20
  110. package/src/components/field/FieldDescription.astro +22 -22
  111. package/src/components/field/FieldError.astro +51 -51
  112. package/src/components/field/FieldGroup.astro +20 -20
  113. package/src/components/field/FieldLabel.astro +22 -22
  114. package/src/components/field/FieldLegend.astro +23 -23
  115. package/src/components/field/FieldSeparator.astro +30 -30
  116. package/src/components/field/FieldSet.astro +20 -20
  117. package/src/components/field/FieldTitle.astro +20 -20
  118. package/src/components/field/index.ts +10 -10
  119. package/src/components/hover-card/CHANGELOG.md +20 -20
  120. package/src/components/hover-card/HoverCard.astro +235 -235
  121. package/src/components/hover-card/HoverCardContent.astro +54 -54
  122. package/src/components/hover-card/HoverCardTrigger.astro +38 -38
  123. package/src/components/hover-card/index.ts +3 -3
  124. package/src/components/input/CHANGELOG.md +29 -29
  125. package/src/components/input/Input.astro +130 -130
  126. package/src/components/input/index.ts +2 -2
  127. package/src/components/input-group/CHANGELOG.md +49 -49
  128. package/src/components/input-group/InputGroup.astro +135 -135
  129. package/src/components/input-group/InputGroupAddon.astro +49 -49
  130. package/src/components/input-group/InputGroupButton.astro +58 -58
  131. package/src/components/input-group/InputGroupInput.astro +18 -18
  132. package/src/components/input-group/InputGroupText.astro +21 -21
  133. package/src/components/input-group/InputGroupTextarea.astro +17 -17
  134. package/src/components/input-group/controlClasses.ts +2 -2
  135. package/src/components/input-group/index.ts +6 -6
  136. package/src/components/item/CHANGELOG.md +27 -27
  137. package/src/components/item/Item.astro +122 -122
  138. package/src/components/item/ItemActions.astro +21 -21
  139. package/src/components/item/ItemContent.astro +25 -25
  140. package/src/components/item/ItemDescription.astro +25 -25
  141. package/src/components/item/ItemFooter.astro +24 -24
  142. package/src/components/item/ItemGroup.astro +24 -24
  143. package/src/components/item/ItemHeader.astro +24 -24
  144. package/src/components/item/ItemMedia.astro +47 -47
  145. package/src/components/item/ItemSeparator.astro +21 -21
  146. package/src/components/item/ItemTitle.astro +25 -25
  147. package/src/components/item/index.ts +10 -10
  148. package/src/components/kbd/CHANGELOG.md +5 -5
  149. package/src/components/kbd/Kbd.astro +145 -145
  150. package/src/components/kbd/KbdGroup.astro +55 -55
  151. package/src/components/kbd/index.ts +2 -2
  152. package/src/components/label/CHANGELOG.md +28 -28
  153. package/src/components/label/Label.astro +97 -97
  154. package/src/components/label/index.ts +2 -2
  155. package/src/components/link-group/CHANGELOG.md +75 -75
  156. package/src/components/link-group/LinkGroup.astro +67 -67
  157. package/src/components/link-group/LinkGroupItem.astro +32 -32
  158. package/src/components/link-group/LinkGroupList.astro +25 -25
  159. package/src/components/link-group/LinkGroupTitle.astro +22 -22
  160. package/src/components/link-group/index.ts +5 -5
  161. package/src/components/link-group/link-group-list-variants.ts +15 -15
  162. package/src/components/marquee/CHANGELOG.md +5 -5
  163. package/src/components/marquee/Marquee.astro +119 -119
  164. package/src/components/marquee/index.ts +2 -2
  165. package/src/components/native-select/CHANGELOG.md +5 -5
  166. package/src/components/native-select/NativeSelect.astro +125 -125
  167. package/src/components/native-select/NativeSelectOptGroup.astro +14 -14
  168. package/src/components/native-select/NativeSelectOption.astro +9 -9
  169. package/src/components/native-select/index.ts +3 -3
  170. package/src/components/navigation-menu/CHANGELOG.md +63 -63
  171. package/src/components/navigation-menu/NavigationMenu.astro +414 -414
  172. package/src/components/navigation-menu/NavigationMenuContent.astro +37 -37
  173. package/src/components/navigation-menu/NavigationMenuIndicator.astro +24 -24
  174. package/src/components/navigation-menu/NavigationMenuItem.astro +22 -22
  175. package/src/components/navigation-menu/NavigationMenuLink.astro +18 -18
  176. package/src/components/navigation-menu/NavigationMenuList.astro +21 -21
  177. package/src/components/navigation-menu/NavigationMenuPositioner.astro +44 -44
  178. package/src/components/navigation-menu/NavigationMenuTrigger.astro +30 -30
  179. package/src/components/navigation-menu/NavigationMenuViewport.astro +19 -19
  180. package/src/components/navigation-menu/index.ts +10 -10
  181. package/src/components/organisms/lightning-sidebar-nav/CHANGELOG.md +50 -0
  182. package/src/components/organisms/lightning-sidebar-nav/LightningSidebarNav.astro +176 -0
  183. package/src/components/organisms/lightning-sidebar-nav/SidebarNav.astro +50 -0
  184. package/src/components/organisms/lightning-sidebar-nav/SidebarNavGroup.astro +74 -0
  185. package/src/components/organisms/lightning-sidebar-nav/SidebarNavItem.astro +94 -0
  186. package/src/components/organisms/lightning-sidebar-nav/SidebarNavProBadge.astro +26 -0
  187. package/src/components/organisms/lightning-sidebar-nav/SidebarNavSection.astro +71 -0
  188. package/src/components/organisms/lightning-sidebar-nav/SidebarNavSkeleton.astro +67 -0
  189. package/src/components/organisms/lightning-sidebar-nav/SidebarNavSubItem.astro +69 -0
  190. package/src/components/organisms/lightning-sidebar-nav/SidebarNavUsage.astro +78 -0
  191. package/src/components/organisms/lightning-sidebar-nav/SidebarNavWorkspaceAvatar.astro +46 -0
  192. package/src/components/organisms/lightning-sidebar-nav/SidebarNavWorkspaceSwitcher.astro +130 -0
  193. package/src/components/organisms/lightning-sidebar-nav/icons.ts +46 -0
  194. package/src/components/organisms/lightning-sidebar-nav/index.ts +18 -0
  195. package/src/components/organisms/lightning-sidebar-nav/types.ts +77 -0
  196. package/src/components/popover/CHANGELOG.md +20 -20
  197. package/src/components/popover/Popover.astro +211 -211
  198. package/src/components/popover/PopoverClose.astro +18 -18
  199. package/src/components/popover/PopoverContent.astro +50 -50
  200. package/src/components/popover/PopoverDescription.astro +18 -18
  201. package/src/components/popover/PopoverHeader.astro +18 -18
  202. package/src/components/popover/PopoverTitle.astro +18 -18
  203. package/src/components/popover/PopoverTrigger.astro +35 -35
  204. package/src/components/popover/index.ts +7 -7
  205. package/src/components/radio-group/CHANGELOG.md +31 -31
  206. package/src/components/radio-group/RadioGroup.astro +81 -81
  207. package/src/components/radio-group/RadioGroupItem.astro +51 -51
  208. package/src/components/radio-group/index.ts +3 -3
  209. package/src/components/select/CHANGELOG.md +39 -39
  210. package/src/components/select/Select.astro +373 -373
  211. package/src/components/select/SelectContent.astro +91 -91
  212. package/src/components/select/SelectGroup.astro +19 -19
  213. package/src/components/select/SelectItem.astro +48 -48
  214. package/src/components/select/SelectLabel.astro +18 -18
  215. package/src/components/select/SelectSeparator.astro +17 -17
  216. package/src/components/select/SelectTrigger.astro +34 -34
  217. package/src/components/select/SelectValue.astro +22 -22
  218. package/src/components/select/index.ts +8 -8
  219. package/src/components/separator/CHANGELOG.md +5 -5
  220. package/src/components/separator/Separator.astro +60 -60
  221. package/src/components/separator/index.ts +2 -2
  222. package/src/components/skeleton/CHANGELOG.md +5 -5
  223. package/src/components/skeleton/Skeleton.astro +121 -121
  224. package/src/components/skeleton/index.ts +1 -1
  225. package/src/components/slider/CHANGELOG.md +5 -5
  226. package/src/components/slider/Slider.astro +198 -198
  227. package/src/components/slider/index.ts +1 -1
  228. package/src/components/spinner/CHANGELOG.md +18 -18
  229. package/src/components/spinner/Spinner.astro +135 -135
  230. package/src/components/spinner/index.ts +1 -1
  231. package/src/components/sticky-surface/CHANGELOG.md +5 -5
  232. package/src/components/sticky-surface/StickySurface.astro +152 -152
  233. package/src/components/sticky-surface/index.ts +2 -2
  234. package/src/components/switch/CHANGELOG.md +29 -29
  235. package/src/components/switch/Switch.astro +106 -106
  236. package/src/components/switch/index.ts +1 -1
  237. package/src/components/table/CHANGELOG.md +24 -24
  238. package/src/components/table/Table.astro +358 -251
  239. package/src/components/table/TableBody.astro +17 -18
  240. package/src/components/table/TableBulkToolbar.astro +37 -0
  241. package/src/components/table/TableCaption.astro +17 -17
  242. package/src/components/table/TableCell.astro +45 -21
  243. package/src/components/table/TableCellText.astro +17 -0
  244. package/src/components/table/TableColumnMenu.astro +50 -0
  245. package/src/components/table/TableEditableCell.astro +287 -0
  246. package/src/components/table/TableEmpty.astro +17 -0
  247. package/src/components/table/TableFolderCell.astro +38 -0
  248. package/src/components/table/TableFooter.astro +21 -21
  249. package/src/components/table/TableHead.astro +90 -21
  250. package/src/components/table/TableHeader.astro +17 -17
  251. package/src/components/table/TablePagination.astro +57 -0
  252. package/src/components/table/TableRow.astro +52 -21
  253. package/src/components/table/TableSelectAllBanner.astro +34 -0
  254. package/src/components/table/TableSelectCell.astro +50 -0
  255. package/src/components/table/TableSkeletonRow.astro +21 -0
  256. package/src/components/table/index.ts +19 -9
  257. package/src/components/table/table-cell-variants.ts +29 -0
  258. package/src/components/tabs/CHANGELOG.md +5 -5
  259. package/src/components/tabs/Tabs.astro +306 -306
  260. package/src/components/tabs/TabsContent.astro +47 -47
  261. package/src/components/tabs/TabsList.astro +69 -69
  262. package/src/components/tabs/TabsTrigger.astro +40 -40
  263. package/src/components/tabs/index.ts +6 -6
  264. package/src/components/textarea/CHANGELOG.md +22 -22
  265. package/src/components/textarea/Textarea.astro +58 -58
  266. package/src/components/textarea/index.ts +2 -2
  267. package/src/components/toggle/CHANGELOG.md +23 -23
  268. package/src/components/toggle/Toggle.astro +150 -150
  269. package/src/components/toggle/index.ts +1 -1
  270. package/src/components/toggle-group/CHANGELOG.md +18 -18
  271. package/src/components/toggle-group/ToggleGroup.astro +236 -236
  272. package/src/components/toggle-group/ToggleGroupItem.astro +48 -48
  273. package/src/components/toggle-group/index.ts +2 -2
  274. package/src/components/tooltip/CHANGELOG.md +22 -22
  275. package/src/components/tooltip/Tooltip.astro +357 -357
  276. package/src/components/tooltip/TooltipContent.astro +85 -85
  277. package/src/components/tooltip/TooltipTrigger.astro +34 -34
  278. package/src/components/tooltip/index.ts +3 -3
  279. package/src/lib/table-controller.ts +1090 -0
  280. package/src/lib/toggle-group-controller.ts +113 -113
  281. package/src/lib/toggle-shared.ts +27 -27
  282. package/src/lib/utils.ts +6 -6
  283. package/src/styles/globals.css +197 -177
@@ -1,182 +1,197 @@
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 status="active">
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 font-semibold 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 font-semibold text-muted-foreground">31 steps · 10 min</p>
36
+ * <div class="flex items-center gap-1">
37
+ * <Badge variant="secondary">Marketing</Badge>
38
+ * <Badge variant="secondary">UI Design</Badge>
39
+ * <Badge variant="secondary">AI</Badge>
40
+ * </div>
41
+ * </CardFooter>
42
+ * </Card>
43
+ *
44
+ * @usage
45
+ *
46
+ * ```astro nocollapse
47
+ * ---
48
+ * import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@bejamas/ui/components/card';
49
+ * import { Separator } from '@bejamas/ui/components/separator';
50
+ * ---
51
+ *
52
+ * <Card>
53
+ * <CardHeader>
54
+ * <CardTitle>Card Title</CardTitle>
55
+ * <CardDescription>Card Description</CardDescription>
56
+ * </CardHeader>
57
+ * <CardContent>
58
+ * Card content goes here.
59
+ * </CardContent>
60
+ * <Separator />
61
+ * <CardFooter>
62
+ * <button>OK</button>
63
+ * </CardFooter>
64
+ * </Card>
65
+ * ```
66
+ *
67
+ * @examples
68
+ *
69
+ * ### Sizes
70
+ *
71
+ * Use `size="default"` (compact, the default) or `size="large"` for more generous padding and larger title/description text.
72
+ *
73
+ * <Card size="large">...</Card>
74
+ *
75
+ * ### Ghost
76
+ *
77
+ * `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.
78
+ *
79
+ * <Card variant="ghost" orientation="horizontal">...</Card>
80
+ *
81
+ * ### Overlay
82
+ *
83
+ * `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.
84
+ *
85
+ * <Card variant="overlay">...</Card>
86
+ *
87
+ * ### Hover actions
88
+ *
89
+ * On `variant="default"`, hovering the card (or focusing anything inside it) fades a `card-hover` scrim over `<CardMedia>` and lifts the card with `shadow-card-light`. Place `<CardMediaSelect>` (top-left, e.g. `<Checkbox size="lg" />`) and/or `<CardMediaActions>` (top-right icon toolbar) inside `<CardMedia>` — both stay hidden until hover/focus-within, and are always visible on touch devices. Don't combine them with `as="a"`: interactive children inside an anchor are invalid HTML.
90
+ *
91
+ * <CardMedia>
92
+ * <img ... />
93
+ * <CardMediaSelect><Checkbox size="lg" aria-label="Select card" /></CardMediaSelect>
94
+ * <CardMediaActions>
95
+ * <button aria-label="Copy link"><Link /></button>
96
+ * <button aria-label="More actions"><Ellipsis /></button>
97
+ * </CardMediaActions>
98
+ * </CardMedia>
99
+ *
100
+ * ### As a link
101
+ *
102
+ * 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`.
103
+ *
104
+ * <Card as="a" href="#">...</Card>
105
+ */
106
+
107
+ import { cva } from "class-variance-authority";
108
+ import { cn } from "@cl-light-ds/ui/lib/utils";
109
+ import type { HTMLAttributes } from "astro/types";
110
+
111
+ type CardVariant = "default" | "ghost" | "overlay";
112
+ type CardSize = "default" | "large";
113
+ type CardOrientation = "vertical" | "horizontal";
114
+
115
+ type CardAsDiv = {
116
+ as?: "div";
117
+ } & HTMLAttributes<"div">;
118
+
119
+ type CardAsAnchor = {
120
+ as: "a";
121
+ } & HTMLAttributes<"a">;
122
+
123
+ type CardOwnProps = {
124
+ variant?: CardVariant;
125
+ size?: CardSize;
126
+ orientation?: CardOrientation;
127
+ };
128
+
129
+ export type Props = (CardAsDiv | CardAsAnchor) & CardOwnProps;
130
+
131
+ const {
132
+ as: Tag = "div",
133
+ class: className = "",
134
+ variant = "default",
135
+ size = "default",
136
+ orientation = "vertical",
137
+ ...rest
138
+ } = Astro.props as Props;
139
+
140
+ const cardVariants = cva(
141
+ "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",
142
+ {
143
+ variants: {
144
+ variant: {
145
+ default:
146
+ "bg-card border border-border transition-shadow hover:shadow-card-light focus-within:shadow-card-light",
147
+ ghost: "border border-transparent",
148
+ overlay: "border border-transparent",
149
+ },
150
+ size: {
151
+ default: "",
152
+ large: "",
153
+ },
154
+ orientation: {
155
+ vertical: "flex-col",
156
+ horizontal: "flex-row items-start",
157
+ },
158
+ },
159
+ compoundVariants: [
160
+ { variant: "overlay", size: "default", class: "justify-between p-8 aspect-[360/260]" },
161
+ { variant: "overlay", size: "large", class: "justify-between p-8 aspect-[481/576]" },
162
+ { variant: "ghost", orientation: "horizontal", class: "gap-8 p-2" },
163
+ ],
164
+ defaultVariants: {
165
+ variant: "default",
166
+ size: "default",
167
+ orientation: "vertical",
168
+ },
169
+ },
170
+ );
171
+ ---
172
+
173
+ {
174
+ /*
175
+ TS can't reconcile our discriminated union props with a dynamic intrinsic Tag.
176
+ The public Props type *is* strict (href only allowed when as="a"),
177
+ but JSX wants an intersection of button+anchor attributes here.
178
+ We deliberately suppress this internal error and rely on Props for caller safety.
179
+ */
180
+ }
181
+ <!-- @ts-expect-error – union Props + dynamic Tag confuse JSX typing (see comment above) -->
182
+ <Tag
183
+ {...rest}
184
+ data-slot="card"
185
+ data-variant={variant}
186
+ data-size={size}
187
+ data-orientation={orientation}
188
+ class={cn(
189
+ cardVariants({ variant, size, orientation }),
190
+ "*:[img:first-child]:rounded-t-lg *:[img:last-child]:rounded-b-lg",
191
+ variant === "overlay" &&
192
+ "[&_[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",
193
+ className,
194
+ )}
195
+ >
196
+ <slot />
197
+ </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 group-data-[variant=overlay]/card:group-data-[size=large]/card:gap-10",
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:not-in-data-[variant=overlay]: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>