mirror of
https://github.com/hunvreus/basecoat.git
synced 2026-11-12 13:18:22 +00:00
244 lines
15 KiB
Plaintext
244 lines
15 KiB
Plaintext
# Button
|
|
|
|
<Preview>
|
|
<div class="flex flex-wrap items-center gap-2">
|
|
<button type="button" class="btn" data-variant="outline">Button</button>
|
|
<button type="button" class="btn" data-variant="outline" data-size="icon" aria-label="Submit"><svg class="lucide lucide-arrow-up" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m5 12 7-7 7 7" /><path d="M12 19V5" /></svg></button>
|
|
</div>
|
|
</Preview>
|
|
|
|
## Usage
|
|
|
|
<Steps>
|
|
<Step title="Include CSS">
|
|
|
|
Import Tailwind and one full Basecoat style bundle.
|
|
|
|
```css
|
|
@import "tailwindcss";
|
|
@import "basecoat-css/vega.css";
|
|
```
|
|
|
|
Or import only the base CSS, Button component CSS, and one style pack.
|
|
|
|
```css
|
|
@import "tailwindcss";
|
|
@import "basecoat-css/base.css";
|
|
@import "basecoat-css/components/button.css";
|
|
@import "basecoat-css/styles/vega.css";
|
|
```
|
|
|
|
Using CDN or bundler imports? See the [Installation page](/installation).
|
|
|
|
</Step>
|
|
<Step title="Add your button HTML">
|
|
|
|
```html
|
|
<button type="button" class="btn">Primary</button>
|
|
<button type="button" class="btn" data-variant="outline">Outline</button>
|
|
<button type="button" class="btn" data-variant="secondary" data-size="sm">Small secondary</button>
|
|
<button type="button" class="btn" data-variant="outline" data-size="icon" aria-label="Settings"><svg class="lucide lucide-settings" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915" /><circle cx="12" cy="12" r="3" /></svg></button>
|
|
```
|
|
|
|
</Step>
|
|
</Steps>
|
|
|
|
Add `class="btn"` to a `<button>` or `<a>`. Add `data-variant` and `data-size` when needed. Add `data-icon="inline-start"` or `data-icon="inline-end"` to inline icons when a text button needs icon-aware spacing.
|
|
|
|
#### HTML structure
|
|
|
|
<dl>
|
|
<dt><code><button class="btn"></code></dt>
|
|
<dd>Button root. Use a native <code><button></code> for actions and <code><a></code> for navigation.</dd>
|
|
<dt><code>data-variant="primary|secondary|outline|ghost|link|destructive"</code> <span class="badge" data-variant="secondary">Optional</span></dt>
|
|
<dd>Visual variant. Omit it for the primary variant.</dd>
|
|
<dt><code>data-size="xs|sm|default|lg|icon|icon-xs|icon-sm|icon-lg"</code> <span class="badge" data-variant="secondary">Optional</span></dt>
|
|
<dd>Button size. Omit it for the default size.</dd>
|
|
</dl>
|
|
|
|
### Variants
|
|
|
|
| Variant | Markup |
|
|
| --- | --- |
|
|
| Primary | `<button class="btn">` |
|
|
| Secondary | `<button class="btn" data-variant="secondary">` |
|
|
| Outline | `<button class="btn" data-variant="outline">` |
|
|
| Ghost | `<button class="btn" data-variant="ghost">` |
|
|
| Link | `<button class="btn" data-variant="link">` |
|
|
| Destructive | `<button class="btn" data-variant="destructive">` |
|
|
|
|
### Sizes
|
|
|
|
| Size | Markup |
|
|
| --- | --- |
|
|
| Extra small | `<button class="btn" data-size="xs">` |
|
|
| Small | `<button class="btn" data-size="sm">` |
|
|
| Default | `<button class="btn">` |
|
|
| Large | `<button class="btn" data-size="lg">` |
|
|
| Icon extra small | `<button class="btn" data-size="icon-xs">` |
|
|
| Icon small | `<button class="btn" data-size="icon-sm">` |
|
|
| Icon | `<button class="btn" data-size="icon">` |
|
|
| Icon large | `<button class="btn" data-size="icon-lg">` |
|
|
|
|
Use `data-size="icon"` or one of the icon size variants for square buttons. Icon-only buttons need an accessible name, usually with `aria-label`.
|
|
|
|
Use `data-icon="inline-start"` or `data-icon="inline-end"` on inline icons when a text button needs icon-aware spacing. Use icon size variants only for icon-only buttons.
|
|
|
|
To group related buttons, use the [Button Group](/components/button-group/) component.
|
|
|
|
## Examples
|
|
|
|
### Size
|
|
|
|
Use `data-size` to change the size of the button.
|
|
|
|
<Preview>
|
|
<div class="flex flex-wrap items-center gap-2">
|
|
<button type="button" class="btn" data-variant="outline" data-size="xs">Extra Small</button>
|
|
<button type="button" class="btn" data-variant="outline" data-size="icon-xs" aria-label="Submit"><svg class="lucide lucide-arrow-up-right" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 7h10v10" /><path d="M7 17 17 7" /></svg></button>
|
|
<button type="button" class="btn" data-variant="outline" data-size="sm">Small</button>
|
|
<button type="button" class="btn" data-variant="outline" data-size="icon-sm" aria-label="Submit"><svg class="lucide lucide-arrow-up-right" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 7h10v10" /><path d="M7 17 17 7" /></svg></button>
|
|
<button type="button" class="btn" data-variant="outline">Default</button>
|
|
<button type="button" class="btn" data-variant="outline" data-size="icon" aria-label="Submit"><svg class="lucide lucide-arrow-up-right" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 7h10v10" /><path d="M7 17 17 7" /></svg></button>
|
|
<button type="button" class="btn" data-variant="outline" data-size="lg">Large</button>
|
|
<button type="button" class="btn" data-variant="outline" data-size="icon-lg" aria-label="Submit"><svg class="lucide lucide-arrow-up-right" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 7h10v10" /><path d="M7 17 17 7" /></svg></button>
|
|
</div>
|
|
</Preview>
|
|
|
|
### Default
|
|
|
|
<Preview>
|
|
<button type="button" class="btn">Button</button>
|
|
</Preview>
|
|
|
|
### Outline
|
|
|
|
<Preview>
|
|
<button type="button" class="btn" data-variant="outline">Outline</button>
|
|
</Preview>
|
|
|
|
### Secondary
|
|
|
|
<Preview>
|
|
<button type="button" class="btn" data-variant="secondary">Secondary</button>
|
|
</Preview>
|
|
|
|
### Ghost
|
|
|
|
<Preview>
|
|
<button type="button" class="btn" data-variant="ghost">Ghost</button>
|
|
</Preview>
|
|
|
|
### Destructive
|
|
|
|
<Preview>
|
|
<button type="button" class="btn" data-variant="destructive">Destructive</button>
|
|
</Preview>
|
|
|
|
### Link
|
|
|
|
<Preview>
|
|
<button type="button" class="btn" data-variant="link">Link</button>
|
|
</Preview>
|
|
|
|
### Icon
|
|
|
|
<Preview>
|
|
<button type="button" class="btn" data-variant="outline" data-size="icon" aria-label="Open"><svg class="lucide lucide-circle-fading-arrow-up" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2a10 10 0 0 1 7.38 16.75" /><path d="m16 12-4-4-4 4" /><path d="M12 16V8" /><path d="M2.5 8.875a10 10 0 0 0-.5 3" /><path d="M2.83 16a10 10 0 0 0 2.43 3.4" /><path d="M4.636 5.235a10 10 0 0 1 .891-.857" /><path d="M8.644 21.42a10 10 0 0 0 7.631-.38" /></svg></button>
|
|
</Preview>
|
|
|
|
### With icon
|
|
|
|
Use `data-icon="inline-start"` or `data-icon="inline-end"` on inline icons to match upstream icon-aware spacing.
|
|
|
|
<Preview>
|
|
<button type="button" class="btn" data-variant="outline" data-size="sm"><svg data-icon="inline-start" class="lucide lucide-git-branch" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 6a9 9 0 0 0-9 9V3" /><circle cx="18" cy="6" r="3" /><circle cx="6" cy="18" r="3" /></svg>
|
|
New Branch
|
|
</button>
|
|
</Preview>
|
|
|
|
### Rounded
|
|
|
|
Use the `rounded-full` class to make the button rounded.
|
|
|
|
<Preview>
|
|
<button type="button" class="btn rounded-full" data-variant="outline" data-size="icon" aria-label="Scroll up"><svg class="lucide lucide-arrow-up" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m5 12 7-7 7 7" /><path d="M12 19V5" /></svg></button>
|
|
</Preview>
|
|
|
|
### Spinner
|
|
|
|
<Preview>
|
|
<div class="flex flex-wrap items-center gap-2">
|
|
<button type="button" class="btn" disabled><svg data-icon="inline-start" class="animate-spin lucide lucide-loader-circle" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 1 1-6.219-8.56" /></svg>
|
|
Generating
|
|
</button>
|
|
<button type="button" class="btn" data-variant="secondary" disabled>
|
|
Downloading
|
|
<svg data-icon="inline-end" class="animate-spin lucide lucide-loader-circle" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 1 1-6.219-8.56" /></svg>
|
|
</button>
|
|
</div>
|
|
</Preview>
|
|
|
|
### Button group
|
|
|
|
To group related buttons, use the [Button Group](/components/button-group/) component.
|
|
|
|
<Preview>
|
|
<div class="flex w-fit items-stretch gap-2">
|
|
<button type="button" class="btn" data-variant="outline" data-size="icon" aria-label="Go back"><svg class="lucide lucide-arrow-left" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7" /><path d="M19 12H5" /></svg></button>
|
|
<div role="group" class="button-group">
|
|
<button type="button" class="btn" data-variant="outline">Archive</button>
|
|
<button type="button" class="btn" data-variant="outline">Report</button>
|
|
</div>
|
|
<div role="group" class="button-group">
|
|
<button type="button" class="btn" data-variant="outline">Snooze</button>
|
|
<div id="button-docs-actions" class="dropdown-menu">
|
|
<button type="button" id="button-docs-actions-trigger" aria-label="More options" aria-haspopup="menu" aria-controls="button-docs-actions-menu" aria-expanded="false" class="btn" data-variant="outline" data-size="icon"><svg class="lucide lucide-ellipsis" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1" /><circle cx="19" cy="12" r="1" /><circle cx="5" cy="12" r="1" /></svg></button>
|
|
<div id="button-docs-actions-popover" data-popover aria-hidden="true" data-align="end">
|
|
<div role="menu" id="button-docs-actions-menu" aria-labelledby="button-docs-actions-trigger">
|
|
<div role="menuitem"><svg class="lucide lucide-mail-check" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 13V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v12c0 1.1.9 2 2 2h8" /><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" /><path d="m16 19 2 2 4-4" /></svg>
|
|
Mark as Read
|
|
</div>
|
|
<div role="menuitem"><svg class="lucide lucide-archive" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="5" x="2" y="3" rx="1" /><path d="M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8" /><path d="M10 12h4" /></svg>
|
|
Archive
|
|
</div>
|
|
<hr role="separator" />
|
|
<div role="menuitem"><svg class="lucide lucide-clock" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="M12 6v6l4 2" /></svg>
|
|
Snooze
|
|
</div>
|
|
<div role="menuitem"><svg class="lucide lucide-calendar" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 2v4" /><path d="M16 2v4" /><rect width="18" height="18" x="3" y="4" rx="2" /><path d="M3 10h18" /></svg>
|
|
Add to Calendar
|
|
</div>
|
|
<div role="menuitem"><svg class="lucide lucide-list-filter-plus" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5H2" /><path d="M6 12h12" /><path d="M9 19h6" /><path d="M16 5h6" /><path d="M19 8V2" /></svg>
|
|
Add to List
|
|
</div>
|
|
<hr role="separator" />
|
|
<div role="menuitem" class="text-destructive hover:bg-destructive/10 dark:hover:bg-destructive/20 focus:bg-destructive/10 dark:focus:bg-destructive/20 focus:text-destructive [&_svg]:!text-destructive"><svg class="lucide lucide-trash-2" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 11v6" /><path d="M14 11v6" /><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" /><path d="M3 6h18" /><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" /></svg>
|
|
Trash
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</Preview>
|
|
|
|
### RTL
|
|
|
|
Add `dir="rtl"` to the button or an ancestor. Flip directional icons explicitly.
|
|
|
|
<Preview>
|
|
<div dir="rtl" class="flex flex-wrap items-center gap-2">
|
|
<button type="button" class="btn" data-variant="outline">زر</button>
|
|
<button type="button" class="btn" data-variant="destructive">حذف</button>
|
|
<button type="button" class="btn" data-variant="outline">
|
|
إرسال
|
|
<svg data-icon="inline-end" class="rtl:rotate-180 lucide lucide-arrow-right" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg>
|
|
</button>
|
|
<button type="button" class="btn" data-variant="outline" data-size="icon" aria-label="Add"><svg class="lucide lucide-plus" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14" /><path d="M12 5v14" /></svg></button>
|
|
<button type="button" class="btn" data-variant="secondary" disabled><svg data-icon="inline-start" class="animate-spin lucide lucide-loader-circle" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 1 1-6.219-8.56" /></svg>
|
|
جاري التحميل
|
|
</button>
|
|
</div>
|
|
</Preview>
|