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>
182 lines
12 KiB
CSS
182 lines
12 KiB
CSS
/* ─────────────────────────────────────────────────────────────────────────
|
||
* design-systems/starbucks/tokens.css
|
||
*
|
||
* Structured token bindings for "Design System Inspired by Starbucks".
|
||
* Warm cream canvas, four-tier green system, full-pill buttons, whisper-
|
||
* soft layered shadows, and SoDoSans with universal -0.01em tracking.
|
||
*
|
||
* Key brand decisions encoded here:
|
||
* - Neutral Warm cream (#f2f0eb) as the page canvas — never pure white
|
||
* - Green Accent (#00754A) reserved for the primary CTA fill / Frap
|
||
* - Text Black at rgba(0, 0, 0, 0.87) to match the warm canvas temperature
|
||
* - Whisper-soft dual-shadow card elevation — never one heavy drop
|
||
* - Universal -0.01em tracking on SoDoSans across every surface
|
||
* - 9999px pill radius — every button is a full pill, no exceptions
|
||
* - Measured ease-out (0.25, 0.46, 0.45, 0.94) — the Starbucks expander
|
||
*
|
||
* No C-extensions: every token in this :root maps to a shared schema slot.
|
||
* ─────────────────────────────────────────────────────────────────── */
|
||
|
||
:root {
|
||
/* ─── Surface ─────────────────────────────────────────────────────
|
||
* Warm cream canvas: the brand never sits on cold white. Neutral
|
||
* Warm references café paper and store wood; Ceramic is the
|
||
* slightly warmer/darker step used for zone separators and
|
||
* partnership bands. White is reserved for the card surface so
|
||
* content cards feel like ceramic mugs on a wood table. */
|
||
--bg: #f2f0eb; /* Neutral Warm — primary page canvas */
|
||
--surface: #ffffff; /* White — content card / modal surface */
|
||
--surface-warm: #edebe9; /* Ceramic — zone separator, warmer tier */
|
||
|
||
/* ─── Foreground ──────────────────────────────────────────────────
|
||
* Text Black is 87%-opacity black, never pure #000 — it reads
|
||
* warmer on the cream canvas. Rewards Green (--fg-2) is the
|
||
* dustier slate-green used only on Rewards-page text blocks: a
|
||
* "reward surface" signal without reaching for Starbucks Green. */
|
||
--fg: rgba(0, 0, 0, 0.87); /* Text Black — primary heading + body */
|
||
--fg-2: #33433d; /* Rewards Green — dustier reading tier */
|
||
--muted: rgba(0, 0, 0, 0.58); /* Text Black Soft — secondary / metadata */
|
||
--meta: var(--muted); /* alias — single secondary text tier */
|
||
|
||
/* ─── Border ──────────────────────────────────────────────────────
|
||
* Input Border (#d6dbde) is the explicit DESIGN.md value for the
|
||
* outlined-rectangle Add-in / Milk / Customize fields. The soft
|
||
* tier is the nutrition-table hairline — quiet enough to row-
|
||
* separate without competing with the card edge. */
|
||
--border: #d6dbde; /* Input Border — outlined rectangle edge */
|
||
--border-soft: #e7e7e7; /* Nutrition-table row hairline */
|
||
|
||
/* ─── Accent ──────────────────────────────────────────────────────
|
||
* Green Accent (#00754A) is the CTA green — the brighter, more
|
||
* luminous tier in the four-tier green system. Reserved for the
|
||
* primary filled pill CTAs and the Frap floating circular order
|
||
* button. Starbucks Green (#006241) is the heading tier and stays
|
||
* inline on h1; House Green (#1E3932) is the feature-band /
|
||
* footer tier and stays inline at those surfaces. */
|
||
--accent: #00754A; /* Green Accent — primary CTA / Frap fill */
|
||
--accent-on: #ffffff;
|
||
--accent-hover: color-mix(in oklab, var(--accent), black 8%);
|
||
--accent-active: color-mix(in oklab, var(--accent), black 14%);
|
||
|
||
/* ─── Semantic ────────────────────────────────────────────────────
|
||
* Red (#c82014) is the explicit DESIGN.md error / destructive
|
||
* value. Yellow (#fbbc05) is the documented warning / legacy brand
|
||
* touch. Success has no brand-specific value in DESIGN.md — keep
|
||
* the schema default so it does not collide with the four-tier
|
||
* green system. */
|
||
--success: #16a34a;
|
||
--warn: #fbbc05; /* Yellow — DESIGN.md warning state */
|
||
--danger: #c82014; /* Red — DESIGN.md error / destructive */
|
||
|
||
/* ─── Typography — fonts ──────────────────────────────────────────
|
||
* SoDoSans is Starbucks' proprietary corporate typeface (licensed
|
||
* from House Industries; not publicly available). Display and body
|
||
* share the same stack — the visual identity comes from the
|
||
* universal -0.01em / -0.16px tracking, not from typeface mixing.
|
||
* Lander Tall (Rewards serif) and Kalam (Careers script) are
|
||
* context-specific and intentionally NOT promoted to schema
|
||
* slots — they stay inline at their respective surfaces. */
|
||
--font-display: SoDoSans, "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||
--font-body: SoDoSans, "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||
--font-mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Monaco, Consolas, monospace;
|
||
|
||
/* ─── Typography — type scale ─────────────────────────────────────
|
||
* DESIGN.md anchors at 1rem = 10px and uses semantic textSize-1
|
||
* through textSize-10. We bind the px values directly so the
|
||
* pasted :root works without the 62.5% root font-size trick.
|
||
* Hierarchy is carried by weight + color, not by size jumps —
|
||
* H1 and H2 share 24px (--text-xl), only weight (600 vs 400) and
|
||
* color (Starbucks-Green vs Text Black) separate them. */
|
||
--text-xs: 13px; /* Micro / text-1 — caption */
|
||
--text-sm: 14px; /* Small / text-2 — button, label */
|
||
--text-base: 16px; /* Body / text-3 — default body */
|
||
--text-lg: 19px; /* Body Large — hero intro copy */
|
||
--text-xl: 24px; /* H1 / H2 — shared by weight, not size */
|
||
--text-2xl: 32px; /* sub-heading bridge to hero */
|
||
--text-3xl: 45px; /* Hero Large / text-8 */
|
||
--text-4xl: 58px; /* Jumbo / text-9 — display ceiling */
|
||
|
||
/* ─── Typography — leading & tracking ─────────────────────────────
|
||
* Body leading 1.5, display leading 1.2 — the schema-standard
|
||
* two-mode rhythm. Tracking sits at -0.01em across the entire
|
||
* system: SoDoSans reads slightly compressed, which gives it its
|
||
* confident-but-friendly presence without feeling squeezed. */
|
||
--leading-body: 1.5;
|
||
--leading-tight: 1.2;
|
||
--tracking-display: -0.01em; /* universal — DESIGN.md letterSpacingNormal */
|
||
|
||
/* ─── Spacing ─────────────────────────────────────────────────────
|
||
* 4px grid. The brand's universal rhythm constant is 16px
|
||
* (--space-4) — the default outer gutter, card padding baseline,
|
||
* and body text size all share it. The off-grid Starbucks rem
|
||
* scale (4 / 8 / 16 / 24 / 32 / 40 / 48 / 56 / 64) maps cleanly
|
||
* to this schema with 12px and 20px filling the gaps. */
|
||
--space-1: 4px;
|
||
--space-2: 8px;
|
||
--space-3: 12px;
|
||
--space-4: 16px; /* universal rhythm — gutter, card pad, body */
|
||
--space-5: 20px;
|
||
--space-6: 24px;
|
||
--space-8: 32px;
|
||
--space-12: 48px;
|
||
|
||
/* ─── Section rhythm ──────────────────────────────────────────────
|
||
* 64px desktop / 48px tablet / 32px phone — generous breathing so
|
||
* the cream canvas can carry "plenty of space in the café". The
|
||
* brand never uses divider lines between sections; whitespace
|
||
* does the work. */
|
||
--section-y-desktop: 64px;
|
||
--section-y-tablet: 48px;
|
||
--section-y-phone: 32px;
|
||
|
||
/* ─── Radius ──────────────────────────────────────────────────────
|
||
* Two anchor values define the geometry: 12px on cards / modals
|
||
* (--cardBorderRadius), 9999px on every button (--buttonBorderRadius
|
||
* is 50px on the brand, but 9999px pills are visually identical at
|
||
* any reasonable height). 4px is reserved for outlined-rectangle
|
||
* inputs (Add-in / Milk / store availability). 16px stays as the
|
||
* larger-container tier for hero-photo frames. */
|
||
--radius-sm: 4px; /* outlined-rectangle inputs */
|
||
--radius-md: 12px; /* cards, modals — --cardBorderRadius */
|
||
--radius-lg: 16px; /* larger containers */
|
||
--radius-pill: 9999px; /* full pill — universal button radius */
|
||
|
||
/* ─── Elevation ───────────────────────────────────────────────────
|
||
* Whisper-soft layered shadows. The brand forbids a single heavy
|
||
* drop shadow; instead it stacks 2–3 low-alpha shadows with
|
||
* different offsets to simulate ambient + direct lighting. The
|
||
* --elev-raised value here is the canonical Starbucks card
|
||
* --cardBoxShadow (DESIGN.md §6). The Frap floating button gets
|
||
* its own stacked shadow inline at the component level. */
|
||
--elev-flat: none;
|
||
--elev-ring: 0 0 0 1px var(--border);
|
||
--elev-raised: 0 0 0.5px 0 rgba(0, 0, 0, 0.14), 0 1px 1px 0 rgba(0, 0, 0, 0.24);
|
||
|
||
/* ─── Focus ring ──────────────────────────────────────────────────
|
||
* Green-tinted ring built from --accent. DESIGN.md does not
|
||
* publish a brand-specific focus treatment, so we keep the
|
||
* schema's accent-tinted formula — Green Accent reads cleanly
|
||
* against the warm cream canvas and the white card surface. */
|
||
--focus-ring: 0 0 0 3px color-mix(in oklab, var(--accent), transparent 70%);
|
||
|
||
/* ─── Motion ──────────────────────────────────────────────────────
|
||
* 150ms for micro-states (the universal `transform: scale(0.95)`
|
||
* pressed-button rebound), 200ms for general state changes
|
||
* (DESIGN.md: `all 0.2s ease` on buttons). The standard easing
|
||
* curve is the Starbucks Expander cubic-bezier from DESIGN.md
|
||
* §4 — a measured ease-out rather than the schema's snappier
|
||
* default, giving accordions and disclosures a calm café cadence. */
|
||
--motion-fast: 150ms;
|
||
--motion-base: 200ms;
|
||
--ease-standard: cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
||
|
||
/* ─── Layout ──────────────────────────────────────────────────────
|
||
* Content caps at 1440px (--columnWidthXLarge per DESIGN.md §5).
|
||
* Gutters scale progressively: 40px desktop (--outerGutterLarge),
|
||
* 24px tablet (--outerGutterMedium), 16px phone (--outerGutter,
|
||
* the universal rhythm constant). */
|
||
--container-max: 1440px;
|
||
--container-gutter-desktop: 40px;
|
||
--container-gutter-tablet: 24px;
|
||
--container-gutter-phone: 16px;
|
||
}
|