Author the design language once in the canonical React designbook and project it
one-way onto each stack: React -> designbook/ -> ir/ -> adapters/<stack>/.
Phase 0 — contracts & governance (T01-T03):
- ir/SCHEMA.md + ir/schema/{component,tokens}.schema.json — neutral IR contract
(W3C DTCG tokens; React prop -> HTML attribute mapping; non-portable props flagged).
- adapters/ADAPTER_CONTRACT.md — inputs, drift-report + parity-result shapes,
idempotency rules, CI exit codes (0 ok / 2 usage / 3 drift / 4 parity / 5 internal).
- .claude/rules/designbook-propagation.md + DesignSystemIntroduction.md §5.1 —
one-way directionality + drift-resolution workflow.
T04 — canonical React designbook + the missing pull tool:
- The bundled /design-sync skill only PUSHES repo->cloud; it cannot populate
designbook/. Added scripts/designbook_pull.py + `make designbook-pull`, which drives
the local claude binary headless (acceptEdits) so DesignSync fetch+write runs in a
subprocess (contents never hit the orchestrator's context). Pulled 44 files;
excludes the _whynot-design-seed/ self-copy. Corrected the docs that wrongly called
/design-sync the pull.
T05 — IR extractor (scripts/ir-extract.mjs + `make ir`):
- ir/tokens.json (80 tokens, DTCG, var() -> {ref} alias resolution); ir/components/*.json
(10 contracts parsed from .jsx signatures: enum/boolean/number inference, prop->attr
map, style/callback marked non-portable); ir/exemplars/*.
T06 — Lit token adapter (adapters/lit/ + `make adapt-lit`):
- Full-gen tokens into src/styles/colors_and_type.css :root (marker-bounded, idempotent
no-op on re-run; hand-authored type CSS preserved).
NOTE: token regen synced Lit to canonical React — fonts IBM Plex -> system stacks and 8
status tokens added. This is a VISUAL change: review and run `pnpm test:visual:update`
before merge. Remaining: T07 scaffold+drift, T08 parity, T09 runbook, T10 2nd-adapter.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
267 lines
4.5 KiB
JSON
267 lines
4.5 KiB
JSON
{
|
|
"color": {
|
|
"$type": "color",
|
|
"ink": {
|
|
"$value": "#0A0A0A"
|
|
},
|
|
"ink-2": {
|
|
"$value": "#1F1F1F"
|
|
},
|
|
"ink-3": {
|
|
"$value": "#5C5C5C"
|
|
},
|
|
"ink-4": {
|
|
"$value": "#8A8A8A"
|
|
},
|
|
"ink-5": {
|
|
"$value": "#B5B5B3"
|
|
},
|
|
"line": {
|
|
"$value": "#E5E5E2"
|
|
},
|
|
"line-strong": {
|
|
"$value": "#C9C9C5"
|
|
},
|
|
"line-soft": {
|
|
"$value": "#F0F0EC"
|
|
},
|
|
"paper": {
|
|
"$value": "#FFFFFF"
|
|
},
|
|
"paper-2": {
|
|
"$value": "#FAFAF7"
|
|
},
|
|
"paper-3": {
|
|
"$value": "#F4F4EF"
|
|
},
|
|
"fg-1": {
|
|
"$value": "{color.ink}"
|
|
},
|
|
"fg-2": {
|
|
"$value": "{color.ink-3}"
|
|
},
|
|
"fg-3": {
|
|
"$value": "{color.ink-4}"
|
|
},
|
|
"fg-mute": {
|
|
"$value": "{color.ink-5}"
|
|
},
|
|
"fg-on-dark": {
|
|
"$value": "#FAFAF7"
|
|
},
|
|
"bg-1": {
|
|
"$value": "{color.paper}"
|
|
},
|
|
"bg-2": {
|
|
"$value": "{color.paper-2}"
|
|
},
|
|
"bg-3": {
|
|
"$value": "{color.paper-3}"
|
|
},
|
|
"bg-invert": {
|
|
"$value": "{color.ink}"
|
|
},
|
|
"border": {
|
|
"$value": "{color.line}"
|
|
},
|
|
"border-strong": {
|
|
"$value": "{color.line-strong}"
|
|
},
|
|
"border-soft": {
|
|
"$value": "{color.line-soft}"
|
|
},
|
|
"hi": {
|
|
"$value": "#FFE14A"
|
|
},
|
|
"hi-2": {
|
|
"$value": "#FFD400"
|
|
},
|
|
"hi-ink": {
|
|
"$value": "#1A1500"
|
|
},
|
|
"status-raw": {
|
|
"$value": "#B5B5B3"
|
|
},
|
|
"status-weak": {
|
|
"$value": "#8A8A8A"
|
|
},
|
|
"status-medium": {
|
|
"$value": "#5C5C5C"
|
|
},
|
|
"status-strong": {
|
|
"$value": "#0A0A0A"
|
|
},
|
|
"status-commercial": {
|
|
"$value": "#FFD400"
|
|
},
|
|
"status-error": {
|
|
"$value": "#B33A2E"
|
|
},
|
|
"status-error-bg": {
|
|
"$value": "#FCF3F1"
|
|
},
|
|
"status-warn": {
|
|
"$value": "#C28000"
|
|
},
|
|
"status-warn-bg": {
|
|
"$value": "#FFFCEB"
|
|
},
|
|
"status-success": {
|
|
"$value": "#2F6B3A"
|
|
},
|
|
"status-success-bg": {
|
|
"$value": "#F2F7F2"
|
|
},
|
|
"status-info": {
|
|
"$value": "#2E5C8A"
|
|
},
|
|
"status-info-bg": {
|
|
"$value": "#F2F5FA"
|
|
}
|
|
},
|
|
"fontFamily": {
|
|
"$type": "fontFamily",
|
|
"ff-sans": {
|
|
"$value": "ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif"
|
|
},
|
|
"ff-mono": {
|
|
"$value": "ui-monospace, \"SF Mono\", Menlo, Consolas, monospace"
|
|
},
|
|
"ff-serif": {
|
|
"$value": "ui-serif, Georgia, \"Times New Roman\", serif"
|
|
}
|
|
},
|
|
"fontSize": {
|
|
"$type": "dimension",
|
|
"fs-xs": {
|
|
"$value": "11px"
|
|
},
|
|
"fs-sm": {
|
|
"$value": "13px"
|
|
},
|
|
"fs-base": {
|
|
"$value": "15px"
|
|
},
|
|
"fs-md": {
|
|
"$value": "17px"
|
|
},
|
|
"fs-lg": {
|
|
"$value": "20px"
|
|
},
|
|
"fs-xl": {
|
|
"$value": "24px"
|
|
},
|
|
"fs-2xl": {
|
|
"$value": "32px"
|
|
},
|
|
"fs-3xl": {
|
|
"$value": "44px"
|
|
},
|
|
"fs-4xl": {
|
|
"$value": "64px"
|
|
},
|
|
"fs-5xl": {
|
|
"$value": "96px"
|
|
}
|
|
},
|
|
"lineHeight": {
|
|
"$type": "number",
|
|
"lh-tight": {
|
|
"$value": "1.05"
|
|
},
|
|
"lh-snug": {
|
|
"$value": "1.25"
|
|
},
|
|
"lh-base": {
|
|
"$value": "1.5"
|
|
},
|
|
"lh-loose": {
|
|
"$value": "1.7"
|
|
}
|
|
},
|
|
"letterSpacing": {
|
|
"$type": "dimension",
|
|
"tr-tight": {
|
|
"$value": "-0.02em"
|
|
},
|
|
"tr-snug": {
|
|
"$value": "-0.01em"
|
|
},
|
|
"tr-base": {
|
|
"$value": "0em"
|
|
},
|
|
"tr-mono": {
|
|
"$value": "0.02em"
|
|
},
|
|
"tr-label": {
|
|
"$value": "0.08em"
|
|
}
|
|
},
|
|
"space": {
|
|
"$type": "dimension",
|
|
"sp-1": {
|
|
"$value": "4px"
|
|
},
|
|
"sp-2": {
|
|
"$value": "8px"
|
|
},
|
|
"sp-3": {
|
|
"$value": "12px"
|
|
},
|
|
"sp-4": {
|
|
"$value": "16px"
|
|
},
|
|
"sp-5": {
|
|
"$value": "24px"
|
|
},
|
|
"sp-6": {
|
|
"$value": "32px"
|
|
},
|
|
"sp-7": {
|
|
"$value": "48px"
|
|
},
|
|
"sp-8": {
|
|
"$value": "64px"
|
|
},
|
|
"sp-9": {
|
|
"$value": "96px"
|
|
},
|
|
"sp-10": {
|
|
"$value": "128px"
|
|
}
|
|
},
|
|
"radius": {
|
|
"$type": "dimension",
|
|
"r-0": {
|
|
"$value": "0px"
|
|
},
|
|
"r-1": {
|
|
"$value": "2px"
|
|
},
|
|
"r-2": {
|
|
"$value": "4px"
|
|
},
|
|
"r-3": {
|
|
"$value": "8px"
|
|
},
|
|
"r-pill": {
|
|
"$value": "999px"
|
|
}
|
|
},
|
|
"shadow": {
|
|
"$type": "shadow",
|
|
"shadow-0": {
|
|
"$value": "none"
|
|
},
|
|
"shadow-1": {
|
|
"$value": "0 1px 0 var(--line)"
|
|
},
|
|
"shadow-2": {
|
|
"$value": "0 1px 0 var(--line-strong)"
|
|
},
|
|
"shadow-3": {
|
|
"$value": "0 4px 12px -6px rgba(10,10,10,0.10)"
|
|
}
|
|
}
|
|
}
|