sigilUI

Button

A polymorphic button with token-driven variants, sizes, and states. Supports asChild via Radix Slot for polymorphism.

@sigil-ui/componentsReact

Preview

Live preview Interactive

Import

import { Button } from "@sigil-ui/components";

Variants

All nine variants read their colors from your --s-* token file.

Live preview Interactive
<Button variant="primary">Primary</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="outline">Outline</Button>
<Button variant="destructive">Destructive</Button>
<Button variant="success">Success</Button>
<Button variant="warning">Warning</Button>
<Button variant="soft">Soft</Button>
<Button variant="link">Link</Button>

Sizes

Live preview Interactive
<Button size="xs">Extra small</Button>
<Button size="sm">Small</Button>
<Button size="md">Medium</Button>
<Button size="lg">Large</Button>

Icon buttons

Use icon-* sizes for square icon-only buttons.

Live preview Interactive
<Button size="icon-sm">
  <PlusIcon className="size-4" />
</Button>

Using the asChild prop, Button renders as whatever element you pass as a child — Next.js <Link>, React Router <Link>, or a plain <a>.

import Link from "next/link";

<Button asChild variant="primary">
  <Link href="/dashboard">Go to dashboard</Link>
</Button>

Disabled

Live preview Interactive
<Button disabled>Disabled primary</Button>

Token integration

Button reads these CSS variables from your token file — change once, every Button updates:

CSS VariableUsed for
--s-primaryvariant="primary" background
--s-primary-hoverPrimary hover state
--s-surfacevariant="secondary" background
--s-textDefault text color
--s-bordervariant="outline" border
--s-ringFocus ring color
--s-radius-sm / --s-radius-mdBorder radius by size
--s-shadow-smPrimary variant elevation
--s-duration-fastHover/press transition
--s-errorvariant="destructive" background
--s-successvariant="success" background
--s-warningvariant="warning" background

Props

PropTypeDefaultDescription
variant"primary" | "secondary" | "ghost" | "outline" | "destructive" | "success" | "warning" | "soft" | "link""primary"Visual variant
size"xs" | "sm" | "md" | "lg" | "icon-xs" | "icon-sm" | "icon" | "icon-lg""md"Button size
asChildbooleanfalseRender as child element (via Radix Slot)
disabledbooleanfalseDisable interactions
classNamestring—Additional CSS classes
childrenReactNode—Button content

Plus all standard <button> HTML attributes.

Accessibility

  • Uses native <button> element by default
  • disabled attribute prevents focus and interaction
  • Focus ring uses --s-ring for visibility
  • Meets WCAG 2.1 contrast requirements with default tokens