Button
Starts an action. Primary is cobalt on paper and paper on ink; there is deliberately no honey button.
Concept · live ReactSource file: tokens.jsonReact component: Button
Try it
Variant
Size
Theme
Disabled
<Button variant="primary" size="md">Start round</Button>When to use
- One primary button per view, for the action that moves the hive forward: Join, Start round, Send.
- Secondary for a real alternative on paper: Copy join link.
- Tonal for the second action on a dark surface, where an outline would vanish: Type instead, Start again. Filled, quiet, a full tap target.
- Text for the quiet way out: Discard, End hive.
Don’t use it
- A honey button. Honey is the voice, never a call to action.
- A text link for an action on a phone: below a 44px target, it can't be tapped reliably.
Variants
Primary is cobalt on paper and paper on ink. Secondary carries a border-control edge, which holds 3:1.
primary
secondary
text
primary
secondary
tonal
text
States
Rest, hover, pressed, keyboard focus and disabled, for every variant, in both themes. Focus is a 2px ring outside a 2px ground-coloured gap, cobalt on paper and honey on ink, so it shows on every fill.
rest
hover
active
focus
disabled
primary
secondary
tonal
text
rest
hover
active
focus
disabled
primary
secondary
tonal
text
Sizes
sm · 32
md · 40
lg · 48
Content
- Name the button by what happens: Start round, End round, Show readout.
- The result repeats the verb: “Round started”.
- Sentence case, no exclamation marks.
Accessibility
| Key | What it does |
|---|---|
| Tab | Moves focus to the button. |
| Enter / Space | Runs the action. |
- A native
<button>,type="button"unless it submits a form. Disabled uses thedisabledattribute, so it leaves the tab order. - Every size clears the 24px target in WCAG 2.2 (2.5.8): 32, 40 and 48px tall. Phones use 48.
- An icon sits before the label and is hidden from screen readers; the label is the name. Button has no icon-only form.
- Primary text holds 4.5:1 on its fill in both themes; the secondary edge (
border-control) holds 3:1 against the ground.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| variant | 'primary' | 'secondary' | 'tonal' | 'text' | 'primary' | Emphasis. Tonal is for the second action on a dark surface. |
| size | 'sm' | 'md' | 'lg' | 'md' | 32, 40 or 48px. lg is for phones. |
| block | boolean | false | Full width, for phone layouts. |
| icon | ReactNode | — | A 16px icon before the label, aria-hidden. |
| state | 'rest' | 'hover' | 'active' | 'focus' | — | Forces a state. For documentation matrices only. |
| …button | ButtonHTMLAttributes | — | onClick, disabled, type and the rest pass through. |
Tokens
| Token | Value | Where it lands |
|---|---|---|
| --hm-primary | #1c2dad / #f6f7f9 | Primary button: cobalt on paper (the brand’s structure), paper on ink. |
| --hm-primary-hover | #142380 / #d7d9dd | Hover and pressed state of the primary button. |
| --hm-on-primary | #ffffff / #0b0e15 | Text and icons on the primary button. |
| --hm-border-control | #7c798a / #7c8088 | Outlines of inputs and secondary controls. Holds 3:1 on bg and surface. |
| --hm-surface-hover | #f1f0f4 / #2d323b | Hover and pressed fill for rows, ghost buttons and list items. |
| --hm-focus-ring | #2d49c9 / #ffc550 | Keyboard focus: cobalt on paper, honey on ink, 2px outside a 2px bg gap. |