@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.
- package/README.md +45 -45
- package/package.json +1 -1
- package/src/components/accordion/Accordion.astro +248 -248
- package/src/components/accordion/AccordionContent.astro +26 -26
- package/src/components/accordion/AccordionItem.astro +36 -36
- package/src/components/accordion/AccordionTrigger.astro +118 -118
- package/src/components/alert/Alert.astro +167 -167
- package/src/components/alert/AlertDescription.astro +24 -24
- package/src/components/alert/AlertTitle.astro +24 -24
- package/src/components/avatar/Avatar.astro +197 -197
- package/src/components/avatar/AvatarBadge.astro +44 -44
- package/src/components/avatar/AvatarFallback.astro +26 -26
- package/src/components/avatar/AvatarGroup.astro +26 -26
- package/src/components/avatar/AvatarGroupCount.astro +30 -30
- package/src/components/avatar/AvatarImage.astro +46 -46
- package/src/components/badge/Badge.astro +167 -167
- package/src/components/breadcrumb/Breadcrumb.astro +76 -76
- package/src/components/breadcrumb/BreadcrumbItem.astro +32 -32
- package/src/components/breadcrumb/BreadcrumbList.astro +26 -26
- package/src/components/breadcrumb/BreadcrumbSeparator.astro +26 -26
- package/src/components/button/Button.astro +233 -233
- package/src/components/button-group/ButtonGroup.astro +130 -130
- package/src/components/button-group/ButtonGroupSeparator.astro +30 -30
- package/src/components/button-group/ButtonGroupText.astro +21 -21
- package/src/components/card/Card.astro +182 -182
- package/src/components/card/CardAction.astro +26 -26
- package/src/components/card/CardContent.astro +28 -28
- package/src/components/card/CardDescription.astro +28 -28
- package/src/components/card/CardFooter.astro +24 -24
- package/src/components/card/CardHeader.astro +30 -30
- package/src/components/card/CardMedia.astro +27 -27
- package/src/components/card/CardOverlay.astro +32 -32
- package/src/components/card/CardTitle.astro +21 -21
- package/src/components/carousel/Carousel.astro +106 -106
- package/src/components/carousel/CarouselSlide.astro +22 -22
- package/src/components/checkbox/Checkbox.astro +159 -159
- package/src/components/collapsible/Collapsible.astro +202 -202
- package/src/components/collapsible/CollapsibleContent.astro +36 -36
- package/src/components/collapsible/CollapsibleTrigger.astro +34 -34
- package/src/components/combobox/Combobox.astro +365 -365
- package/src/components/combobox/ComboboxContent.astro +37 -37
- package/src/components/combobox/ComboboxEmpty.astro +18 -18
- package/src/components/combobox/ComboboxGroup.astro +19 -19
- package/src/components/combobox/ComboboxInput.astro +74 -74
- package/src/components/combobox/ComboboxItem.astro +39 -39
- package/src/components/combobox/ComboboxLabel.astro +18 -18
- package/src/components/combobox/ComboboxList.astro +21 -21
- package/src/components/combobox/ComboboxSeparator.astro +17 -17
- package/src/components/combobox/ComboboxTrigger.astro +30 -30
- package/src/components/combobox/ComboboxValue.astro +22 -22
- package/src/components/date/Date.astro +137 -137
- package/src/components/dialog/Dialog.astro +196 -196
- package/src/components/dialog/DialogClose.astro +23 -23
- package/src/components/dialog/DialogContent.astro +42 -42
- package/src/components/dialog/DialogDescription.astro +18 -18
- package/src/components/dialog/DialogFooter.astro +18 -18
- package/src/components/dialog/DialogHeader.astro +18 -18
- package/src/components/dialog/DialogOverlay.astro +19 -19
- package/src/components/dialog/DialogTitle.astro +18 -18
- package/src/components/dialog/DialogTrigger.astro +37 -37
- package/src/components/dropdown-menu/DropdownMenu.astro +226 -226
- package/src/components/dropdown-menu/DropdownMenuCheckboxItem.astro +114 -114
- package/src/components/dropdown-menu/DropdownMenuContent.astro +42 -42
- package/src/components/dropdown-menu/DropdownMenuGroup.astro +19 -19
- package/src/components/dropdown-menu/DropdownMenuItem.astro +220 -220
- package/src/components/dropdown-menu/DropdownMenuLabel.astro +20 -20
- package/src/components/dropdown-menu/DropdownMenuRadioItem.astro +101 -101
- package/src/components/dropdown-menu/DropdownMenuSeparator.astro +18 -18
- package/src/components/dropdown-menu/DropdownMenuShortcut.astro +18 -18
- package/src/components/dropdown-menu/DropdownMenuTrigger.astro +49 -49
- package/src/components/field/Field.astro +664 -664
- package/src/components/field/FieldContent.astro +20 -20
- package/src/components/field/FieldDescription.astro +22 -22
- package/src/components/field/FieldError.astro +51 -51
- package/src/components/field/FieldGroup.astro +20 -20
- package/src/components/field/FieldLabel.astro +22 -22
- package/src/components/field/FieldLegend.astro +23 -23
- package/src/components/field/FieldSeparator.astro +30 -30
- package/src/components/field/FieldSet.astro +20 -20
- package/src/components/field/FieldTitle.astro +20 -20
- package/src/components/hover-card/HoverCard.astro +235 -235
- package/src/components/hover-card/HoverCardContent.astro +54 -54
- package/src/components/hover-card/HoverCardTrigger.astro +38 -38
- package/src/components/input/Input.astro +130 -130
- package/src/components/input-group/InputGroup.astro +135 -135
- package/src/components/input-group/InputGroupAddon.astro +49 -49
- package/src/components/input-group/InputGroupButton.astro +58 -58
- package/src/components/input-group/InputGroupInput.astro +18 -18
- package/src/components/input-group/InputGroupText.astro +21 -21
- package/src/components/input-group/InputGroupTextarea.astro +17 -17
- package/src/components/item/Item.astro +122 -122
- package/src/components/item/ItemActions.astro +21 -21
- package/src/components/item/ItemContent.astro +25 -25
- package/src/components/item/ItemDescription.astro +25 -25
- package/src/components/item/ItemFooter.astro +24 -24
- package/src/components/item/ItemGroup.astro +24 -24
- package/src/components/item/ItemHeader.astro +24 -24
- package/src/components/item/ItemMedia.astro +47 -47
- package/src/components/item/ItemSeparator.astro +21 -21
- package/src/components/item/ItemTitle.astro +25 -25
- package/src/components/kbd/Kbd.astro +145 -145
- package/src/components/kbd/KbdGroup.astro +55 -55
- package/src/components/label/Label.astro +97 -97
- package/src/components/link-group/LinkGroup.astro +67 -67
- package/src/components/link-group/LinkGroupItem.astro +32 -32
- package/src/components/link-group/LinkGroupList.astro +25 -25
- package/src/components/link-group/LinkGroupTitle.astro +22 -22
- package/src/components/marquee/Marquee.astro +119 -119
- package/src/components/native-select/NativeSelect.astro +125 -125
- package/src/components/native-select/NativeSelectOptGroup.astro +14 -14
- package/src/components/navigation-menu/NavigationMenu.astro +414 -414
- package/src/components/navigation-menu/NavigationMenuContent.astro +37 -37
- package/src/components/navigation-menu/NavigationMenuIndicator.astro +24 -24
- package/src/components/navigation-menu/NavigationMenuItem.astro +22 -22
- package/src/components/navigation-menu/NavigationMenuLink.astro +18 -18
- package/src/components/navigation-menu/NavigationMenuList.astro +21 -21
- package/src/components/navigation-menu/NavigationMenuPositioner.astro +44 -44
- package/src/components/navigation-menu/NavigationMenuTrigger.astro +30 -30
- package/src/components/navigation-menu/NavigationMenuViewport.astro +19 -19
- package/src/components/popover/CHANGELOG.md +17 -2
- package/src/components/popover/Popover.astro +211 -210
- package/src/components/popover/PopoverClose.astro +18 -18
- package/src/components/popover/PopoverContent.astro +50 -49
- package/src/components/popover/PopoverDescription.astro +18 -18
- package/src/components/popover/PopoverHeader.astro +18 -18
- package/src/components/popover/PopoverTitle.astro +18 -18
- package/src/components/popover/PopoverTrigger.astro +35 -29
- package/src/components/radio-group/CHANGELOG.md +23 -1
- package/src/components/radio-group/RadioGroup.astro +81 -81
- package/src/components/radio-group/RadioGroupItem.astro +51 -42
- package/src/components/select/Select.astro +373 -373
- package/src/components/select/SelectContent.astro +91 -91
- package/src/components/select/SelectGroup.astro +19 -19
- package/src/components/select/SelectItem.astro +48 -48
- package/src/components/select/SelectLabel.astro +18 -18
- package/src/components/select/SelectSeparator.astro +17 -17
- package/src/components/select/SelectTrigger.astro +34 -34
- package/src/components/select/SelectValue.astro +22 -22
- package/src/components/separator/Separator.astro +60 -60
- package/src/components/skeleton/Skeleton.astro +121 -121
- package/src/components/slider/Slider.astro +198 -198
- package/src/components/spinner/CHANGELOG.md +14 -1
- package/src/components/spinner/Spinner.astro +135 -134
- package/src/components/sticky-surface/StickySurface.astro +152 -152
- package/src/components/switch/CHANGELOG.md +20 -0
- package/src/components/switch/Switch.astro +106 -106
- package/src/components/table/CHANGELOG.md +21 -2
- package/src/components/table/Table.astro +251 -250
- package/src/components/table/TableBody.astro +18 -18
- package/src/components/table/TableCaption.astro +17 -17
- package/src/components/table/TableCell.astro +21 -21
- package/src/components/table/TableFooter.astro +21 -21
- package/src/components/table/TableHead.astro +21 -21
- package/src/components/table/TableHeader.astro +17 -17
- package/src/components/table/TableRow.astro +21 -21
- package/src/components/tabs/Tabs.astro +306 -306
- package/src/components/tabs/TabsContent.astro +47 -47
- package/src/components/tabs/TabsList.astro +69 -69
- package/src/components/tabs/TabsTrigger.astro +40 -40
- package/src/components/textarea/CHANGELOG.md +18 -1
- package/src/components/textarea/Textarea.astro +58 -36
- package/src/components/toggle/CHANGELOG.md +19 -1
- package/src/components/toggle/Toggle.astro +150 -138
- package/src/components/toggle-group/CHANGELOG.md +14 -1
- package/src/components/toggle-group/ToggleGroup.astro +236 -224
- package/src/components/toggle-group/ToggleGroupItem.astro +48 -48
- package/src/components/tooltip/CHANGELOG.md +19 -2
- package/src/components/tooltip/Tooltip.astro +357 -331
- package/src/components/tooltip/TooltipContent.astro +85 -60
- package/src/components/tooltip/TooltipTrigger.astro +34 -34
- 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
|
-
##
|
|
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.
|