Rost Reference

Every value in my design system, read straight from Figma, one variant at a time. For each component you'll see what never changes, then what each variant changes. I keep the token name next to every value on purpose: six tokens here all come out as #3a3a3a, and the colour alone can't tell you which one is right.

22contracts
16with guidance
146variants read
2377values captured
component

Badge

A small outlined label for status. The colour sits in the outline and the dot, never in the text.

Figma 139:395 contract: review guidance: agreed runceanu.com .badgeakount.ing .ak-badge 4 variants
  • Pending: Figma changed after the August read. The set now has a size property, and the four nodes this contract points at (139:396, 139:433, 139:439, 139:445) are now the small, dot-only badges at 24x24. The labelled badge described here is probably a bigger size, at node ids I haven't read yet. Read the set again before building it.
statusDefaultNegativePositiveWarning
Partsrooticonicons-dotunionlabeloutline

When to use

  • Marking the status of something in a list, a card or a table row: Paid, Overdue, Draft.

When not to use

  • Telling people something about the whole page. That's InlineBanner.
  • Describing what something is about rather than its status. That's Tag.
  • Anything clickable. Badge doesn't do hover or focus, Chip does.

Behaviour

status only changes the outline (non-interactive/background/<status>/light) and the little dot. The text stays non-interactive/foreground/tertiary whatever the status, and that's on purpose: I keep badges quiet. There's no background fill either. My first Badge in akount.ing got exactly these three things wrong.

Accessibility

  • Element: a <span>. Nothing to click.
  • Colour: the outline alone isn't enough. The text has to say the status ("Overdue", not "!").
  • Dot: aria-hidden="true".

Content

One or two words. Sentence case, no punctuation.

Never changes 37

PartPropertyValueToken
rootalign-itemscenterlayout
rootdisplayflexlayout
rootpositionrelativelayout
rootgap2pxspacing/gap/3xsmall
rootheight24pxspacing/size/small
rootpadding-bottom2pxspacing/gap/3xsmall
rootpadding-top0pxspacing/gap/none
rootpadding-left8pxspacing/gap/small
rootpadding-right8pxspacing/gap/small
rootborder-radius10000pxspacing/radius/full
iconalign-itemscenterlayout
icondisplayflexlayout
iconflex-shrink0layout
iconpositionrelativelayout
iconpadding-top2pxspacing/gap/3xsmall
icons-dotoverflowcliplayout
icons-dotflex-shrink0layout
icons-dotpositionrelativelayout
icons-dotwidth16pxsuggest spacing/size/2xsmall
icons-dotheight16pxsuggest spacing/size/2xsmall
unionpositionabsolutelayout
unioninset37.5%layout
labelflex-shrink0layout
labelwhite-spacenowraplayout
labeltext-aligncenterlayout
labelpositionrelativelayout
labelfont-family'General Sans Variable'font-family/base
labelfont-weight500typography/label/font-weight/medium
labelline-height14pxtypography/label/line-height
labelcolor#999non-interactive/foreground/tertiary
labelfont-size12pxtypography/label/font-size
labelletter-spacing0pxtypography/label/letter-spacing
outlineborder-sidesalllayout
outlinepositionabsolutelayout
outlineinset0layout
outlineopacity1opacity/solid
outlineborder-radius10000pxspacing/radius/full

Changes by variant 7

outline.border-color4

status=Default#3a3a3anon-interactive/foreground/quadruple
status=Negative#48050cnon-interactive/background/negative/light
status=Positive#004c19non-interactive/background/positive/light
status=Warning#492604non-interactive/background/warning/light

root.justify-content3

status=Negativecenterlayout
status=Positivecenterlayout
status=Warningcenterlayout
component

Button

A 48px button with just a label, in four levels of emphasis.

Figma 39:38 contract: review guidance: agreed not built yet 20 variants
typeBorderlessPrimarySecondaryTertiary
statesDefaultHoverPressedFocusDisabled
Partsrootlabelbackgroundtextfocus-ring

When to use

  • Doing something: save, send, continue, open.
  • Primary for the one thing a screen is really about. One per screen, no more.
  • Secondary for the options next to it, Tertiary when little is at stake, Borderless in busy places where an outline would just be noise.

When not to use

  • Actions that need an icon to make sense: use PillButton. Icon only: IconButton.
  • Going somewhere. That's a link. A button that navigates breaks open-in-new-tab and the back button.
  • Picking between options. That's Toggle or Chip.

Behaviour

type sets how loud it is. state is never something you pass in code: hover, pressed and focus come from :hover, :active and :focus-visible. Disabled is the only one you set yourself. The background fades to opacity/gentle and the label stays readable.

Accessibility

  • Element: <button type="button">, or type="submit" inside a form.
  • Name: the label people see. Don't swap it for an aria-label that says something else.
  • Keyboard: Enter and Space.
  • Focus: the focus-ring part, 2px, only on :focus-visible.
  • Disabled: I'd rather use aria-disabled="true" with a short reason nearby than disabled. disabled drops the button out of the tab order and nobody can find out why it doesn't work.

Content

A verb, sentence case, two or three words. "Save changes", not "OK" or "SUBMIT". Say what will happen.

Never changes 17

PartPropertyValueToken
rootjustify-contentcenterlayout
rootalign-itemscenterlayout
rootdisplayflexlayout
rootpositionrelativelayout
rootgap8pxspacing/gap/small
rootheight48pxspacing/size/medium-large
rootborder-radius10000pxspacing/radius/full
labelflex-shrink0layout
labelwhite-spacenowraplayout
labeltext-aligncenterlayout
labelpositionrelativelayout
labelfont-family'General Sans Variable'font-family/base
labelfont-weight500typography/body/font-weight/medium
labelline-height22pxtypography/body/line-height
labelcolor#060805actions/primary/default/label
labelfont-size16pxtypography/body/font-size
labelletter-spacing0pxtypography/body/letter-spacing

Changes by variant 355

background.background9

type=Secondary, state=Default#3a3a3aactions/secondary/regular/default/background
type=Secondary, state=Hover#747573actions/secondary/regular/hover/background
type=Tertiary, state=Hover#060805actions/tertiary/hover/background
type=Borderless, state=Hover#060805actions/tertiary/hover/background
type=Secondary, state=Pressed#999actions/secondary/regular/pressed/background
type=Tertiary, state=Pressed#454545actions/tertiary/pressed/background
type=Borderless, state=Pressed#454545actions/tertiary/pressed/background
type=Secondary, state=Disabled#3a3a3aactions/secondary/regular/disabled/background
type=Secondary, state=Focus#3a3a3aactions/secondary/regular/focus/background

background.border-color5

type=Secondary, state=Default#edededactions/secondary/regular/default/outline
type=Secondary, state=Hover#edededactions/secondary/regular/hover/outline
type=Secondary, state=Pressed#edededactions/secondary/regular/pressed/outline
type=Secondary, state=Disabled#edededactions/secondary/regular/disabled/outline
type=Secondary, state=Focus#edededactions/secondary/regular/focus/outline

background.border-radius7

type=Secondary, state=Default10000pxspacing/radius/full
type=Secondary, state=Hover10000pxspacing/radius/full
type=Tertiary, state=Hover10000pxspacing/radius/full
type=Secondary, state=Pressed10000pxspacing/radius/full
type=Tertiary, state=Pressed10000pxspacing/radius/full
type=Secondary, state=Disabled10000pxspacing/radius/full
type=Secondary, state=Focus10000pxspacing/radius/full

background.border-sides5

type=Secondary, state=Defaultleft toplayout
type=Secondary, state=Hoverleft toplayout
type=Secondary, state=Pressedleft toplayout
type=Secondary, state=Disabledleft toplayout
type=Secondary, state=Focusleft toplayout

background.inset9

type=Secondary, state=Default0layout
type=Secondary, state=Hover0layout
type=Tertiary, state=Hover0layout
type=Borderless, state=Hover0layout
type=Secondary, state=Pressed0layout
type=Tertiary, state=Pressed0layout
type=Borderless, state=Pressed0layout
type=Secondary, state=Disabled0layout
type=Secondary, state=Focus0layout

background.opacity9

type=Secondary, state=Default0.24opacity/gentle
type=Secondary, state=Hover0.32opacity/mild
type=Tertiary, state=Hover0.32opacity/mild
type=Borderless, state=Hover0.32opacity/mild
type=Secondary, state=Pressed0.32opacity/mild
type=Tertiary, state=Pressed0.32opacity/mild
type=Borderless, state=Pressed0.32opacity/mild
type=Secondary, state=Disabled0.32opacity/mild
type=Secondary, state=Focus0.24opacity/gentle

background.position9

type=Secondary, state=Defaultabsolutelayout
type=Secondary, state=Hoverabsolutelayout
type=Tertiary, state=Hoverabsolutelayout
type=Borderless, state=Hoverabsolutelayout
type=Secondary, state=Pressedabsolutelayout
type=Tertiary, state=Pressedabsolutelayout
type=Borderless, state=Pressedabsolutelayout
type=Secondary, state=Disabledabsolutelayout
type=Secondary, state=Focusabsolutelayout

focus-ring.border-color4

type=Primary, state=Focus#b6ffdaactions/primary/focus/focus-ring
type=Secondary, state=Focus#999actions/secondary/regular/focus/focus-ring
type=Tertiary, state=Focus#999actions/secondary/regular/focus/focus-ring
type=Borderless, state=Focus#999actions/secondary/regular/focus/focus-ring

focus-ring.border-radius3

type=Primary, state=Focus10000pxspacing/radius/full
type=Secondary, state=Focus10000pxspacing/radius/full
type=Tertiary, state=Focus10000pxspacing/radius/full

focus-ring.border-sides4

type=Primary, state=Focusalllayout
type=Secondary, state=Focusalllayout
type=Tertiary, state=Focusalllayout
type=Borderless, state=Focusalllayout

focus-ring.border-width4

type=Primary, state=Focus2pxspacing/outline/medium
type=Secondary, state=Focus2pxspacing/outline/medium
type=Tertiary, state=Focus2pxspacing/outline/medium
type=Borderless, state=Focus2pxspacing/outline/medium

focus-ring.inset4

type=Primary, state=Focus-5px -4px -4px -5pxlayout
type=Secondary, state=Focus-4pxlayout
type=Tertiary, state=Focus-4pxlayout
type=Borderless, state=Focus-4pxlayout

focus-ring.position4

type=Primary, state=Focusabsolutelayout
type=Secondary, state=Focusabsolutelayout
type=Tertiary, state=Focusabsolutelayout
type=Borderless, state=Focusabsolutelayout

root.background5

type=Primary, state=Default#00d669actions/primary/default/background
type=Primary, state=Hover#00b450actions/primary/hover/background
type=Primary, state=Pressed#00913aactions/primary/pressed/background
type=Primary, state=Disabled#00d669actions/primary/disabled/background
type=Primary, state=Focus#00d669actions/primary/focus/background

root.border-color5

type=Primary, state=Defaultrgba(237,237,237,0.64)actions/primary/default/outline
type=Primary, state=Hoverrgba(237,237,237,0.64)actions/primary/hover/outline
type=Primary, state=Pressedrgba(237,237,237,0.64)actions/primary/pressed/outline
type=Primary, state=Disabledrgba(237,237,237,0.64)actions/primary/disabled/outline
type=Primary, state=Focusrgba(237,237,237,0.64)actions/primary/focus/outline

root.border-sides5

type=Primary, state=Defaultleft toplayout
type=Primary, state=Hoverleft toplayout
type=Primary, state=Pressedleft toplayout
type=Primary, state=Disabledleft toplayout
type=Primary, state=Focusleft toplayout

root.border-top-width5

type=Primary, state=Default1pxspacing/outline/small
type=Primary, state=Hover1pxspacing/outline/small
type=Primary, state=Pressed1pxspacing/outline/small
type=Primary, state=Disabled1pxspacing/outline/small
type=Primary, state=Focus1pxspacing/outline/small

root.opacity4

type=Primary, state=Disabled0.24opacity/gentle
type=Secondary, state=Disabled0.24opacity/gentle
type=Tertiary, state=Disabled0.24opacity/gentle
type=Borderless, state=Disabled0.24opacity/gentle

root.padding5

type=Borderless, state=Default0pxspacing/gap/none
type=Borderless, state=Hover0pxspacing/gap/none
type=Borderless, state=Pressed0pxspacing/gap/none
type=Borderless, state=Disabled0pxspacing/gap/none
type=Borderless, state=Focus0pxspacing/gap/none

root.padding-bottom15

type=Primary, state=Default0pxspacing/gap/none
type=Secondary, state=Default0pxspacing/gap/none
type=Tertiary, state=Default0pxspacing/gap/none
type=Primary, state=Hover0pxspacing/gap/none
type=Secondary, state=Hover0pxspacing/gap/none
type=Tertiary, state=Hover0pxspacing/gap/none
type=Primary, state=Pressed0pxspacing/gap/none
type=Secondary, state=Pressed0pxspacing/gap/none
type=Tertiary, state=Pressed0pxspacing/gap/none
type=Primary, state=Disabled0pxspacing/gap/none
type=Secondary, state=Disabled0pxspacing/gap/none
type=Tertiary, state=Disabled0pxspacing/gap/none
type=Primary, state=Focus0pxspacing/gap/none
type=Secondary, state=Focus0pxspacing/gap/none
type=Tertiary, state=Focus0pxspacing/gap/none

root.padding-left15

type=Primary, state=Default20pxspacing/gap/medium-large
type=Secondary, state=Default20pxspacing/gap/medium-large
type=Tertiary, state=Default20pxspacing/gap/medium-large
type=Primary, state=Hover20pxspacing/gap/medium-large
type=Secondary, state=Hover20pxspacing/gap/medium-large
type=Tertiary, state=Hover20pxspacing/gap/medium-large
type=Primary, state=Pressed20pxspacing/gap/medium-large
type=Secondary, state=Pressed20pxspacing/gap/medium-large
type=Tertiary, state=Pressed20pxspacing/gap/medium-large
type=Primary, state=Disabled20pxspacing/gap/medium-large
type=Secondary, state=Disabled20pxspacing/gap/medium-large
type=Tertiary, state=Disabled20pxspacing/gap/medium-large
type=Primary, state=Focus20pxspacing/gap/medium-large
type=Secondary, state=Focus20pxspacing/gap/medium-large
type=Tertiary, state=Focus20pxspacing/gap/medium-large

root.padding-right15

type=Primary, state=Default20pxspacing/gap/medium-large
type=Secondary, state=Default20pxspacing/gap/medium-large
type=Tertiary, state=Default20pxspacing/gap/medium-large
type=Primary, state=Hover20pxspacing/gap/medium-large
type=Secondary, state=Hover20pxspacing/gap/medium-large
type=Tertiary, state=Hover20pxspacing/gap/medium-large
type=Primary, state=Pressed20pxspacing/gap/medium-large
type=Secondary, state=Pressed20pxspacing/gap/medium-large
type=Tertiary, state=Pressed20pxspacing/gap/medium-large
type=Primary, state=Disabled20pxspacing/gap/medium-large
type=Secondary, state=Disabled20pxspacing/gap/medium-large
type=Tertiary, state=Disabled20pxspacing/gap/medium-large
type=Primary, state=Focus20pxspacing/gap/medium-large
type=Secondary, state=Focus20pxspacing/gap/medium-large
type=Tertiary, state=Focus20pxspacing/gap/medium-large

root.padding-top15

type=Primary, state=Default0pxspacing/gap/none
type=Secondary, state=Default0pxspacing/gap/none
type=Tertiary, state=Default0pxspacing/gap/none
type=Primary, state=Hover0pxspacing/gap/none
type=Secondary, state=Hover0pxspacing/gap/none
type=Tertiary, state=Hover0pxspacing/gap/none
type=Primary, state=Pressed0pxspacing/gap/none
type=Secondary, state=Pressed0pxspacing/gap/none
type=Tertiary, state=Pressed0pxspacing/gap/none
type=Primary, state=Disabled0pxspacing/gap/none
type=Secondary, state=Disabled0pxspacing/gap/none
type=Tertiary, state=Disabled0pxspacing/gap/none
type=Primary, state=Focus0pxspacing/gap/none
type=Secondary, state=Focus0pxspacing/gap/none
type=Tertiary, state=Focus0pxspacing/gap/none

text.color19

type=Secondary, state=Default#d3d9d5actions/secondary/regular/default/label
type=Tertiary, state=Default#d3d9d5actions/tertiary/default/label
type=Borderless, state=Default#d3d9d5actions/tertiary/default/label
type=Primary, state=Hover#060805actions/primary/hover/label
type=Secondary, state=Hover#edededactions/secondary/regular/hover/label
type=Tertiary, state=Hover#edededactions/tertiary/hover/label
type=Borderless, state=Hover#edededactions/tertiary/hover/label
type=Primary, state=Pressed#060805actions/primary/pressed/label
type=Secondary, state=Pressed#d3d9d5actions/secondary/regular/pressed/label
type=Tertiary, state=Pressed#d3d9d5actions/tertiary/pressed/label
type=Borderless, state=Pressed#d3d9d5actions/tertiary/pressed/label
type=Primary, state=Disabled#060805actions/primary/disabled/label
type=Secondary, state=Disabled#d3d9d5actions/secondary/regular/disabled/label
type=Tertiary, state=Disabled#d3d9d5actions/tertiary/disabled/label
type=Borderless, state=Disabled#d3d9d5actions/tertiary/disabled/label
type=Primary, state=Focus#060805actions/primary/focus/label
type=Secondary, state=Focus#d3d9d5actions/secondary/regular/focus/label
type=Tertiary, state=Focus#d3d9d5actions/tertiary/focus/label
type=Borderless, state=Focus#d3d9d5actions/tertiary/focus/label

text.flex-shrink19

type=Secondary, state=Default0layout
type=Tertiary, state=Default0layout
type=Borderless, state=Default0layout
type=Primary, state=Hover0layout
type=Secondary, state=Hover0layout
type=Tertiary, state=Hover0layout
type=Borderless, state=Hover0layout
type=Primary, state=Pressed0layout
type=Secondary, state=Pressed0layout
type=Tertiary, state=Pressed0layout
type=Borderless, state=Pressed0layout
type=Primary, state=Disabled0layout
type=Secondary, state=Disabled0layout
type=Tertiary, state=Disabled0layout
type=Borderless, state=Disabled0layout
type=Primary, state=Focus0layout
type=Secondary, state=Focus0layout
type=Tertiary, state=Focus0layout
type=Borderless, state=Focus0layout

text.font-family19

type=Secondary, state=Default'General Sans Variable'font-family/base
type=Tertiary, state=Default'General Sans Variable'font-family/base
type=Borderless, state=Default'General Sans Variable'font-family/base
type=Primary, state=Hover'General Sans Variable'font-family/base
type=Secondary, state=Hover'General Sans Variable'font-family/base
type=Tertiary, state=Hover'General Sans Variable'font-family/base
type=Borderless, state=Hover'General Sans Variable'font-family/base
type=Primary, state=Pressed'General Sans Variable'font-family/base
type=Secondary, state=Pressed'General Sans Variable'font-family/base
type=Tertiary, state=Pressed'General Sans Variable'font-family/base
type=Borderless, state=Pressed'General Sans Variable'font-family/base
type=Primary, state=Disabled'General Sans Variable'font-family/base
type=Secondary, state=Disabled'General Sans Variable'font-family/base
type=Tertiary, state=Disabled'General Sans Variable'font-family/base
type=Borderless, state=Disabled'General Sans Variable'font-family/base
type=Primary, state=Focus'General Sans Variable'font-family/base
type=Secondary, state=Focus'General Sans Variable'font-family/base
type=Tertiary, state=Focus'General Sans Variable'font-family/base
type=Borderless, state=Focus'General Sans Variable'font-family/base

text.font-size19

type=Secondary, state=Default16pxtypography/body/font-size
type=Tertiary, state=Default16pxtypography/body/font-size
type=Borderless, state=Default16pxtypography/body/font-size
type=Primary, state=Hover16pxtypography/body/font-size
type=Secondary, state=Hover16pxtypography/body/font-size
type=Tertiary, state=Hover16pxtypography/body/font-size
type=Borderless, state=Hover16pxtypography/body/font-size
type=Primary, state=Pressed16pxtypography/body/font-size
type=Secondary, state=Pressed16pxtypography/body/font-size
type=Tertiary, state=Pressed16pxtypography/body/font-size
type=Borderless, state=Pressed16pxtypography/body/font-size
type=Primary, state=Disabled16pxtypography/body/font-size
type=Secondary, state=Disabled16pxtypography/body/font-size
type=Tertiary, state=Disabled16pxtypography/body/font-size
type=Borderless, state=Disabled16pxtypography/body/font-size
type=Primary, state=Focus16pxtypography/body/font-size
type=Secondary, state=Focus16pxtypography/body/font-size
type=Tertiary, state=Focus16pxtypography/body/font-size
type=Borderless, state=Focus16pxtypography/body/font-size

text.font-weight19

type=Secondary, state=Default500typography/body/font-weight/medium
type=Tertiary, state=Default500typography/body/font-weight/medium
type=Borderless, state=Default500typography/body/font-weight/medium
type=Primary, state=Hover500typography/body/font-weight/medium
type=Secondary, state=Hover500typography/body/font-weight/medium
type=Tertiary, state=Hover500typography/body/font-weight/medium
type=Borderless, state=Hover500typography/body/font-weight/medium
type=Primary, state=Pressed500typography/body/font-weight/medium
type=Secondary, state=Pressed500typography/body/font-weight/medium
type=Tertiary, state=Pressed500typography/body/font-weight/medium
type=Borderless, state=Pressed500typography/body/font-weight/medium
type=Primary, state=Disabled500typography/body/font-weight/medium
type=Secondary, state=Disabled500typography/body/font-weight/medium
type=Tertiary, state=Disabled500typography/body/font-weight/medium
type=Borderless, state=Disabled500typography/body/font-weight/medium
type=Primary, state=Focus500typography/body/font-weight/medium
type=Secondary, state=Focus500typography/body/font-weight/medium
type=Tertiary, state=Focus500typography/body/font-weight/medium
type=Borderless, state=Focus500typography/body/font-weight/medium

text.letter-spacing19

type=Secondary, state=Default0pxtypography/body/letter-spacing
type=Tertiary, state=Default0pxtypography/body/letter-spacing
type=Borderless, state=Default0pxtypography/body/letter-spacing
type=Primary, state=Hover0pxtypography/body/letter-spacing
type=Secondary, state=Hover0pxtypography/body/letter-spacing
type=Tertiary, state=Hover0pxtypography/body/letter-spacing
type=Borderless, state=Hover0pxtypography/body/letter-spacing
type=Primary, state=Pressed0pxtypography/body/letter-spacing
type=Secondary, state=Pressed0pxtypography/body/letter-spacing
type=Tertiary, state=Pressed0pxtypography/body/letter-spacing
type=Borderless, state=Pressed0pxtypography/body/letter-spacing
type=Primary, state=Disabled0pxtypography/body/letter-spacing
type=Secondary, state=Disabled0pxtypography/body/letter-spacing
type=Tertiary, state=Disabled0pxtypography/body/letter-spacing
type=Borderless, state=Disabled0pxtypography/body/letter-spacing
type=Primary, state=Focus0pxtypography/body/letter-spacing
type=Secondary, state=Focus0pxtypography/body/letter-spacing
type=Tertiary, state=Focus0pxtypography/body/letter-spacing
type=Borderless, state=Focus0pxtypography/body/letter-spacing

text.line-height19

type=Secondary, state=Default22pxtypography/body/line-height
type=Tertiary, state=Default22pxtypography/body/line-height
type=Borderless, state=Default22pxtypography/body/line-height
type=Primary, state=Hover22pxtypography/body/line-height
type=Secondary, state=Hover22pxtypography/body/line-height
type=Tertiary, state=Hover22pxtypography/body/line-height
type=Borderless, state=Hover22pxtypography/body/line-height
type=Primary, state=Pressed22pxtypography/body/line-height
type=Secondary, state=Pressed22pxtypography/body/line-height
type=Tertiary, state=Pressed22pxtypography/body/line-height
type=Borderless, state=Pressed22pxtypography/body/line-height
type=Primary, state=Disabled22pxtypography/body/line-height
type=Secondary, state=Disabled22pxtypography/body/line-height
type=Tertiary, state=Disabled22pxtypography/body/line-height
type=Borderless, state=Disabled22pxtypography/body/line-height
type=Primary, state=Focus22pxtypography/body/line-height
type=Secondary, state=Focus22pxtypography/body/line-height
type=Tertiary, state=Focus22pxtypography/body/line-height
type=Borderless, state=Focus22pxtypography/body/line-height

text.position19

type=Secondary, state=Defaultrelativelayout
type=Tertiary, state=Defaultrelativelayout
type=Borderless, state=Defaultrelativelayout
type=Primary, state=Hoverrelativelayout
type=Secondary, state=Hoverrelativelayout
type=Tertiary, state=Hoverrelativelayout
type=Borderless, state=Hoverrelativelayout
type=Primary, state=Pressedrelativelayout
type=Secondary, state=Pressedrelativelayout
type=Tertiary, state=Pressedrelativelayout
type=Borderless, state=Pressedrelativelayout
type=Primary, state=Disabledrelativelayout
type=Secondary, state=Disabledrelativelayout
type=Tertiary, state=Disabledrelativelayout
type=Borderless, state=Disabledrelativelayout
type=Primary, state=Focusrelativelayout
type=Secondary, state=Focusrelativelayout
type=Tertiary, state=Focusrelativelayout
type=Borderless, state=Focusrelativelayout

text.text-align19

type=Secondary, state=Defaultcenterlayout
type=Tertiary, state=Defaultcenterlayout
type=Borderless, state=Defaultcenterlayout
type=Primary, state=Hovercenterlayout
type=Secondary, state=Hovercenterlayout
type=Tertiary, state=Hovercenterlayout
type=Borderless, state=Hovercenterlayout
type=Primary, state=Pressedcenterlayout
type=Secondary, state=Pressedcenterlayout
type=Tertiary, state=Pressedcenterlayout
type=Borderless, state=Pressedcenterlayout
type=Primary, state=Disabledcenterlayout
type=Secondary, state=Disabledcenterlayout
type=Tertiary, state=Disabledcenterlayout
type=Borderless, state=Disabledcenterlayout
type=Primary, state=Focuscenterlayout
type=Secondary, state=Focuscenterlayout
type=Tertiary, state=Focuscenterlayout
type=Borderless, state=Focuscenterlayout

text.white-space19

type=Secondary, state=Defaultnowraplayout
type=Tertiary, state=Defaultnowraplayout
type=Borderless, state=Defaultnowraplayout
type=Primary, state=Hovernowraplayout
type=Secondary, state=Hovernowraplayout
type=Tertiary, state=Hovernowraplayout
type=Borderless, state=Hovernowraplayout
type=Primary, state=Pressednowraplayout
type=Secondary, state=Pressednowraplayout
type=Tertiary, state=Pressednowraplayout
type=Borderless, state=Pressednowraplayout
type=Primary, state=Disablednowraplayout
type=Secondary, state=Disablednowraplayout
type=Tertiary, state=Disablednowraplayout
type=Borderless, state=Disablednowraplayout
type=Primary, state=Focusnowraplayout
type=Secondary, state=Focusnowraplayout
type=Tertiary, state=Focusnowraplayout
type=Borderless, state=Focusnowraplayout
component

Chip

A small outlined label you can click, for filters and quick choices.

Figma 139:317 contract: review guidance: agreed runceanu.com .chip 5 variants
statusDefault
statesDefaultHoverPressedFocusDisabled
Partsrootlabeloutlinefocus-ring

When to use

  • Filters and quick picks in a row: categories on my portfolio, date ranges.

When not to use

  • A status nobody clicks: Badge.
  • A topic on a piece of content: Tag.

Behaviour

One status (Default) and five states. Hover, pressed and focus come from the browser. There's no selected chip in the kit yet, so a selected chip needs designing before anyone builds one. Not an improvised fill.

Accessibility

  • Element: <button type="button">, with aria-pressed when it filters.
  • Group: wrap the set in something with a name (role="group" and aria-label="Filter by category").
  • Focus: focus-ring, on :focus-visible.

Content

One or two words, sentence case.

Never changes 24

PartPropertyValueToken
rootjustify-contentcenterlayout
rootalign-itemscenterlayout
rootdisplayflexlayout
rootpositionrelativelayout
rootgap8pxspacing/gap/small
rootheight24pxspacing/size/small
rootpadding-bottom2pxspacing/gap/3xsmall
rootpadding-top0pxspacing/gap/none
rootpadding-left8pxspacing/gap/small
rootpadding-right8pxspacing/gap/small
rootborder-radius10000pxspacing/radius/full
labelflex-shrink0layout
labelwhite-spacenowraplayout
labeltext-aligncenterlayout
labelpositionrelativelayout
labelfont-family'General Sans Variable'font-family/base
labelfont-weight500typography/label/font-weight/medium
labelline-height14pxtypography/label/line-height
labelfont-size12pxtypography/label/font-size
labelletter-spacing0pxtypography/label/letter-spacing
outlineborder-sidesalllayout
outlinepositionabsolutelayout
outlineinset0layout
outlineborder-radius10000pxspacing/radius/full

Changes by variant 22

focus-ring.border-color1

status=Default, state=Focus#999actions/secondary/regular/focus/focus-ring

focus-ring.border-radius1

status=Default, state=Focus10000pxspacing/radius/full

focus-ring.border-sides1

status=Default, state=Focusalllayout

focus-ring.border-width1

status=Default, state=Focus2pxspacing/outline/medium

focus-ring.inset1

status=Default, state=Focus-4pxlayout

focus-ring.position1

status=Default, state=Focusabsolutelayout

label.color5

status=Default, state=Default#d3d9d5actions/secondary/regular/default/label
status=Default, state=Hover#edededactions/secondary/regular/hover/label
status=Default, state=Pressed#d3d9d5actions/secondary/regular/pressed/label
status=Default, state=Disabled#d3d9d5actions/secondary/regular/disabled/label
status=Default, state=Focus#d3d9d5actions/secondary/regular/focus/label

outline.border-color5

status=Default, state=Default#edededactions/secondary/regular/default/outline
status=Default, state=Hover#edededactions/secondary/regular/hover/outline
status=Default, state=Pressed#edededactions/secondary/regular/pressed/outline
status=Default, state=Disabled#edededactions/secondary/regular/disabled/outline
status=Default, state=Focus#edededactions/secondary/regular/focus/outline

outline.opacity5

status=Default, state=Default0.24opacity/gentle
status=Default, state=Hover0.64opacity/strong
status=Default, state=Pressed1opacity/solid
status=Default, state=Disabled1opacity/solid
status=Default, state=Focus0.24opacity/gentle

root.opacity1

status=Default, state=Disabled0.24opacity/gentle
component

Divider

A thin line between things.

Figma 39:111 contract: review guidance: missing not built yet
Partsroot

Never changes 2

PartPropertyValueToken
rootpositionrelativelayout
rootwidth104pxjust the Figma frame size
effect

Floating effect

The only drop shadow in the kit, for things that float above the page.

Figma 231:2 contract: review guidance: agreed not built yet
Partsroot
root
Whatever the style is applied to. In Figma it's called "Shadow/Floating".

When to use

  • Anything lifted above the content: menus, popovers, a card being dragged.

When not to use

  • Cards just sitting there. This kit is dark, so surfaces are told apart by tone, not shadow.

Behaviour

0 16px 24px rgba(0,0,0,0.16), as --shadow-floating. There's no family of elevation tokens yet. If I ever need a second shadow, that's when I add one.

Accessibility

  • Separation: on a dark background, a shadow doesn't separate anything for someone with low vision. Pair it with a different surface tone or an outline.

Never changes 1

PartPropertyValueToken
rootbox-shadow0px 16px 24px 0px rgba(0, 0, 0, 0.16)shadow/floating
pattern

Hero Media

The full-width hero on every case study: artwork pinned behind a 16px frame and dimmed to the same level everywhere.

Figma 245:2900 contract: review guidance: agreed not built yet
Partsheroframemedia
hero
The full-width section, 630px tall, on `non-interactive/background/primary`. Its 16px padding is the frame that shows the page around the image. The width has to take off the real scrollbar (100vw includes it), otherwise the sides look about 8px while the top is 16.
frame
The window onto the artwork. It fills the hero inside the 16px frame, with `radius/xlarge` corners, and hides anything that spills out (a rounded `clip-path` when the artwork uses fixed positioning).
media
The artwork itself: a div with a background image, never an `<img>` (the pinned effect needs a background).

When to use

  • The top of every case study on runceanu.com. One per page.

When not to use

  • The home page. That one has the Paper effect instead of artwork.

Behaviour

The artwork stays put and the page scrolls over it (background-attachment: fixed). Phones, tablets and prefers-reduced-motion get a normal static background instead. The dim only works as opacity and the colour underneath together. Never change one without the other.

Accessibility

  • Artwork: it's a background image, so it's decoration by definition. Anything people need from it goes in the text.
  • Contrast: check the text against the dimmed artwork, not the colour underneath.
  • Motion: the pinned effect switches off with prefers-reduced-motion.

Where code differs on purpose

  • All apps: The artwork is dimmed with `opacity/medium` (0.48) on a #171717 frame. Figma's node says 32% (`opacity/mild`). I set one dim for every case study on 2026-10-18. What you see is opacity times what's underneath, and three heroes looked darker at the same opacity. Figma never caught up.

Never changes 8

PartPropertyValueToken
heroheight630pxspacing/layout/hero-height
heropadding16pxspacing/gap/medium
herobackground#060805non-interactive/background/primary
frameborder-radius24pxspacing/radius/xlarge
framebackground#171717non-interactive/background/secondary
mediaopacity0.48opacity/medium
mediabackground-attachmentfixedlayout
mediabackground-sizeexplicit px (asset-native, e.g. 2336px 1196px)on purpose: Each artwork's native pixel size.
component

IconButton

A round button with only an icon, including the Project type used on case-study thumbnails.

Figma 93:587 contract: review guidance: agreed not built yet 20 variants
typePrimaryProjectSecondaryTertiary
statesDefaultHoverPressedFocusDisabled
Partsrooticons-arrow-leftunionbackgroundfocus-ring

When to use

  • Actions everyone knows where a label would crowd things: close, back, next, previous.
  • Project on project thumbnails and case-study cards, sitting on top of imagery.

When not to use

  • Any icon that isn't instantly obvious. Use PillButton, an icon isn't a label.
  • On/off or one-of-many choices. That's Toggle. IconButton does something, it doesn't remember anything.

Behaviour

type is Primary, Secondary, Tertiary or Project. States come from the browser like every other action. Don't shrink it below 40px, fingers need the room.

Accessibility

  • Element: <button type="button">.
  • Name: aria-label is a must, there's no visible text. Say what it does ("Close dialog"), not what it shows ("X").
  • Keyboard: Enter and Space.
  • Focus: focus-ring, on :focus-visible.
  • Tooltip: give it a tooltip with the same words, once there's a Tooltip in the kit.

Content

No text. The aria-label follows the same rules as Button.

Never changes 13

PartPropertyValueToken
rootjustify-contentcenterlayout
rootalign-itemscenterlayout
rootdisplayflexlayout
rootpositionrelativelayout
rootgap8pxspacing/gap/small
rootborder-radius10000pxspacing/radius/full
icons-arrow-leftoverflowcliplayout
icons-arrow-leftflex-shrink0layout
icons-arrow-leftpositionrelativelayout
icons-arrow-leftwidth20pxsuggest spacing/size/xsmall
icons-arrow-leftheight20pxsuggest spacing/size/xsmall
unionpositionabsolutelayout
unioninset20.84% 16.66% 20.83% 18.4%layout

Changes by variant 208

background.background9

type=Secondary, state=Default#3a3a3aactions/secondary/regular/default/background
type=Secondary, state=Hover#747573actions/secondary/regular/hover/background
type=Tertiary, state=Hover#060805actions/tertiary/hover/background
type=Secondary, state=Pressed#999actions/secondary/regular/pressed/background
type=Tertiary, state=Pressed#454545actions/tertiary/pressed/background
type=Secondary, state=Disabled#3a3a3aactions/secondary/regular/disabled/background
type=Secondary, state=Focus#3a3a3aactions/secondary/regular/focus/background
type=Project, state=Hover#060805actions/tertiary/hover/background
type=Project, state=Pressed#454545actions/tertiary/pressed/background

background.border-color5

type=Secondary, state=Default#edededactions/secondary/regular/default/outline
type=Secondary, state=Hover#edededactions/secondary/regular/hover/outline
type=Secondary, state=Pressed#edededactions/secondary/regular/pressed/outline
type=Secondary, state=Disabled#edededactions/secondary/regular/disabled/outline
type=Secondary, state=Focus#edededactions/secondary/regular/focus/outline

background.border-radius9

type=Secondary, state=Default10000pxspacing/radius/full
type=Secondary, state=Hover10000pxspacing/radius/full
type=Tertiary, state=Hover10000pxspacing/radius/full
type=Secondary, state=Pressed10000pxspacing/radius/full
type=Tertiary, state=Pressed10000pxspacing/radius/full
type=Secondary, state=Disabled10000pxspacing/radius/full
type=Secondary, state=Focus10000pxspacing/radius/full
type=Project, state=Hover10000pxspacing/radius/full
type=Project, state=Pressed10000pxspacing/radius/full

background.border-sides5

type=Secondary, state=Defaultleft toplayout
type=Secondary, state=Hoverleft toplayout
type=Secondary, state=Pressedleft toplayout
type=Secondary, state=Disabledleft toplayout
type=Secondary, state=Focusleft toplayout

background.inset9

type=Secondary, state=Default0layout
type=Secondary, state=Hover0layout
type=Tertiary, state=Hover0layout
type=Secondary, state=Pressed0layout
type=Tertiary, state=Pressed0layout
type=Secondary, state=Disabled0layout
type=Secondary, state=Focus0layout
type=Project, state=Hover0layout
type=Project, state=Pressed0layout

background.opacity9

type=Secondary, state=Default0.24opacity/gentle
type=Secondary, state=Hover0.32opacity/mild
type=Tertiary, state=Hover0.32opacity/mild
type=Secondary, state=Pressed0.32opacity/mild
type=Tertiary, state=Pressed0.32opacity/mild
type=Secondary, state=Disabled0.32opacity/mild
type=Secondary, state=Focus0.24opacity/gentle
type=Project, state=Hover0.32opacity/mild
type=Project, state=Pressed0.32opacity/mild

background.position9

type=Secondary, state=Defaultabsolutelayout
type=Secondary, state=Hoverabsolutelayout
type=Tertiary, state=Hoverabsolutelayout
type=Secondary, state=Pressedabsolutelayout
type=Tertiary, state=Pressedabsolutelayout
type=Secondary, state=Disabledabsolutelayout
type=Secondary, state=Focusabsolutelayout
type=Project, state=Hoverabsolutelayout
type=Project, state=Pressedabsolutelayout

focus-ring.border-color4

type=Primary, state=Focus#b6ffdaactions/primary/focus/focus-ring
type=Secondary, state=Focus#999actions/secondary/regular/focus/focus-ring
type=Tertiary, state=Focus#999actions/secondary/regular/focus/focus-ring
type=Project, state=Focus#999actions/secondary/regular/focus/focus-ring

focus-ring.border-radius4

type=Primary, state=Focus10000pxspacing/radius/full
type=Secondary, state=Focus10000pxspacing/radius/full
type=Tertiary, state=Focus10000pxspacing/radius/full
type=Project, state=Focus10000pxspacing/radius/full

focus-ring.border-sides4

type=Primary, state=Focusalllayout
type=Secondary, state=Focusalllayout
type=Tertiary, state=Focusalllayout
type=Project, state=Focusalllayout

focus-ring.border-width4

type=Primary, state=Focus2pxspacing/outline/medium
type=Secondary, state=Focus2pxspacing/outline/medium
type=Tertiary, state=Focus2pxspacing/outline/medium
type=Project, state=Focus2pxspacing/outline/medium

focus-ring.inset4

type=Primary, state=Focus-5px -4px -4px -5pxlayout
type=Secondary, state=Focus-4pxlayout
type=Tertiary, state=Focus-4pxlayout
type=Project, state=Focus-4pxlayout

focus-ring.position4

type=Primary, state=Focusabsolutelayout
type=Secondary, state=Focusabsolutelayout
type=Tertiary, state=Focusabsolutelayout
type=Project, state=Focusabsolutelayout

root.background5

type=Primary, state=Default#00d669actions/primary/default/background
type=Primary, state=Hover#00b450actions/primary/hover/background
type=Primary, state=Pressed#00913aactions/primary/pressed/background
type=Primary, state=Disabled#00d669actions/primary/disabled/background
type=Primary, state=Focus#00d669actions/primary/focus/background

root.border-color5

type=Primary, state=Defaultrgba(237,237,237,0.64)actions/primary/default/outline
type=Primary, state=Hoverrgba(237,237,237,0.64)actions/primary/hover/outline
type=Primary, state=Pressedrgba(237,237,237,0.64)actions/primary/pressed/outline
type=Primary, state=Disabledrgba(237,237,237,0.64)actions/primary/disabled/outline
type=Primary, state=Focusrgba(237,237,237,0.64)actions/primary/focus/outline

root.border-sides5

type=Primary, state=Defaultleft toplayout
type=Primary, state=Hoverleft toplayout
type=Primary, state=Pressedleft toplayout
type=Primary, state=Disabledleft toplayout
type=Primary, state=Focusleft toplayout

root.border-top-width5

type=Primary, state=Default1pxspacing/outline/small
type=Primary, state=Hover1pxspacing/outline/small
type=Primary, state=Pressed1pxspacing/outline/small
type=Primary, state=Disabled1pxspacing/outline/small
type=Primary, state=Focus1pxspacing/outline/small

root.height20

type=Primary, state=Default48pxspacing/size/medium-large
type=Secondary, state=Default48pxspacing/size/medium-large
type=Tertiary, state=Default48pxspacing/size/medium-large
type=Primary, state=Hover48pxspacing/size/medium-large
type=Secondary, state=Hover48pxspacing/size/medium-large
type=Tertiary, state=Hover48pxspacing/size/medium-large
type=Primary, state=Pressed48pxspacing/size/medium-large
type=Secondary, state=Pressed48pxspacing/size/medium-large
type=Tertiary, state=Pressed48pxspacing/size/medium-large
type=Primary, state=Disabled48pxspacing/size/medium-large
type=Secondary, state=Disabled48pxspacing/size/medium-large
type=Tertiary, state=Disabled48pxspacing/size/medium-large
type=Primary, state=Focus48pxspacing/size/medium-large
type=Secondary, state=Focus48pxspacing/size/medium-large
type=Tertiary, state=Focus48pxspacing/size/medium-large
type=Project, state=Default32pxspacing/size/small-medium
type=Project, state=Hover32pxspacing/size/small-medium
type=Project, state=Pressed32pxspacing/size/small-medium
type=Project, state=Disabled32pxspacing/size/small-medium
type=Project, state=Focus32pxspacing/size/small-medium

root.opacity4

type=Primary, state=Disabled0.24opacity/gentle
type=Secondary, state=Disabled0.24opacity/gentle
type=Tertiary, state=Disabled0.24opacity/gentle
type=Project, state=Disabled0.24opacity/gentle

root.padding5

type=Project, state=Default0pxspacing/gap/none
type=Project, state=Hover0pxspacing/gap/none
type=Project, state=Pressed0pxspacing/gap/none
type=Project, state=Disabled0pxspacing/gap/none
type=Project, state=Focus0pxspacing/gap/none

root.padding-bottom15

type=Primary, state=Default0pxspacing/gap/none
type=Secondary, state=Default0pxspacing/gap/none
type=Tertiary, state=Default0pxspacing/gap/none
type=Primary, state=Hover0pxspacing/gap/none
type=Secondary, state=Hover0pxspacing/gap/none
type=Tertiary, state=Hover0pxspacing/gap/none
type=Primary, state=Pressed0pxspacing/gap/none
type=Secondary, state=Pressed0pxspacing/gap/none
type=Tertiary, state=Pressed0pxspacing/gap/none
type=Primary, state=Disabled0pxspacing/gap/none
type=Secondary, state=Disabled0pxspacing/gap/none
type=Tertiary, state=Disabled0pxspacing/gap/none
type=Primary, state=Focus0pxspacing/gap/none
type=Secondary, state=Focus0pxspacing/gap/none
type=Tertiary, state=Focus0pxspacing/gap/none

root.padding-left15

type=Primary, state=Default20pxspacing/gap/medium-large
type=Secondary, state=Default20pxspacing/gap/medium-large
type=Tertiary, state=Default20pxspacing/gap/medium-large
type=Primary, state=Hover20pxspacing/gap/medium-large
type=Secondary, state=Hover20pxspacing/gap/medium-large
type=Tertiary, state=Hover20pxspacing/gap/medium-large
type=Primary, state=Pressed20pxspacing/gap/medium-large
type=Secondary, state=Pressed20pxspacing/gap/medium-large
type=Tertiary, state=Pressed20pxspacing/gap/medium-large
type=Primary, state=Disabled20pxspacing/gap/medium-large
type=Secondary, state=Disabled20pxspacing/gap/medium-large
type=Tertiary, state=Disabled20pxspacing/gap/medium-large
type=Primary, state=Focus20pxspacing/gap/medium-large
type=Secondary, state=Focus20pxspacing/gap/medium-large
type=Tertiary, state=Focus20pxspacing/gap/medium-large

root.padding-right15

type=Primary, state=Default20pxspacing/gap/medium-large
type=Secondary, state=Default20pxspacing/gap/medium-large
type=Tertiary, state=Default20pxspacing/gap/medium-large
type=Primary, state=Hover20pxspacing/gap/medium-large
type=Secondary, state=Hover20pxspacing/gap/medium-large
type=Tertiary, state=Hover20pxspacing/gap/medium-large
type=Primary, state=Pressed20pxspacing/gap/medium-large
type=Secondary, state=Pressed20pxspacing/gap/medium-large
type=Tertiary, state=Pressed20pxspacing/gap/medium-large
type=Primary, state=Disabled20pxspacing/gap/medium-large
type=Secondary, state=Disabled20pxspacing/gap/medium-large
type=Tertiary, state=Disabled20pxspacing/gap/medium-large
type=Primary, state=Focus20pxspacing/gap/medium-large
type=Secondary, state=Focus20pxspacing/gap/medium-large
type=Tertiary, state=Focus20pxspacing/gap/medium-large

root.padding-top15

type=Primary, state=Default0pxspacing/gap/none
type=Secondary, state=Default0pxspacing/gap/none
type=Tertiary, state=Default0pxspacing/gap/none
type=Primary, state=Hover0pxspacing/gap/none
type=Secondary, state=Hover0pxspacing/gap/none
type=Tertiary, state=Hover0pxspacing/gap/none
type=Primary, state=Pressed0pxspacing/gap/none
type=Secondary, state=Pressed0pxspacing/gap/none
type=Tertiary, state=Pressed0pxspacing/gap/none
type=Primary, state=Disabled0pxspacing/gap/none
type=Secondary, state=Disabled0pxspacing/gap/none
type=Tertiary, state=Disabled0pxspacing/gap/none
type=Primary, state=Focus0pxspacing/gap/none
type=Secondary, state=Focus0pxspacing/gap/none
type=Tertiary, state=Focus0pxspacing/gap/none

root.width20

type=Primary, state=Default48pxspacing/size/medium-large
type=Secondary, state=Default48pxspacing/size/medium-large
type=Tertiary, state=Default48pxspacing/size/medium-large
type=Primary, state=Hover48pxspacing/size/medium-large
type=Secondary, state=Hover48pxspacing/size/medium-large
type=Tertiary, state=Hover48pxspacing/size/medium-large
type=Primary, state=Pressed48pxspacing/size/medium-large
type=Secondary, state=Pressed48pxspacing/size/medium-large
type=Tertiary, state=Pressed48pxspacing/size/medium-large
type=Primary, state=Disabled48pxspacing/size/medium-large
type=Secondary, state=Disabled48pxspacing/size/medium-large
type=Tertiary, state=Disabled48pxspacing/size/medium-large
type=Primary, state=Focus48pxspacing/size/medium-large
type=Secondary, state=Focus48pxspacing/size/medium-large
type=Tertiary, state=Focus48pxspacing/size/medium-large
type=Project, state=Default32pxspacing/size/small-medium
type=Project, state=Hover32pxspacing/size/small-medium
type=Project, state=Pressed32pxspacing/size/small-medium
type=Project, state=Disabled32pxspacing/size/small-medium
type=Project, state=Focus32pxspacing/size/small-medium
component

InlineBanner

A filled status pill with an icon and a label, in four statuses and two sizes.

Figma 205:614 contract: review guidance: agreed akount.ing .ak-banner 8 variants
statusDefaultNegativePositiveWarning
sizeMediumSmall
Partsrootbackground-sloticons-plusunionlabeltexticons-alarmicons-positiveicons-warning

When to use

  • Telling people something about the page or a section they should notice: saved, offline, open for work, needs your attention.
  • Small in a line of text, Medium on its own line or at the top of a section.

When not to use

  • The status of one item in a list or table. That's Badge, smaller and quieter.
  • Anything that needs a decision. That's a dialog. A banner tells, it doesn't ask.

Behaviour

status (Default, Positive, Negative, Warning) sets the fill and the icon: plus, check, alarm, warning. You can't interact with it: no hover, no focus.

Accessibility

  • Element: a <span> or a <p>. If it shows up because of something the person just did, put it in a live region (role="status", or role="alert" for Negative).
  • Colour: the icon carries the status as well as the fill. Until the icons are exported (akount.ing has a deviation for this), the words have to say the status.
  • Glyph: aria-hidden="true". The label carries the meaning.

Content

One short sentence, no full stop if it's a fragment. Lead with what happened: "Saved just now", "Payment failed: card expired".

Where code differs on purpose

  • akount.ing: Renders label-only; the per-status glyph (plus / alarm / positive / warning) is an optional slot. The kit glyphs are not exported yet, and drawing substitutes would ship something the kit does not contain.

Never changes 23

PartPropertyValueToken
rootalign-itemscenterlayout
rootdisplayflexlayout
rootpositionrelativelayout
rootpadding8pxspacing/gap/small
rootborder-radius8pxspacing/radius/small
backgroundpositionabsolutelayout
backgroundinset0layout
backgroundbackground#3a3a3anon-interactive/background/tertiary
backgroundopacity0.32opacity/mild
backgroundborder-radius8pxspacing/radius/small
unionpositionabsolutelayout
labeloverflowcliplayout
labeljustify-contentcenterlayout
labelalign-itemscenterlayout
labeldisplayflexlayout
labelflex-shrink0layout
labelpositionrelativelayout
textflex-shrink0layout
textwhite-spacenowraplayout
texttext-aligncenterlayout
textpositionrelativelayout
textfont-family'General Sans Variable'font-family/base
textcolor#d3d9d5non-interactive/foreground/secondary

Changes by variant 118

-slot.align-items2

status=Default, size=Smallcenterlayout
status=Default, size=Mediumcenterlayout

-slot.display2

status=Default, size=Smallflexlayout
status=Default, size=Mediumflexlayout

-slot.flex-shrink2

status=Default, size=Small0layout
status=Default, size=Medium0layout

-slot.gap2

status=Default, size=Small0pxspacing/gap/none
status=Default, size=Medium0pxspacing/gap/none

-slot.padding2

status=Default, size=Small0pxspacing/gap/none
status=Default, size=Medium0pxspacing/gap/none

-slot.position2

status=Default, size=Smallrelativelayout
status=Default, size=Mediumrelativelayout

icons-alarm.flex-shrink2

status=Negative, size=Small0layout
status=Negative, size=Medium0layout

icons-alarm.height2

status=Negative, size=Small16pxsuggest spacing/size/2xsmall
status=Negative, size=Medium20pxsuggest spacing/size/xsmall

icons-alarm.overflow2

status=Negative, size=Smallcliplayout
status=Negative, size=Mediumcliplayout

icons-alarm.position2

status=Negative, size=Smallrelativelayout
status=Negative, size=Mediumrelativelayout

icons-alarm.width2

status=Negative, size=Small16pxsuggest spacing/size/2xsmall
status=Negative, size=Medium20pxsuggest spacing/size/xsmall

icons-plus.flex-shrink2

status=Default, size=Small0layout
status=Default, size=Medium0layout

icons-plus.height2

status=Default, size=Small16pxsuggest spacing/size/2xsmall
status=Default, size=Medium20pxsuggest spacing/size/xsmall

icons-plus.overflow2

status=Default, size=Smallcliplayout
status=Default, size=Mediumcliplayout

icons-plus.position2

status=Default, size=Smallrelativelayout
status=Default, size=Mediumrelativelayout

icons-plus.width2

status=Default, size=Small16pxsuggest spacing/size/2xsmall
status=Default, size=Medium20pxsuggest spacing/size/xsmall

icons-positive.flex-shrink2

status=Positive, size=Small0layout
status=Positive, size=Medium0layout

icons-positive.height2

status=Positive, size=Small16pxsuggest spacing/size/2xsmall
status=Positive, size=Medium20pxsuggest spacing/size/xsmall

icons-positive.overflow2

status=Positive, size=Smallcliplayout
status=Positive, size=Mediumcliplayout

icons-positive.position2

status=Positive, size=Smallrelativelayout
status=Positive, size=Mediumrelativelayout

icons-positive.width2

status=Positive, size=Small16pxsuggest spacing/size/2xsmall
status=Positive, size=Medium20pxsuggest spacing/size/xsmall

icons-warning.flex-shrink2

status=Warning, size=Small0layout
status=Warning, size=Medium0layout

icons-warning.height2

status=Warning, size=Small16pxsuggest spacing/size/2xsmall
status=Warning, size=Medium20pxsuggest spacing/size/xsmall

icons-warning.overflow2

status=Warning, size=Smallcliplayout
status=Warning, size=Mediumcliplayout

icons-warning.position2

status=Warning, size=Smallrelativelayout
status=Warning, size=Mediumrelativelayout

icons-warning.width2

status=Warning, size=Small16pxsuggest spacing/size/2xsmall
status=Warning, size=Medium20pxsuggest spacing/size/xsmall

label.gap4

status=Default, size=Medium8pxspacing/gap/small
status=Negative, size=Medium8pxspacing/gap/small
status=Positive, size=Medium8pxspacing/gap/small
status=Warning, size=Medium8pxspacing/gap/small

label.padding4

status=Default, size=Medium0pxspacing/gap/none
status=Negative, size=Medium0pxspacing/gap/none
status=Positive, size=Medium0pxspacing/gap/none
status=Warning, size=Medium0pxspacing/gap/none

label.padding-bottom4

status=Default, size=Small2pxspacing/gap/3xsmall
status=Negative, size=Small2pxspacing/gap/3xsmall
status=Positive, size=Small2pxspacing/gap/3xsmall
status=Warning, size=Small2pxspacing/gap/3xsmall

root.gap8

status=Default, size=Small4pxspacing/gap/2xsmall
status=Negative, size=Small4pxspacing/gap/2xsmall
status=Positive, size=Small4pxspacing/gap/2xsmall
status=Warning, size=Small4pxspacing/gap/2xsmall
status=Default, size=Medium8pxspacing/gap/small
status=Negative, size=Medium8pxspacing/gap/small
status=Positive, size=Medium8pxspacing/gap/small
status=Warning, size=Medium8pxspacing/gap/small

root.opacity6

status=Negative, size=Small1opacity/solid
status=Positive, size=Small1opacity/solid
status=Warning, size=Small1opacity/solid
status=Negative, size=Medium1opacity/solid
status=Positive, size=Medium1opacity/solid
status=Warning, size=Medium1opacity/solid

text.font-size8

status=Default, size=Small12pxtypography/label/font-size
status=Negative, size=Small12pxtypography/label/font-size
status=Positive, size=Small12pxtypography/label/font-size
status=Warning, size=Small12pxtypography/label/font-size
status=Default, size=Medium16pxtypography/body/font-size
status=Negative, size=Medium16pxtypography/body/font-size
status=Positive, size=Medium16pxtypography/body/font-size
status=Warning, size=Medium16pxtypography/body/font-size

text.font-weight8

status=Default, size=Small500typography/label/font-weight/medium
status=Negative, size=Small500typography/label/font-weight/medium
status=Positive, size=Small500typography/label/font-weight/medium
status=Warning, size=Small500typography/label/font-weight/medium
status=Default, size=Medium500typography/body/font-weight/medium
status=Negative, size=Medium500typography/body/font-weight/medium
status=Positive, size=Medium500typography/body/font-weight/medium
status=Warning, size=Medium500typography/body/font-weight/medium

text.letter-spacing8

status=Default, size=Small0pxtypography/label/letter-spacing
status=Negative, size=Small0pxtypography/label/letter-spacing
status=Positive, size=Small0pxtypography/label/letter-spacing
status=Warning, size=Small0pxtypography/label/letter-spacing
status=Default, size=Medium0pxtypography/body/letter-spacing
status=Negative, size=Medium0pxtypography/body/letter-spacing
status=Positive, size=Medium0pxtypography/body/letter-spacing
status=Warning, size=Medium0pxtypography/body/letter-spacing

text.line-height8

status=Default, size=Small14pxtypography/label/line-height
status=Negative, size=Small14pxtypography/label/line-height
status=Positive, size=Small14pxtypography/label/line-height
status=Warning, size=Small14pxtypography/label/line-height
status=Default, size=Medium22pxtypography/body/line-height
status=Negative, size=Medium22pxtypography/body/line-height
status=Positive, size=Medium22pxtypography/body/line-height
status=Warning, size=Medium22pxtypography/body/line-height

union.inset8

status=Default, size=Small12.5%layout
status=Negative, size=Small3.9% 3.91% 4.43% 4.43%layout
status=Positive, size=Small3.9% 4.43% 4.43% 3.91%layout
status=Warning, size=Small8.04% 6.89% 12.76% 5.32%layout
status=Default, size=Medium12.5%layout
status=Negative, size=Medium3.9% 3.91% 4.43% 4.42%layout
status=Positive, size=Medium3.9% 4.43% 4.43% 3.91%layout
status=Warning, size=Medium8.04% 6.88% 12.76% 5.32%layout
component

Input

A 56px text field with a floating label, an optional lock icon, a line of help text and an error state.

Figma 240:273 contract: review guidance: agreed runceanu.com .dsinput__boxakount.ing .ak-field__box 14 variants
configurationEmptyFilled
selectedfalsetrue
errorfalsetrue
statesDefaultHoverDisabled
Partsrootoutlinelefticons-lockunioncontentlabelsupportive-texttextrighticons-alarmfocus-ring

When to use

  • Any single line of text: email, name, an amount, search.

When not to use

  • Picking from a known list. That's Chip or Toggle, free text just invites typos.
  • Several lines of text. There's no textarea in the kit yet.

Behaviour

Four things change it:

  • configuration: Empty shows the label where you'll type. Filled moves it up and shows the value.
  • selected: it has focus, so the focus ring shows.
  • error: the outline, label, help text and icons go red, and the alarm icon shows up on the right.
  • state: Default, Hover and Disabled.

Check what people typed when they leave the field or submit, not on every key.

Accessibility

  • Element: a real <input> with a <label for>. The floating label is the label. Never a placeholder.
  • Supportive Text: connected with aria-describedby.
  • Error: aria-invalid="true", and the help text says how to fix it.
  • Colour: an error shows as the alarm icon and the message, not only red.
  • Focus: the ring shows on :focus-visible and when you arrive by keyboard. Never remove the outline without the ring.
  • Lock Icon: just decoration, unless it means read-only. If it does, set readonly and say so in the help text.

Content

Label: a noun, sentence case ("Email address"). Help text: one line. Before an error it's a hint, after it it's the fix ("Use at least 8 characters", not "Invalid input").

Never changes 22

PartPropertyValueToken
rootalign-itemscenterlayout
rootdisplayflexlayout
rootpositionrelativelayout
rootgap8pxspacing/gap/small
rootheight56pxspacing/size/large
rootpadding-left12pxspacing/gap/small-medium
rootpadding-right12pxspacing/gap/small-medium
rootpadding-top0pxspacing/gap/none
rootpadding-bottom0pxspacing/gap/none
rootborder-radius12pxspacing/radius/medium
rootwidth208pxjust the Figma frame size
outlineborder-sidesalllayout
outlinepositionabsolutelayout
outlineinset0layout
outlineborder-width1pxspacing/outline/small
outlineopacity1opacity/solid
outlineborder-radius12pxspacing/radius/medium
leftalign-itemscenterlayout
leftdisplayflexlayout
leftflex1 0 0layout
leftpositionrelativelayout
leftgap8pxsuggest spacing/gap/small

Changes by variant 172

content.align-items4

state=Default, configuration=Empty, selected=False, error=Falseflex-startlayout
state=Default, configuration=Empty, selected=True, error=Trueflex-startlayout
state=Default, configuration=Filled, selected=True, error=Trueflex-startlayout
state=Default, configuration=Filled, selected=False, error=Falseflex-startlayout

content.display4

state=Default, configuration=Empty, selected=False, error=Falseflexlayout
state=Default, configuration=Empty, selected=True, error=Trueflexlayout
state=Default, configuration=Filled, selected=True, error=Trueflexlayout
state=Default, configuration=Filled, selected=False, error=Falseflexlayout

content.flex-direction4

state=Default, configuration=Empty, selected=False, error=Falsecolumnlayout
state=Default, configuration=Empty, selected=True, error=Truecolumnlayout
state=Default, configuration=Filled, selected=True, error=Truecolumnlayout
state=Default, configuration=Filled, selected=False, error=Falsecolumnlayout

content.flex-shrink4

state=Default, configuration=Empty, selected=False, error=False0layout
state=Default, configuration=Empty, selected=True, error=True0layout
state=Default, configuration=Filled, selected=True, error=True0layout
state=Default, configuration=Filled, selected=False, error=False0layout

content.font-family2

state=Default, configuration=Empty, selected=True, error=True'General Sans Variable'font-family/base
state=Default, configuration=Filled, selected=True, error=True'General Sans Variable'font-family/base

content.position4

state=Default, configuration=Empty, selected=False, error=Falserelativelayout
state=Default, configuration=Empty, selected=True, error=Truerelativelayout
state=Default, configuration=Filled, selected=True, error=Truerelativelayout
state=Default, configuration=Filled, selected=False, error=Falserelativelayout

content.text-align2

state=Default, configuration=Empty, selected=True, error=Truecenterlayout
state=Default, configuration=Filled, selected=True, error=Truecenterlayout

content.white-space2

state=Default, configuration=Empty, selected=True, error=Truenowraplayout
state=Default, configuration=Filled, selected=True, error=Truenowraplayout

focus-ring.border-color2

state=Default, configuration=Empty, selected=True, error=True#00d669input/negative/focus/focus-ring
state=Default, configuration=Filled, selected=True, error=True#00d669input/negative/focus/focus-ring

focus-ring.border-radius2

state=Default, configuration=Empty, selected=True, error=True16pxspacing/radius/large
state=Default, configuration=Filled, selected=True, error=True16pxspacing/radius/large

focus-ring.border-sides2

state=Default, configuration=Empty, selected=True, error=Truealllayout
state=Default, configuration=Filled, selected=True, error=Truealllayout

focus-ring.border-width2

state=Default, configuration=Empty, selected=True, error=True2pxspacing/outline/medium
state=Default, configuration=Filled, selected=True, error=True2pxspacing/outline/medium

focus-ring.inset2

state=Default, configuration=Empty, selected=True, error=True-4pxlayout
state=Default, configuration=Filled, selected=True, error=True-4pxlayout

focus-ring.position2

state=Default, configuration=Empty, selected=True, error=Trueabsolutelayout
state=Default, configuration=Filled, selected=True, error=Trueabsolutelayout

icons-alarm.flex-shrink2

state=Default, configuration=Empty, selected=True, error=True0layout
state=Default, configuration=Filled, selected=True, error=True0layout

icons-alarm.height2

state=Default, configuration=Empty, selected=True, error=True24pxsuggest spacing/size/small
state=Default, configuration=Filled, selected=True, error=True24pxsuggest spacing/size/small

icons-alarm.overflow2

state=Default, configuration=Empty, selected=True, error=Truecliplayout
state=Default, configuration=Filled, selected=True, error=Truecliplayout

icons-alarm.position2

state=Default, configuration=Empty, selected=True, error=Truerelativelayout
state=Default, configuration=Filled, selected=True, error=Truerelativelayout

icons-alarm.width2

state=Default, configuration=Empty, selected=True, error=True24pxsuggest spacing/size/small
state=Default, configuration=Filled, selected=True, error=True24pxsuggest spacing/size/small

icons-lock.flex-shrink4

state=Default, configuration=Empty, selected=False, error=False0layout
state=Default, configuration=Empty, selected=True, error=True0layout
state=Default, configuration=Filled, selected=True, error=True0layout
state=Default, configuration=Filled, selected=False, error=False0layout

icons-lock.height4

state=Default, configuration=Empty, selected=False, error=False20pxsuggest spacing/size/xsmall
state=Default, configuration=Empty, selected=True, error=True20pxsuggest spacing/size/xsmall
state=Default, configuration=Filled, selected=True, error=True20pxsuggest spacing/size/xsmall
state=Default, configuration=Filled, selected=False, error=False20pxsuggest spacing/size/xsmall

icons-lock.overflow4

state=Default, configuration=Empty, selected=False, error=Falsecliplayout
state=Default, configuration=Empty, selected=True, error=Truecliplayout
state=Default, configuration=Filled, selected=True, error=Truecliplayout
state=Default, configuration=Filled, selected=False, error=Falsecliplayout

icons-lock.position4

state=Default, configuration=Empty, selected=False, error=Falserelativelayout
state=Default, configuration=Empty, selected=True, error=Truerelativelayout
state=Default, configuration=Filled, selected=True, error=Truerelativelayout
state=Default, configuration=Filled, selected=False, error=Falserelativelayout

icons-lock.width4

state=Default, configuration=Empty, selected=False, error=False20pxsuggest spacing/size/xsmall
state=Default, configuration=Empty, selected=True, error=True20pxsuggest spacing/size/xsmall
state=Default, configuration=Filled, selected=True, error=True20pxsuggest spacing/size/xsmall
state=Default, configuration=Filled, selected=False, error=False20pxsuggest spacing/size/xsmall

label.color3

state=Default, configuration=Empty, selected=False, error=False#999input/regular/default/label
state=Default, configuration=Empty, selected=True, error=True#e93120input/negative/focus/label
state=Default, configuration=Filled, selected=True, error=True#e93120input/negative/focus/label

label.flex-shrink3

state=Default, configuration=Empty, selected=False, error=False0layout
state=Default, configuration=Empty, selected=True, error=True0layout
state=Default, configuration=Filled, selected=True, error=True0layout

label.font-family1

state=Default, configuration=Empty, selected=False, error=False'General Sans Variable'font-family/base

label.font-size3

state=Default, configuration=Empty, selected=False, error=False16pxtypography/body/font-size
state=Default, configuration=Empty, selected=True, error=True10pxtypography/placeholder/font-size
state=Default, configuration=Filled, selected=True, error=True10pxtypography/placeholder/font-size

label.font-weight3

state=Default, configuration=Empty, selected=False, error=False400typography/body/font-weight/regular
state=Default, configuration=Empty, selected=True, error=True400typography/label/font-weight/regular
state=Default, configuration=Filled, selected=True, error=True400typography/label/font-weight/regular

label.letter-spacing3

state=Default, configuration=Empty, selected=False, error=False0pxtypography/body/letter-spacing
state=Default, configuration=Empty, selected=True, error=True0pxtypography/placeholder/letter-spacing
state=Default, configuration=Filled, selected=True, error=True0pxtypography/placeholder/letter-spacing

label.line-height3

state=Default, configuration=Empty, selected=False, error=False22pxtypography/body/line-height
state=Default, configuration=Empty, selected=True, error=True12pxtypography/placeholder/line-height
state=Default, configuration=Filled, selected=True, error=True12pxtypography/placeholder/line-height

label.position3

state=Default, configuration=Empty, selected=False, error=Falserelativelayout
state=Default, configuration=Empty, selected=True, error=Truerelativelayout
state=Default, configuration=Filled, selected=True, error=Truerelativelayout

label.text-align1

state=Default, configuration=Empty, selected=False, error=Falsecenterlayout

label.white-space1

state=Default, configuration=Empty, selected=False, error=Falsenowraplayout

outline.background14

state=Default, configuration=Empty, selected=False, error=False#060805input/regular/default/background
state=Hover, configuration=Empty, selected=False, error=False#060805input/regular/default/background
state=Default, configuration=Empty, selected=True, error=False#060805input/regular/default/background
state=Disabled, configuration=Empty, selected=False, error=False#060805input/regular/default/background
state=Default, configuration=Empty, selected=False, error=True#060805input/regular/default/background
state=Default, configuration=Filled, selected=False, error=True#060805input/regular/default/background
state=Default, configuration=Empty, selected=True, error=True#060805input/negative/focus/background
state=Default, configuration=Filled, selected=True, error=True#060805input/negative/focus/background
state=Hover, configuration=Empty, selected=False, error=True#060805input/regular/default/background
state=Hover, configuration=Filled, selected=False, error=True#060805input/regular/default/background
state=Default, configuration=Filled, selected=False, error=False#060805input/regular/default/background
state=Disabled, configuration=Filled, selected=False, error=False#060805input/regular/default/background
state=Default, configuration=Filled, selected=True, error=False#060805input/regular/default/background
state=Hover, configuration=Filled, selected=False, error=False#060805input/regular/default/background

outline.border-color14

state=Default, configuration=Empty, selected=False, error=False#555input/regular/default/outline
state=Hover, configuration=Empty, selected=False, error=False#555input/regular/default/outline
state=Default, configuration=Empty, selected=True, error=False#555input/regular/default/outline
state=Disabled, configuration=Empty, selected=False, error=False#555input/regular/default/outline
state=Default, configuration=Empty, selected=False, error=True#555input/regular/default/outline
state=Default, configuration=Filled, selected=False, error=True#555input/regular/default/outline
state=Default, configuration=Empty, selected=True, error=True#f2705finput/negative/focus/outline
state=Default, configuration=Filled, selected=True, error=True#f2705finput/negative/focus/outline
state=Hover, configuration=Empty, selected=False, error=True#555input/regular/default/outline
state=Hover, configuration=Filled, selected=False, error=True#555input/regular/default/outline
state=Default, configuration=Filled, selected=False, error=False#555input/regular/default/outline
state=Disabled, configuration=Filled, selected=False, error=False#555input/regular/default/outline
state=Default, configuration=Filled, selected=True, error=False#555input/regular/default/outline
state=Hover, configuration=Filled, selected=False, error=False#555input/regular/default/outline

right.align-items2

state=Default, configuration=Empty, selected=True, error=Truecenterlayout
state=Default, configuration=Filled, selected=True, error=Truecenterlayout

right.display2

state=Default, configuration=Empty, selected=True, error=Trueflexlayout
state=Default, configuration=Filled, selected=True, error=Trueflexlayout

right.flex-shrink2

state=Default, configuration=Empty, selected=True, error=True0layout
state=Default, configuration=Filled, selected=True, error=True0layout

right.position2

state=Default, configuration=Empty, selected=True, error=Truerelativelayout
state=Default, configuration=Filled, selected=True, error=Truerelativelayout

supportive-text.align-items3

state=Default, configuration=Empty, selected=False, error=Falsecenterlayout
state=Default, configuration=Empty, selected=True, error=Truecenterlayout
state=Default, configuration=Filled, selected=True, error=Truecenterlayout

supportive-text.display3

state=Default, configuration=Empty, selected=False, error=Falseflexlayout
state=Default, configuration=Empty, selected=True, error=Trueflexlayout
state=Default, configuration=Filled, selected=True, error=Trueflexlayout

supportive-text.justify-content3

state=Default, configuration=Empty, selected=False, error=Falsecenterlayout
state=Default, configuration=Empty, selected=True, error=Truecenterlayout
state=Default, configuration=Filled, selected=True, error=Truecenterlayout

supportive-text.position3

state=Default, configuration=Empty, selected=False, error=Falseabsolutelayout
state=Default, configuration=Empty, selected=True, error=Trueabsolutelayout
state=Default, configuration=Filled, selected=True, error=Trueabsolutelayout

text.color3

state=Default, configuration=Empty, selected=False, error=False#999input/regular/default/supportive
state=Default, configuration=Empty, selected=True, error=True#edededinput/negative/focus/value
state=Default, configuration=Filled, selected=True, error=True#edededinput/negative/focus/value

text.flex-shrink3

state=Default, configuration=Empty, selected=False, error=False0layout
state=Default, configuration=Empty, selected=True, error=True0layout
state=Default, configuration=Filled, selected=True, error=True0layout

text.font-family1

state=Default, configuration=Empty, selected=False, error=False'General Sans Variable'font-family/base

text.font-size3

state=Default, configuration=Empty, selected=False, error=False10pxtypography/placeholder/font-size
state=Default, configuration=Empty, selected=True, error=True16pxtypography/body/font-size
state=Default, configuration=Filled, selected=True, error=True16pxtypography/body/font-size

text.font-weight3

state=Default, configuration=Empty, selected=False, error=False500typography/label/font-weight/medium
state=Default, configuration=Empty, selected=True, error=True400typography/body/font-weight/regular
state=Default, configuration=Filled, selected=True, error=True400typography/body/font-weight/regular

text.letter-spacing3

state=Default, configuration=Empty, selected=False, error=False0pxtypography/placeholder/letter-spacing
state=Default, configuration=Empty, selected=True, error=True0pxtypography/body/letter-spacing
state=Default, configuration=Filled, selected=True, error=True0pxtypography/body/letter-spacing

text.line-height3

state=Default, configuration=Empty, selected=False, error=False12pxtypography/placeholder/line-height
state=Default, configuration=Empty, selected=True, error=True22pxtypography/body/line-height
state=Default, configuration=Filled, selected=True, error=True22pxtypography/body/line-height

text.position3

state=Default, configuration=Empty, selected=False, error=Falserelativelayout
state=Default, configuration=Empty, selected=True, error=Truerelativelayout
state=Default, configuration=Filled, selected=True, error=Truerelativelayout

text.text-align1

state=Default, configuration=Empty, selected=False, error=Falsecenterlayout

text.white-space1

state=Default, configuration=Empty, selected=False, error=Falsenowraplayout

union.inset4

state=Default, configuration=Empty, selected=False, error=False8.33% 16.67%layout
state=Default, configuration=Empty, selected=True, error=True8.33% 16.67%layout
state=Default, configuration=Filled, selected=True, error=True8.33% 16.67%layout
state=Default, configuration=Filled, selected=False, error=False8.33% 16.67%layout

union.position4

state=Default, configuration=Empty, selected=False, error=Falseabsolutelayout
state=Default, configuration=Empty, selected=True, error=Trueabsolutelayout
state=Default, configuration=Filled, selected=True, error=Trueabsolutelayout
state=Default, configuration=Filled, selected=False, error=Falseabsolutelayout
effect

Lock frame effect

An 8px blur over a locked project's thumbnail, the blurred view behind the lock.

Figma 224:2 contract: review guidance: agreed not built yet
Partsroot
root
Whatever the style is applied to: the frame of a locked project thumbnail, the blurred view behind the lock.

When to use

  • On the thumbnail of a locked project (NDA, password), together with the lock icon.

When not to use

  • Loading or disabled states. Blur says "hidden", not "wait".

Behaviour

filter: blur(8px) blurs the element's own content. Thumb is the opposite: it blurs what's behind it. In Figma the blur is tied to spacing/base-8, which isn't in tokens.css, so the code uses --effect-lock-frame instead.

Accessibility

  • Name: say it's locked in words ("Locked case study"). Blur and an icon aren't enough.
  • Content: blurred text is still in the page for anyone who looks. Don't blur confidential copy, show a placeholder.

Never changes 1

PartPropertyValueToken
rootfilterblur(8px)effect/lock-frame
effect

Menu effect

Frosted glass behind the main nav and the case-study info cards, a 12px backdrop blur.

Figma 29:5 contract: draft guidance: agreed not built yet
  • Pending: The 12px comes from how the nav uses it, not from the "Menu" style itself (Dev Mode only gave back the swatch for node 29:5). Worth checking in Figma's effect panel. If the real size is different, update `--effect-menu` and this value.
Partsroot
root
The frosted surface behind the main nav. In Figma it's the effect style called "Menu".

When to use

  • Things that float over content and have to stay readable while it scrolls underneath: the nav, the hero info cards.

When not to use

  • Project thumbnails, they have their own (Thumb effect).
  • On top of another frosted surface. Two blurs just turn to mud.

Behaviour

backdrop-filter: blur(12px), and a 24px version for the bigger case-study surfaces. I took the 12px from how it's used, I haven't read it from the style itself yet (it's in "Not right yet").

Accessibility

  • Contrast: check text against the busiest thing that can scroll under it, not a flat colour.
  • Fallback: where backdrop-filter doesn't work, use a solid surface. Never a see-through one you can't read.

Never changes 1

PartPropertyValueToken
rootbackdrop-filterblur(12px)effect/menu
effect

Paper effect

The sheet of dots behind runceanu.com's hero. It reacts to the cursor, the buttons and clicks, and never moves by itself.

runceanu-portfolio/src/components/HeroBackdrop.jsx contract: review guidance: agreed runceanu.com
Partssheetdotlensripplepen
sheet
A canvas of dots behind the hero. A CSS mask shapes it: on runceanu.com that's a 1104px circle centred on the hero text (a 552px radial gradient, solid to 40%, gone by 92%). It's sized so the dot grid lines up with the content, not the container. When nothing's happening it costs one still frame, and with reduced motion you get the still sheet and none of what's below.
dot
One point on the grid. It never moves by itself, it only reacts (to the lens, the ripple, the pen). The paper should never twinkle.
lens
The dome every behaviour shares. It has three sources: the cursor (the magnifier), the button halo (hover a hero button and a lens rises under its centre, as if the button presses into the paper), and press ink (press down and the sheet dents, fast going in and slow coming back). Each dot looks at all three and the strongest wins, so lenses never add up. Dots inside grow and get pushed outward. They never multiply and never change shape.
ripple
A ring (a soft band, about 1.8s) that crosses the sheet from the middle. It's triggered by the availability dot's own pulse, every second beat: so every 8s, in step with it, never on a timer of its own. It only runs while the hero is on screen.
pen
Every 7 to 8 seconds the pen sketches one kit component in 2px lines (colour `non-interactive/foreground/secondary` at the ink opacity). It draws line by line (about 1.6s), holds (about 3s), then fades. The rule of the grid: outer shapes follow the dot rows and columns exactly, start on a dot, measure in whole cells, and round their corners between dots. Small inner details (a check, an x, a knob, bars, a caret) keep their natural shape. Every point of a line moves with the lens, so the ink bulges like the dots do. One sketch at a time.

When to use

  • Behind the home hero, and only there. It's the site's signature, and using it twice waters it down.

When not to use

  • Behind dense content or forms. At small sizes the dots fight with the text.

Behaviour

The dots only ever react, through the lens, the ripple and the pen described in the parts. They never animate on their own. Everything snaps to the 16px grid. When nothing happens it's one still frame, and it only runs while the hero is on screen.

Accessibility

  • Decorative: the canvas is aria-hidden="true" and never takes focus.
  • Motion: with prefers-reduced-motion you get the still sheet, and none of the movement.

Never changes 13

PartPropertyValueToken
sheetpitch16pxspacing/gap/medium
sheetdot-opacity0.16opacity/soft
sheetbackground#060805non-interactive/background/primary
dotradius1pxon purpose: Dot geometry, tuned to the 16px pitch; not a reusable decision.
lensradius210pxon purpose: Motion tuning parameter of the lens field.
lenspush9pxon purpose: Motion tuning parameter of the lens field.
lensaccent#00d669actions/primary/default/background
lenscursorradius 210px, power 1.0on purpose: Motion tuning parameter (radius and falloff power).
lenshaloradius 240px, power 1.3on purpose: Motion tuning parameter (radius and falloff power).
lenspressradius 330px, power 1.7on purpose: Motion tuning parameter (radius and falloff power).
penink-opacity0.32opacity/mild
penstroke-width2pxspacing/outline/medium
pencadence7-8s between sketcheson purpose: Timing of the sketch loop; a motion token group does not exist yet.
component

PillButton

A 48px button with an icon in front of the label. My main call to action.

Figma 20:14 contract: review guidance: agreed akount.ing .ak-btn 20 variants
typeBorderlessPrimarySecondaryTertiary
statesDefaultHoverPressedFocusDisabled
Partsrooticons-arrow-leftunionlabelfocus-ringbackground

When to use

  • When an icon helps people get it faster: a back arrow, an external link, a download.
  • The calls to action in heroes and sections on runceanu.com.

When not to use

  • When the icon is just decoration. Drop it and use Button.
  • When there's no room for the label. Use IconButton, never a PillButton with its label hidden.

Behaviour

Same types and states as Button: Primary, Secondary, Tertiary, Borderless. States come from the browser, not from props. The icon sits in a 20px slot (icons-arrow-left in Figma) and takes the label's colour.

Accessibility

  • Element: <button>, or <a> when it takes you somewhere. A pill that navigates is still a link.
  • Name: the label. The icon is aria-hidden="true".
  • Keyboard: Enter, and Space for buttons.
  • Focus: focus-ring, on :focus-visible.

Content

A short verb phrase, sentence case. The icon has to match the words: an arrow pointing left only on "Back".

Never changes 23

PartPropertyValueToken
rootjustify-contentcenterlayout
rootalign-itemscenterlayout
rootdisplayflexlayout
rootpositionrelativelayout
rootgap8pxspacing/gap/small
rootheight48pxspacing/size/medium-large
rootborder-radius10000pxspacing/radius/full
icons-arrow-leftoverflowcliplayout
icons-arrow-leftflex-shrink0layout
icons-arrow-leftpositionrelativelayout
icons-arrow-leftwidth20pxsuggest spacing/size/xsmall
icons-arrow-leftheight20pxsuggest spacing/size/xsmall
unionpositionabsolutelayout
unioninset20.84% 16.66% 20.83% 18.4%layout
labelflex-shrink0layout
labelwhite-spacenowraplayout
labeltext-aligncenterlayout
labelpositionrelativelayout
labelfont-family'General Sans Variable'font-family/base
labelfont-weight500typography/body/font-weight/medium
labelline-height22pxtypography/body/line-height
labelfont-size16pxtypography/body/font-size
labelletter-spacing0pxtypography/body/letter-spacing

Changes by variant 185

background.background9

type=Tertiary, state=Hover#060805actions/tertiary/hover/background
type=Tertiary, state=Pressed#454545actions/tertiary/pressed/background
type=Borderless, state=Hover#060805actions/tertiary/hover/background
type=Borderless, state=Pressed#454545actions/tertiary/pressed/background
type=Secondary, state=Default#3a3a3aactions/secondary/regular/default/background
type=Secondary, state=Hover#747573actions/secondary/regular/hover/background
type=Secondary, state=Pressed#999actions/secondary/regular/pressed/background
type=Secondary, state=Disabled#3a3a3aactions/secondary/regular/disabled/background
type=Secondary, state=Focus#3a3a3aactions/secondary/regular/focus/background

background.border-color5

type=Secondary, state=Default#edededactions/secondary/regular/default/outline
type=Secondary, state=Hover#edededactions/secondary/regular/hover/outline
type=Secondary, state=Pressed#edededactions/secondary/regular/pressed/outline
type=Secondary, state=Disabled#edededactions/secondary/regular/disabled/outline
type=Secondary, state=Focus#edededactions/secondary/regular/focus/outline

background.border-radius7

type=Tertiary, state=Hover10000pxspacing/radius/full
type=Tertiary, state=Pressed10000pxspacing/radius/full
type=Secondary, state=Default10000pxspacing/radius/full
type=Secondary, state=Hover10000pxspacing/radius/full
type=Secondary, state=Pressed10000pxspacing/radius/full
type=Secondary, state=Disabled10000pxspacing/radius/full
type=Secondary, state=Focus10000pxspacing/radius/full

background.border-sides5

type=Secondary, state=Defaultleft toplayout
type=Secondary, state=Hoverleft toplayout
type=Secondary, state=Pressedleft toplayout
type=Secondary, state=Disabledleft toplayout
type=Secondary, state=Focusleft toplayout

background.inset9

type=Tertiary, state=Hover0layout
type=Tertiary, state=Pressed0layout
type=Borderless, state=Hover0layout
type=Borderless, state=Pressed0layout
type=Secondary, state=Default0layout
type=Secondary, state=Hover0layout
type=Secondary, state=Pressed0layout
type=Secondary, state=Disabled0layout
type=Secondary, state=Focus0layout

background.opacity9

type=Tertiary, state=Hover0.32opacity/mild
type=Tertiary, state=Pressed0.32opacity/mild
type=Borderless, state=Hover0.32opacity/mild
type=Borderless, state=Pressed0.32opacity/mild
type=Secondary, state=Default0.24opacity/gentle
type=Secondary, state=Hover0.32opacity/mild
type=Secondary, state=Pressed0.32opacity/mild
type=Secondary, state=Disabled0.32opacity/mild
type=Secondary, state=Focus0.24opacity/gentle

background.position9

type=Tertiary, state=Hoverabsolutelayout
type=Tertiary, state=Pressedabsolutelayout
type=Borderless, state=Hoverabsolutelayout
type=Borderless, state=Pressedabsolutelayout
type=Secondary, state=Defaultabsolutelayout
type=Secondary, state=Hoverabsolutelayout
type=Secondary, state=Pressedabsolutelayout
type=Secondary, state=Disabledabsolutelayout
type=Secondary, state=Focusabsolutelayout

focus-ring.border-color4

type=Primary, state=Focus#b6ffdaactions/primary/focus/focus-ring
type=Tertiary, state=Focus#999actions/secondary/regular/focus/focus-ring
type=Borderless, state=Focus#999actions/secondary/regular/focus/focus-ring
type=Secondary, state=Focus#999actions/secondary/regular/focus/focus-ring

focus-ring.border-radius3

type=Primary, state=Focus10000pxspacing/radius/full
type=Tertiary, state=Focus10000pxspacing/radius/full
type=Secondary, state=Focus10000pxspacing/radius/full

focus-ring.border-sides4

type=Primary, state=Focusalllayout
type=Tertiary, state=Focusalllayout
type=Borderless, state=Focusalllayout
type=Secondary, state=Focusalllayout

focus-ring.border-width4

type=Primary, state=Focus2pxspacing/outline/medium
type=Tertiary, state=Focus2pxspacing/outline/medium
type=Borderless, state=Focus2pxspacing/outline/medium
type=Secondary, state=Focus2pxspacing/outline/medium

focus-ring.inset4

type=Primary, state=Focus-5px -4px -4px -5pxlayout
type=Tertiary, state=Focus-4pxlayout
type=Borderless, state=Focus-4pxlayout
type=Secondary, state=Focus-4pxlayout

focus-ring.position4

type=Primary, state=Focusabsolutelayout
type=Tertiary, state=Focusabsolutelayout
type=Borderless, state=Focusabsolutelayout
type=Secondary, state=Focusabsolutelayout

label.color20

type=Primary, state=Default#060805actions/primary/default/label
type=Primary, state=Hover#060805actions/primary/hover/label
type=Primary, state=Focus#060805actions/primary/focus/label
type=Primary, state=Pressed#060805actions/primary/pressed/label
type=Primary, state=Disabled#060805actions/primary/disabled/label
type=Tertiary, state=Default#d3d9d5actions/tertiary/default/label
type=Tertiary, state=Hover#edededactions/tertiary/hover/label
type=Tertiary, state=Pressed#d3d9d5actions/tertiary/pressed/label
type=Tertiary, state=Disabled#d3d9d5actions/tertiary/disabled/label
type=Tertiary, state=Focus#d3d9d5actions/tertiary/focus/label
type=Borderless, state=Default#d3d9d5actions/tertiary/default/label
type=Borderless, state=Hover#edededactions/tertiary/hover/label
type=Borderless, state=Pressed#d3d9d5actions/tertiary/pressed/label
type=Borderless, state=Disabled#d3d9d5actions/tertiary/disabled/label
type=Borderless, state=Focus#d3d9d5actions/tertiary/focus/label
type=Secondary, state=Default#d3d9d5actions/secondary/regular/default/label
type=Secondary, state=Hover#edededactions/secondary/regular/hover/label
type=Secondary, state=Pressed#d3d9d5actions/secondary/regular/pressed/label
type=Secondary, state=Disabled#d3d9d5actions/secondary/regular/disabled/label
type=Secondary, state=Focus#d3d9d5actions/secondary/regular/focus/label

root.background5

type=Primary, state=Default#00d669actions/primary/default/background
type=Primary, state=Hover#00b450actions/primary/hover/background
type=Primary, state=Focus#00d669actions/primary/focus/background
type=Primary, state=Pressed#00913aactions/primary/pressed/background
type=Primary, state=Disabled#00d669actions/primary/disabled/background

root.border-color5

type=Primary, state=Defaultrgba(237,237,237,0.64)actions/primary/default/outline
type=Primary, state=Hoverrgba(237,237,237,0.64)actions/primary/hover/outline
type=Primary, state=Focusrgba(237,237,237,0.64)actions/primary/focus/outline
type=Primary, state=Pressedrgba(237,237,237,0.64)actions/primary/pressed/outline
type=Primary, state=Disabledrgba(237,237,237,0.64)actions/primary/disabled/outline

root.border-sides5

type=Primary, state=Defaultleft toplayout
type=Primary, state=Hoverleft toplayout
type=Primary, state=Focusleft toplayout
type=Primary, state=Pressedleft toplayout
type=Primary, state=Disabledleft toplayout

root.border-top-width5

type=Primary, state=Default1pxspacing/outline/small
type=Primary, state=Hover1pxspacing/outline/small
type=Primary, state=Focus1pxspacing/outline/small
type=Primary, state=Pressed1pxspacing/outline/small
type=Primary, state=Disabled1pxspacing/outline/small

root.opacity4

type=Primary, state=Disabled0.24opacity/gentle
type=Tertiary, state=Disabled0.24opacity/gentle
type=Borderless, state=Disabled0.24opacity/gentle
type=Secondary, state=Disabled0.24opacity/gentle

root.padding5

type=Borderless, state=Default0pxspacing/gap/none
type=Borderless, state=Hover0pxspacing/gap/none
type=Borderless, state=Pressed0pxspacing/gap/none
type=Borderless, state=Disabled0pxspacing/gap/none
type=Borderless, state=Focus0pxspacing/gap/none

root.padding-bottom15

type=Primary, state=Default0pxspacing/gap/none
type=Primary, state=Hover0pxspacing/gap/none
type=Primary, state=Focus0pxspacing/gap/none
type=Primary, state=Pressed0pxspacing/gap/none
type=Primary, state=Disabled0pxspacing/gap/none
type=Tertiary, state=Default0pxspacing/gap/none
type=Tertiary, state=Hover0pxspacing/gap/none
type=Tertiary, state=Pressed0pxspacing/gap/none
type=Tertiary, state=Disabled0pxspacing/gap/none
type=Tertiary, state=Focus0pxspacing/gap/none
type=Secondary, state=Default0pxspacing/gap/none
type=Secondary, state=Hover0pxspacing/gap/none
type=Secondary, state=Pressed0pxspacing/gap/none
type=Secondary, state=Disabled0pxspacing/gap/none
type=Secondary, state=Focus0pxspacing/gap/none

root.padding-left15

type=Primary, state=Default20pxspacing/gap/medium-large
type=Primary, state=Hover20pxspacing/gap/medium-large
type=Primary, state=Focus20pxspacing/gap/medium-large
type=Primary, state=Pressed20pxspacing/gap/medium-large
type=Primary, state=Disabled20pxspacing/gap/medium-large
type=Tertiary, state=Default20pxspacing/gap/medium-large
type=Tertiary, state=Hover20pxspacing/gap/medium-large
type=Tertiary, state=Pressed20pxspacing/gap/medium-large
type=Tertiary, state=Disabled20pxspacing/gap/medium-large
type=Tertiary, state=Focus20pxspacing/gap/medium-large
type=Secondary, state=Default20pxspacing/gap/medium-large
type=Secondary, state=Hover20pxspacing/gap/medium-large
type=Secondary, state=Pressed20pxspacing/gap/medium-large
type=Secondary, state=Disabled20pxspacing/gap/medium-large
type=Secondary, state=Focus20pxspacing/gap/medium-large

root.padding-right15

type=Primary, state=Default20pxspacing/gap/medium-large
type=Primary, state=Hover20pxspacing/gap/medium-large
type=Primary, state=Focus20pxspacing/gap/medium-large
type=Primary, state=Pressed20pxspacing/gap/medium-large
type=Primary, state=Disabled20pxspacing/gap/medium-large
type=Tertiary, state=Default20pxspacing/gap/medium-large
type=Tertiary, state=Hover20pxspacing/gap/medium-large
type=Tertiary, state=Pressed20pxspacing/gap/medium-large
type=Tertiary, state=Disabled20pxspacing/gap/medium-large
type=Tertiary, state=Focus20pxspacing/gap/medium-large
type=Secondary, state=Default20pxspacing/gap/medium-large
type=Secondary, state=Hover20pxspacing/gap/medium-large
type=Secondary, state=Pressed20pxspacing/gap/medium-large
type=Secondary, state=Disabled20pxspacing/gap/medium-large
type=Secondary, state=Focus20pxspacing/gap/medium-large

root.padding-top15

type=Primary, state=Default0pxspacing/gap/none
type=Primary, state=Hover0pxspacing/gap/none
type=Primary, state=Focus0pxspacing/gap/none
type=Primary, state=Pressed0pxspacing/gap/none
type=Primary, state=Disabled0pxspacing/gap/none
type=Tertiary, state=Default0pxspacing/gap/none
type=Tertiary, state=Hover0pxspacing/gap/none
type=Tertiary, state=Pressed0pxspacing/gap/none
type=Tertiary, state=Disabled0pxspacing/gap/none
type=Tertiary, state=Focus0pxspacing/gap/none
type=Secondary, state=Default0pxspacing/gap/none
type=Secondary, state=Hover0pxspacing/gap/none
type=Secondary, state=Pressed0pxspacing/gap/none
type=Secondary, state=Disabled0pxspacing/gap/none
type=Secondary, state=Focus0pxspacing/gap/none
component

Projects

One row in the project list: number, name, and industry, type and period on the right.

Figma 100:185 contract: review guidance: missing not built yet 6 variants
statesDefaultHoverPressedFocusDisabledLocked
Partsrootleftlabeltextrighticons-dot-actionsicons-arrow-leftoutlinefocus-ringbadgeicons-lock

Never changes 54

PartPropertyValueToken
rootalign-itemscenterlayout
rootdisplayflexlayout
rootpositionrelativelayout
rootgap40pxspacing/gap/2xlarge
rootpadding-top24pxspacing/gap/large
rootpadding-bottom24pxspacing/gap/large
rootwidth976pxjust the Figma frame size
leftalign-itemscenterlayout
leftdisplayflexlayout
leftflex1 0 0layout
leftpositionrelativelayout
leftgap40pxsuggest spacing/gap/2xlarge
labelflex-shrink0layout
labelpositionrelativelayout
labelfont-family'General Sans Variable'font-family/base
labelfont-weight400typography/label/font-weight/regular
labelline-height14pxtypography/label/line-height
labelfont-size12pxtypography/label/font-size
labelletter-spacing0pxtypography/label/letter-spacing
textflex-shrink0layout
textpositionrelativelayout
textfont-family'General Sans Variable'font-family/base
textfont-weight500typography/sub-headline/font-weight/medium
textline-height48pxtypography/sub-headline/line-height
textfont-size40pxtypography/sub-headline/font-size
textletter-spacing0pxtypography/sub-headline/letter-spacing
rightalign-itemscenterlayout
rightdisplayflexlayout
rightflex-shrink0layout
rightheight100%layout
rightjustify-contentflex-endlayout
rightpositionrelativelayout
rightgap16pxspacing/gap/medium
icons-dotpositionabsolutelayout
icons-dotinset0layout
icons-dotflex-shrink0layout
icons-dotwidth12pxsuggest spacing/size/3xsmall
icons-dotheight12pxsuggest spacing/size/3xsmall
-actionsjustify-contentcenterlayout
-actionsalign-itemscenterlayout
-actionsdisplayflexlayout
-actionsflex-shrink0layout
-actionspositionrelativelayout
-actionsgap8pxspacing/gap/small
-actionspadding0pxspacing/gap/none
-actionsborder-radius10000pxspacing/radius/full
-actionswidth32pxsuggest spacing/size/small-medium
-actionsheight32pxsuggest spacing/size/small-medium
icons-arrow-leftpositionabsolutelayout
icons-arrow-leftinset0layout
icons-arrow-leftflex-shrink0layout
icons-arrow-leftwidth16pxsuggest spacing/size/2xsmall
icons-arrow-leftheight16pxsuggest spacing/size/2xsmall
outlinepositionabsolutelayout

Changes by variant 58

-actions.opacity1

state=Disabled0.24opacity/gentle

badge.align-items1

state=Disabledcenterlayout

badge.border-radius1

state=Disabled10000pxspacing/radius/full

badge.display1

state=Disabledflexlayout

badge.flex-shrink1

state=Disabled0layout

badge.gap1

state=Disabled2pxspacing/gap/3xsmall

badge.height1

state=Disabled24pxsuggest spacing/size/small

badge.padding-bottom1

state=Disabled2pxspacing/gap/3xsmall

badge.padding-left1

state=Disabled8pxspacing/gap/small

badge.padding-right1

state=Disabled8pxspacing/gap/small

badge.padding-top1

state=Disabled0pxspacing/gap/none

badge.position1

state=Disabledrelativelayout

focus-ring.border-color1

state=Focus#999project/focus/focus-ring

focus-ring.border-sides1

state=Focusalllayout

focus-ring.border-width1

state=Focus2pxspacing/outline/medium

focus-ring.inset1

state=Focus-4pxlayout

focus-ring.position1

state=Focusabsolutelayout

icons-lock.flex-shrink1

state=Locked0layout

icons-lock.height1

state=Locked24pxsuggest spacing/size/small

icons-lock.inset1

state=Locked0layout

icons-lock.position1

state=Lockedabsolutelayout

icons-lock.width1

state=Locked24pxsuggest spacing/size/small

label.color4

state=Focus#999project/default/sub-label
state=Disabled#999project/default/sub-label
state=Default#999project/default/sub-label
state=Locked#999project/lock/sub-label

label.opacity1

state=Disabled0.24opacity/gentle

label.white-space2

state=Disablednowraplayout
state=Lockednowraplayout

left.color2

state=Hover#00d669project/hover/label
state=Pressed#00d669project/pressed/label

left.white-space4

state=Hovernowraplayout
state=Focusnowraplayout
state=Pressednowraplayout
state=Defaultnowraplayout

outline.background6

state=Hover#00d669project/hover/outline
state=Focus#3a3a3aproject/focus/outline
state=Pressed#10ffa4project/pressed/outline
state=Disabled#3a3a3aproject/disabled/outline
state=Default#3a3a3aproject/default/outline
state=Locked#3a3a3aproject/lock/outline

outline.height1

state=Hover2pxsuggest spacing/outline/medium

outline.opacity1

state=Disabled0.24opacity/gentle

right.opacity1

state=Disabled0.24opacity/gentle

root.opacity1

state=Disabled1opacity/solid

root.padding-left3

state=Hover16pxspacing/gap/medium
state=Focus0pxspacing/gap/none
state=Pressed16pxspacing/gap/medium

root.padding-right3

state=Hover0pxspacing/gap/none
state=Focus0pxspacing/gap/none
state=Pressed0pxspacing/gap/none

text.color4

state=Focus#d3d9d5project/default/label
state=Disabled#d3d9d5project/default/label
state=Default#d3d9d5project/default/label
state=Locked#d3d9d5project/lock/label

text.opacity1

state=Disabled0.24opacity/gentle

text.white-space2

state=Disablednowraplayout
state=Lockednowraplayout
component

Tag

A compact 20px label with small corners, for what a piece of content is about.

Figma 91:362 contract: review guidance: agreed not built yet 5 variants
typePrimary
statesDefaultHoverPressedFocusDisabled
Partsrootlabeltextfocus-ring

When to use

  • Saying what something is about: a case study's discipline, a project's platform.

When not to use

  • A status: Badge. A filter: Chip.

Behaviour

One type (Primary) and five states. The hover and press states are there for tags that link to a filtered list. A tag that doesn't go anywhere shouldn't have them.

Accessibility

  • Static: a <span>, or <li> items in a <ul> when there are a few.
  • Linking: an <a> whose name gives the context ("Projects tagged Fintech").
  • Focus: focus-ring, only on tags that link.

Content

One word if you can. Capitals only for proper nouns.

Never changes 21

PartPropertyValueToken
rootjustify-contentcenterlayout
rootalign-itemscenterlayout
rootdisplayflexlayout
rootpositionrelativelayout
rootgap8pxspacing/gap/small
rootheight20pxspacing/size/xsmall
rootpadding-bottom2pxspacing/gap/3xsmall
rootpadding-top0pxspacing/gap/none
rootpadding-left8pxspacing/gap/small
rootpadding-right8pxspacing/gap/small
rootborder-radius4pxspacing/radius/xsmall
labelflex-shrink0layout
labelwhite-spacenowraplayout
labeltext-aligncenterlayout
labelpositionrelativelayout
labelfont-family'General Sans Variable'font-family/base
labelfont-weight500typography/label/font-weight/medium
labelline-height14pxtypography/label/line-height
labelcolor#d3d9d5actions/secondary/regular/default/label
labelfont-size12pxtypography/label/font-size
labelletter-spacing0pxtypography/label/letter-spacing

Changes by variant 52

focus-ring.border-color1

type=Primary, state=Focus#999actions/secondary/regular/focus/focus-ring

focus-ring.border-radius1

type=Primary, state=Focus8pxspacing/radius/small

focus-ring.border-sides1

type=Primary, state=Focusalllayout

focus-ring.border-width1

type=Primary, state=Focus2pxspacing/outline/medium

focus-ring.inset1

type=Primary, state=Focus-4pxlayout

focus-ring.position1

type=Primary, state=Focusabsolutelayout

root.background5

type=Primary, state=Default#3a3a3aactions/secondary/regular/default/background
type=Primary, state=Hover#747573actions/secondary/regular/hover/background
type=Primary, state=Pressed#999actions/secondary/regular/pressed/background
type=Primary, state=Disabled#3a3a3aactions/secondary/regular/disabled/background
type=Primary, state=Focus#3a3a3aactions/secondary/regular/focus/background

root.opacity1

type=Primary, state=Disabled0.24opacity/gentle

text.color4

type=Primary, state=Hover#edededactions/secondary/regular/hover/label
type=Primary, state=Pressed#d3d9d5actions/secondary/regular/pressed/label
type=Primary, state=Disabled#d3d9d5actions/secondary/regular/disabled/label
type=Primary, state=Focus#d3d9d5actions/secondary/regular/focus/label

text.flex-shrink4

type=Primary, state=Hover0layout
type=Primary, state=Pressed0layout
type=Primary, state=Disabled0layout
type=Primary, state=Focus0layout

text.font-family4

type=Primary, state=Hover'General Sans Variable'font-family/base
type=Primary, state=Pressed'General Sans Variable'font-family/base
type=Primary, state=Disabled'General Sans Variable'font-family/base
type=Primary, state=Focus'General Sans Variable'font-family/base

text.font-size4

type=Primary, state=Hover12pxtypography/label/font-size
type=Primary, state=Pressed12pxtypography/label/font-size
type=Primary, state=Disabled12pxtypography/label/font-size
type=Primary, state=Focus12pxtypography/label/font-size

text.font-weight4

type=Primary, state=Hover500typography/label/font-weight/medium
type=Primary, state=Pressed500typography/label/font-weight/medium
type=Primary, state=Disabled500typography/label/font-weight/medium
type=Primary, state=Focus500typography/label/font-weight/medium

text.letter-spacing4

type=Primary, state=Hover0pxtypography/label/letter-spacing
type=Primary, state=Pressed0pxtypography/label/letter-spacing
type=Primary, state=Disabled0pxtypography/label/letter-spacing
type=Primary, state=Focus0pxtypography/label/letter-spacing

text.line-height4

type=Primary, state=Hover14pxtypography/label/line-height
type=Primary, state=Pressed14pxtypography/label/line-height
type=Primary, state=Disabled14pxtypography/label/line-height
type=Primary, state=Focus14pxtypography/label/line-height

text.position4

type=Primary, state=Hoverrelativelayout
type=Primary, state=Pressedrelativelayout
type=Primary, state=Disabledrelativelayout
type=Primary, state=Focusrelativelayout

text.text-align4

type=Primary, state=Hovercenterlayout
type=Primary, state=Pressedcenterlayout
type=Primary, state=Disabledcenterlayout
type=Primary, state=Focuscenterlayout

text.white-space4

type=Primary, state=Hovernowraplayout
type=Primary, state=Pressednowraplayout
type=Primary, state=Disablednowraplayout
type=Primary, state=Focusnowraplayout
component

TestimonialPicture

The photo of the person behind a testimonial.

Figma 144:493 contract: review guidance: missing not built yet
peoplePerson 1Person 2Person 3Person 4Person 5Person 6Person 7Person 8
Partsroot

Never changes 4

PartPropertyValueToken
rootpositionabsolutelayout
rootinset0layout
rootwidth56pxjust the Figma frame size
rootheight56pxjust the Figma frame size
component

Testimonials

A testimonial you can open and close: name and role, with the quote underneath.

Figma 144:67 contract: review guidance: missing not built yet 10 variants
expandedfalsetrue
statesDefaultHoverPressedFocusDisabled
Partsrootleftslotcontent-actionsicons-arrow-leftoutlinetoplabeltextbottomfocus-ring

Never changes 5

PartPropertyValueToken
rootdisplayflexlayout
rootpositionrelativelayout
rootgap40pxspacing/gap/2xlarge
rootpadding-top24pxspacing/gap/large
rootpadding-bottom24pxspacing/gap/large

Changes by variant 474

-actions.align-items8

state=Hover, expanded=Falsecenterlayout
state=Default, expanded=Truecenterlayout
state=Disabled, expanded=Truecenterlayout
state=Pressed, expanded=Truecenterlayout
state=Focus, expanded=Truecenterlayout
state=Hover, expanded=Truecenterlayout
state=Default, expanded=Falsecenterlayout
state=Pressed, expanded=Falsecenterlayout

-actions.border-radius8

state=Hover, expanded=False10000pxspacing/radius/full
state=Default, expanded=True10000pxspacing/radius/full
state=Disabled, expanded=True10000pxspacing/radius/full
state=Pressed, expanded=True10000pxspacing/radius/full
state=Focus, expanded=True10000pxspacing/radius/full
state=Hover, expanded=True10000pxspacing/radius/full
state=Default, expanded=False10000pxspacing/radius/full
state=Pressed, expanded=False10000pxspacing/radius/full

-actions.display8

state=Hover, expanded=Falseflexlayout
state=Default, expanded=Trueflexlayout
state=Disabled, expanded=Trueflexlayout
state=Pressed, expanded=Trueflexlayout
state=Focus, expanded=Trueflexlayout
state=Hover, expanded=Trueflexlayout
state=Default, expanded=Falseflexlayout
state=Pressed, expanded=Falseflexlayout

-actions.flex-shrink8

state=Hover, expanded=False0layout
state=Default, expanded=True0layout
state=Disabled, expanded=True0layout
state=Pressed, expanded=True0layout
state=Focus, expanded=True0layout
state=Hover, expanded=True0layout
state=Default, expanded=False0layout
state=Pressed, expanded=False0layout

-actions.gap8

state=Hover, expanded=False8pxspacing/gap/small
state=Default, expanded=True8pxspacing/gap/small
state=Disabled, expanded=True8pxspacing/gap/small
state=Pressed, expanded=True8pxspacing/gap/small
state=Focus, expanded=True8pxspacing/gap/small
state=Hover, expanded=True8pxspacing/gap/small
state=Default, expanded=False8pxspacing/gap/small
state=Pressed, expanded=False8pxspacing/gap/small

-actions.height8

state=Hover, expanded=False32pxsuggest spacing/size/small-medium
state=Default, expanded=True32pxsuggest spacing/size/small-medium
state=Disabled, expanded=True32pxsuggest spacing/size/small-medium
state=Pressed, expanded=True32pxsuggest spacing/size/small-medium
state=Focus, expanded=True32pxsuggest spacing/size/small-medium
state=Hover, expanded=True32pxsuggest spacing/size/small-medium
state=Default, expanded=False32pxsuggest spacing/size/small-medium
state=Pressed, expanded=False32pxsuggest spacing/size/small-medium

-actions.justify-content8

state=Hover, expanded=Falsecenterlayout
state=Default, expanded=Truecenterlayout
state=Disabled, expanded=Truecenterlayout
state=Pressed, expanded=Truecenterlayout
state=Focus, expanded=Truecenterlayout
state=Hover, expanded=Truecenterlayout
state=Default, expanded=Falsecenterlayout
state=Pressed, expanded=Falsecenterlayout

-actions.padding8

state=Hover, expanded=False0pxspacing/gap/none
state=Default, expanded=True0pxspacing/gap/none
state=Disabled, expanded=True0pxspacing/gap/none
state=Pressed, expanded=True0pxspacing/gap/none
state=Focus, expanded=True0pxspacing/gap/none
state=Hover, expanded=True0pxspacing/gap/none
state=Default, expanded=False0pxspacing/gap/none
state=Pressed, expanded=False0pxspacing/gap/none

-actions.position8

state=Hover, expanded=Falserelativelayout
state=Default, expanded=Truerelativelayout
state=Disabled, expanded=Truerelativelayout
state=Pressed, expanded=Truerelativelayout
state=Focus, expanded=Truerelativelayout
state=Hover, expanded=Truerelativelayout
state=Default, expanded=Falserelativelayout
state=Pressed, expanded=Falserelativelayout

-actions.width8

state=Hover, expanded=False32pxsuggest spacing/size/small-medium
state=Default, expanded=True32pxsuggest spacing/size/small-medium
state=Disabled, expanded=True32pxsuggest spacing/size/small-medium
state=Pressed, expanded=True32pxsuggest spacing/size/small-medium
state=Focus, expanded=True32pxsuggest spacing/size/small-medium
state=Hover, expanded=True32pxsuggest spacing/size/small-medium
state=Default, expanded=False32pxsuggest spacing/size/small-medium
state=Pressed, expanded=False32pxsuggest spacing/size/small-medium

bottom.align-items5

state=Default, expanded=Truecenterlayout
state=Disabled, expanded=Truecenterlayout
state=Pressed, expanded=Truecenterlayout
state=Focus, expanded=Truecenterlayout
state=Hover, expanded=Truecenterlayout

bottom.display5

state=Default, expanded=Trueflexlayout
state=Disabled, expanded=Trueflexlayout
state=Pressed, expanded=Trueflexlayout
state=Focus, expanded=Trueflexlayout
state=Hover, expanded=Trueflexlayout

bottom.flex-shrink5

state=Default, expanded=True0layout
state=Disabled, expanded=True0layout
state=Pressed, expanded=True0layout
state=Focus, expanded=True0layout
state=Hover, expanded=True0layout

bottom.justify-content5

state=Default, expanded=Truecenterlayout
state=Disabled, expanded=Truecenterlayout
state=Pressed, expanded=Truecenterlayout
state=Focus, expanded=Truecenterlayout
state=Hover, expanded=Truecenterlayout

bottom.position5

state=Default, expanded=Truerelativelayout
state=Disabled, expanded=Truerelativelayout
state=Pressed, expanded=Truerelativelayout
state=Focus, expanded=Truerelativelayout
state=Hover, expanded=Truerelativelayout

bottom.width5

state=Default, expanded=True976pxno token yet
state=Disabled, expanded=True100%layout
state=Pressed, expanded=True100%layout
state=Focus, expanded=True100%layout
state=Hover, expanded=True100%layout

content.align-items7

state=Hover, expanded=Falseflex-startlayout
state=Default, expanded=Trueflex-startlayout
state=Disabled, expanded=Trueflex-startlayout
state=Pressed, expanded=Trueflex-startlayout
state=Hover, expanded=Trueflex-startlayout
state=Default, expanded=Falseflex-startlayout
state=Pressed, expanded=Falseflex-startlayout

content.display7

state=Hover, expanded=Falseflexlayout
state=Default, expanded=Trueflexlayout
state=Disabled, expanded=Trueflexlayout
state=Pressed, expanded=Trueflexlayout
state=Hover, expanded=Trueflexlayout
state=Default, expanded=Falseflexlayout
state=Pressed, expanded=Falseflexlayout

content.flex-direction7

state=Hover, expanded=Falsecolumnlayout
state=Default, expanded=Truecolumnlayout
state=Disabled, expanded=Truecolumnlayout
state=Pressed, expanded=Truecolumnlayout
state=Hover, expanded=Truecolumnlayout
state=Default, expanded=Falsecolumnlayout
state=Pressed, expanded=Falsecolumnlayout

content.flex-shrink7

state=Hover, expanded=False0layout
state=Default, expanded=True0layout
state=Disabled, expanded=True0layout
state=Pressed, expanded=True0layout
state=Hover, expanded=True0layout
state=Default, expanded=False0layout
state=Pressed, expanded=False0layout

content.gap7

state=Hover, expanded=False4pxspacing/gap/2xsmall
state=Default, expanded=True4pxspacing/gap/2xsmall
state=Disabled, expanded=True4pxspacing/gap/2xsmall
state=Pressed, expanded=True4pxspacing/gap/2xsmall
state=Hover, expanded=True4pxspacing/gap/2xsmall
state=Default, expanded=False4pxspacing/gap/2xsmall
state=Pressed, expanded=False4pxspacing/gap/2xsmall

content.justify-content7

state=Hover, expanded=Falsecenterlayout
state=Default, expanded=Truecenterlayout
state=Disabled, expanded=Truecenterlayout
state=Pressed, expanded=Truecenterlayout
state=Hover, expanded=Truecenterlayout
state=Default, expanded=Falsecenterlayout
state=Pressed, expanded=Falsecenterlayout

content.position7

state=Hover, expanded=Falserelativelayout
state=Default, expanded=Truerelativelayout
state=Disabled, expanded=Truerelativelayout
state=Pressed, expanded=Truerelativelayout
state=Hover, expanded=Truerelativelayout
state=Default, expanded=Falserelativelayout
state=Pressed, expanded=Falserelativelayout

content.white-space7

state=Hover, expanded=Falsenowraplayout
state=Default, expanded=Truenowraplayout
state=Disabled, expanded=Truenowraplayout
state=Pressed, expanded=Truenowraplayout
state=Hover, expanded=Truenowraplayout
state=Default, expanded=Falsenowraplayout
state=Pressed, expanded=Falsenowraplayout

focus-ring.border-color1

state=Focus, expanded=True#999project/focus/focus-ring

focus-ring.border-sides1

state=Focus, expanded=Truealllayout

focus-ring.border-width1

state=Focus, expanded=True2pxspacing/outline/medium

focus-ring.inset1

state=Focus, expanded=True-4pxlayout

focus-ring.position1

state=Focus, expanded=Trueabsolutelayout

icons-arrow-left.flex-shrink8

state=Hover, expanded=False0layout
state=Default, expanded=True0layout
state=Disabled, expanded=True0layout
state=Pressed, expanded=True0layout
state=Focus, expanded=True0layout
state=Hover, expanded=True0layout
state=Default, expanded=False0layout
state=Pressed, expanded=False0layout

icons-arrow-left.height8

state=Hover, expanded=False16pxsuggest spacing/size/2xsmall
state=Default, expanded=True16pxsuggest spacing/size/2xsmall
state=Disabled, expanded=True16pxsuggest spacing/size/2xsmall
state=Pressed, expanded=True16pxsuggest spacing/size/2xsmall
state=Focus, expanded=True16pxsuggest spacing/size/2xsmall
state=Hover, expanded=True16pxsuggest spacing/size/2xsmall
state=Default, expanded=False16pxsuggest spacing/size/2xsmall
state=Pressed, expanded=False16pxsuggest spacing/size/2xsmall

icons-arrow-left.inset8

state=Hover, expanded=False0layout
state=Default, expanded=True0layout
state=Disabled, expanded=True0layout
state=Pressed, expanded=True0layout
state=Focus, expanded=True0layout
state=Hover, expanded=True0layout
state=Default, expanded=False0layout
state=Pressed, expanded=False0layout

icons-arrow-left.position8

state=Hover, expanded=Falseabsolutelayout
state=Default, expanded=Trueabsolutelayout
state=Disabled, expanded=Trueabsolutelayout
state=Pressed, expanded=Trueabsolutelayout
state=Focus, expanded=Trueabsolutelayout
state=Hover, expanded=Trueabsolutelayout
state=Default, expanded=Falseabsolutelayout
state=Pressed, expanded=Falseabsolutelayout

icons-arrow-left.width8

state=Hover, expanded=False16pxsuggest spacing/size/2xsmall
state=Default, expanded=True16pxsuggest spacing/size/2xsmall
state=Disabled, expanded=True16pxsuggest spacing/size/2xsmall
state=Pressed, expanded=True16pxsuggest spacing/size/2xsmall
state=Focus, expanded=True16pxsuggest spacing/size/2xsmall
state=Hover, expanded=True16pxsuggest spacing/size/2xsmall
state=Default, expanded=False16pxsuggest spacing/size/2xsmall
state=Pressed, expanded=False16pxsuggest spacing/size/2xsmall

label.color6

state=Default, expanded=True#d3d9d5project/default/label
state=Disabled, expanded=True#d3d9d5project/disabled/label
state=Pressed, expanded=True#00d669project/pressed/label
state=Focus, expanded=True#d3d9d5project/focus/label
state=Hover, expanded=True#00d669project/hover/label
state=Default, expanded=False#d3d9d5project/default/label

label.flex-shrink6

state=Default, expanded=True0layout
state=Disabled, expanded=True0layout
state=Pressed, expanded=True0layout
state=Focus, expanded=True0layout
state=Hover, expanded=True0layout
state=Default, expanded=False0layout

label.font-family6

state=Default, expanded=True'General Sans Variable'font-family/base
state=Disabled, expanded=True'General Sans Variable'font-family/base
state=Pressed, expanded=True'General Sans Variable'font-family/base
state=Focus, expanded=True'General Sans Variable'font-family/base
state=Hover, expanded=True'General Sans Variable'font-family/base
state=Default, expanded=False'General Sans Variable'font-family/base

label.font-size6

state=Default, expanded=True24pxtypography/title/font-size
state=Disabled, expanded=True24pxtypography/title/font-size
state=Pressed, expanded=True24pxtypography/title/font-size
state=Focus, expanded=True24pxtypography/title/font-size
state=Hover, expanded=True24pxtypography/title/font-size
state=Default, expanded=False24pxtypography/title/font-size

label.font-weight6

state=Default, expanded=True500typography/title/font-weight/medium
state=Disabled, expanded=True500typography/title/font-weight/medium
state=Pressed, expanded=True500typography/title/font-weight/medium
state=Focus, expanded=True500typography/title/font-weight/medium
state=Hover, expanded=True500typography/title/font-weight/medium
state=Default, expanded=False500typography/title/font-weight/medium

label.letter-spacing6

state=Default, expanded=True0pxtypography/title/letter-spacing
state=Disabled, expanded=True0pxtypography/title/letter-spacing
state=Pressed, expanded=True0pxtypography/title/letter-spacing
state=Focus, expanded=True0pxtypography/title/letter-spacing
state=Hover, expanded=True0pxtypography/title/letter-spacing
state=Default, expanded=False0pxtypography/title/letter-spacing

label.line-height6

state=Default, expanded=True32pxtypography/title/line-height
state=Disabled, expanded=True32pxtypography/title/line-height
state=Pressed, expanded=True32pxtypography/title/line-height
state=Focus, expanded=True32pxtypography/title/line-height
state=Hover, expanded=True32pxtypography/title/line-height
state=Default, expanded=False32pxtypography/title/line-height

label.position6

state=Default, expanded=Truerelativelayout
state=Disabled, expanded=Truerelativelayout
state=Pressed, expanded=Truerelativelayout
state=Focus, expanded=Truerelativelayout
state=Hover, expanded=Truerelativelayout
state=Default, expanded=Falserelativelayout

left.align-items8

state=Hover, expanded=Falsecenterlayout
state=Default, expanded=Truecenterlayout
state=Disabled, expanded=Truecenterlayout
state=Pressed, expanded=Truecenterlayout
state=Focus, expanded=Truecenterlayout
state=Hover, expanded=Truecenterlayout
state=Default, expanded=Falsecenterlayout
state=Pressed, expanded=Falsecenterlayout

left.display8

state=Hover, expanded=Falseflexlayout
state=Default, expanded=Trueflexlayout
state=Disabled, expanded=Trueflexlayout
state=Pressed, expanded=Trueflexlayout
state=Focus, expanded=Trueflexlayout
state=Hover, expanded=Trueflexlayout
state=Default, expanded=Falseflexlayout
state=Pressed, expanded=Falseflexlayout

left.flex8

state=Hover, expanded=False1 0 0layout
state=Default, expanded=True1 0 0layout
state=Disabled, expanded=True1 0 0layout
state=Pressed, expanded=True1 0 0layout
state=Focus, expanded=True1 0 0layout
state=Hover, expanded=True1 0 0layout
state=Default, expanded=False1 0 0layout
state=Pressed, expanded=False1 0 0layout

left.gap8

state=Hover, expanded=False24pxspacing/gap/large
state=Default, expanded=True24pxspacing/gap/large
state=Disabled, expanded=True24pxspacing/gap/large
state=Pressed, expanded=True24pxspacing/gap/large
state=Focus, expanded=True24pxspacing/gap/large
state=Hover, expanded=True24pxspacing/gap/large
state=Default, expanded=False24pxspacing/gap/large
state=Pressed, expanded=False24pxspacing/gap/large

left.padding4

state=Disabled, expanded=True0pxspacing/gap/none
state=Pressed, expanded=True0pxspacing/gap/none
state=Focus, expanded=True0pxspacing/gap/none
state=Hover, expanded=True0pxspacing/gap/none

left.position8

state=Hover, expanded=Falserelativelayout
state=Default, expanded=Truerelativelayout
state=Disabled, expanded=Truerelativelayout
state=Pressed, expanded=Truerelativelayout
state=Focus, expanded=Truerelativelayout
state=Hover, expanded=Truerelativelayout
state=Default, expanded=Falserelativelayout
state=Pressed, expanded=Falserelativelayout

outline.background6

state=Default, expanded=True#3a3a3aproject/default/outline
state=Disabled, expanded=True#3a3a3aproject/disabled/outline
state=Pressed, expanded=True#10ffa4project/pressed/outline
state=Focus, expanded=True#3a3a3aproject/focus/outline
state=Hover, expanded=True#00d669project/hover/outline
state=Default, expanded=False#3a3a3aproject/default/outline

outline.height1

state=Hover, expanded=True2pxsuggest spacing/outline/medium

outline.position6

state=Default, expanded=Trueabsolutelayout
state=Disabled, expanded=Trueabsolutelayout
state=Pressed, expanded=Trueabsolutelayout
state=Focus, expanded=Trueabsolutelayout
state=Hover, expanded=Trueabsolutelayout
state=Default, expanded=Falseabsolutelayout

root.align-items10

state=Focus, expanded=Falsecenterlayout
state=Hover, expanded=Falsecenterlayout
state=Default, expanded=Trueflex-startlayout
state=Disabled, expanded=Trueflex-startlayout
state=Pressed, expanded=Trueflex-startlayout
state=Focus, expanded=Trueflex-startlayout
state=Hover, expanded=Trueflex-startlayout
state=Default, expanded=Falsecenterlayout
state=Disabled, expanded=Falsecenterlayout
state=Pressed, expanded=Falsecenterlayout

root.flex-direction5

state=Default, expanded=Truecolumnlayout
state=Disabled, expanded=Truecolumnlayout
state=Pressed, expanded=Truecolumnlayout
state=Focus, expanded=Truecolumnlayout
state=Hover, expanded=Truecolumnlayout

root.justify-content5

state=Default, expanded=Truecenterlayout
state=Disabled, expanded=Truecenterlayout
state=Pressed, expanded=Truecenterlayout
state=Focus, expanded=Truecenterlayout
state=Hover, expanded=Truecenterlayout

root.opacity1

state=Disabled, expanded=True0.24opacity/gentle

root.padding-left5

state=Default, expanded=True16pxspacing/gap/medium
state=Disabled, expanded=True16pxspacing/gap/medium
state=Pressed, expanded=True16pxspacing/gap/medium
state=Focus, expanded=True16pxspacing/gap/medium
state=Hover, expanded=True16pxspacing/gap/medium

root.padding-right3

state=Pressed, expanded=True0pxspacing/gap/none
state=Focus, expanded=True0pxspacing/gap/none
state=Hover, expanded=True0pxspacing/gap/none

root.width9

state=Focus, expanded=False976pxjust the Figma frame size
state=Hover, expanded=False976pxjust the Figma frame size
state=Disabled, expanded=True976pxjust the Figma frame size
state=Pressed, expanded=True976pxjust the Figma frame size
state=Focus, expanded=True976pxjust the Figma frame size
state=Hover, expanded=True976pxjust the Figma frame size
state=Default, expanded=False976pxjust the Figma frame size
state=Disabled, expanded=False976pxjust the Figma frame size
state=Pressed, expanded=False976pxjust the Figma frame size

slot.border-radius8

state=Hover, expanded=False10000pxspacing/radius/full
state=Default, expanded=True10000pxspacing/radius/full
state=Disabled, expanded=True10000pxspacing/radius/full
state=Pressed, expanded=True10000pxspacing/radius/full
state=Focus, expanded=True10000pxspacing/radius/full
state=Hover, expanded=True10000pxspacing/radius/full
state=Default, expanded=False10000pxspacing/radius/full
state=Pressed, expanded=False10000pxspacing/radius/full

slot.flex-shrink8

state=Hover, expanded=False0layout
state=Default, expanded=True0layout
state=Disabled, expanded=True0layout
state=Pressed, expanded=True0layout
state=Focus, expanded=True0layout
state=Hover, expanded=True0layout
state=Default, expanded=False0layout
state=Pressed, expanded=False0layout

slot.height8

state=Hover, expanded=False56pxsuggest spacing/size/large
state=Default, expanded=True56pxsuggest spacing/size/large
state=Disabled, expanded=True56pxsuggest spacing/size/large
state=Pressed, expanded=True56pxsuggest spacing/size/large
state=Focus, expanded=True56pxsuggest spacing/size/large
state=Hover, expanded=True56pxsuggest spacing/size/large
state=Default, expanded=False56pxsuggest spacing/size/large
state=Pressed, expanded=False56pxsuggest spacing/size/large

slot.position8

state=Hover, expanded=Falserelativelayout
state=Default, expanded=Truerelativelayout
state=Disabled, expanded=Truerelativelayout
state=Pressed, expanded=Truerelativelayout
state=Focus, expanded=Truerelativelayout
state=Hover, expanded=Truerelativelayout
state=Default, expanded=Falserelativelayout
state=Pressed, expanded=Falserelativelayout

slot.width8

state=Hover, expanded=False56pxsuggest spacing/size/large
state=Default, expanded=True56pxsuggest spacing/size/large
state=Disabled, expanded=True56pxsuggest spacing/size/large
state=Pressed, expanded=True56pxsuggest spacing/size/large
state=Focus, expanded=True56pxsuggest spacing/size/large
state=Hover, expanded=True56pxsuggest spacing/size/large
state=Default, expanded=False56pxsuggest spacing/size/large
state=Pressed, expanded=False56pxsuggest spacing/size/large

text.color6

state=Default, expanded=True#999project/default/sub-label
state=Disabled, expanded=True#999project/disabled/sub-label
state=Pressed, expanded=True#c2c7c3project/pressed/sub-label
state=Focus, expanded=True#999project/focus/sub-label
state=Hover, expanded=True#edededproject/hover/sub-label
state=Default, expanded=False#999project/default/sub-label

text.flex-shrink6

state=Default, expanded=True0layout
state=Disabled, expanded=True0layout
state=Pressed, expanded=True0layout
state=Focus, expanded=True0layout
state=Hover, expanded=True0layout
state=Default, expanded=False0layout

text.font-family6

state=Default, expanded=True'General Sans Variable'font-family/base
state=Disabled, expanded=True'General Sans Variable'font-family/base
state=Pressed, expanded=True'General Sans Variable'font-family/base
state=Focus, expanded=True'General Sans Variable'font-family/base
state=Hover, expanded=True'General Sans Variable'font-family/base
state=Default, expanded=False'General Sans Variable'font-family/base

text.font-size6

state=Default, expanded=True14pxtypography/paragraph/font-size
state=Disabled, expanded=True14pxtypography/paragraph/font-size
state=Pressed, expanded=True14pxtypography/paragraph/font-size
state=Focus, expanded=True14pxtypography/paragraph/font-size
state=Hover, expanded=True14pxtypography/paragraph/font-size
state=Default, expanded=False14pxtypography/paragraph/font-size

text.font-weight6

state=Default, expanded=True400typography/paragraph/font-weight/regular
state=Disabled, expanded=True400typography/paragraph/font-weight/regular
state=Pressed, expanded=True400typography/paragraph/font-weight/regular
state=Focus, expanded=True400typography/paragraph/font-weight/regular
state=Hover, expanded=True400typography/paragraph/font-weight/regular
state=Default, expanded=False400typography/paragraph/font-weight/regular

text.letter-spacing6

state=Default, expanded=True0pxtypography/paragraph/letter-spacing
state=Disabled, expanded=True0pxtypography/paragraph/letter-spacing
state=Pressed, expanded=True0pxtypography/paragraph/letter-spacing
state=Focus, expanded=True0pxtypography/paragraph/letter-spacing
state=Hover, expanded=True0pxtypography/paragraph/letter-spacing
state=Default, expanded=False0pxtypography/paragraph/letter-spacing

text.line-height6

state=Default, expanded=True20pxtypography/paragraph/line-height
state=Disabled, expanded=True20pxtypography/paragraph/line-height
state=Pressed, expanded=True20pxtypography/paragraph/line-height
state=Focus, expanded=True20pxtypography/paragraph/line-height
state=Hover, expanded=True20pxtypography/paragraph/line-height
state=Default, expanded=False20pxtypography/paragraph/line-height

text.position6

state=Default, expanded=Truerelativelayout
state=Disabled, expanded=Truerelativelayout
state=Pressed, expanded=Truerelativelayout
state=Focus, expanded=Truerelativelayout
state=Hover, expanded=Truerelativelayout
state=Default, expanded=Falserelativelayout

top.align-items5

state=Default, expanded=Truecenterlayout
state=Disabled, expanded=Truecenterlayout
state=Pressed, expanded=Truecenterlayout
state=Focus, expanded=Truecenterlayout
state=Hover, expanded=Truecenterlayout

top.display5

state=Default, expanded=Trueflexlayout
state=Disabled, expanded=Trueflexlayout
state=Pressed, expanded=Trueflexlayout
state=Focus, expanded=Trueflexlayout
state=Hover, expanded=Trueflexlayout

top.flex-shrink5

state=Default, expanded=True0layout
state=Disabled, expanded=True0layout
state=Pressed, expanded=True0layout
state=Focus, expanded=True0layout
state=Hover, expanded=True0layout

top.gap5

state=Default, expanded=True24pxspacing/gap/large
state=Disabled, expanded=True24pxspacing/gap/large
state=Pressed, expanded=True24pxspacing/gap/large
state=Focus, expanded=True24pxspacing/gap/large
state=Hover, expanded=True24pxspacing/gap/large

top.justify-content2

state=Default, expanded=Truespace-betweenlayout
state=Disabled, expanded=Truespace-betweenlayout

top.position5

state=Default, expanded=Truerelativelayout
state=Disabled, expanded=Truerelativelayout
state=Pressed, expanded=Truerelativelayout
state=Focus, expanded=Truerelativelayout
state=Hover, expanded=Truerelativelayout

top.width5

state=Default, expanded=True100%layout
state=Disabled, expanded=True100%layout
state=Pressed, expanded=True100%layout
state=Focus, expanded=True100%layout
state=Hover, expanded=True100%layout
effect

Thumb effect

The frosted panel on project thumbnails, a backdrop blur.

Figma 124:26634 contract: review guidance: agreed not built yet
Partsroot
root
Whatever the style is applied to: the frosted text panel on a project thumbnail. Thumbs and Carousel both use it.

When to use

  • The text panel on a project thumbnail, in Thumbs and Carousel.

When not to use

  • Navigation. That's the Menu effect.

Behaviour

It blurs what's behind the panel. In Figma the blur is tied to opacity/gentle, an opacity token borrowed as a blur size. It works, but changing that opacity would also move this blur. Its own blur token would fix it.

Accessibility

  • Contrast: check the panel text against the busiest part of the thumbnail.

Never changes 1

PartPropertyValueToken
rootbackdrop-filterblur(12px)effect/thumb
component

Thumbs

A project thumbnail card, with the project name and details on a frosted panel at the bottom.

Figma 109:79 contract: review guidance: missing not built yet 6 variants
statesDefaultHoverPressedFocusDisabledLocked
Partsrootslotshadowcontenttitlenumberlabeltextbottomicons-dotfocus-ringbadgeoutlinelockedicons-lock

Never changes 68

PartPropertyValueToken
rootdisplayflexlayout
rootflex-directioncolumnlayout
rootalign-itemsflex-startlayout
rootpositionrelativelayout
rootgap0pxspacing/gap/none
rootheight334pxjust the Figma frame size
rootborder-radius24pxspacing/radius/xlarge
rootwidth384pxjust the Figma frame size
slotflex1 0 0layout
slotwidth100%layout
slotpositionrelativelayout
slotbackground#171717non-interactive/background/secondary
slotborder-radius24pxspacing/radius/xlarge
shadowpositionabsolutelayout
shadowheight167pxno token yet
shadowopacity0.48opacity/medium
contentpositionabsolutelayout
contentdisplayflexlayout
contentflex-directioncolumnlayout
contentalign-itemsflex-startlayout
contentbackgroundrgba(0,0,0,0.48)no token yet
contentgap8pxspacing/gap/small
contentpadding-bottom24pxspacing/gap/large
contentpadding-top16pxspacing/gap/medium
contentpadding-left16pxspacing/gap/medium
contentpadding-right16pxspacing/gap/medium
contentborder-radius16pxspacing/radius/large
titlealign-itemscenterlayout
titledisplayflexlayout
titleflex-shrink0layout
titlewidth100%layout
titlepositionrelativelayout
titlegap16pxspacing/gap/medium
numberjustify-contentcenterlayout
numberalign-itemscenterlayout
numberdisplayflexlayout
numberflex-directioncolumnlayout
numberflex-shrink0layout
numberpositionrelativelayout
numberwidth16pxsuggest spacing/size/2xsmall
labelflex-shrink0layout
labelwidth100%layout
labelpositionrelativelayout
labelfont-family'General Sans Variable'font-family/base
labelfont-weight400typography/label/font-weight/regular
labelline-height14pxtypography/label/line-height
labelfont-size12pxtypography/label/font-size
labelletter-spacing0pxtypography/label/letter-spacing
textflex-shrink0layout
textwhite-spacenowraplayout
textpositionrelativelayout
textfont-family'General Sans Variable'font-family/base
textfont-weight500typography/title/font-weight/medium
textline-height32pxtypography/title/line-height
textfont-size24pxtypography/title/font-size
textletter-spacing0pxtypography/title/letter-spacing
bottomalign-itemscenterlayout
bottomdisplayflexlayout
bottomflex-shrink0layout
bottomjustify-contentflex-endlayout
bottompositionrelativelayout
bottomgap16pxspacing/gap/medium
bottompadding-left32pxspacing/gap/xlarge
icons-dotpositionabsolutelayout
icons-dotinset0layout
icons-dotflex-shrink0layout
icons-dotwidth12pxsuggest spacing/size/3xsmall
icons-dotheight12pxsuggest spacing/size/3xsmall

Changes by variant 49

badge.align-items1

state=Disabledcenterlayout

badge.border-radius1

state=Disabled10000pxspacing/radius/full

badge.display1

state=Disabledflexlayout

badge.gap1

state=Disabled2pxspacing/gap/3xsmall

badge.height1

state=Disabled24pxspacing/size/small

badge.padding-bottom1

state=Disabled2pxspacing/gap/3xsmall

badge.padding-left1

state=Disabled8pxspacing/gap/small

badge.padding-right1

state=Disabled8pxspacing/gap/small

badge.padding-top1

state=Disabled0pxspacing/gap/none

badge.position1

state=Disabledabsolutelayout

content.opacity1

state=Disabled0.32opacity/mild

focus-ring.border-color1

state=Focus#999project/focus/focus-ring

focus-ring.border-radius1

state=Focus28pxon purpose: Derived: the element radius plus the focus ring offset.

focus-ring.border-sides1

state=Focusalllayout

focus-ring.border-width1

state=Focus2pxspacing/outline/medium

focus-ring.inset1

state=Focus-4pxlayout

focus-ring.position1

state=Focusabsolutelayout

icons-lock.flex-shrink1

state=Locked0layout

icons-lock.height1

state=Locked24pxsuggest spacing/size/small

icons-lock.inset1

state=Locked0layout

icons-lock.position1

state=Lockedabsolutelayout

icons-lock.width1

state=Locked24pxsuggest spacing/size/small

label.color6

state=Focus#999project/default/sub-label
state=Pressed#00d669project/pressed/label
state=Disabled#999project/disabled/sub-label
state=Hover#00d669project/hover/label
state=Default#999project/default/sub-label
state=Locked#999project/default/sub-label

locked.align-items1

state=Lockedcenterlayout

locked.background1

state=Locked#00d669non-interactive/background/positive/base

locked.border-radius1

state=Locked12pxspacing/radius/medium

locked.display1

state=Lockedflexlayout

locked.gap1

state=Locked0pxspacing/gap/none

locked.padding1

state=Locked8pxspacing/gap/small

locked.position1

state=Lockedabsolutelayout

outline.border-color1

state=Disabled#3a3a3anon-interactive/foreground/quadruple

outline.border-radius1

state=Disabled10000pxspacing/radius/full

outline.border-sides1

state=Disabledalllayout

outline.inset1

state=Disabled0layout

outline.opacity1

state=Disabled1opacity/solid

outline.position1

state=Disabledabsolutelayout

root.opacity1

state=Disabled1opacity/solid

slot.opacity1

state=Disabled0.32opacity/mild

text.color6

state=Focus#d3d9d5project/default/label
state=Pressed#00d669project/pressed/label
state=Disabled#d3d9d5project/disabled/label
state=Hover#00d669project/hover/label
state=Default#d3d9d5project/default/label
state=Locked#d3d9d5project/default/label
component

Toggle

A 40×40 icon button that stays on or off, alone or as one choice in a group.

Figma 168:1149 contract: review guidance: agreed akount.ing .ak-toggle 10 variants
selectedfalsetrue
statesDefaultHoverPressedFocusDisabled
Partsrooticons-arrow-leftunionbackgroundfocus-ring

When to use

  • Switching a view or a filter on and off, when the change happens straight away.
  • Picking one option from a short set, as a group. The year switcher in akount.ing works like this.

When not to use

  • Doing something. That's IconButton. A toggle remembers, a button doesn't.
  • A settings-style switch with a label. There isn't one in the kit yet, so ask for one rather than stretching Toggle.

Behaviour

It changes with selected and state. Off, it's a plate with 12px corners on the secondary surface, faded down. On, it becomes a fully round primary pill. The change of shape is part of the signal, not just the colour.

Accessibility

  • Alone: <button aria-pressed="true|false">.
  • Group: role="radio" with aria-checked, inside a role="radiogroup" that has a name. Arrow keys move between options, Tab gets you in and out.
  • Name: aria-label when it's icon only.
  • Focus: focus-ring (2px, actions/primary/focus/focus-ring when it's on), on :focus-visible.
  • Colour: on and off show in the shape (12px corners to fully round) as well as the colour.

Content

Icon only in the kit. akount.ing adds a text label, and that's a declared deviation. If you add one, keep it to a short word or a number.

Where code differs on purpose

  • akount.ing: Accepts a text label; width grows past 40px to fit it, height stays 40px. Label colour follows the surface: secondary label unselected, primary label selected. The year switcher needs text. The kit's toggle is icon-only and specifies no label colour.
  • akount.ing: Rendered as role=radio inside a ToggleGroup radio group, which has no surface of its own. Toggles are used as a single-choice set; ToggleGroup is not a kit component.

Never changes 18

PartPropertyValueToken
rootjustify-contentcenterlayout
rootalign-itemscenterlayout
rootdisplayflexlayout
rootpositionrelativelayout
rootgap8pxspacing/gap/small
rootpadding-left20pxspacing/gap/medium-large
rootpadding-right20pxspacing/gap/medium-large
rootpadding-top0pxspacing/gap/none
rootpadding-bottom0pxspacing/gap/none
rootwidth40pxspacing/size/medium
rootheight40pxspacing/size/medium
icons-arrow-leftoverflowcliplayout
icons-arrow-leftflex-shrink0layout
icons-arrow-leftpositionrelativelayout
icons-arrow-leftwidth20pxsuggest spacing/size/xsmall
icons-arrow-leftheight20pxsuggest spacing/size/xsmall
unionpositionabsolutelayout
unioninset20.84% 16.66% 20.83% 18.4%layout

Changes by variant 72

background.background5

state=Default, selected=False#3a3a3aactions/secondary/regular/default/background
state=Hover, selected=False#3a3a3aactions/secondary/regular/default/background
state=Pressed, selected=False#3a3a3aactions/secondary/regular/default/background
state=Disabled, selected=False#3a3a3aactions/secondary/regular/default/background
state=Focus, selected=False#3a3a3aactions/secondary/regular/default/background

background.border-color5

state=Default, selected=False#edededactions/secondary/regular/default/outline
state=Hover, selected=False#edededactions/secondary/regular/default/outline
state=Pressed, selected=False#edededactions/secondary/regular/default/outline
state=Disabled, selected=False#edededactions/secondary/regular/default/outline
state=Focus, selected=False#edededactions/secondary/regular/default/outline

background.border-radius5

state=Default, selected=False12pxspacing/radius/medium
state=Hover, selected=False12pxspacing/radius/medium
state=Pressed, selected=False12pxspacing/radius/medium
state=Disabled, selected=False12pxspacing/radius/medium
state=Focus, selected=False12pxspacing/radius/medium

background.border-sides5

state=Default, selected=Falseleft toplayout
state=Hover, selected=Falseleft toplayout
state=Pressed, selected=Falseleft toplayout
state=Disabled, selected=Falseleft toplayout
state=Focus, selected=Falseleft toplayout

background.inset5

state=Default, selected=False0layout
state=Hover, selected=False0layout
state=Pressed, selected=False0layout
state=Disabled, selected=False0layout
state=Focus, selected=False0layout

background.opacity5

state=Default, selected=False0.24opacity/gentle
state=Hover, selected=False0.24opacity/gentle
state=Pressed, selected=False0.24opacity/gentle
state=Disabled, selected=False0.24opacity/gentle
state=Focus, selected=False0.24opacity/gentle

background.position5

state=Default, selected=Falseabsolutelayout
state=Hover, selected=Falseabsolutelayout
state=Pressed, selected=Falseabsolutelayout
state=Disabled, selected=Falseabsolutelayout
state=Focus, selected=Falseabsolutelayout

focus-ring.border-color1

state=Focus, selected=True#b6ffdaactions/primary/focus/focus-ring

focus-ring.border-radius1

state=Focus, selected=True10000pxspacing/radius/full

focus-ring.border-sides1

state=Focus, selected=Truealllayout

focus-ring.border-width1

state=Focus, selected=True2pxspacing/outline/medium

focus-ring.inset1

state=Focus, selected=True-5px -4px -4px -5pxlayout

focus-ring.position1

state=Focus, selected=Trueabsolutelayout

root.background5

state=Default, selected=True#00d669actions/primary/default/background
state=Hover, selected=True#00b450actions/primary/hover/background
state=Pressed, selected=True#00913aactions/primary/pressed/background
state=Disabled, selected=True#00d669actions/primary/disabled/background
state=Focus, selected=True#00d669actions/primary/focus/background

root.border-color5

state=Default, selected=Truergba(237,237,237,0.64)actions/primary/default/outline
state=Hover, selected=Truergba(237,237,237,0.64)actions/primary/hover/outline
state=Pressed, selected=Truergba(237,237,237,0.64)actions/primary/pressed/outline
state=Disabled, selected=Truergba(237,237,237,0.64)actions/primary/disabled/outline
state=Focus, selected=Truergba(237,237,237,0.64)actions/primary/focus/outline

root.border-radius10

state=Default, selected=True10000pxspacing/radius/full
state=Default, selected=False12pxspacing/radius/medium
state=Hover, selected=True10000pxspacing/radius/full
state=Hover, selected=False12pxspacing/radius/medium
state=Pressed, selected=True10000pxspacing/radius/full
state=Pressed, selected=False12pxspacing/radius/medium
state=Disabled, selected=True10000pxspacing/radius/full
state=Disabled, selected=False12pxspacing/radius/medium
state=Focus, selected=True10000pxspacing/radius/full
state=Focus, selected=False12pxspacing/radius/medium

root.border-sides5

state=Default, selected=Trueleft toplayout
state=Hover, selected=Trueleft toplayout
state=Pressed, selected=Trueleft toplayout
state=Disabled, selected=Trueleft toplayout
state=Focus, selected=Trueleft toplayout

root.border-top-width5

state=Default, selected=True1pxspacing/outline/small
state=Hover, selected=True1pxspacing/outline/small
state=Pressed, selected=True1pxspacing/outline/small
state=Disabled, selected=True1pxspacing/outline/small
state=Focus, selected=True1pxspacing/outline/small

root.opacity1

state=Disabled, selected=True0.24opacity/gentle