chore(desktop): clean up CSS token governance - #1085

Merged
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup
Jul 16, 2026
Merged

chore(desktop): clean up CSS token governance#1085
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup

Conversation

@xuruiray

@xuruirayxuruiray commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

  • split the settings stylesheet by concern, moving About, Bot, WeChat, and shared form rules out of theme-preview.css
  • replace phantom and dead CSS tokens, and introduce a governed --brand-wechat token for the QR flow
  • name renderer timing constants and replace repeated static icon/transition inline styles
  • use semantic settings tokens for selected/active states and focus rings in the extracted stylesheets
  • document the established camelCase selector dialect for styles/settings/** in both CSS governance guides

Why

theme-preview.css had become a grab bag for unrelated settings surfaces, while several component rules depended on fallback-only or raw color values. The cleanup makes ownership explicit without changing the settings component APIs.

The issue is still reproducible on current main: unrelated settings selectors remain in theme-preview.css, raw #07C160 values and fallback-only tokens are still present, and the extracted Bot/Form rules are absent.

Closes#1046.

Validation

Rebased onto fd6bd9e3 (origin/main) and validated from a clean dependency install:

  • npm run lint — passed (1621 files)
  • node scripts/check-dead-css.mjs --check — passed
  • npm run build — passed
  • npm run typecheck — passed
  • npm --workspace @maka/desktop test — passed (2571/2571)
  • npx playwright test --config e2e/playwright.config.ts — passed (25/25 real Electron E2E tests)

Visual validation

  • captured 13 Settings fixtures in light/dark themes at 1280px/990px viewports: 52 PR screenshots and 52 same-machine origin/main controls
  • 39/52 screenshot pairs were pixel-identical
  • the remaining 13 pairs differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility; manual review found no layout, clipping, overlap, or color regression
  • keyboard navigation to the shared Settings combobox retained a visible focus ring, at least 34px control height, and no horizontal overflow

Review focus

  • theme-preview.css is reduced from 670 lines on current main to 225 lines
  • About, Bot, WeChat, and shared form ownership moves to dedicated stylesheets
  • no settings component API or user-facing behavior change is intended

xuruirayand others added 2 commits July 16, 2026 19:50
Summary:
- use the governed brand token for About accents
- use focus-ring and focus-width tokens for settings selects
Rationale:
- satisfy the design-system governance contracts found during local validation
Tests:
- npm run lint
- npm run build
- npm run typecheck
- npm --workspace @maka/desktop test
Co-authored-by: Codex <codex@openai.com>
@xuruiray
xuruirayforce-pushed the xurui/issue-1046-css-token-cleanup branch from e59a03e to 20354e8CompareJuly 16, 2026 11:50
@xuruiray
xuruiray marked this pull request as ready for review July 16, 2026 11:55
@xuruiray

Copy link
Copy Markdown
ContributorAuthor

Visual validation — representative screenshots

Local validation on commit 20354e8c:

  • 13 Settings fixtures × light/dark × 1280px/990px
  • 52 PR screenshots compared with 52 same-machine origin/main controls
  • 39/52 pairs were pixel-identical
  • the remaining 13 differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility
  • manual review found no layout, clipping, overlap, or color regression
  • Electron E2E: 25/25 passed

About · light · 1280px

Settings About — light theme, 1280px

Remote access · dark · 990px

Settings Remote Access — dark theme, 990px

Appearance · dark · 1280px

Settings Appearance — dark theme, 1280px

Keyboard focus ring

Settings General Proxy — keyboard focus ring

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM

@Astro-Han
Astro-Han merged commit 9382f87 into apache:mainJul 16, 2026
3 checks passed
jackwener added a commit that referenced this pull request Jul 19, 2026
…nip zero-hint, resume hook, QR fixture (#1241)
* feat(core): add settings-bots-onboarding visual-smoke scenario + botOnboardingProvider
* feat(desktop): hold-in-waiting bot onboarding adapter + fixture state for QR capture
* feat(desktop): auto-open bot scan-login modal under settings-bots-onboarding fixture
* chore(scripts): register settings-bots-onboarding in capture + audit scenario lists
* fix(desktop): wait for QR paint before auto-capturing bot-onboarding fixture
* docs(notes): frontend architecture map — measured baseline + 8 staged rounds (2026-07-19)
Re-ran the census (wc over non-test TS/TSX for desktop main/preload/renderer +
packages/ui; CSS totals; top-10 hotspot table incl. visual-smoke-fixture.ts marked
OUT-OF-SCOPE other-sessions' territory). Staged R1 knip de-rot, R2 app-shell
resume-cluster extraction, R3 visual-smoke split (BLOCKED on concurrent fixture branch),
R4-R6 main.ts extractions (require maintainer-approved contract re-pins — registerIpc /
startup / tool-assembly / modelSupportsVision direct-pinned), R7 provider-connection-detail
decomposition (needs its own blade plan), R8 CSS raw-hex residue (verified clean on this
tip — #1085 already converted it).
* chore(knip): de-rot config — clear all 13 stale hints (R1)
knip reported 13 configuration hints (7 desktop + 6 ui), all redundant/stale config,
zero code impact:
- Drop 'overlayscrollbars' from desktop ignoreDependencies — now redundant (knip no
longer flags it; the package is owned by packages/ui and only referenced there). The
overlay-scrollbars contract forbids declaring it as a *desktop dependency*, not as an
ignore — removing a redundant ignore is compatible and coverage is unchanged.
- Delete the dead 'src/renderer/**/*.test.ts' entry glob (no matches — renderer has zero
test files; all 338 desktop tests live under src/main/__tests__/*.test.ts).
- Drop 11 redundant explicit entries knip already auto-detects: desktop
preload.ts / renderer/main.tsx / playwright.config.ts / .storybook/main.ts / dev.mjs
(vite / playwright / storybook / npm-scripts plugins), and all 6 ui entries
(index.ts, icons.tsx, artifact-preview-registry.ts, assistant-stream.ts, maka-uri.ts,
smooth-stream.ts) resolved from packages/ui package.json#exports.
Non-redundant entries kept verbatim (main.ts, overlay/*, main test glob, e2e specs,
storybook preview, stories, browser-observe-act-smoke.mjs, both ui test globs). No broad
ignores added — coverage is not weakened. knip --workspace apps/desktop and packages/ui
now both exit 0 AND report zero config hints (was: exit 0 with 13 hints).
* refactor(renderer): extract app-shell resume cluster into use-shell-resume (R2)
The #1223 safe-boundary resume cluster moves out of app-shell.tsx into a new
use-shell-resume.ts hook, following the use-shell-connections / use-shell-chat-model
house style (options object; state + handler returned; stable identities preserved).
Pure move, zero behavior change: the two useState declarations (resumePendingSessionId,
resumeParkDescriptionBySession) and the resumeInterruptedSession handler move verbatim;
activeId/toastApi/shellCopy/uiLocale are injected as options. app-shell keeps the banner
JSX wiring (safeResumeAction=) and the sendWithAttachments guard. resumeParkToastCopy is
no longer imported into app-shell (it now lives in the hook). app-shell.tsx 1686 -> 1654
(-32 lines).
Contract re-pin (never deletes coverage): runtime-resume-routing-contract.test.ts read
the handler-shape assertions (resumeInterruptedSession / resumeLatest(sessionId) /
resumeParkToastCopy / no rejectionReasons.join) from app-shell.tsx single-file; they now
read use-shell-resume.ts where that logic lives, while the app-shell-specific assertions
(sendWithAttachments '/resume' guard, safeResumeAction= wiring) still read app-shell.tsx.
use-shell-resume.ts added to renderer-shell-source-helpers sourcePaths (Round B/E
precedent) so combined-source contracts see it.
Gates: desktop 2740/2740, ui 196/196, typecheck 0, check-dead-css clean, knip
desktop+ui exit 0, AUDIT_PORT_BASE=23900 alignment auditor exit 0 (all 10 fixtures
clean, real renderer). CDP turn-narrative branch-vs-baseline (real Electron, light+dark
1280) byte-identical (sha256 match) — proven render no-op.
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.

chore(desktop): CSS/token governance and magic-number cleanup

2 participants

@xuruiray@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

chore(desktop): clean up CSS token governance - #1085

Merged
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup
Jul 16, 2026
Merged

chore(desktop): clean up CSS token governance#1085
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup

Conversation

@xuruiray

@xuruirayxuruiray commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

  • split the settings stylesheet by concern, moving About, Bot, WeChat, and shared form rules out of theme-preview.css
  • replace phantom and dead CSS tokens, and introduce a governed --brand-wechat token for the QR flow
  • name renderer timing constants and replace repeated static icon/transition inline styles
  • use semantic settings tokens for selected/active states and focus rings in the extracted stylesheets
  • document the established camelCase selector dialect for styles/settings/** in both CSS governance guides

Why

theme-preview.css had become a grab bag for unrelated settings surfaces, while several component rules depended on fallback-only or raw color values. The cleanup makes ownership explicit without changing the settings component APIs.

The issue is still reproducible on current main: unrelated settings selectors remain in theme-preview.css, raw #07C160 values and fallback-only tokens are still present, and the extracted Bot/Form rules are absent.

Closes#1046.

Validation

Rebased onto fd6bd9e3 (origin/main) and validated from a clean dependency install:

  • npm run lint — passed (1621 files)
  • node scripts/check-dead-css.mjs --check — passed
  • npm run build — passed
  • npm run typecheck — passed
  • npm --workspace @maka/desktop test — passed (2571/2571)
  • npx playwright test --config e2e/playwright.config.ts — passed (25/25 real Electron E2E tests)

Visual validation

  • captured 13 Settings fixtures in light/dark themes at 1280px/990px viewports: 52 PR screenshots and 52 same-machine origin/main controls
  • 39/52 screenshot pairs were pixel-identical
  • the remaining 13 pairs differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility; manual review found no layout, clipping, overlap, or color regression
  • keyboard navigation to the shared Settings combobox retained a visible focus ring, at least 34px control height, and no horizontal overflow

Review focus

  • theme-preview.css is reduced from 670 lines on current main to 225 lines
  • About, Bot, WeChat, and shared form ownership moves to dedicated stylesheets
  • no settings component API or user-facing behavior change is intended

xuruirayand others added 2 commits July 16, 2026 19:50
Summary:
- use the governed brand token for About accents
- use focus-ring and focus-width tokens for settings selects
Rationale:
- satisfy the design-system governance contracts found during local validation
Tests:
- npm run lint
- npm run build
- npm run typecheck
- npm --workspace @maka/desktop test
Co-authored-by: Codex <codex@openai.com>
@xuruiray
xuruirayforce-pushed the xurui/issue-1046-css-token-cleanup branch from e59a03e to 20354e8CompareJuly 16, 2026 11:50
@xuruiray
xuruiray marked this pull request as ready for review July 16, 2026 11:55
@xuruiray

Copy link
Copy Markdown
ContributorAuthor

Visual validation — representative screenshots

Local validation on commit 20354e8c:

  • 13 Settings fixtures × light/dark × 1280px/990px
  • 52 PR screenshots compared with 52 same-machine origin/main controls
  • 39/52 pairs were pixel-identical
  • the remaining 13 differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility
  • manual review found no layout, clipping, overlap, or color regression
  • Electron E2E: 25/25 passed

About · light · 1280px

Settings About — light theme, 1280px

Remote access · dark · 990px

Settings Remote Access — dark theme, 990px

Appearance · dark · 1280px

Settings Appearance — dark theme, 1280px

Keyboard focus ring

Settings General Proxy — keyboard focus ring

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM

@Astro-Han
Astro-Han merged commit 9382f87 into apache:mainJul 16, 2026
3 checks passed
jackwener added a commit that referenced this pull request Jul 19, 2026
…nip zero-hint, resume hook, QR fixture (#1241)
* feat(core): add settings-bots-onboarding visual-smoke scenario + botOnboardingProvider
* feat(desktop): hold-in-waiting bot onboarding adapter + fixture state for QR capture
* feat(desktop): auto-open bot scan-login modal under settings-bots-onboarding fixture
* chore(scripts): register settings-bots-onboarding in capture + audit scenario lists
* fix(desktop): wait for QR paint before auto-capturing bot-onboarding fixture
* docs(notes): frontend architecture map — measured baseline + 8 staged rounds (2026-07-19)
Re-ran the census (wc over non-test TS/TSX for desktop main/preload/renderer +
packages/ui; CSS totals; top-10 hotspot table incl. visual-smoke-fixture.ts marked
OUT-OF-SCOPE other-sessions' territory). Staged R1 knip de-rot, R2 app-shell
resume-cluster extraction, R3 visual-smoke split (BLOCKED on concurrent fixture branch),
R4-R6 main.ts extractions (require maintainer-approved contract re-pins — registerIpc /
startup / tool-assembly / modelSupportsVision direct-pinned), R7 provider-connection-detail
decomposition (needs its own blade plan), R8 CSS raw-hex residue (verified clean on this
tip — #1085 already converted it).
* chore(knip): de-rot config — clear all 13 stale hints (R1)
knip reported 13 configuration hints (7 desktop + 6 ui), all redundant/stale config,
zero code impact:
- Drop 'overlayscrollbars' from desktop ignoreDependencies — now redundant (knip no
longer flags it; the package is owned by packages/ui and only referenced there). The
overlay-scrollbars contract forbids declaring it as a *desktop dependency*, not as an
ignore — removing a redundant ignore is compatible and coverage is unchanged.
- Delete the dead 'src/renderer/**/*.test.ts' entry glob (no matches — renderer has zero
test files; all 338 desktop tests live under src/main/__tests__/*.test.ts).
- Drop 11 redundant explicit entries knip already auto-detects: desktop
preload.ts / renderer/main.tsx / playwright.config.ts / .storybook/main.ts / dev.mjs
(vite / playwright / storybook / npm-scripts plugins), and all 6 ui entries
(index.ts, icons.tsx, artifact-preview-registry.ts, assistant-stream.ts, maka-uri.ts,
smooth-stream.ts) resolved from packages/ui package.json#exports.
Non-redundant entries kept verbatim (main.ts, overlay/*, main test glob, e2e specs,
storybook preview, stories, browser-observe-act-smoke.mjs, both ui test globs). No broad
ignores added — coverage is not weakened. knip --workspace apps/desktop and packages/ui
now both exit 0 AND report zero config hints (was: exit 0 with 13 hints).
* refactor(renderer): extract app-shell resume cluster into use-shell-resume (R2)
The #1223 safe-boundary resume cluster moves out of app-shell.tsx into a new
use-shell-resume.ts hook, following the use-shell-connections / use-shell-chat-model
house style (options object; state + handler returned; stable identities preserved).
Pure move, zero behavior change: the two useState declarations (resumePendingSessionId,
resumeParkDescriptionBySession) and the resumeInterruptedSession handler move verbatim;
activeId/toastApi/shellCopy/uiLocale are injected as options. app-shell keeps the banner
JSX wiring (safeResumeAction=) and the sendWithAttachments guard. resumeParkToastCopy is
no longer imported into app-shell (it now lives in the hook). app-shell.tsx 1686 -> 1654
(-32 lines).
Contract re-pin (never deletes coverage): runtime-resume-routing-contract.test.ts read
the handler-shape assertions (resumeInterruptedSession / resumeLatest(sessionId) /
resumeParkToastCopy / no rejectionReasons.join) from app-shell.tsx single-file; they now
read use-shell-resume.ts where that logic lives, while the app-shell-specific assertions
(sendWithAttachments '/resume' guard, safeResumeAction= wiring) still read app-shell.tsx.
use-shell-resume.ts added to renderer-shell-source-helpers sourcePaths (Round B/E
precedent) so combined-source contracts see it.
Gates: desktop 2740/2740, ui 196/196, typecheck 0, check-dead-css clean, knip
desktop+ui exit 0, AUDIT_PORT_BASE=23900 alignment auditor exit 0 (all 10 fixtures
clean, real renderer). CDP turn-narrative branch-vs-baseline (real Electron, light+dark
1280) byte-identical (sha256 match) — proven render no-op.
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.

chore(desktop): CSS/token governance and magic-number cleanup

2 participants

@xuruiray@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

chore(desktop): clean up CSS token governance - #1085

Merged
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup
Jul 16, 2026
Merged

chore(desktop): clean up CSS token governance#1085
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup

Conversation

@xuruiray

@xuruirayxuruiray commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

  • split the settings stylesheet by concern, moving About, Bot, WeChat, and shared form rules out of theme-preview.css
  • replace phantom and dead CSS tokens, and introduce a governed --brand-wechat token for the QR flow
  • name renderer timing constants and replace repeated static icon/transition inline styles
  • use semantic settings tokens for selected/active states and focus rings in the extracted stylesheets
  • document the established camelCase selector dialect for styles/settings/** in both CSS governance guides

Why

theme-preview.css had become a grab bag for unrelated settings surfaces, while several component rules depended on fallback-only or raw color values. The cleanup makes ownership explicit without changing the settings component APIs.

The issue is still reproducible on current main: unrelated settings selectors remain in theme-preview.css, raw #07C160 values and fallback-only tokens are still present, and the extracted Bot/Form rules are absent.

Closes#1046.

Validation

Rebased onto fd6bd9e3 (origin/main) and validated from a clean dependency install:

  • npm run lint — passed (1621 files)
  • node scripts/check-dead-css.mjs --check — passed
  • npm run build — passed
  • npm run typecheck — passed
  • npm --workspace @maka/desktop test — passed (2571/2571)
  • npx playwright test --config e2e/playwright.config.ts — passed (25/25 real Electron E2E tests)

Visual validation

  • captured 13 Settings fixtures in light/dark themes at 1280px/990px viewports: 52 PR screenshots and 52 same-machine origin/main controls
  • 39/52 screenshot pairs were pixel-identical
  • the remaining 13 pairs differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility; manual review found no layout, clipping, overlap, or color regression
  • keyboard navigation to the shared Settings combobox retained a visible focus ring, at least 34px control height, and no horizontal overflow

Review focus

  • theme-preview.css is reduced from 670 lines on current main to 225 lines
  • About, Bot, WeChat, and shared form ownership moves to dedicated stylesheets
  • no settings component API or user-facing behavior change is intended

xuruirayand others added 2 commits July 16, 2026 19:50
Summary:
- use the governed brand token for About accents
- use focus-ring and focus-width tokens for settings selects
Rationale:
- satisfy the design-system governance contracts found during local validation
Tests:
- npm run lint
- npm run build
- npm run typecheck
- npm --workspace @maka/desktop test
Co-authored-by: Codex <codex@openai.com>
@xuruiray
xuruirayforce-pushed the xurui/issue-1046-css-token-cleanup branch from e59a03e to 20354e8CompareJuly 16, 2026 11:50
@xuruiray
xuruiray marked this pull request as ready for review July 16, 2026 11:55
@xuruiray

Copy link
Copy Markdown
ContributorAuthor

Visual validation — representative screenshots

Local validation on commit 20354e8c:

  • 13 Settings fixtures × light/dark × 1280px/990px
  • 52 PR screenshots compared with 52 same-machine origin/main controls
  • 39/52 pairs were pixel-identical
  • the remaining 13 differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility
  • manual review found no layout, clipping, overlap, or color regression
  • Electron E2E: 25/25 passed

About · light · 1280px

Settings About — light theme, 1280px

Remote access · dark · 990px

Settings Remote Access — dark theme, 990px

Appearance · dark · 1280px

Settings Appearance — dark theme, 1280px

Keyboard focus ring

Settings General Proxy — keyboard focus ring

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM

@Astro-Han
Astro-Han merged commit 9382f87 into apache:mainJul 16, 2026
3 checks passed
jackwener added a commit that referenced this pull request Jul 19, 2026
…nip zero-hint, resume hook, QR fixture (#1241)
* feat(core): add settings-bots-onboarding visual-smoke scenario + botOnboardingProvider
* feat(desktop): hold-in-waiting bot onboarding adapter + fixture state for QR capture
* feat(desktop): auto-open bot scan-login modal under settings-bots-onboarding fixture
* chore(scripts): register settings-bots-onboarding in capture + audit scenario lists
* fix(desktop): wait for QR paint before auto-capturing bot-onboarding fixture
* docs(notes): frontend architecture map — measured baseline + 8 staged rounds (2026-07-19)
Re-ran the census (wc over non-test TS/TSX for desktop main/preload/renderer +
packages/ui; CSS totals; top-10 hotspot table incl. visual-smoke-fixture.ts marked
OUT-OF-SCOPE other-sessions' territory). Staged R1 knip de-rot, R2 app-shell
resume-cluster extraction, R3 visual-smoke split (BLOCKED on concurrent fixture branch),
R4-R6 main.ts extractions (require maintainer-approved contract re-pins — registerIpc /
startup / tool-assembly / modelSupportsVision direct-pinned), R7 provider-connection-detail
decomposition (needs its own blade plan), R8 CSS raw-hex residue (verified clean on this
tip — #1085 already converted it).
* chore(knip): de-rot config — clear all 13 stale hints (R1)
knip reported 13 configuration hints (7 desktop + 6 ui), all redundant/stale config,
zero code impact:
- Drop 'overlayscrollbars' from desktop ignoreDependencies — now redundant (knip no
longer flags it; the package is owned by packages/ui and only referenced there). The
overlay-scrollbars contract forbids declaring it as a *desktop dependency*, not as an
ignore — removing a redundant ignore is compatible and coverage is unchanged.
- Delete the dead 'src/renderer/**/*.test.ts' entry glob (no matches — renderer has zero
test files; all 338 desktop tests live under src/main/__tests__/*.test.ts).
- Drop 11 redundant explicit entries knip already auto-detects: desktop
preload.ts / renderer/main.tsx / playwright.config.ts / .storybook/main.ts / dev.mjs
(vite / playwright / storybook / npm-scripts plugins), and all 6 ui entries
(index.ts, icons.tsx, artifact-preview-registry.ts, assistant-stream.ts, maka-uri.ts,
smooth-stream.ts) resolved from packages/ui package.json#exports.
Non-redundant entries kept verbatim (main.ts, overlay/*, main test glob, e2e specs,
storybook preview, stories, browser-observe-act-smoke.mjs, both ui test globs). No broad
ignores added — coverage is not weakened. knip --workspace apps/desktop and packages/ui
now both exit 0 AND report zero config hints (was: exit 0 with 13 hints).
* refactor(renderer): extract app-shell resume cluster into use-shell-resume (R2)
The #1223 safe-boundary resume cluster moves out of app-shell.tsx into a new
use-shell-resume.ts hook, following the use-shell-connections / use-shell-chat-model
house style (options object; state + handler returned; stable identities preserved).
Pure move, zero behavior change: the two useState declarations (resumePendingSessionId,
resumeParkDescriptionBySession) and the resumeInterruptedSession handler move verbatim;
activeId/toastApi/shellCopy/uiLocale are injected as options. app-shell keeps the banner
JSX wiring (safeResumeAction=) and the sendWithAttachments guard. resumeParkToastCopy is
no longer imported into app-shell (it now lives in the hook). app-shell.tsx 1686 -> 1654
(-32 lines).
Contract re-pin (never deletes coverage): runtime-resume-routing-contract.test.ts read
the handler-shape assertions (resumeInterruptedSession / resumeLatest(sessionId) /
resumeParkToastCopy / no rejectionReasons.join) from app-shell.tsx single-file; they now
read use-shell-resume.ts where that logic lives, while the app-shell-specific assertions
(sendWithAttachments '/resume' guard, safeResumeAction= wiring) still read app-shell.tsx.
use-shell-resume.ts added to renderer-shell-source-helpers sourcePaths (Round B/E
precedent) so combined-source contracts see it.
Gates: desktop 2740/2740, ui 196/196, typecheck 0, check-dead-css clean, knip
desktop+ui exit 0, AUDIT_PORT_BASE=23900 alignment auditor exit 0 (all 10 fixtures
clean, real renderer). CDP turn-narrative branch-vs-baseline (real Electron, light+dark
1280) byte-identical (sha256 match) — proven render no-op.
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.

chore(desktop): CSS/token governance and magic-number cleanup

2 participants

@xuruiray@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

chore(desktop): clean up CSS token governance - #1085

Merged
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup
Jul 16, 2026
Merged

chore(desktop): clean up CSS token governance#1085
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup

Conversation

@xuruiray

@xuruirayxuruiray commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

  • split the settings stylesheet by concern, moving About, Bot, WeChat, and shared form rules out of theme-preview.css
  • replace phantom and dead CSS tokens, and introduce a governed --brand-wechat token for the QR flow
  • name renderer timing constants and replace repeated static icon/transition inline styles
  • use semantic settings tokens for selected/active states and focus rings in the extracted stylesheets
  • document the established camelCase selector dialect for styles/settings/** in both CSS governance guides

Why

theme-preview.css had become a grab bag for unrelated settings surfaces, while several component rules depended on fallback-only or raw color values. The cleanup makes ownership explicit without changing the settings component APIs.

The issue is still reproducible on current main: unrelated settings selectors remain in theme-preview.css, raw #07C160 values and fallback-only tokens are still present, and the extracted Bot/Form rules are absent.

Closes#1046.

Validation

Rebased onto fd6bd9e3 (origin/main) and validated from a clean dependency install:

  • npm run lint — passed (1621 files)
  • node scripts/check-dead-css.mjs --check — passed
  • npm run build — passed
  • npm run typecheck — passed
  • npm --workspace @maka/desktop test — passed (2571/2571)
  • npx playwright test --config e2e/playwright.config.ts — passed (25/25 real Electron E2E tests)

Visual validation

  • captured 13 Settings fixtures in light/dark themes at 1280px/990px viewports: 52 PR screenshots and 52 same-machine origin/main controls
  • 39/52 screenshot pairs were pixel-identical
  • the remaining 13 pairs differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility; manual review found no layout, clipping, overlap, or color regression
  • keyboard navigation to the shared Settings combobox retained a visible focus ring, at least 34px control height, and no horizontal overflow

Review focus

  • theme-preview.css is reduced from 670 lines on current main to 225 lines
  • About, Bot, WeChat, and shared form ownership moves to dedicated stylesheets
  • no settings component API or user-facing behavior change is intended

xuruirayand others added 2 commits July 16, 2026 19:50
Summary:
- use the governed brand token for About accents
- use focus-ring and focus-width tokens for settings selects
Rationale:
- satisfy the design-system governance contracts found during local validation
Tests:
- npm run lint
- npm run build
- npm run typecheck
- npm --workspace @maka/desktop test
Co-authored-by: Codex <codex@openai.com>
@xuruiray
xuruirayforce-pushed the xurui/issue-1046-css-token-cleanup branch from e59a03e to 20354e8CompareJuly 16, 2026 11:50
@xuruiray
xuruiray marked this pull request as ready for review July 16, 2026 11:55
@xuruiray

Copy link
Copy Markdown
ContributorAuthor

Visual validation — representative screenshots

Local validation on commit 20354e8c:

  • 13 Settings fixtures × light/dark × 1280px/990px
  • 52 PR screenshots compared with 52 same-machine origin/main controls
  • 39/52 pairs were pixel-identical
  • the remaining 13 differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility
  • manual review found no layout, clipping, overlap, or color regression
  • Electron E2E: 25/25 passed

About · light · 1280px

Settings About — light theme, 1280px

Remote access · dark · 990px

Settings Remote Access — dark theme, 990px

Appearance · dark · 1280px

Settings Appearance — dark theme, 1280px

Keyboard focus ring

Settings General Proxy — keyboard focus ring

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM

@Astro-Han
Astro-Han merged commit 9382f87 into apache:mainJul 16, 2026
3 checks passed
jackwener added a commit that referenced this pull request Jul 19, 2026
…nip zero-hint, resume hook, QR fixture (#1241)
* feat(core): add settings-bots-onboarding visual-smoke scenario + botOnboardingProvider
* feat(desktop): hold-in-waiting bot onboarding adapter + fixture state for QR capture
* feat(desktop): auto-open bot scan-login modal under settings-bots-onboarding fixture
* chore(scripts): register settings-bots-onboarding in capture + audit scenario lists
* fix(desktop): wait for QR paint before auto-capturing bot-onboarding fixture
* docs(notes): frontend architecture map — measured baseline + 8 staged rounds (2026-07-19)
Re-ran the census (wc over non-test TS/TSX for desktop main/preload/renderer +
packages/ui; CSS totals; top-10 hotspot table incl. visual-smoke-fixture.ts marked
OUT-OF-SCOPE other-sessions' territory). Staged R1 knip de-rot, R2 app-shell
resume-cluster extraction, R3 visual-smoke split (BLOCKED on concurrent fixture branch),
R4-R6 main.ts extractions (require maintainer-approved contract re-pins — registerIpc /
startup / tool-assembly / modelSupportsVision direct-pinned), R7 provider-connection-detail
decomposition (needs its own blade plan), R8 CSS raw-hex residue (verified clean on this
tip — #1085 already converted it).
* chore(knip): de-rot config — clear all 13 stale hints (R1)
knip reported 13 configuration hints (7 desktop + 6 ui), all redundant/stale config,
zero code impact:
- Drop 'overlayscrollbars' from desktop ignoreDependencies — now redundant (knip no
longer flags it; the package is owned by packages/ui and only referenced there). The
overlay-scrollbars contract forbids declaring it as a *desktop dependency*, not as an
ignore — removing a redundant ignore is compatible and coverage is unchanged.
- Delete the dead 'src/renderer/**/*.test.ts' entry glob (no matches — renderer has zero
test files; all 338 desktop tests live under src/main/__tests__/*.test.ts).
- Drop 11 redundant explicit entries knip already auto-detects: desktop
preload.ts / renderer/main.tsx / playwright.config.ts / .storybook/main.ts / dev.mjs
(vite / playwright / storybook / npm-scripts plugins), and all 6 ui entries
(index.ts, icons.tsx, artifact-preview-registry.ts, assistant-stream.ts, maka-uri.ts,
smooth-stream.ts) resolved from packages/ui package.json#exports.
Non-redundant entries kept verbatim (main.ts, overlay/*, main test glob, e2e specs,
storybook preview, stories, browser-observe-act-smoke.mjs, both ui test globs). No broad
ignores added — coverage is not weakened. knip --workspace apps/desktop and packages/ui
now both exit 0 AND report zero config hints (was: exit 0 with 13 hints).
* refactor(renderer): extract app-shell resume cluster into use-shell-resume (R2)
The #1223 safe-boundary resume cluster moves out of app-shell.tsx into a new
use-shell-resume.ts hook, following the use-shell-connections / use-shell-chat-model
house style (options object; state + handler returned; stable identities preserved).
Pure move, zero behavior change: the two useState declarations (resumePendingSessionId,
resumeParkDescriptionBySession) and the resumeInterruptedSession handler move verbatim;
activeId/toastApi/shellCopy/uiLocale are injected as options. app-shell keeps the banner
JSX wiring (safeResumeAction=) and the sendWithAttachments guard. resumeParkToastCopy is
no longer imported into app-shell (it now lives in the hook). app-shell.tsx 1686 -> 1654
(-32 lines).
Contract re-pin (never deletes coverage): runtime-resume-routing-contract.test.ts read
the handler-shape assertions (resumeInterruptedSession / resumeLatest(sessionId) /
resumeParkToastCopy / no rejectionReasons.join) from app-shell.tsx single-file; they now
read use-shell-resume.ts where that logic lives, while the app-shell-specific assertions
(sendWithAttachments '/resume' guard, safeResumeAction= wiring) still read app-shell.tsx.
use-shell-resume.ts added to renderer-shell-source-helpers sourcePaths (Round B/E
precedent) so combined-source contracts see it.
Gates: desktop 2740/2740, ui 196/196, typecheck 0, check-dead-css clean, knip
desktop+ui exit 0, AUDIT_PORT_BASE=23900 alignment auditor exit 0 (all 10 fixtures
clean, real renderer). CDP turn-narrative branch-vs-baseline (real Electron, light+dark
1280) byte-identical (sha256 match) — proven render no-op.
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.

chore(desktop): CSS/token governance and magic-number cleanup

2 participants

@xuruiray@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

chore(desktop): clean up CSS token governance - #1085

Merged
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup
Jul 16, 2026
Merged

chore(desktop): clean up CSS token governance#1085
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup

Conversation

@xuruiray

@xuruirayxuruiray commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

  • split the settings stylesheet by concern, moving About, Bot, WeChat, and shared form rules out of theme-preview.css
  • replace phantom and dead CSS tokens, and introduce a governed --brand-wechat token for the QR flow
  • name renderer timing constants and replace repeated static icon/transition inline styles
  • use semantic settings tokens for selected/active states and focus rings in the extracted stylesheets
  • document the established camelCase selector dialect for styles/settings/** in both CSS governance guides

Why

theme-preview.css had become a grab bag for unrelated settings surfaces, while several component rules depended on fallback-only or raw color values. The cleanup makes ownership explicit without changing the settings component APIs.

The issue is still reproducible on current main: unrelated settings selectors remain in theme-preview.css, raw #07C160 values and fallback-only tokens are still present, and the extracted Bot/Form rules are absent.

Closes#1046.

Validation

Rebased onto fd6bd9e3 (origin/main) and validated from a clean dependency install:

  • npm run lint — passed (1621 files)
  • node scripts/check-dead-css.mjs --check — passed
  • npm run build — passed
  • npm run typecheck — passed
  • npm --workspace @maka/desktop test — passed (2571/2571)
  • npx playwright test --config e2e/playwright.config.ts — passed (25/25 real Electron E2E tests)

Visual validation

  • captured 13 Settings fixtures in light/dark themes at 1280px/990px viewports: 52 PR screenshots and 52 same-machine origin/main controls
  • 39/52 screenshot pairs were pixel-identical
  • the remaining 13 pairs differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility; manual review found no layout, clipping, overlap, or color regression
  • keyboard navigation to the shared Settings combobox retained a visible focus ring, at least 34px control height, and no horizontal overflow

Review focus

  • theme-preview.css is reduced from 670 lines on current main to 225 lines
  • About, Bot, WeChat, and shared form ownership moves to dedicated stylesheets
  • no settings component API or user-facing behavior change is intended

xuruirayand others added 2 commits July 16, 2026 19:50
Summary:
- use the governed brand token for About accents
- use focus-ring and focus-width tokens for settings selects
Rationale:
- satisfy the design-system governance contracts found during local validation
Tests:
- npm run lint
- npm run build
- npm run typecheck
- npm --workspace @maka/desktop test
Co-authored-by: Codex <codex@openai.com>
@xuruiray
xuruirayforce-pushed the xurui/issue-1046-css-token-cleanup branch from e59a03e to 20354e8CompareJuly 16, 2026 11:50
@xuruiray
xuruiray marked this pull request as ready for review July 16, 2026 11:55
@xuruiray

Copy link
Copy Markdown
ContributorAuthor

Visual validation — representative screenshots

Local validation on commit 20354e8c:

  • 13 Settings fixtures × light/dark × 1280px/990px
  • 52 PR screenshots compared with 52 same-machine origin/main controls
  • 39/52 pairs were pixel-identical
  • the remaining 13 differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility
  • manual review found no layout, clipping, overlap, or color regression
  • Electron E2E: 25/25 passed

About · light · 1280px

Settings About — light theme, 1280px

Remote access · dark · 990px

Settings Remote Access — dark theme, 990px

Appearance · dark · 1280px

Settings Appearance — dark theme, 1280px

Keyboard focus ring

Settings General Proxy — keyboard focus ring

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM

@Astro-Han
Astro-Han merged commit 9382f87 into apache:mainJul 16, 2026
3 checks passed
jackwener added a commit that referenced this pull request Jul 19, 2026
…nip zero-hint, resume hook, QR fixture (#1241)
* feat(core): add settings-bots-onboarding visual-smoke scenario + botOnboardingProvider
* feat(desktop): hold-in-waiting bot onboarding adapter + fixture state for QR capture
* feat(desktop): auto-open bot scan-login modal under settings-bots-onboarding fixture
* chore(scripts): register settings-bots-onboarding in capture + audit scenario lists
* fix(desktop): wait for QR paint before auto-capturing bot-onboarding fixture
* docs(notes): frontend architecture map — measured baseline + 8 staged rounds (2026-07-19)
Re-ran the census (wc over non-test TS/TSX for desktop main/preload/renderer +
packages/ui; CSS totals; top-10 hotspot table incl. visual-smoke-fixture.ts marked
OUT-OF-SCOPE other-sessions' territory). Staged R1 knip de-rot, R2 app-shell
resume-cluster extraction, R3 visual-smoke split (BLOCKED on concurrent fixture branch),
R4-R6 main.ts extractions (require maintainer-approved contract re-pins — registerIpc /
startup / tool-assembly / modelSupportsVision direct-pinned), R7 provider-connection-detail
decomposition (needs its own blade plan), R8 CSS raw-hex residue (verified clean on this
tip — #1085 already converted it).
* chore(knip): de-rot config — clear all 13 stale hints (R1)
knip reported 13 configuration hints (7 desktop + 6 ui), all redundant/stale config,
zero code impact:
- Drop 'overlayscrollbars' from desktop ignoreDependencies — now redundant (knip no
longer flags it; the package is owned by packages/ui and only referenced there). The
overlay-scrollbars contract forbids declaring it as a *desktop dependency*, not as an
ignore — removing a redundant ignore is compatible and coverage is unchanged.
- Delete the dead 'src/renderer/**/*.test.ts' entry glob (no matches — renderer has zero
test files; all 338 desktop tests live under src/main/__tests__/*.test.ts).
- Drop 11 redundant explicit entries knip already auto-detects: desktop
preload.ts / renderer/main.tsx / playwright.config.ts / .storybook/main.ts / dev.mjs
(vite / playwright / storybook / npm-scripts plugins), and all 6 ui entries
(index.ts, icons.tsx, artifact-preview-registry.ts, assistant-stream.ts, maka-uri.ts,
smooth-stream.ts) resolved from packages/ui package.json#exports.
Non-redundant entries kept verbatim (main.ts, overlay/*, main test glob, e2e specs,
storybook preview, stories, browser-observe-act-smoke.mjs, both ui test globs). No broad
ignores added — coverage is not weakened. knip --workspace apps/desktop and packages/ui
now both exit 0 AND report zero config hints (was: exit 0 with 13 hints).
* refactor(renderer): extract app-shell resume cluster into use-shell-resume (R2)
The #1223 safe-boundary resume cluster moves out of app-shell.tsx into a new
use-shell-resume.ts hook, following the use-shell-connections / use-shell-chat-model
house style (options object; state + handler returned; stable identities preserved).
Pure move, zero behavior change: the two useState declarations (resumePendingSessionId,
resumeParkDescriptionBySession) and the resumeInterruptedSession handler move verbatim;
activeId/toastApi/shellCopy/uiLocale are injected as options. app-shell keeps the banner
JSX wiring (safeResumeAction=) and the sendWithAttachments guard. resumeParkToastCopy is
no longer imported into app-shell (it now lives in the hook). app-shell.tsx 1686 -> 1654
(-32 lines).
Contract re-pin (never deletes coverage): runtime-resume-routing-contract.test.ts read
the handler-shape assertions (resumeInterruptedSession / resumeLatest(sessionId) /
resumeParkToastCopy / no rejectionReasons.join) from app-shell.tsx single-file; they now
read use-shell-resume.ts where that logic lives, while the app-shell-specific assertions
(sendWithAttachments '/resume' guard, safeResumeAction= wiring) still read app-shell.tsx.
use-shell-resume.ts added to renderer-shell-source-helpers sourcePaths (Round B/E
precedent) so combined-source contracts see it.
Gates: desktop 2740/2740, ui 196/196, typecheck 0, check-dead-css clean, knip
desktop+ui exit 0, AUDIT_PORT_BASE=23900 alignment auditor exit 0 (all 10 fixtures
clean, real renderer). CDP turn-narrative branch-vs-baseline (real Electron, light+dark
1280) byte-identical (sha256 match) — proven render no-op.
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.

chore(desktop): CSS/token governance and magic-number cleanup

2 participants

@xuruiray@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

chore(desktop): clean up CSS token governance - #1085

Merged
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup
Jul 16, 2026
Merged

chore(desktop): clean up CSS token governance#1085
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup

Conversation

@xuruiray

@xuruirayxuruiray commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

  • split the settings stylesheet by concern, moving About, Bot, WeChat, and shared form rules out of theme-preview.css
  • replace phantom and dead CSS tokens, and introduce a governed --brand-wechat token for the QR flow
  • name renderer timing constants and replace repeated static icon/transition inline styles
  • use semantic settings tokens for selected/active states and focus rings in the extracted stylesheets
  • document the established camelCase selector dialect for styles/settings/** in both CSS governance guides

Why

theme-preview.css had become a grab bag for unrelated settings surfaces, while several component rules depended on fallback-only or raw color values. The cleanup makes ownership explicit without changing the settings component APIs.

The issue is still reproducible on current main: unrelated settings selectors remain in theme-preview.css, raw #07C160 values and fallback-only tokens are still present, and the extracted Bot/Form rules are absent.

Closes#1046.

Validation

Rebased onto fd6bd9e3 (origin/main) and validated from a clean dependency install:

  • npm run lint — passed (1621 files)
  • node scripts/check-dead-css.mjs --check — passed
  • npm run build — passed
  • npm run typecheck — passed
  • npm --workspace @maka/desktop test — passed (2571/2571)
  • npx playwright test --config e2e/playwright.config.ts — passed (25/25 real Electron E2E tests)

Visual validation

  • captured 13 Settings fixtures in light/dark themes at 1280px/990px viewports: 52 PR screenshots and 52 same-machine origin/main controls
  • 39/52 screenshot pairs were pixel-identical
  • the remaining 13 pairs differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility; manual review found no layout, clipping, overlap, or color regression
  • keyboard navigation to the shared Settings combobox retained a visible focus ring, at least 34px control height, and no horizontal overflow

Review focus

  • theme-preview.css is reduced from 670 lines on current main to 225 lines
  • About, Bot, WeChat, and shared form ownership moves to dedicated stylesheets
  • no settings component API or user-facing behavior change is intended

xuruirayand others added 2 commits July 16, 2026 19:50
Summary:
- use the governed brand token for About accents
- use focus-ring and focus-width tokens for settings selects
Rationale:
- satisfy the design-system governance contracts found during local validation
Tests:
- npm run lint
- npm run build
- npm run typecheck
- npm --workspace @maka/desktop test
Co-authored-by: Codex <codex@openai.com>
@xuruiray
xuruirayforce-pushed the xurui/issue-1046-css-token-cleanup branch from e59a03e to 20354e8CompareJuly 16, 2026 11:50
@xuruiray
xuruiray marked this pull request as ready for review July 16, 2026 11:55
@xuruiray

Copy link
Copy Markdown
ContributorAuthor

Visual validation — representative screenshots

Local validation on commit 20354e8c:

  • 13 Settings fixtures × light/dark × 1280px/990px
  • 52 PR screenshots compared with 52 same-machine origin/main controls
  • 39/52 pairs were pixel-identical
  • the remaining 13 differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility
  • manual review found no layout, clipping, overlap, or color regression
  • Electron E2E: 25/25 passed

About · light · 1280px

Settings About — light theme, 1280px

Remote access · dark · 990px

Settings Remote Access — dark theme, 990px

Appearance · dark · 1280px

Settings Appearance — dark theme, 1280px

Keyboard focus ring

Settings General Proxy — keyboard focus ring

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM

@Astro-Han
Astro-Han merged commit 9382f87 into apache:mainJul 16, 2026
3 checks passed
jackwener added a commit that referenced this pull request Jul 19, 2026
…nip zero-hint, resume hook, QR fixture (#1241)
* feat(core): add settings-bots-onboarding visual-smoke scenario + botOnboardingProvider
* feat(desktop): hold-in-waiting bot onboarding adapter + fixture state for QR capture
* feat(desktop): auto-open bot scan-login modal under settings-bots-onboarding fixture
* chore(scripts): register settings-bots-onboarding in capture + audit scenario lists
* fix(desktop): wait for QR paint before auto-capturing bot-onboarding fixture
* docs(notes): frontend architecture map — measured baseline + 8 staged rounds (2026-07-19)
Re-ran the census (wc over non-test TS/TSX for desktop main/preload/renderer +
packages/ui; CSS totals; top-10 hotspot table incl. visual-smoke-fixture.ts marked
OUT-OF-SCOPE other-sessions' territory). Staged R1 knip de-rot, R2 app-shell
resume-cluster extraction, R3 visual-smoke split (BLOCKED on concurrent fixture branch),
R4-R6 main.ts extractions (require maintainer-approved contract re-pins — registerIpc /
startup / tool-assembly / modelSupportsVision direct-pinned), R7 provider-connection-detail
decomposition (needs its own blade plan), R8 CSS raw-hex residue (verified clean on this
tip — #1085 already converted it).
* chore(knip): de-rot config — clear all 13 stale hints (R1)
knip reported 13 configuration hints (7 desktop + 6 ui), all redundant/stale config,
zero code impact:
- Drop 'overlayscrollbars' from desktop ignoreDependencies — now redundant (knip no
longer flags it; the package is owned by packages/ui and only referenced there). The
overlay-scrollbars contract forbids declaring it as a *desktop dependency*, not as an
ignore — removing a redundant ignore is compatible and coverage is unchanged.
- Delete the dead 'src/renderer/**/*.test.ts' entry glob (no matches — renderer has zero
test files; all 338 desktop tests live under src/main/__tests__/*.test.ts).
- Drop 11 redundant explicit entries knip already auto-detects: desktop
preload.ts / renderer/main.tsx / playwright.config.ts / .storybook/main.ts / dev.mjs
(vite / playwright / storybook / npm-scripts plugins), and all 6 ui entries
(index.ts, icons.tsx, artifact-preview-registry.ts, assistant-stream.ts, maka-uri.ts,
smooth-stream.ts) resolved from packages/ui package.json#exports.
Non-redundant entries kept verbatim (main.ts, overlay/*, main test glob, e2e specs,
storybook preview, stories, browser-observe-act-smoke.mjs, both ui test globs). No broad
ignores added — coverage is not weakened. knip --workspace apps/desktop and packages/ui
now both exit 0 AND report zero config hints (was: exit 0 with 13 hints).
* refactor(renderer): extract app-shell resume cluster into use-shell-resume (R2)
The #1223 safe-boundary resume cluster moves out of app-shell.tsx into a new
use-shell-resume.ts hook, following the use-shell-connections / use-shell-chat-model
house style (options object; state + handler returned; stable identities preserved).
Pure move, zero behavior change: the two useState declarations (resumePendingSessionId,
resumeParkDescriptionBySession) and the resumeInterruptedSession handler move verbatim;
activeId/toastApi/shellCopy/uiLocale are injected as options. app-shell keeps the banner
JSX wiring (safeResumeAction=) and the sendWithAttachments guard. resumeParkToastCopy is
no longer imported into app-shell (it now lives in the hook). app-shell.tsx 1686 -> 1654
(-32 lines).
Contract re-pin (never deletes coverage): runtime-resume-routing-contract.test.ts read
the handler-shape assertions (resumeInterruptedSession / resumeLatest(sessionId) /
resumeParkToastCopy / no rejectionReasons.join) from app-shell.tsx single-file; they now
read use-shell-resume.ts where that logic lives, while the app-shell-specific assertions
(sendWithAttachments '/resume' guard, safeResumeAction= wiring) still read app-shell.tsx.
use-shell-resume.ts added to renderer-shell-source-helpers sourcePaths (Round B/E
precedent) so combined-source contracts see it.
Gates: desktop 2740/2740, ui 196/196, typecheck 0, check-dead-css clean, knip
desktop+ui exit 0, AUDIT_PORT_BASE=23900 alignment auditor exit 0 (all 10 fixtures
clean, real renderer). CDP turn-narrative branch-vs-baseline (real Electron, light+dark
1280) byte-identical (sha256 match) — proven render no-op.
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.

chore(desktop): CSS/token governance and magic-number cleanup

2 participants

@xuruiray@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

chore(desktop): clean up CSS token governance - #1085

Merged
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup
Jul 16, 2026
Merged

chore(desktop): clean up CSS token governance#1085
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup

Conversation

@xuruiray

@xuruirayxuruiray commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

  • split the settings stylesheet by concern, moving About, Bot, WeChat, and shared form rules out of theme-preview.css
  • replace phantom and dead CSS tokens, and introduce a governed --brand-wechat token for the QR flow
  • name renderer timing constants and replace repeated static icon/transition inline styles
  • use semantic settings tokens for selected/active states and focus rings in the extracted stylesheets
  • document the established camelCase selector dialect for styles/settings/** in both CSS governance guides

Why

theme-preview.css had become a grab bag for unrelated settings surfaces, while several component rules depended on fallback-only or raw color values. The cleanup makes ownership explicit without changing the settings component APIs.

The issue is still reproducible on current main: unrelated settings selectors remain in theme-preview.css, raw #07C160 values and fallback-only tokens are still present, and the extracted Bot/Form rules are absent.

Closes#1046.

Validation

Rebased onto fd6bd9e3 (origin/main) and validated from a clean dependency install:

  • npm run lint — passed (1621 files)
  • node scripts/check-dead-css.mjs --check — passed
  • npm run build — passed
  • npm run typecheck — passed
  • npm --workspace @maka/desktop test — passed (2571/2571)
  • npx playwright test --config e2e/playwright.config.ts — passed (25/25 real Electron E2E tests)

Visual validation

  • captured 13 Settings fixtures in light/dark themes at 1280px/990px viewports: 52 PR screenshots and 52 same-machine origin/main controls
  • 39/52 screenshot pairs were pixel-identical
  • the remaining 13 pairs differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility; manual review found no layout, clipping, overlap, or color regression
  • keyboard navigation to the shared Settings combobox retained a visible focus ring, at least 34px control height, and no horizontal overflow

Review focus

  • theme-preview.css is reduced from 670 lines on current main to 225 lines
  • About, Bot, WeChat, and shared form ownership moves to dedicated stylesheets
  • no settings component API or user-facing behavior change is intended

xuruirayand others added 2 commits July 16, 2026 19:50
Summary:
- use the governed brand token for About accents
- use focus-ring and focus-width tokens for settings selects
Rationale:
- satisfy the design-system governance contracts found during local validation
Tests:
- npm run lint
- npm run build
- npm run typecheck
- npm --workspace @maka/desktop test
Co-authored-by: Codex <codex@openai.com>
@xuruiray
xuruirayforce-pushed the xurui/issue-1046-css-token-cleanup branch from e59a03e to 20354e8CompareJuly 16, 2026 11:50
@xuruiray
xuruiray marked this pull request as ready for review July 16, 2026 11:55
@xuruiray

Copy link
Copy Markdown
ContributorAuthor

Visual validation — representative screenshots

Local validation on commit 20354e8c:

  • 13 Settings fixtures × light/dark × 1280px/990px
  • 52 PR screenshots compared with 52 same-machine origin/main controls
  • 39/52 pairs were pixel-identical
  • the remaining 13 differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility
  • manual review found no layout, clipping, overlap, or color regression
  • Electron E2E: 25/25 passed

About · light · 1280px

Settings About — light theme, 1280px

Remote access · dark · 990px

Settings Remote Access — dark theme, 990px

Appearance · dark · 1280px

Settings Appearance — dark theme, 1280px

Keyboard focus ring

Settings General Proxy — keyboard focus ring

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM

@Astro-Han
Astro-Han merged commit 9382f87 into apache:mainJul 16, 2026
3 checks passed
jackwener added a commit that referenced this pull request Jul 19, 2026
…nip zero-hint, resume hook, QR fixture (#1241)
* feat(core): add settings-bots-onboarding visual-smoke scenario + botOnboardingProvider
* feat(desktop): hold-in-waiting bot onboarding adapter + fixture state for QR capture
* feat(desktop): auto-open bot scan-login modal under settings-bots-onboarding fixture
* chore(scripts): register settings-bots-onboarding in capture + audit scenario lists
* fix(desktop): wait for QR paint before auto-capturing bot-onboarding fixture
* docs(notes): frontend architecture map — measured baseline + 8 staged rounds (2026-07-19)
Re-ran the census (wc over non-test TS/TSX for desktop main/preload/renderer +
packages/ui; CSS totals; top-10 hotspot table incl. visual-smoke-fixture.ts marked
OUT-OF-SCOPE other-sessions' territory). Staged R1 knip de-rot, R2 app-shell
resume-cluster extraction, R3 visual-smoke split (BLOCKED on concurrent fixture branch),
R4-R6 main.ts extractions (require maintainer-approved contract re-pins — registerIpc /
startup / tool-assembly / modelSupportsVision direct-pinned), R7 provider-connection-detail
decomposition (needs its own blade plan), R8 CSS raw-hex residue (verified clean on this
tip — #1085 already converted it).
* chore(knip): de-rot config — clear all 13 stale hints (R1)
knip reported 13 configuration hints (7 desktop + 6 ui), all redundant/stale config,
zero code impact:
- Drop 'overlayscrollbars' from desktop ignoreDependencies — now redundant (knip no
longer flags it; the package is owned by packages/ui and only referenced there). The
overlay-scrollbars contract forbids declaring it as a *desktop dependency*, not as an
ignore — removing a redundant ignore is compatible and coverage is unchanged.
- Delete the dead 'src/renderer/**/*.test.ts' entry glob (no matches — renderer has zero
test files; all 338 desktop tests live under src/main/__tests__/*.test.ts).
- Drop 11 redundant explicit entries knip already auto-detects: desktop
preload.ts / renderer/main.tsx / playwright.config.ts / .storybook/main.ts / dev.mjs
(vite / playwright / storybook / npm-scripts plugins), and all 6 ui entries
(index.ts, icons.tsx, artifact-preview-registry.ts, assistant-stream.ts, maka-uri.ts,
smooth-stream.ts) resolved from packages/ui package.json#exports.
Non-redundant entries kept verbatim (main.ts, overlay/*, main test glob, e2e specs,
storybook preview, stories, browser-observe-act-smoke.mjs, both ui test globs). No broad
ignores added — coverage is not weakened. knip --workspace apps/desktop and packages/ui
now both exit 0 AND report zero config hints (was: exit 0 with 13 hints).
* refactor(renderer): extract app-shell resume cluster into use-shell-resume (R2)
The #1223 safe-boundary resume cluster moves out of app-shell.tsx into a new
use-shell-resume.ts hook, following the use-shell-connections / use-shell-chat-model
house style (options object; state + handler returned; stable identities preserved).
Pure move, zero behavior change: the two useState declarations (resumePendingSessionId,
resumeParkDescriptionBySession) and the resumeInterruptedSession handler move verbatim;
activeId/toastApi/shellCopy/uiLocale are injected as options. app-shell keeps the banner
JSX wiring (safeResumeAction=) and the sendWithAttachments guard. resumeParkToastCopy is
no longer imported into app-shell (it now lives in the hook). app-shell.tsx 1686 -> 1654
(-32 lines).
Contract re-pin (never deletes coverage): runtime-resume-routing-contract.test.ts read
the handler-shape assertions (resumeInterruptedSession / resumeLatest(sessionId) /
resumeParkToastCopy / no rejectionReasons.join) from app-shell.tsx single-file; they now
read use-shell-resume.ts where that logic lives, while the app-shell-specific assertions
(sendWithAttachments '/resume' guard, safeResumeAction= wiring) still read app-shell.tsx.
use-shell-resume.ts added to renderer-shell-source-helpers sourcePaths (Round B/E
precedent) so combined-source contracts see it.
Gates: desktop 2740/2740, ui 196/196, typecheck 0, check-dead-css clean, knip
desktop+ui exit 0, AUDIT_PORT_BASE=23900 alignment auditor exit 0 (all 10 fixtures
clean, real renderer). CDP turn-narrative branch-vs-baseline (real Electron, light+dark
1280) byte-identical (sha256 match) — proven render no-op.
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.

chore(desktop): CSS/token governance and magic-number cleanup

2 participants

@xuruiray@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

chore(desktop): clean up CSS token governance - #1085

Merged
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup
Jul 16, 2026
Merged

chore(desktop): clean up CSS token governance#1085
Astro-Han merged 2 commits into
apache:mainfrom
xuruiray:xurui/issue-1046-css-token-cleanup

Conversation

@xuruiray

@xuruirayxuruiray commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

  • split the settings stylesheet by concern, moving About, Bot, WeChat, and shared form rules out of theme-preview.css
  • replace phantom and dead CSS tokens, and introduce a governed --brand-wechat token for the QR flow
  • name renderer timing constants and replace repeated static icon/transition inline styles
  • use semantic settings tokens for selected/active states and focus rings in the extracted stylesheets
  • document the established camelCase selector dialect for styles/settings/** in both CSS governance guides

Why

theme-preview.css had become a grab bag for unrelated settings surfaces, while several component rules depended on fallback-only or raw color values. The cleanup makes ownership explicit without changing the settings component APIs.

The issue is still reproducible on current main: unrelated settings selectors remain in theme-preview.css, raw #07C160 values and fallback-only tokens are still present, and the extracted Bot/Form rules are absent.

Closes#1046.

Validation

Rebased onto fd6bd9e3 (origin/main) and validated from a clean dependency install:

  • npm run lint — passed (1621 files)
  • node scripts/check-dead-css.mjs --check — passed
  • npm run build — passed
  • npm run typecheck — passed
  • npm --workspace @maka/desktop test — passed (2571/2571)
  • npx playwright test --config e2e/playwright.config.ts — passed (25/25 real Electron E2E tests)

Visual validation

  • captured 13 Settings fixtures in light/dark themes at 1280px/990px viewports: 52 PR screenshots and 52 same-machine origin/main controls
  • 39/52 screenshot pairs were pixel-identical
  • the remaining 13 pairs differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility; manual review found no layout, clipping, overlap, or color regression
  • keyboard navigation to the shared Settings combobox retained a visible focus ring, at least 34px control height, and no horizontal overflow

Review focus

  • theme-preview.css is reduced from 670 lines on current main to 225 lines
  • About, Bot, WeChat, and shared form ownership moves to dedicated stylesheets
  • no settings component API or user-facing behavior change is intended

xuruirayand others added 2 commits July 16, 2026 19:50
Summary:
- use the governed brand token for About accents
- use focus-ring and focus-width tokens for settings selects
Rationale:
- satisfy the design-system governance contracts found during local validation
Tests:
- npm run lint
- npm run build
- npm run typecheck
- npm --workspace @maka/desktop test
Co-authored-by: Codex <codex@openai.com>
@xuruiray
xuruirayforce-pushed the xurui/issue-1046-css-token-cleanup branch from e59a03e to 20354e8CompareJuly 16, 2026 11:50
@xuruiray
xuruiray marked this pull request as ready for review July 16, 2026 11:55
@xuruiray

Copy link
Copy Markdown
ContributorAuthor

Visual validation — representative screenshots

Local validation on commit 20354e8c:

  • 13 Settings fixtures × light/dark × 1280px/990px
  • 52 PR screenshots compared with 52 same-machine origin/main controls
  • 39/52 pairs were pixel-identical
  • the remaining 13 differed only in the rendered commit SHA, isolated temporary workspace path, or right-edge scrollbar visibility
  • manual review found no layout, clipping, overlap, or color regression
  • Electron E2E: 25/25 passed

About · light · 1280px

Settings About — light theme, 1280px

Remote access · dark · 990px

Settings Remote Access — dark theme, 990px

Appearance · dark · 1280px

Settings Appearance — dark theme, 1280px

Keyboard focus ring

Settings General Proxy — keyboard focus ring

@Astro-Han

Copy link
Copy Markdown
Contributor

LGTM

@Astro-Han
Astro-Han merged commit 9382f87 into apache:mainJul 16, 2026
3 checks passed
jackwener added a commit that referenced this pull request Jul 19, 2026
…nip zero-hint, resume hook, QR fixture (#1241)
* feat(core): add settings-bots-onboarding visual-smoke scenario + botOnboardingProvider
* feat(desktop): hold-in-waiting bot onboarding adapter + fixture state for QR capture
* feat(desktop): auto-open bot scan-login modal under settings-bots-onboarding fixture
* chore(scripts): register settings-bots-onboarding in capture + audit scenario lists
* fix(desktop): wait for QR paint before auto-capturing bot-onboarding fixture
* docs(notes): frontend architecture map — measured baseline + 8 staged rounds (2026-07-19)
Re-ran the census (wc over non-test TS/TSX for desktop main/preload/renderer +
packages/ui; CSS totals; top-10 hotspot table incl. visual-smoke-fixture.ts marked
OUT-OF-SCOPE other-sessions' territory). Staged R1 knip de-rot, R2 app-shell
resume-cluster extraction, R3 visual-smoke split (BLOCKED on concurrent fixture branch),
R4-R6 main.ts extractions (require maintainer-approved contract re-pins — registerIpc /
startup / tool-assembly / modelSupportsVision direct-pinned), R7 provider-connection-detail
decomposition (needs its own blade plan), R8 CSS raw-hex residue (verified clean on this
tip — #1085 already converted it).
* chore(knip): de-rot config — clear all 13 stale hints (R1)
knip reported 13 configuration hints (7 desktop + 6 ui), all redundant/stale config,
zero code impact:
- Drop 'overlayscrollbars' from desktop ignoreDependencies — now redundant (knip no
longer flags it; the package is owned by packages/ui and only referenced there). The
overlay-scrollbars contract forbids declaring it as a *desktop dependency*, not as an
ignore — removing a redundant ignore is compatible and coverage is unchanged.
- Delete the dead 'src/renderer/**/*.test.ts' entry glob (no matches — renderer has zero
test files; all 338 desktop tests live under src/main/__tests__/*.test.ts).
- Drop 11 redundant explicit entries knip already auto-detects: desktop
preload.ts / renderer/main.tsx / playwright.config.ts / .storybook/main.ts / dev.mjs
(vite / playwright / storybook / npm-scripts plugins), and all 6 ui entries
(index.ts, icons.tsx, artifact-preview-registry.ts, assistant-stream.ts, maka-uri.ts,
smooth-stream.ts) resolved from packages/ui package.json#exports.
Non-redundant entries kept verbatim (main.ts, overlay/*, main test glob, e2e specs,
storybook preview, stories, browser-observe-act-smoke.mjs, both ui test globs). No broad
ignores added — coverage is not weakened. knip --workspace apps/desktop and packages/ui
now both exit 0 AND report zero config hints (was: exit 0 with 13 hints).
* refactor(renderer): extract app-shell resume cluster into use-shell-resume (R2)
The #1223 safe-boundary resume cluster moves out of app-shell.tsx into a new
use-shell-resume.ts hook, following the use-shell-connections / use-shell-chat-model
house style (options object; state + handler returned; stable identities preserved).
Pure move, zero behavior change: the two useState declarations (resumePendingSessionId,
resumeParkDescriptionBySession) and the resumeInterruptedSession handler move verbatim;
activeId/toastApi/shellCopy/uiLocale are injected as options. app-shell keeps the banner
JSX wiring (safeResumeAction=) and the sendWithAttachments guard. resumeParkToastCopy is
no longer imported into app-shell (it now lives in the hook). app-shell.tsx 1686 -> 1654
(-32 lines).
Contract re-pin (never deletes coverage): runtime-resume-routing-contract.test.ts read
the handler-shape assertions (resumeInterruptedSession / resumeLatest(sessionId) /
resumeParkToastCopy / no rejectionReasons.join) from app-shell.tsx single-file; they now
read use-shell-resume.ts where that logic lives, while the app-shell-specific assertions
(sendWithAttachments '/resume' guard, safeResumeAction= wiring) still read app-shell.tsx.
use-shell-resume.ts added to renderer-shell-source-helpers sourcePaths (Round B/E
precedent) so combined-source contracts see it.
Gates: desktop 2740/2740, ui 196/196, typecheck 0, check-dead-css clean, knip
desktop+ui exit 0, AUDIT_PORT_BASE=23900 alignment auditor exit 0 (all 10 fixtures
clean, real renderer). CDP turn-narrative branch-vs-baseline (real Electron, light+dark
1280) byte-identical (sha256 match) — proven render no-op.
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.

chore(desktop): CSS/token governance and magic-number cleanup

2 participants

@xuruiray@Astro-Han