open-design/design-systems/xiaohongshu/tokens.css
chaoxiaoche 336620e06f
feat(design-systems): add tokens.css + components.html for 10 consumer / hardware / cultural brands (#2033)
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>
2026-05-18 15:40:52 +08:00

193 lines
13 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/xiaohongshu/tokens.css
*
* Structured token bindings for "Design System Inspired by Xiaohongshu"
* (小红书 / RED) — the Chinese lifestyle UGC discovery platform.
*
* The visual baseline is *daily-ness*: a near-white masonry canvas that
* functions as a transparent picture frame for user-uploaded breakfasts,
* lipstick swatches, and hotel sofas. Brand red (`#FF2442`) is the
* single saturated voice the system permits — one accent per screen,
* never two. Neutrals are translucent overlays (`rgba(0,0,0, .05/.08/
* .27/.45/.62/.80)`) rather than discrete grey steps so the same fill
* lands believably on white card, photo, or sheet.
*
* Brand identity in three sentences:
* 1. Canvas is `#F5F5F5`; the white card (`#FFFFFF`) lifts above it
* by color contrast, not by elevation. Shadows are essentially
* absent — depth comes from rounding and spacing.
* 2. Type is PingFang SC throughout (no separate display face) with
* the documented Hiragino Sans GB / Microsoft YaHei / Noto Sans SC
* fallback chain so 标记我的生活 reads the same on macOS, Windows,
* and Linux. Tracking is zero everywhere; the heading scale caps
* at 32px per DESIGN.md §3 ("no 48/64 hero").
* 3. Brand red is the singular accent — used on CTAs, hearts, active
* tabs, and tag-on-trending. Danger has no independent token in
* RED's production system, so `--danger` aliases to the same red
* (DESIGN.md §2: "danger reuses --primary"). Skill authors should
* differentiate destructive intent via outline + leading icon when
* the difference matters.
*
* Schema decisions:
* - --bg: #f5f5f5 (canvas behind cards); --surface: #ffffff (card).
* - --surface-warm: #fafafa (info background, DESIGN.md --bg0-lighter).
* - --fg: rgba(0, 0, 0, 0.8) (title — soft black, never #000);
* --fg-2: rgba(0, 0, 0, 0.62) (paragraph); --muted: 0.45 (caption);
* --meta: rgba(0, 0, 0, 0.27) (disabled / placeholder).
* - --border: rgba(0, 0, 0, 0.08) (hairline separator);
* --border-soft: rgba(0, 0, 0, 0.05) (fill1 — group line).
* - --accent: #ff2442 (token red, default); --accent-hover: #ff2e4d
* (component-layer red — slightly pinker / lighter, doubles as the
* natural hover state for solid-fill primary CTAs).
* - --danger: #ff2442 (reuses brand red — DESIGN.md §2 explicit).
* - Font stacks lead with PingFang SC then the CJK fallback chain —
* RED is CJK-primary, so Latin fallbacks (`-apple-system`, etc.)
* come after.
* - Type scale ceiling at 32px (--text-4xl). DESIGN.md §3 forbids
* 48/64 hero type; --text-3xl bumps to 28px so the marketing
* hero has a usable intermediate above section headings.
* - --radius-md: 12px (feed card), --radius-lg: 16px (feature card),
* --radius-pill: 9999px (buttons are pill, always).
* - --elev-raised: 0 4px 12px rgba(0, 0, 0, 0.08) — DESIGN.md §6
* "Subtle (1)", used only on PC card hover in the live system.
* ─────────────────────────────────────────────────────────────────── */
:root {
/* ─── Surface ──────────────────────────────────────────────────────
* Canvas → Card → Subtle. The grey canvas IS the separation device
* for white cards; cards do not need shadows to feel lifted. */
--bg: #f5f5f5; /* Canvas — page background behind cards (DESIGN.md --bg0) */
--surface: #ffffff; /* Surface — the white card / modal (DESIGN.md --bg) */
--surface-warm: #fafafa; /* Subtle — information background (DESIGN.md --bg0-lighter) */
/* ─── Foreground ───────────────────────────────────────────────────
* Four translucent black tiers. Pure #000 is never used for text;
* even the title sits at 0.8 alpha so it reads as "soft black"
* against the white card. */
--fg: rgba(0, 0, 0, 0.8); /* Title — DESIGN.md --title */
--fg-2: rgba(0, 0, 0, 0.62); /* Paragraph — DESIGN.md --paragraph */
--muted: rgba(0, 0, 0, 0.45); /* Description — DESIGN.md --description */
--meta: rgba(0, 0, 0, 0.27); /* Disabled / placeholder — DESIGN.md --disabled */
/* ─── Border ───────────────────────────────────────────────────────
* Hairlines via alpha — the same line drops onto white card, onto
* photo, or onto a sheet without recoloring. No opaque grey borders
* by default. */
--border: rgba(0, 0, 0, 0.08); /* Separator hairline — DESIGN.md --separator */
--border-soft: rgba(0, 0, 0, 0.05); /* Fill1 — group / row line that should not visually compete */
/* ─── Accent ───────────────────────────────────────────────────────
* One saturated voice for the whole system. The hover slot maps to
* the documented component-layer red (#FF2E4D, slightly pinker /
* lighter) — the same divergence that appears on .reds-button-new
* .primary in production, repurposed as the natural hover state for
* a token-driven primary CTA. */
--accent: #ff2442; /* RED brand red (DESIGN.md --primary / --color-red) */
--accent-on: #ffffff; /* White text on red CTA */
--accent-hover: #ff2e4d; /* Component-layer red — slightly pinker; reads as a lift on hover */
--accent-active: #e6203a; /* Pressed — darker, more saturated red */
/* ─── Semantic ─────────────────────────────────────────────────────
* Success / warn lifted from DESIGN.md §2 (the platform's
* --success / --warning tokens; nearly invisible in the consumer
* flow but tokenized for B2B console contexts). Danger has no
* independent token in RED — it reuses --primary; aliasing here
* preserves that explicit DESIGN.md decision. */
--success: #02b940; /* DESIGN.md --success (#EAF8EF bg variant lives in components) */
--warn: #ff7d03; /* DESIGN.md --warning */
--danger: #ff2442; /* Reuses brand red — DESIGN.md §2 "danger reuses --primary" */
/* ─── Typography ───────────────────────────────────────────────────
* CJK-primary brand: PingFang SC leads, then the documented
* Hiragino Sans GB / Microsoft YaHei / Noto Sans SC chain, then
* the Apple/Helvetica Latin fallback. No separate display face —
* every Typography-FontFamily-* in production resolves to PingFang SC.
* --font-mono inherits the schema default (RED Number is intentionally
* NOT referenced here per DESIGN.md §3 — end users don't have it). */
--font-display: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", -apple-system, "Helvetica Neue", Helvetica, Arial, sans-serif;
--font-body: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", -apple-system, "Helvetica Neue", Helvetica, Arial, sans-serif;
--font-mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Monaco, Consolas, monospace;
/* Type scale — DESIGN.md §3 PC web tokens (h1=32 → c2=12).
* The ceiling is deliberately compact: DESIGN.md forbids 48/64 hero
* type, so --text-4xl tops out at 32px. --text-3xl interpolates at
* 28px so a marketing hero has visual lift above section headings. */
--text-xs: 12px; /* c2 — small caption */
--text-sm: 14px; /* b2 / t3 — body standard, secondary label */
--text-base: 16px; /* b1 / t2 — body large, the marketing reading size */
--text-lg: 18px; /* t1 — strong label */
--text-xl: 20px; /* h3 — card heading */
--text-2xl: 24px; /* h2 — section heading */
--text-3xl: 28px; /* intermediate display — between h1 and h2 */
--text-4xl: 32px; /* h1 — display ceiling (DESIGN.md "no 48/64 hero") */
/* Leading + tracking — DESIGN.md §3.
* Body rides on 1.5 (24px on 16px b1). Headings tighten to 1.25
* (40px on 32px h1). Tracking is 0 everywhere; only component-level
* Chinese overrides hand-tune -0.3 to -0.64px and that stays out
* of the token system. */
--leading-body: 1.5;
--leading-tight: 1.25;
--tracking-display: 0; /* DESIGN.md: "Every --Typography-Spacing-* token is 0" */
/* ─── Spacing ──────────────────────────────────────────────────────
* 8pt grid, stops 4 / 8 / 12 / 16 / 20 / 24 / 32 / 48 per DESIGN.md
* §5. Section-level gaps (48 / 64) live in the rhythm tier below. */
--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 ───────────────────────────────────────────────
* The masonry feed itself is dense (cards 710px apart) but section
* gaps on marketing surfaces breathe at 4864px desktop, stepping
* down to 32px on phone where vertical real estate is scarce. */
--section-y-desktop: 64px;
--section-y-tablet: 48px;
--section-y-phone: 32px;
/* ─── Radius ───────────────────────────────────────────────────────
* Generous everywhere: 8px on inputs and tags, 12px on feed cards,
* 16px on feature / hero cards, full pill on every button. The
* pill radius is functionally mandatory — a square-cornered CTA
* reads as wrong in this brand. */
--radius-sm: 8px; /* Inputs, tags, small chips */
--radius-md: 12px; /* Feed card (DESIGN.md §4 "Cards") */
--radius-lg: 16px; /* Larger feature card, bottom-sheet top corners */
--radius-pill: 9999px; /* Buttons — always */
/* ─── Elevation ────────────────────────────────────────────────────
* Three sanctioned levels, used sparingly. Default is flat — depth
* comes from canvas color contrast and rounding. The raised tier
* lands on PC card hover only; modal shadow is one-off on .modal
* and stays in components. */
--elev-flat: none;
--elev-ring: 0 0 0 1px var(--border);
--elev-raised: 0 4px 12px rgba(0, 0, 0, 0.08); /* DESIGN.md §6 "Subtle (1)" — PC card hover */
/* ─── Focus ────────────────────────────────────────────────────────
* Brand red at 30% opacity. The schema default formula works for
* the RED accent without override. */
--focus-ring: 0 0 0 3px color-mix(in oklab, var(--accent), transparent 70%);
/* ─── Motion ───────────────────────────────────────────────────────
* Standard durations. RED's interaction language is soft and quiet;
* no aggressive bouncing curves. Defaults are appropriate. */
--motion-fast: 150ms;
--motion-base: 200ms;
--ease-standard: cubic-bezier(0.2, 0, 0, 1);
/* ─── Layout ───────────────────────────────────────────────────────
* 1200px container width — comfortably wider than the note-detail
* two-pane (~1100px) for marketing surfaces. Phone gutter is tighter
* (12px) so the masonry feed runs nearly edge-to-edge per DESIGN.md
* §5 "Mobile Two-Column". */
--container-max: 1200px;
--container-gutter-desktop: 24px;
--container-gutter-tablet: 16px;
--container-gutter-phone: 12px;
}