@cl-light-ds/ui 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/README.md +45 -45
  2. package/package.json +1 -1
  3. package/src/components/accordion/Accordion.astro +248 -248
  4. package/src/components/accordion/AccordionContent.astro +26 -26
  5. package/src/components/accordion/AccordionItem.astro +36 -36
  6. package/src/components/accordion/AccordionTrigger.astro +118 -118
  7. package/src/components/alert/Alert.astro +167 -167
  8. package/src/components/alert/AlertDescription.astro +24 -24
  9. package/src/components/alert/AlertTitle.astro +24 -24
  10. package/src/components/avatar/Avatar.astro +197 -197
  11. package/src/components/avatar/AvatarBadge.astro +44 -44
  12. package/src/components/avatar/AvatarFallback.astro +26 -26
  13. package/src/components/avatar/AvatarGroup.astro +26 -26
  14. package/src/components/avatar/AvatarGroupCount.astro +30 -30
  15. package/src/components/avatar/AvatarImage.astro +46 -46
  16. package/src/components/badge/Badge.astro +167 -167
  17. package/src/components/breadcrumb/Breadcrumb.astro +76 -76
  18. package/src/components/breadcrumb/BreadcrumbItem.astro +32 -32
  19. package/src/components/breadcrumb/BreadcrumbList.astro +26 -26
  20. package/src/components/breadcrumb/BreadcrumbSeparator.astro +26 -26
  21. package/src/components/button/Button.astro +233 -233
  22. package/src/components/button-group/ButtonGroup.astro +130 -130
  23. package/src/components/button-group/ButtonGroupSeparator.astro +30 -30
  24. package/src/components/button-group/ButtonGroupText.astro +21 -21
  25. package/src/components/card/Card.astro +182 -182
  26. package/src/components/card/CardAction.astro +26 -26
  27. package/src/components/card/CardContent.astro +28 -28
  28. package/src/components/card/CardDescription.astro +28 -28
  29. package/src/components/card/CardFooter.astro +24 -24
  30. package/src/components/card/CardHeader.astro +30 -30
  31. package/src/components/card/CardMedia.astro +27 -27
  32. package/src/components/card/CardOverlay.astro +32 -32
  33. package/src/components/card/CardTitle.astro +21 -21
  34. package/src/components/carousel/Carousel.astro +106 -106
  35. package/src/components/carousel/CarouselSlide.astro +22 -22
  36. package/src/components/checkbox/Checkbox.astro +159 -159
  37. package/src/components/collapsible/Collapsible.astro +202 -202
  38. package/src/components/collapsible/CollapsibleContent.astro +36 -36
  39. package/src/components/collapsible/CollapsibleTrigger.astro +34 -34
  40. package/src/components/combobox/Combobox.astro +365 -365
  41. package/src/components/combobox/ComboboxContent.astro +37 -37
  42. package/src/components/combobox/ComboboxEmpty.astro +18 -18
  43. package/src/components/combobox/ComboboxGroup.astro +19 -19
  44. package/src/components/combobox/ComboboxInput.astro +74 -74
  45. package/src/components/combobox/ComboboxItem.astro +39 -39
  46. package/src/components/combobox/ComboboxLabel.astro +18 -18
  47. package/src/components/combobox/ComboboxList.astro +21 -21
  48. package/src/components/combobox/ComboboxSeparator.astro +17 -17
  49. package/src/components/combobox/ComboboxTrigger.astro +30 -30
  50. package/src/components/combobox/ComboboxValue.astro +22 -22
  51. package/src/components/date/Date.astro +137 -137
  52. package/src/components/dialog/Dialog.astro +196 -196
  53. package/src/components/dialog/DialogClose.astro +23 -23
  54. package/src/components/dialog/DialogContent.astro +42 -42
  55. package/src/components/dialog/DialogDescription.astro +18 -18
  56. package/src/components/dialog/DialogFooter.astro +18 -18
  57. package/src/components/dialog/DialogHeader.astro +18 -18
  58. package/src/components/dialog/DialogOverlay.astro +19 -19
  59. package/src/components/dialog/DialogTitle.astro +18 -18
  60. package/src/components/dialog/DialogTrigger.astro +37 -37
  61. package/src/components/dropdown-menu/DropdownMenu.astro +226 -226
  62. package/src/components/dropdown-menu/DropdownMenuCheckboxItem.astro +114 -114
  63. package/src/components/dropdown-menu/DropdownMenuContent.astro +42 -42
  64. package/src/components/dropdown-menu/DropdownMenuGroup.astro +19 -19
  65. package/src/components/dropdown-menu/DropdownMenuItem.astro +220 -220
  66. package/src/components/dropdown-menu/DropdownMenuLabel.astro +20 -20
  67. package/src/components/dropdown-menu/DropdownMenuRadioItem.astro +101 -101
  68. package/src/components/dropdown-menu/DropdownMenuSeparator.astro +18 -18
  69. package/src/components/dropdown-menu/DropdownMenuShortcut.astro +18 -18
  70. package/src/components/dropdown-menu/DropdownMenuTrigger.astro +49 -49
  71. package/src/components/field/Field.astro +664 -664
  72. package/src/components/field/FieldContent.astro +20 -20
  73. package/src/components/field/FieldDescription.astro +22 -22
  74. package/src/components/field/FieldError.astro +51 -51
  75. package/src/components/field/FieldGroup.astro +20 -20
  76. package/src/components/field/FieldLabel.astro +22 -22
  77. package/src/components/field/FieldLegend.astro +23 -23
  78. package/src/components/field/FieldSeparator.astro +30 -30
  79. package/src/components/field/FieldSet.astro +20 -20
  80. package/src/components/field/FieldTitle.astro +20 -20
  81. package/src/components/hover-card/HoverCard.astro +235 -235
  82. package/src/components/hover-card/HoverCardContent.astro +54 -54
  83. package/src/components/hover-card/HoverCardTrigger.astro +38 -38
  84. package/src/components/input/Input.astro +130 -130
  85. package/src/components/input-group/InputGroup.astro +135 -135
  86. package/src/components/input-group/InputGroupAddon.astro +49 -49
  87. package/src/components/input-group/InputGroupButton.astro +58 -58
  88. package/src/components/input-group/InputGroupInput.astro +18 -18
  89. package/src/components/input-group/InputGroupText.astro +21 -21
  90. package/src/components/input-group/InputGroupTextarea.astro +17 -17
  91. package/src/components/item/Item.astro +122 -122
  92. package/src/components/item/ItemActions.astro +21 -21
  93. package/src/components/item/ItemContent.astro +25 -25
  94. package/src/components/item/ItemDescription.astro +25 -25
  95. package/src/components/item/ItemFooter.astro +24 -24
  96. package/src/components/item/ItemGroup.astro +24 -24
  97. package/src/components/item/ItemHeader.astro +24 -24
  98. package/src/components/item/ItemMedia.astro +47 -47
  99. package/src/components/item/ItemSeparator.astro +21 -21
  100. package/src/components/item/ItemTitle.astro +25 -25
  101. package/src/components/kbd/Kbd.astro +145 -145
  102. package/src/components/kbd/KbdGroup.astro +55 -55
  103. package/src/components/label/Label.astro +97 -97
  104. package/src/components/link-group/LinkGroup.astro +67 -67
  105. package/src/components/link-group/LinkGroupItem.astro +32 -32
  106. package/src/components/link-group/LinkGroupList.astro +25 -25
  107. package/src/components/link-group/LinkGroupTitle.astro +22 -22
  108. package/src/components/marquee/Marquee.astro +119 -119
  109. package/src/components/native-select/NativeSelect.astro +125 -125
  110. package/src/components/native-select/NativeSelectOptGroup.astro +14 -14
  111. package/src/components/navigation-menu/NavigationMenu.astro +414 -414
  112. package/src/components/navigation-menu/NavigationMenuContent.astro +37 -37
  113. package/src/components/navigation-menu/NavigationMenuIndicator.astro +24 -24
  114. package/src/components/navigation-menu/NavigationMenuItem.astro +22 -22
  115. package/src/components/navigation-menu/NavigationMenuLink.astro +18 -18
  116. package/src/components/navigation-menu/NavigationMenuList.astro +21 -21
  117. package/src/components/navigation-menu/NavigationMenuPositioner.astro +44 -44
  118. package/src/components/navigation-menu/NavigationMenuTrigger.astro +30 -30
  119. package/src/components/navigation-menu/NavigationMenuViewport.astro +19 -19
  120. package/src/components/popover/CHANGELOG.md +17 -2
  121. package/src/components/popover/Popover.astro +211 -210
  122. package/src/components/popover/PopoverClose.astro +18 -18
  123. package/src/components/popover/PopoverContent.astro +50 -49
  124. package/src/components/popover/PopoverDescription.astro +18 -18
  125. package/src/components/popover/PopoverHeader.astro +18 -18
  126. package/src/components/popover/PopoverTitle.astro +18 -18
  127. package/src/components/popover/PopoverTrigger.astro +35 -29
  128. package/src/components/radio-group/CHANGELOG.md +23 -1
  129. package/src/components/radio-group/RadioGroup.astro +81 -81
  130. package/src/components/radio-group/RadioGroupItem.astro +51 -42
  131. package/src/components/select/Select.astro +373 -373
  132. package/src/components/select/SelectContent.astro +91 -91
  133. package/src/components/select/SelectGroup.astro +19 -19
  134. package/src/components/select/SelectItem.astro +48 -48
  135. package/src/components/select/SelectLabel.astro +18 -18
  136. package/src/components/select/SelectSeparator.astro +17 -17
  137. package/src/components/select/SelectTrigger.astro +34 -34
  138. package/src/components/select/SelectValue.astro +22 -22
  139. package/src/components/separator/Separator.astro +60 -60
  140. package/src/components/skeleton/Skeleton.astro +121 -121
  141. package/src/components/slider/Slider.astro +198 -198
  142. package/src/components/spinner/CHANGELOG.md +14 -1
  143. package/src/components/spinner/Spinner.astro +135 -134
  144. package/src/components/sticky-surface/StickySurface.astro +152 -152
  145. package/src/components/switch/CHANGELOG.md +20 -0
  146. package/src/components/switch/Switch.astro +106 -106
  147. package/src/components/table/CHANGELOG.md +21 -2
  148. package/src/components/table/Table.astro +251 -250
  149. package/src/components/table/TableBody.astro +18 -18
  150. package/src/components/table/TableCaption.astro +17 -17
  151. package/src/components/table/TableCell.astro +21 -21
  152. package/src/components/table/TableFooter.astro +21 -21
  153. package/src/components/table/TableHead.astro +21 -21
  154. package/src/components/table/TableHeader.astro +17 -17
  155. package/src/components/table/TableRow.astro +21 -21
  156. package/src/components/tabs/Tabs.astro +306 -306
  157. package/src/components/tabs/TabsContent.astro +47 -47
  158. package/src/components/tabs/TabsList.astro +69 -69
  159. package/src/components/tabs/TabsTrigger.astro +40 -40
  160. package/src/components/textarea/CHANGELOG.md +18 -1
  161. package/src/components/textarea/Textarea.astro +58 -36
  162. package/src/components/toggle/CHANGELOG.md +19 -1
  163. package/src/components/toggle/Toggle.astro +150 -138
  164. package/src/components/toggle-group/CHANGELOG.md +14 -1
  165. package/src/components/toggle-group/ToggleGroup.astro +236 -224
  166. package/src/components/toggle-group/ToggleGroupItem.astro +48 -48
  167. package/src/components/tooltip/CHANGELOG.md +19 -2
  168. package/src/components/tooltip/Tooltip.astro +357 -331
  169. package/src/components/tooltip/TooltipContent.astro +85 -60
  170. package/src/components/tooltip/TooltipTrigger.astro +34 -34
  171. package/src/lib/toggle-shared.ts +3 -2
@@ -1,121 +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>
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>
@@ -1,198 +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>
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>
@@ -2,4 +2,17 @@
2
2
 
3
3
  All notable changes to the `Spinner` component will be documented in this file.
4
4
 
5
- ## Unreleased
5
+ ## 2026-09-18 — Figma alignment (ClickLearn Lightning Design Library, node `5455-18523`)
6
+
7
+ Figma documents Spinner as four discrete sizes: Extra Small (12px), Small (16px), Medium (24px), Large (32px) — all rendered in a consistent primary-blue color.
8
+
9
+ ### Fixed
10
+
11
+ - Added the missing `@figmaUrl`.
12
+ - Default color: added `text-primary` so the spinner's `stroke="currentColor"` resolves to primary blue (`#3785e0`, confirmed against Figma) by default, matching every size shown in Figma — previously it had no default color at all and just inherited whatever ambient text color happened to be in scope.
13
+ - Fixed a real regression that default color change caused: the storybook's own "Badge" example nests a bare `<Spinner data-icon />` inside the default (solid primary-blue) `Badge` variant — with the new default, the spinner became invisible (blue icon on blue background). Fixed by explicitly overriding it to `class="text-primary-foreground"` in that one case (both in the storybook page and the identical demo duplicated in `Spinner.astro`'s own JSDoc), matching the badge's own foreground token. All other compositions (outline/secondary badges, disabled buttons — which force `bg-muted` regardless of variant, so never collide with primary blue) were unaffected.
14
+
15
+ ### Notes
16
+
17
+ - No new `size` prop added — the existing "use a `size-*` utility class" pattern already produces Figma's exact four sizes (`size-3`/`size-4`/`size-6`/`size-8` = 12/16/24/32px), confirmed already documented in the component's own JSDoc and storybook page. Relabeled the storybook "Size" demo with Figma's own names (Extra Small/Small/Medium/Large) for clarity.
18
+ - Stroke width and animation were already correct — no Figma evidence suggested otherwise.