mirror of
https://github.com/nexu-io/open-design.git
synced 2026-06-01 03:14:35 +07:00
Adds the schema-compliant token + fixture pair for the next 10 brands in Tier E (consumer / hardware / global-cultural surfaces): - pinterest, airtable (visual discovery + no-code product) - bmw, tesla (automotive: German precision vs. EV minimalism) - spacex (aerospace cosmic minimalism, zero-shadow) - nike (sportswear, monochrome editorial) - playstation (gaming console, dark-first cobalt) - starbucks (warm cream + Siren Green) - wechat, xiaohongshu (CJK-primary consumer apps, bilingual stacks) Each pair declares all 56 shared tokens (26 A1 + 26 A2 + 4 B-slot) in :root with brand-rationale comments in tokens.css and a comment-free byte-equivalent :root in components.html. No C-extensions were needed. Validation: - pnpm guard: passed (66 brand pairs aligned, 3714 declarations, 66 brands declare all A1/A2/B-slot tokens, A2 defaults parity intact, flag parity unchanged) Co-authored-by: chaoxiaoche <chaoxiaoche@chaoxiaochedeMacBook-Pro.local> Co-authored-by: Cursor <cursoragent@cursor.com>
262 lines
15 KiB
CSS
262 lines
15 KiB
CSS
/* ─────────────────────────────────────────────────────────────────────────
|
||
* design-systems/pinterest/tokens.css
|
||
*
|
||
* Structured token bindings for "Design System Inspired by Pinterest".
|
||
* Warm visual-discovery canvas: olive/sand neutrals, signature Pinterest
|
||
* Red (#e60023) as the singular bold accent, Pin Sans across the entire
|
||
* type hierarchy, generous 12–28px radii, and minimal shadow because
|
||
* the photography is the elevation.
|
||
*
|
||
* This file pre-compiles the values described in `DESIGN.md` into the
|
||
* schema shared with every OD design system. Agents should paste the
|
||
* `:root { … }` block verbatim into the first `<style>` of an artifact,
|
||
* then resolve every value via `var(--*)` from that point on.
|
||
*
|
||
* Key brand decisions encoded here:
|
||
*
|
||
* #Bind 1 — --bg is Canvas White (#ffffff) per DESIGN.md §9. The
|
||
* warm-white reading the brand gives off comes from its
|
||
* olive/sand neutrals (#e5e5e0, #e0e0d9, #91918c), never
|
||
* from tinting the page background itself. --surface is
|
||
* Fog (#f6f6f3) — the warm light tier used for cards,
|
||
* search bars, and elevated containers; one subtle step
|
||
* warmer than the page so masonry pin cards earn a
|
||
* recognizable shape even without a border.
|
||
*
|
||
* #Bind 2 — --surface-warm is Sand Gray (#e5e5e0), Pinterest's
|
||
* warmest published surface — the secondary button
|
||
* background, the saved-pin chip background, the warm
|
||
* shelf behind clustered metadata (DESIGN.md §2 Surface).
|
||
*
|
||
* #Bind 3 — --fg is Plum Black (#211922), NOT pure black. DESIGN.md
|
||
* §7 explicitly forbids #000000 as primary text because
|
||
* Pinterest's near-black carries a plum/warm undertone
|
||
* that holds together with the olive neutrals. --fg-2
|
||
* binds to #000000 — the brand reserves pure black for
|
||
* button labels and high-emphasis secondary text only.
|
||
*
|
||
* #Bind 4 — --accent-on is #000000, not white. Pinterest's primary
|
||
* red button (#e60023) carries black text — DESIGN.md §4
|
||
* calls this out as "an unusual choice for contrast on
|
||
* red". White-on-red would over-saturate the canvas and
|
||
* read as alarm; black-on-red reads as confident, lifestyle-
|
||
* magazine punch. Honor the brand value over schema default.
|
||
*
|
||
* #Bind 5 — Radius scale follows the brand's signature generous
|
||
* soft-circle geometry. 12px (--radius-sm) is the brand's
|
||
* "Standard" radius for small chips and links; 16px
|
||
* (--radius-md) is the workhorse — every button, every
|
||
* input, every secondary card; 28px (--radius-lg) is the
|
||
* "Large" container radius for tab elements and hero
|
||
* panels. The brand also publishes a 20px "Comfortable"
|
||
* and a 40px "Hero" tier but those collapse into the
|
||
* shared md/lg slots without losing identity (§5).
|
||
*
|
||
* #Bind 6 — --focus-ring uses Focus Blue (#435ee5) at 30% opacity,
|
||
* NOT the schema's accent-tinted default. DESIGN.md §2
|
||
* binds focus to a dedicated blue (--comp-button-color-
|
||
* border-focus-outer-transparent: #435ee5) so the ring
|
||
* survives both the warm-red CTA fill and the warm-sand
|
||
* secondary surface — a red-tinted ring would disappear
|
||
* into Pinterest Red.
|
||
*
|
||
* #Bind 7 — --leading-body is 1.40 (DESIGN.md §3 Body) — tighter
|
||
* than the schema default 1.5 because Pinterest's
|
||
* information-dense pin grid pairs short body strings
|
||
* with image-first layouts; longer leading would shred
|
||
* the rhythm of pin metadata under photographs.
|
||
*
|
||
* #Bind 8 — --elev-raised is a plum-tinted whisper rather than a
|
||
* cool gray drop. DESIGN.md §6 commits to "minimal shadows
|
||
* — Pinterest is flat by design, depth from content".
|
||
* When a shadow is necessary (sticky panels, overlays),
|
||
* the tint matches the warm plum --fg so the elevation
|
||
* reads as part of the warm system instead of a cold
|
||
* halo.
|
||
*
|
||
* Brand-specific extensions: none in this revision. The Performance
|
||
* Purple (#6845ab) and Recommendation Purple (#7e238b) product-tier
|
||
* accents from DESIGN.md §2 stay inline at the tier-specific
|
||
* components that need them; promoting them to schema slots would
|
||
* encourage non-tier surfaces to reach for them.
|
||
* ─────────────────────────────────────────────────────────────────── */
|
||
|
||
:root {
|
||
/* ─── Surface (3 levels) ────────────────────────────────────────
|
||
* Canvas White is the page; Fog (#f6f6f3) is the warm light card
|
||
* tier; Sand Gray (#e5e5e0) is the warm secondary surface (the
|
||
* brand's named "secondary button" background). The neutrals lean
|
||
* olive/sand, never cool steel — that warmth is the identity. */
|
||
--bg: #ffffff;
|
||
--surface: #f6f6f3;
|
||
--surface-warm: #e5e5e0;
|
||
|
||
/* ─── Foreground ramp (4 levels) ────────────────────────────────
|
||
* Plum Black (#211922) carries every heading and primary body
|
||
* string — a warm near-black with a plum undertone. Pure black
|
||
* (#000000) is reserved for the secondary tier (button labels,
|
||
* high-contrast captions). Olive Gray (#62625b) is the muted
|
||
* description tone; Warm Silver (#91918c) is the disabled /
|
||
* metadata tone — also the brand's input-border color. */
|
||
--fg: #211922;
|
||
--fg-2: #000000;
|
||
--muted: #62625b;
|
||
--meta: #91918c;
|
||
|
||
/* ─── Border (2 levels) ─────────────────────────────────────────
|
||
* Pinterest is flat-by-design; borders appear sparingly. The
|
||
* default --border is the published "Border Disabled" tone
|
||
* (#c8c8c1) — soft, warm, doesn't compete with the photography.
|
||
* --border-soft is Warm Light (#e0e0d9), an even softer hairline
|
||
* for inner row separators. */
|
||
--border: #c8c8c1;
|
||
--border-soft: #e0e0d9;
|
||
|
||
/* ─── Accent ────────────────────────────────────────────────────
|
||
* Pinterest Red — the only brand accent, used for primary CTAs
|
||
* and the highest-signal brand moments. Cap at two visible uses
|
||
* per screen; when a third red element appears, neutralize one.
|
||
* Note that --accent-on is #000000 (not white): the brand's
|
||
* primary red button carries black text per DESIGN.md §4. */
|
||
--accent: #e60023;
|
||
--accent-on: #000000;
|
||
--accent-hover: color-mix(in oklab, var(--accent), black 8%);
|
||
--accent-active: color-mix(in oklab, var(--accent), black 14%);
|
||
|
||
/* ─── Semantic ──────────────────────────────────────────────────
|
||
* Error Red is the published Pinterest error value (DESIGN.md §2,
|
||
* #9e0a0a). Success and warn are not specified by the brand;
|
||
* they bind to desaturated warm values that survive the olive/
|
||
* sand canvas without competing with Pinterest Red. Keep total
|
||
* semantic-color pixels under five percent of any page. */
|
||
--success: #103c25; /* Green 700 — the brand's published green */
|
||
--warn: #c47700; /* burnt amber — warm-aligned, never tailwind yellow */
|
||
--danger: #9e0a0a; /* Error Red — DESIGN.md §2 */
|
||
|
||
/* ─── Typography — fonts ────────────────────────────────────────
|
||
* Pin Sans is the proprietary face that carries everything from
|
||
* 12px caption to 70px hero — no secondary display family, no
|
||
* monospace need beyond kbd. The fallback chain mirrors the
|
||
* brand's global stack including Japanese fallbacks
|
||
* (ヒラギノ角ゴ / メイリオ / MS Pゴシック) reflecting
|
||
* Pinterest's CJK reach. Display and body share the same stack
|
||
* — visual identity comes from the family itself. */
|
||
--font-display:
|
||
"Pin Sans", -apple-system, system-ui, "Segoe UI", Roboto, "Oxygen-Sans",
|
||
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", Ubuntu, Cantarell,
|
||
"Fira Sans", "Droid Sans", "Helvetica Neue", Helvetica,
|
||
"ヒラギノ角ゴ Pro W3", メイリオ, Meiryo, "MS Pゴシック", Arial,
|
||
sans-serif;
|
||
--font-body:
|
||
"Pin Sans", -apple-system, system-ui, "Segoe UI", Roboto, "Oxygen-Sans",
|
||
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", Ubuntu, Cantarell,
|
||
"Fira Sans", "Droid Sans", "Helvetica Neue", Helvetica,
|
||
"ヒラギノ角ゴ Pro W3", メイリオ, Meiryo, "MS Pゴシック", Arial,
|
||
sans-serif;
|
||
--font-mono:
|
||
ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Monaco,
|
||
Consolas, monospace;
|
||
|
||
/* ─── Typography — type scale (px) ──────────────────────────────
|
||
* Derived from DESIGN.md §3 Hierarchy. The system clusters
|
||
* tightly between 12 and 16px for app-like density, jumps to
|
||
* 28px for the published Section Heading, and explodes to 70px
|
||
* for the Display Hero — the dramatic gap is the brand's voice.
|
||
* The intermediate lg/xl/3xl tiers fill in the curve so generic
|
||
* components have somewhere to land. */
|
||
--text-xs: 12px; /* Caption — small tags, footer disclaimer */
|
||
--text-sm: 14px; /* Caption Bold — metadata, button labels */
|
||
--text-base: 16px; /* Body — standard reading, nav links */
|
||
--text-lg: 18px; /* H3 / featured body */
|
||
--text-xl: 22px; /* H2 / subsection title */
|
||
--text-2xl: 28px; /* Section Heading — DESIGN.md §3 */
|
||
--text-3xl: 44px; /* H1 — hero subtitles, large numerals */
|
||
--text-4xl: 70px; /* Display Hero — DESIGN.md §3 */
|
||
|
||
/* ─── Typography — leading & tracking ───────────────────────────
|
||
* Body leads at 1.40 per DESIGN.md §3 — tighter than the schema
|
||
* default 1.5 because Pinterest's pin metadata is short and
|
||
* sits under photography. Display headings carry negative
|
||
* tracking (DESIGN.md "-1.2px at 28px" → -0.02em scales evenly
|
||
* across the display sizes); body and caption hold at zero. */
|
||
--leading-body: 1.4;
|
||
--leading-tight: 1.15;
|
||
--tracking-display: -0.02em;
|
||
|
||
/* ─── Spacing — base scale ──────────────────────────────────────
|
||
* 8px base unit per DESIGN.md §5. The brand publishes off-grid
|
||
* sub-pixel values (5.5, 7, 10, 11, 22) for fine icon alignment;
|
||
* the shared scale stays on the standard 4px grid — off-grid
|
||
* spacing belongs inline at the component level. */
|
||
--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 ────────────────────────────────────────────
|
||
* DESIGN.md §5 commits to "Large jumps: 32px → 80px → 100px for
|
||
* section spacing". 80px is the desktop default — generous
|
||
* breathing room between content blocks; the pin grid itself
|
||
* stays dense within the block. 32px is the phone floor. */
|
||
--section-y-desktop: 80px;
|
||
--section-y-tablet: 48px;
|
||
--section-y-phone: 32px;
|
||
|
||
/* ─── Radius ────────────────────────────────────────────────────
|
||
* The brand's signature soft-circle geometry. 16px is the
|
||
* workhorse (every button, every input — DESIGN.md §4) and
|
||
* lands on --radius-md. 12px (--radius-sm) is the brand's
|
||
* "Standard" small-card radius; 28px (--radius-lg) is the brand
|
||
* "Large" container radius for tab elements and hero panels.
|
||
* --radius-pill (9999px) carries circular action buttons and
|
||
* avatars (DESIGN.md §5 "Circle: 50%"). */
|
||
--radius-sm: 12px;
|
||
--radius-md: 16px;
|
||
--radius-lg: 28px;
|
||
--radius-pill: 9999px;
|
||
|
||
/* ─── Elevation ─────────────────────────────────────────────────
|
||
* Pinterest is flat-by-design — most surfaces sit on the canvas
|
||
* with no shadow at all (DESIGN.md §6). When elevation is
|
||
* necessary (overlays, sticky panels), the shadow is a plum-
|
||
* tinted whisper rather than a cool gray drop — the warmth of
|
||
* the system carries through into the elevation. */
|
||
--elev-flat: none;
|
||
--elev-ring: 0 0 0 1px var(--border);
|
||
--elev-raised: 0 4px 16px rgba(33, 25, 34, 0.06);
|
||
|
||
/* ─── Focus ring ────────────────────────────────────────────────
|
||
* Focus Blue (#435ee5) at 30% opacity — the brand's published
|
||
* focus color (DESIGN.md §2 --comp-button-color-border-focus-
|
||
* outer-transparent). A blue ring survives both the warm-red
|
||
* primary CTA fill and the warm-sand secondary surface; an
|
||
* accent-tinted ring would vanish into Pinterest Red. */
|
||
--focus-ring: 0 0 0 3px color-mix(in oklab, #435ee5, transparent 70%);
|
||
|
||
/* ─── Motion ────────────────────────────────────────────────────
|
||
* DESIGN.md did not specify transition timings (static
|
||
* extraction scope). We bind defaults consistent with the
|
||
* brand's friendly tactile feel: 150ms for micro-states, 200ms
|
||
* for general state changes. Standard easing — short,
|
||
* purposeful, no overshoot. */
|
||
--motion-fast: 150ms;
|
||
--motion-base: 200ms;
|
||
--ease-standard: cubic-bezier(0.2, 0, 0, 1);
|
||
|
||
/* ─── Layout ────────────────────────────────────────────────────
|
||
* 1280px container — the standard magazine-y content width for
|
||
* hero, feature, and form sections. The masonry pin grid itself
|
||
* breathes wider on ultra-wide screens via its own column rules,
|
||
* but the shared container stays at 1280 because that is the
|
||
* geometry agents will most often generate (lifestyle landing
|
||
* pages, signup flows, marketing sections). Gutters tighten
|
||
* progressively per DESIGN.md §8 small-mobile clause. */
|
||
--container-max: 1280px;
|
||
--container-gutter-desktop: 32px;
|
||
--container-gutter-tablet: 24px;
|
||
--container-gutter-phone: 16px;
|
||
}
|