Gestalt
lint passGestalt is Pinterest's open-source design system, built for a visual, consumer-scale product. Its tokens ship as resolved values in the gestalt-design-tokens package: Pinterest red for primary actions, near-black text on white, fully rounded pill buttons, a 4px spacing grid centered on 16px, and 8px default card rounding. The system pairs a bold CTA voice with quiet neutrals so photographic content stays the hero, and it carries a strong accessibility program.
best for: Consumer apps with image-heavy feeds · Mobile-first shopping and discovery UIs · Teams standardizing agent output on Gestalt
## get the file
Actions## colors
- primary#E60023
- primary-strong#B60000
- on-primary#FFFFFF
- surface#FFFFFF
- surface-variant#E9E9E9
- on-surface#111111
- on-surface-variant#767676
- border#CDCDCD
- border-strong#767676
- info#0074E8
- success#008753
- warning#BD5B00
- error#CC0000
## typography
- displayInter · 2.25rem · 700 · lh 1.2
- heading-lgInter · 1.75rem · 600 · lh 1.2
- headingInter · 1.25rem · 600 · lh 1.3
- bodyInter · 1rem · 400 · lh 1.5
- body-smInter · 0.875rem · 400 · lh 1.4
- labelInter · 0.75rem · 400 · lh 1.3
- codeJetBrains Mono · 0.875rem · 400 · lh 1.4
## spacing
- xxs4px
- xs8px
- sm12px
- md16px
- lg24px
- xl32px
- 2xl48px
- 3xl64px
## shapes
- sm4px
- md8px
- lg16px
- full999px
## component tokens
| component | property | value |
|---|---|---|
| button-primary | backgroundColor | {colors.primary} |
| textColor | {colors.on-primary} | |
| rounded | {rounded.full} | |
| padding | 12px 20px | |
| button-primary-hover | backgroundColor | {colors.primary-strong} |
| textColor | {colors.on-primary} | |
| button-secondary | backgroundColor | {colors.surface-variant} |
| textColor | {colors.on-surface} | |
| rounded | {rounded.full} | |
| padding | 12px 20px | |
| card | backgroundColor | {colors.surface} |
| textColor | {colors.on-surface} | |
| rounded | {rounded.md} | |
| padding | {spacing.md} | |
| field | backgroundColor | {colors.surface} |
| textColor | {colors.on-surface} | |
| rounded | {rounded.md} | |
| padding | 12px 16px | |
| link | textColor | {colors.on-surface} |
| helper-text | textColor | {colors.on-surface-variant} |
| typography | {typography.label} | |
| divider | backgroundColor | {colors.border} |
| height | 1px | |
| divider-strong | backgroundColor | {colors.border-strong} |
| height | 1px | |
| status-error | textColor | {colors.error} |
| typography | {typography.label} | |
| badge-info | backgroundColor | {colors.info} |
| textColor | {colors.on-primary} | |
| rounded | {rounded.full} | |
| padding | 2px 8px | |
| badge-success | backgroundColor | {colors.success} |
| textColor | {colors.on-primary} | |
| rounded | {rounded.full} | |
| padding | 2px 8px | |
| badge-warning | backgroundColor | {colors.warning} |
| textColor | {colors.on-primary} | |
| rounded | {rounded.full} | |
| padding | 2px 8px |
## preview as an app
See these tokens as full screens — an approximation of the system's language, not its official components.
## raw file
DESIGN.md — view raw file
---
version: alpha
name: Gestalt
description: Pinterest's design system — friendly and image-first, with Pinterest red actions, pill buttons, and quiet neutrals on an airy white field.
colors:
primary: "#E60023"
primary-strong: "#B60000"
on-primary: "#FFFFFF"
surface: "#FFFFFF"
surface-variant: "#E9E9E9"
on-surface: "#111111"
on-surface-variant: "#767676"
border: "#CDCDCD"
border-strong: "#767676"
info: "#0074E8"
success: "#008753"
warning: "#BD5B00"
error: "#CC0000"
typography:
display:
fontFamily: Inter
fontSize: 2.25rem
fontWeight: 700
lineHeight: 1.2
heading-lg:
fontFamily: Inter
fontSize: 1.75rem
fontWeight: 600
lineHeight: 1.2
heading:
fontFamily: Inter
fontSize: 1.25rem
fontWeight: 600
lineHeight: 1.3
body:
fontFamily: Inter
fontSize: 1rem
fontWeight: 400
lineHeight: 1.5
body-sm:
fontFamily: Inter
fontSize: 0.875rem
fontWeight: 400
lineHeight: 1.4
label:
fontFamily: Inter
fontSize: 0.75rem
fontWeight: 400
lineHeight: 1.3
code:
fontFamily: JetBrains Mono
fontSize: 0.875rem
fontWeight: 400
lineHeight: 1.4
rounded:
sm: 4px
md: 8px
lg: 16px
full: 999px
spacing:
xxs: 4px
xs: 8px
sm: 12px
md: 16px
lg: 24px
xl: 32px
2xl: 48px
3xl: 64px
components:
button-primary:
backgroundColor: "{colors.primary}"
textColor: "{colors.on-primary}"
rounded: "{rounded.full}"
padding: 12px 20px
button-primary-hover:
backgroundColor: "{colors.primary-strong}"
textColor: "{colors.on-primary}"
button-secondary:
backgroundColor: "{colors.surface-variant}"
textColor: "{colors.on-surface}"
rounded: "{rounded.full}"
padding: 12px 20px
card:
backgroundColor: "{colors.surface}"
textColor: "{colors.on-surface}"
rounded: "{rounded.md}"
padding: "{spacing.md}"
field:
backgroundColor: "{colors.surface}"
textColor: "{colors.on-surface}"
rounded: "{rounded.md}"
padding: 12px 16px
link:
textColor: "{colors.on-surface}"
helper-text:
textColor: "{colors.on-surface-variant}"
typography: "{typography.label}"
divider:
backgroundColor: "{colors.border}"
height: 1px
divider-strong:
backgroundColor: "{colors.border-strong}"
height: 1px
status-error:
textColor: "{colors.error}"
typography: "{typography.label}"
badge-info:
backgroundColor: "{colors.info}"
textColor: "{colors.on-primary}"
rounded: "{rounded.full}"
padding: 2px 8px
badge-success:
backgroundColor: "{colors.success}"
textColor: "{colors.on-primary}"
rounded: "{rounded.full}"
padding: 2px 8px
badge-warning:
backgroundColor: "{colors.warning}"
textColor: "{colors.on-primary}"
rounded: "{rounded.full}"
padding: 2px 8px
---
## Overview
Gestalt is Pinterest's design system for its consumer product. Its character is
friendly and image-first: an airy white field, generous rounding that peaks in
full pill buttons, a 4px spacing grid centered on 16px, and Pinterest red
(`{colors.primary}`) reserved for the primary action. Neutrals stay quiet so
photographic content — pins, boards, product shots — carries the screen.
Reach for Gestalt when building consumer experiences that should feel warm and
approachable: media-heavy feeds, mobile-first shopping and discovery, and
marketing surfaces built around imagery.
## Colors
- **primary (`#E60023`) / primary-strong (`#B60000`)** — Pinterest red for the
primary button and brand moments, darkening to primary-strong on hover; pair
with `{colors.on-primary}`.
- **surface (`#FFFFFF`) / surface-variant (`#E9E9E9`)** — the white field and
the gray fill behind secondary buttons and tags.
- **on-surface (`#111111`) / on-surface-variant (`#767676`)** — near-black
primary text and gray secondary text.
- **border (`#CDCDCD`) / border-strong (`#767676`)** — container hairlines and
the stronger outline on form fields and switches.
- **info (`#0074E8`) / success (`#008753`) / warning (`#BD5B00`) / error
(`#CC0000`)** — status fills that carry white text in badges; warning and
error double as Gestalt's warning and error text colors.
Text pairings above meet WCAG AA: white on `{colors.primary}` measures 4.78:1
and white on `{colors.info}` 4.5:1 — both are Gestalt's real button and badge
pairings, so treat them as the floor and never lighten either fill.
## Typography
Gestalt ships no brand typeface: text renders in the platform system stack
(San Francisco, Segoe UI, Roboto, and their fallbacks), with an SF Mono stack
for code. Tokens here carry open **Inter** and **JetBrains Mono** as stand-ins;
never ship proprietary font binaries.
- **display / heading-lg / heading** — the bold-to-semibold title hierarchy
from `{typography.display}` (36px) through `{typography.heading}` (20px).
- **body / body-sm** — regular text at `{typography.body}` (16px, 1.5 line
height) and `{typography.body-sm}` (14px) for dense or secondary copy.
- **label** — `{typography.label}` (12px) for form labels, badges, and helper
text.
- **code** — `{typography.code}` for identifiers and snippets.
## Spacing & Layout
The space scale is a strict 4px grid: `{spacing.xxs}` (4px) and `{spacing.xs}`
(8px) for tight insets, `{spacing.sm}` (12px) and the workhorse `{spacing.md}`
(16px) for control and card padding, and `{spacing.lg}` through `{spacing.3xl}`
for section structure. Layout is card-first: `{colors.surface}` cards with
`{rounded.md}` corners, separated by whitespace rather than heavy borders.
When a hairline is unavoidable, use `{colors.border}`.
## Components
- **button-primary** — a solid `{colors.primary}` pill (`{rounded.full}`) with
`{colors.on-primary}` text; hover darkens to `{colors.primary-strong}`.
- **button-secondary** — a `{colors.surface-variant}` pill with
`{colors.on-surface}` text; no outline, the fill is the affordance.
- **card** — `{colors.surface}` with `{rounded.md}` corners; imagery runs
edge-to-edge and text sits below it.
- **field** — `{colors.surface}` input with a 1px `{colors.border-strong}`
outline and `{rounded.md}` corners; errors switch the outline to
`{colors.error}`.
- **link** — keeps the surrounding text color (`{colors.on-surface}`) and
relies on underline and weight, not blue.
- **helper-text** — `{colors.on-surface-variant}` secondary text at
`{typography.label}`.
- **divider / divider-strong** — 1px hairlines in `{colors.border}` and
`{colors.border-strong}`.
- **status-error** — `{colors.error}` status text at `{typography.label}`.
- **badge-info / badge-success / badge-warning** — `{colors.info}`,
`{colors.success}`, and `{colors.warning}` pills with `{colors.on-primary}`
text.
## Motion
Gestalt defines motion tokens from 50ms to 900ms with named easing curves
(enter, exit, lateral, and a playful bounce); most UI transitions sit in the
200-400ms band. Motion is functional feedback, never ambient decoration, and
`prefers-reduced-motion` must be respected.
## Do's and Don'ts
- **Do** reserve `{colors.primary}` for the one primary action per view;
**don't** use the red as decoration, headings, or body text.
- **Do** keep buttons, badges, and tags fully rounded (`{rounded.full}`);
**don't** square them off — the pill is Gestalt's signature shape.
- **Do** let imagery carry the screen on plain `{colors.surface}`; **don't**
stack tinted panels or gradients behind media.
- **Do** stay on the 4px grid with `{spacing.md}` as the default gap;
**don't** invent off-grid spacing.
- **Do** give secondary actions the `{colors.surface-variant}` fill;
**don't** add outlines or borders to buttons.
- **Do** keep status colors semantic — `{colors.error}` for error text and
field outlines, badges for everything else; **don't** repurpose them for
emphasis.
- **Do** set long copy at `{typography.body}` with its 1.5 line height;
**don't** push paragraphs below `{typography.body-sm}`.
## Agent Prompt Guide
When generating UI in the Gestalt style:
1. Reference tokens by name (`{colors.primary}`, `{spacing.md}`,
`{typography.body}`) — never hardcode raw values.
2. Every text/background pairing must pass WCAG AA; validate against the
palette and never lighten the `{colors.primary}` or `{colors.info}` fills.
3. Default composition: `{colors.surface}` field, edge-to-edge imagery inside
`{rounded.md}` cards, one `{colors.primary}` pill button per view.
4. Keep every interactive element fully rounded (`{rounded.full}`) and all
spacing on the 4px grid.
5. Use Inter / JetBrains Mono as open stand-ins for the system and mono
stacks — never ship proprietary font binaries.
6. If a needed token is missing, propose it in a PR — do not invent values.
## use it with your agent
target: CLAUDE.md · full guide →
# Fetch the design system file curl -fsSL https://api.agent-ds.oday-bakkour.com/v1/systems/gestalt/design.md -o DESIGN.md # CLAUDE.md — add: ## Design system Read ./DESIGN.md before writing or changing any UI. Use its tokens by name; never invent colors, radii, fonts, or spacing.
target: .cursor/rules/design-system.mdc · full guide →
# Fetch the design system file curl -fsSL https://api.agent-ds.oday-bakkour.com/v1/systems/gestalt/design.md -o DESIGN.md # .cursor/rules/design-system.mdc — add: --- description: Design system rules for all UI work globs: ["**/*.tsx", "**/*.css"] --- Read DESIGN.md at the repo root before generating UI. Reference its tokens by name; never invent values.
target: .kiro/steering/design-system.md · full guide →
# Fetch into Kiro's steering directory curl -fsSL https://api.agent-ds.oday-bakkour.com/v1/systems/gestalt/design.md \ -o .kiro/steering/design-system.md
target: global_rules.md · full guide →
# Fetch the design system file curl -fsSL https://api.agent-ds.oday-bakkour.com/v1/systems/gestalt/design.md -o DESIGN.md # global_rules.md — add: Before any UI change, read DESIGN.md at the repo root and use its design tokens exactly. Do not invent colors, type, spacing, or radii.
target: AGENTS.md · full guide →
# Fetch the design system file curl -fsSL https://api.agent-ds.oday-bakkour.com/v1/systems/gestalt/design.md -o DESIGN.md # AGENTS.md — add: ## UI & design system All UI follows ./DESIGN.md. Reference tokens by name; never invent colors, typography, spacing, or radii.
target: .github/copilot-instructions.md · full guide →
# Fetch the design system file curl -fsSL https://api.agent-ds.oday-bakkour.com/v1/systems/gestalt/design.md -o DESIGN.md # .github/copilot-instructions.md — add: When generating or editing UI, follow the design tokens and rules in DESIGN.md at the repository root. Never invent design values.
target: AGENTS.md · full guide →
# Fetch the design system file curl -fsSL https://api.agent-ds.oday-bakkour.com/v1/systems/gestalt/design.md -o DESIGN.md # AGENTS.md — add (OpenCode reads it at the repo root): ## UI & design system All UI follows ./DESIGN.md. Reference tokens by name; never invent colors, typography, spacing, or radii.
target: AGENTS.md · full guide →
# Fetch the design system file curl -fsSL https://api.agent-ds.oday-bakkour.com/v1/systems/gestalt/design.md -o DESIGN.md # AGENTS.md — add (pi loads it at startup; run /reload after editing): ## UI & design system All UI follows ./DESIGN.md. Reference tokens by name; never invent colors, typography, spacing, or radii.
## provenance
fetched 47 times · downloaded 0 times