Skip to content

Primitives

Actions

Button

One primary action per screen. The filled pill is that action; the outlined pill is its secondary. Ghost and link are for tertiary actions inside dense UI. Don't use them as a page's main call to action.

Primary
Secondary
Tertiary
Destructive
Disabled
Loading

Toggle

A single on-or-off control that shows its state on itself. If the state belongs to a form rather than to a toolbar, use Switch or Checkbox instead.

Single
Group

Button group

Related actions that share one boundary. Use it when the actions are alternatives to each other, not when they merely sit near each other.

Grouped

Command

Keyboard-first search across everything. Worth adding once a tool has more than about a dozen destinations; before that it is ceremony.

Forms

Input

Every input gets a label. Placeholder text is not a label. Errors sit next to the field and say what to do, not that something went wrong.

Use your company address so we can match you to your account.

Select

For a known, closed set of options. Past about fifteen entries a Command palette beats a select, because scanning a long list is worse than typing.

Default
Disabled

Input group

An input with something attached: an icon, a unit, a button. Keeps the affordance inside the field boundary instead of floating beside it.

seats

Textarea

For prose the person will re-read before sending. If the answer is one line, an input is kinder because it signals the expected length.

Checkbox and radio

Checkbox for any number of choices, radio for exactly one. Both get a real label, and the label is clickable.

Checkbox
Radio

Switch and slider

Switch commits immediately, so it needs no save button. Slider is for values where the approximate position matters more than the exact number.

Switch
Slider

60 seats

One-time code

Fixed-length codes get their own field per character so people can see the length before typing. Paste still fills the whole thing.

Six digit

Display

Badge

Status, not decoration. Never encode meaning in color alone. The word carries it and the color reinforces it.

Variants
AdoptingAssessedQueuedBlocked

Card

A card earns elevation when it marks a genuinely distinct region. If you're only grouping related content, space and a hairline rule do it better than another box.

AI Workflow Assessment
Where adoption is actually stalling, mapped against the work your team already does.

Four weeks, one team, a report you can act on.

Table

Numbers are tabular so they align down the column, and numeric columns are right-aligned. A table wider than its container scrolls itself rather than the page.

TeamStageSeats
Revenue OpsMaintaining42
LegalBlocked12

Avatar

Initials are the fallback, not an afterthought: most internal tools have no photos. Size with classes, since Avatar takes no size prop.

Sizes
PRMBDO
Stacked
PRMBDOSI

Item

A row with media, content and actions. Reach for this before hand-building a flex row; it keeps alignment consistent across every list in the app.

PR
Priya Raman

Revenue Ops, owner since March

DO
Dana Okafor

Legal, blocked on review policy

Progress

For determinate work only. If you cannot say how far along it is, a spinner is the honest control.

Support79%
Legal10%

Separator and keyboard

A separator divides peers. If one side is subordinate to the other, indentation or space says it better. Kbd renders real key names, not styled text.

Separator
Adopt
Deploy
Maintain
Keys
KEsc

Aspect ratio and scroll area

Aspect ratio reserves space before media loads, so nothing jumps. Scroll area gives a long list its own boundary instead of scrolling the page.

  • Pipeline review
  • Ticket triage
  • QBR prep
  • Campaign briefs
  • Close checklist
  • Contract redlines
  • Renewal forecasting
  • Onboarding sequences
  • Escalation summaries

Overlays

Dialog

For a focused task that must finish before anything else. Never for a message, and never for a destructive confirmation, which is AlertDialog's job.

Trigger

Sheet and drawer

Sheet slides from an edge and suits secondary detail beside the main view. Drawer comes from the bottom and is the better mobile pattern, because it is reachable with a thumb.

Triggers

Popover, tooltip and hover card

Tooltip names a control in a few words and must never hold anything essential, since touch has no hover. Popover holds interactive content. Hover card previews a thing you could navigate to.

Popover
Tooltip
Hover card

Context menu

A right-click shortcut to actions that must also exist somewhere visible. It is an accelerator, never the only route to something.

Right-click anywhere in this area

Feedback

Loading and empty

Loading keeps the layout still. A skeleton matches the shape of what's coming so nothing jumps. Empty states offer a next action rather than announcing that there is no data.

Skeleton
Empty
No assessments yet
Start with one team and one workflow they already run every week.

Alert

For something the person needs to know about the whole view. If it belongs to one field, put it under that field instead, where the fix is.

Toast

Confirmation of something the person just did, that they do not need to act on. Never put an error people must fix in a toast; it disappears, and so does the fix.

Trigger

Calendar

For picking a date where the day of the week or the shape of the month matters. If people know the exact date, a text field is faster.

September 2026