/* ───────────────────────────────────────────────────────────────────────── * design-systems/wechat/tokens.css * * Structured token bindings for "WeChat" (微信) — Tencent's all-in-one * social, payment, and mini-program super-app. The visual language is * a quiet, light-friendly consumer canvas built around one decisive * signal: WeChat Green (#07C160). Everything else recedes so green * carries the brand — CTAs, success states, active tab, focus ring. * Bilingual CJK-aware typography (PingFang SC, Hiragino Sans GB, * Microsoft YaHei, Noto Sans SC) keeps English and 中文 on the same * vertical rhythm so chat rows, page titles, and mini-program cards * align in either script without per-language overrides. * * Brand identity in three sentences: * 1. The canvas is the muted #EDEDED chat-list gray, not pure white — * this is the colour every WeChat user has stared at for a decade. * Surfaces (#F7F7F7) lift one tone above it. Pure white belongs to * incoming chat bubbles, not pages. * 2. Brand green #07C160 is the only accent. Hover (#10B160) and * pressed (#059050) come straight from the platform spec; the same * green doubles as the success state because in WeChat green *is* * "good / done / sent / paid". * 3. Type is mobile-first and dense: 15px body at 1.6 line-height, * 18px page titles, 11px timestamps. The display ladder (24 → 32 * → 48px) is deliberately modest — WeChat's marketing voice * ("微信,是一个生活方式") is understated, not billboard-loud. * * Schema decisions: * - --bg: #ededed (chat-list gray, DESIGN.md §UI Neutrals). * - --surface: #f7f7f7 (card / sheet lift on bg). * - --surface-warm: var(--surface) — single surface tier. * - --fg: #1a1a1a (ink); --fg-2 alias — DESIGN.md has one text tier. * - --muted: #888888 (secondary + timestamps); * --meta: var(--muted) — DESIGN.md does not separate the tier. * - --border: #e0e0e0; --border-soft alias — single border weight. * - --accent: #07c160 + hover #10b160 + active #059050 (DESIGN.md). * - --success: #07c160 (brand-as-success — green is "done" in WeChat). * - --warn: #fab702; --danger: #fa5151 (DESIGN.md functional palette). * - --font-display / --font-body: identical apple-system + CJK stack. * DESIGN.md uses a single family across the app; bilingual users get * PingFang SC → Hiragino Sans GB → Microsoft YaHei → Noto Sans SC * fallbacks so 中文 renders crisply on macOS, iOS, Windows and Linux. * - Type scale: 11 / 13 / 15 / 16 / 18 / 24 / 32 / 48 — mobile-first * chat ladder extended with a modest 48px hero for marketing pages. * - --leading-body: 1.6 (DESIGN.md body, generous for CJK density). * - Radius: 4 / 8 / 16 / pill (DESIGN.md §Border Radius). * - Motion: 100ms hover, 200ms message-entry, cubic-bezier(0.25, 0.1, * 0.25, 1) — DESIGN.md §Motion (instant + fast + ease-default). * ─────────────────────────────────────────────────────────────────── */ :root { /* ─── Surface ────────────────────────────────────────────────────── * Light-friendly canvas: the muted #EDEDED chat-list gray is the * WeChat user's home colour. Surfaces lift one tone above it. */ --bg: #ededed; /* chat-list gray — primary canvas */ --surface: #f7f7f7; /* card / sheet lift on bg */ --surface-warm: var(--surface); /* alias — single surface tier */ /* ─── Foreground ─────────────────────────────────────────────────── * One ink, one secondary. DESIGN.md does not separate dark / warm * tiers, so --fg-2 and --meta alias their siblings. */ --fg: #1a1a1a; /* ink — primary text */ --fg-2: var(--fg); /* alias — single text weight */ --muted: #888888; /* secondary + timestamps */ --meta: var(--muted); /* alias — same gray for metadata */ /* ─── Border ─────────────────────────────────────────────────────── * Dividers are quiet — most cards are defined by background contrast, * not borders. When borders appear, they are the same hairline gray. */ --border: #e0e0e0; /* card / row edge */ --border-soft: var(--border); /* alias — no inner separator tier */ /* ─── Accent ─────────────────────────────────────────────────────── * WeChat Green is the single load-bearing colour. Hover and active * are taken verbatim from DESIGN.md so primary buttons feel native. */ --accent: #07c160; /* WeChat green — primary brand */ --accent-on: #ffffff; --accent-hover: #10b160; /* DESIGN.md primary hover */ --accent-active: #059050; /* DESIGN.md primary pressed */ /* ─── Semantic ───────────────────────────────────────────────────── * Green doubles as success because in WeChat green *is* "done / paid / * sent". Warning + danger come straight from DESIGN.md §Functional. */ --success: #07c160; /* brand-as-success — paid / done */ --warn: #fab702; /* DESIGN.md warning orange */ --danger: #fa5151; /* DESIGN.md error red */ /* ─── Typography ─────────────────────────────────────────────────── * Single bilingual stack across display + body. -apple-system first * for SF / SF Pro on Apple platforms; PingFang SC + Hiragino Sans GB * + Microsoft YaHei + Noto Sans SC keep 中文 crisp on macOS, iOS, * Windows and Linux respectively. Helvetica Neue / Helvetica / Arial * close the Latin tail. */ --font-display: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", "Helvetica Neue", Helvetica, Arial, sans-serif; --font-body: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", "Helvetica Neue", Helvetica, Arial, sans-serif; --font-mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Monaco, Consolas, monospace; /* Type scale — DESIGN.md §Typography is mobile-first (11–18px). The * top three tiers (24 / 32 / 48px) extend the ladder for marketing * pages while staying understated — WeChat does not shout. */ --text-xs: 11px; /* caption / timestamp */ --text-sm: 13px; /* secondary text */ --text-base: 15px; /* body — WeChat default */ --text-lg: 16px; /* section header / button label */ --text-xl: 18px; /* page title */ --text-2xl: 24px; /* feature heading */ --text-3xl: 32px; /* H2 — section title */ --text-4xl: 48px; /* display hero — modest by design */ /* Leading + tracking. * 1.6 body line-height (DESIGN.md) gives Chinese characters generous * air; 1.3 tight line-height matches the page-title spec. Display * tracking compresses one notch — works for both Latin and CJK. */ --leading-body: 1.6; --leading-tight: 1.3; --tracking-display: -0.01em; /* ─── Spacing ────────────────────────────────────────────────────── * 4px base unit, DESIGN.md §Spacing System. The schema's --space-5 * (20px) and --space-12 (48px) fill in tiers DESIGN.md does not name * but the layout grid needs. */ --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 ─────────────────────────────────────────────── * Phone-first product — desktop rhythm stays modest (72px) and * collapses to 32px on phones to keep chat-row density on small * screens. */ --section-y-desktop: 72px; --section-y-tablet: 48px; --section-y-phone: 32px; /* ─── Radius ─────────────────────────────────────────────────────── * DESIGN.md §Border Radius: 4 / 8 / 16 / pill. (The brand-specific * --radius-bubble lives in DESIGN.md but is component-local — chat * bubbles re-derive it inline so it does not enter the shared schema.) */ --radius-sm: 4px; --radius-md: 8px; --radius-lg: 16px; --radius-pill: 9999px; /* ─── Elevation ──────────────────────────────────────────────────── * Whisper-quiet shadow lifted from DESIGN.md's incoming-bubble spec * (0 1px 2px rgba(0,0,0,0.06)). WeChat surfaces almost never float; * when they do, the shadow is barely perceptible. */ --elev-flat: none; --elev-ring: 0 0 0 1px var(--border); --elev-raised: 0 1px 2px rgba(0, 0, 0, 0.06); /* ─── Focus ──────────────────────────────────────────────────────── * Green-tinted ring keeps the brand voice consistent on keyboard * focus across inputs, buttons, and links. */ --focus-ring: 0 0 0 3px color-mix(in oklab, var(--accent), transparent 70%); /* ─── Motion ─────────────────────────────────────────────────────── * DESIGN.md §Motion: 100ms hover, 200ms chat-message entry. Easing * is the platform default (cubic-bezier(0.25, 0.1, 0.25, 1)) — the * classic browser "ease", chosen for muscle-memory familiarity. */ --motion-fast: 100ms; --motion-base: 200ms; --ease-standard: cubic-bezier(0.25, 0.1, 0.25, 1); /* ─── Layout ─────────────────────────────────────────────────────── * 1200px container fits WeChat's marketing-site pattern; phone * gutters stay at 16px to match the chat row inset. */ --container-max: 1200px; --container-gutter-desktop: 24px; --container-gutter-tablet: 16px; --container-gutter-phone: 16px; }