@cl-light-ds/ui 0.2.0 → 0.3.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/accordion/CHANGELOG.md +41 -41
- package/src/components/accordion/index.ts +4 -4
- 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/alert/CHANGELOG.md +5 -5
- package/src/components/alert/index.ts +4 -4
- 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/avatar/CHANGELOG.md +44 -44
- package/src/components/avatar/index.ts +6 -6
- package/src/components/badge/Badge.astro +167 -167
- package/src/components/badge/CHANGELOG.md +49 -49
- package/src/components/badge/index.ts +2 -2
- 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/breadcrumb/CHANGELOG.md +24 -24
- package/src/components/breadcrumb/index.ts +5 -5
- package/src/components/button/Button.astro +233 -233
- package/src/components/button/CHANGELOG.md +41 -41
- package/src/components/button/index.ts +2 -2
- 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/button-group/CHANGELOG.md +34 -34
- package/src/components/button-group/index.ts +3 -3
- package/src/components/card/CHANGELOG.md +162 -119
- package/src/components/card/Card.astro +197 -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/CardMediaActions.astro +21 -0
- package/src/components/card/CardMediaSelect.astro +21 -0
- package/src/components/card/CardOverlay.astro +32 -32
- package/src/components/card/CardTitle.astro +21 -21
- package/src/components/card/index.ts +12 -10
- package/src/components/carousel/CHANGELOG.md +5 -5
- package/src/components/carousel/Carousel.astro +106 -106
- package/src/components/carousel/CarouselSlide.astro +22 -22
- package/src/components/carousel/index.ts +3 -3
- package/src/components/checkbox/CHANGELOG.md +58 -58
- package/src/components/checkbox/Checkbox.astro +159 -159
- package/src/components/checkbox/index.ts +1 -1
- package/src/components/collapsible/CHANGELOG.md +5 -5
- 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/collapsible/index.ts +4 -4
- package/src/components/combobox/CHANGELOG.md +27 -27
- 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/combobox/index.ts +11 -11
- package/src/components/date/CHANGELOG.md +18 -18
- package/src/components/date/Date.astro +137 -137
- package/src/components/date/index.ts +2 -2
- package/src/components/dialog/CHANGELOG.md +39 -39
- 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/dialog/index.ts +9 -9
- package/src/components/dropdown-menu/CHANGELOG.md +194 -194
- 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/DropdownMenuItemContent.astro +79 -79
- package/src/components/dropdown-menu/DropdownMenuLabel.astro +20 -20
- package/src/components/dropdown-menu/DropdownMenuPortal.astro +13 -13
- package/src/components/dropdown-menu/DropdownMenuRadioGroup.astro +13 -13
- 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/dropdown-menu/dropdown-menu-item-variants.ts +24 -24
- package/src/components/dropdown-menu/index.ts +12 -12
- package/src/components/field/CHANGELOG.md +33 -33
- 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/field/index.ts +10 -10
- package/src/components/hover-card/CHANGELOG.md +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/hover-card/index.ts +3 -3
- package/src/components/input/CHANGELOG.md +29 -29
- package/src/components/input/Input.astro +130 -130
- package/src/components/input/index.ts +2 -2
- package/src/components/input-group/CHANGELOG.md +49 -49
- 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/input-group/controlClasses.ts +2 -2
- package/src/components/input-group/index.ts +6 -6
- package/src/components/item/CHANGELOG.md +27 -27
- 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/item/index.ts +10 -10
- package/src/components/kbd/CHANGELOG.md +5 -5
- package/src/components/kbd/Kbd.astro +145 -145
- package/src/components/kbd/KbdGroup.astro +55 -55
- package/src/components/kbd/index.ts +2 -2
- package/src/components/label/CHANGELOG.md +28 -28
- package/src/components/label/Label.astro +97 -97
- package/src/components/label/index.ts +2 -2
- package/src/components/link-group/CHANGELOG.md +75 -75
- 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/link-group/index.ts +5 -5
- package/src/components/link-group/link-group-list-variants.ts +15 -15
- package/src/components/marquee/CHANGELOG.md +5 -5
- package/src/components/marquee/Marquee.astro +119 -119
- package/src/components/marquee/index.ts +2 -2
- package/src/components/native-select/CHANGELOG.md +5 -5
- package/src/components/native-select/NativeSelect.astro +125 -125
- package/src/components/native-select/NativeSelectOptGroup.astro +14 -14
- package/src/components/native-select/NativeSelectOption.astro +9 -9
- package/src/components/native-select/index.ts +3 -3
- package/src/components/navigation-menu/CHANGELOG.md +63 -63
- 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/navigation-menu/index.ts +10 -10
- package/src/components/organisms/lightning-sidebar-nav/CHANGELOG.md +50 -0
- package/src/components/organisms/lightning-sidebar-nav/LightningSidebarNav.astro +176 -0
- package/src/components/organisms/lightning-sidebar-nav/SidebarNav.astro +50 -0
- package/src/components/organisms/lightning-sidebar-nav/SidebarNavGroup.astro +74 -0
- package/src/components/organisms/lightning-sidebar-nav/SidebarNavItem.astro +94 -0
- package/src/components/organisms/lightning-sidebar-nav/SidebarNavProBadge.astro +26 -0
- package/src/components/organisms/lightning-sidebar-nav/SidebarNavSection.astro +71 -0
- package/src/components/organisms/lightning-sidebar-nav/SidebarNavSkeleton.astro +67 -0
- package/src/components/organisms/lightning-sidebar-nav/SidebarNavSubItem.astro +69 -0
- package/src/components/organisms/lightning-sidebar-nav/SidebarNavUsage.astro +78 -0
- package/src/components/organisms/lightning-sidebar-nav/SidebarNavWorkspaceAvatar.astro +46 -0
- package/src/components/organisms/lightning-sidebar-nav/SidebarNavWorkspaceSwitcher.astro +130 -0
- package/src/components/organisms/lightning-sidebar-nav/icons.ts +46 -0
- package/src/components/organisms/lightning-sidebar-nav/index.ts +18 -0
- package/src/components/organisms/lightning-sidebar-nav/types.ts +77 -0
- package/src/components/popover/CHANGELOG.md +20 -20
- package/src/components/popover/Popover.astro +211 -211
- package/src/components/popover/PopoverClose.astro +18 -18
- package/src/components/popover/PopoverContent.astro +50 -50
- 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 -35
- package/src/components/popover/index.ts +7 -7
- package/src/components/radio-group/CHANGELOG.md +31 -31
- package/src/components/radio-group/RadioGroup.astro +81 -81
- package/src/components/radio-group/RadioGroupItem.astro +51 -51
- package/src/components/radio-group/index.ts +3 -3
- package/src/components/select/CHANGELOG.md +39 -39
- 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/select/index.ts +8 -8
- package/src/components/separator/CHANGELOG.md +5 -5
- package/src/components/separator/Separator.astro +60 -60
- package/src/components/separator/index.ts +2 -2
- package/src/components/skeleton/CHANGELOG.md +5 -5
- package/src/components/skeleton/Skeleton.astro +121 -121
- package/src/components/skeleton/index.ts +1 -1
- package/src/components/slider/CHANGELOG.md +5 -5
- package/src/components/slider/Slider.astro +198 -198
- package/src/components/slider/index.ts +1 -1
- package/src/components/spinner/CHANGELOG.md +18 -18
- package/src/components/spinner/Spinner.astro +135 -135
- package/src/components/spinner/index.ts +1 -1
- package/src/components/sticky-surface/CHANGELOG.md +5 -5
- package/src/components/sticky-surface/StickySurface.astro +152 -152
- package/src/components/sticky-surface/index.ts +2 -2
- package/src/components/switch/CHANGELOG.md +29 -29
- package/src/components/switch/Switch.astro +106 -106
- package/src/components/switch/index.ts +1 -1
- package/src/components/table/CHANGELOG.md +24 -24
- package/src/components/table/Table.astro +358 -251
- package/src/components/table/TableBody.astro +17 -18
- package/src/components/table/TableBulkToolbar.astro +37 -0
- package/src/components/table/TableCaption.astro +17 -17
- package/src/components/table/TableCell.astro +45 -21
- package/src/components/table/TableCellText.astro +17 -0
- package/src/components/table/TableColumnMenu.astro +50 -0
- package/src/components/table/TableEditableCell.astro +287 -0
- package/src/components/table/TableEmpty.astro +17 -0
- package/src/components/table/TableFolderCell.astro +38 -0
- package/src/components/table/TableFooter.astro +21 -21
- package/src/components/table/TableHead.astro +90 -21
- package/src/components/table/TableHeader.astro +17 -17
- package/src/components/table/TablePagination.astro +57 -0
- package/src/components/table/TableRow.astro +52 -21
- package/src/components/table/TableSelectAllBanner.astro +34 -0
- package/src/components/table/TableSelectCell.astro +50 -0
- package/src/components/table/TableSkeletonRow.astro +21 -0
- package/src/components/table/index.ts +19 -9
- package/src/components/table/table-cell-variants.ts +29 -0
- package/src/components/tabs/CHANGELOG.md +5 -5
- 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/tabs/index.ts +6 -6
- package/src/components/textarea/CHANGELOG.md +22 -22
- package/src/components/textarea/Textarea.astro +58 -58
- package/src/components/textarea/index.ts +2 -2
- package/src/components/toggle/CHANGELOG.md +23 -23
- package/src/components/toggle/Toggle.astro +150 -150
- package/src/components/toggle/index.ts +1 -1
- package/src/components/toggle-group/CHANGELOG.md +18 -18
- package/src/components/toggle-group/ToggleGroup.astro +236 -236
- package/src/components/toggle-group/ToggleGroupItem.astro +48 -48
- package/src/components/toggle-group/index.ts +2 -2
- package/src/components/tooltip/CHANGELOG.md +22 -22
- package/src/components/tooltip/Tooltip.astro +357 -357
- package/src/components/tooltip/TooltipContent.astro +85 -85
- package/src/components/tooltip/TooltipTrigger.astro +34 -34
- package/src/components/tooltip/index.ts +3 -3
- package/src/lib/table-controller.ts +1090 -0
- package/src/lib/toggle-group-controller.ts +113 -113
- package/src/lib/toggle-shared.ts +27 -27
- package/src/lib/utils.ts +6 -6
- package/src/styles/globals.css +197 -177
|
@@ -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>
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
# Changelog for Button.astro
|
|
2
|
-
|
|
3
|
-
All notable changes to the `Button` component will be documented in this file.
|
|
4
|
-
|
|
5
|
-
## Date 8th Sep 2026
|
|
6
|
-
## Figma alignment (node 114-6897, prop table 7185-13418)
|
|
7
|
-
|
|
8
|
-
### Variants
|
|
9
|
-
|
|
10
|
-
- **Primary:** removed the duplicated/conflicting hover utilities (`hover:bg-primary/80` next to `hover:bg-primary/90`); Figma's hover state resolves to `#3785e0cc`, i.e. `bg-primary` at 80% opacity. Kept `hover:bg-primary/80` only.
|
|
11
|
-
- **Destructive:** completely rebuilt. It previously mixed `text-destructive` and `text-white`, and stacked four different hover opacities (`/20`, `/30`, `/60`, `/90`) across light/dark. Figma's destructive is flat: `bg-destructive text-destructive-foreground`, hover `bg-destructive-hover` (`#ef4444`, already an existing token).
|
|
12
|
-
- **Outline:** dropped the leftover `dark:bg-input/30 dark:border-input dark:hover:bg-input/50` and the duplicate `border`/`shadow-xs shadow-none` pair. Now `border border-border bg-background text-foreground`, hover `bg-background-hover`.
|
|
13
|
-
- **Secondary:** hover changed from `hover:bg-secondary/80` to `hover:bg-background-button-hover` (`#e4e4e7`), matching the resolved Figma value and the same token Badge already uses for its secondary hover.
|
|
14
|
-
- **Ghost:** dropped the implicit `bg-secondary`/`bg-muted` hover mix; now `text-foreground hover:bg-background-hover`, matching Figma exactly.
|
|
15
|
-
- **Link:** was rendered with `p-0` (no padding box) and no hover treatment beyond `hover:underline`. Figma's Link symbol keeps the same padding box as every other variant and adds a `hover:bg-background-hover` wash in addition to the underline. Removed `p-0`.
|
|
16
|
-
- Dropped `aria-expanded:*` variant styling that had no corresponding Figma state — components should express open/active state through `variant`/`class`, not baked into every variant.
|
|
17
|
-
|
|
18
|
-
### States
|
|
19
|
-
|
|
20
|
-
- **Disabled:** was `disabled:opacity-50` (just dims whatever variant color). Figma switches every variant to the same flat `bg-muted`/`text-muted-foreground`/`border-transparent`, confirmed identical across Primary, Secondary, Outline, Ghost and Destructive. Moved to the shared base class so it applies uniformly.
|
|
21
|
-
- **Focus:** ring was `focus-visible:ring-ring/50` (translucent). Figma's focus ring is a solid 2px ring in `chart-1` (`#afcef3`, = `primary-200`) plus a `border-ring` border — both already existing tokens. Now `focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-chart-1`.
|
|
22
|
-
|
|
23
|
-
### Sizing & Spacing
|
|
24
|
-
|
|
25
|
-
- **Radius:** unified to `rounded-lg` (8px) for every size. Previously `sm` used a one-off `rounded-[min(var(--radius-md),10px)]` and only `lg`/`default` used `rounded-lg` — Figma uses the same 8px radius across all three sizes and both icon-only and labeled buttons.
|
|
26
|
-
- **Font size:** `default`/`sm` were rendering at Tailwind's `text-sm` (14px) but Figma's token for those sizes is 12px (`text-xs` in this Tailwind scale). `lg` was `text-base` (16px) but Figma's large text token is 14px (`text-sm`). Fixed both.
|
|
27
|
-
- **Icon size:** replaced the single blanket `[&_svg:not([class*='size-'])]:size-4` (16px for every size) with per-size rules: `size-3.5` (14px) for `sm`, `size-4` (16px) for `default`, `size-5` (20px) for `lg` — confirmed against Figma's lead/tail icon dimensions per size.
|
|
28
|
-
- **Gap:** simplified nested Figma auto-layout spacing (2px flex gap + 2px label padding on each side ≈ 4px effective gap) down to a single `gap-1` (4px) on the root, applied uniformly across sizes.
|
|
29
|
-
- **Horizontal padding:** `sm` uses `px-2` (8px), `default`/`lg` both use `px-2.5` (10px) — confirmed from Figma's resolved padding tokens (large's extra height comes from its bigger icon/font/fixed `h-10`, not extra horizontal padding).
|
|
30
|
-
|
|
31
|
-
### New Props
|
|
32
|
-
|
|
33
|
-
- `leadIcon` / `tailIcon` / `badge` (`boolean`): render the `lead-icon` / `tail-icon` / `badge` named slots before/after the label. Auto-detected from slot presence if not explicitly passed — same pattern as Badge's `leadIcon`/`tailIcon`.
|
|
34
|
-
- This replaces the previous implicit convention of dropping an icon in as a bare child with a `data-icon="inline-start"|"inline-end"` attribute and relying on `has-data-[icon=...]`/`has-[.badge:last-child]` selectors for spacing. No existing usages in the repo relied on that convention (grepped for `data-icon=`), so this is a clean cutover.
|
|
35
|
-
- Docs updated: the "With badge" example now also sets `shape="sharp" size="sm"` on the nested `Badge`, matching the compact/square badge Figma nests inside a Button (`rounded-xs`, `px-1 py-0.5`) rather than Badge's own pill/default sizing.
|
|
36
|
-
|
|
37
|
-
### Tokens (`globals.css`)
|
|
38
|
-
|
|
39
|
-
No new tokens were needed — every color Button uses already exists: `primary`/`primary-foreground`, `secondary`/`secondary-foreground`, `background`/`background-hover`/`background-button-hover`, `destructive`/`destructive-foreground`/`destructive-hover`, `muted`/`muted-foreground`, `border`, `ring`, `chart-1`.
|
|
40
|
-
|
|
41
|
-
## Unreleased
|
|
1
|
+
# Changelog for Button.astro
|
|
2
|
+
|
|
3
|
+
All notable changes to the `Button` component will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## Date 8th Sep 2026
|
|
6
|
+
## Figma alignment (node 114-6897, prop table 7185-13418)
|
|
7
|
+
|
|
8
|
+
### Variants
|
|
9
|
+
|
|
10
|
+
- **Primary:** removed the duplicated/conflicting hover utilities (`hover:bg-primary/80` next to `hover:bg-primary/90`); Figma's hover state resolves to `#3785e0cc`, i.e. `bg-primary` at 80% opacity. Kept `hover:bg-primary/80` only.
|
|
11
|
+
- **Destructive:** completely rebuilt. It previously mixed `text-destructive` and `text-white`, and stacked four different hover opacities (`/20`, `/30`, `/60`, `/90`) across light/dark. Figma's destructive is flat: `bg-destructive text-destructive-foreground`, hover `bg-destructive-hover` (`#ef4444`, already an existing token).
|
|
12
|
+
- **Outline:** dropped the leftover `dark:bg-input/30 dark:border-input dark:hover:bg-input/50` and the duplicate `border`/`shadow-xs shadow-none` pair. Now `border border-border bg-background text-foreground`, hover `bg-background-hover`.
|
|
13
|
+
- **Secondary:** hover changed from `hover:bg-secondary/80` to `hover:bg-background-button-hover` (`#e4e4e7`), matching the resolved Figma value and the same token Badge already uses for its secondary hover.
|
|
14
|
+
- **Ghost:** dropped the implicit `bg-secondary`/`bg-muted` hover mix; now `text-foreground hover:bg-background-hover`, matching Figma exactly.
|
|
15
|
+
- **Link:** was rendered with `p-0` (no padding box) and no hover treatment beyond `hover:underline`. Figma's Link symbol keeps the same padding box as every other variant and adds a `hover:bg-background-hover` wash in addition to the underline. Removed `p-0`.
|
|
16
|
+
- Dropped `aria-expanded:*` variant styling that had no corresponding Figma state — components should express open/active state through `variant`/`class`, not baked into every variant.
|
|
17
|
+
|
|
18
|
+
### States
|
|
19
|
+
|
|
20
|
+
- **Disabled:** was `disabled:opacity-50` (just dims whatever variant color). Figma switches every variant to the same flat `bg-muted`/`text-muted-foreground`/`border-transparent`, confirmed identical across Primary, Secondary, Outline, Ghost and Destructive. Moved to the shared base class so it applies uniformly.
|
|
21
|
+
- **Focus:** ring was `focus-visible:ring-ring/50` (translucent). Figma's focus ring is a solid 2px ring in `chart-1` (`#afcef3`, = `primary-200`) plus a `border-ring` border — both already existing tokens. Now `focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-chart-1`.
|
|
22
|
+
|
|
23
|
+
### Sizing & Spacing
|
|
24
|
+
|
|
25
|
+
- **Radius:** unified to `rounded-lg` (8px) for every size. Previously `sm` used a one-off `rounded-[min(var(--radius-md),10px)]` and only `lg`/`default` used `rounded-lg` — Figma uses the same 8px radius across all three sizes and both icon-only and labeled buttons.
|
|
26
|
+
- **Font size:** `default`/`sm` were rendering at Tailwind's `text-sm` (14px) but Figma's token for those sizes is 12px (`text-xs` in this Tailwind scale). `lg` was `text-base` (16px) but Figma's large text token is 14px (`text-sm`). Fixed both.
|
|
27
|
+
- **Icon size:** replaced the single blanket `[&_svg:not([class*='size-'])]:size-4` (16px for every size) with per-size rules: `size-3.5` (14px) for `sm`, `size-4` (16px) for `default`, `size-5` (20px) for `lg` — confirmed against Figma's lead/tail icon dimensions per size.
|
|
28
|
+
- **Gap:** simplified nested Figma auto-layout spacing (2px flex gap + 2px label padding on each side ≈ 4px effective gap) down to a single `gap-1` (4px) on the root, applied uniformly across sizes.
|
|
29
|
+
- **Horizontal padding:** `sm` uses `px-2` (8px), `default`/`lg` both use `px-2.5` (10px) — confirmed from Figma's resolved padding tokens (large's extra height comes from its bigger icon/font/fixed `h-10`, not extra horizontal padding).
|
|
30
|
+
|
|
31
|
+
### New Props
|
|
32
|
+
|
|
33
|
+
- `leadIcon` / `tailIcon` / `badge` (`boolean`): render the `lead-icon` / `tail-icon` / `badge` named slots before/after the label. Auto-detected from slot presence if not explicitly passed — same pattern as Badge's `leadIcon`/`tailIcon`.
|
|
34
|
+
- This replaces the previous implicit convention of dropping an icon in as a bare child with a `data-icon="inline-start"|"inline-end"` attribute and relying on `has-data-[icon=...]`/`has-[.badge:last-child]` selectors for spacing. No existing usages in the repo relied on that convention (grepped for `data-icon=`), so this is a clean cutover.
|
|
35
|
+
- Docs updated: the "With badge" example now also sets `shape="sharp" size="sm"` on the nested `Badge`, matching the compact/square badge Figma nests inside a Button (`rounded-xs`, `px-1 py-0.5`) rather than Badge's own pill/default sizing.
|
|
36
|
+
|
|
37
|
+
### Tokens (`globals.css`)
|
|
38
|
+
|
|
39
|
+
No new tokens were needed — every color Button uses already exists: `primary`/`primary-foreground`, `secondary`/`secondary-foreground`, `background`/`background-hover`/`background-button-hover`, `destructive`/`destructive-foreground`/`destructive-hover`, `muted`/`muted-foreground`, `border`, `ring`, `chart-1`.
|
|
40
|
+
|
|
41
|
+
## Unreleased
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { default as Button } from "./Button.astro";
|
|
2
|
-
|
|
1
|
+
export { default as Button } from "./Button.astro";
|
|
2
|
+
|