Skip to content

Buttons

Button tokens control the appearance of the Button and IconButton components.

Color × Variant System

A button's look is decided by two independent axes:

  • Color — selects a palette (surface, on-surface, accent, ring). Applied via the vuiii-button--color-{color} class. Colors: primary, secondary, success, danger, accent.
  • Variant — decides how that palette is rendered. Applied via the vuiii-button--variant-{variant} class. Variants: filled, outlined, text.

Each color exposes a palette of tokens; each variant maps those palette tokens onto the drawing tokens (--bgColor, --textColor, --borderColor, and their --hover counterparts).

VariantBackgroundText / Border
filledsurfaceonSurface text
outlinedtransparentaccent text + border
texttransparentaccent text, no border

The palette meaning:

  • surface — fill background for the filled variant (surface--hover on hover).
  • onSurface — text color drawn on top of the surface.
  • accent — text and border color for the outlined and text variants (accent--hover on hover).
  • ringColor — focus ring color.

Base Tokens

TokenValueDescription
--vuiii-button-fontSizevar(--vuiii-field-fontSize)Text size
--vuiii-button-fontFamilyvar(--vuiii-typeface-body)Font family
--vuiii-button-fontWeight500Text weight
--vuiii-button-heightvar(--vuiii-field-height)Button height
--vuiii-button-paddingvar(--vuiii-field-padding)Horizontal padding
--vuiii-button-borderRadiusvar(--vuiii-field-borderRadius)Corner radius
--vuiii-button-ringSizevar(--vuiii-field-ringSize)Focus ring width
--vuiii-button-borderWidthvar(--vuiii-field-borderWidth)Border thickness
--vuiii-button-transitionvar(--vuiii-field-transition)Animation timing
--vuiii-button-opacity--disabledvar(--vuiii-field-opacity--disabled)Disabled state

Color Palettes

Primary

TokenValueDescription
--vuiii-button-surface--primaryvar(--vuiii-color-primary)Filled background
--vuiii-button-surface--primary--hovervar(--vuiii-color-primary--darker)Filled background (hover)
--vuiii-button-onSurface--primarywhiteText on surface
--vuiii-button-accent--primaryvar(--vuiii-color-primary)Outlined/text color
--vuiii-button-accent--primary--hovervar(--vuiii-color-primary--darker)Outlined/text color (hover)
--vuiii-button-ringColor--primaryoklch(from var(--vuiii-color-primary) l c h / 0.1)Focus ring

Secondary

TokenValueDescription
--vuiii-button-surface--secondaryvar(--vuiii-color-gray--light)Filled background
--vuiii-button-surface--secondary--hovervar(--vuiii-color-gray)Filled background (hover)
--vuiii-button-onSurface--secondaryvar(--vuiii-color-gray--darkest)Text on surface
--vuiii-button-accent--secondaryvar(--vuiii-color-gray--darker)Outlined/text color
--vuiii-button-accent--secondary--hovervar(--vuiii-color-gray--darkest)Outlined/text color (hover)
--vuiii-button-ringColor--secondaryoklch(from var(--vuiii-color-gray--darker) l c h / 0.1)Focus ring

Success

TokenValueDescription
--vuiii-button-surface--successvar(--vuiii-color-success)Filled background
--vuiii-button-surface--success--hovervar(--vuiii-color-success--darker)Filled background (hover)
--vuiii-button-onSurface--successwhiteText on surface
--vuiii-button-accent--successvar(--vuiii-color-success)Outlined/text color
--vuiii-button-accent--success--hovervar(--vuiii-color-success--darker)Outlined/text color (hover)
--vuiii-button-ringColor--successoklch(from var(--vuiii-color-success) l c h / 0.1)Focus ring

Danger

TokenValueDescription
--vuiii-button-surface--dangervar(--vuiii-color-danger)Filled background
--vuiii-button-surface--danger--hovervar(--vuiii-color-danger--darker)Filled background (hover)
--vuiii-button-onSurface--dangerwhiteText on surface
--vuiii-button-accent--dangervar(--vuiii-color-danger)Outlined/text color
--vuiii-button-accent--danger--hovervar(--vuiii-color-danger--darker)Outlined/text color (hover)
--vuiii-button-ringColor--dangeroklch(from var(--vuiii-color-danger) l c h / 0.1)Focus ring

Accent

The accent color has no dedicated --vuiii-button-* palette tokens. The vuiii-button--color-accent class maps its palette directly onto the global --vuiii-color-accent token, so it always follows the accent color used by form-selection controls.

Palette slotResolves to
surfacevar(--vuiii-color-accent)
surface (hover)var(--vuiii-color-accent--darker)
onSurfacevar(--vuiii-color-white)
accentvar(--vuiii-color-accent)
accent (hover)var(--vuiii-color-accent--darker)
ringColoroklch(from var(--vuiii-color-accent) l c h / 0.1)

To restyle the accent button, override the global accent color — see Colors → Accent.

Size Variants

Small

TokenValue
--vuiii-button-fontSize--smallvar(--vuiii-field-fontSize--small)
--vuiii-button-height--smallvar(--vuiii-field-height--small)
--vuiii-button-padding--smallvar(--vuiii-field-padding--small)
--vuiii-button-borderRadius--smallvar(--vuiii-field-borderRadius--small)
--vuiii-button-ringSize--smallvar(--vuiii-field-ringSize--small)

Large

TokenValue
--vuiii-button-fontSize--largevar(--vuiii-field-fontSize--large)
--vuiii-button-height--largevar(--vuiii-field-height--large)
--vuiii-button-padding--largevar(--vuiii-field-padding--large)
--vuiii-button-borderRadius--largevar(--vuiii-field-borderRadius--large)
--vuiii-button-ringSize--largevar(--vuiii-field-ringSize--large)

Customization

Restyle a color palette — the change applies across every variant of that color:

css
:root {
  /* Recolor the primary button */
  --vuiii-button-surface--primary: #0066cc;
  --vuiii-button-surface--primary--hover: #0052a3;
  --vuiii-button-accent--primary: #0066cc;
  --vuiii-button-accent--primary--hover: #0052a3;
}

Adjust base geometry shared by all buttons:

css
:root {
  /* Rounded buttons */
  --vuiii-button-borderRadius: 9999px;
}

Released under the MIT License.