refactor(ui): converge font-size to two-tier token scale (#430 PR2) - #437

Merged
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2
Jul 2, 2026
Merged

refactor(ui): converge font-size to two-tier token scale (#430 PR2)#437
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Ban bare Npx/Nremfont-size across all renderer CSS. 413 sites collapse into a three-tier token scale: --font-size-base (15px), --font-size-ui (13px), and --font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.

Why

Issue #430 PR2. Maka's frontend had 436 bare font-size values across 22 CSS files — 9/10/11/12/12.5/13/13.5/14px plus rem-encoded meta (0.7-0.875rem under the 15px root). These were drift, not a deliberate ladder. The radius converge contract (#406) proved this pattern works; this PR applies it to typography.

An initial 2-tier attempt (base 15 / ui 13) was too aggressive: 150+ sites of dense meta (9-11px timestamps, badges, kbd, overlines) inflated to 13px, flattening the visual hierarchy between low-priority meta and chrome text. A third tier at 11px restores that distinction. Peer research across 8 projects confirmed 3-4 tiers is the norm; 2 was the fewest.

Closes#430

Scope

Changed:

  • Token definitions (maka-tokens.css): three-tier scale — --font-size-base: 15px (body/prose), --font-size-ui: 13px (chrome/control), --font-size-caption: 11px (dense meta).
  • Tailwind alias (styles.css @theme inline): --text-xs → caption, --text-sm → ui, --text-base → base.
  • CSS convergence (22 files, 413 sites):
    • 9/10/10.5/11/11.5px and 0.68-0.78rem → var(--font-size-caption) (196 sites)
    • 12/12.5/13/13.5/14px and 0.8-0.95rem → var(--font-size-ui) (217 sites)
    • 15px → var(--font-size-base)
  • Heading em scaling: h1-h4 from px to em (1.4667/1.2667/1.0667/0.9333em off body 15).
  • Contract test: bans bare Npx/Nrem; pins 15/13/11; verifies Tailwind alias mappings.
  • Docs (docs/design-system.md §1.3): synced to three-tier scale.

Rebased onto main (11 new commits). Conflicts with PR #441 (--accent semantic split) resolved by keeping main's color tokens + our font-size tokens.

Not included:

Verification

  • npm test — 1680 tests, 1678 pass, 2 fail. Both failures are pre-existing on main (PR refactor(ui): split --accent into semantic aliases, lock call-site governance #441 changed --accent to --link in tool-activity.tsx but visible-copy-hygiene-contract.test.ts still expects --accent). Not caused by this PR.
  • npm run build — succeeds.
  • typography-converge-contract.test.ts — all 8 cases pass.
  • Screenshot capture for 6 scenarios (permission-destructive, first-run, streaming-sidebar, artifact-pane, settings-general, settings-appearance).

Review responses

  • P1 docs inconsistency: Fixed — docs/design-system.md §1.3 synced to three-tier (15/13/11).
  • P1 permission text at caption: Pushed back — all permission dialog selectors were originally 11px; caption (11px) is faithful convergence with zero visual regression. The suggestion to "restore to ui" would increase 11px→13px, a visual redesign beyond this PR's scope.
  • P2 mechanical vs semantic caption mapping: Acknowledged as follow-up — semantic re-evaluation is a separate audit, not a blocker on token convergence.
  • P2 em bypass in test: Pushed back — em is relative; the contract bans absolute values (px/rem), not relative scaling. Selector whitelists for em would be brittle.

Ban bare Npx/Nrem font-size across all renderer CSS. 413 sites collapse
into three tiers: --font-size-base (15px), --font-size-ui (13px),
--font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.
Mapping:
9/10/10.5/11/11.5px + sub-0.8rem -> --font-size-caption (11px)
12/12.5/13/13.5/14px + 0.8-0.95rem -> --font-size-ui (13px)
15px -> --font-size-base (15px)
Tailwind: --text-xs→caption, --text-sm→ui, --text-base→base.
Contract test bans bare px/rem; pins 15/13/11; verifies alias mappings.
Docs synced to three-tier scale.
@Astro-Han
Astro-Hanforce-pushed the opencode/typography-converge-pr2 branch from 90cd82c to 89a98a0CompareJuly 2, 2026 19:06
…430 PR2)
- settingsField small: --font-size-ui (13px) → --font-size-base (15px)
to clear the 14px legibility floor noted in the prior comment.
- contract test: remove unused EM_RE and duplicate bare px/rem scan;
8 tests → 7, same coverage.
Scanner now flags bare px/rem inside font: shorthand (e.g.
'font: 12px/1.4 var(--font-sans)') so the bypass route is locked.
Added positive and negative cases; 9 tests, all pass.
@Astro-Han
Astro-Han merged commit ebb29c2 into mainJul 2, 2026
@Astro-Han
Astro-Han deleted the opencode/typography-converge-pr2 branch July 2, 2026 19:38
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(ui): converge design-token magic numbers (motion, typography, spacing)

1 participant

@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

refactor(ui): converge font-size to two-tier token scale (#430 PR2) - #437

Merged
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2
Jul 2, 2026
Merged

refactor(ui): converge font-size to two-tier token scale (#430 PR2)#437
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Ban bare Npx/Nremfont-size across all renderer CSS. 413 sites collapse into a three-tier token scale: --font-size-base (15px), --font-size-ui (13px), and --font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.

Why

Issue #430 PR2. Maka's frontend had 436 bare font-size values across 22 CSS files — 9/10/11/12/12.5/13/13.5/14px plus rem-encoded meta (0.7-0.875rem under the 15px root). These were drift, not a deliberate ladder. The radius converge contract (#406) proved this pattern works; this PR applies it to typography.

An initial 2-tier attempt (base 15 / ui 13) was too aggressive: 150+ sites of dense meta (9-11px timestamps, badges, kbd, overlines) inflated to 13px, flattening the visual hierarchy between low-priority meta and chrome text. A third tier at 11px restores that distinction. Peer research across 8 projects confirmed 3-4 tiers is the norm; 2 was the fewest.

Closes#430

Scope

Changed:

  • Token definitions (maka-tokens.css): three-tier scale — --font-size-base: 15px (body/prose), --font-size-ui: 13px (chrome/control), --font-size-caption: 11px (dense meta).
  • Tailwind alias (styles.css @theme inline): --text-xs → caption, --text-sm → ui, --text-base → base.
  • CSS convergence (22 files, 413 sites):
    • 9/10/10.5/11/11.5px and 0.68-0.78rem → var(--font-size-caption) (196 sites)
    • 12/12.5/13/13.5/14px and 0.8-0.95rem → var(--font-size-ui) (217 sites)
    • 15px → var(--font-size-base)
  • Heading em scaling: h1-h4 from px to em (1.4667/1.2667/1.0667/0.9333em off body 15).
  • Contract test: bans bare Npx/Nrem; pins 15/13/11; verifies Tailwind alias mappings.
  • Docs (docs/design-system.md §1.3): synced to three-tier scale.

Rebased onto main (11 new commits). Conflicts with PR #441 (--accent semantic split) resolved by keeping main's color tokens + our font-size tokens.

Not included:

Verification

  • npm test — 1680 tests, 1678 pass, 2 fail. Both failures are pre-existing on main (PR refactor(ui): split --accent into semantic aliases, lock call-site governance #441 changed --accent to --link in tool-activity.tsx but visible-copy-hygiene-contract.test.ts still expects --accent). Not caused by this PR.
  • npm run build — succeeds.
  • typography-converge-contract.test.ts — all 8 cases pass.
  • Screenshot capture for 6 scenarios (permission-destructive, first-run, streaming-sidebar, artifact-pane, settings-general, settings-appearance).

Review responses

  • P1 docs inconsistency: Fixed — docs/design-system.md §1.3 synced to three-tier (15/13/11).
  • P1 permission text at caption: Pushed back — all permission dialog selectors were originally 11px; caption (11px) is faithful convergence with zero visual regression. The suggestion to "restore to ui" would increase 11px→13px, a visual redesign beyond this PR's scope.
  • P2 mechanical vs semantic caption mapping: Acknowledged as follow-up — semantic re-evaluation is a separate audit, not a blocker on token convergence.
  • P2 em bypass in test: Pushed back — em is relative; the contract bans absolute values (px/rem), not relative scaling. Selector whitelists for em would be brittle.

Ban bare Npx/Nrem font-size across all renderer CSS. 413 sites collapse
into three tiers: --font-size-base (15px), --font-size-ui (13px),
--font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.
Mapping:
9/10/10.5/11/11.5px + sub-0.8rem -> --font-size-caption (11px)
12/12.5/13/13.5/14px + 0.8-0.95rem -> --font-size-ui (13px)
15px -> --font-size-base (15px)
Tailwind: --text-xs→caption, --text-sm→ui, --text-base→base.
Contract test bans bare px/rem; pins 15/13/11; verifies alias mappings.
Docs synced to three-tier scale.
@Astro-Han
Astro-Hanforce-pushed the opencode/typography-converge-pr2 branch from 90cd82c to 89a98a0CompareJuly 2, 2026 19:06
…430 PR2)
- settingsField small: --font-size-ui (13px) → --font-size-base (15px)
to clear the 14px legibility floor noted in the prior comment.
- contract test: remove unused EM_RE and duplicate bare px/rem scan;
8 tests → 7, same coverage.
Scanner now flags bare px/rem inside font: shorthand (e.g.
'font: 12px/1.4 var(--font-sans)') so the bypass route is locked.
Added positive and negative cases; 9 tests, all pass.
@Astro-Han
Astro-Han merged commit ebb29c2 into mainJul 2, 2026
@Astro-Han
Astro-Han deleted the opencode/typography-converge-pr2 branch July 2, 2026 19:38
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(ui): converge design-token magic numbers (motion, typography, spacing)

1 participant

@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(ui): converge font-size to two-tier token scale (#430 PR2) - #437

Merged
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2
Jul 2, 2026
Merged

refactor(ui): converge font-size to two-tier token scale (#430 PR2)#437
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Ban bare Npx/Nremfont-size across all renderer CSS. 413 sites collapse into a three-tier token scale: --font-size-base (15px), --font-size-ui (13px), and --font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.

Why

Issue #430 PR2. Maka's frontend had 436 bare font-size values across 22 CSS files — 9/10/11/12/12.5/13/13.5/14px plus rem-encoded meta (0.7-0.875rem under the 15px root). These were drift, not a deliberate ladder. The radius converge contract (#406) proved this pattern works; this PR applies it to typography.

An initial 2-tier attempt (base 15 / ui 13) was too aggressive: 150+ sites of dense meta (9-11px timestamps, badges, kbd, overlines) inflated to 13px, flattening the visual hierarchy between low-priority meta and chrome text. A third tier at 11px restores that distinction. Peer research across 8 projects confirmed 3-4 tiers is the norm; 2 was the fewest.

Closes#430

Scope

Changed:

  • Token definitions (maka-tokens.css): three-tier scale — --font-size-base: 15px (body/prose), --font-size-ui: 13px (chrome/control), --font-size-caption: 11px (dense meta).
  • Tailwind alias (styles.css @theme inline): --text-xs → caption, --text-sm → ui, --text-base → base.
  • CSS convergence (22 files, 413 sites):
    • 9/10/10.5/11/11.5px and 0.68-0.78rem → var(--font-size-caption) (196 sites)
    • 12/12.5/13/13.5/14px and 0.8-0.95rem → var(--font-size-ui) (217 sites)
    • 15px → var(--font-size-base)
  • Heading em scaling: h1-h4 from px to em (1.4667/1.2667/1.0667/0.9333em off body 15).
  • Contract test: bans bare Npx/Nrem; pins 15/13/11; verifies Tailwind alias mappings.
  • Docs (docs/design-system.md §1.3): synced to three-tier scale.

Rebased onto main (11 new commits). Conflicts with PR #441 (--accent semantic split) resolved by keeping main's color tokens + our font-size tokens.

Not included:

Verification

  • npm test — 1680 tests, 1678 pass, 2 fail. Both failures are pre-existing on main (PR refactor(ui): split --accent into semantic aliases, lock call-site governance #441 changed --accent to --link in tool-activity.tsx but visible-copy-hygiene-contract.test.ts still expects --accent). Not caused by this PR.
  • npm run build — succeeds.
  • typography-converge-contract.test.ts — all 8 cases pass.
  • Screenshot capture for 6 scenarios (permission-destructive, first-run, streaming-sidebar, artifact-pane, settings-general, settings-appearance).

Review responses

  • P1 docs inconsistency: Fixed — docs/design-system.md §1.3 synced to three-tier (15/13/11).
  • P1 permission text at caption: Pushed back — all permission dialog selectors were originally 11px; caption (11px) is faithful convergence with zero visual regression. The suggestion to "restore to ui" would increase 11px→13px, a visual redesign beyond this PR's scope.
  • P2 mechanical vs semantic caption mapping: Acknowledged as follow-up — semantic re-evaluation is a separate audit, not a blocker on token convergence.
  • P2 em bypass in test: Pushed back — em is relative; the contract bans absolute values (px/rem), not relative scaling. Selector whitelists for em would be brittle.

Ban bare Npx/Nrem font-size across all renderer CSS. 413 sites collapse
into three tiers: --font-size-base (15px), --font-size-ui (13px),
--font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.
Mapping:
9/10/10.5/11/11.5px + sub-0.8rem -> --font-size-caption (11px)
12/12.5/13/13.5/14px + 0.8-0.95rem -> --font-size-ui (13px)
15px -> --font-size-base (15px)
Tailwind: --text-xs→caption, --text-sm→ui, --text-base→base.
Contract test bans bare px/rem; pins 15/13/11; verifies alias mappings.
Docs synced to three-tier scale.
@Astro-Han
Astro-Hanforce-pushed the opencode/typography-converge-pr2 branch from 90cd82c to 89a98a0CompareJuly 2, 2026 19:06
…430 PR2)
- settingsField small: --font-size-ui (13px) → --font-size-base (15px)
to clear the 14px legibility floor noted in the prior comment.
- contract test: remove unused EM_RE and duplicate bare px/rem scan;
8 tests → 7, same coverage.
Scanner now flags bare px/rem inside font: shorthand (e.g.
'font: 12px/1.4 var(--font-sans)') so the bypass route is locked.
Added positive and negative cases; 9 tests, all pass.
@Astro-Han
Astro-Han merged commit ebb29c2 into mainJul 2, 2026
@Astro-Han
Astro-Han deleted the opencode/typography-converge-pr2 branch July 2, 2026 19:38
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(ui): converge design-token magic numbers (motion, typography, spacing)

1 participant

@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(ui): converge font-size to two-tier token scale (#430 PR2) - #437

Merged
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2
Jul 2, 2026
Merged

refactor(ui): converge font-size to two-tier token scale (#430 PR2)#437
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Ban bare Npx/Nremfont-size across all renderer CSS. 413 sites collapse into a three-tier token scale: --font-size-base (15px), --font-size-ui (13px), and --font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.

Why

Issue #430 PR2. Maka's frontend had 436 bare font-size values across 22 CSS files — 9/10/11/12/12.5/13/13.5/14px plus rem-encoded meta (0.7-0.875rem under the 15px root). These were drift, not a deliberate ladder. The radius converge contract (#406) proved this pattern works; this PR applies it to typography.

An initial 2-tier attempt (base 15 / ui 13) was too aggressive: 150+ sites of dense meta (9-11px timestamps, badges, kbd, overlines) inflated to 13px, flattening the visual hierarchy between low-priority meta and chrome text. A third tier at 11px restores that distinction. Peer research across 8 projects confirmed 3-4 tiers is the norm; 2 was the fewest.

Closes#430

Scope

Changed:

  • Token definitions (maka-tokens.css): three-tier scale — --font-size-base: 15px (body/prose), --font-size-ui: 13px (chrome/control), --font-size-caption: 11px (dense meta).
  • Tailwind alias (styles.css @theme inline): --text-xs → caption, --text-sm → ui, --text-base → base.
  • CSS convergence (22 files, 413 sites):
    • 9/10/10.5/11/11.5px and 0.68-0.78rem → var(--font-size-caption) (196 sites)
    • 12/12.5/13/13.5/14px and 0.8-0.95rem → var(--font-size-ui) (217 sites)
    • 15px → var(--font-size-base)
  • Heading em scaling: h1-h4 from px to em (1.4667/1.2667/1.0667/0.9333em off body 15).
  • Contract test: bans bare Npx/Nrem; pins 15/13/11; verifies Tailwind alias mappings.
  • Docs (docs/design-system.md §1.3): synced to three-tier scale.

Rebased onto main (11 new commits). Conflicts with PR #441 (--accent semantic split) resolved by keeping main's color tokens + our font-size tokens.

Not included:

Verification

  • npm test — 1680 tests, 1678 pass, 2 fail. Both failures are pre-existing on main (PR refactor(ui): split --accent into semantic aliases, lock call-site governance #441 changed --accent to --link in tool-activity.tsx but visible-copy-hygiene-contract.test.ts still expects --accent). Not caused by this PR.
  • npm run build — succeeds.
  • typography-converge-contract.test.ts — all 8 cases pass.
  • Screenshot capture for 6 scenarios (permission-destructive, first-run, streaming-sidebar, artifact-pane, settings-general, settings-appearance).

Review responses

  • P1 docs inconsistency: Fixed — docs/design-system.md §1.3 synced to three-tier (15/13/11).
  • P1 permission text at caption: Pushed back — all permission dialog selectors were originally 11px; caption (11px) is faithful convergence with zero visual regression. The suggestion to "restore to ui" would increase 11px→13px, a visual redesign beyond this PR's scope.
  • P2 mechanical vs semantic caption mapping: Acknowledged as follow-up — semantic re-evaluation is a separate audit, not a blocker on token convergence.
  • P2 em bypass in test: Pushed back — em is relative; the contract bans absolute values (px/rem), not relative scaling. Selector whitelists for em would be brittle.

Ban bare Npx/Nrem font-size across all renderer CSS. 413 sites collapse
into three tiers: --font-size-base (15px), --font-size-ui (13px),
--font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.
Mapping:
9/10/10.5/11/11.5px + sub-0.8rem -> --font-size-caption (11px)
12/12.5/13/13.5/14px + 0.8-0.95rem -> --font-size-ui (13px)
15px -> --font-size-base (15px)
Tailwind: --text-xs→caption, --text-sm→ui, --text-base→base.
Contract test bans bare px/rem; pins 15/13/11; verifies alias mappings.
Docs synced to three-tier scale.
@Astro-Han
Astro-Hanforce-pushed the opencode/typography-converge-pr2 branch from 90cd82c to 89a98a0CompareJuly 2, 2026 19:06
…430 PR2)
- settingsField small: --font-size-ui (13px) → --font-size-base (15px)
to clear the 14px legibility floor noted in the prior comment.
- contract test: remove unused EM_RE and duplicate bare px/rem scan;
8 tests → 7, same coverage.
Scanner now flags bare px/rem inside font: shorthand (e.g.
'font: 12px/1.4 var(--font-sans)') so the bypass route is locked.
Added positive and negative cases; 9 tests, all pass.
@Astro-Han
Astro-Han merged commit ebb29c2 into mainJul 2, 2026
@Astro-Han
Astro-Han deleted the opencode/typography-converge-pr2 branch July 2, 2026 19:38
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(ui): converge design-token magic numbers (motion, typography, spacing)

1 participant

@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

refactor(ui): converge font-size to two-tier token scale (#430 PR2) - #437

Merged
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2
Jul 2, 2026
Merged

refactor(ui): converge font-size to two-tier token scale (#430 PR2)#437
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Ban bare Npx/Nremfont-size across all renderer CSS. 413 sites collapse into a three-tier token scale: --font-size-base (15px), --font-size-ui (13px), and --font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.

Why

Issue #430 PR2. Maka's frontend had 436 bare font-size values across 22 CSS files — 9/10/11/12/12.5/13/13.5/14px plus rem-encoded meta (0.7-0.875rem under the 15px root). These were drift, not a deliberate ladder. The radius converge contract (#406) proved this pattern works; this PR applies it to typography.

An initial 2-tier attempt (base 15 / ui 13) was too aggressive: 150+ sites of dense meta (9-11px timestamps, badges, kbd, overlines) inflated to 13px, flattening the visual hierarchy between low-priority meta and chrome text. A third tier at 11px restores that distinction. Peer research across 8 projects confirmed 3-4 tiers is the norm; 2 was the fewest.

Closes#430

Scope

Changed:

  • Token definitions (maka-tokens.css): three-tier scale — --font-size-base: 15px (body/prose), --font-size-ui: 13px (chrome/control), --font-size-caption: 11px (dense meta).
  • Tailwind alias (styles.css @theme inline): --text-xs → caption, --text-sm → ui, --text-base → base.
  • CSS convergence (22 files, 413 sites):
    • 9/10/10.5/11/11.5px and 0.68-0.78rem → var(--font-size-caption) (196 sites)
    • 12/12.5/13/13.5/14px and 0.8-0.95rem → var(--font-size-ui) (217 sites)
    • 15px → var(--font-size-base)
  • Heading em scaling: h1-h4 from px to em (1.4667/1.2667/1.0667/0.9333em off body 15).
  • Contract test: bans bare Npx/Nrem; pins 15/13/11; verifies Tailwind alias mappings.
  • Docs (docs/design-system.md §1.3): synced to three-tier scale.

Rebased onto main (11 new commits). Conflicts with PR #441 (--accent semantic split) resolved by keeping main's color tokens + our font-size tokens.

Not included:

Verification

  • npm test — 1680 tests, 1678 pass, 2 fail. Both failures are pre-existing on main (PR refactor(ui): split --accent into semantic aliases, lock call-site governance #441 changed --accent to --link in tool-activity.tsx but visible-copy-hygiene-contract.test.ts still expects --accent). Not caused by this PR.
  • npm run build — succeeds.
  • typography-converge-contract.test.ts — all 8 cases pass.
  • Screenshot capture for 6 scenarios (permission-destructive, first-run, streaming-sidebar, artifact-pane, settings-general, settings-appearance).

Review responses

  • P1 docs inconsistency: Fixed — docs/design-system.md §1.3 synced to three-tier (15/13/11).
  • P1 permission text at caption: Pushed back — all permission dialog selectors were originally 11px; caption (11px) is faithful convergence with zero visual regression. The suggestion to "restore to ui" would increase 11px→13px, a visual redesign beyond this PR's scope.
  • P2 mechanical vs semantic caption mapping: Acknowledged as follow-up — semantic re-evaluation is a separate audit, not a blocker on token convergence.
  • P2 em bypass in test: Pushed back — em is relative; the contract bans absolute values (px/rem), not relative scaling. Selector whitelists for em would be brittle.

Ban bare Npx/Nrem font-size across all renderer CSS. 413 sites collapse
into three tiers: --font-size-base (15px), --font-size-ui (13px),
--font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.
Mapping:
9/10/10.5/11/11.5px + sub-0.8rem -> --font-size-caption (11px)
12/12.5/13/13.5/14px + 0.8-0.95rem -> --font-size-ui (13px)
15px -> --font-size-base (15px)
Tailwind: --text-xs→caption, --text-sm→ui, --text-base→base.
Contract test bans bare px/rem; pins 15/13/11; verifies alias mappings.
Docs synced to three-tier scale.
@Astro-Han
Astro-Hanforce-pushed the opencode/typography-converge-pr2 branch from 90cd82c to 89a98a0CompareJuly 2, 2026 19:06
…430 PR2)
- settingsField small: --font-size-ui (13px) → --font-size-base (15px)
to clear the 14px legibility floor noted in the prior comment.
- contract test: remove unused EM_RE and duplicate bare px/rem scan;
8 tests → 7, same coverage.
Scanner now flags bare px/rem inside font: shorthand (e.g.
'font: 12px/1.4 var(--font-sans)') so the bypass route is locked.
Added positive and negative cases; 9 tests, all pass.
@Astro-Han
Astro-Han merged commit ebb29c2 into mainJul 2, 2026
@Astro-Han
Astro-Han deleted the opencode/typography-converge-pr2 branch July 2, 2026 19:38
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(ui): converge design-token magic numbers (motion, typography, spacing)

1 participant

@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(ui): converge font-size to two-tier token scale (#430 PR2) - #437

Merged
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2
Jul 2, 2026
Merged

refactor(ui): converge font-size to two-tier token scale (#430 PR2)#437
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Ban bare Npx/Nremfont-size across all renderer CSS. 413 sites collapse into a three-tier token scale: --font-size-base (15px), --font-size-ui (13px), and --font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.

Why

Issue #430 PR2. Maka's frontend had 436 bare font-size values across 22 CSS files — 9/10/11/12/12.5/13/13.5/14px plus rem-encoded meta (0.7-0.875rem under the 15px root). These were drift, not a deliberate ladder. The radius converge contract (#406) proved this pattern works; this PR applies it to typography.

An initial 2-tier attempt (base 15 / ui 13) was too aggressive: 150+ sites of dense meta (9-11px timestamps, badges, kbd, overlines) inflated to 13px, flattening the visual hierarchy between low-priority meta and chrome text. A third tier at 11px restores that distinction. Peer research across 8 projects confirmed 3-4 tiers is the norm; 2 was the fewest.

Closes#430

Scope

Changed:

  • Token definitions (maka-tokens.css): three-tier scale — --font-size-base: 15px (body/prose), --font-size-ui: 13px (chrome/control), --font-size-caption: 11px (dense meta).
  • Tailwind alias (styles.css @theme inline): --text-xs → caption, --text-sm → ui, --text-base → base.
  • CSS convergence (22 files, 413 sites):
    • 9/10/10.5/11/11.5px and 0.68-0.78rem → var(--font-size-caption) (196 sites)
    • 12/12.5/13/13.5/14px and 0.8-0.95rem → var(--font-size-ui) (217 sites)
    • 15px → var(--font-size-base)
  • Heading em scaling: h1-h4 from px to em (1.4667/1.2667/1.0667/0.9333em off body 15).
  • Contract test: bans bare Npx/Nrem; pins 15/13/11; verifies Tailwind alias mappings.
  • Docs (docs/design-system.md §1.3): synced to three-tier scale.

Rebased onto main (11 new commits). Conflicts with PR #441 (--accent semantic split) resolved by keeping main's color tokens + our font-size tokens.

Not included:

Verification

  • npm test — 1680 tests, 1678 pass, 2 fail. Both failures are pre-existing on main (PR refactor(ui): split --accent into semantic aliases, lock call-site governance #441 changed --accent to --link in tool-activity.tsx but visible-copy-hygiene-contract.test.ts still expects --accent). Not caused by this PR.
  • npm run build — succeeds.
  • typography-converge-contract.test.ts — all 8 cases pass.
  • Screenshot capture for 6 scenarios (permission-destructive, first-run, streaming-sidebar, artifact-pane, settings-general, settings-appearance).

Review responses

  • P1 docs inconsistency: Fixed — docs/design-system.md §1.3 synced to three-tier (15/13/11).
  • P1 permission text at caption: Pushed back — all permission dialog selectors were originally 11px; caption (11px) is faithful convergence with zero visual regression. The suggestion to "restore to ui" would increase 11px→13px, a visual redesign beyond this PR's scope.
  • P2 mechanical vs semantic caption mapping: Acknowledged as follow-up — semantic re-evaluation is a separate audit, not a blocker on token convergence.
  • P2 em bypass in test: Pushed back — em is relative; the contract bans absolute values (px/rem), not relative scaling. Selector whitelists for em would be brittle.

Ban bare Npx/Nrem font-size across all renderer CSS. 413 sites collapse
into three tiers: --font-size-base (15px), --font-size-ui (13px),
--font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.
Mapping:
9/10/10.5/11/11.5px + sub-0.8rem -> --font-size-caption (11px)
12/12.5/13/13.5/14px + 0.8-0.95rem -> --font-size-ui (13px)
15px -> --font-size-base (15px)
Tailwind: --text-xs→caption, --text-sm→ui, --text-base→base.
Contract test bans bare px/rem; pins 15/13/11; verifies alias mappings.
Docs synced to three-tier scale.
@Astro-Han
Astro-Hanforce-pushed the opencode/typography-converge-pr2 branch from 90cd82c to 89a98a0CompareJuly 2, 2026 19:06
…430 PR2)
- settingsField small: --font-size-ui (13px) → --font-size-base (15px)
to clear the 14px legibility floor noted in the prior comment.
- contract test: remove unused EM_RE and duplicate bare px/rem scan;
8 tests → 7, same coverage.
Scanner now flags bare px/rem inside font: shorthand (e.g.
'font: 12px/1.4 var(--font-sans)') so the bypass route is locked.
Added positive and negative cases; 9 tests, all pass.
@Astro-Han
Astro-Han merged commit ebb29c2 into mainJul 2, 2026
@Astro-Han
Astro-Han deleted the opencode/typography-converge-pr2 branch July 2, 2026 19:38
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(ui): converge design-token magic numbers (motion, typography, spacing)

1 participant

@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(ui): converge font-size to two-tier token scale (#430 PR2) - #437

Merged
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2
Jul 2, 2026
Merged

refactor(ui): converge font-size to two-tier token scale (#430 PR2)#437
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Ban bare Npx/Nremfont-size across all renderer CSS. 413 sites collapse into a three-tier token scale: --font-size-base (15px), --font-size-ui (13px), and --font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.

Why

Issue #430 PR2. Maka's frontend had 436 bare font-size values across 22 CSS files — 9/10/11/12/12.5/13/13.5/14px plus rem-encoded meta (0.7-0.875rem under the 15px root). These were drift, not a deliberate ladder. The radius converge contract (#406) proved this pattern works; this PR applies it to typography.

An initial 2-tier attempt (base 15 / ui 13) was too aggressive: 150+ sites of dense meta (9-11px timestamps, badges, kbd, overlines) inflated to 13px, flattening the visual hierarchy between low-priority meta and chrome text. A third tier at 11px restores that distinction. Peer research across 8 projects confirmed 3-4 tiers is the norm; 2 was the fewest.

Closes#430

Scope

Changed:

  • Token definitions (maka-tokens.css): three-tier scale — --font-size-base: 15px (body/prose), --font-size-ui: 13px (chrome/control), --font-size-caption: 11px (dense meta).
  • Tailwind alias (styles.css @theme inline): --text-xs → caption, --text-sm → ui, --text-base → base.
  • CSS convergence (22 files, 413 sites):
    • 9/10/10.5/11/11.5px and 0.68-0.78rem → var(--font-size-caption) (196 sites)
    • 12/12.5/13/13.5/14px and 0.8-0.95rem → var(--font-size-ui) (217 sites)
    • 15px → var(--font-size-base)
  • Heading em scaling: h1-h4 from px to em (1.4667/1.2667/1.0667/0.9333em off body 15).
  • Contract test: bans bare Npx/Nrem; pins 15/13/11; verifies Tailwind alias mappings.
  • Docs (docs/design-system.md §1.3): synced to three-tier scale.

Rebased onto main (11 new commits). Conflicts with PR #441 (--accent semantic split) resolved by keeping main's color tokens + our font-size tokens.

Not included:

Verification

  • npm test — 1680 tests, 1678 pass, 2 fail. Both failures are pre-existing on main (PR refactor(ui): split --accent into semantic aliases, lock call-site governance #441 changed --accent to --link in tool-activity.tsx but visible-copy-hygiene-contract.test.ts still expects --accent). Not caused by this PR.
  • npm run build — succeeds.
  • typography-converge-contract.test.ts — all 8 cases pass.
  • Screenshot capture for 6 scenarios (permission-destructive, first-run, streaming-sidebar, artifact-pane, settings-general, settings-appearance).

Review responses

  • P1 docs inconsistency: Fixed — docs/design-system.md §1.3 synced to three-tier (15/13/11).
  • P1 permission text at caption: Pushed back — all permission dialog selectors were originally 11px; caption (11px) is faithful convergence with zero visual regression. The suggestion to "restore to ui" would increase 11px→13px, a visual redesign beyond this PR's scope.
  • P2 mechanical vs semantic caption mapping: Acknowledged as follow-up — semantic re-evaluation is a separate audit, not a blocker on token convergence.
  • P2 em bypass in test: Pushed back — em is relative; the contract bans absolute values (px/rem), not relative scaling. Selector whitelists for em would be brittle.

Ban bare Npx/Nrem font-size across all renderer CSS. 413 sites collapse
into three tiers: --font-size-base (15px), --font-size-ui (13px),
--font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.
Mapping:
9/10/10.5/11/11.5px + sub-0.8rem -> --font-size-caption (11px)
12/12.5/13/13.5/14px + 0.8-0.95rem -> --font-size-ui (13px)
15px -> --font-size-base (15px)
Tailwind: --text-xs→caption, --text-sm→ui, --text-base→base.
Contract test bans bare px/rem; pins 15/13/11; verifies alias mappings.
Docs synced to three-tier scale.
@Astro-Han
Astro-Hanforce-pushed the opencode/typography-converge-pr2 branch from 90cd82c to 89a98a0CompareJuly 2, 2026 19:06
…430 PR2)
- settingsField small: --font-size-ui (13px) → --font-size-base (15px)
to clear the 14px legibility floor noted in the prior comment.
- contract test: remove unused EM_RE and duplicate bare px/rem scan;
8 tests → 7, same coverage.
Scanner now flags bare px/rem inside font: shorthand (e.g.
'font: 12px/1.4 var(--font-sans)') so the bypass route is locked.
Added positive and negative cases; 9 tests, all pass.
@Astro-Han
Astro-Han merged commit ebb29c2 into mainJul 2, 2026
@Astro-Han
Astro-Han deleted the opencode/typography-converge-pr2 branch July 2, 2026 19:38
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(ui): converge design-token magic numbers (motion, typography, spacing)

1 participant

@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

refactor(ui): converge font-size to two-tier token scale (#430 PR2) - #437

Merged
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2
Jul 2, 2026
Merged

refactor(ui): converge font-size to two-tier token scale (#430 PR2)#437
Astro-Han merged 3 commits into
mainfrom
opencode/typography-converge-pr2

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Ban bare Npx/Nremfont-size across all renderer CSS. 413 sites collapse into a three-tier token scale: --font-size-base (15px), --font-size-ui (13px), and --font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.

Why

Issue #430 PR2. Maka's frontend had 436 bare font-size values across 22 CSS files — 9/10/11/12/12.5/13/13.5/14px plus rem-encoded meta (0.7-0.875rem under the 15px root). These were drift, not a deliberate ladder. The radius converge contract (#406) proved this pattern works; this PR applies it to typography.

An initial 2-tier attempt (base 15 / ui 13) was too aggressive: 150+ sites of dense meta (9-11px timestamps, badges, kbd, overlines) inflated to 13px, flattening the visual hierarchy between low-priority meta and chrome text. A third tier at 11px restores that distinction. Peer research across 8 projects confirmed 3-4 tiers is the norm; 2 was the fewest.

Closes#430

Scope

Changed:

  • Token definitions (maka-tokens.css): three-tier scale — --font-size-base: 15px (body/prose), --font-size-ui: 13px (chrome/control), --font-size-caption: 11px (dense meta).
  • Tailwind alias (styles.css @theme inline): --text-xs → caption, --text-sm → ui, --text-base → base.
  • CSS convergence (22 files, 413 sites):
    • 9/10/10.5/11/11.5px and 0.68-0.78rem → var(--font-size-caption) (196 sites)
    • 12/12.5/13/13.5/14px and 0.8-0.95rem → var(--font-size-ui) (217 sites)
    • 15px → var(--font-size-base)
  • Heading em scaling: h1-h4 from px to em (1.4667/1.2667/1.0667/0.9333em off body 15).
  • Contract test: bans bare Npx/Nrem; pins 15/13/11; verifies Tailwind alias mappings.
  • Docs (docs/design-system.md §1.3): synced to three-tier scale.

Rebased onto main (11 new commits). Conflicts with PR #441 (--accent semantic split) resolved by keeping main's color tokens + our font-size tokens.

Not included:

Verification

  • npm test — 1680 tests, 1678 pass, 2 fail. Both failures are pre-existing on main (PR refactor(ui): split --accent into semantic aliases, lock call-site governance #441 changed --accent to --link in tool-activity.tsx but visible-copy-hygiene-contract.test.ts still expects --accent). Not caused by this PR.
  • npm run build — succeeds.
  • typography-converge-contract.test.ts — all 8 cases pass.
  • Screenshot capture for 6 scenarios (permission-destructive, first-run, streaming-sidebar, artifact-pane, settings-general, settings-appearance).

Review responses

  • P1 docs inconsistency: Fixed — docs/design-system.md §1.3 synced to three-tier (15/13/11).
  • P1 permission text at caption: Pushed back — all permission dialog selectors were originally 11px; caption (11px) is faithful convergence with zero visual regression. The suggestion to "restore to ui" would increase 11px→13px, a visual redesign beyond this PR's scope.
  • P2 mechanical vs semantic caption mapping: Acknowledged as follow-up — semantic re-evaluation is a separate audit, not a blocker on token convergence.
  • P2 em bypass in test: Pushed back — em is relative; the contract bans absolute values (px/rem), not relative scaling. Selector whitelists for em would be brittle.

Ban bare Npx/Nrem font-size across all renderer CSS. 413 sites collapse
into three tiers: --font-size-base (15px), --font-size-ui (13px),
--font-size-caption (11px). Bubble h1-h4 switch from px to em off body 15.
Mapping:
9/10/10.5/11/11.5px + sub-0.8rem -> --font-size-caption (11px)
12/12.5/13/13.5/14px + 0.8-0.95rem -> --font-size-ui (13px)
15px -> --font-size-base (15px)
Tailwind: --text-xs→caption, --text-sm→ui, --text-base→base.
Contract test bans bare px/rem; pins 15/13/11; verifies alias mappings.
Docs synced to three-tier scale.
@Astro-Han
Astro-Hanforce-pushed the opencode/typography-converge-pr2 branch from 90cd82c to 89a98a0CompareJuly 2, 2026 19:06
…430 PR2)
- settingsField small: --font-size-ui (13px) → --font-size-base (15px)
to clear the 14px legibility floor noted in the prior comment.
- contract test: remove unused EM_RE and duplicate bare px/rem scan;
8 tests → 7, same coverage.
Scanner now flags bare px/rem inside font: shorthand (e.g.
'font: 12px/1.4 var(--font-sans)') so the bypass route is locked.
Added positive and negative cases; 9 tests, all pass.
@Astro-Han
Astro-Han merged commit ebb29c2 into mainJul 2, 2026
@Astro-Han
Astro-Han deleted the opencode/typography-converge-pr2 branch July 2, 2026 19:38
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(ui): converge design-token magic numbers (motion, typography, spacing)

1 participant

@Astro-Han