@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,60 @@
1
+ ---
2
+ /**
3
+ * @component Separator
4
+ * @title Separator
5
+ * @description Visual separator for grouping content, supporting horizontal and vertical orientation.
6
+ * @status stable
7
+ * @figmaUrl https://www.figma.com/design/koxai7zw5vIuBzuVxe5T2l/bejamas-ui?node-id=2511-5829&t=YFStJ3V8fXEO8QD8-4
8
+ *
9
+ * @preview
10
+ * <div>
11
+ * <div class="space-y-1">
12
+ * <h4 class="text-sm leading-none font-medium">bejamas/ui</h4>
13
+ * <p class="text-muted-foreground text-sm">
14
+ * An open-source UI component library.
15
+ * </p>
16
+ * </div>
17
+ * <Separator class="my-4" />
18
+ * <div class="flex h-5 items-center space-x-4 text-sm">
19
+ * <div>Blog</div>
20
+ * <Separator orientation="vertical" />
21
+ * <div>Docs</div>
22
+ * <Separator orientation="vertical" />
23
+ * <div>Source</div>
24
+ * </div>
25
+ * </div>
26
+ *
27
+ * @usage
28
+ *
29
+ * ```astro nocollapse
30
+ * ---
31
+ * import { Separator } from '@bejamas/ui/components/separator';
32
+ * ---
33
+ *
34
+ * <Separator />
35
+ * <Separator orientation="vertical" />
36
+ * ```
37
+ */
38
+
39
+ import { cn } from "@cl-light-ds/ui/lib/utils";
40
+
41
+ const {
42
+ class: className = "",
43
+ orientation = "horizontal",
44
+ decorative = true,
45
+ ...props
46
+ } = Astro.props;
47
+ ---
48
+
49
+ <div
50
+ aria-orientation={orientation}
51
+ aria-hidden={decorative ? "true" : undefined}
52
+ class={cn(
53
+ "bg-border shrink-0",
54
+ orientation === "vertical" ? "h-full w-px" : "h-px w-full",
55
+ "shrink-0",
56
+ className,
57
+ )}
58
+ {...props}
59
+ >
60
+ </div>
@@ -0,0 +1,2 @@
1
+ export { default as Separator } from "./Separator.astro";
2
+
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ All notable changes to the `Skeleton` component will be documented in this file.
4
+
5
+ ## Unreleased
@@ -0,0 +1,121 @@
1
+ ---
2
+ /**
3
+ * @component Skeleton
4
+ * @title Skeleton
5
+ * @description A loading placeholder component that displays animated pulse effect, commonly used to indicate content is being loaded.
6
+ * @status stable
7
+ *
8
+ * Works great with Astro Server Islands as a fallback for loading content.
9
+ *
10
+ * @preview
11
+ *
12
+ * <div class="flex items-center gap-4">
13
+ * <Skeleton class="h-12 w-12 rounded-full" />
14
+ * <div class="space-y-2">
15
+ * <Skeleton class="h-4 w-[250px]" />
16
+ * <Skeleton class="h-4 w-[200px]" />
17
+ * </div>
18
+ * </div>
19
+ *
20
+ * @usage
21
+ *
22
+ * ```astro
23
+ * ---
24
+ * import { Skeleton } from '@bejamas/ui/components/skeleton';
25
+ * ---
26
+ *
27
+ * <Skeleton class="h-4 w-[250px]" />
28
+ * ```
29
+ *
30
+ * @examples
31
+ *
32
+ * ### Avatar
33
+ *
34
+ * <div class="flex w-fit items-center gap-4">
35
+ * <Skeleton class="size-10 shrink-0 rounded-full" />
36
+ * <div class="grid gap-2">
37
+ * <Skeleton class="h-4 w-[150px]" />
38
+ * <Skeleton class="h-4 w-[100px]" />
39
+ * </div>
40
+ * </div>
41
+ *
42
+ * ### Card
43
+ *
44
+ * <Card class="w-full max-w-xs">
45
+ * <CardHeader>
46
+ * <Skeleton class="h-4 w-2/3" />
47
+ * <Skeleton class="h-4 w-1/2" />
48
+ * </CardHeader>
49
+ * <CardContent>
50
+ * <Skeleton class="aspect-video w-full" />
51
+ * </CardContent>
52
+ * </Card>
53
+ *
54
+ * ### Text
55
+ *
56
+ * <div class="flex w-full max-w-xs flex-col gap-2">
57
+ * <Skeleton class="h-4 w-full" />
58
+ * <Skeleton class="h-4 w-full" />
59
+ * <Skeleton class="h-4 w-3/4" />
60
+ * </div>
61
+ *
62
+ * ### Form
63
+ *
64
+ * <div class="flex w-full max-w-xs flex-col gap-7">
65
+ * <div class="flex flex-col gap-3">
66
+ * <Skeleton class="h-4 w-20" />
67
+ * <Skeleton class="h-8 w-full" />
68
+ * </div>
69
+ * <div class="flex flex-col gap-3">
70
+ * <Skeleton class="h-4 w-24" />
71
+ * <Skeleton class="h-8 w-full" />
72
+ * </div>
73
+ * <Skeleton class="h-8 w-24" />
74
+ * </div>
75
+ *
76
+ * ### Table
77
+ *
78
+ * <div class="flex w-full max-w-sm flex-col gap-2">
79
+ * <div class="flex gap-4">
80
+ * <Skeleton class="h-4 flex-1" />
81
+ * <Skeleton class="h-4 w-24" />
82
+ * <Skeleton class="h-4 w-20" />
83
+ * </div>
84
+ * <div class="flex gap-4">
85
+ * <Skeleton class="h-4 flex-1" />
86
+ * <Skeleton class="h-4 w-24" />
87
+ * <Skeleton class="h-4 w-20" />
88
+ * </div>
89
+ * <div class="flex gap-4">
90
+ * <Skeleton class="h-4 flex-1" />
91
+ * <Skeleton class="h-4 w-24" />
92
+ * <Skeleton class="h-4 w-20" />
93
+ * </div>
94
+ * <div class="flex gap-4">
95
+ * <Skeleton class="h-4 flex-1" />
96
+ * <Skeleton class="h-4 w-24" />
97
+ * <Skeleton class="h-4 w-20" />
98
+ * </div>
99
+ * <div class="flex gap-4">
100
+ * <Skeleton class="h-4 flex-1" />
101
+ * <Skeleton class="h-4 w-24" />
102
+ * <Skeleton class="h-4 w-20" />
103
+ * </div>
104
+ * </div>
105
+ *
106
+ * @props
107
+ * - class?: string — Additional classes for styling.
108
+ */
109
+
110
+ import { cn } from "@cl-light-ds/ui/lib/utils";
111
+
112
+ const { class: className = "", ...props } = Astro.props;
113
+ ---
114
+
115
+ <div
116
+ data-slot="skeleton"
117
+ class={cn("bg-muted rounded-md animate-pulse", className)}
118
+ {...props}
119
+ >
120
+ <slot />
121
+ </div>
@@ -0,0 +1 @@
1
+ export { default as Skeleton } from "./Skeleton.astro";
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ All notable changes to the `Slider` component will be documented in this file.
4
+
5
+ ## Unreleased
@@ -0,0 +1,198 @@
1
+ ---
2
+ /**
3
+ * @component Slider
4
+ * @title Slider
5
+ * @description An input component that allows users to select a value from a range by dragging a thumb along a track.
6
+ * @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=5455-17811
7
+ *
8
+ * @preview
9
+ *
10
+ * <Slider class="w-full max-w-sm" defaultValue={50} max={100} />
11
+ *
12
+ * @usage
13
+ *
14
+ * ```astro nocollapse
15
+ * ---
16
+ * import { Slider } from '@bejamas/ui/components/slider';
17
+ * ---
18
+ *
19
+ * <Slider defaultValue={50} max={100} />
20
+ * ```
21
+ *
22
+ * @examples
23
+ *
24
+ * ### Range
25
+ *
26
+ * Use two thumbs to create a range slider for selecting a min and max value.
27
+ *
28
+ * <Slider class="w-full max-w-sm" defaultValue={[25, 75]} max={100} />
29
+ *
30
+ * ### Vertical
31
+ *
32
+ * Set orientation to vertical for a vertical slider.
33
+ *
34
+ * <div class="h-48">
35
+ * <Slider class="h-full" orientation="vertical" defaultValue={50} max={100} />
36
+ * </div>
37
+ *
38
+ * ### Disabled
39
+ *
40
+ * Disable the slider to prevent interaction.
41
+ *
42
+ * <Slider class="w-full max-w-sm" defaultValue={50} max={100} disabled />
43
+ *
44
+ * ### Step
45
+ *
46
+ * Set a custom step increment.
47
+ *
48
+ * <Slider class="w-full max-w-sm" defaultValue={50} max={100} step={10} />
49
+ *
50
+ * @api
51
+ *
52
+ * ### Events
53
+ *
54
+ * The slider emits custom events that you can listen to:
55
+ *
56
+ * | Event | Detail | Description |
57
+ * |-------|--------|-------------|
58
+ * | `slider:change` | `{ value: number \| [number, number] }` | Fired on every value change (during drag) |
59
+ * | `slider:commit` | `{ value: number \| [number, number] }` | Fired when value is committed (pointer up or keyboard blur) |
60
+ *
61
+ * ```astro nocollapse
62
+ * <Slider id="my-slider" defaultValue={50} max={100} />
63
+ * ```
64
+ *
65
+ * ```js nocollapse
66
+ * const slider = document.getElementById('my-slider');
67
+ *
68
+ * slider.addEventListener('slider:change', (e) => {
69
+ * console.log('Value changing:', e.detail.value);
70
+ * });
71
+ *
72
+ * slider.addEventListener('slider:commit', (e) => {
73
+ * console.log('Value committed:', e.detail.value);
74
+ * });
75
+ * ```
76
+ *
77
+ * ### Programmatic Control
78
+ *
79
+ * You can set the slider value programmatically by dispatching a `slider:set` event:
80
+ *
81
+ * ```js nocollapse
82
+ * // Set single value
83
+ * slider.dispatchEvent(new CustomEvent('slider:set', {
84
+ * detail: { value: 75 }
85
+ * }));
86
+ *
87
+ * // Set range values
88
+ * slider.dispatchEvent(new CustomEvent('slider:set', {
89
+ * detail: { value: [25, 75] }
90
+ * }));
91
+ * ```
92
+ *
93
+ * ### Data Attributes
94
+ *
95
+ * The slider sets these data attributes that you can use for styling or querying state:
96
+ *
97
+ * | Attribute | Element | Description |
98
+ * |-----------|---------|-------------|
99
+ * | `data-orientation` | slider | Current orientation (`horizontal` or `vertical`) |
100
+ * | `data-disabled` | slider | Present when slider is disabled |
101
+ * | `data-dragging` | slider, thumb | Present during drag interaction |
102
+ * | `data-value` | slider | Current value(s) as string (e.g., `"50"` or `"25,75"`) |
103
+ *
104
+ */
105
+
106
+ import type { HTMLAttributes } from "astro/types";
107
+ import { cn } from "@cl-light-ds/ui/lib/utils";
108
+
109
+ type SliderValue = number | [number, number];
110
+
111
+ interface Props extends HTMLAttributes<"div"> {
112
+ class?: string;
113
+ value?: SliderValue;
114
+ defaultValue?: SliderValue;
115
+ min?: number;
116
+ max?: number;
117
+ step?: number;
118
+ orientation?: "horizontal" | "vertical";
119
+ disabled?: boolean;
120
+ }
121
+
122
+ const {
123
+ class: className = "",
124
+ value,
125
+ defaultValue,
126
+ min = 0,
127
+ max = 100,
128
+ step = 1,
129
+ orientation = "horizontal",
130
+ disabled = false,
131
+ ...rest
132
+ } = Astro.props as Props;
133
+
134
+ const resolvedValue = value ?? defaultValue ?? min;
135
+ const defaultValueAttribute = Array.isArray(resolvedValue)
136
+ ? resolvedValue.join(",")
137
+ : String(resolvedValue);
138
+ const thumbCount = Array.isArray(resolvedValue) ? 2 : 1;
139
+ ---
140
+
141
+ <div
142
+ {...rest}
143
+ data-slot="slider"
144
+ data-default-value={defaultValueAttribute}
145
+ data-min={min}
146
+ data-max={max}
147
+ data-step={step}
148
+ data-orientation={orientation}
149
+ data-thumb-alignment="edge"
150
+ data-disabled={disabled ? "true" : undefined}
151
+ class={cn("data-horizontal:w-full data-vertical:h-full", className)}
152
+ >
153
+ <div
154
+ data-disabled={disabled ? "true" : undefined}
155
+ class="data-vertical:min-h-40 relative flex w-full touch-none items-center select-none data-disabled:cursor-not-allowed data-vertical:h-full data-vertical:w-auto data-vertical:flex-col"
156
+ >
157
+ <div
158
+ data-slot="slider-track"
159
+ class="bg-muted rounded-full data-horizontal:h-1 data-horizontal:w-full data-vertical:h-full data-vertical:w-1 relative grow overflow-hidden select-none data-disabled:opacity-40"
160
+ >
161
+ <div
162
+ data-slot="slider-range"
163
+ class="bg-primary select-none data-horizontal:h-full data-vertical:w-full data-disabled:bg-slider-background-disabled"
164
+ >
165
+ </div>
166
+ </div>
167
+ {
168
+ Array.from({ length: thumbCount }, (_, index) => (
169
+ <div
170
+ data-slot="slider-thumb"
171
+ data-index={index}
172
+ data-disabled={disabled ? "true" : undefined}
173
+ class="border-primary size-4 rounded-full border-2 bg-background transition-[color,box-shadow] hover:ring-3 hover:ring-ring/50 focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-hidden block shrink-0 select-none data-disabled:pointer-events-none data-disabled:bg-[linear-gradient(var(--slider-dot-background-disabled),var(--slider-dot-background-disabled))] data-disabled:border-[var(--primary-50)]"
174
+ />
175
+ ))
176
+ }
177
+ </div>
178
+ </div>
179
+
180
+ <script>
181
+ import { createSlider } from "@data-slot/slider";
182
+
183
+ document.querySelectorAll('[data-slot="slider"]').forEach((el) => {
184
+ const element = el as HTMLElement;
185
+
186
+ // Don't pass defaultValue in options - let the library read from
187
+ // data-default-value directly so single and range sliders stay aligned.
188
+ createSlider(element, {
189
+ min: Number(element.dataset.min) || 0,
190
+ max: Number(element.dataset.max) || 100,
191
+ step: Number(element.dataset.step) || 1,
192
+ orientation:
193
+ (element.dataset.orientation as "horizontal" | "vertical") ||
194
+ "horizontal",
195
+ disabled: element.dataset.disabled === "true",
196
+ });
197
+ });
198
+ </script>
@@ -0,0 +1 @@
1
+ export { default as Slider } from "./Slider.astro";
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ All notable changes to the `Spinner` component will be documented in this file.
4
+
5
+ ## Unreleased
@@ -0,0 +1,134 @@
1
+ ---
2
+ /**
3
+ * @component Spinner
4
+ * @title Spinner
5
+ * @description A loading indicator component that displays an animated spinning icon.
6
+ *
7
+ * @preview
8
+ *
9
+ * <Item variant="muted" class="w-full max-w-xs">
10
+ * <ItemMedia>
11
+ * <Spinner />
12
+ * </ItemMedia>
13
+ * <ItemContent>
14
+ * <ItemTitle class="line-clamp-1">Submitting Contact Form...</ItemTitle>
15
+ * </ItemContent>
16
+ * </Item>
17
+ *
18
+ * @usage
19
+ *
20
+ * ```astro nocollapse
21
+ * ---
22
+ * import { Spinner } from '@bejamas/ui/components/spinner';
23
+ * ---
24
+ *
25
+ * <Spinner />
26
+ * ```
27
+ *
28
+ * ## Customization
29
+ *
30
+ * You can replace the default spinner icon with any other icon by editing the `Spinner` component.
31
+ *
32
+ * ```astro showLineNumbers title="components/ui/spinner/Spinner.astro" nocollapse nopreview
33
+ * ---
34
+ * import { cn } from "@cl-light-ds/ui/lib/utils";
35
+ * import { Loader as LoaderIcon } from "@lucide/astro";
36
+ *
37
+ * const { class: className = "", ...props } = Astro.props;
38
+ * ---
39
+ *
40
+ * <LoaderIcon
41
+ * data-slot="spinner"
42
+ * role="status"
43
+ * aria-label="Loading"
44
+ * class={cn("cn-spinner", "size-4 animate-spin", className)}
45
+ * {...props}
46
+ * />
47
+ * ```
48
+ *
49
+ * @examples
50
+ *
51
+ * ### Size
52
+ *
53
+ * Use the `size-*` utility class to change the size of the spinner.
54
+ *
55
+ * <div class="flex items-center gap-6">
56
+ * <Spinner class="size-3" />
57
+ * <Spinner class="size-4" />
58
+ * <Spinner class="size-6" />
59
+ * <Spinner class="size-8" />
60
+ * </div>
61
+ *
62
+ * ### Button
63
+ *
64
+ * Add a spinner to a button to indicate a loading state. Remember to use the `data-icon` attribute for proper spacing.
65
+ *
66
+ * <div class="flex flex-col items-center gap-4">
67
+ * <Button disabled size="sm">
68
+ * <Spinner data-icon />
69
+ * Loading...
70
+ * </Button>
71
+ * <Button variant="outline" disabled size="sm">
72
+ * <Spinner data-icon />
73
+ * Please wait
74
+ * </Button>
75
+ * <Button variant="secondary" disabled size="sm">
76
+ * <Spinner data-icon />
77
+ * Processing
78
+ * </Button>
79
+ * </div>
80
+ *
81
+ * ### Badge
82
+ *
83
+ * Add a spinner to a badge to indicate a loading state.
84
+ *
85
+ * <div class="flex items-center gap-4 [--radius:1.2rem]">
86
+ * <Badge>
87
+ * <Spinner data-icon />
88
+ * Syncing
89
+ * </Badge>
90
+ * <Badge variant="secondary">
91
+ * <Spinner data-icon />
92
+ * Updating
93
+ * </Badge>
94
+ * <Badge variant="outline">
95
+ * <Spinner data-icon />
96
+ * Processing
97
+ * </Badge>
98
+ * </div>
99
+ *
100
+ * ### Input Group
101
+ *
102
+ * <div class="flex w-full max-w-md flex-col gap-4">
103
+ * <InputGroup>
104
+ * <InputGroupInput placeholder="Send a message..." disabled />
105
+ * <InputGroupAddon align="inline-end">
106
+ * <Spinner />
107
+ * </InputGroupAddon>
108
+ * </InputGroup>
109
+ * <InputGroup>
110
+ * <InputGroupTextarea placeholder="Send a message..." disabled />
111
+ * <InputGroupAddon align="block-end">
112
+ * <Spinner /> Validating...
113
+ * <InputGroupButton class="ml-auto" variant="default">
114
+ * <ArrowUpIcon />
115
+ * <span class="sr-only">Send</span>
116
+ * </InputGroupButton>
117
+ * </InputGroupAddon>
118
+ * </InputGroup>
119
+ * </div>
120
+ *
121
+ * @props
122
+ * - class?: string — Additional classes for styling (e.g., size-3, size-6).
123
+ */
124
+
125
+ import { cn } from "@cl-light-ds/ui/lib/utils";
126
+
127
+ const { class: className = "", ...props } = Astro.props;
128
+ ---
129
+
130
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" data-slot="spinner"
131
+ role="status"
132
+ aria-label="Loading"
133
+ class={cn("", "size-4 animate-spin", className)}
134
+ {...props}><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12a9 9 0 1 1-6.219-8.56"/></svg>
@@ -0,0 +1 @@
1
+ export { default as Spinner } from "./Spinner.astro";
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ All notable changes to the `StickySurface` component will be documented in this file.
4
+
5
+ ## Unreleased