← Back
Design System · Buttons

Buttons

2 Variants Pill Shape Noto Sans 600 6 States Each 4 Sizes WCAG AAA
§01 Button Anatomy
Variant 1 · Primary Solid
Outline: none (filled)
Font family--btn-font (Noto Sans)
Font weight600 SemiBold
Font size (md)1rem · 16px
Letter spacing0
Text transformNone
ShapePill · border-radius: 9999px
OutlineNone (filled)
Padding (md)12px top/bottom · 28px left/right
Background#000000 · Black
Text color#FFFFFF · White
Hover background#757263 · Taupe
Transitionall 0.18s ease
Variant 2 · Primary Outline
Outline: 2px inside (inset)
Font family--btn-font (Noto Sans)
Font weight600 SemiBold
Font size (md)1rem · 16px
Letter spacing0
Text transformNone
ShapePill · border-radius: 9999px
Outline2px inside · box-shadow inset
Padding (md)12px top/bottom · 28px left/right
BackgroundTransparent
Text color#000000 · Black
Hover → fillsbg #000000 · text #FFFFFF
Transitionall 0.18s ease
§02 Button States
Variant
Default
Hover
Focus
Active
Disabled
Loading
Primary Solid
Primary Outline
Default
Resting state. No interaction active.
Hover
Pointer over element. Solid → taupe. Outline → fills black.
Focus
Keyboard focus. Taupe 3px focus ring appears.
Active
Pressed/clicked. Darkens + scale(0.975).
Disabled
Non-interactive. Low opacity. pointer-events: none.
Loading
Async action in progress. Text hidden, spinner shown.
§03 Button Sizes
Size
Primary Solid
Primary Outline
Padding
Font size
SMSmall
8px · 20px
0.875rem · 14px
MD ★Default
12px · 28px
1rem · 16px
LGLarge
16px · 40px
1.125rem · 18px
XLExtra Large
20px · 52px
1.25rem · 20px
§04 With Icons
Primary Solid · Icon Variants
gap: 8px
gap: 8px
icon-only · square
icon + label
Primary Outline · Icon Variants
gap: 8px
gap: 8px
icon-only · square
icon + label
§05 Buttons on All Backgrounds
White · #FFFFFF
Primary canvas
Solid + Outline
Both variants available · Solid preferred for primary CTA
Sand · #EEEDEB
Section background
Solid + Outline
Both variants work · Black buttons always AAA on sand
Peach · #FFE9D6
Accent background
Solid + Outline
Both variants work · Black buttons always AAA on peach
Available for Work
Senior Product Designer · iOS & AI
Open to native iOS, macOS, and AI/ML product design roles in San Francisco.

On dark surfaces (#000000), use inverted button styles: white solid (21:1 AAA) and white outline at 50% opacity. These are custom one-off instances — not part of the standard two-variant system.

§06 WCAG Contrast — Button Pairs
21.00:1
AAA Pass

White label (#FFFFFF) on solid black button (#000000). Exceeds AAA for all text sizes. The highest possible contrast in the system.

21.00:1
AAA Pass

Black label (#000000) on transparent background (white canvas). Outline itself inherits the same black. Maximum contrast on white.

4.82:1
AA Pass

White label on taupe hover state (#757263). Meets AA for all normal text. The solid button hover shifts to taupe — still fully compliant.

§07 CSS Design Tokens
button-tokens.css
/* ── BUTTON DESIGN TOKENS ────────────────────────────────── */
:root {
  --btn-font:       'Noto Sans', sans-serif;
  --btn-weight:     600;
  --btn-size:       1rem;
  --btn-ls:         0;
  --btn-transform:  none;
  --btn-radius:     9999px;               /* Pill                  */
  --btn-pad-v-sm:   8px;    --btn-pad-h-sm:  20px;
  --btn-pad-v:      12px;   --btn-pad-h:     28px;  /* ← DEFAULT */
  --btn-pad-v-lg:   16px;   --btn-pad-h-lg:  40px;
  --btn-pad-v-xl:   20px;   --btn-pad-h-xl:  52px;
  --btn-transition: all 0.18s ease;
  --btn-focus-ring: 0 0 0 3px rgba(117,114,99,0.35);

  /* Primary Solid */
  --btn-solid-bg:           #000000;
  --btn-solid-text:         #FFFFFF;
  --btn-solid-bg-hover:     #757263;
  --btn-solid-bg-active:    rgba(0,0,0,0.82);
  --btn-solid-bg-disabled:  rgba(0,0,0,0.10);
  --btn-solid-text-disabled:rgba(0,0,0,0.28);

  /* Primary Outline */
  --btn-outline-border:         #000000;
  --btn-outline-text:           #000000;
  --btn-outline-bg-hover:       #000000;
  --btn-outline-text-hover:     #FFFFFF;
  --btn-outline-border-disabled:rgba(0,0,0,0.16);
  --btn-outline-text-disabled:  rgba(0,0,0,0.28);
}
§08 Usage Rules
1
Hierarchy — Solid First

Use Primary Solid for the single most important action per view — the final CTA. Use Primary Outline for secondary actions placed alongside. Never show two solid buttons at the same hierarchy level; one action must always be dominant.

Outline: Inset Not Border

The outline is implemented as box-shadow: inset 0 0 0 2px, not a CSS border. This keeps padding consistent between solid and outline variants — both maintain identical physical size, preventing layout shifts when switching states.

T
Typography Rules

Button labels use Noto Sans 600 at 1rem with no letter spacing and no text transform. Keep labels short: 1–4 words maximum. Never use Poppins for button text.

Sizing Guidelines

MD (default) fits most UI contexts. Use SM inside data tables, toolbars, and inline actions. Use LG for hero sections and primary landing CTAs. Use XL for standalone feature callouts only — never in a group with other buttons.

Accessibility

All button text meets WCAG AAA (21:1) in default state and AA (4.82:1) on hover. Focus states use the taupe focus ring — never remove :focus-visible styles. Icon-only buttons must include an aria-label.

Interaction Behavior

All state transitions animate at 0.18s ease. Active state uses scale(0.975) for tactile press feedback. Loading state hides the label and shows a CSS spinner; keep the button at its natural width to prevent layout jumps.

§09 Text Links
When to Use

Use text-link styling for any inline anchor in prose — paragraphs, descriptions, card body copy, footer credits. Also use it for standalone "named" links that aren't buttons (e.g. AI Tutor, AI Flash Cards, Lecture Recorder titles that deep-link to live products).

When NOT to Use

Buttons, nav items, sidebar identity (the "Natalia Koldaeva" name in the left column), card-as-link surfaces (.preview-card, .ds-link-card, .blog-preview-cell), and CTA chips opt out — they have their own component styles and should never inherit the prose-link underline.

Accessibility

Taupe on white meets WCAG AA (5.05:1) for normal body text. The persistent underline ensures links remain identifiable for users with reduced color vision — never rely on color alone. On hover, contrast rises to 21:1 (black).

External Links

Off-site links get target="_blank" rel="noopener". The underline + taupe color are sufficient affordance — do not append arrow glyphs to prose links (reserve for button labels and card meta rows).