@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,233 +1,233 @@
|
|
|
1
|
-
---
|
|
2
|
-
/**
|
|
3
|
-
* @component Button
|
|
4
|
-
* @title Button
|
|
5
|
-
* @description A clickable element for triggering actions or submitting forms.
|
|
6
|
-
* @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=74-1461
|
|
7
|
-
*
|
|
8
|
-
* @preview
|
|
9
|
-
*
|
|
10
|
-
* <div class="flex flex-wrap items-center gap-2 md:flex-row">
|
|
11
|
-
* <Button>Button</Button>
|
|
12
|
-
* <Button variant="outline" size="icon" aria-label="Submit">
|
|
13
|
-
* <ArrowUpIcon />
|
|
14
|
-
* </Button>
|
|
15
|
-
* </div>
|
|
16
|
-
*
|
|
17
|
-
* @usage
|
|
18
|
-
*
|
|
19
|
-
* ```astro nocollapse
|
|
20
|
-
* ---
|
|
21
|
-
* import { Button } from '@bejamas/ui/components/button';
|
|
22
|
-
* ---
|
|
23
|
-
*
|
|
24
|
-
* <Button>Click me</Button>
|
|
25
|
-
* ```
|
|
26
|
-
*
|
|
27
|
-
* ## Link
|
|
28
|
-
*
|
|
29
|
-
* You can use the `as` prop to render the component as an anchor.
|
|
30
|
-
*
|
|
31
|
-
* ```astro nocollapse
|
|
32
|
-
* ---
|
|
33
|
-
* import { Button } from '@bejamas/ui/components/button';
|
|
34
|
-
* ---
|
|
35
|
-
*
|
|
36
|
-
* <Button as="a" href="https://bejamas.com">Click me</Button>
|
|
37
|
-
* ```
|
|
38
|
-
*
|
|
39
|
-
* @examples
|
|
40
|
-
*
|
|
41
|
-
* ### Variants
|
|
42
|
-
*
|
|
43
|
-
* <div class="flex flex-col items-start gap-8 sm:flex-row">
|
|
44
|
-
* <Button variant="default">Default</Button>
|
|
45
|
-
* <Button variant="secondary">Secondary</Button>
|
|
46
|
-
* <Button variant="outline">Outline</Button>
|
|
47
|
-
* <Button variant="ghost">Ghost</Button>
|
|
48
|
-
* <Button variant="destructive">Destructive</Button>
|
|
49
|
-
* </div>
|
|
50
|
-
*
|
|
51
|
-
* ### Sizes
|
|
52
|
-
*
|
|
53
|
-
* <div class="flex flex-col items-start gap-8 sm:flex-row">
|
|
54
|
-
* <div class="flex items-start gap-2">
|
|
55
|
-
* <Button size="sm" variant="outline">
|
|
56
|
-
* Small
|
|
57
|
-
* </Button>
|
|
58
|
-
* <Button size="icon-sm" aria-label="Submit" variant="outline">
|
|
59
|
-
* <ArrowUpRightIcon />
|
|
60
|
-
* </Button>
|
|
61
|
-
* </div>
|
|
62
|
-
* <div class="flex items-start gap-2">
|
|
63
|
-
* <Button variant="outline">Default</Button>
|
|
64
|
-
* <Button size="icon" aria-label="Submit" variant="outline">
|
|
65
|
-
* <ArrowUpRightIcon />
|
|
66
|
-
* </Button>
|
|
67
|
-
* </div>
|
|
68
|
-
* <div class="flex items-start gap-2">
|
|
69
|
-
* <Button variant="outline" size="lg">
|
|
70
|
-
* Large
|
|
71
|
-
* </Button>
|
|
72
|
-
* <Button size="icon-lg" aria-label="Submit" variant="outline">
|
|
73
|
-
* <ArrowUpRightIcon />
|
|
74
|
-
* </Button>
|
|
75
|
-
* </div>
|
|
76
|
-
* </div>
|
|
77
|
-
*
|
|
78
|
-
* ### With icons
|
|
79
|
-
*
|
|
80
|
-
* <div class="flex flex-wrap items-center gap-2">
|
|
81
|
-
* <Button leadIcon>
|
|
82
|
-
* <ArrowUpIcon slot="lead-icon" />
|
|
83
|
-
* Click me
|
|
84
|
-
* </Button>
|
|
85
|
-
* <Button variant="outline" tailIcon>
|
|
86
|
-
* Click me
|
|
87
|
-
* <ArrowUpRightIcon slot="tail-icon" />
|
|
88
|
-
* </Button>
|
|
89
|
-
* </div>
|
|
90
|
-
*
|
|
91
|
-
* ### With badge
|
|
92
|
-
*
|
|
93
|
-
* <Button variant="default" badge>
|
|
94
|
-
* Click me
|
|
95
|
-
* <Badge slot="badge" variant="secondary" shape="sharp" size="sm">Value</Badge>
|
|
96
|
-
* </Button>
|
|
97
|
-
*
|
|
98
|
-
* ### Destructive
|
|
99
|
-
*
|
|
100
|
-
* <Button variant="destructive">Click me</Button>
|
|
101
|
-
*
|
|
102
|
-
* ### Outline
|
|
103
|
-
*
|
|
104
|
-
* <Button variant="outline">Click me</Button>
|
|
105
|
-
*
|
|
106
|
-
* ### Secondary
|
|
107
|
-
*
|
|
108
|
-
* <Button variant="secondary">Click me</Button>
|
|
109
|
-
*
|
|
110
|
-
* ### Ghost
|
|
111
|
-
*
|
|
112
|
-
* <Button variant="ghost">Click me</Button>
|
|
113
|
-
*
|
|
114
|
-
* ### Link
|
|
115
|
-
*
|
|
116
|
-
* <Button variant="link">Click me</Button>
|
|
117
|
-
*
|
|
118
|
-
* ### Default
|
|
119
|
-
*
|
|
120
|
-
* <Button>Click me</Button>
|
|
121
|
-
*
|
|
122
|
-
*/
|
|
123
|
-
|
|
124
|
-
import type { HTMLAttributes } from "astro/types";
|
|
125
|
-
import { cva, type VariantProps } from "class-variance-authority";
|
|
126
|
-
|
|
127
|
-
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
128
|
-
|
|
129
|
-
const buttonVariants = cva(
|
|
130
|
-
"group/button inline-flex shrink-0 items-center justify-center whitespace-nowrap transition-all outline-none select-none disabled:pointer-events-none disabled:border-transparent disabled:bg-muted disabled:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
131
|
-
{
|
|
132
|
-
variants: {
|
|
133
|
-
variant: {
|
|
134
|
-
default: "bg-primary text-primary-foreground hover:bg-primary/80",
|
|
135
|
-
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive-hover",
|
|
136
|
-
outline: "border border-border bg-background text-foreground hover:bg-background-hover",
|
|
137
|
-
secondary: "bg-secondary text-secondary-foreground hover:bg-background-button-hover",
|
|
138
|
-
ghost: "text-foreground hover:bg-background-hover",
|
|
139
|
-
link: "text-primary hover:bg-background-hover hover:underline",
|
|
140
|
-
},
|
|
141
|
-
size: {
|
|
142
|
-
default: "h-9 gap-1 px-2.5 text-xs [&_svg]:size-4",
|
|
143
|
-
sm: "h-8 gap-1 px-2 text-xs [&_svg]:size-3.5",
|
|
144
|
-
lg: "h-10 gap-1 px-2.5 text-sm [&_svg]:size-5",
|
|
145
|
-
icon: "size-9 [&_svg]:size-4",
|
|
146
|
-
"icon-sm": "size-8 [&_svg]:size-3.5",
|
|
147
|
-
"icon-lg": "size-10 [&_svg]:size-5",
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
defaultVariants: {
|
|
151
|
-
variant: "default",
|
|
152
|
-
size: "default",
|
|
153
|
-
},
|
|
154
|
-
},
|
|
155
|
-
);
|
|
156
|
-
|
|
157
|
-
type ButtonVariantProps = VariantProps<typeof buttonVariants>;
|
|
158
|
-
|
|
159
|
-
type ButtonAsButton = {
|
|
160
|
-
as?: "button";
|
|
161
|
-
} & HTMLAttributes<"button">;
|
|
162
|
-
|
|
163
|
-
type ButtonAsAnchor = {
|
|
164
|
-
as: "a";
|
|
165
|
-
} & HTMLAttributes<"a">;
|
|
166
|
-
|
|
167
|
-
type ButtonOwnProps = ButtonVariantProps & {
|
|
168
|
-
leadIcon?: boolean;
|
|
169
|
-
tailIcon?: boolean;
|
|
170
|
-
badge?: boolean;
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
export type Props = (ButtonAsButton | ButtonAsAnchor) & ButtonOwnProps;
|
|
174
|
-
|
|
175
|
-
const hasLeadIconSlot = Astro.slots.has("lead-icon");
|
|
176
|
-
const hasTailIconSlot = Astro.slots.has("tail-icon");
|
|
177
|
-
const hasBadgeSlot = Astro.slots.has("badge");
|
|
178
|
-
|
|
179
|
-
const {
|
|
180
|
-
as: Tag = "button",
|
|
181
|
-
variant = "default",
|
|
182
|
-
size = "default",
|
|
183
|
-
leadIcon = hasLeadIconSlot,
|
|
184
|
-
tailIcon = hasTailIconSlot,
|
|
185
|
-
badge = hasBadgeSlot,
|
|
186
|
-
class: className = "",
|
|
187
|
-
...rest
|
|
188
|
-
} = Astro.props as Props;
|
|
189
|
-
---
|
|
190
|
-
|
|
191
|
-
{
|
|
192
|
-
/*
|
|
193
|
-
TS can't reconcile our discriminated union props with a dynamic intrinsic Tag.
|
|
194
|
-
The public Props type *is* strict (href only allowed when as="a"),
|
|
195
|
-
but JSX wants an intersection of button+anchor attributes here.
|
|
196
|
-
We deliberately suppress this internal error and rely on Props for caller safety.
|
|
197
|
-
*/
|
|
198
|
-
}
|
|
199
|
-
<!-- @ts-expect-error – union Props + dynamic Tag confuse JSX typing (see comment above) -->
|
|
200
|
-
<Tag
|
|
201
|
-
data-slot="button"
|
|
202
|
-
data-variant={variant}
|
|
203
|
-
data-size={size}
|
|
204
|
-
class={cn(
|
|
205
|
-
"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-chart-1 in-data-[slot=button-group]:hover:bg-background-hover in-data-[slot=button-group]:hover:border-badge-accent aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-lg border border-transparent bg-clip-padding font-semibold aria-invalid:ring-3 ease-out duration-150 active:scale-98",
|
|
206
|
-
buttonVariants({ variant, size }),
|
|
207
|
-
className,
|
|
208
|
-
)}
|
|
209
|
-
{...rest}
|
|
210
|
-
>
|
|
211
|
-
{
|
|
212
|
-
leadIcon && (
|
|
213
|
-
<span data-slot="button-lead-icon" class="inline-flex shrink-0 items-center">
|
|
214
|
-
<slot name="lead-icon" />
|
|
215
|
-
</span>
|
|
216
|
-
)
|
|
217
|
-
}
|
|
218
|
-
<slot />
|
|
219
|
-
{
|
|
220
|
-
badge && (
|
|
221
|
-
<span data-slot="button-badge" class="inline-flex shrink-0 items-center">
|
|
222
|
-
<slot name="badge" />
|
|
223
|
-
</span>
|
|
224
|
-
)
|
|
225
|
-
}
|
|
226
|
-
{
|
|
227
|
-
tailIcon && (
|
|
228
|
-
<span data-slot="button-tail-icon" class="inline-flex shrink-0 items-center">
|
|
229
|
-
<slot name="tail-icon" />
|
|
230
|
-
</span>
|
|
231
|
-
)
|
|
232
|
-
}
|
|
233
|
-
</Tag>
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* @component Button
|
|
4
|
+
* @title Button
|
|
5
|
+
* @description A clickable element for triggering actions or submitting forms.
|
|
6
|
+
* @figmaUrl https://www.figma.com/design/qXkzdqZ3QPQqgckU3AwIAH/ClickLearn-Lightning-Design-Library?node-id=74-1461
|
|
7
|
+
*
|
|
8
|
+
* @preview
|
|
9
|
+
*
|
|
10
|
+
* <div class="flex flex-wrap items-center gap-2 md:flex-row">
|
|
11
|
+
* <Button>Button</Button>
|
|
12
|
+
* <Button variant="outline" size="icon" aria-label="Submit">
|
|
13
|
+
* <ArrowUpIcon />
|
|
14
|
+
* </Button>
|
|
15
|
+
* </div>
|
|
16
|
+
*
|
|
17
|
+
* @usage
|
|
18
|
+
*
|
|
19
|
+
* ```astro nocollapse
|
|
20
|
+
* ---
|
|
21
|
+
* import { Button } from '@bejamas/ui/components/button';
|
|
22
|
+
* ---
|
|
23
|
+
*
|
|
24
|
+
* <Button>Click me</Button>
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* ## Link
|
|
28
|
+
*
|
|
29
|
+
* You can use the `as` prop to render the component as an anchor.
|
|
30
|
+
*
|
|
31
|
+
* ```astro nocollapse
|
|
32
|
+
* ---
|
|
33
|
+
* import { Button } from '@bejamas/ui/components/button';
|
|
34
|
+
* ---
|
|
35
|
+
*
|
|
36
|
+
* <Button as="a" href="https://bejamas.com">Click me</Button>
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @examples
|
|
40
|
+
*
|
|
41
|
+
* ### Variants
|
|
42
|
+
*
|
|
43
|
+
* <div class="flex flex-col items-start gap-8 sm:flex-row">
|
|
44
|
+
* <Button variant="default">Default</Button>
|
|
45
|
+
* <Button variant="secondary">Secondary</Button>
|
|
46
|
+
* <Button variant="outline">Outline</Button>
|
|
47
|
+
* <Button variant="ghost">Ghost</Button>
|
|
48
|
+
* <Button variant="destructive">Destructive</Button>
|
|
49
|
+
* </div>
|
|
50
|
+
*
|
|
51
|
+
* ### Sizes
|
|
52
|
+
*
|
|
53
|
+
* <div class="flex flex-col items-start gap-8 sm:flex-row">
|
|
54
|
+
* <div class="flex items-start gap-2">
|
|
55
|
+
* <Button size="sm" variant="outline">
|
|
56
|
+
* Small
|
|
57
|
+
* </Button>
|
|
58
|
+
* <Button size="icon-sm" aria-label="Submit" variant="outline">
|
|
59
|
+
* <ArrowUpRightIcon />
|
|
60
|
+
* </Button>
|
|
61
|
+
* </div>
|
|
62
|
+
* <div class="flex items-start gap-2">
|
|
63
|
+
* <Button variant="outline">Default</Button>
|
|
64
|
+
* <Button size="icon" aria-label="Submit" variant="outline">
|
|
65
|
+
* <ArrowUpRightIcon />
|
|
66
|
+
* </Button>
|
|
67
|
+
* </div>
|
|
68
|
+
* <div class="flex items-start gap-2">
|
|
69
|
+
* <Button variant="outline" size="lg">
|
|
70
|
+
* Large
|
|
71
|
+
* </Button>
|
|
72
|
+
* <Button size="icon-lg" aria-label="Submit" variant="outline">
|
|
73
|
+
* <ArrowUpRightIcon />
|
|
74
|
+
* </Button>
|
|
75
|
+
* </div>
|
|
76
|
+
* </div>
|
|
77
|
+
*
|
|
78
|
+
* ### With icons
|
|
79
|
+
*
|
|
80
|
+
* <div class="flex flex-wrap items-center gap-2">
|
|
81
|
+
* <Button leadIcon>
|
|
82
|
+
* <ArrowUpIcon slot="lead-icon" />
|
|
83
|
+
* Click me
|
|
84
|
+
* </Button>
|
|
85
|
+
* <Button variant="outline" tailIcon>
|
|
86
|
+
* Click me
|
|
87
|
+
* <ArrowUpRightIcon slot="tail-icon" />
|
|
88
|
+
* </Button>
|
|
89
|
+
* </div>
|
|
90
|
+
*
|
|
91
|
+
* ### With badge
|
|
92
|
+
*
|
|
93
|
+
* <Button variant="default" badge>
|
|
94
|
+
* Click me
|
|
95
|
+
* <Badge slot="badge" variant="secondary" shape="sharp" size="sm">Value</Badge>
|
|
96
|
+
* </Button>
|
|
97
|
+
*
|
|
98
|
+
* ### Destructive
|
|
99
|
+
*
|
|
100
|
+
* <Button variant="destructive">Click me</Button>
|
|
101
|
+
*
|
|
102
|
+
* ### Outline
|
|
103
|
+
*
|
|
104
|
+
* <Button variant="outline">Click me</Button>
|
|
105
|
+
*
|
|
106
|
+
* ### Secondary
|
|
107
|
+
*
|
|
108
|
+
* <Button variant="secondary">Click me</Button>
|
|
109
|
+
*
|
|
110
|
+
* ### Ghost
|
|
111
|
+
*
|
|
112
|
+
* <Button variant="ghost">Click me</Button>
|
|
113
|
+
*
|
|
114
|
+
* ### Link
|
|
115
|
+
*
|
|
116
|
+
* <Button variant="link">Click me</Button>
|
|
117
|
+
*
|
|
118
|
+
* ### Default
|
|
119
|
+
*
|
|
120
|
+
* <Button>Click me</Button>
|
|
121
|
+
*
|
|
122
|
+
*/
|
|
123
|
+
|
|
124
|
+
import type { HTMLAttributes } from "astro/types";
|
|
125
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
126
|
+
|
|
127
|
+
import { cn } from "@cl-light-ds/ui/lib/utils";
|
|
128
|
+
|
|
129
|
+
const buttonVariants = cva(
|
|
130
|
+
"group/button inline-flex shrink-0 items-center justify-center whitespace-nowrap transition-all outline-none select-none disabled:pointer-events-none disabled:border-transparent disabled:bg-muted disabled:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
131
|
+
{
|
|
132
|
+
variants: {
|
|
133
|
+
variant: {
|
|
134
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/80",
|
|
135
|
+
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive-hover",
|
|
136
|
+
outline: "border border-border bg-background text-foreground hover:bg-background-hover",
|
|
137
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-background-button-hover",
|
|
138
|
+
ghost: "text-foreground hover:bg-background-hover",
|
|
139
|
+
link: "text-primary hover:bg-background-hover hover:underline",
|
|
140
|
+
},
|
|
141
|
+
size: {
|
|
142
|
+
default: "h-9 gap-1 px-2.5 text-xs [&_svg]:size-4",
|
|
143
|
+
sm: "h-8 gap-1 px-2 text-xs [&_svg]:size-3.5",
|
|
144
|
+
lg: "h-10 gap-1 px-2.5 text-sm [&_svg]:size-5",
|
|
145
|
+
icon: "size-9 [&_svg]:size-4",
|
|
146
|
+
"icon-sm": "size-8 [&_svg]:size-3.5",
|
|
147
|
+
"icon-lg": "size-10 [&_svg]:size-5",
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
defaultVariants: {
|
|
151
|
+
variant: "default",
|
|
152
|
+
size: "default",
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
type ButtonVariantProps = VariantProps<typeof buttonVariants>;
|
|
158
|
+
|
|
159
|
+
type ButtonAsButton = {
|
|
160
|
+
as?: "button";
|
|
161
|
+
} & HTMLAttributes<"button">;
|
|
162
|
+
|
|
163
|
+
type ButtonAsAnchor = {
|
|
164
|
+
as: "a";
|
|
165
|
+
} & HTMLAttributes<"a">;
|
|
166
|
+
|
|
167
|
+
type ButtonOwnProps = ButtonVariantProps & {
|
|
168
|
+
leadIcon?: boolean;
|
|
169
|
+
tailIcon?: boolean;
|
|
170
|
+
badge?: boolean;
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export type Props = (ButtonAsButton | ButtonAsAnchor) & ButtonOwnProps;
|
|
174
|
+
|
|
175
|
+
const hasLeadIconSlot = Astro.slots.has("lead-icon");
|
|
176
|
+
const hasTailIconSlot = Astro.slots.has("tail-icon");
|
|
177
|
+
const hasBadgeSlot = Astro.slots.has("badge");
|
|
178
|
+
|
|
179
|
+
const {
|
|
180
|
+
as: Tag = "button",
|
|
181
|
+
variant = "default",
|
|
182
|
+
size = "default",
|
|
183
|
+
leadIcon = hasLeadIconSlot,
|
|
184
|
+
tailIcon = hasTailIconSlot,
|
|
185
|
+
badge = hasBadgeSlot,
|
|
186
|
+
class: className = "",
|
|
187
|
+
...rest
|
|
188
|
+
} = Astro.props as Props;
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
{
|
|
192
|
+
/*
|
|
193
|
+
TS can't reconcile our discriminated union props with a dynamic intrinsic Tag.
|
|
194
|
+
The public Props type *is* strict (href only allowed when as="a"),
|
|
195
|
+
but JSX wants an intersection of button+anchor attributes here.
|
|
196
|
+
We deliberately suppress this internal error and rely on Props for caller safety.
|
|
197
|
+
*/
|
|
198
|
+
}
|
|
199
|
+
<!-- @ts-expect-error – union Props + dynamic Tag confuse JSX typing (see comment above) -->
|
|
200
|
+
<Tag
|
|
201
|
+
data-slot="button"
|
|
202
|
+
data-variant={variant}
|
|
203
|
+
data-size={size}
|
|
204
|
+
class={cn(
|
|
205
|
+
"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-chart-1 in-data-[slot=button-group]:hover:bg-background-hover in-data-[slot=button-group]:hover:border-badge-accent aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-lg border border-transparent bg-clip-padding font-semibold aria-invalid:ring-3 ease-out duration-150 active:scale-98",
|
|
206
|
+
buttonVariants({ variant, size }),
|
|
207
|
+
className,
|
|
208
|
+
)}
|
|
209
|
+
{...rest}
|
|
210
|
+
>
|
|
211
|
+
{
|
|
212
|
+
leadIcon && (
|
|
213
|
+
<span data-slot="button-lead-icon" class="inline-flex shrink-0 items-center">
|
|
214
|
+
<slot name="lead-icon" />
|
|
215
|
+
</span>
|
|
216
|
+
)
|
|
217
|
+
}
|
|
218
|
+
<slot />
|
|
219
|
+
{
|
|
220
|
+
badge && (
|
|
221
|
+
<span data-slot="button-badge" class="inline-flex shrink-0 items-center">
|
|
222
|
+
<slot name="badge" />
|
|
223
|
+
</span>
|
|
224
|
+
)
|
|
225
|
+
}
|
|
226
|
+
{
|
|
227
|
+
tailIcon && (
|
|
228
|
+
<span data-slot="button-tail-icon" class="inline-flex shrink-0 items-center">
|
|
229
|
+
<slot name="tail-icon" />
|
|
230
|
+
</span>
|
|
231
|
+
)
|
|
232
|
+
}
|
|
233
|
+
</Tag>
|