Figma
MIT
Clean, minimal design system for Figma's product and marketing surfaces, built on CSS variables and a modern sans-serif typeface for developer flexibility
Layout StudioImport this kit into a Studio project and start editing.
CLI installRun it in any project. No account needed.
npx @layoutdesign/context install figmaUI themeReskin shadcn or Layout UI components to match Figma.
npx shadcn add https://layout.design/r/figma/theme.json# layout.md — Figma.com Design System
---
## 0. Quick Reference
> Copy-paste into `CLAUDE.md` or `.cursorrules` for immediate AI context.
**Stack:** Next.js · Custom CSS vars · figmaSans variable font · Token source: extracted-css-vars (102 properties, high confidence)
**How to apply:** Use as `var(--token-name)` in CSS, `style={{ prop: 'var(--token-name)' }}` in JSX, or `bg-[var(--token-name)]` in Tailwind.
```css
/* ── Core tokens ── */
--fig-theme-bg: #FFFFFF;
--fig-theme-fg: #000000;
--fig-theme-fg-muted: color-mix(in oklch, #000000, transparent 46%);
--fig-theme-btn-primary-bg: #000000;
--fig-theme-btn-primary-fg: #FFFFFF;
--fig-theme-btn-primary-bg-hover: color-mix(in oklch, #000000, transparent 15%);
--fig-theme-card-bg: color-mix(in oklch, #000000, transparent 96%);
--fig-theme-border: color-mix(in oklch, #000000, transparent 84%);
--fig-theme-border-hover: color-mix(in oklch, #000000, transparent 60%);
--fig-theme-form-error-bg: #972121;
--global-font-sans: var(--font-figma-sans, 'figmaSans', 'figmaSans Fallback', SF Pro Display, system-ui, helvetica, sans-serif);
--global-font-mono: var(--font-figma-mono, 'figmaMono', 'figmaMono Fallback', SF Mono, menlo, monospace);
--fig-typography-size-display1: 6.5rem;
--fig-typography-size-title1: 4rem;
--fig-typography-size-body: 1rem;
--fig-space-32: 2rem;
--fig-space-80: 5rem;
--fig-section-block-padding: var(--fig-space-80, 5rem);
--fig-grid-max-content-width: 95rem;
--fig-grid-margin: 2.5rem;
--fig-grid-columns: 12;
--fig-grid-gutter: 1rem;
--fig-radius-full: 9999px;
--fig-radius-8: 0.5rem;
--duration-fast: 0.18s;
--ease-default: ease;
/* Brand accent colours */
--brand-mark-1: rgb(0, 182, 255);
--brand-mark-2: rgb(255, 114, 55);
--brand-mark-3: rgb(135, 79, 255);
--brand-mark-4: rgb(36, 203, 113);
```
```tsx
// Primary button — correct token usage, all states
<button
className="btn-primary"
style={{
fontFamily: 'var(--global-font-sans)',
fontSize: 'var(--fig-typography-size-button)',
backgroundColor: 'var(--fig-theme-btn-primary-bg)',
color: 'var(--fig-theme-btn-primary-fg)',
borderRadius: 'var(--fig-radius-full)',
padding: '0.75rem 1.5rem',
transition: `background-color var(--duration-fast) var(--ease-default)`,
}}
/>
/* hover → --fig-theme-btn-primary-bg-hover */
/* focus-visible → outline: 2px solid #000, outline-offset: 4px */
/* disabled → opacity: 0.4, cursor: not-allowed */
```
**NEVER rules:**
- NEVER hardcode `#000000` or `#FFFFFF` — use `--fig-theme-fg` / `--fig-theme-bg`
- NEVER use Inter, Roboto, or Arial as primary font — use `--global-font-sans` (figmaSans)
- NEVER use `border-radius: 8px` on primary CTAs — they use `--fig-radius-full` (9999px)
- NEVER invent spacing values — use `--fig-space-*` tokens exclusively
- NEVER omit focus-visible outline — offset is **4px** on buttons/links
- NEVER use warm background colours — this is a monochrome-first (black/white) system
- NEVER use font-weight numeric values like `700` — use the variable font axis tokens
> Full design system → see **layout.md**
---
## 1. Design Direction & Philosophy
### Character & Aesthetic Intent
Figma.com's design language is **precision-minimalist**: a monochrome black-and-white foundation punctuated by four vivid brand-mark accents (cyan, orange, purple, green). The aesthetic projects technical authority and creative confidence — it reads as a tool made by designers who trust negative space.
**Mood:** Calm, intelligent, expansive. Not loud. Not decorative.
**Typography-led hierarchy:** The type system does the heavy lifting. A custom variable font (`figmaSans`) with optical-weight axes (320–400) replaces bold/semibold naming conventions with intentional weight increments. Headings sit at extreme sizes (6.5rem display down to 1rem body) with tight letter-spacing.
**Monochrome base, accent-as-signal:** Brand colours (`--brand-mark-1` through `--brand-mark-4`) are reserved for illustration, brand marks, and decorative tiles — never for large background fills in the UI chrome. Interactive elements (buttons, links, borders) live entirely in the black/white/alpha system.
### What this design explicitly rejects:
- **Rounded corners on primary CTAs** — pill shape (`9999px`) is the rule, not 8px rounded rectangles
- **Warm surface tones** — no cream, beige, or warm-grey backgrounds
- **Gradient-heavy UI** — gradients appear only in brand illustration contexts
- **Font weights above 400** — the variable font's `wdth` and `wght` axes are used instead of fallback bold weights
- **Decorative shadows on most surfaces** — elevation is used sparingly (cards, modals only)
- **Generic system fonts as body text** — figmaSans is always the primary; Arial is only an emergency fallback
---
## 2. Colour System
### Tier 1 — Primitive Values
```css
/* ── Primitive colour values ── */
--color-black: #000000; /* Raw black — do not use directly in components */
--color-white: #FFFFFF; /* Raw white — do not use directly in components */
--brand-mark-1: rgb(0, 182, 255); /* Cyan — brand illustration accent */
--brand-mark-2: rgb(255, 114, 55); /* Orange — brand illustration accent */
--brand-mark-3: rgb(135, 79, 255); /* Purple — brand illustration accent */
--brand-mark-4: rgb(36, 203, 113); /* Green — brand illustration accent */
--color-error-raw: #972121; /* Deep red — error state primitive */
```
### Tier 2 — Semantic Aliases
```css
/* ── Semantic colour tokens (use these in all component code) ── */
/* Surfaces */
--fig-theme-bg: #FFFFFF; /* Page/app background */
--fig-theme-card-bg: color-mix(in oklch, #000000, transparent 96%); /* Card/tile surface (~4% black = very light grey) */
/* Foreground / Text */
--fig-theme-fg: #000000; /* Primary text colour */
--fig-theme-fg-muted: color-mix(in oklch, #000000, transparent 46%); /* Secondary/muted text (~54% black) */
/* Borders */
--fig-theme-border: color-mix(in oklch, #000000, transparent 84%); /* Default border (~16% black) */
--fig-theme-border-hover: color-mix(in oklch, #000000, transparent 60%); /* Hovered border (~40% black) */
/* Badge */
--fig-theme-badge-bg: color-mix(in oklch, #000000, transparent 92%); /* Badge chip background */
--fig-theme-badge-fg: #000000; /* Badge text */
/* Form */
--fig-theme-form-input-bg: color-mix(in oklch, #000000, transparent 92%); /* Input field fill */
--fig-theme-form-placeholder: color-mix(in oklch, #000000, transparent 46%); /* Placeholder text */
--fig-theme-form-error-bg: #972121; /* Error state background (dark red) */
--fig-theme-form-error-fg: #FFFFFF; /* Error state text (white on red) */
/* Status */
/* --figma-error alias → */ --fig-theme-form-error-bg: #972121; /* extracted: high confidence */
```
### Tier 3 — Component Tokens
```css
/* ── Button colour tokens ── */
--fig-theme-btn-primary-bg: #000000; /* Primary button fill */
--fig-theme-btn-primary-fg: #FFFFFF; /* Primary button label */
--fig-theme-btn-primary-bg-hover: color-mix(in oklch, #000000, transparent 15%); /* Primary hover (~85% black) */
--fig-theme-btn-secondary-bg: color-mix(in oklch, #000000, transparent 100%); /* Secondary: fully transparent */
--fig-theme-btn-secondary-fg: #000000; /* Secondary label */
--fig-theme-btn-transparent-bg: color-mix(in oklch, #000000, transparent 96%); /* Transparent button fill */
--fig-theme-btn-transparent-fg: #000000; /* Transparent button label */
--fig-theme-btn-transparent-bg-hover: color-mix(in oklch, #000000, transparent 92%); /* Transparent hover */
--fig-theme-btn-ghost-bg: color-mix(in oklch, #000000, transparent 100%); /* Ghost: fully transparent */
--fig-theme-btn-ghost-bg-hover: color-mix(in oklch, #000000, transparent 96%); /* Ghost hover (~4% black) */
```
### Accent / Brand Subgroup
| Token | Value | Role |
|---|---|---|
| `--brand-mark-1` | `rgb(0, 182, 255)` | Cyan — illustration, brand mark |
| `--brand-mark-2` | `rgb(255, 114, 55)` | Orange — illustration, brand mark |
| `--brand-mark-3` | `rgb(135, 79, 255)` | Purple — illustration, brand mark |
| `--brand-mark-4` | `rgb(36, 203, 113)` | Green — illustration, brand mark |
> **Brand accent colours are decorative only.** NEVER use them as button fills, background surfaces, or text colours in UI chrome.
---
## 3. Typography System
### Font Stack
```css
/* ── Font families ── */
--global-font-sans: var(--font-figma-sans, 'figmaSans', 'figmaSans Fallback', SF Pro Display, system-ui, helvetica, sans-serif);
/* extracted: high confidence — primary UI typeface, variable font with wght/wdth axes */
--global-font-mono: var(--font-figma-mono, 'figmaMono', 'figmaMono Fallback', SF Mono, menlo, monospace);
/* extracted: high confidence — used for section labels (h2), code, captions */
```
### Variable Font Axes
```css
/* ── Weight axis (font-variation-settings or font-weight on variable font) ── */
--fig-typography-variation-wght-regular: 400; /* Body-weight setting */
--fig-typography-variation-wght-bold: 600; /* Bold setting */
--fig-typography-variation-wght-bolder: 700; /* Bolder setting */
--fig-typography-variation-mono: 100; /* Mono axis */
--fig-typography-variation-slnt-italic: -6; /* Italic slant */
/* ── Width axis ── */
--fig-typography-variation-wdth-condensed: 96; /* Condensed */
--fig-typography-variation-wdth-narrow: 98; /* Narrow */
--fig-typography-variation-wdth-normal: 100; /* Normal width */
/* ── Observed font-weight values in computed styles ── */
--font-weight-regular: 320; /* Lightest UI weight — cookie notices, minor labels */
--font-weight-medium: 330; /* Body text, buttons */
--font-weight-semibold: 400; /* Headings (h1, h2, h3) — NOTE: 400 IS semibold in this variable font */
```
> **Critical:** In figmaSans, `font-weight: 400` renders as **semibold**. Do not substitute standard system fonts — at `400` they render as regular weight. The variable font's 320/330 range has no equivalent in Arial or system-ui.
### Composite Type Groups
```css
/* ── Display — hero headline ── */
/* font: var(--global-font-sans), var(--fig-typography-size-display1), 400, lh:1.1, ls:-0.125rem */
--fig-typography-size-display1: 6.5rem;
/* Usage: page hero headline (H1 equivalent at largest breakpoint) */
/* line-height: var(--fig-typography-lh-tight) = 1.1 */
/* letter-spacing: var(--fig-typography-ls-tight) = -0.125rem */
/* font-weight: var(--font-weight-semibold) = 400 */
/* ── Display 2 — section hero ── */
--fig-typography-size-display2: 4.5rem;
/* line-height: 1.1, letter-spacing: -0.125rem */
/* ── Title 1 — section heading ── */
--fig-typography-size-title1: 4rem;
/* line-height: var(--fig-typography-lh-tight) = 1.1 */
/* ── Title 2 ── */
--fig-typography-size-title2: 3rem;
/* ── Title 3 ── */
--fig-typography-size-title3: 2rem;
/* ── Title 4 ── */
--fig-typography-size-title4: 1.5rem;
/* ── Body XL ── */
--fig-typography-size-bodyXL: 1.5rem;
/* font-weight: var(--font-weight-medium) = 330, lh: 1.3 */
/* ── Body L ── */
--fig-typography-size-bodyL: 1.125rem;
/* font-weight: 330, lh: 1.3 */
/* ── Body (base) ── */
--fig-typography-size-body: 1rem;
/* Computed: 18px, weight: 330, lh: 25.2px */
/* ── Caption / Badge / Button Small ── */
--fig-typography-size-caption: 0.875rem;
--fig-typography-size-badge: 0.875rem;
--fig-typography-size-buttonS: 0.875rem;
/* ── Form Label ── */
--fig-typography-size-formLabel: 0.75rem;
/* ── Button ── */
--fig-typography-size-button: 1rem;
/* ── Form Input ── */
--fig-typography-size-formInput: 1rem;
```
### Line-Height Scale
```css
--fig-typography-lh-none: 1; /* Single-line display, no breathing room */
--fig-typography-lh-tight: 1.1; /* Large display headings */
--fig-typography-lh-snug: 1.2; /* Medium headings */
--fig-typography-lh-normal: 1.3; /* Body text */
--fig-typography-lh-relaxed: 1.4; /* Long-form readable body */
--fig-typography-lh-loose: 1.45; /* Captions, labels needing air */
```
### Letter-Spacing Scale
```css
--fig-typography-ls-tight: -0.125rem; /* Large display sizes */
--fig-typography-ls-standard: -0.0625rem; /* Mid-size headings */
--fig-typography-ls-slight: -0.015625rem; /* Body-adjacent sizes */
--fig-typography-ls-none: 0rem; /* Neutral */
--fig-typography-ls-wide: 0.0625rem; /* Uppercase labels (h2 section labels in figmaMono) */
```
### Computed Composite Examples
| Role | Font | Size | Weight | Line-Height | Letter-Spacing | Transform |
|---|---|---|---|---|---|---|
| **H1 / Page Hero** | figmaSans | 56px (2xl) | 400 | 56px (1:1) | -1.25px | none |
| **H2 Section Label** | figmaMono | 14px (xs) | 400 | 18.2px | +0.5px | UPPERCASE |
| **H3 Card Title** | figmaSans | 16px (sm) | 400 | 22.4px | normal | none |
| **Body / Button** | figmaSans | 18px (md) | 330 | 25.2px | normal | none |
| **Nav Link** | figmaSans | 16px (sm) | 400 | 23.2px | -0.14px | none |
| **Dropdown** | figmaSans | 18px (md) | 330 | 25.2px | -0.14px | none |
> **Note on H2:** Section labels on figma.com use `figmaMono` (not figmaSans), `font-size: 14px`, `text-transform: uppercase`, `letter-spacing: 0.5px`. This is a deliberate label/eyebrow pattern — do not replicate H1 sizing on H2.
---
## 4. Spacing & Layout
### Base Spacing Scale
```css
/* ── Spacing tokens (rem-based, infer 1rem = 16px) ── */
--fig-space-none: 0;
--fig-space-4: 0.25rem; /* 4px — micro gap, icon padding */
--fig-space-6: 0.375rem; /* 6px — tight inline spacing */
--fig-space-8: 0.5rem; /* 8px — compact padding (dropdown: padding: 8px) */
--fig-space-12: 0.75rem; /* 12px — badge/chip internal padding */
--fig-space-16: 1rem; /* 16px — base unit, grid gutter */
--fig-space-24: 1.5rem; /* 24px — card internal padding, H2 margin-bottom */
--fig-space-32: 2rem; /* 32px — block spacing */
--fig-space-40: 2.5rem; /* 40px — grid margin */
--fig-space-56: 3.5rem; /* 56px */
--fig-space-64: 4rem; /* 64px */
--fig-space-80: 5rem; /* 80px — section block padding */
--fig-space-120: 7.5rem; /* 120px — large section separation */
/* ── Semantic spacing aliases ── */
--fig-section-block-padding: var(--fig-space-80, 5rem); /* Vertical section padding (top+bottom) */
--f-lego-block-padding: 10rem; /* Large "lego block" section padding */
```
### Grid System
```css
/* ── 12-column grid ── */
--fig-grid-columns: 12;
--fig-grid-gutter: 1rem; /* 16px — column gap */
--fig-grid-margin: 2.5rem; /* 40px — left/right page margin */
--fig-grid-max-content-width: 95rem; /* 1520px — max grid width */
--fig-grid-col-width: calc(
(min(100vw - (var(--fig-grid-margin) * 2) - var(--global-scrollbar-width), var(--fig-grid-max-content-width))
- (var(--fig-grid-gutter) * (var(--fig-grid-columns) - 1)))
/ var(--fig-grid-columns)
);
/* ── Legacy 48-column fine grid (for precise sub-layout) ── */
--f-columns: 48;
--f-max-content-width: 1680px;
--f-col-width: calc(min(100vw, var(--f-max-content-width)) / var(--f-columns));
--f-gutter: calc(var(--f-col-width) * 2); /* 2 fine columns = gutter */
```
### Breakpoints
| Name | Width | Usage |
|---|---|---|
| xs | 320px | Smallest supported viewport |
| sm | 480px | Mobile landscape |
| sm-plus | 559px / 560px | Narrow tablet threshold |
| md | 768px | Tablet portrait |
| lg | 960px | Tablet landscape |
| xl | 1024px | Small desktop |
| 2xl | 1280px | Standard desktop |
| 3xl | 1440px | Wide desktop |
| 4xl | 1600px | XL display |
| 5xl | 1920px | Ultra-wide |
### Border-Radius Scale
```css
--fig-radius-2: 0.125rem; /* 2px — subtle rounding, hairline */
--fig-radius-4: 0.25rem; /* 4px — small chip */
--fig-radius-8: 0.5rem; /* 8px — card corners, modal (--radius-sm alias) */
--fig-radius-12: 0.75rem; /* 12px — medium card */
--fig-radius-16: 1rem; /* 16px — large card panel */
--fig-radius-24: 1.5rem; /* 24px — hero image rounding */
--fig-radius-28: 1.75rem; /* 28px — prominent media block */
--fig-radius-full: 9999px; /* Pill — ALL primary CTA buttons */
```
> **Primary buttons are always `--fig-radius-full` (9999px).** Cookie banner buttons confirmed `border-radius: 8px` — those are exception-context UI, not brand buttons.
---
## 5. Page Structure & Layout Patterns
> No screenshots available. Section map inferred from component inventory, layout digest, and computed structural styles. Rows marked **(inferred)** are not visually confirmed.
### 5.1 Section Map
| Order | Section | Layout Type | Est. Height | Key Elements |
|---|---|---|---|---|
| 1 | **Navigation / Header** | Flex row, `display:block` on nav | ~64px | Logo, nav links (67 instances), CTA button, dropdown menus |
| 2 | **Hero** (inferred) | Full-width, centred column | ~100vh | H1 (56px), body copy (18px/330), primary CTA pill button, brand mark illustration |
| 3 | **Product Features Grid** (inferred) | 12-col grid, 3–4 col per card | ~600–800px | H2 section label (mono/uppercase), H3 card titles, icon/illustration tiles, `--fig-theme-card-bg` surfaces |
| 4 | **"One workspace" Section** (inferred) | 2-col split or full-width | ~500px | 30px H2 heading, body copy, feature callouts |
| 5 | **Plans / Pricing** (inferred) | 12-col grid, 3–4 pricing cards | ~600px | H2 "Plans" label (mono), badge chips, CTA buttons per plan |
| 6 | **Use Cases** (inferred) | Grid or horizontal scroll | ~400px | H2 "Use cases" label, card tiles with `--brand-mark-*` accent fills |
| 7 | **Social Proof / Testimonials** (inferred) | Grid or carousel | ~400px | Quotes, brand logos, badge components |
| 8 | **CTA Band** (inferred) | Full-width centred | ~300px | Large heading (44px+), primary pill CTA, muted subtext |
| 9 | **Footer** (inferred) | 12-col grid, 4–5 columns | ~400px | Nav links, legal text (14px mono), logo mark |
### 5.2 Layout Patterns
**Navigation:**
- `display: block` at role level; inner items use `display: flex; flex-direction: row; align-items: center`
- Padding: `0px` on the nav element itself — inner items carry spacing via `--fig-space-8` padding
- No border-radius on nav items; hover state adds `text-decoration: underline 1px`
- Dropdown: `display: flex; align-items: center; padding: 8px; font-size: 18px; font-weight: 330`
**Cards / Feature Tiles:**
- Background: `--fig-theme-card-bg` (color-mix 96% transparent black ≈ very light grey)
- Border: `--fig-theme-border` at rest; `--fig-theme-border-hover` on hover
- Hover interaction adds `box-shadow: inset 0 0 0 1px var(--fig-theme-border-hover)`
- Border-radius: `--fig-radius-8` (0.5rem) to `--fig-radius-16` (1rem) depending on card size
- Gap between cards: `--fig-grid-gutter` (1rem / 16px)
**Section padding rhythm:**
- Sections use `--fig-section-block-padding` (5rem / 80px) top and bottom
- Large hero/feature blocks use `--f-lego-block-padding` (10rem)
- Grid margin: `--fig-grid-margin` (2.5rem / 40px) on both sides
**Modal:**
- `display: none` by default (JS-toggled)
- `padding: 46px 34px 28px`
- `border-radius: 8px` (matches `--fig-radius-8`)
- `margin: 180px auto 50px` — vertically offset from viewport top
- `box-shadow: rgba(0,0,0,0.1) 0px 10px 15px -3px, rgba(0,0,0,0.05) 0px 4px 6px -2px`
### 5.3 Visual Hierarchy
**Prominence order (top → bottom of page):**
1. H1 hero at 56px / `--fig-typography-size-display1` equivalent — maximum size, tight leading
2. Primary CTA pill button — black fill (`--fig-theme-btn-primary-bg`), white label, `--fig-radius-full`
3. Section H2 labels — small (14px), monospace (`--global-font-mono`), uppercase — act as waypoints not headings
4. Card H3 titles at 16px — moderate, regular weight
5. Body copy at 18px / weight 330 — comfortable reading size
6. Muted secondary text via `--fig-theme-fg-muted`
**CTA colour:** Primary CTA = `--fig-theme-btn-primary-bg: #000000` (black pill). Secondary/ghost CTAs are transparent with border hover state.
**Whitespace rhythm:** Generous — 80px section padding creates clear breathing room between sections. Cards have tight internal padding (24–32px) but sections breathe.
### 5.4 Content Patterns
**Eyebrow + Heading + Body + CTA (repeating pattern):**
```
[H2 UPPERCASE MONO LABEL — 14px, muted, +0.5px tracking]
[H2/Display heading — 30–56px, figmaSans, tight leading]
[Body paragraph — 18px, weight 330, normal leading]
[Primary pill CTA button] [Ghost/secondary CTA]
```
**Feature card pattern:**
```
[card-bg surface with border]
[brand-mark accent icon or illustration]
[H3 title — 16px]
[body description — 16–18px, muted]
[/card]
```
**Section label convention:** Every major section opens with a `figmaMono` uppercase label at 14px / +0.5px letter-spacing / `--fig-theme-fg-muted` colour. This is the consistent structural marker across the page.
---
## 6. Component Patterns
### 6.1 Button — Primary
**Anatomy:** `<button>` → `.btn-inner` → `.btn-text`
**Token mappings:**
| State | Background | Text | Border | Shadow | Cursor |
|---|---|---|---|---|---|
| Default | `--fig-theme-btn-primary-bg` (#000) | `--fig-theme-btn-primary-fg` (#FFF) | none | none | pointer |
| Hover | `--fig-theme-btn-primary-bg-hover` (~85% black) | #FFF | none | none | pointer |
| Focus-visible | #000 | #FFF | `outline: 2px solid #000; outline-offset: 4px` | none | pointer |
| Active | `--fig-theme-btn-primary-bg-hover` | #FFF | none | none | pointer |
| Disabled | #000 at 40% opacity | #FFF at 40% opacity | none | none | not-allowed |
| Loading | #000 | spinner (white) | none | none | wait |
```tsx
// Button — Primary (production-ready, all states)
import { forwardRef, ButtonHTMLAttributes } from 'react';
interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
loading?: boolean;
variant?: 'primary' | 'secondary' | 'ghost' | 'transparent';
}
const Button = forwardRef<HTMLButtonElement, ButtonProps>(
({ children, loading = false, disabled, variant = 'primary', ...props }, ref) => {
const isPrimary = variant === 'primary';
const isSecondary = variant === 'secondary';
const isGhost = variant === 'ghost';
const isTransparent = variant === 'transparent';
return (
<button
ref={ref}
disabled={disabled || loading}
aria-disabled={disabled || loading}
style={{
fontFamily: 'var(--global-font-sans)',
fontSize: 'var(--fig-typography-size-button)', /* 1rem */
fontWeight: 'var(--font-weight-medium)', /* 330 */
lineHeight: '1.4',
letterSpacing: 'normal',
color: isPrimary
? 'var(--fig-theme-btn-primary-fg)'
: isSecondary
? 'var(--fig-theme-btn-secondary-fg)'
: 'var(--fig-theme-btn-transparent-fg)',
backgroundColor: isPrimary
? 'var(--fig-theme-btn-primary-bg)'
: isTransparent
? 'var(--fig-theme-btn-transparent-bg)'
: 'var(--fig-theme-btn-ghost-bg)',
borderRadius: 'var(--fig-radius-full)', /* 9999px — pill shape */
padding: 'var(--fig-space-12) var(--fig-space-24)', /* 0.75rem 1.5rem */
border: isSecondary
? '1px solid var(--fig-theme-border)'
: 'none',
cursor: disabled || loading ? 'not-allowed' : 'pointer',
opacity: disabled ? 0.4 : 1,
transition: `background-color var(--duration-fast) var(--ease-default),
box-shadow var(--duration-fast) var(--ease-default),
opacity var(--duration-fast) var(--ease-default)`,
display: 'inline-flex',
alignItems: 'center',
gap: 'var(--fig-space-8)',
textDecoration: 'none',
}}
// CSS handles :hover and :focus-visible via stylesheet below
{...props}
>
<span className="btn-inner">
{loading ? (
<span className="btn-spinner" aria-label="Loading" role="status" />
) : (
<span className="btn-text">{children}</span>
)}
</span>
</button>
);
}
);
// Required companion CSS
// .btn-primary:hover:not(:disabled) { background-color: var(--fig-theme-btn-primary-bg-hover); }
// .btn-ghost:hover:not(:disabled), .btn-ghost:active:not(:disabled) {
// background-color: var(--fig-theme-btn-ghost-bg-hover);
// box-shadow: inset 0 0 0 1px var(--fig-theme-border-hover);
// }
// button:focus-visible { outline: 2px solid var(--fig-theme-fg); outline-offset: 4px; }
// .btn-spinner { width: 1em; height: 1em; border: 2px solid currentColor;
// border-top-color: transparent; border-radius: 50%;
// animation: animation-1ps4q2h 0.6s linear infinite; }
```
### 6.2 Nav Item
**Anatomy:** `<nav>` → `<a>` or `<button>` (nav item) with optional dropdown trigger
**Token mappings:**
| State | Text colour | Decoration | Background | Outline |
|---|---|---|---|---|
| Default | `--fig-theme-fg` (#000) | none | transparent | none |
| Hover | `--fig-theme-fg` (#000) | `underline 1px` | transparent | none |
| Focus-visible | `--fig-theme-fg` (#000) | underline | transparent | `2px solid #000, offset: 4px` |
| Active | `--fig-theme-fg` (#000) | underline | transparent | none |
| Dropdown open | `--fig-theme-fg` | underline | transparent | none |
```tsx
// Nav Item — correct token usage
<nav role="navigation" style={{ fontFamily: 'var(--global-font-sans)' }}>
<a
href="/product"
style={{
fontFamily: 'var(--global-font-sans)',
fontSize: '16px', /* --fig-typography-size-body equivalent at nav scale */
fontWeight: 'var(--font-weight-semibold)', /* 400 */
lineHeight: '23.2px',
letterSpacing: '-0.14px',
color: 'var(--fig-theme-fg)',
textDecoration: 'none',
padding: 'var(--fig-space-8)',
transition: `text-decoration var(--duration-fast) var(--ease-default)`,
}}
/* CSS: a:hover { text-decoration: underline 1px; } */
/* CSS: a:focus-visible { outline: 2px solid var(--fig-theme-fg); outline-offset: 4px; } */
>
Product
</a>
</nav>
```
### 6.3 Badge
**Anatomy:** `<span>` with `.badge` class
**Token mappings:**
| State | Background | Text | Border |
|---|---|---|---|
| Default | `--fig-theme-badge-bg` | `--fig-theme-badge-fg` | none |
| Hover (if interactive) | `--fig-theme-card-bg` | `--fig-theme-fg` | `--fig-theme-border` |
| Focus-visible | badge-bg | badge-fg | `2px solid #000, offset: 4px` |
```tsx
// Badge — production example
<span
style={{
fontFamily: 'var(--global-font-sans)',
fontSize: 'var(--fig-typography-size-badge)', /* 0.875rem */
fontWeight: 'var(--font-weight-semibold)', /* 400 */
lineHeight: '1.3',
color: 'var(--fig-theme-badge-fg)',
backgroundColor: 'var(--fig-theme-badge-bg)',
borderRadius: 'var(--fig-radius-full)', /* Pill badge */
padding: 'var(--fig-space-4) var(--fig-space-12)', /* 0.25rem 0.75rem */
display: 'inline-flex',
alignItems: 'center',
}}
>
New
</span>
```
### 6.4 Form Input
**Anatomy:** `<label>` + `<input>` or `<textarea>`
**Token mappings:**
| State | Background | Border | Text | Outline |
|---|---|---|---|---|
| Default | `--fig-theme-form-input-bg` | `--fig-theme-border` | `--fig-theme-fg` | none |
| Focus | `--fig-theme-form-input-bg` | `--fig-theme-border-hover` | `--fig-theme-fg` | `2px solid #000, offset: 4px` |
| Error | `--fig-theme-form-error-bg` (#972121) | transparent | `--fig-theme-form-error-fg` (#FFF) | none |
| Placeholder | — | — | `--fig-theme-form-placeholder` | — |
```tsx
// Form Field — label + input
<div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--fig-space-8)' }}>
<label style={{
fontFamily: 'var(--global-font-mono)',
fontSize: 'var(--fig-typography-size-formLabel)', /* 0.75rem */
fontWeight: 'var(--font-weight-semibold)',
textTransform: 'uppercase',
letterSpacing: 'var(--fig-typography-ls-wide)',
color: 'var(--fig-theme-fg-muted)',
}}>
Email
</label>
<input
type="email"
style={{
fontFamily: 'var(--global-font-sans)',
fontSize: 'var(--fig-typography-size-formInput)', /* 1rem */
fontWeight: 'var(--font-weight-medium)',
color: 'var(--fig-theme-fg)',
backgroundColor: 'var(--fig-theme-form-input-bg)',
border: '1px solid var(--fig-theme-border)',
borderRadius: 'var(--fig-radius-8)',
padding: 'var(--fig-space-12) var(--fig-space-16)',
width: '100%',
transition: `border-color var(--duration-fast) var(--ease-default)`,
/* focus-visible: outline: 2px solid var(--fig-theme-fg); outline-offset: 4px; */
}}
/>
</div>
```
### 6.5 Modal
**Anatomy:** backdrop + `.modal` container + header + content + close button
**Token mappings:**
| Property | Token | Value |
|---|---|---|
| Background | `--fig-theme-bg` | #FFFFFF |
| Border-radius | `--fig-radius-8` | 0.5rem (8px) |
| Padding | — | `46px 34px 28px` (extracted exactly) |
| Shadow | `--fig-elevation-1` | `0 0.25rem 2rem 0 color-mix(in oklch, #000, transparent 90%)` |
| Margin | — | `180px auto 50px` |
| Transition | `--duration-fast` | 0.18s / `--ease-default` |
```tsx
// Modal — all structural tokens
<div
role="dialog"
aria-modal="true"
style={{
fontFamily: 'var(--global-font-sans)',
fontSize: '16px',
fontWeight: 'var(--font-weight-semibold)',
color: 'var(--fig-theme-fg)',
backgroundColor: 'var(--fig-theme-bg)',
borderRadius: 'var(--fig-radius-8)',
padding: '46px 34px 28px', /* Extracted exactly — do not approximate */
margin: '180px auto 50px',
maxWidth: '600px',
boxShadow: 'var(--fig-elevation-1)',
transition: `opacity var(--duration-fast) var(--ease-default)`,
}}
>
{/* modal content */}
</div>
```
---
## 7. Elevation & Depth
```css
/* ── Shadow tokens ── */
--fig-elevation-1: 0 0.25rem 2rem 0 color-mix(in oklch, #000000, transparent 90%);
/* Light card lift — modals, floating panels, dropdowns */
--fig-elevation-1-shadow: 0 0.25rem 2rem color-mix(in oklch, #000000, transparent 90%);
/* Alias of elevation-1 (no spread value variant) */
--fig-elevation-2: 0 1.5rem 4.375rem 0 color-mix(in oklch, #000000, transparent 90%);
/* Deep lift — overlapping panels, feature hero imagery */
--fig-elevation-2-shadow: 0 1.5rem 4.375rem color-mix(in oklch, #000000, transparent 90%);
/* Alias of elevation-2 (no spread value variant) */
```
### Z-Index Scale (inferred from context)
```css
/* reconstructed: moderate confidence, inferred from modal/nav/overlay patterns */
--z-index-base: 0; /* Default stacking */
--z-index-raised: 10; /* Cards on hover */
--z-index-dropdown: 100; /* Navigation dropdowns */
--z-index-modal: 500; /* Modal dialogs */
--z-index-overlay: 490; /* Modal backdrop */
--z-index-skip-link: 999; /* Skip-to-content (.fig-11bbqhe at z-index:999 confirmed) */
```
### Border Tokens
```css
--fig-theme-border: color-mix(in oklch, #000000, transparent 84%); /* Default — very subtle */
--fig-theme-border-hover: color-mix(in oklch, #000000, transparent 60%); /* Hover — more visible */
/* Interactive cards hover state: box-shadow: inset 0 0 0 1px var(--fig-theme-border-hover) */
```
### Layering Principles
- **Elevation is sparse.** Only cards and modals receive shadows. Navigation is flat.
- **Inset box-shadow replaces border on hover** for interactive card/button components — avoids layout shift from border-width change.
- **Backdrop for modals** should use a semi-transparent black overlay (no token defined — use `rgba(0,0,0,0.5)` at `--z-index-overlay`).
---
## 8. Motion
```css
/* ── Duration tokens ── */
--duration-fast: 0.18s; /* Default transition — buttons, links, borders (195 elements confirmed) */
/* ── Easing tokens ── */
--ease-default: ease; /* Standard easing for all UI transitions */
/* ── Keyframe animations ── */
/* Spinner / loading rotation */
@keyframes animation-1ps4q2h {
0% { rotate: 0deg; }
100% { rotate: 360deg; }
}
/* Usage: animation: animation-1ps4q2h 0.6s linear infinite; on loading spinners */
```
### Motion Rules
- **All interactive state changes** (hover, focus, active) use `transition: var(--duration-fast) var(--ease-default)` — 0.18s ease
- **The `transition: all` shorthand** appears on most elements (extracted from computed styles) but should be avoided in authored code — use specific properties to prevent unexpected transitions
- **No entrance animations** are defined in the extracted token set. If adding page animations, use 0.18s as the minimum and do not exceed 0.4s for UI micro-interactions
- **Reduced motion:** Always wrap animations in `@media (prefers-reduced-motion: no-preference)` — remove the spinner animation and transition durations in the reduced-motion variant
```css
/* Correct motion application */
.btn-primary {
transition:
background-color var(--duration-fast) var(--ease-default),
box-shadow var(--duration-fast) var(--ease-default),
opacity var(--duration-fast) var(--ease-default);
}
@media (prefers-reduced-motion: reduce) {
.btn-primary {
transition: none;
}
}
```
---
## 9. Anti-Patterns & Constraints
1. **Hardcoded colour values → Silent brand drift → Use semantic tokens.**
AI agents frequently emit `color: #000000` or `background: #fff` directly in component styles when not given explicit constraints. On this site, `#000000` means `--fig-theme-fg` (foreground text) AND `--fig-theme-btn-primary-bg` (button background) — two different semantic purposes. Hardcoding breaks theme adaptability and makes dark-mode addition impossible. **Always use `var(--fig-theme-fg)`, `var(--fig-theme-btn-primary-bg)`, etc.**
2. **Wrong border-radius on primary buttons → Violates pill-first brand shape → Use `--fig-radius-full`.**
AI agents default to `border-radius: 8px` on buttons because 8px is the most common "rounded button" heuristic. This site's primary CTAs are pill-shaped (`9999px`). An 8px radius produces a visually wrong, corporate-looking button that breaks the design's personality. **Use `--fig-radius-full` (9999px) on all primary pill CTAs.** Only cookie/form buttons in off-brand contexts use `8px`.
3. **Using Inter or system-ui as body font → Wrong weight rendering → Use `--global-font-sans`.**
AI agents trained on common patterns assume `font-family: Inter, system-ui` as a safe default. On this site, the custom `figmaSans` variable font renders `font-weight: 400` as a **semibold** optical weight. Substituting Inter at weight 400 renders as regular-weight text, making all headings look visually weak. **Always specify `font-family: var(--global-font-sans)` and never override with generic stacks.**
4. **Using H2 as a section heading with large sans-serif type → Wrong typographic role → Use figmaMono + uppercase + 14px.**
AI agents model H2 as "second largest heading" and apply display-scale figmaSans. On figma.com, H2 is a section-label/eyebrow element: `figmaMono`, `14px`, `uppercase`, `letter-spacing: 0.5px`, `color: --fig-theme-fg-muted`. Rendering H2 as a 30–44px sans heading breaks every section's visual rhythm. **Use the eyebrow pattern exactly as documented in Section 3's composite table.**
5. **Inventing spacing values (e.g. `padding: 12px 20px`) → Breaks spacing rhythm → Use `--fig-space-*` tokens.**
AI agents interpolate spacing when exact values aren't given. This site uses a non-standard rem scale (`--fig-space-4` through `--fig-space-120`) — padding values like `20px` or `15px` do not exist in the system and create visual inconsistency. **Only use tokens from the `--fig-space-*` scale or their computed pixel equivalents.**
6. **Omitting focus-visible styles → Accessibility failure → Add `outline: 2px solid var(--fig-theme-fg); outline-offset: 4px`.**
AI agents commonly generate hover states but skip focus-visible, assuming browsers handle it. Figma.com has explicit `outline-offset: 4px` for buttons/links and `outline-offset: -2px` for `<main>`. Missing this makes the component non-compliant and visually incorrect in keyboard navigation. **Every interactive element must include a `:focus-visible` rule.**
7. **Applying brand-mark accent colours to interactive UI → Misuse of decorative tokens → Keep accents illustration-only.**
AI agents see `--brand-mark-1` (cyan), `--brand-mark-2` (orange) etc. and use them as button or link colours. These colours exist **only** for brand illustration SVGs and decorative tiles — they are never used for interactive states, text, or backgrounds in the UI chrome. Using them on buttons creates an off-brand, inconsistent look. **Brand-mark tokens belong in `<svg>` fills and marketing illustrations only.**
8. **Using `transition: all` → Causes unexpected animation of layout-affecting properties → List specific properties.**
The extracted computed styles show `transition: all` on many elements — this is a browser default, not an intentional design choice. Authoring `transition: all` in code causes font-size, margin, width, and height to animate on state changes, producing janky layout shifts. **Always specify `transition: background-color, box-shadow, opacity, color` — only the properties that should animate.**
9. **Constructing Tailwind class names dynamically → Purge removes them → Use static classes or CSS vars directly.**
If using Tailwind alongside this system, generating class names like `` `bg-[var(--fig-theme-${variant}-bg)]` `` causes Tailwind's PurgeCSS to remove the class because it can't statically analyse the template literal. **Use static class names or inline `style` props with `var()` references instead.**
10. **Using `!important` to override token values → Breaks cascade and makes theming impossible → Fix specificity.**
AI agents sometimes add `!important` when styles don't apply as expected. On this system, the CSS custom property cascade is intentional — component tokens reference semantic tokens which reference primitives. Injecting `!important` bypasses this cascade and makes the colour system non-overridable. **Fix specificity by scoping selectors correctly, never by adding `!important`.**
---
## Appendix A: Complete Token Reference
Every token extracted from the source. §0 CORE TOKENS is the primary AI signal; this appendix is reference material an AI can cross-check against when a curated role is missing.
```css
/* Colours (29) */
--f-statsig-overlay: #FFFFFF;
--fig-theme-bg: #FFFFFF;
--fig-theme-fg: #000000;
--fig-theme-btn-primary-bg: #000000;
--fig-theme-btn-primary-fg: #FFFFFF;
--fig-theme-btn-primary-bg-hover: color-mix(in oklch, #000000, transparent 15%);
--fig-theme-card-bg: color-mix(in oklch, #000000, transparent 96%);
--fig-theme-border: color-mix(in oklch, #000000, transparent 84%);
--fig-theme-border-hover: color-mix(in oklch, #000000, transparent 60%);
--fig-theme-form-error-bg: #972121;
--brand-mark-1: rgb(0, 182, 255);
--brand-mark-2: rgb(255, 114, 55);
--brand-mark-3: rgb(135, 79, 255);
--brand-mark-4: rgb(36, 203, 113);
--color-black: #000000;
--color-white: #FFFFFF;
--color-error-raw: #972121;
--fig-theme-badge-bg: color-mix(in oklch, #000000, transparent 92%);
--fig-theme-badge-fg: #000000;
--fig-theme-form-input-bg: color-mix(in oklch, #000000, transparent 92%);
--fig-theme-form-error-fg: #FFFFFF;
--fig-theme-btn-secondary-bg: color-mix(in oklch, #000000, transparent 100%);
--fig-theme-btn-secondary-fg: #000000;
--fig-theme-btn-transparent-bg: color-mix(in oklch, #000000, transparent 96%);
--fig-theme-btn-transparent-fg: #000000;
--fig-theme-btn-transparent-bg-hover: color-mix(in oklch, #000000, transparent 92%);
--fig-theme-btn-ghost-bg: color-mix(in oklch, #000000, transparent 100%);
--fig-theme-btn-ghost-bg-hover: color-mix(in oklch, #000000, transparent 96%);
--global-statsig-overlay: #FFFFFF;
/* Typography (22) */
--f-font-whyte-variable: 'ABCWhytePlusVariable','ABCWhytePlusVariable Fallback',Whyte,sans-serif;
--f-font-sans: 'figmaSans','figmaSans Fallback',SF Pro Display,system-ui,helvetica,sans-serif;
--f-font-mono: 'figmaMono','figmaMono Fallback',SF Mono,menlo,monospace;
--f-col-width: calc(min(100vw, var(--f-max-content-width)) / var(--f-columns));
--f-cursor-text: text;
--font-size-xs: 16px; /* 10 elements — e.g. h2 "Product", h2 "Plans", h2 "Use cases" /* mined from computed styles */ */
--font-size-sm: 18px; /* 47 elements — e.g. h3 "Turn Figma context i", h3 "Publish custom websi", h3 "Ship products faster" /* mined from computed styles */ */
--font-size-md: 24px; /* 11 elements — e.g. h2 "Explore what people ", h3 "Share libraries and ", h3 "Unlock your team wit" /* mined from computed styles */ */
--font-size-lg: 56px; /* 6 elements — e.g. h2 "Prompt, code, and de", h2 "Bring everyone toget", h2 "Ship products, any w" /* mined from computed styles */ */
--font-weight-regular: 330; /* 30 elements — e.g. h3 "Turn Figma context i", h3 "Publish custom websi", h3 "Ship products faster" /* mined from computed styles */ */
--font-weight-medium: 400; /* 16 elements — e.g. h2 "Prompt, code, and de", h2 "Bring everyone toget", h2 "Ship products, any w" /* mined from computed styles */ */
--font-weight-semibold: 450; /* 8 elements — e.g. h3 "Virtual Teleportatio", h3 "Bubbles Design Syste", h3 "Virtual Graffiti Wal" /* mined from computed styles */ */
--font-weight-bold: 480; /* 12 elements — e.g. span "Allow all cookies", span "Do not allow cookies", span "Contact sales" /* mined from computed styles */ */
--line-height-tight: 25.2px; /* 47 elements — e.g. h3 "Turn Figma context i", h3 "Publish custom websi", h3 "Ship products faster" /* mined from computed styles */ */
--line-height-normal: 32.4px; /* 10 elements — e.g. h3 "Share libraries and ", h3 "Unlock your team wit", h3 "Create one source of" /* mined from computed styles */ */
--line-height-loose: 61.6px; /* 6 elements — e.g. h2 "Prompt, code, and de", h2 "Bring everyone toget", h2 "Ship products, any w" /* mined from computed styles */ */
--global-font-sans: var(--font-figma-sans, 'figmaSans', 'figmaSans Fallback', SF Pro Display, system-ui, helvetica, sans-serif);
--global-font-mono: var(--font-figma-mono, 'figmaMono', 'figmaMono Fallback', SF Mono, menlo, monospace);
--font-weight-regular: 320;
--font-weight-medium: 330;
--font-weight-semibold: 400;
--global-cursor-text: text;
/* Spacing (43) */
--f-vh: 1vh;
--f-lego-block-padding: 10rem;
--f-max-content-width: 1680px;
--space-xs: 30px; /* 1 element — e.g. article .fig-127zkc3 /* mined from computed styles */ */
--space-sm: 40px; /* 2 elements — e.g. section .fig-1db00we, section .fig-1db00we /* mined from computed styles */ */
--space-md: 60px; /* 2 elements — e.g. section .fig-gcn2ga, section .fig-gcn2ga /* mined from computed styles */ */
--space-lg: 64px; /* 2 elements — e.g. section .fig-gcn2ga, section .fig-gcn2ga /* mined from computed styles */ */
--space-xl: 120px; /* 11 elements — e.g. section .fig-11tqvy7, section .fig-11tqvy7, section .fig-1hysvv2 /* mined from computed styles */ */
--fig-typography-size-display1: 6.5rem;
--fig-typography-size-title1: 4rem;
--fig-typography-size-body: 1rem;
--fig-space-32: 2rem;
--fig-space-80: 5rem;
--fig-section-block-padding: var(--fig-space-80, 5rem);
--fig-grid-max-content-width: 95rem;
--fig-grid-margin: 2.5rem;
--fig-grid-gutter: 1rem;
--fig-typography-size-display2: 4.5rem;
--fig-typography-size-title2: 3rem;
--fig-typography-size-title3: 2rem;
--fig-typography-size-title4: 1.5rem;
--fig-typography-size-bodyXL: 1.5rem;
--fig-typography-size-bodyL: 1.125rem;
--fig-typography-size-caption: 0.875rem;
--fig-typography-size-badge: 0.875rem;
--fig-typography-size-buttonS: 0.875rem;
--fig-typography-size-formLabel: 0.75rem;
--fig-typography-size-button: 1rem;
--fig-typography-size-formInput: 1rem;
--fig-typography-ls-none: 0rem;
--fig-typography-ls-wide: 0.0625rem;
--fig-space-none: 0;
--fig-space-4: 0.25rem;
--fig-space-6: 0.375rem;
--fig-space-8: 0.5rem;
--fig-space-12: 0.75rem;
--fig-space-16: 1rem;
--fig-space-24: 1.5rem;
--fig-space-40: 2.5rem;
--fig-space-56: 3.5rem;
--fig-space-64: 4rem;
--fig-space-120: 7.5rem;
--global-scrollbar-width: 0px;
/* Radius (11) */
--radius-sm: 8px; /* 2 elements — e.g. button .fig-2zebud "Allow all cookies", button .fig-2zebud "Do not allow cookies" /* mined from computed styles */ */
--radius-md: 50px; /* 8 elements — e.g. button .fig-111738k "Prompt", button .fig-47kzj9 "Design", button .fig-2wqdm4 "Draw" /* mined from computed styles */ */
--radius-lg: 50%; /* 3 elements — e.g. button .fig-1qn7s3f, button .fig-159t9i2, button .fig-1qn7s3f /* mined from computed styles */ */
--fig-radius-full: 9999px;
--fig-radius-8: 0.5rem;
--fig-radius-2: 0.125rem;
--fig-radius-4: 0.25rem;
--fig-radius-12: 0.75rem;
--fig-radius-16: 1rem;
--fig-radius-24: 1.5rem;
--fig-radius-28: 1.75rem;
/* Effects (8) */
--f-columns: 48;
--f-gutter: calc(var(--f-col-width) * 2);
--f-cursor-default: default;
--f-cursor-pointer: pointer;
--f-cursor-grab: grab;
--f-cursor-grabbing: grabbing;
--fig-elevation-1-shadow: 0 0.25rem 2rem color-mix(in oklch, #000000, transparent 90%);
--fig-elevation-2-shadow: 0 1.5rem 4.375rem color-mix(in oklch, #000000, transparent 90%);
/* Motion (7) */
----motion-animation-6j0toc: @keyframes animation-6j0toc {
0%, 100% { border-left-color: currentcolor; }
50% { border-left-color: transparent; }
}; /* @keyframes animation-6j0toc */
----motion-animation-jpvf7s: @keyframes animation-jpvf7s {
0% { stroke-dashoffset: 106.814; }
100% { stroke-dashoffset: 0; }
}; /* @keyframes animation-jpvf7s */
----motion-animation-zsk7zs: @keyframes animation-zsk7zs {
0% { transform: translateX(0px); }
100% { transform: translateX(-100%); }
}; /* @keyframes animation-zsk7zs */
----motion-animation-yh21v4: @keyframes animation-yh21v4 {
0% { rotate: 0deg; }
100% { rotate: 360deg; }
}; /* @keyframes animation-yh21v4 */
--duration-fast: 0.16s; /* 38 elements — e.g. button, button, button /* mined from computed styles */ */
--duration-base: 0.25s; /* 3 elements — e.g. button, button, button /* mined from computed styles */ */
--ease-default: ease; /* 201 elements — e.g. button, button, button /* mined from computed styles */ */
```
## Appendix B: Token Source Metadata
```yaml
tokenSource: extracted-css-vars
confidence: high
cssVariableCount: 102
extractedFrom: figma.com (production site)
extractionMethod: CSS custom property enumeration + computed style sampling
curationNotes:
- 35 tokens mapped to standard --figma-* curated roles for quick reference
- All original CSS variable names preserved exactly (--fig-*, --global-*, --brand-mark-*, --f-*)
- Curated names (--figma-*) used ONLY in Section 0 Quick Reference; original names used everywhere else
- font-weight values 320/330/400 are variable font axis values, not standard weight keywords
- H2 uses figmaMono (not figmaSans) — confirmed from computed fontFamily extraction
- border-radius: 8px on cookie banner buttons is exception-context, NOT the primary button shape
- Primary CTA border-radius confirmed as 9999px (--fig-radius-full) from button census
- Brand-mark colours (rgb values) extracted from SVG fill mining, not CSS custom properties
reconstructedTokens:
- z-index scale: moderate confidence — inferred from modal/nav/overlay structure
- Section map ordering: inferred from component inventory + figma.com site knowledge
- Spinner animation duration (0.6s): not extracted, documented as implementation guidance only
fontDeclarations:
- figmaSans: custom variable woff2 font, weight 320, swap display
- figmaSans Fallback: local Arial (emergency fallback)
- figmaMono: custom mono woff2 font, weight 400, swap display
- figmaMono Fallback: local Arial (emergency fallback)
- NOTE: Both figmaSans and figmaMono appear to reference the same woff2 file URL
(/_netlify/_next/static/media/7c42ed55a7834032-s.p.woff2) — may be a variable font
with separate named instances
breakpoints:
extracted: [320px, 480px, 559px, 560px, 768px, 960px, 1024px, 1280px, 1440px, 1600px, 1920px]
method: CSS @media query enumeration
clusteringMethod: N/A — tokens are extracted directly from CSS custom properties,
no clustering required. Computed styles used only to validate and annotate token usage.
```More from the gallery
Browse all kits →You may also like

atlassian.com
MITEnterprise design system for Atlassian's marketing site, featuring bold brand colours, custom typography, and structured spacing tokens built for large-scale SaaS platforms
06
boldsaaslanding-pagelight

github.com
MITGitHub's production design system with 568 CSS custom properties, featuring clean typography, accessible colour tokens, and motion primitives built for developer platforms and collaborative workflows
04
darkdeveloper-toolsaas

Customer.io
MITDark SaaS design system with mint-green accents and clean typography, built for product dashboards and developer-focused platforms
011
darksaasdeveloper-tooldashboard