@cl-light-ds/ui 0.1.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 (254) hide show
  1. package/README.md +45 -0
  2. package/package.json +59 -0
  3. package/src/components/accordion/Accordion.astro +248 -0
  4. package/src/components/accordion/AccordionContent.astro +26 -0
  5. package/src/components/accordion/AccordionItem.astro +36 -0
  6. package/src/components/accordion/AccordionTrigger.astro +118 -0
  7. package/src/components/accordion/CHANGELOG.md +41 -0
  8. package/src/components/accordion/index.ts +4 -0
  9. package/src/components/alert/Alert.astro +167 -0
  10. package/src/components/alert/AlertDescription.astro +24 -0
  11. package/src/components/alert/AlertTitle.astro +24 -0
  12. package/src/components/alert/CHANGELOG.md +5 -0
  13. package/src/components/alert/index.ts +4 -0
  14. package/src/components/avatar/Avatar.astro +197 -0
  15. package/src/components/avatar/AvatarBadge.astro +44 -0
  16. package/src/components/avatar/AvatarFallback.astro +26 -0
  17. package/src/components/avatar/AvatarGroup.astro +26 -0
  18. package/src/components/avatar/AvatarGroupCount.astro +30 -0
  19. package/src/components/avatar/AvatarImage.astro +46 -0
  20. package/src/components/avatar/CHANGELOG.md +44 -0
  21. package/src/components/avatar/index.ts +6 -0
  22. package/src/components/badge/Badge.astro +167 -0
  23. package/src/components/badge/CHANGELOG.md +49 -0
  24. package/src/components/badge/index.ts +2 -0
  25. package/src/components/breadcrumb/Breadcrumb.astro +76 -0
  26. package/src/components/breadcrumb/BreadcrumbItem.astro +32 -0
  27. package/src/components/breadcrumb/BreadcrumbList.astro +26 -0
  28. package/src/components/breadcrumb/BreadcrumbSeparator.astro +26 -0
  29. package/src/components/breadcrumb/CHANGELOG.md +24 -0
  30. package/src/components/breadcrumb/index.ts +5 -0
  31. package/src/components/button/Button.astro +233 -0
  32. package/src/components/button/CHANGELOG.md +41 -0
  33. package/src/components/button/index.ts +2 -0
  34. package/src/components/button-group/ButtonGroup.astro +130 -0
  35. package/src/components/button-group/ButtonGroupSeparator.astro +30 -0
  36. package/src/components/button-group/ButtonGroupText.astro +21 -0
  37. package/src/components/button-group/CHANGELOG.md +34 -0
  38. package/src/components/button-group/index.ts +3 -0
  39. package/src/components/card/CHANGELOG.md +119 -0
  40. package/src/components/card/Card.astro +182 -0
  41. package/src/components/card/CardAction.astro +26 -0
  42. package/src/components/card/CardContent.astro +28 -0
  43. package/src/components/card/CardDescription.astro +28 -0
  44. package/src/components/card/CardFooter.astro +24 -0
  45. package/src/components/card/CardHeader.astro +30 -0
  46. package/src/components/card/CardMedia.astro +27 -0
  47. package/src/components/card/CardOverlay.astro +32 -0
  48. package/src/components/card/CardTitle.astro +21 -0
  49. package/src/components/card/index.ts +10 -0
  50. package/src/components/carousel/CHANGELOG.md +5 -0
  51. package/src/components/carousel/Carousel.astro +106 -0
  52. package/src/components/carousel/CarouselSlide.astro +22 -0
  53. package/src/components/carousel/index.ts +3 -0
  54. package/src/components/checkbox/CHANGELOG.md +58 -0
  55. package/src/components/checkbox/Checkbox.astro +159 -0
  56. package/src/components/checkbox/index.ts +1 -0
  57. package/src/components/collapsible/CHANGELOG.md +5 -0
  58. package/src/components/collapsible/Collapsible.astro +202 -0
  59. package/src/components/collapsible/CollapsibleContent.astro +36 -0
  60. package/src/components/collapsible/CollapsibleTrigger.astro +34 -0
  61. package/src/components/collapsible/index.ts +4 -0
  62. package/src/components/combobox/CHANGELOG.md +27 -0
  63. package/src/components/combobox/Combobox.astro +365 -0
  64. package/src/components/combobox/ComboboxContent.astro +37 -0
  65. package/src/components/combobox/ComboboxEmpty.astro +18 -0
  66. package/src/components/combobox/ComboboxGroup.astro +19 -0
  67. package/src/components/combobox/ComboboxInput.astro +74 -0
  68. package/src/components/combobox/ComboboxItem.astro +39 -0
  69. package/src/components/combobox/ComboboxLabel.astro +18 -0
  70. package/src/components/combobox/ComboboxList.astro +21 -0
  71. package/src/components/combobox/ComboboxSeparator.astro +17 -0
  72. package/src/components/combobox/ComboboxTrigger.astro +30 -0
  73. package/src/components/combobox/ComboboxValue.astro +22 -0
  74. package/src/components/combobox/index.ts +11 -0
  75. package/src/components/date/CHANGELOG.md +18 -0
  76. package/src/components/date/Date.astro +137 -0
  77. package/src/components/date/index.ts +2 -0
  78. package/src/components/dialog/CHANGELOG.md +39 -0
  79. package/src/components/dialog/Dialog.astro +196 -0
  80. package/src/components/dialog/DialogClose.astro +23 -0
  81. package/src/components/dialog/DialogContent.astro +42 -0
  82. package/src/components/dialog/DialogDescription.astro +18 -0
  83. package/src/components/dialog/DialogFooter.astro +18 -0
  84. package/src/components/dialog/DialogHeader.astro +18 -0
  85. package/src/components/dialog/DialogOverlay.astro +19 -0
  86. package/src/components/dialog/DialogTitle.astro +18 -0
  87. package/src/components/dialog/DialogTrigger.astro +37 -0
  88. package/src/components/dialog/index.ts +9 -0
  89. package/src/components/dropdown-menu/CHANGELOG.md +194 -0
  90. package/src/components/dropdown-menu/DropdownMenu.astro +226 -0
  91. package/src/components/dropdown-menu/DropdownMenuCheckboxItem.astro +114 -0
  92. package/src/components/dropdown-menu/DropdownMenuContent.astro +42 -0
  93. package/src/components/dropdown-menu/DropdownMenuGroup.astro +19 -0
  94. package/src/components/dropdown-menu/DropdownMenuItem.astro +220 -0
  95. package/src/components/dropdown-menu/DropdownMenuItemContent.astro +79 -0
  96. package/src/components/dropdown-menu/DropdownMenuLabel.astro +20 -0
  97. package/src/components/dropdown-menu/DropdownMenuPortal.astro +13 -0
  98. package/src/components/dropdown-menu/DropdownMenuRadioGroup.astro +13 -0
  99. package/src/components/dropdown-menu/DropdownMenuRadioItem.astro +101 -0
  100. package/src/components/dropdown-menu/DropdownMenuSeparator.astro +18 -0
  101. package/src/components/dropdown-menu/DropdownMenuShortcut.astro +18 -0
  102. package/src/components/dropdown-menu/DropdownMenuTrigger.astro +49 -0
  103. package/src/components/dropdown-menu/dropdown-menu-item-variants.ts +24 -0
  104. package/src/components/dropdown-menu/index.ts +12 -0
  105. package/src/components/field/CHANGELOG.md +33 -0
  106. package/src/components/field/Field.astro +664 -0
  107. package/src/components/field/FieldContent.astro +20 -0
  108. package/src/components/field/FieldDescription.astro +22 -0
  109. package/src/components/field/FieldError.astro +51 -0
  110. package/src/components/field/FieldGroup.astro +20 -0
  111. package/src/components/field/FieldLabel.astro +22 -0
  112. package/src/components/field/FieldLegend.astro +23 -0
  113. package/src/components/field/FieldSeparator.astro +30 -0
  114. package/src/components/field/FieldSet.astro +20 -0
  115. package/src/components/field/FieldTitle.astro +20 -0
  116. package/src/components/field/index.ts +10 -0
  117. package/src/components/hover-card/CHANGELOG.md +20 -0
  118. package/src/components/hover-card/HoverCard.astro +235 -0
  119. package/src/components/hover-card/HoverCardContent.astro +54 -0
  120. package/src/components/hover-card/HoverCardTrigger.astro +38 -0
  121. package/src/components/hover-card/index.ts +3 -0
  122. package/src/components/input/CHANGELOG.md +29 -0
  123. package/src/components/input/Input.astro +130 -0
  124. package/src/components/input/index.ts +2 -0
  125. package/src/components/input-group/CHANGELOG.md +49 -0
  126. package/src/components/input-group/InputGroup.astro +135 -0
  127. package/src/components/input-group/InputGroupAddon.astro +49 -0
  128. package/src/components/input-group/InputGroupButton.astro +58 -0
  129. package/src/components/input-group/InputGroupInput.astro +18 -0
  130. package/src/components/input-group/InputGroupText.astro +21 -0
  131. package/src/components/input-group/InputGroupTextarea.astro +17 -0
  132. package/src/components/input-group/controlClasses.ts +2 -0
  133. package/src/components/input-group/index.ts +6 -0
  134. package/src/components/item/CHANGELOG.md +27 -0
  135. package/src/components/item/Item.astro +122 -0
  136. package/src/components/item/ItemActions.astro +21 -0
  137. package/src/components/item/ItemContent.astro +25 -0
  138. package/src/components/item/ItemDescription.astro +25 -0
  139. package/src/components/item/ItemFooter.astro +24 -0
  140. package/src/components/item/ItemGroup.astro +24 -0
  141. package/src/components/item/ItemHeader.astro +24 -0
  142. package/src/components/item/ItemMedia.astro +47 -0
  143. package/src/components/item/ItemSeparator.astro +21 -0
  144. package/src/components/item/ItemTitle.astro +25 -0
  145. package/src/components/item/index.ts +10 -0
  146. package/src/components/kbd/CHANGELOG.md +5 -0
  147. package/src/components/kbd/Kbd.astro +145 -0
  148. package/src/components/kbd/KbdGroup.astro +55 -0
  149. package/src/components/kbd/index.ts +2 -0
  150. package/src/components/label/CHANGELOG.md +28 -0
  151. package/src/components/label/Label.astro +97 -0
  152. package/src/components/label/index.ts +2 -0
  153. package/src/components/link-group/CHANGELOG.md +75 -0
  154. package/src/components/link-group/LinkGroup.astro +67 -0
  155. package/src/components/link-group/LinkGroupItem.astro +32 -0
  156. package/src/components/link-group/LinkGroupList.astro +25 -0
  157. package/src/components/link-group/LinkGroupTitle.astro +22 -0
  158. package/src/components/link-group/index.ts +5 -0
  159. package/src/components/link-group/link-group-list-variants.ts +15 -0
  160. package/src/components/marquee/CHANGELOG.md +5 -0
  161. package/src/components/marquee/Marquee.astro +119 -0
  162. package/src/components/marquee/index.ts +2 -0
  163. package/src/components/native-select/CHANGELOG.md +5 -0
  164. package/src/components/native-select/NativeSelect.astro +125 -0
  165. package/src/components/native-select/NativeSelectOptGroup.astro +14 -0
  166. package/src/components/native-select/NativeSelectOption.astro +9 -0
  167. package/src/components/native-select/index.ts +3 -0
  168. package/src/components/navigation-menu/CHANGELOG.md +63 -0
  169. package/src/components/navigation-menu/NavigationMenu.astro +414 -0
  170. package/src/components/navigation-menu/NavigationMenuContent.astro +37 -0
  171. package/src/components/navigation-menu/NavigationMenuIndicator.astro +24 -0
  172. package/src/components/navigation-menu/NavigationMenuItem.astro +22 -0
  173. package/src/components/navigation-menu/NavigationMenuLink.astro +18 -0
  174. package/src/components/navigation-menu/NavigationMenuList.astro +21 -0
  175. package/src/components/navigation-menu/NavigationMenuPositioner.astro +44 -0
  176. package/src/components/navigation-menu/NavigationMenuTrigger.astro +30 -0
  177. package/src/components/navigation-menu/NavigationMenuViewport.astro +19 -0
  178. package/src/components/navigation-menu/index.ts +10 -0
  179. package/src/components/popover/CHANGELOG.md +5 -0
  180. package/src/components/popover/Popover.astro +210 -0
  181. package/src/components/popover/PopoverClose.astro +18 -0
  182. package/src/components/popover/PopoverContent.astro +49 -0
  183. package/src/components/popover/PopoverDescription.astro +18 -0
  184. package/src/components/popover/PopoverHeader.astro +18 -0
  185. package/src/components/popover/PopoverTitle.astro +18 -0
  186. package/src/components/popover/PopoverTrigger.astro +29 -0
  187. package/src/components/popover/index.ts +7 -0
  188. package/src/components/radio-group/CHANGELOG.md +9 -0
  189. package/src/components/radio-group/RadioGroup.astro +81 -0
  190. package/src/components/radio-group/RadioGroupItem.astro +42 -0
  191. package/src/components/radio-group/index.ts +3 -0
  192. package/src/components/select/CHANGELOG.md +39 -0
  193. package/src/components/select/Select.astro +373 -0
  194. package/src/components/select/SelectContent.astro +91 -0
  195. package/src/components/select/SelectGroup.astro +19 -0
  196. package/src/components/select/SelectItem.astro +48 -0
  197. package/src/components/select/SelectLabel.astro +18 -0
  198. package/src/components/select/SelectSeparator.astro +17 -0
  199. package/src/components/select/SelectTrigger.astro +34 -0
  200. package/src/components/select/SelectValue.astro +22 -0
  201. package/src/components/select/index.ts +8 -0
  202. package/src/components/separator/CHANGELOG.md +5 -0
  203. package/src/components/separator/Separator.astro +60 -0
  204. package/src/components/separator/index.ts +2 -0
  205. package/src/components/skeleton/CHANGELOG.md +5 -0
  206. package/src/components/skeleton/Skeleton.astro +121 -0
  207. package/src/components/skeleton/index.ts +1 -0
  208. package/src/components/slider/CHANGELOG.md +5 -0
  209. package/src/components/slider/Slider.astro +198 -0
  210. package/src/components/slider/index.ts +1 -0
  211. package/src/components/spinner/CHANGELOG.md +5 -0
  212. package/src/components/spinner/Spinner.astro +134 -0
  213. package/src/components/spinner/index.ts +1 -0
  214. package/src/components/sticky-surface/CHANGELOG.md +5 -0
  215. package/src/components/sticky-surface/StickySurface.astro +152 -0
  216. package/src/components/sticky-surface/index.ts +2 -0
  217. package/src/components/switch/CHANGELOG.md +9 -0
  218. package/src/components/switch/Switch.astro +106 -0
  219. package/src/components/switch/index.ts +1 -0
  220. package/src/components/table/CHANGELOG.md +5 -0
  221. package/src/components/table/Table.astro +250 -0
  222. package/src/components/table/TableBody.astro +18 -0
  223. package/src/components/table/TableCaption.astro +17 -0
  224. package/src/components/table/TableCell.astro +21 -0
  225. package/src/components/table/TableFooter.astro +21 -0
  226. package/src/components/table/TableHead.astro +21 -0
  227. package/src/components/table/TableHeader.astro +17 -0
  228. package/src/components/table/TableRow.astro +21 -0
  229. package/src/components/table/index.ts +9 -0
  230. package/src/components/tabs/CHANGELOG.md +5 -0
  231. package/src/components/tabs/Tabs.astro +306 -0
  232. package/src/components/tabs/TabsContent.astro +47 -0
  233. package/src/components/tabs/TabsList.astro +69 -0
  234. package/src/components/tabs/TabsTrigger.astro +40 -0
  235. package/src/components/tabs/index.ts +6 -0
  236. package/src/components/textarea/CHANGELOG.md +5 -0
  237. package/src/components/textarea/Textarea.astro +36 -0
  238. package/src/components/textarea/index.ts +2 -0
  239. package/src/components/toggle/CHANGELOG.md +5 -0
  240. package/src/components/toggle/Toggle.astro +138 -0
  241. package/src/components/toggle/index.ts +1 -0
  242. package/src/components/toggle-group/CHANGELOG.md +5 -0
  243. package/src/components/toggle-group/ToggleGroup.astro +224 -0
  244. package/src/components/toggle-group/ToggleGroupItem.astro +48 -0
  245. package/src/components/toggle-group/index.ts +2 -0
  246. package/src/components/tooltip/CHANGELOG.md +5 -0
  247. package/src/components/tooltip/Tooltip.astro +331 -0
  248. package/src/components/tooltip/TooltipContent.astro +60 -0
  249. package/src/components/tooltip/TooltipTrigger.astro +34 -0
  250. package/src/components/tooltip/index.ts +3 -0
  251. package/src/lib/toggle-group-controller.ts +113 -0
  252. package/src/lib/toggle-shared.ts +26 -0
  253. package/src/lib/utils.ts +6 -0
  254. package/src/styles/globals.css +177 -0
@@ -0,0 +1,21 @@
1
+ ---
2
+ import { cn } from "@cl-light-ds/ui/lib/utils";
3
+ import type { HTMLAttributes } from "astro/types";
4
+
5
+ interface Props extends HTMLAttributes<"div"> {
6
+ class?: string;
7
+ }
8
+
9
+ const {
10
+ class: className = "",
11
+ ...rest
12
+ } = Astro.props as Props;
13
+ ---
14
+
15
+ <div
16
+ {...rest}
17
+ data-slot="item-actions"
18
+ class={cn("gap-2 flex items-center", className)}
19
+ >
20
+ <slot />
21
+ </div>
@@ -0,0 +1,25 @@
1
+ ---
2
+ import { cn } from "@cl-light-ds/ui/lib/utils";
3
+ import type { HTMLAttributes } from "astro/types";
4
+
5
+ interface Props extends HTMLAttributes<"div"> {
6
+ class?: string;
7
+ }
8
+
9
+ const {
10
+ class: className = "",
11
+ ...rest
12
+ } = Astro.props as Props;
13
+ ---
14
+
15
+ <div
16
+ {...rest}
17
+ data-slot="item-content"
18
+ class={cn(
19
+ "gap-1",
20
+ "flex flex-1 flex-col [&+[data-slot=item-content]]:flex-none",
21
+ className,
22
+ )}
23
+ >
24
+ <slot />
25
+ </div>
@@ -0,0 +1,25 @@
1
+ ---
2
+ import { cn } from "@cl-light-ds/ui/lib/utils";
3
+ import type { HTMLAttributes } from "astro/types";
4
+
5
+ interface Props extends HTMLAttributes<"p"> {
6
+ class?: string;
7
+ }
8
+
9
+ const {
10
+ class: className = "",
11
+ ...rest
12
+ } = Astro.props as Props;
13
+ ---
14
+
15
+ <p
16
+ {...rest}
17
+ data-slot="item-description"
18
+ class={cn(
19
+ "text-muted-foreground text-left text-sm leading-normal",
20
+ "line-clamp-2 text-balance",
21
+ className,
22
+ )}
23
+ >
24
+ <slot />
25
+ </p>
@@ -0,0 +1,24 @@
1
+ ---
2
+ import { cn } from "@cl-light-ds/ui/lib/utils";
3
+ import type { HTMLAttributes } from "astro/types";
4
+
5
+ interface Props extends HTMLAttributes<"div"> {
6
+ class?: string;
7
+ }
8
+
9
+ const {
10
+ class: className = "",
11
+ ...rest
12
+ } = Astro.props as Props;
13
+ ---
14
+
15
+ <div
16
+ {...rest}
17
+ data-slot="item-footer"
18
+ class={cn(
19
+ "gap-2 flex basis-full items-center justify-between",
20
+ className,
21
+ )}
22
+ >
23
+ <slot />
24
+ </div>
@@ -0,0 +1,24 @@
1
+ ---
2
+ import { cn } from "@cl-light-ds/ui/lib/utils";
3
+ import type { HTMLAttributes, HTMLTag } from "astro/types";
4
+
5
+ interface Props extends HTMLAttributes<"div"> {
6
+ as?: HTMLTag;
7
+ class?: string;
8
+ }
9
+
10
+ const {
11
+ as: Tag = "div",
12
+ class: className = "",
13
+ ...rest
14
+ } = Astro.props as Props;
15
+ ---
16
+
17
+ <Tag
18
+ {...rest}
19
+ role="list"
20
+ data-slot="item-group"
21
+ class={cn("gap-4 has-data-[size=sm]:gap-2.5 group/item-group flex flex-col", className)}
22
+ >
23
+ <slot />
24
+ </Tag>
@@ -0,0 +1,24 @@
1
+ ---
2
+ import { cn } from "@cl-light-ds/ui/lib/utils";
3
+ import type { HTMLAttributes } from "astro/types";
4
+
5
+ interface Props extends HTMLAttributes<"div"> {
6
+ class?: string;
7
+ }
8
+
9
+ const {
10
+ class: className = "",
11
+ ...rest
12
+ } = Astro.props as Props;
13
+ ---
14
+
15
+ <div
16
+ {...rest}
17
+ data-slot="item-header"
18
+ class={cn(
19
+ "gap-2 flex basis-full items-center justify-between",
20
+ className,
21
+ )}
22
+ >
23
+ <slot />
24
+ </div>
@@ -0,0 +1,47 @@
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
+ type ItemMediaVariant = "default" | "icon" | "image";
7
+
8
+ interface Props extends HTMLAttributes<"div"> {
9
+ mediaVariant?: ItemMediaVariant;
10
+ class?: string;
11
+ }
12
+
13
+ const {
14
+ class: className = "",
15
+ mediaVariant = "default",
16
+ ...rest
17
+ } = Astro.props as Props;
18
+
19
+ const itemMediaVariants = cva(
20
+ "flex shrink-0 items-center justify-center [&_svg]:pointer-events-none group-has-[[data-slot=item-description]]/item:self-start group-has-[[data-slot=item-description]]/item:translate-y-0.5 group-data-[size=header]/item:translate-y-0 group-data-[size=header]/item:self-auto",
21
+ {
22
+ variants: {
23
+ variant: {
24
+ default: "bg-transparent",
25
+ icon: "[&_svg:not([class*='size-'])]:size-4",
26
+ image:
27
+ "size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=header]/item:size-auto group-data-[size=header]/item:w-full group-data-[size=header]/item:aspect-square [&_img]:size-full [&_img]:object-cover",
28
+ },
29
+ },
30
+ defaultVariants: {
31
+ variant: "default",
32
+ },
33
+ },
34
+ );
35
+ ---
36
+
37
+ <div
38
+ {...rest}
39
+ data-slot="item-media"
40
+ class={cn(
41
+ "gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start group-data-[size=header]/item:translate-y-0 group-data-[size=header]/item:self-auto",
42
+ itemMediaVariants({ variant: mediaVariant }),
43
+ className,
44
+ )}
45
+ >
46
+ <slot />
47
+ </div>
@@ -0,0 +1,21 @@
1
+ ---
2
+ import { cn } from "@cl-light-ds/ui/lib/utils";
3
+ import { Separator } from "../separator";
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
+
16
+ <Separator
17
+ {...rest}
18
+ data-slot="item-separator"
19
+ aria-hidden="true"
20
+ class={cn("my-2", className)}
21
+ />
@@ -0,0 +1,25 @@
1
+ ---
2
+ import { cn } from "@cl-light-ds/ui/lib/utils";
3
+ import type { HTMLAttributes } from "astro/types";
4
+
5
+ interface Props extends HTMLAttributes<"div"> {
6
+ class?: string;
7
+ }
8
+
9
+ const {
10
+ class: className = "",
11
+ ...rest
12
+ } = Astro.props as Props;
13
+ ---
14
+
15
+ <div
16
+ {...rest}
17
+ data-slot="item-title"
18
+ class={cn(
19
+ "gap-2 text-sm leading-snug font-semibold underline-offset-4 cn-font-heading",
20
+ "flex w-fit items-center",
21
+ className,
22
+ )}
23
+ >
24
+ <slot />
25
+ </div>
@@ -0,0 +1,10 @@
1
+ export { default as Item } from "./Item.astro";
2
+ export { default as ItemActions } from "./ItemActions.astro";
3
+ export { default as ItemContent } from "./ItemContent.astro";
4
+ export { default as ItemDescription } from "./ItemDescription.astro";
5
+ export { default as ItemFooter } from "./ItemFooter.astro";
6
+ export { default as ItemGroup } from "./ItemGroup.astro";
7
+ export { default as ItemHeader } from "./ItemHeader.astro";
8
+ export { default as ItemMedia } from "./ItemMedia.astro";
9
+ export { default as ItemSeparator } from "./ItemSeparator.astro";
10
+ export { default as ItemTitle } from "./ItemTitle.astro";
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ All notable changes to the `Kbd` component will be documented in this file.
4
+
5
+ ## Unreleased
@@ -0,0 +1,145 @@
1
+ ---
2
+ /**
3
+ * @component Kbd
4
+ * @title Kbd
5
+ * @description A visual indicator for keyboard keys and shortcuts, styled to match system keyboard key appearance.
6
+ * @status stable
7
+ *
8
+ * @preview
9
+ *
10
+ * <div class="flex flex-col items-center gap-4">
11
+ * <KbdGroup>
12
+ * <Kbd>⌘</Kbd>
13
+ * <Kbd>⇧</Kbd>
14
+ * <Kbd>⌥</Kbd>
15
+ * <Kbd>⌃</Kbd>
16
+ * </KbdGroup>
17
+ * <KbdGroup>
18
+ * <Kbd>Ctrl</Kbd>
19
+ * <span>+</span>
20
+ * <Kbd>B</Kbd>
21
+ * </KbdGroup>
22
+ * <KbdGroup>
23
+ * <Kbd>⌘</Kbd>
24
+ * <Kbd>K</Kbd>
25
+ * </KbdGroup>
26
+ * </div>
27
+ *
28
+ * @usage
29
+ *
30
+ * ```astro nocollapse
31
+ * ---
32
+ * import { Kbd, KbdGroup } from '@bejamas/ui/components/kbd';
33
+ * ---
34
+ *
35
+ * <KbdGroup>
36
+ * <Kbd>⌘</Kbd>
37
+ * <Kbd>K</Kbd>
38
+ * </KbdGroup>
39
+ *
40
+ * <KbdGroup>
41
+ * <Kbd>Ctrl</Kbd>
42
+ * <span>+</span>
43
+ * <Kbd>B</Kbd>
44
+ * </KbdGroup>
45
+ * ```
46
+ *
47
+ * @examples
48
+ *
49
+ * ### Group
50
+ *
51
+ * Use the `KbdGroup` component to group keyboard keys together.
52
+ *
53
+ * <div class="flex flex-col items-center gap-4">
54
+ * <p class="text-muted-foreground text-sm">
55
+ * Use{" "}
56
+ * <KbdGroup>
57
+ * <Kbd>Ctrl + B</Kbd>
58
+ * <Kbd>Ctrl + K</Kbd>
59
+ * </KbdGroup>{" "}
60
+ * to open the command palette
61
+ * </p>
62
+ * </div>
63
+ *
64
+ * ### Button
65
+ *
66
+ * Use the `Kbd` component inside a `Button` component to display a keyboard key inside a button.
67
+ *
68
+ * <Button variant="outline">
69
+ * Accept <Kbd class="translate-x-0.5">
70
+ * ⏎
71
+ * </Kbd>
72
+ * </Button>
73
+ *
74
+ * ### Tooltip
75
+ *
76
+ * You can use the `Kbd` component inside a `Tooltip` component to display a tooltip with a keyboard key.
77
+ *
78
+ * <div class="flex flex-wrap gap-4">
79
+ * <Tooltip>
80
+ * <TooltipTrigger asChild>
81
+ * <Button variant="outline">Save</Button>
82
+ * </TooltipTrigger>
83
+ * <TooltipContent class="pr-1.5">
84
+ * <div class="flex items-center gap-2">
85
+ * Save Changes <Kbd>S</Kbd>
86
+ * </div>
87
+ * </TooltipContent>
88
+ * </Tooltip>
89
+ * <Tooltip>
90
+ * <TooltipTrigger asChild>
91
+ * <Button variant="outline">Print</Button>
92
+ * </TooltipTrigger>
93
+ * <TooltipContent class="pr-1.5">
94
+ * <div class="flex items-center gap-2">
95
+ * Print Document <KbdGroup>
96
+ * <Kbd>Ctrl</Kbd>
97
+ * <Kbd>P</Kbd>
98
+ * </KbdGroup>
99
+ * </div>
100
+ * </TooltipContent>
101
+ * </Tooltip>
102
+ * </div>
103
+ *
104
+ * ### Input Group
105
+ *
106
+ * You can use the `Kbd` component inside a `InputGroupAddon` component to display a keyboard key inside an input group.
107
+ *
108
+ * <div class="flex w-full max-w-xs flex-col gap-6">
109
+ * <InputGroup>
110
+ * <InputGroupInput placeholder="Search..." />
111
+ * <InputGroupAddon>
112
+ * <SearchIcon />
113
+ * </InputGroupAddon>
114
+ * <InputGroupAddon align="inline-end">
115
+ * <Kbd>⌘</Kbd>
116
+ * <Kbd>K</Kbd>
117
+ * </InputGroupAddon>
118
+ * </InputGroup>
119
+ * </div>
120
+ *
121
+ * @props
122
+ * - class?: string — Additional classes for styling.
123
+ */
124
+
125
+ import { cn } from "@cl-light-ds/ui/lib/utils";
126
+
127
+ const { class: className = "", ...props } = Astro.props;
128
+ ---
129
+
130
+ <kbd
131
+ data-slot="kbd"
132
+ class={cn("bg-muted text-muted-foreground in-data-[slot=tooltip-content]:bg-background/20 in-data-[slot=tooltip-content]:text-background dark:in-data-[slot=tooltip-content]:bg-background/10 h-5 w-fit min-w-5 gap-1 rounded-sm px-1 font-sans text-xs font-medium [&_svg:not([class*='size-'])]:size-3",
133
+ "bg-muted text-muted-foreground",
134
+ "[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background",
135
+ "dark:[[data-slot=tooltip-content]_&]:bg-background/10",
136
+ "h-5 w-fit min-w-5 gap-1 rounded-sm px-1",
137
+ "font-sans text-xs font-medium",
138
+ "[&_svg:not([class*='size-'])]:size-3",
139
+ "pointer-events-none inline-flex items-center justify-center select-none",
140
+ className,
141
+ )}
142
+ {...props}
143
+ >
144
+ <slot />
145
+ </kbd>
@@ -0,0 +1,55 @@
1
+ ---
2
+ /**
3
+ * @component KbdGroup
4
+ * @title Keyboard Key Group
5
+ * @description A container for grouping multiple keyboard keys together, typically used for displaying keyboard shortcuts.
6
+ * @status stable
7
+ *
8
+ * @preview
9
+ *
10
+ * <div class="flex flex-col items-center gap-4">
11
+ * <KbdGroup>
12
+ * <Kbd>⌘</Kbd>
13
+ * <Kbd>⇧</Kbd>
14
+ * <Kbd>⌥</Kbd>
15
+ * <Kbd>⌃</Kbd>
16
+ * </KbdGroup>
17
+ * <KbdGroup>
18
+ * <Kbd>Ctrl</Kbd>
19
+ * <span>+</span>
20
+ * <Kbd>B</Kbd>
21
+ * </KbdGroup>
22
+ * </div>
23
+ *
24
+ * @usage
25
+ *
26
+ * ```astro nocollapse
27
+ * ---
28
+ * import { Kbd, KbdGroup } from '@bejamas/ui/components/kbd';
29
+ * ---
30
+ *
31
+ * <KbdGroup>
32
+ * <Kbd>⌘</Kbd>
33
+ * <Kbd>K</Kbd>
34
+ * </KbdGroup>
35
+ * ```
36
+ *
37
+ * @props
38
+ * - class?: string — Additional classes for styling.
39
+ */
40
+
41
+ import { cn } from "@cl-light-ds/ui/lib/utils";
42
+
43
+ const {
44
+ class: className = "",
45
+ ...props
46
+ } = Astro.props;
47
+ ---
48
+
49
+ <div
50
+ data-slot="kbd-group"
51
+ class={cn("gap-1", "gap-1 inline-flex items-center", className)}
52
+ {...props}
53
+ >
54
+ <slot />
55
+ </div>
@@ -0,0 +1,2 @@
1
+ export { default as Kbd } from "./Kbd.astro";
2
+ export { default as KbdGroup } from "./KbdGroup.astro";
@@ -0,0 +1,28 @@
1
+ # Changelog
2
+
3
+ All notable changes to the `Label` component will be documented in this file.
4
+
5
+ ## Date 10th Sep 2026
6
+ ## Figma alignment (node 7228-1290, prop table 7423-9892)
7
+
8
+ ### Fixed
9
+
10
+ - Removed a copy-paste duplicate class string passed twice into `cn()`.
11
+ - Dropped `leading-none` on the label text — it collapsed the line-height to 1, whereas Figma's `text/md/md-medium` style specifies a 20px line-height, which Tailwind's `text-sm` already provides by default.
12
+ - Added explicit `text-foreground` for the default-state text color, matching Figma's `var(--foreground)` token (previously relied on ambient inherited color).
13
+
14
+ ### Added
15
+
16
+ New props, matching Figma's Props Reference table:
17
+
18
+ - `supportiveText?: string` — optional secondary text rendered below the label.
19
+ - `showSupportiveText?: boolean` (default `false`) — shows the `supportiveText` line when both this and `supportiveText` are set.
20
+ - `showHintIcon?: boolean` (default `false`) — shows a small `CircleQuestionMark` icon (`@lucide/astro`) beside the label text.
21
+
22
+ Figma's table documents both new booleans defaulting to `true`, but they default to `false` here: defaulting to `true` would have made a hint icon appear next to every existing `<Label>` in the app that doesn't already opt out, since no current usage passes these props. Opt-in keeps every existing call site (including `Checkbox`'s and `FieldLabel`'s compositions) visually unchanged.
23
+
24
+ The `label` prop documented in Figma's table was intentionally not added — every caller in this repo supplies label text via `<slot />` (e.g. `FieldLabel.astro`), so the slot remains the sole content API.
25
+
26
+ The new layout (label text + icon row, supportive text below) only applies when `showHintIcon` or `showSupportiveText`+`supportiveText` are actually used (`hasExtras`); otherwise the label renders with the exact same classes as before (`flex items-center gap-2 ...`), so it doesn't disturb consumers that override the root layout themselves (e.g. the side-by-side custom composition in `Checkbox.astro`'s JSDoc preview).
27
+
28
+ No explicit `disabled` prop was added — disabled styling continues to come from the existing `group-data-[disabled=true]` / `peer-disabled` CSS hooks tied to a sibling control, unchanged.
@@ -0,0 +1,97 @@
1
+ ---
2
+ /**
3
+ * @component Label
4
+ * @title Label
5
+ * @description A text label for form controls.
6
+ * @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=7228-1290
7
+ *
8
+ * @preview
9
+ *
10
+ * <div class="flex items-center space-x-2">
11
+ * <Checkbox id="terms" />
12
+ * <Label for="terms">Accept terms and conditions</Label>
13
+ * </div>
14
+ *
15
+ * @usage
16
+ *
17
+ * ```astro nocollapse
18
+ * ---
19
+ * import { Label } from '@bejamas/ui/components/label';
20
+ * ---
21
+ *
22
+ * <Label for="terms">Accept terms and conditions</Label>
23
+ * ```
24
+ *
25
+ * @examples
26
+ *
27
+ * ### With supportive text
28
+ *
29
+ * <Label for="first-name" supportiveText="Enter your legal first name" showSupportiveText>
30
+ * First Name
31
+ * </Label>
32
+ *
33
+ * ### With hint icon
34
+ *
35
+ * <Label for="corporate-id" showHintIcon>Corporate ID</Label>
36
+ *
37
+ * ### With hint icon and supportive text
38
+ *
39
+ * <Label
40
+ * for="corporate-id-2"
41
+ * showHintIcon
42
+ * supportiveText="Contact admin to enable"
43
+ * showSupportiveText
44
+ * >
45
+ * Corporate ID
46
+ * </Label>
47
+ */
48
+
49
+ import { CircleQuestionMark } from "@lucide/astro";
50
+ import { cn } from "@cl-light-ds/ui/lib/utils";
51
+ import type { HTMLAttributes } from "astro/types";
52
+
53
+ interface Props extends HTMLAttributes<"label"> {
54
+ class?: string;
55
+ supportiveText?: string;
56
+ showSupportiveText?: boolean;
57
+ showHintIcon?: boolean;
58
+ }
59
+
60
+ const {
61
+ class: className = "",
62
+ supportiveText,
63
+ showSupportiveText = false,
64
+ showHintIcon = false,
65
+ ...props
66
+ } = Astro.props as Props;
67
+
68
+ const hasSupportiveText = showSupportiveText && !!supportiveText;
69
+ const hasExtras = showHintIcon || hasSupportiveText;
70
+ ---
71
+
72
+ <label
73
+ data-slot="label"
74
+ class={cn(
75
+ "flex items-center gap-2 text-sm font-medium text-foreground select-none",
76
+ "group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed",
77
+ hasExtras && "flex-col items-start gap-1",
78
+ className,
79
+ )}
80
+ {...props}
81
+ >
82
+ {hasExtras ? (
83
+ <span data-slot="label-text" class="flex items-center gap-2">
84
+ <slot />
85
+ {showHintIcon && (
86
+ <CircleQuestionMark data-slot="label-hint-icon" class="size-3.5 shrink-0 text-muted-foreground" aria-hidden="true" />
87
+ )}
88
+ </span>
89
+ ) : (
90
+ <slot />
91
+ )}
92
+ {hasSupportiveText && (
93
+ <span data-slot="label-supportive-text" class="text-xs font-medium text-muted-foreground">
94
+ {supportiveText}
95
+ </span>
96
+ )}
97
+ </label>
@@ -0,0 +1,2 @@
1
+ export { default as Label } from "./Label.astro";
2
+
@@ -0,0 +1,75 @@
1
+ # Changelog
2
+
3
+ All notable changes to the `LinkGroup` component will be documented in this file.
4
+
5
+ ## Date 10th Sep 2026
6
+ ## Figma alignment (node 2329-7942, item node 2166-5713)
7
+
8
+ `LinkGroup`/`LinkGroupItem`/`LinkGroupList`/`LinkGroupTitle` had not yet gone through a Figma alignment
9
+ pass — `@figmaUrl` still pointed at the old Bejamas source file, and most typography/padding/state classes
10
+ were either missing entirely or on the wrong scale.
11
+
12
+ ### Variants
13
+
14
+ - Added an `orientation` prop to `LinkGroupList` (`"vertical" | "horizontal"`, default `"vertical"`) via a
15
+ new `link-group-list-variants.ts` (`cva`), matching Figma's `Orientation=Vertical/Horizontal` variant
16
+ property on the "Link Group" component — previously the list was hardcoded to a vertical `flex-col` with
17
+ no way to render Figma's Horizontal variant at all.
18
+
19
+ ### Sizing & Spacing
20
+
21
+ - **`LinkGroupList`:** `gap-1` (4px) → `gap-2` (8px) — Figma's list uses `spacing/2` (8px) between items, not 4px.
22
+ - **`LinkGroupItem`:** the slotted `<a>` had no font-size, weight, line-height, padding, or radius at all —
23
+ added `text-sm font-medium leading-5` (Figma's `text/md/md-medium`, 14px/500/20px), `p-0.5 rounded-lg`
24
+ (Figma's `padding/p-0.5` = 2px, `radius/rounded-lg` = 8px).
25
+ - **`LinkGroupTitle`:** `text-lg` (18px) → `text-base` (16px) to match Figma's heading size; `text-current` →
26
+ `text-foreground` for explicit token binding instead of relying on inherited color.
27
+ - **Fixed a real spacing bug:** `LinkGroupTitle` had its own `mb-2` (8px) *on top of* `LinkGroup`'s wrapper
28
+ `gap-2` (8px) between title and list, doubling the heading-to-list gap to 16px instead of Figma's single
29
+ 8px gap. Removed `mb-2` — `LinkGroup`'s flex `gap-2` now does this alone.
30
+ - `LinkGroup`'s wrapper gained `items-start` (was implicit `stretch`), matching Figma's root container and
31
+ preventing the title/list from stretching to an unintended width.
32
+
33
+ ### States
34
+
35
+ - `LinkGroupItem`'s `<a>` kept its existing `hover:underline` (Default: no underline, Hover: underline, no
36
+ color/background change — already matched Figma exactly).
37
+ - Added `focus-visible:ring-2 focus-visible:ring-chart-1` (plus `outline-hidden`) — **not** documented in
38
+ Figma, which only shows Default/Hover for this component, but added for keyboard-accessibility parity
39
+ with every other interactive component in this library (Button/Input/DropdownMenuItem all have an explicit
40
+ focus-visible ring). See "Flagged for the designer" below.
41
+
42
+ ### Tokens (`globals.css`)
43
+
44
+ - No new tokens needed — `radius-lg` and `muted-foreground`/`foreground` already existed and match Figma's
45
+ values exactly (`muted-foreground` = `#71717a`, `foreground` = `#09090b` in light mode). `p-0.5`, `gap-2`,
46
+ `text-sm`, `leading-5` all come from Tailwind's default scale, which happens to line up 1:1 with Figma's
47
+ `padding/spacing/font-size` variables here.
48
+
49
+ ### Storybook & Docs
50
+
51
+ - Added `@figmaUrl`/`@component` JSDoc to `LinkGroupItem.astro` (didn't have one before) and repointed
52
+ `LinkGroup.astro`'s `@figmaUrl` from the old Bejamas file to the ClickLearn Lightning Design Library.
53
+ Added a "Horizontal orientation" example to `LinkGroup.astro`'s JSDoc.
54
+ - `apps/web/src/pages/storybook/_sections/link-group.astro`: added an `orientation="horizontal"` preview and
55
+ an `orientation` row to the `LinkGroupList` props table.
56
+
57
+ ### Not changed
58
+
59
+ - Kept the existing "style the slotted `<a>` via `[&_a]:` selectors" approach on `LinkGroupItem` rather than
60
+ refactoring to a polymorphic `as="a"` component (like `Button`) — this was a visual alignment pass, not an
61
+ architecture change. Worth a future discussion if consumers want a self-rendering anchor.
62
+ - Did not add a `linkGroupLabel` boolean prop (Figma has one to toggle the heading) — Astro's `<slot>`
63
+ presence already handles "heading shown only if provided" for free; a boolean prop would be redundant here.
64
+
65
+ ### Flagged for the designer / engineering (not addressed in this pass)
66
+
67
+ - The "Component / Link Group / Orientation" usage-example page in Figma shows a divider line under the
68
+ "Link group name" heading in its Vertical sample, but the actual master component (the one with the real
69
+ `Orientation` variant property) has no divider — heading, 8px gap, list. Followed the master component;
70
+ worth cleaning up the usage-example frame in Figma so it doesn't raise the same question next time.
71
+ - The Link component in Figma only documents Default/Hover states — no Focus state. Added a focus-visible
72
+ ring anyway for accessibility (see "States" above); worth adding an explicit documented Focus variant to
73
+ the Figma component so future passes don't have to guess the treatment.
74
+
75
+ ## Unreleased