Skip to content

Button

Standalone component with a native button, typed inputs, signals, and content projection.

Design

Functional preview

Running with the native Angular component and HTML button.

Loading functional preview…

Styles

Anatomy

1 2 3 4 5
1 Container — background, radius, height, and min-width via Component tokens.
2 Icon (optional) — 20px frame/icon on sm and 24px on md/lg.
3 Label (.ds-button__label) — typography and color via Component tokens.
4 Root padding — sm 8×8px, md 10×12px, lg 12×16px.
5 Label padding — additional 4px on the Label Frame for optical balance.

Sizes

SizeHeightFontPaddingTouch target
Small (--sm)32px (component.button.height.sm)component.button.label.font-size.sm8×8px (component.button.padding-y.sm × padding-x.sm)32px — meets WCAG 2.5.8 min (24px)
Medium (--md)40px (component.button.height.md)component.button.label.font-size.md10×12px (component.button.padding-y.md × padding-x.md)40px
Large (--lg)48px (component.button.height.lg)component.button.label.font-size.lg12×16px (component.button.padding-y.lg × padding-x.lg)48px — meets AAA 44px target

States

States are handled via CSS pseudo-classes (:hover, :active, :focus-visible, [disabled]), not modifier classes.

StateCSS triggerVisual changeToken
DefaultPrimary fillcomponent.button.bg.brand.default
Hover:hoverDarker fillcomponent.button.bg.brand.hover
Pressed:activeDarkest fillcomponent.button.bg.brand.pressed
Focus:focus-visible2px ring with 2px offset and focus-state colorscomponent.button.bg.brand.focus, component.button.content.color.brand.focus, component.button.focus-ring.*
Disabled[disabled]Muted bg + content, no pointer eventscomponent.button.bg.brand.disabled, component.button.content.color.brand.disabled

With icon

Icon only

Loading

Full width

Token mapping

Tokens consumed by the Brand variant. Other variants follow the same pattern using their respective color groups.

PropertyToken (Component)CSS variable
height (sm)component.button.height.sm--ds-button-height-sm
height (md)component.button.height.md--ds-button-height-md
height (lg)component.button.height.lg--ds-button-height-lg
min-width (sm/md/lg)component.button.min-width.{sm,md,lg}--ds-button-min-width-*
padding-x (sm/md/lg)component.button.padding-x.{sm,md,lg}--ds-button-padding-x-*
padding-y (sm/md/lg)component.button.padding-y.{sm,md,lg}--ds-button-padding-y-*
gap (sm/md/lg)component.button.gap.{sm,md,lg}--ds-button-gap-*
radius / border-widthcomponent.button.radius.default, component.button.border-width.default--ds-button-radius-default, --ds-button-border-width-default
bg por estilo/estadocomponent.button.bg.{brand,toned,outline,ghost,success,danger}.*--ds-button-bg-*
border color Outlinecomponent.button.border-color.outline.*--ds-button-border-color-outline-*
text/icon colorcomponent.button.content.color.{style}.{state}--ds-button-content-color-*
label typographycomponent.button.label.{font-size,line-height,font-weight,letter-spacing}.*--ds-button-label-*
icon frame/sizecomponent.button.icon.size.{sm,md,lg}, component.button.icon.stroke-width.{sm,md,lg}--ds-button-icon-*
icon-onlycomponent.button.icon-only-{width,padding}.{sm,md,lg}--ds-button-icon-only-*
focus ringcomponent.button.focus-ring.radius.default, component.focus-ring.{width,color.default,color.success,color.error}--ds-focus-ring-* + --ds-button-focus-ring-radius-default

Toned variant

The Toned variant uses translucent overlay backgrounds (--ds-toned-background-default, --ds-toned-background-hover, --ds-toned-background-active) instead of opaque fills. This differs from Subtle/Muted patterns which use opaque background tokens. The translucent approach lets the Toned button adapt naturally to any surface color beneath it while maintaining a consistent brand tint.

Figma

The Figma component exposes the properties below in the panel. Visibility booleans sit immediately above the slot they control.

PropertyTypeDefaultOptions
StyleVariantBrandBrand, Toned, Outline, Ghost, Success, Danger
SizeVariantMediumSmall (32px), Medium (40px), Large (48px)
StateVariantDefaultDefault, Hover, Pressed, Focused, Disabled
Icon OnlyVariantfalseDefault (with label), Icon Only (square)
LoadingBooleanfalsetrue, false
Show Left IconBooleanfalseToggles visibility for the left icon frame
Left IconInstance swapPlaceholderSets the left icon component
Show Right IconBooleanfalseToggles visibility for the right icon frame
Right IconInstance swapPlaceholderSets the right icon component