@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,159 +1,159 @@
|
|
|
1
|
-
---
|
|
2
|
-
/**
|
|
3
|
-
* @component Checkbox
|
|
4
|
-
* @title Checkbox
|
|
5
|
-
* @description An accessible control for toggling between checked and unchecked states. Built on native HTML checkbox.
|
|
6
|
-
* @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=46-976
|
|
7
|
-
*
|
|
8
|
-
* @preview
|
|
9
|
-
*
|
|
10
|
-
* <div class="flex flex-col gap-6 not-content">
|
|
11
|
-
* <div class="flex items-center gap-3">
|
|
12
|
-
* <Checkbox id="terms" />
|
|
13
|
-
* <Label for="terms">Accept terms and conditions</Label>
|
|
14
|
-
* </div>
|
|
15
|
-
*
|
|
16
|
-
* <Field orientation="horizontal" class="max-w-sm">
|
|
17
|
-
* <Checkbox id="terms-2" checked />
|
|
18
|
-
* <FieldContent>
|
|
19
|
-
* <FieldLabel for="terms-2">Accept terms and conditions</FieldLabel>
|
|
20
|
-
* <FieldDescription>
|
|
21
|
-
* By clicking this checkbox, you agree to the terms and conditions.
|
|
22
|
-
* </FieldDescription>
|
|
23
|
-
* </FieldContent>
|
|
24
|
-
* </Field>
|
|
25
|
-
*
|
|
26
|
-
* <div class="group flex items-center gap-3">
|
|
27
|
-
* <Checkbox id="
|
|
28
|
-
* <Label for="
|
|
29
|
-
* </div>
|
|
30
|
-
*
|
|
31
|
-
* <Label
|
|
32
|
-
* class="hover:bg-accent/5 border-border flex items-start gap-3 rounded-lg border p-3 has-[:checked]:border-primary/30 has-[:checked]:bg-primary/5 dark:has-[:checked]:border-primary/20 dark:has-[:checked]:bg-primary/10 [&_[data-slot=checkbox]]:mt-0.5"
|
|
33
|
-
* >
|
|
34
|
-
* <Checkbox id="toggle-2" checked />
|
|
35
|
-
* <div class="grid gap-1.5 font-normal">
|
|
36
|
-
* <p class="text-sm leading-5 font-medium">Enable notifications</p>
|
|
37
|
-
* <p class="text-muted-foreground text-sm">
|
|
38
|
-
* You can enable or disable notifications at any time.
|
|
39
|
-
* </p>
|
|
40
|
-
* </div>
|
|
41
|
-
* </Label>
|
|
42
|
-
* </div>
|
|
43
|
-
*
|
|
44
|
-
* @usage
|
|
45
|
-
*
|
|
46
|
-
* ```astro nocollapse
|
|
47
|
-
* ---
|
|
48
|
-
* import { Checkbox } from '@bejamas/ui/components/checkbox';
|
|
49
|
-
* import { Label } from '@bejamas/ui/components/label';
|
|
50
|
-
* ---
|
|
51
|
-
*
|
|
52
|
-
* <div class="flex items-center gap-3">
|
|
53
|
-
* <Checkbox id="terms" />
|
|
54
|
-
* <Label for="terms">Accept terms and conditions</Label>
|
|
55
|
-
* </div>
|
|
56
|
-
* ```
|
|
57
|
-
*
|
|
58
|
-
* @examples
|
|
59
|
-
*
|
|
60
|
-
* ### Sizes
|
|
61
|
-
*
|
|
62
|
-
* <div class="flex items-center gap-6">
|
|
63
|
-
* <Checkbox id="size-default" checked />
|
|
64
|
-
* <Checkbox id="size-lg" size="lg" checked />
|
|
65
|
-
* </div>
|
|
66
|
-
*
|
|
67
|
-
* ### Indeterminate
|
|
68
|
-
*
|
|
69
|
-
* <Checkbox id="indeterminate-example" indeterminate />
|
|
70
|
-
*/
|
|
71
|
-
import { cva } from "class-variance-authority";
|
|
72
|
-
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
73
|
-
import type { HTMLAttributes } from "astro/types";
|
|
74
|
-
|
|
75
|
-
interface Props extends HTMLAttributes<"input"> {
|
|
76
|
-
class?: string;
|
|
77
|
-
id?: string;
|
|
78
|
-
name?: string;
|
|
79
|
-
size?: "default" | "lg";
|
|
80
|
-
indeterminate?: boolean;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const {
|
|
84
|
-
class: className = "",
|
|
85
|
-
id = "",
|
|
86
|
-
name = id,
|
|
87
|
-
size = "default",
|
|
88
|
-
indeterminate = false,
|
|
89
|
-
...props
|
|
90
|
-
} = Astro.props as Props;
|
|
91
|
-
|
|
92
|
-
const checkboxVariants = cva(
|
|
93
|
-
"peer appearance-none shrink-0 rounded-sm border border-input shadow-xs outline-none transition-colors checked:bg-primary checked:border-primary indeterminate:bg-primary indeterminate:border-primary dark:bg-input/30 dark:checked:bg-primary dark:checked:border-primary dark:indeterminate:bg-primary dark:indeterminate:border-primary focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:border-ring aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:checked:border-primary disabled:cursor-not-allowed disabled:bg-muted disabled:border-input group-has-disabled/field:opacity-50 relative after:absolute after:-inset-x-3 after:-inset-y-2",
|
|
94
|
-
{
|
|
95
|
-
variants: {
|
|
96
|
-
size: {
|
|
97
|
-
default: "size-4",
|
|
98
|
-
lg: "size-5",
|
|
99
|
-
},
|
|
100
|
-
},
|
|
101
|
-
defaultVariants: {
|
|
102
|
-
size: "default",
|
|
103
|
-
},
|
|
104
|
-
},
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
const indicatorVariants = cva(
|
|
108
|
-
"pointer-events-none absolute inset-0 grid place-content-center transition-opacity peer-disabled:text-muted-foreground text-primary-foreground",
|
|
109
|
-
{
|
|
110
|
-
variants: {
|
|
111
|
-
size: {
|
|
112
|
-
default: "[&>svg]:size-3",
|
|
113
|
-
lg: "[&>svg]:size-4",
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
defaultVariants: {
|
|
117
|
-
size: "default",
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
);
|
|
121
|
-
|
|
122
|
-
// Icon geometry matches Figma exactly per size (viewBox = native px, stroke-width 1.5)
|
|
123
|
-
// rather than scaling a single 24px icon, which rendered the stroke ~33% thinner than Figma.
|
|
124
|
-
const iconViewBox = size === "lg" ? "0 0 16 16" : "0 0 12 12";
|
|
125
|
-
const checkPath = size === "lg" ? "M13.3333 4L6 11.3333L2.66667 8" : "M10 3L4.5 8.5L2 6";
|
|
126
|
-
const dashPath = size === "lg" ? "M3.33333 8H12.6667" : "M2.5 6H9.5";
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
<label data-slot="checkbox" class="inline-flex items-center gap-2 cursor-pointer">
|
|
130
|
-
<span class="relative inline-flex items-center justify-center">
|
|
131
|
-
<input
|
|
132
|
-
id={id}
|
|
133
|
-
name={name}
|
|
134
|
-
type="checkbox"
|
|
135
|
-
data-indeterminate={indeterminate ? "" : undefined}
|
|
136
|
-
class={cn(checkboxVariants({ size }), className)}
|
|
137
|
-
{...props}
|
|
138
|
-
/>
|
|
139
|
-
<span
|
|
140
|
-
data-slot="checkbox-indicator"
|
|
141
|
-
class={cn(indicatorVariants({ size }), "opacity-0 peer-checked:opacity-100 peer-indeterminate:opacity-0")}
|
|
142
|
-
>
|
|
143
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox={iconViewBox}><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d={checkPath}/></svg>
|
|
144
|
-
</span>
|
|
145
|
-
<span
|
|
146
|
-
data-slot="checkbox-indeterminate-indicator"
|
|
147
|
-
class={cn(indicatorVariants({ size }), "opacity-0 peer-indeterminate:opacity-100")}
|
|
148
|
-
>
|
|
149
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox={iconViewBox}><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d={dashPath}/></svg>
|
|
150
|
-
</span>
|
|
151
|
-
</span>
|
|
152
|
-
<slot />
|
|
153
|
-
</label>
|
|
154
|
-
|
|
155
|
-
<script>
|
|
156
|
-
document.querySelectorAll("input[data-indeterminate]").forEach((el) => {
|
|
157
|
-
(el as HTMLInputElement).indeterminate = true;
|
|
158
|
-
});
|
|
159
|
-
</script>
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* @component Checkbox
|
|
4
|
+
* @title Checkbox
|
|
5
|
+
* @description An accessible control for toggling between checked and unchecked states. Built on native HTML checkbox.
|
|
6
|
+
* @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=46-976
|
|
7
|
+
*
|
|
8
|
+
* @preview
|
|
9
|
+
*
|
|
10
|
+
* <div class="flex flex-col gap-6 not-content">
|
|
11
|
+
* <div class="flex items-center gap-3">
|
|
12
|
+
* <Checkbox id="terms" />
|
|
13
|
+
* <Label for="terms">Accept terms and conditions</Label>
|
|
14
|
+
* </div>
|
|
15
|
+
*
|
|
16
|
+
* <Field orientation="horizontal" class="max-w-sm">
|
|
17
|
+
* <Checkbox id="terms-2" checked />
|
|
18
|
+
* <FieldContent>
|
|
19
|
+
* <FieldLabel for="terms-2">Accept terms and conditions</FieldLabel>
|
|
20
|
+
* <FieldDescription>
|
|
21
|
+
* By clicking this checkbox, you agree to the terms and conditions.
|
|
22
|
+
* </FieldDescription>
|
|
23
|
+
* </FieldContent>
|
|
24
|
+
* </Field>
|
|
25
|
+
*
|
|
26
|
+
* <div class="group flex items-center gap-3">
|
|
27
|
+
* <Checkbox id="notifications-checkbox-disabled" disabled />
|
|
28
|
+
* <Label for="notifications-checkbox-disabled" class="group-has-disabled:opacity-50">Enable notifications</Label>
|
|
29
|
+
* </div>
|
|
30
|
+
*
|
|
31
|
+
* <Label
|
|
32
|
+
* class="hover:bg-accent/5 border-border flex items-start gap-3 rounded-lg border p-3 has-[:checked]:border-primary/30 has-[:checked]:bg-primary/5 dark:has-[:checked]:border-primary/20 dark:has-[:checked]:bg-primary/10 [&_[data-slot=checkbox]]:mt-0.5"
|
|
33
|
+
* >
|
|
34
|
+
* <Checkbox id="toggle-2" checked />
|
|
35
|
+
* <div class="grid gap-1.5 font-normal">
|
|
36
|
+
* <p class="text-sm leading-5 font-medium">Enable notifications</p>
|
|
37
|
+
* <p class="text-muted-foreground text-sm">
|
|
38
|
+
* You can enable or disable notifications at any time.
|
|
39
|
+
* </p>
|
|
40
|
+
* </div>
|
|
41
|
+
* </Label>
|
|
42
|
+
* </div>
|
|
43
|
+
*
|
|
44
|
+
* @usage
|
|
45
|
+
*
|
|
46
|
+
* ```astro nocollapse
|
|
47
|
+
* ---
|
|
48
|
+
* import { Checkbox } from '@bejamas/ui/components/checkbox';
|
|
49
|
+
* import { Label } from '@bejamas/ui/components/label';
|
|
50
|
+
* ---
|
|
51
|
+
*
|
|
52
|
+
* <div class="flex items-center gap-3">
|
|
53
|
+
* <Checkbox id="terms" />
|
|
54
|
+
* <Label for="terms">Accept terms and conditions</Label>
|
|
55
|
+
* </div>
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @examples
|
|
59
|
+
*
|
|
60
|
+
* ### Sizes
|
|
61
|
+
*
|
|
62
|
+
* <div class="flex items-center gap-6">
|
|
63
|
+
* <Checkbox id="size-default" checked />
|
|
64
|
+
* <Checkbox id="size-lg" size="lg" checked />
|
|
65
|
+
* </div>
|
|
66
|
+
*
|
|
67
|
+
* ### Indeterminate
|
|
68
|
+
*
|
|
69
|
+
* <Checkbox id="indeterminate-example" indeterminate />
|
|
70
|
+
*/
|
|
71
|
+
import { cva } from "class-variance-authority";
|
|
72
|
+
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
73
|
+
import type { HTMLAttributes } from "astro/types";
|
|
74
|
+
|
|
75
|
+
interface Props extends HTMLAttributes<"input"> {
|
|
76
|
+
class?: string;
|
|
77
|
+
id?: string;
|
|
78
|
+
name?: string;
|
|
79
|
+
size?: "default" | "lg";
|
|
80
|
+
indeterminate?: boolean;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const {
|
|
84
|
+
class: className = "",
|
|
85
|
+
id = "",
|
|
86
|
+
name = id,
|
|
87
|
+
size = "default",
|
|
88
|
+
indeterminate = false,
|
|
89
|
+
...props
|
|
90
|
+
} = Astro.props as Props;
|
|
91
|
+
|
|
92
|
+
const checkboxVariants = cva(
|
|
93
|
+
"peer appearance-none shrink-0 rounded-sm border border-input shadow-xs outline-none transition-colors checked:bg-primary checked:border-primary indeterminate:bg-primary indeterminate:border-primary dark:bg-input/30 dark:checked:bg-primary dark:checked:border-primary dark:indeterminate:bg-primary dark:indeterminate:border-primary focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:border-ring aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:checked:border-primary disabled:cursor-not-allowed disabled:bg-muted disabled:border-input group-has-disabled/field:opacity-50 relative after:absolute after:-inset-x-3 after:-inset-y-2",
|
|
94
|
+
{
|
|
95
|
+
variants: {
|
|
96
|
+
size: {
|
|
97
|
+
default: "size-4",
|
|
98
|
+
lg: "size-5",
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
defaultVariants: {
|
|
102
|
+
size: "default",
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
const indicatorVariants = cva(
|
|
108
|
+
"pointer-events-none absolute inset-0 grid place-content-center transition-opacity peer-disabled:text-muted-foreground text-primary-foreground",
|
|
109
|
+
{
|
|
110
|
+
variants: {
|
|
111
|
+
size: {
|
|
112
|
+
default: "[&>svg]:size-3",
|
|
113
|
+
lg: "[&>svg]:size-4",
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
defaultVariants: {
|
|
117
|
+
size: "default",
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
// Icon geometry matches Figma exactly per size (viewBox = native px, stroke-width 1.5)
|
|
123
|
+
// rather than scaling a single 24px icon, which rendered the stroke ~33% thinner than Figma.
|
|
124
|
+
const iconViewBox = size === "lg" ? "0 0 16 16" : "0 0 12 12";
|
|
125
|
+
const checkPath = size === "lg" ? "M13.3333 4L6 11.3333L2.66667 8" : "M10 3L4.5 8.5L2 6";
|
|
126
|
+
const dashPath = size === "lg" ? "M3.33333 8H12.6667" : "M2.5 6H9.5";
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
<label data-slot="checkbox" class="inline-flex items-center gap-2 cursor-pointer">
|
|
130
|
+
<span class="relative inline-flex items-center justify-center">
|
|
131
|
+
<input
|
|
132
|
+
id={id}
|
|
133
|
+
name={name}
|
|
134
|
+
type="checkbox"
|
|
135
|
+
data-indeterminate={indeterminate ? "" : undefined}
|
|
136
|
+
class={cn(checkboxVariants({ size }), className)}
|
|
137
|
+
{...props}
|
|
138
|
+
/>
|
|
139
|
+
<span
|
|
140
|
+
data-slot="checkbox-indicator"
|
|
141
|
+
class={cn(indicatorVariants({ size }), "opacity-0 peer-checked:opacity-100 peer-indeterminate:opacity-0")}
|
|
142
|
+
>
|
|
143
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox={iconViewBox}><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d={checkPath}/></svg>
|
|
144
|
+
</span>
|
|
145
|
+
<span
|
|
146
|
+
data-slot="checkbox-indeterminate-indicator"
|
|
147
|
+
class={cn(indicatorVariants({ size }), "opacity-0 peer-indeterminate:opacity-100")}
|
|
148
|
+
>
|
|
149
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox={iconViewBox}><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d={dashPath}/></svg>
|
|
150
|
+
</span>
|
|
151
|
+
</span>
|
|
152
|
+
<slot />
|
|
153
|
+
</label>
|
|
154
|
+
|
|
155
|
+
<script>
|
|
156
|
+
document.querySelectorAll("input[data-indeterminate]").forEach((el) => {
|
|
157
|
+
(el as HTMLInputElement).indeterminate = true;
|
|
158
|
+
});
|
|
159
|
+
</script>
|