Files
workbuddy_skills/open-design/design-systems/x-ai/tokens.css
T
admin 5afeb6b78a ④段整套同步(六节 + P/S/F/J + 模板)+ open-design 移到技能根
一、④段整套同步(用户选候选 A)
- 新增 `references/stage-proto-doc/assets/产品文档模板.html`(16 KB/247 行,从备份拷、转 LF)。
- ④段 SKILL.md 换成备份 15:28 那版,并按模板口径改齐:
  · 「产品文档框架」从「四块+一附录」改成**六节** —— 页面结构/功能清单/使用场景/操作流程/
    跨页与界面状态/待确认与偏离;与模板同构,⛔ 不从空白页重写结构。
  · 编号从 R/S/F 改成 **P 页面/S 场景/F 功能/J 二级功能**,各自唯一、按展示顺序通排。
  · 保留旧版有价值的要求:每项功能补齐 做什么/入口在哪/输入边界/异常与恢复;重点功能三处标红;
    横向流程图每步写清页面/功能/操作/完成判据。
  · 完成标准「七节」→「六节」,自查清单同步换掉「需求」那批条目,补模板与配图两条。
  · 路径 `designs/<项目>/` → `docs/pm/<项目>/ui/`(2 处)。
  · 补回本机那条「每份产出文档开头都要有一张图」的引用(指向主 skill,段内不复述)。
- 主 skill 同步:四段结构表④行、④段沿革、画图小节(④段画页面结构图 + 用户路径)。

二、open-design 移到技能根(用户选候选 A)
- `git mv product-planning/references/stage-delivery/assets/open-design → open-design/`(4178 文件)。
- `.gitignore` 白名单加 `!/open-design/` —— 否则移出去就不再纳入版本控制。
- 引用改 11 处:路径形态 `assets/open-design/...` → `<技能根>/open-design/...`;
  「随段携带的自带件」改称「同根技能」;「路径怎么找」那条改成自带件(段内相对路径)与
  同根技能(`<技能根>/<技能名>/`)两类分开写。
- open-design 自己的 ATTRIBUTION.md 两处同步(它现在与 oil-ui-pro 同层)。
- 副作用(有益):命名闸门读数由 2063 降到 225 —— 此前它把 open-design 里 919 个第三方 md
  当成规则一起扫了;现在只扫本包 23 个 md。已确认④段的 H1 与 4a/4b/4c 子步仍在检查范围内。

三、验收
- check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 225 / 失败 0 / 提示 27。
- 活文件里 `assets/open-design` 残留 0;工作区 CRLF 文件 0。
2026-10-15 21:17:28 +08:00

269 lines
16 KiB
CSS
Raw 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/x-ai/tokens.css
*
* Structured token bindings for "x-ai" — the dark-first, monospace-driven
* brutalist minimalism of Elon Musk's AI lab. A design system that
* communicates through absence: pure white on warm near-black, GeistMono
* as the display voice, zero shadows, zero gradients, zero accent color.
* Restraint as sophistication.
*
* Brand identity in three sentences:
* 1. Dark-first canvas at #1f2228 (warm near-black with a subtle blue
* undertone, NEVER pure #000000) carries pure-white text as "the
* voice", with hierarchy expressed through opacity (100 / 70 / 50 / 30)
* rather than hue. There is no gray middle ground.
* 2. GeistMono runs at display sizes (up to a hero-only 320px at weight
* 300) and as the uppercase, letter-spaced button face. universalSans
* handles body and section headings. The monospace-as-display choice
* is the brand: terminal aesthetic as luxury.
* 3. Zero box-shadows, zero gradients, near-zero radii (0px default,
* 4px occasional softening). Depth comes from opacity-based borders
* and surface tints, not from simulated light. The single chromatic
* exception is the keyboard focus ring (Tailwind's default blue).
*
* Brand-specific schema decisions (each bends a schema convention to
* match xAI's voice rather than the cross-brand default):
*
* 1. `--bg` is `#1f2228`, NOT `#000000`. DESIGN.md §2 names this hue
* explicitly: "This specific hue prevents the harsh eye strain of
* `#000000` while maintaining deep darkness." Pure black is
* forbidden by the brand.
*
* 2. `--accent` is `#ffffff`, not a chromatic color. xAI has no
* accent palette — white IS the chromatic move. Primary CTAs render
* with `var(--accent)` as background and `var(--accent-on)` as
* foreground, producing the signature white-on-dark button. The
* "≤2 accent uses per screen" lint still holds; the primary CTA and
* the focus indicator are the only places white reverses against
* the canvas.
*
* 3. `--font-display` is a GeistMono stack. Monospace AS the display
* face is the defining aesthetic decision (DESIGN.md §3) — it
* positions xAI not as a consumer product but as infrastructure,
* as something built by people who live in terminals. `--font-mono`
* aliases the same stack because GeistMono IS the monospace face
* used for code, kbd, and tabular metrics.
*
* 4. The four-level foreground ramp is opacity-based (rgba 1.0 / 0.7
* / 0.5 / 0.3), NOT a grayscale hex ramp. DESIGN.md §2 documents
* the system literally as "white at α". Binding `--fg-2`, `--muted`,
* and `--meta` as `rgba(255,255,255,α)` preserves the "white over
* canvas" voice and keeps the tiers chromatically locked to the
* single foreground color.
*
* 5. `--border` is `rgba(255, 255, 255, 0.1)` — DESIGN.md §2's default
* "Border Default" alpha, NOT a solid hex. `--border-soft` drops to
* 0.05 for inner-row separators. The 0.2 "Border Strong" tier from
* DESIGN.md lives inline per-component (hover/active state edges).
*
* 6. Radii are aggressively small: 0 / 0 / 4 / 9999. DESIGN.md §5:
* "The near-zero radius philosophy is core to the brand's brutalist
* identity." Buttons, inputs, and cards all default to 0px;
* `--radius-lg` softens to 4px for the rare secondary container
* (DESIGN.md's "Subtle (4px) occasional"). `--radius-pill` stays at
* 9999px because the schema slot requires a pill value, even though
* xAI rarely renders one.
*
* 7. `--elev-raised` is literally `none`. DESIGN.md §6: "xAI rejects
* the conventional shadow-based elevation system entirely. There
* are no box-shadows anywhere on the site." Depth is communicated
* through three other mechanisms documented in the same section:
* opacity-based borders that brighten on interaction, subtle
* background-opacity shifts (0.03 → 0.08), and the massive
* typographic scale contrast. `--elev-ring` is kept as a hairline
* border-as-shadow so components that target the elevation token
* still get a visible edge.
*
* 8. `--focus-ring` is the ONLY chromatic exception to the otherwise
* strictly monochromatic palette. DESIGN.md §2 names Tailwind's
* default `--tw-ring-color` (`rgb(59, 130, 246) / 0.5`) as the
* keyboard focus indicator. We reproduce it as a 3px halo
* (Tailwind's `ring-2` shape) — the blue is intentional and
* non-negotiable for a11y, even though the rest of the system is
* achromatic.
*
* 9. The type scale tops out at 64px (`--text-4xl`), NOT the 320px
* hero display DESIGN.md §3 names. 320px is a hero-only treatment,
* not a token tier — components.html overrides `font-size` inline
* for that one cinematic moment. Reserving `--text-4xl` at 64px
* keeps the slot useful as the H1-equivalent ceiling for cards,
* sections, and modals across the system. (See vercel/tokens.css
* §6 for the same reasoning: tokens encode reusable tiers, not
* one-off hero crops.)
*
* 10. `--tracking-display` stays `normal`. GeistMono at display scale
* does NOT compress letter-spacing — the monospace grid is part of
* the aesthetic and tightening would collapse it. The uppercase
* button tracking (`1.4px`, DESIGN.md §4) is an interaction-specific
* value that lives inline on `.btn` since it applies only to
* command-line-styled labels, not display headlines.
*
* Source contracts:
* - Standard token names: design-systems/_schema/tokens.schema.ts
* - A2 fallback parity: design-systems/_schema/defaults.css
* - Lint enforcement: apps/daemon/src/lint-artifact.ts
*
* Keep this file additive: never invent token names not also documented
* in DESIGN.md or the shared schema. The GeistMono and universalSans
* faces are referenced by name only — artifacts that render acceptably
* fall back to the OS monospace and sans-serif stacks listed inside the
* font-family declarations.
* ─────────────────────────────────────────────────────────────── */
:root {
/* ─── Surface ─────────────────────────────────────────────────────
* #1f2228 is the singular canvas — warm near-black with a subtle
* blue undertone. `--surface` is the barely-visible 0.03 white tint
* that cards sit on; `--surface-warm` rises to 0.05 for hover and
* elevated rows. DESIGN.md §6's elevation ramp uses both values
* verbatim as "Surface (Level 1)" and "Surface Hover". */
--bg: #1f2228; /* warm near-black canvas — NEVER #000 */
--surface: rgba(255, 255, 255, 0.03); /* subtle card surface */
--surface-warm: rgba(255, 255, 255, 0.05); /* hover / elevated tier */
/* ─── Foreground ──────────────────────────────────────────────────
* Four-level opacity ramp per DESIGN.md §2. Pure white is "the
* voice"; subsequent tiers express hierarchy by dimming rather
* than by hue. Binding as rgba (not hex) keeps the ramp locked
* chromatically to the single foreground color. */
--fg: #ffffff; /* primary — headings, links, body */
--fg-2: rgba(255, 255, 255, 0.7); /* secondary — descriptions */
--muted: rgba(255, 255, 255, 0.5); /* tertiary — captions, timestamps */
--meta: rgba(255, 255, 255, 0.3); /* quaternary — disabled, annotations */
/* ─── Border ──────────────────────────────────────────────────────
* Opacity-based borders — barely visible, never absent. 0.1 is the
* default card / divider edge; 0.05 is the inner-row separator
* that should not visually compete. The 0.2 "strong" tier from
* DESIGN.md §2 lives inline per-component (hover/active states). */
--border: rgba(255, 255, 255, 0.1); /* default card / divider */
--border-soft: rgba(255, 255, 255, 0.05); /* inner row separator */
/* ─── Accent ──────────────────────────────────────────────────────
* White IS the accent. There is no chromatic color in xAI's
* monochromatic palette — primary CTAs are white-on-dark.
* `--accent-hover` dims to 0.9 alpha per DESIGN.md §4 (primary
* button hover); `--accent-active` drops a further step. The
* convention is REVERSED from most systems: hover dims, it does
* not brighten. */
--accent: #ffffff; /* the voice as bg */
--accent-on: #1f2228; /* canvas as fg on accent */
--accent-hover: rgba(255, 255, 255, 0.9); /* slight dimming on hover (DESIGN.md §4) */
--accent-active: rgba(255, 255, 255, 0.8); /* deeper dim on press */
/* ─── Semantic ────────────────────────────────────────────────────
* DESIGN.md §7 actively discourages colored status indicators
* ("Don't use colored status indicators unless absolutely
* necessary — keep everything in the white/dark spectrum"). We
* inherit schema defaults so the slots remain useful for the rare
* cases where status truly must render chromatically — but
* components should prefer monochrome cues (opacity, weight). */
--success: #16a34a;
--warn: #eab308;
--danger: #dc2626;
/* ─── Typography — fonts ──────────────────────────────────────────
* GeistMono is the brand's defining typographic decision: a
* monospace face used at display sizes. universalSans handles
* body and section headings. `--font-mono` aliases the display
* stack because GeistMono IS the monospace face — there is no
* separate code typeface. */
--font-display: "GeistMono", ui-monospace, "SF Mono", "Roboto Mono", Menlo, Monaco, "Liberation Mono", "DejaVu Sans Mono", "Courier New", monospace;
--font-body: "universalSans", "universalSans Fallback", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
--font-mono: "GeistMono", ui-monospace, "SF Mono", "Roboto Mono", Menlo, Monaco, "Liberation Mono", "DejaVu Sans Mono", "Courier New", monospace;
/* Type scale — DESIGN.md §3 hierarchy table.
* The 320px display hero is intentionally NOT a token tier;
* components.html overrides `font-size` inline for that one
* cinematic treatment. `--text-4xl` instead caps at 64px, the
* realistic ceiling for marketing H1s across cards/sections.
* `--text-2xl` (30px) matches DESIGN.md's "Section Heading" tier. */
--text-xs: 12px; /* small / meta — timestamps, footnotes */
--text-sm: 14px; /* button label / caption */
--text-base: 16px; /* body — universalSans 1.5 */
--text-lg: 20px; /* body large / introductions */
--text-xl: 24px; /* card title */
--text-2xl: 30px; /* section heading — DESIGN.md §3 */
--text-3xl: 40px; /* H1 */
--text-4xl: 64px; /* display ceiling (320px hero is inline-only) */
/* Leading + tracking.
* `--leading-body: 1.5` is universalSans body (DESIGN.md §3).
* `--leading-tight: 1.2` matches the 30px section heading.
* `--tracking-display: normal` because GeistMono at scale does
* NOT compress letter-spacing — the monospace grid is the
* aesthetic and tightening would collapse it. */
--leading-body: 1.5;
--leading-tight: 1.2;
--tracking-display: normal;
/* ─── Spacing ─────────────────────────────────────────────────────
* DESIGN.md §5 documents a deliberately sparse scale concentrated
* at the small end: 4 / 8 / 24 / 48. We bind the full schema slot
* range — components reach for 1/2/6/12 most often; the
* intermediate tiers are preserved for edge cases where a
* narrower step is structurally required. */
--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: "generous section padding 48px–
* 96px". 96 desktop / 64 tablet / 48 phone preserves the
* cinematic emptiness that is itself a design statement; the
* absence of decoration means whitespace is the primary structural
* tool. */
--section-y-desktop: 96px;
--section-y-tablet: 64px;
--section-y-phone: 48px;
/* ─── Radius ──────────────────────────────────────────────────────
* Brutalist precision. DESIGN.md §5: "Sharp (0px) primary
* treatment for buttons, cards, inputs — the default. Subtle (4px)
* occasional softening on secondary containers." `--radius-pill`
* stays at 9999px because the schema slot requires a pill value,
* even though xAI rarely renders one. */
--radius-sm: 0px; /* buttons, inputs — sharp */
--radius-md: 0px; /* cards — sharp */
--radius-lg: 4px; /* occasional secondary softening */
--radius-pill: 9999px; /* schema-required slot */
/* ─── Elevation ───────────────────────────────────────────────────
* Shadow-free system per DESIGN.md §6: "xAI rejects the
* conventional shadow-based elevation system entirely. There are
* no box-shadows anywhere on the site." `--elev-raised` is
* literally `none`; depth comes from opacity-based borders and
* background tints. `--elev-ring` preserves the hairline edge for
* components that read the elevation token. */
--elev-flat: none;
--elev-ring: 0 0 0 1px var(--border);
--elev-raised: none;
/* ─── Focus ───────────────────────────────────────────────────────
* The single chromatic exception. Tailwind's default
* `--tw-ring-color` (DESIGN.md §2 "Ring Blue") at 50% opacity, as
* a 3px halo matching the `ring-2` shape xAI uses for keyboard
* accessibility focus states. Non-negotiable for a11y. */
--focus-ring: 0 0 0 3px rgba(59, 130, 246, 0.5);
/* ─── Motion ──────────────────────────────────────────────────────
* Schema defaults. xAI does not choreograph — transitions are
* short, purposeful, utilitarian. No long-form entrances. */
--motion-fast: 150ms;
--motion-base: 200ms;
--ease-standard: cubic-bezier(0.2, 0, 0, 1);
/* ─── Layout ──────────────────────────────────────────────────────
* DESIGN.md §5: "Max content width: approximately 1200px." Gutters
* narrow on mobile so the dense-but-deliberate vertical rhythm
* keeps reading even when the dark canvas reaches the edge. */
--container-max: 1200px;
--container-gutter-desktop: 24px;
--container-gutter-tablet: 16px;
--container-gutter-phone: 12px;
}