Files
whynot-design/ir/tokens.json
tegwick 0d688ca94a feat(designbook): technology-neutral IR + stack-adapter pipeline (WHYNOT-WP-0002 T01-T06)
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>
2026-06-24 12:36:24 +02:00

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)"
}
}
}