Files
e62b87b62c feat(design-systems): add structured tokens for cursor, apple, stripe, airbnb, vercel brands (#1652)
* feat(design-systems): add structured tokens for cursor brand

Introduces design-systems/cursor/tokens.css + components.html, the
third structured brand after default and kami. Brings the prose
DESIGN.md into the schema-checked form so agents picking the cursor
design system get the structured token channel (PR-D #1544) instead
of having to re-derive Cursor's warm-cream palette, three-voice
typography (CursorGothic / jjannon / berkeleyMono), oklab borders,
and depth-based focus from prose every turn.

Why now: PR-D made the structured channel default-on, but it only
materially helps the 2 brands shipping tokens.css today. To expand
batch-design-system-test (#1515) coverage beyond default + kami,
we are hand-authoring 5 high-profile brands (cursor first as
template, then apple / stripe / airbnb / vercel) before the bulk
derive script (PR-B). These five also serve as the byte-identical
oracle the future derive script must reproduce.

Brand-specific schema decisions, captured in the tokens.css header:
- Surface: 3-tier cream ladder (#f2f1ed → #ebeae5 → #e6e5e0).
  --surface-warm binds to a real intermediate tier, not aliased.
- Foreground: 4-tier ramp via rgba(38,37,30,a) at 1.0 / 0.9 / 0.55
  / 0.4 — Cursor genuinely has the richer ramp.
- Borders: oklab origins shipped as rgba fallbacks per DESIGN.md
  §Agent Prompt Guide rule 3.
- --tracking-display: -0.03em (the 72px hero value normalized to
  em). Smaller display sizes scale tracking proportionally inline.
- --elev-raised: signature 28/70px diffused atmospheric shadow.
- --focus-ring: depth-only (0 4px 12px), never the cool-blue halo.
- --ease-standard: ease (per DESIGN.md), not the schema cubic-bezier.
- --danger: warm crimson #cf2d56, used for the brand-signature
  hover-text-shift on buttons.

components.html demonstrates the full surface (hero with 72px
CursorGothic + jjannon serif lead, three-voice typography, warm-
surface CTA with crimson hover, accent-orange pill CTA used once,
oklab-fallback bordered cards, AI timeline signature element with
the warm pastel state colors, jjannon-serif input with 4-12 depth
focus). :root paste is byte-identical to tokens.css.

Verified:
- pnpm guard — 13/13 checks pass, including all 8 design-system
  sub-checks now reporting "3 brands" (default + kami + cursor):
  - token-fixture sync: 3 brand pairs aligned
  - A1/A2/B-slot required tokens: all 3 brands declare
    26 A1 + 26 A2 + 4 B-slot
  - unknown token allowlist: 185 declarations across 3 brands all
    match shared schema or brand extensions
  - flag parity: 146 prose-only brands byte-identical, 3 structured
    diverge as expected

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(design-systems): correct h2/h3 line-height in cursor components fixture

Per DESIGN.md §Hierarchy, 36px section headings use line-height 1.20
and 26px sub-headings use 1.25. The shared h1/h2/h3 rule was locking
all three to --leading-tight (1.10), baking wrong vertical rhythm into
the oracle fixture.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(design-systems): add structured tokens for apple, stripe, airbnb, vercel brands

Batch follow-up to #1652 (cursor). Adds tokens.css + components.html
for the remaining four high-profile brands, using cursor as the
format/template oracle.

Each brand encodes its specific identity:
- apple: SF Pro tight-compressed display (--leading-tight 1.05),
  system-blue accent, SF Symbols grid, frosted glass surfaces
- stripe: sohne-var weight-300 anti-convention signature, --leading-tight
  1.10 (matches all heading spec values exactly), indigo accent
- airbnb: Cereal weight-700 display with Rausch coral, --leading-tight
  1.20 with per-size overrides (h2→1.18, h3→1.25)
- vercel: Geist 600 compressed display, --leading-tight 1.10 with
  per-size overrides (h2→1.20, h3→1.33 per DESIGN.md §Typography)

pnpm guard: 13/13 checks pass; flag-parity now shows 6 structured
brands and 143 prose-only brands.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: chaoxiaoche <chaoxiaoche@chaoxiaochedeMacBook-Pro.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-15 16:53:51 +08:00

287 lines
16 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ─────────────────────────────────────────────────────────────────────────
* design-systems/apple/tokens.css
*
* Structured token bindings for the Apple-inspired design system —
* a precision editorial language built around white-space discipline,
* SF Pro typography, and a single restrained blue accent. This file
* is the *machine-readable* form of the values described in
* `DESIGN.md`. Agents are expected to paste the `:root { … }` block
* verbatim into the first `<style>` of every artifact they generate
* against this design system, then reference everything via
* var(--name) from then on.
*
* Why this file exists:
* DESIGN.md tells humans that Apple uses "Pale Apple Gray (#f5f5f7)
* as the main light surface" and "Apple Action Blue (#0071e3) as the
* primary accent", but agents have to translate those prose names
* into the standard token names the lint enforces (`--surface`,
* `--accent`). That translation step is where token misuse happens.
* This file pre-translates the brand once, so agents copy structure
* instead of inventing it.
*
* Brand-specific schema decisions (non-obvious bindings worth flagging
* for reviewers and downstream brand authors):
* 1. We bind --surface-warm to a real intermediate tier (#fbfbfd),
* NOT an alias of --surface. Apple's surface ladder genuinely has
* three light stops — pure white retail canvas, near-white
* brightness-shifted bands, and pale Apple gray feature fields —
* so collapsing surface-warm would erase a real brand feature.
* 2. We bind --fg-2, --meta, and --border-soft to independent values
* rather than aliases. Apple's neutral text ramp is famously
* four-stop (Near-Black Ink → Utility Dark Gray → Secondary
* Neutral Gray → Mid Border Gray) and the schema's B-slots map
* onto it cleanly.
* 3. --radius-pill is bound to 980px, not 9999px. Apple's signature
* capsule CTA literally uses 980px in published CSS, and the
* number is itself a brand-recognisable detail; we keep it.
* 4. --accent-hover lifts (#0077ed) instead of darkening. Apple's
* live blue buttons brighten slightly on hover rather than mix
* toward black; the schema's default formula would fight that.
* --accent-active darkens to #0066cc — the documented Body Link
* Blue — so the active state aligns with Apple's read-link tone.
* 5. --tracking-display is -0.015em. The DESIGN.md hierarchy lists
* -1.2px on 80px hero (-0.015em); tighter than that breaks at
* smaller display sizes, looser loses Apple's machined feel.
* 6. --section-y-desktop is 100px. Apple's billboard chapters lean
* noticeably more generous than the schema default of 80px — the
* breathing room is what lets product imagery do the talking.
* 7. --ease-standard is cubic-bezier(0.28, 0, 0.22, 1), an Apple-
* flavoured smooth-out instead of the schema default. Apple
* transitions decelerate hard then settle, never bounce.
*
* Contract sources:
* - Standard token names: design-systems/_schema/tokens.schema.ts
* (TOKEN_SCHEMA — every name below appears there or as an
* explicit B-slot alias.)
* - A2 fallback values: design-systems/_schema/defaults.css
* (We override --motion-base, --ease-standard, --elev-raised,
* --focus-ring, --radius-pill; the rest match defaults.)
* - Lint enforcement: apps/daemon/src/lint-artifact.ts
* (raw-hex >12 outside :root → P1; non-token accent → P0)
*
* Keep this file additive: never invent token names not also documented
* in DESIGN.md or the shared schema. New Apple-derived sub-brands
* cloning this template should overwrite values, not rename keys.
* ─────────────────────────────────────────────────────────────────── */
:root {
/* ─── Surface (3 levels) ──────────────────────────────────────────
* Apple's binary section rhythm alternates pure white retail/hero
* canvases with pale Apple gray feature fields. We bind --bg to
* the white canvas (the most common default Apple page background)
* and --surface to the pale gray that cards and feature bands lift
* onto. --surface-warm is bound to a real third tier (#fbfbfd) —
* the near-white brightness shift that appears between hero and
* pale-gray bands on apple.com. Collapsing it to var(--surface)
* would erase a real brand feature, so we keep it independent. */
--bg: #ffffff;
--surface: #f5f5f7;
--surface-warm: #fbfbfd;
/* ─── Foreground ramp (4 levels) ─────────────────────────────────
* Apple's text neutrals are explicitly named in DESIGN.md §2:
* Near-Black Ink (primary), Utility Dark Gray (secondary text /
* dark-neutral surfaces in store contexts), Secondary Neutral Gray
* (helper copy / tertiary metadata), Mid Border Gray (the strongest
* neutral, used for stronger field outlines and the most-restrained
* caption tier). We bind all four — Apple genuinely walks the full
* ramp, so collapsing --fg-2 or --meta to siblings would flatten
* the brand.
*
* Note that none of these are pure black (#000000). #000000 is
* reserved for hero canvases and dark chapters; for body type on
* white, #1d1d1f gives the slight warmth that reads as Apple. */
--fg: #1d1d1f;
--fg-2: #424245;
--muted: #6e6e73;
--meta: #86868b;
/* ─── Border (2 levels) ──────────────────────────────────────────
* Soft Border Gray (#d2d2d7) is Apple's default divider weight and
* card-edge color. --border-soft is bound to a lighter near-neutral
* (#e8e8ed) for inner row separators in dense retail tables and
* configurator option lists, where the d2d2d7 hairline would
* over-compete with the option labels. */
--border: #d2d2d7;
--border-soft: #e8e8ed;
/* ─── Accent ──────────────────────────────────────────────────────
* Apple Action Blue — the system's only persistent chromatic move.
* DESIGN.md §7 ("Don't introduce broad secondary accent palettes
* that compete with Apple blue") makes this a one-color brand for
* action and link semantics; the schema's hard cap of ≤2 visible
* accent uses per screen aligns naturally. */
--accent: #0071e3;
--accent-on: #ffffff; /* white label on the blue fill */
/* ─── Accent states ───────────────────────────────────────────────
* Apple's live primary buttons LIGHTEN on hover (the blue gains
* luminance) and darken on press. The schema's default black-mix
* formula would fight that motion, so we hand-pick both values:
* - hover: #0077ed (≈ 4% brighter than --accent)
* - active: #0066cc (the documented Body Link Blue from DESIGN.md
* §2, which doubles cleanly as the press tone)
*
* Schema rule: every brand provides --accent-hover and
* --accent-active. The binding strategy (formula / hand-picked /
* identity) is brand-decided. Default uses formulas; kami uses
* identity + hand-picked; Apple uses hand-picked in both
* directions. */
--accent-hover: #0077ed;
--accent-active: #0066cc;
/* ─── Semantic ────────────────────────────────────────────────────
* Apple's DESIGN.md §2 explicitly notes "no distinct semantic
* palette was consistently visible in the extracted surface set" —
* so we inherit the schema defaults verbatim. Apple artifacts
* almost never need success / warn / danger; when they do, the
* defaults are restrained enough not to fight the blue accent.
* Reserve under 5% of any surface area regardless. */
--success: #16a34a;
--warn: #eab308;
--danger: #dc2626;
/* ─── Typography ──────────────────────────────────────────────────
* Apple's documented split is two SF Pro families: SF Pro Display
* for hero / merchandising headings, SF Pro Text for navigation,
* controls, and dense commerce copy. We mirror the exact published
* fallback chain (SF Pro Icons → Helvetica Neue → Helvetica → Arial
* → sans-serif) so artifacts rendered on non-macOS clients land on
* the closest practical substitute.
*
* SF Mono leads the monospace stack — Apple's brand mono — with
* the schema fallbacks behind it for portability. */
--font-display:
"SF Pro Display", "SF Pro Icons", "Helvetica Neue", Helvetica, Arial, sans-serif;
--font-body:
"SF Pro Text", "SF Pro Icons", "Helvetica Neue", Helvetica, Arial, sans-serif;
--font-mono:
"SF Mono", ui-monospace, "JetBrains Mono", Menlo, Monaco, Consolas, monospace;
/* Type scale (px) — derived from DESIGN.md §3 hierarchy table.
* Apple's body baseline is 17px (NOT the 16px web norm) because
* SF Pro Text was metrically tuned at 17 for Retina; rebinding
* --text-base to anything else collapses the brand's reading
* texture. The display ceiling is the 80px Hero Display XL. */
--text-xs: 12px; /* Micro UI — fine print, micro labels */
--text-sm: 14px; /* Control Label — buttons, helper labels */
--text-base: 17px; /* Body Primary — Apple's reading baseline */
--text-lg: 21px; /* Link/Action Heading — large promo links */
--text-xl: 28px; /* Card/Product Title — tile-level naming */
--text-2xl: 40px; /* Product Heading — campaign section titles */
--text-3xl: 56px; /* Hero Display L — homepage hero moments */
--text-4xl: 80px; /* Hero Display XL — Environment / store hero */
/* Apple's leading envelope is unusually tight at the top of the
* scale (display sizes ride at 1.00–1.10) and unusually airy in
* the body (1.47, well above the web 1.4 default). Both numbers
* come straight from DESIGN.md §3. */
--leading-body: 1.47; /* SF Pro Text body, 17px */
--leading-tight: 1.05; /* Hero Display XL ceiling */
/* Display tracking compresses to -0.015em — the famous Apple
* machined-headline feel. DESIGN.md §3 lists -1.2px on 80px
* (≈ -0.015em); we bind a single em-value so the same rule applies
* across the display tiers. Body type runs at 0 / -0.374px and is
* left to component-level rules so as not to hurt readability. */
--tracking-display: -0.015em;
/* ─── Spacing ─────────────────────────────────────────────────────
* Apple's underlying grid is 8px (DESIGN.md §5), with utility
* micro-steps (2/4/6/7/8/9/10) for precision alignment. The shared
* schema's 4-8-12-16-20-24-32-48 scale fits cleanly — we inherit
* the defaults. Component-internal values that don't match a token
* (Apple's 14px or 17px utility intervals) stay inline at the
* call site rather than spawning extra spacing tokens. */
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
--space-8: 32px;
--space-12: 48px;
/* ─── Section rhythm ──────────────────────────────────────────────
* Apple's billboard chapters lean noticeably more generous than the
* schema default of 80px — broad top/bottom breathing room is what
* lets product imagery dominate the page. We bind 100/64/40, a
* slightly wider envelope than default's 80/48/32. */
--section-y-desktop: 100px;
--section-y-tablet: 64px;
--section-y-phone: 40px;
/* ─── Radius ──────────────────────────────────────────────────────
* Apple uses purposeful radius tiers (DESIGN.md §5 §7 — "don't
* flatten all corners to a single radius"). The mapping:
* --radius-sm → 8px compact controls and fields
* --radius-md → 12px standard buttons, configurator chips
* --radius-lg → 18px cards, module frames, commerce panels
* --radius-pill → 980px Apple's signature capsule CTA — we keep
* the literal value rather than collapse
* to 9999px because the number itself is
* a brand-recognisable detail in Apple's
* published CSS.
*
* The 28-36px spotlight tier and the 56px capsule sub-tier are
* component-internal one-offs and stay inline — they do not earn
* their own tokens until a second use appears. */
--radius-sm: 8px;
--radius-md: 12px;
--radius-lg: 18px;
--radius-pill: 980px;
/* ─── Elevation (3 levels) ────────────────────────────────────────
* Apple uses depth sparingly (DESIGN.md §6 — "depth is intentionally
* restrained"). Three sanctioned levels:
* - flat → none (the default; tonal contrast does the work)
* - ring → 0 0 0 1px var(--border) (border-led containment in
* dense retail contexts)
* - raised → 0 12px 32px rgba(0,0,0,0.08) (the soft Apple card
* shadow; rgba 0.08 is the lower bound from DESIGN.md
* §6's "0.08 → 0.22" range, which keeps cards from
* feeling Material-flavoured)
*
* No fourth level — that would be the Material/neumorphism stack
* Apple consciously avoids. */
--elev-flat: none;
--elev-ring: 0 0 0 1px var(--border);
--elev-raised: 0 12px 32px rgba(0, 0, 0, 0.08);
/* ─── Focus ring ──────────────────────────────────────────────────
* Apple's keyboard-focus signal is a soft blue glow at the action
* accent (DESIGN.md §6 — "Blue focus signal (#0071e3) for keyboard
* and selection emphasis"). We use a 4px ring at ~35% accent
* opacity, slightly larger than the schema's 3px default so it
* reads as the deliberate Apple halo rather than a generic outline.
* Implemented as a box-shadow so it layers outside the element
* without affecting layout. */
--focus-ring: 0 0 0 4px color-mix(in oklab, var(--accent), transparent 65%);
/* ─── Motion ──────────────────────────────────────────────────────
* Apple transitions decelerate hard and settle — never bounce,
* never spring past the target. We override the schema default
* easing with cubic-bezier(0.28, 0, 0.22, 1), the curve Apple
* uses on apple.com for hover and section reveals; --motion-base
* is bumped from 200ms → 220ms because Apple's micro-interactions
* carry slightly more cinematic weight than the web default.
* --motion-fast stays at 150ms for true micro-states (hover tints,
* focus, kbd press feedback). */
--motion-fast: 150ms;
--motion-base: 220ms;
--ease-standard: cubic-bezier(0.28, 0, 0.22, 1);
/* ─── Layout ──────────────────────────────────────────────────────
* Apple's marketing core is a constrained readable column with
* generous outer margins (DESIGN.md §5). 1024px max keeps lines
* inside the SF Pro Text comfortable-measure ceiling (~80ch at
* 17px) while leaving the chapter band full-bleed. Gutters step
* 22 → 18 → 16 across desktop / tablet / phone — slightly tighter
* than default to honor Apple's "broad horizontal breathing room
* but column-disciplined content" balance. */
--container-max: 1024px;
--container-gutter-desktop: 22px;
--container-gutter-tablet: 18px;
--container-gutter-phone: 16px;
}