@cl-light-ds/ui 0.2.0 → 0.4.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 (293) hide show
  1. package/README.md +45 -45
  2. package/package.json +2 -2
  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/callout/CHANGELOG.md +32 -0
  40. package/src/components/callout/Callout.astro +147 -0
  41. package/src/components/callout/CalloutDescription.astro +16 -0
  42. package/src/components/callout/CalloutTitle.astro +16 -0
  43. package/src/components/callout/index.ts +3 -0
  44. package/src/components/card/CHANGELOG.md +162 -119
  45. package/src/components/card/Card.astro +197 -182
  46. package/src/components/card/CardAction.astro +26 -26
  47. package/src/components/card/CardContent.astro +28 -28
  48. package/src/components/card/CardDescription.astro +28 -28
  49. package/src/components/card/CardFooter.astro +24 -24
  50. package/src/components/card/CardHeader.astro +30 -30
  51. package/src/components/card/CardMedia.astro +27 -27
  52. package/src/components/card/CardMediaActions.astro +21 -0
  53. package/src/components/card/CardMediaSelect.astro +21 -0
  54. package/src/components/card/CardOverlay.astro +32 -32
  55. package/src/components/card/CardTitle.astro +21 -21
  56. package/src/components/card/index.ts +12 -10
  57. package/src/components/carousel/CHANGELOG.md +5 -5
  58. package/src/components/carousel/Carousel.astro +106 -106
  59. package/src/components/carousel/CarouselSlide.astro +22 -22
  60. package/src/components/carousel/index.ts +3 -3
  61. package/src/components/checkbox/CHANGELOG.md +58 -58
  62. package/src/components/checkbox/Checkbox.astro +159 -159
  63. package/src/components/checkbox/index.ts +1 -1
  64. package/src/components/collapsible/CHANGELOG.md +5 -5
  65. package/src/components/collapsible/Collapsible.astro +202 -202
  66. package/src/components/collapsible/CollapsibleContent.astro +36 -36
  67. package/src/components/collapsible/CollapsibleTrigger.astro +34 -34
  68. package/src/components/collapsible/index.ts +4 -4
  69. package/src/components/combobox/CHANGELOG.md +27 -27
  70. package/src/components/combobox/Combobox.astro +365 -365
  71. package/src/components/combobox/ComboboxContent.astro +37 -37
  72. package/src/components/combobox/ComboboxEmpty.astro +18 -18
  73. package/src/components/combobox/ComboboxGroup.astro +19 -19
  74. package/src/components/combobox/ComboboxInput.astro +74 -74
  75. package/src/components/combobox/ComboboxItem.astro +39 -39
  76. package/src/components/combobox/ComboboxLabel.astro +18 -18
  77. package/src/components/combobox/ComboboxList.astro +21 -21
  78. package/src/components/combobox/ComboboxSeparator.astro +17 -17
  79. package/src/components/combobox/ComboboxTrigger.astro +30 -30
  80. package/src/components/combobox/ComboboxValue.astro +22 -22
  81. package/src/components/combobox/index.ts +11 -11
  82. package/src/components/date/CHANGELOG.md +18 -18
  83. package/src/components/date/Date.astro +137 -137
  84. package/src/components/date/index.ts +2 -2
  85. package/src/components/dialog/CHANGELOG.md +39 -39
  86. package/src/components/dialog/Dialog.astro +196 -196
  87. package/src/components/dialog/DialogClose.astro +23 -23
  88. package/src/components/dialog/DialogContent.astro +42 -42
  89. package/src/components/dialog/DialogDescription.astro +18 -18
  90. package/src/components/dialog/DialogFooter.astro +18 -18
  91. package/src/components/dialog/DialogHeader.astro +18 -18
  92. package/src/components/dialog/DialogOverlay.astro +19 -19
  93. package/src/components/dialog/DialogTitle.astro +18 -18
  94. package/src/components/dialog/DialogTrigger.astro +37 -37
  95. package/src/components/dialog/index.ts +9 -9
  96. package/src/components/dropdown-menu/CHANGELOG.md +194 -194
  97. package/src/components/dropdown-menu/DropdownMenu.astro +226 -226
  98. package/src/components/dropdown-menu/DropdownMenuCheckboxItem.astro +114 -114
  99. package/src/components/dropdown-menu/DropdownMenuContent.astro +42 -42
  100. package/src/components/dropdown-menu/DropdownMenuGroup.astro +19 -19
  101. package/src/components/dropdown-menu/DropdownMenuItem.astro +220 -220
  102. package/src/components/dropdown-menu/DropdownMenuItemContent.astro +79 -79
  103. package/src/components/dropdown-menu/DropdownMenuLabel.astro +20 -20
  104. package/src/components/dropdown-menu/DropdownMenuPortal.astro +13 -13
  105. package/src/components/dropdown-menu/DropdownMenuRadioGroup.astro +13 -13
  106. package/src/components/dropdown-menu/DropdownMenuRadioItem.astro +101 -101
  107. package/src/components/dropdown-menu/DropdownMenuSeparator.astro +18 -18
  108. package/src/components/dropdown-menu/DropdownMenuShortcut.astro +18 -18
  109. package/src/components/dropdown-menu/DropdownMenuTrigger.astro +49 -49
  110. package/src/components/dropdown-menu/dropdown-menu-item-variants.ts +24 -24
  111. package/src/components/dropdown-menu/index.ts +12 -12
  112. package/src/components/field/CHANGELOG.md +33 -33
  113. package/src/components/field/Field.astro +664 -664
  114. package/src/components/field/FieldContent.astro +20 -20
  115. package/src/components/field/FieldDescription.astro +22 -22
  116. package/src/components/field/FieldError.astro +51 -51
  117. package/src/components/field/FieldGroup.astro +20 -20
  118. package/src/components/field/FieldLabel.astro +22 -22
  119. package/src/components/field/FieldLegend.astro +23 -23
  120. package/src/components/field/FieldSeparator.astro +30 -30
  121. package/src/components/field/FieldSet.astro +20 -20
  122. package/src/components/field/FieldTitle.astro +20 -20
  123. package/src/components/field/index.ts +10 -10
  124. package/src/components/hover-card/CHANGELOG.md +20 -20
  125. package/src/components/hover-card/HoverCard.astro +235 -235
  126. package/src/components/hover-card/HoverCardContent.astro +54 -54
  127. package/src/components/hover-card/HoverCardTrigger.astro +38 -38
  128. package/src/components/hover-card/index.ts +3 -3
  129. package/src/components/input/CHANGELOG.md +44 -29
  130. package/src/components/input/Input.astro +130 -130
  131. package/src/components/input/InputOTP.astro +211 -0
  132. package/src/components/input/index.ts +2 -2
  133. package/src/components/input-group/CHANGELOG.md +49 -49
  134. package/src/components/input-group/InputGroup.astro +135 -135
  135. package/src/components/input-group/InputGroupAddon.astro +49 -49
  136. package/src/components/input-group/InputGroupButton.astro +58 -58
  137. package/src/components/input-group/InputGroupInput.astro +18 -18
  138. package/src/components/input-group/InputGroupText.astro +21 -21
  139. package/src/components/input-group/InputGroupTextarea.astro +17 -17
  140. package/src/components/input-group/controlClasses.ts +2 -2
  141. package/src/components/input-group/index.ts +6 -6
  142. package/src/components/item/CHANGELOG.md +27 -27
  143. package/src/components/item/Item.astro +122 -122
  144. package/src/components/item/ItemActions.astro +21 -21
  145. package/src/components/item/ItemContent.astro +25 -25
  146. package/src/components/item/ItemDescription.astro +25 -25
  147. package/src/components/item/ItemFooter.astro +24 -24
  148. package/src/components/item/ItemGroup.astro +24 -24
  149. package/src/components/item/ItemHeader.astro +24 -24
  150. package/src/components/item/ItemMedia.astro +47 -47
  151. package/src/components/item/ItemSeparator.astro +21 -21
  152. package/src/components/item/ItemTitle.astro +25 -25
  153. package/src/components/item/index.ts +10 -10
  154. package/src/components/kbd/CHANGELOG.md +5 -5
  155. package/src/components/kbd/Kbd.astro +145 -145
  156. package/src/components/kbd/KbdGroup.astro +55 -55
  157. package/src/components/kbd/index.ts +2 -2
  158. package/src/components/label/CHANGELOG.md +28 -28
  159. package/src/components/label/Label.astro +97 -97
  160. package/src/components/label/index.ts +2 -2
  161. package/src/components/link-group/CHANGELOG.md +75 -75
  162. package/src/components/link-group/LinkGroup.astro +67 -67
  163. package/src/components/link-group/LinkGroupItem.astro +32 -32
  164. package/src/components/link-group/LinkGroupList.astro +25 -25
  165. package/src/components/link-group/LinkGroupTitle.astro +22 -22
  166. package/src/components/link-group/index.ts +5 -5
  167. package/src/components/link-group/link-group-list-variants.ts +15 -15
  168. package/src/components/logo/CHANGELOG.md +17 -0
  169. package/src/components/logo/Logo.astro +90 -0
  170. package/src/components/logo/index.ts +3 -0
  171. package/src/components/logo/logo-paths.ts +57 -0
  172. package/src/components/marquee/CHANGELOG.md +5 -5
  173. package/src/components/marquee/Marquee.astro +119 -119
  174. package/src/components/marquee/index.ts +2 -2
  175. package/src/components/native-select/CHANGELOG.md +5 -5
  176. package/src/components/native-select/NativeSelect.astro +125 -125
  177. package/src/components/native-select/NativeSelectOptGroup.astro +14 -14
  178. package/src/components/native-select/NativeSelectOption.astro +9 -9
  179. package/src/components/native-select/index.ts +3 -3
  180. package/src/components/navigation-menu/CHANGELOG.md +63 -63
  181. package/src/components/navigation-menu/NavigationMenu.astro +414 -414
  182. package/src/components/navigation-menu/NavigationMenuContent.astro +37 -37
  183. package/src/components/navigation-menu/NavigationMenuIndicator.astro +24 -24
  184. package/src/components/navigation-menu/NavigationMenuItem.astro +22 -22
  185. package/src/components/navigation-menu/NavigationMenuLink.astro +18 -18
  186. package/src/components/navigation-menu/NavigationMenuList.astro +21 -21
  187. package/src/components/navigation-menu/NavigationMenuPositioner.astro +44 -44
  188. package/src/components/navigation-menu/NavigationMenuTrigger.astro +30 -30
  189. package/src/components/navigation-menu/NavigationMenuViewport.astro +19 -19
  190. package/src/components/navigation-menu/index.ts +10 -10
  191. package/src/components/organisms/lightning-sidebar-nav/CHANGELOG.md +50 -0
  192. package/src/components/organisms/lightning-sidebar-nav/LightningSidebarNav.astro +176 -0
  193. package/src/components/organisms/lightning-sidebar-nav/SidebarNav.astro +50 -0
  194. package/src/components/organisms/lightning-sidebar-nav/SidebarNavGroup.astro +74 -0
  195. package/src/components/organisms/lightning-sidebar-nav/SidebarNavItem.astro +94 -0
  196. package/src/components/organisms/lightning-sidebar-nav/SidebarNavProBadge.astro +26 -0
  197. package/src/components/organisms/lightning-sidebar-nav/SidebarNavSection.astro +71 -0
  198. package/src/components/organisms/lightning-sidebar-nav/SidebarNavSkeleton.astro +67 -0
  199. package/src/components/organisms/lightning-sidebar-nav/SidebarNavSubItem.astro +69 -0
  200. package/src/components/organisms/lightning-sidebar-nav/SidebarNavUsage.astro +78 -0
  201. package/src/components/organisms/lightning-sidebar-nav/SidebarNavWorkspaceAvatar.astro +46 -0
  202. package/src/components/organisms/lightning-sidebar-nav/SidebarNavWorkspaceSwitcher.astro +130 -0
  203. package/src/components/organisms/lightning-sidebar-nav/icons.ts +46 -0
  204. package/src/components/organisms/lightning-sidebar-nav/index.ts +18 -0
  205. package/src/components/organisms/lightning-sidebar-nav/types.ts +77 -0
  206. package/src/components/popover/CHANGELOG.md +20 -20
  207. package/src/components/popover/Popover.astro +211 -211
  208. package/src/components/popover/PopoverClose.astro +18 -18
  209. package/src/components/popover/PopoverContent.astro +50 -50
  210. package/src/components/popover/PopoverDescription.astro +18 -18
  211. package/src/components/popover/PopoverHeader.astro +18 -18
  212. package/src/components/popover/PopoverTitle.astro +18 -18
  213. package/src/components/popover/PopoverTrigger.astro +35 -35
  214. package/src/components/popover/index.ts +7 -7
  215. package/src/components/radio-group/CHANGELOG.md +31 -31
  216. package/src/components/radio-group/RadioGroup.astro +81 -81
  217. package/src/components/radio-group/RadioGroupItem.astro +51 -51
  218. package/src/components/radio-group/index.ts +3 -3
  219. package/src/components/select/CHANGELOG.md +39 -39
  220. package/src/components/select/Select.astro +373 -373
  221. package/src/components/select/SelectContent.astro +91 -91
  222. package/src/components/select/SelectGroup.astro +19 -19
  223. package/src/components/select/SelectItem.astro +48 -48
  224. package/src/components/select/SelectLabel.astro +18 -18
  225. package/src/components/select/SelectSeparator.astro +17 -17
  226. package/src/components/select/SelectTrigger.astro +34 -34
  227. package/src/components/select/SelectValue.astro +22 -22
  228. package/src/components/select/index.ts +8 -8
  229. package/src/components/separator/CHANGELOG.md +5 -5
  230. package/src/components/separator/Separator.astro +60 -60
  231. package/src/components/separator/index.ts +2 -2
  232. package/src/components/skeleton/CHANGELOG.md +5 -5
  233. package/src/components/skeleton/Skeleton.astro +121 -121
  234. package/src/components/skeleton/index.ts +1 -1
  235. package/src/components/slider/CHANGELOG.md +5 -5
  236. package/src/components/slider/Slider.astro +198 -198
  237. package/src/components/slider/index.ts +1 -1
  238. package/src/components/spinner/CHANGELOG.md +18 -18
  239. package/src/components/spinner/Spinner.astro +135 -135
  240. package/src/components/spinner/index.ts +1 -1
  241. package/src/components/sticky-surface/CHANGELOG.md +5 -5
  242. package/src/components/sticky-surface/StickySurface.astro +152 -152
  243. package/src/components/sticky-surface/index.ts +2 -2
  244. package/src/components/switch/CHANGELOG.md +29 -29
  245. package/src/components/switch/Switch.astro +106 -106
  246. package/src/components/switch/index.ts +1 -1
  247. package/src/components/table/CHANGELOG.md +24 -24
  248. package/src/components/table/Table.astro +358 -251
  249. package/src/components/table/TableBody.astro +17 -18
  250. package/src/components/table/TableBulkToolbar.astro +37 -0
  251. package/src/components/table/TableCaption.astro +17 -17
  252. package/src/components/table/TableCell.astro +45 -21
  253. package/src/components/table/TableCellText.astro +17 -0
  254. package/src/components/table/TableColumnMenu.astro +50 -0
  255. package/src/components/table/TableEditableCell.astro +287 -0
  256. package/src/components/table/TableEmpty.astro +17 -0
  257. package/src/components/table/TableFolderCell.astro +38 -0
  258. package/src/components/table/TableFooter.astro +21 -21
  259. package/src/components/table/TableHead.astro +90 -21
  260. package/src/components/table/TableHeader.astro +17 -17
  261. package/src/components/table/TablePagination.astro +57 -0
  262. package/src/components/table/TableRow.astro +52 -21
  263. package/src/components/table/TableSelectAllBanner.astro +34 -0
  264. package/src/components/table/TableSelectCell.astro +50 -0
  265. package/src/components/table/TableSkeletonRow.astro +21 -0
  266. package/src/components/table/index.ts +19 -9
  267. package/src/components/table/table-cell-variants.ts +29 -0
  268. package/src/components/tabs/CHANGELOG.md +5 -5
  269. package/src/components/tabs/Tabs.astro +306 -306
  270. package/src/components/tabs/TabsContent.astro +47 -47
  271. package/src/components/tabs/TabsList.astro +69 -69
  272. package/src/components/tabs/TabsTrigger.astro +40 -40
  273. package/src/components/tabs/index.ts +6 -6
  274. package/src/components/textarea/CHANGELOG.md +22 -22
  275. package/src/components/textarea/Textarea.astro +58 -58
  276. package/src/components/textarea/index.ts +2 -2
  277. package/src/components/toggle/CHANGELOG.md +23 -23
  278. package/src/components/toggle/Toggle.astro +150 -150
  279. package/src/components/toggle/index.ts +1 -1
  280. package/src/components/toggle-group/CHANGELOG.md +18 -18
  281. package/src/components/toggle-group/ToggleGroup.astro +236 -236
  282. package/src/components/toggle-group/ToggleGroupItem.astro +48 -48
  283. package/src/components/toggle-group/index.ts +2 -2
  284. package/src/components/tooltip/CHANGELOG.md +22 -22
  285. package/src/components/tooltip/Tooltip.astro +357 -357
  286. package/src/components/tooltip/TooltipContent.astro +85 -85
  287. package/src/components/tooltip/TooltipTrigger.astro +34 -34
  288. package/src/components/tooltip/index.ts +3 -3
  289. package/src/lib/table-controller.ts +1090 -0
  290. package/src/lib/toggle-group-controller.ts +113 -113
  291. package/src/lib/toggle-shared.ts +27 -27
  292. package/src/lib/utils.ts +6 -6
  293. package/src/styles/globals.css +209 -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>