RRigdesign system
Inputs

Button

The main way to trigger an action. Filled gradient with a thin highlight stroke, pill corners, and a leading or trailing icon slot.

Examples

Large 44 · Medium 32 · Small 27
Styles
Icon slots · loading (click to try)

States

Rendered states (visual reference; the live example above is the accessible one)
DefaultHoverFocus visiblePressedDisabled
Primary
Secondary
Outlined
Neutral
Delete

Anatomy

Button anatomy
#PartDescriptionPresence
1ContainerPill, 40px radius, gradient fillRequired
2Leading iconOptional 16px icon, decorativeOptional
3LabelManrope SemiBold, sentence case verbRequired
4Trailing iconOptional, decorativeOptional
5Loading indicatorReplaces the leading icon, label staysOptional

Specifications

SizesLarge 44px · Medium 32px · Small 27px
Horizontal padding16px · 12px · 8px (vertical 0)
TypeManrope SemiBold 16px · 14px · 11px
Corner radius40px (pill)
SlotsLeading icon · Label · Trailing icon
StylesFilled primary (indigo) · Filled secondary (purple) · Outlined · Filled neutral (slate)
Status usageSuccess · Delete · Alert

Interaction

Keyboard
KeyResult
Tab Shift+TabMoves focus to and from the control
EnterActivates
SpaceActivates on key up
Pointer and touch
TriggerResponse
HoverOverlay at 10% (hover-overlay-opacity); cursor stays default on non-links
PressScale to 0.97 in 100ms; released on pointer up
TouchTarget at least 44px, with a halo if the visual is smaller
LoadingSet aria-busy and keep the label, so width does not jump; block repeat clicks

Accessibility

role · button

1.4.3Contrast (Minimum)1.4.11Non-text Contrast2.1.1Keyboard2.4.7Focus Visible2.5.3Label in Name2.5.8Target Size (Minimum)4.1.2Name, Role, Value
Requirements
RequirementHow Rig meets it
Native elementUse <button type="button">. Never a div with a click handler.
NameVisible label is the accessible name (WCAG 2.5.3). Icon-only needs aria-label.
ContrastLabel on fill at least 4.5:1. Filled styles in this site use darker stops than the Figma 500 tokens to meet it.
Focus2px ring offset by 2px, 3:1 against both the button and the page
DisabledPrefer the disabled attribute. If the reason matters, keep it enabled and explain it in text.
NavigationIf it goes to another page it is a link, styled as a button

Read the matching WAI pattern ↗

Usage

Do and don’t
DoDon’t
One filled primary action per viewDo not use “Click here” or “Submit” as labels
Start the label with a verb: Save changes, Send inviteDo not disable a primary button with no explanation
Show a loading state for actions longer than 1 secondDo not nest interactive elements inside a button

Notes from the Figma file

  • Width is dynamic: the label sets it, auto-layout keeps the padding.
  • Use one filled primary button per view. Everything else is outlined or neutral.
  • Destructive confirmations pair a neutral Cancel with the error style.