mirror of
https://github.com/nexu-io/open-design.git
synced 2026-06-01 03:14:35 +07:00
Brands added (each with full 56-token :root + self-contained fixture): - Tier A (AI ecosystem): x-ai, perplexity, ollama, runwayml, minimax - Tier B (AI-adjacent devtools): supabase, posthog, resend, shadcn, raycast All 10 declare the complete shared schema (26 A1 + 26 A2 + 4 B-slot) with no C-extensions; pnpm guard reports 27 brand pairs aligned end-to-end. Co-authored-by: chaoxiaoche <chaoxiaoche@chaoxiaochedeMacBook-Pro.local> Co-authored-by: Cursor <cursoragent@cursor.com>
204 lines
12 KiB
CSS
204 lines
12 KiB
CSS
/* ─────────────────────────────────────────────────────────────────────────
|
||
* design-systems/runwayml/tokens.css
|
||
*
|
||
* Structured token bindings for the "Runway" brand — a cinematic,
|
||
* editorial-cinema dark canvas where photography (and AI-generated
|
||
* video) is the design and the chrome is intentionally invisible.
|
||
*
|
||
* Brand identity in three sentences:
|
||
* 1. Pure-black canvas (#000000) under bright pure-white type
|
||
* (#ffffff), with cool blue-gray neutrals (#767d88 / #7d848e)
|
||
* for the entire supporting text ramp — never warm gray.
|
||
* 2. Single typeface system: abcNormal at 400 / 450 / 500 / 600
|
||
* (no bold) handles everything from 48px display down to 11px
|
||
* uppercase tags. Hierarchy comes from size + case + tracking,
|
||
* not weight.
|
||
* 3. Zero shadows, near-invisible borders (#27272a hairline), and
|
||
* sharp 4–8px corners — depth comes from photographic content
|
||
* and dark-vs-light section alternation, never from CSS blur.
|
||
*
|
||
* Schema decisions:
|
||
* - --bg: #000000; --surface: #1a1a1a (dark card surface);
|
||
* --surface-warm: #030303 (the rarely-used third-tier dark, an
|
||
* "even darker" panel surface — this brand does not have a warm
|
||
* temperature, so the B-slot reads as a parallel cool tier).
|
||
* - --fg: #ffffff; --fg-2: #e9ecf2 (Cool Cloud — alt heading tone);
|
||
* --muted: #767d88 (Cool Slate); --meta: #7d848e (Mid Slate).
|
||
* - --border: #27272a (Border Dark); --border-soft: #1a1a1a (row
|
||
* separator that blends into the dark surface — "barely visible
|
||
* containment", per DESIGN.md §4).
|
||
* - --accent: #ffffff. Runway has no decorative accent color; the
|
||
* highest-signal surface in the system is pure white against
|
||
* black. Hover/active states dim toward Cool Cloud / Cool Silver
|
||
* rather than mixing in a hue.
|
||
* - --font-display / --font-body bind to abcNormal — DESIGN.md §3
|
||
* mandates a single typeface; Inter / DM Sans are documented
|
||
* external substitutes for the custom face.
|
||
* - --tracking-display: -0.025em (-1.2px at 48px hero per
|
||
* DESIGN.md §3 hierarchy table).
|
||
* - --leading-tight: 1.0 (film-title compression on display sizes);
|
||
* --leading-body: 1.4 (mid-range of the documented 1.30–1.50
|
||
* band — body text stays editorial-tight, never magazine-loose).
|
||
* - --section-y-desktop: 78px ("cinema-grade breathing" — the
|
||
* largest discrete step on the documented spacing scale).
|
||
* - --radius-sm: 4px (sharp / button); --radius-md: 8px (card,
|
||
* image); --radius-lg: 16px (alert containers only — DESIGN.md §4).
|
||
* - --elev-raised: none. The brand do/don't is explicit: zero
|
||
* shadows. We override the schema's blur fallback so any
|
||
* component that reaches for `var(--elev-raised)` produces no
|
||
* shadow, preserving the cinematic flat-vs-photographic depth
|
||
* model. --elev-ring stays available for the "alert container"
|
||
* case where a hairline ring substitutes for a border.
|
||
* - --container-max: 1600px (cinema-wide, per DESIGN.md §5 grid).
|
||
* ─────────────────────────────────────────────────────────────────── */
|
||
|
||
:root {
|
||
/* ─── Surface (3 levels) ──────────────────────────────────────────
|
||
* Dark-dominant. The canvas is true black; cards lift onto Dark
|
||
* Surface (#1a1a1a) without a shadow or border. --surface-warm is
|
||
* the schema's B-slot for a tertiary tier; runway has no warm
|
||
* temperature, so we bind it to Deep Black (#030303) — a parallel
|
||
* "even darker" panel used for layered dark containers. */
|
||
--bg: #000000; /* Runway Black — primary canvas */
|
||
--surface: #1a1a1a; /* Dark Surface — card / lifted container */
|
||
--surface-warm: #030303; /* Deep Black — third-tier layered panel */
|
||
|
||
/* ─── Foreground (4 levels) ───────────────────────────────────────
|
||
* Pure white anchors the ramp; Cool Cloud is a near-imperceptible
|
||
* alt for headings; the muted / meta tiers are the brand's
|
||
* signature cool-blue grays (never warm). */
|
||
--fg: #ffffff; /* Pure White — primary type, brand mark */
|
||
--fg-2: #e9ecf2; /* Cool Cloud — alt heading tone */
|
||
--muted: #767d88; /* Cool Slate — secondary body text */
|
||
--meta: #7d848e; /* Mid Slate — tertiary, metadata */
|
||
|
||
/* ─── Border (2 levels) ───────────────────────────────────────────
|
||
* Per DESIGN.md §4: "barely visible containment". --border is the
|
||
* single dark-mode border value; --border-soft blends almost into
|
||
* the card surface so row separators do not visually compete. */
|
||
--border: #27272a; /* Border Dark — alert / standard edge */
|
||
--border-soft: #1a1a1a; /* matches surface — inner row separator */
|
||
|
||
/* ─── Accent ──────────────────────────────────────────────────────
|
||
* Runway has no decorative color — DESIGN.md §2 is explicit ("None
|
||
* in the interface. Visual richness comes entirely from
|
||
* photographic content"). Pure white IS the brand's high-signal
|
||
* accent, used on CTA fills and the focus ring. Hover/active dim
|
||
* toward the cool-silver neutrals rather than mixing in any hue. */
|
||
--accent: #ffffff; /* Pure White — sole interface accent */
|
||
--accent-on: #000000; /* black type on white CTA fill */
|
||
--accent-hover: #e9ecf2; /* Cool Cloud — hover dim */
|
||
--accent-active: #c9ccd1; /* Cool Silver — pressed dim */
|
||
|
||
/* ─── Semantic ────────────────────────────────────────────────────
|
||
* Runway's UI does not surface state colors in its public surface;
|
||
* we inherit the schema defaults so any utility/admin chrome the
|
||
* fixture spawns still resolves. Keep semantic coverage <5% of any
|
||
* surface — this is not a brand color tier. */
|
||
--success: #16a34a;
|
||
--warn: #eab308;
|
||
--danger: #dc2626;
|
||
|
||
/* ─── Typography ──────────────────────────────────────────────────
|
||
* Single typeface commitment. DESIGN.md §3: "abcNormal handles
|
||
* every text role." We list the documented external substitutes
|
||
* (Inter, DM Sans) as the next layer of the fallback chain so the
|
||
* fixture renders predictably on machines without the custom face. */
|
||
--font-display: "abcNormal", "abcNormal Fallback", "Inter", "DM Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
|
||
--font-body: "abcNormal", "abcNormal Fallback", "Inter", "DM Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
|
||
--font-mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Monaco, Consolas, monospace;
|
||
|
||
/* Type scale — direct map of DESIGN.md §3 hierarchy table.
|
||
* 11px micro/tag (uppercase, weight 450) → --text-xs
|
||
* 13px small description → --text-sm
|
||
* 16px body / button → --text-base
|
||
* 20px feature title → --text-lg
|
||
* 24px card title → --text-xl
|
||
* 36px sub-heading → --text-2xl
|
||
* 40px section heading → --text-3xl
|
||
* 48px display / hero → --text-4xl */
|
||
--text-xs: 11px;
|
||
--text-sm: 13px;
|
||
--text-base: 16px;
|
||
--text-lg: 20px;
|
||
--text-xl: 24px;
|
||
--text-2xl: 36px;
|
||
--text-3xl: 40px;
|
||
--text-4xl: 48px;
|
||
|
||
/* Leading + tracking.
|
||
* --leading-tight: 1.0 → film-title compression on display sizes.
|
||
* --leading-body: 1.4 → mid-range of DESIGN.md's documented
|
||
* 1.30–1.50 body band; intentionally editorial-tight.
|
||
* --tracking-display: -0.025em → -1.2px at 48px hero per
|
||
* DESIGN.md §3 hierarchy table. */
|
||
--leading-body: 1.4;
|
||
--leading-tight: 1.0;
|
||
--tracking-display: -0.025em;
|
||
|
||
/* ─── Spacing ─────────────────────────────────────────────────────
|
||
* 8px base unit per DESIGN.md §5 — the schema's 4px-grid scale
|
||
* maps cleanly. Runway's documented scale (4/6/8/12/16/20/24/28/
|
||
* 32/48/64/78) lands on every required step except 6/28/64/78,
|
||
* which live inline in components (no token name needed). */
|
||
--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 — "cinema-grade breathing". 78px on desktop is
|
||
* the largest discrete step on the documented scale, creating the
|
||
* scrolling-between-scenes pacing called out in DESIGN.md §5. */
|
||
--section-y-desktop: 78px;
|
||
--section-y-tablet: 48px;
|
||
--section-y-phone: 32px;
|
||
|
||
/* ─── Radius ──────────────────────────────────────────────────────
|
||
* DESIGN.md §5 documents four tiers: 4px sharp (buttons), 6–8px
|
||
* comfortable (containers/images), 16px generous (alerts). The
|
||
* pill tier is preserved at the schema default — Runway forbids
|
||
* pill-shaped UI ("Don't use pill-shaped radius"), so the token
|
||
* exists purely so cross-brand components resolve cleanly. */
|
||
--radius-sm: 4px;
|
||
--radius-md: 8px;
|
||
--radius-lg: 16px;
|
||
--radius-pill: 9999px;
|
||
|
||
/* ─── Elevation ───────────────────────────────────────────────────
|
||
* DESIGN.md §6 is explicit: "Runway uses zero shadows." We honor
|
||
* that by overriding --elev-raised to `none` (depth comes from
|
||
* dark/light section alternation and photographic depth of field,
|
||
* never from CSS blur). --elev-ring remains as a hairline ring so
|
||
* the documented "alert container" case still has a treatment. */
|
||
--elev-flat: none;
|
||
--elev-ring: 0 0 0 1px var(--border);
|
||
--elev-raised: none;
|
||
|
||
/* ─── Focus ───────────────────────────────────────────────────────
|
||
* White ring on dark canvas — the only chromatic affordance the
|
||
* brand permits. 60% transparency keeps the ring readable without
|
||
* looking like a fill. */
|
||
--focus-ring: 0 0 0 2px color-mix(in oklab, var(--accent), transparent 60%);
|
||
|
||
/* ─── Motion ──────────────────────────────────────────────────────
|
||
* Slightly slower base than the schema default — cinematic pacing
|
||
* favors deliberate state changes over instant snap. Easing stays
|
||
* on the standard curve so micro-interactions still feel
|
||
* mechanical-precise rather than springy. */
|
||
--motion-fast: 150ms;
|
||
--motion-base: 220ms;
|
||
--ease-standard: cubic-bezier(0.2, 0, 0, 1);
|
||
|
||
/* ─── Layout ──────────────────────────────────────────────────────
|
||
* Cinema-wide container — DESIGN.md §5: "up to 1600px". Gutters
|
||
* progressively shrink from 48px desktop → 16px phone so the
|
||
* full-bleed photography hero can stay edge-to-edge. */
|
||
--container-max: 1600px;
|
||
--container-gutter-desktop: 48px;
|
||
--container-gutter-tablet: 24px;
|
||
--container-gutter-phone: 16px;
|
||
}
|