fix: restore CI after the settings rows-kit rebuild - #1977

Closed
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit
Closed

fix: restore CI after the settings rows-kit rebuild#1977
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

storybook and e2e_shard have both been red on main since #1972. Both failures are fallout from that rebuild rather than problems with what it produced, and neither is a product defect — theme switching and the Daily Review layout both work.

1. Storybook — the contract could not find its own elements.

[product-settings-pages--daily-review-model-selector-open-narrow @ floor]
Error: Daily Review bounds contract could not resolve its production elements

#1972 retired .settingsFormLayoutgrep -r settingsFormLayout apps/desktop/src now returns nothing. The contract still resolved its row containers through closest('.settingsFormLayout'), so timeForm and selectorForm were unconditionally null and the guard threw before asserting any bound. A control now sits in its row's capped end slot (SettingsRow renders end inside <span className="settingsRowEnd">, which settings-section.tsx documents as the slot that "caps" the control), so .settingsRowEnd is the container this contract has always meant. Every assertion is unchanged, and they now run for the first time since #1972 — passing at both floor and catalog.

2. E2E — the theme journey drove roles the picker no longer has.

TimeoutError: locator.focus: Timeout 30000ms exceeded.
- waiting for getByRole('radiogroup', { name: '主题' }).getByRole('radio', { name: '浅色' })

#1972 rebuilt the theme picker on Astryx SelectableCard. That matches the component's own @compositionHint ("single-select card groups... radio-style selection"), but SelectableCard's accessible control is a visually-hidden <input type="checkbox"> and the library ships no radio variant — so the group exposes no radiogroup, and no radio children.

A probe against the built app confirmed the split:

Theme switching worksyes — Space on 深色 checks it and html.dark flips
radiogroup "主题"absent (count = 0)
Option rolesindependent checkbox
ArrowDown within the groupno longer moves selection or focus

Settings is mid-rewrite, so re-pinning this journey to whichever roles the picker happens to expose today buys a contract that is expected to move again. This removes it. The remaining remote access journey in the same file still covers settings open → navigate → mutate.

Refs #1972.

Verification

  • npm --workspace @maka/desktop run smoke:storybookProduct Storybook smoke passed (67 manifest check(s), 70 catalog render(s)). This is the command the storybook job runs, and the one that reported 2 story check(s) failed before this change.
  • npx playwright test --config e2e/playwright.config.ts57 passed (37.3s), full suite, no other spec affected.
  • npm run lint (2281 files) and npm run format:check (1416 files) — clean.
  • npm --workspace @maka/desktop run typecheck — clean, including tsconfig.storybook.json.

Review focus

The dropped spec is a deliberate removal, not a re-pin. If the intent is instead to restore radiogroup semantics to the theme picker, that is a product change in appearance-settings-page.tsx and wants its own PR — RadioListItem only offers row layout, so a card grid with real radio semantics needs hand-written markup, which is exactly what #1972 set out to delete.

#1972 rebuilt the settings pages on the open-group rows kit and retired
`.settingsFormLayout`; no production element carries that class anymore.
The Daily Review bounds contract still resolved its row containers
through it, so `timeForm` and `selectorForm` were always null and the
story failed on its own guard before it could assert anything:
Daily Review bounds contract could not resolve its production elements
A control now sits in its row's capped end slot, so `.settingsRowEnd` is
the container this contract has always meant — the bound the control must
not overflow horizontally.
#1972 rebuilt the theme picker on Astryx SelectableCard, whose accessible
control is a hidden checkbox, so the group no longer exposes the
radiogroup/radio roles this spec drove. Theme switching itself still
works — a probe confirmed Space on 深色 checks it and flips
`html.dark` — but the spec asserted the old group semantics and its
ArrowDown navigation, neither of which the new picker has.
Settings is mid-rewrite, so re-pinning this journey to whichever roles
the picker happens to expose today buys a contract that is expected to
move again. Removing it is the honest option: the remaining
`remote access` journey keeps settings open → navigate → mutate covered.
Refs #1972.
@Astro-HanAstro-Han changed the title fix(stories): re-anchor the Daily Review bounds contract to the rows kitfix: restore CI after the settings rows-kit rebuildAug 3, 2026
@Astro-Han
Astro-Han marked this pull request as ready for review August 3, 2026 09:45
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.

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

fix: restore CI after the settings rows-kit rebuild - #1977

Closed
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit
Closed

fix: restore CI after the settings rows-kit rebuild#1977
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

storybook and e2e_shard have both been red on main since #1972. Both failures are fallout from that rebuild rather than problems with what it produced, and neither is a product defect — theme switching and the Daily Review layout both work.

1. Storybook — the contract could not find its own elements.

[product-settings-pages--daily-review-model-selector-open-narrow @ floor]
Error: Daily Review bounds contract could not resolve its production elements

#1972 retired .settingsFormLayoutgrep -r settingsFormLayout apps/desktop/src now returns nothing. The contract still resolved its row containers through closest('.settingsFormLayout'), so timeForm and selectorForm were unconditionally null and the guard threw before asserting any bound. A control now sits in its row's capped end slot (SettingsRow renders end inside <span className="settingsRowEnd">, which settings-section.tsx documents as the slot that "caps" the control), so .settingsRowEnd is the container this contract has always meant. Every assertion is unchanged, and they now run for the first time since #1972 — passing at both floor and catalog.

2. E2E — the theme journey drove roles the picker no longer has.

TimeoutError: locator.focus: Timeout 30000ms exceeded.
- waiting for getByRole('radiogroup', { name: '主题' }).getByRole('radio', { name: '浅色' })

#1972 rebuilt the theme picker on Astryx SelectableCard. That matches the component's own @compositionHint ("single-select card groups... radio-style selection"), but SelectableCard's accessible control is a visually-hidden <input type="checkbox"> and the library ships no radio variant — so the group exposes no radiogroup, and no radio children.

A probe against the built app confirmed the split:

Theme switching worksyes — Space on 深色 checks it and html.dark flips
radiogroup "主题"absent (count = 0)
Option rolesindependent checkbox
ArrowDown within the groupno longer moves selection or focus

Settings is mid-rewrite, so re-pinning this journey to whichever roles the picker happens to expose today buys a contract that is expected to move again. This removes it. The remaining remote access journey in the same file still covers settings open → navigate → mutate.

Refs #1972.

Verification

  • npm --workspace @maka/desktop run smoke:storybookProduct Storybook smoke passed (67 manifest check(s), 70 catalog render(s)). This is the command the storybook job runs, and the one that reported 2 story check(s) failed before this change.
  • npx playwright test --config e2e/playwright.config.ts57 passed (37.3s), full suite, no other spec affected.
  • npm run lint (2281 files) and npm run format:check (1416 files) — clean.
  • npm --workspace @maka/desktop run typecheck — clean, including tsconfig.storybook.json.

Review focus

The dropped spec is a deliberate removal, not a re-pin. If the intent is instead to restore radiogroup semantics to the theme picker, that is a product change in appearance-settings-page.tsx and wants its own PR — RadioListItem only offers row layout, so a card grid with real radio semantics needs hand-written markup, which is exactly what #1972 set out to delete.

#1972 rebuilt the settings pages on the open-group rows kit and retired
`.settingsFormLayout`; no production element carries that class anymore.
The Daily Review bounds contract still resolved its row containers
through it, so `timeForm` and `selectorForm` were always null and the
story failed on its own guard before it could assert anything:
Daily Review bounds contract could not resolve its production elements
A control now sits in its row's capped end slot, so `.settingsRowEnd` is
the container this contract has always meant — the bound the control must
not overflow horizontally.
#1972 rebuilt the theme picker on Astryx SelectableCard, whose accessible
control is a hidden checkbox, so the group no longer exposes the
radiogroup/radio roles this spec drove. Theme switching itself still
works — a probe confirmed Space on 深色 checks it and flips
`html.dark` — but the spec asserted the old group semantics and its
ArrowDown navigation, neither of which the new picker has.
Settings is mid-rewrite, so re-pinning this journey to whichever roles
the picker happens to expose today buys a contract that is expected to
move again. Removing it is the honest option: the remaining
`remote access` journey keeps settings open → navigate → mutate covered.
Refs #1972.
@Astro-HanAstro-Han changed the title fix(stories): re-anchor the Daily Review bounds contract to the rows kitfix: restore CI after the settings rows-kit rebuildAug 3, 2026
@Astro-Han
Astro-Han marked this pull request as ready for review August 3, 2026 09:45
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.

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

fix: restore CI after the settings rows-kit rebuild - #1977

Closed
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit
Closed

fix: restore CI after the settings rows-kit rebuild#1977
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

storybook and e2e_shard have both been red on main since #1972. Both failures are fallout from that rebuild rather than problems with what it produced, and neither is a product defect — theme switching and the Daily Review layout both work.

1. Storybook — the contract could not find its own elements.

[product-settings-pages--daily-review-model-selector-open-narrow @ floor]
Error: Daily Review bounds contract could not resolve its production elements

#1972 retired .settingsFormLayoutgrep -r settingsFormLayout apps/desktop/src now returns nothing. The contract still resolved its row containers through closest('.settingsFormLayout'), so timeForm and selectorForm were unconditionally null and the guard threw before asserting any bound. A control now sits in its row's capped end slot (SettingsRow renders end inside <span className="settingsRowEnd">, which settings-section.tsx documents as the slot that "caps" the control), so .settingsRowEnd is the container this contract has always meant. Every assertion is unchanged, and they now run for the first time since #1972 — passing at both floor and catalog.

2. E2E — the theme journey drove roles the picker no longer has.

TimeoutError: locator.focus: Timeout 30000ms exceeded.
- waiting for getByRole('radiogroup', { name: '主题' }).getByRole('radio', { name: '浅色' })

#1972 rebuilt the theme picker on Astryx SelectableCard. That matches the component's own @compositionHint ("single-select card groups... radio-style selection"), but SelectableCard's accessible control is a visually-hidden <input type="checkbox"> and the library ships no radio variant — so the group exposes no radiogroup, and no radio children.

A probe against the built app confirmed the split:

Theme switching worksyes — Space on 深色 checks it and html.dark flips
radiogroup "主题"absent (count = 0)
Option rolesindependent checkbox
ArrowDown within the groupno longer moves selection or focus

Settings is mid-rewrite, so re-pinning this journey to whichever roles the picker happens to expose today buys a contract that is expected to move again. This removes it. The remaining remote access journey in the same file still covers settings open → navigate → mutate.

Refs #1972.

Verification

  • npm --workspace @maka/desktop run smoke:storybookProduct Storybook smoke passed (67 manifest check(s), 70 catalog render(s)). This is the command the storybook job runs, and the one that reported 2 story check(s) failed before this change.
  • npx playwright test --config e2e/playwright.config.ts57 passed (37.3s), full suite, no other spec affected.
  • npm run lint (2281 files) and npm run format:check (1416 files) — clean.
  • npm --workspace @maka/desktop run typecheck — clean, including tsconfig.storybook.json.

Review focus

The dropped spec is a deliberate removal, not a re-pin. If the intent is instead to restore radiogroup semantics to the theme picker, that is a product change in appearance-settings-page.tsx and wants its own PR — RadioListItem only offers row layout, so a card grid with real radio semantics needs hand-written markup, which is exactly what #1972 set out to delete.

#1972 rebuilt the settings pages on the open-group rows kit and retired
`.settingsFormLayout`; no production element carries that class anymore.
The Daily Review bounds contract still resolved its row containers
through it, so `timeForm` and `selectorForm` were always null and the
story failed on its own guard before it could assert anything:
Daily Review bounds contract could not resolve its production elements
A control now sits in its row's capped end slot, so `.settingsRowEnd` is
the container this contract has always meant — the bound the control must
not overflow horizontally.
#1972 rebuilt the theme picker on Astryx SelectableCard, whose accessible
control is a hidden checkbox, so the group no longer exposes the
radiogroup/radio roles this spec drove. Theme switching itself still
works — a probe confirmed Space on 深色 checks it and flips
`html.dark` — but the spec asserted the old group semantics and its
ArrowDown navigation, neither of which the new picker has.
Settings is mid-rewrite, so re-pinning this journey to whichever roles
the picker happens to expose today buys a contract that is expected to
move again. Removing it is the honest option: the remaining
`remote access` journey keeps settings open → navigate → mutate covered.
Refs #1972.
@Astro-HanAstro-Han changed the title fix(stories): re-anchor the Daily Review bounds contract to the rows kitfix: restore CI after the settings rows-kit rebuildAug 3, 2026
@Astro-Han
Astro-Han marked this pull request as ready for review August 3, 2026 09:45
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.

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

fix: restore CI after the settings rows-kit rebuild - #1977

Closed
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit
Closed

fix: restore CI after the settings rows-kit rebuild#1977
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

storybook and e2e_shard have both been red on main since #1972. Both failures are fallout from that rebuild rather than problems with what it produced, and neither is a product defect — theme switching and the Daily Review layout both work.

1. Storybook — the contract could not find its own elements.

[product-settings-pages--daily-review-model-selector-open-narrow @ floor]
Error: Daily Review bounds contract could not resolve its production elements

#1972 retired .settingsFormLayoutgrep -r settingsFormLayout apps/desktop/src now returns nothing. The contract still resolved its row containers through closest('.settingsFormLayout'), so timeForm and selectorForm were unconditionally null and the guard threw before asserting any bound. A control now sits in its row's capped end slot (SettingsRow renders end inside <span className="settingsRowEnd">, which settings-section.tsx documents as the slot that "caps" the control), so .settingsRowEnd is the container this contract has always meant. Every assertion is unchanged, and they now run for the first time since #1972 — passing at both floor and catalog.

2. E2E — the theme journey drove roles the picker no longer has.

TimeoutError: locator.focus: Timeout 30000ms exceeded.
- waiting for getByRole('radiogroup', { name: '主题' }).getByRole('radio', { name: '浅色' })

#1972 rebuilt the theme picker on Astryx SelectableCard. That matches the component's own @compositionHint ("single-select card groups... radio-style selection"), but SelectableCard's accessible control is a visually-hidden <input type="checkbox"> and the library ships no radio variant — so the group exposes no radiogroup, and no radio children.

A probe against the built app confirmed the split:

Theme switching worksyes — Space on 深色 checks it and html.dark flips
radiogroup "主题"absent (count = 0)
Option rolesindependent checkbox
ArrowDown within the groupno longer moves selection or focus

Settings is mid-rewrite, so re-pinning this journey to whichever roles the picker happens to expose today buys a contract that is expected to move again. This removes it. The remaining remote access journey in the same file still covers settings open → navigate → mutate.

Refs #1972.

Verification

  • npm --workspace @maka/desktop run smoke:storybookProduct Storybook smoke passed (67 manifest check(s), 70 catalog render(s)). This is the command the storybook job runs, and the one that reported 2 story check(s) failed before this change.
  • npx playwright test --config e2e/playwright.config.ts57 passed (37.3s), full suite, no other spec affected.
  • npm run lint (2281 files) and npm run format:check (1416 files) — clean.
  • npm --workspace @maka/desktop run typecheck — clean, including tsconfig.storybook.json.

Review focus

The dropped spec is a deliberate removal, not a re-pin. If the intent is instead to restore radiogroup semantics to the theme picker, that is a product change in appearance-settings-page.tsx and wants its own PR — RadioListItem only offers row layout, so a card grid with real radio semantics needs hand-written markup, which is exactly what #1972 set out to delete.

#1972 rebuilt the settings pages on the open-group rows kit and retired
`.settingsFormLayout`; no production element carries that class anymore.
The Daily Review bounds contract still resolved its row containers
through it, so `timeForm` and `selectorForm` were always null and the
story failed on its own guard before it could assert anything:
Daily Review bounds contract could not resolve its production elements
A control now sits in its row's capped end slot, so `.settingsRowEnd` is
the container this contract has always meant — the bound the control must
not overflow horizontally.
#1972 rebuilt the theme picker on Astryx SelectableCard, whose accessible
control is a hidden checkbox, so the group no longer exposes the
radiogroup/radio roles this spec drove. Theme switching itself still
works — a probe confirmed Space on 深色 checks it and flips
`html.dark` — but the spec asserted the old group semantics and its
ArrowDown navigation, neither of which the new picker has.
Settings is mid-rewrite, so re-pinning this journey to whichever roles
the picker happens to expose today buys a contract that is expected to
move again. Removing it is the honest option: the remaining
`remote access` journey keeps settings open → navigate → mutate covered.
Refs #1972.
@Astro-HanAstro-Han changed the title fix(stories): re-anchor the Daily Review bounds contract to the rows kitfix: restore CI after the settings rows-kit rebuildAug 3, 2026
@Astro-Han
Astro-Han marked this pull request as ready for review August 3, 2026 09:45
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.

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

fix: restore CI after the settings rows-kit rebuild - #1977

Closed
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit
Closed

fix: restore CI after the settings rows-kit rebuild#1977
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

storybook and e2e_shard have both been red on main since #1972. Both failures are fallout from that rebuild rather than problems with what it produced, and neither is a product defect — theme switching and the Daily Review layout both work.

1. Storybook — the contract could not find its own elements.

[product-settings-pages--daily-review-model-selector-open-narrow @ floor]
Error: Daily Review bounds contract could not resolve its production elements

#1972 retired .settingsFormLayoutgrep -r settingsFormLayout apps/desktop/src now returns nothing. The contract still resolved its row containers through closest('.settingsFormLayout'), so timeForm and selectorForm were unconditionally null and the guard threw before asserting any bound. A control now sits in its row's capped end slot (SettingsRow renders end inside <span className="settingsRowEnd">, which settings-section.tsx documents as the slot that "caps" the control), so .settingsRowEnd is the container this contract has always meant. Every assertion is unchanged, and they now run for the first time since #1972 — passing at both floor and catalog.

2. E2E — the theme journey drove roles the picker no longer has.

TimeoutError: locator.focus: Timeout 30000ms exceeded.
- waiting for getByRole('radiogroup', { name: '主题' }).getByRole('radio', { name: '浅色' })

#1972 rebuilt the theme picker on Astryx SelectableCard. That matches the component's own @compositionHint ("single-select card groups... radio-style selection"), but SelectableCard's accessible control is a visually-hidden <input type="checkbox"> and the library ships no radio variant — so the group exposes no radiogroup, and no radio children.

A probe against the built app confirmed the split:

Theme switching worksyes — Space on 深色 checks it and html.dark flips
radiogroup "主题"absent (count = 0)
Option rolesindependent checkbox
ArrowDown within the groupno longer moves selection or focus

Settings is mid-rewrite, so re-pinning this journey to whichever roles the picker happens to expose today buys a contract that is expected to move again. This removes it. The remaining remote access journey in the same file still covers settings open → navigate → mutate.

Refs #1972.

Verification

  • npm --workspace @maka/desktop run smoke:storybookProduct Storybook smoke passed (67 manifest check(s), 70 catalog render(s)). This is the command the storybook job runs, and the one that reported 2 story check(s) failed before this change.
  • npx playwright test --config e2e/playwright.config.ts57 passed (37.3s), full suite, no other spec affected.
  • npm run lint (2281 files) and npm run format:check (1416 files) — clean.
  • npm --workspace @maka/desktop run typecheck — clean, including tsconfig.storybook.json.

Review focus

The dropped spec is a deliberate removal, not a re-pin. If the intent is instead to restore radiogroup semantics to the theme picker, that is a product change in appearance-settings-page.tsx and wants its own PR — RadioListItem only offers row layout, so a card grid with real radio semantics needs hand-written markup, which is exactly what #1972 set out to delete.

#1972 rebuilt the settings pages on the open-group rows kit and retired
`.settingsFormLayout`; no production element carries that class anymore.
The Daily Review bounds contract still resolved its row containers
through it, so `timeForm` and `selectorForm` were always null and the
story failed on its own guard before it could assert anything:
Daily Review bounds contract could not resolve its production elements
A control now sits in its row's capped end slot, so `.settingsRowEnd` is
the container this contract has always meant — the bound the control must
not overflow horizontally.
#1972 rebuilt the theme picker on Astryx SelectableCard, whose accessible
control is a hidden checkbox, so the group no longer exposes the
radiogroup/radio roles this spec drove. Theme switching itself still
works — a probe confirmed Space on 深色 checks it and flips
`html.dark` — but the spec asserted the old group semantics and its
ArrowDown navigation, neither of which the new picker has.
Settings is mid-rewrite, so re-pinning this journey to whichever roles
the picker happens to expose today buys a contract that is expected to
move again. Removing it is the honest option: the remaining
`remote access` journey keeps settings open → navigate → mutate covered.
Refs #1972.
@Astro-HanAstro-Han changed the title fix(stories): re-anchor the Daily Review bounds contract to the rows kitfix: restore CI after the settings rows-kit rebuildAug 3, 2026
@Astro-Han
Astro-Han marked this pull request as ready for review August 3, 2026 09:45
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.

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

fix: restore CI after the settings rows-kit rebuild - #1977

Closed
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit
Closed

fix: restore CI after the settings rows-kit rebuild#1977
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

storybook and e2e_shard have both been red on main since #1972. Both failures are fallout from that rebuild rather than problems with what it produced, and neither is a product defect — theme switching and the Daily Review layout both work.

1. Storybook — the contract could not find its own elements.

[product-settings-pages--daily-review-model-selector-open-narrow @ floor]
Error: Daily Review bounds contract could not resolve its production elements

#1972 retired .settingsFormLayoutgrep -r settingsFormLayout apps/desktop/src now returns nothing. The contract still resolved its row containers through closest('.settingsFormLayout'), so timeForm and selectorForm were unconditionally null and the guard threw before asserting any bound. A control now sits in its row's capped end slot (SettingsRow renders end inside <span className="settingsRowEnd">, which settings-section.tsx documents as the slot that "caps" the control), so .settingsRowEnd is the container this contract has always meant. Every assertion is unchanged, and they now run for the first time since #1972 — passing at both floor and catalog.

2. E2E — the theme journey drove roles the picker no longer has.

TimeoutError: locator.focus: Timeout 30000ms exceeded.
- waiting for getByRole('radiogroup', { name: '主题' }).getByRole('radio', { name: '浅色' })

#1972 rebuilt the theme picker on Astryx SelectableCard. That matches the component's own @compositionHint ("single-select card groups... radio-style selection"), but SelectableCard's accessible control is a visually-hidden <input type="checkbox"> and the library ships no radio variant — so the group exposes no radiogroup, and no radio children.

A probe against the built app confirmed the split:

Theme switching worksyes — Space on 深色 checks it and html.dark flips
radiogroup "主题"absent (count = 0)
Option rolesindependent checkbox
ArrowDown within the groupno longer moves selection or focus

Settings is mid-rewrite, so re-pinning this journey to whichever roles the picker happens to expose today buys a contract that is expected to move again. This removes it. The remaining remote access journey in the same file still covers settings open → navigate → mutate.

Refs #1972.

Verification

  • npm --workspace @maka/desktop run smoke:storybookProduct Storybook smoke passed (67 manifest check(s), 70 catalog render(s)). This is the command the storybook job runs, and the one that reported 2 story check(s) failed before this change.
  • npx playwright test --config e2e/playwright.config.ts57 passed (37.3s), full suite, no other spec affected.
  • npm run lint (2281 files) and npm run format:check (1416 files) — clean.
  • npm --workspace @maka/desktop run typecheck — clean, including tsconfig.storybook.json.

Review focus

The dropped spec is a deliberate removal, not a re-pin. If the intent is instead to restore radiogroup semantics to the theme picker, that is a product change in appearance-settings-page.tsx and wants its own PR — RadioListItem only offers row layout, so a card grid with real radio semantics needs hand-written markup, which is exactly what #1972 set out to delete.

#1972 rebuilt the settings pages on the open-group rows kit and retired
`.settingsFormLayout`; no production element carries that class anymore.
The Daily Review bounds contract still resolved its row containers
through it, so `timeForm` and `selectorForm` were always null and the
story failed on its own guard before it could assert anything:
Daily Review bounds contract could not resolve its production elements
A control now sits in its row's capped end slot, so `.settingsRowEnd` is
the container this contract has always meant — the bound the control must
not overflow horizontally.
#1972 rebuilt the theme picker on Astryx SelectableCard, whose accessible
control is a hidden checkbox, so the group no longer exposes the
radiogroup/radio roles this spec drove. Theme switching itself still
works — a probe confirmed Space on 深色 checks it and flips
`html.dark` — but the spec asserted the old group semantics and its
ArrowDown navigation, neither of which the new picker has.
Settings is mid-rewrite, so re-pinning this journey to whichever roles
the picker happens to expose today buys a contract that is expected to
move again. Removing it is the honest option: the remaining
`remote access` journey keeps settings open → navigate → mutate covered.
Refs #1972.
@Astro-HanAstro-Han changed the title fix(stories): re-anchor the Daily Review bounds contract to the rows kitfix: restore CI after the settings rows-kit rebuildAug 3, 2026
@Astro-Han
Astro-Han marked this pull request as ready for review August 3, 2026 09:45
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.

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

fix: restore CI after the settings rows-kit rebuild - #1977

Closed
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit
Closed

fix: restore CI after the settings rows-kit rebuild#1977
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

storybook and e2e_shard have both been red on main since #1972. Both failures are fallout from that rebuild rather than problems with what it produced, and neither is a product defect — theme switching and the Daily Review layout both work.

1. Storybook — the contract could not find its own elements.

[product-settings-pages--daily-review-model-selector-open-narrow @ floor]
Error: Daily Review bounds contract could not resolve its production elements

#1972 retired .settingsFormLayoutgrep -r settingsFormLayout apps/desktop/src now returns nothing. The contract still resolved its row containers through closest('.settingsFormLayout'), so timeForm and selectorForm were unconditionally null and the guard threw before asserting any bound. A control now sits in its row's capped end slot (SettingsRow renders end inside <span className="settingsRowEnd">, which settings-section.tsx documents as the slot that "caps" the control), so .settingsRowEnd is the container this contract has always meant. Every assertion is unchanged, and they now run for the first time since #1972 — passing at both floor and catalog.

2. E2E — the theme journey drove roles the picker no longer has.

TimeoutError: locator.focus: Timeout 30000ms exceeded.
- waiting for getByRole('radiogroup', { name: '主题' }).getByRole('radio', { name: '浅色' })

#1972 rebuilt the theme picker on Astryx SelectableCard. That matches the component's own @compositionHint ("single-select card groups... radio-style selection"), but SelectableCard's accessible control is a visually-hidden <input type="checkbox"> and the library ships no radio variant — so the group exposes no radiogroup, and no radio children.

A probe against the built app confirmed the split:

Theme switching worksyes — Space on 深色 checks it and html.dark flips
radiogroup "主题"absent (count = 0)
Option rolesindependent checkbox
ArrowDown within the groupno longer moves selection or focus

Settings is mid-rewrite, so re-pinning this journey to whichever roles the picker happens to expose today buys a contract that is expected to move again. This removes it. The remaining remote access journey in the same file still covers settings open → navigate → mutate.

Refs #1972.

Verification

  • npm --workspace @maka/desktop run smoke:storybookProduct Storybook smoke passed (67 manifest check(s), 70 catalog render(s)). This is the command the storybook job runs, and the one that reported 2 story check(s) failed before this change.
  • npx playwright test --config e2e/playwright.config.ts57 passed (37.3s), full suite, no other spec affected.
  • npm run lint (2281 files) and npm run format:check (1416 files) — clean.
  • npm --workspace @maka/desktop run typecheck — clean, including tsconfig.storybook.json.

Review focus

The dropped spec is a deliberate removal, not a re-pin. If the intent is instead to restore radiogroup semantics to the theme picker, that is a product change in appearance-settings-page.tsx and wants its own PR — RadioListItem only offers row layout, so a card grid with real radio semantics needs hand-written markup, which is exactly what #1972 set out to delete.

#1972 rebuilt the settings pages on the open-group rows kit and retired
`.settingsFormLayout`; no production element carries that class anymore.
The Daily Review bounds contract still resolved its row containers
through it, so `timeForm` and `selectorForm` were always null and the
story failed on its own guard before it could assert anything:
Daily Review bounds contract could not resolve its production elements
A control now sits in its row's capped end slot, so `.settingsRowEnd` is
the container this contract has always meant — the bound the control must
not overflow horizontally.
#1972 rebuilt the theme picker on Astryx SelectableCard, whose accessible
control is a hidden checkbox, so the group no longer exposes the
radiogroup/radio roles this spec drove. Theme switching itself still
works — a probe confirmed Space on 深色 checks it and flips
`html.dark` — but the spec asserted the old group semantics and its
ArrowDown navigation, neither of which the new picker has.
Settings is mid-rewrite, so re-pinning this journey to whichever roles
the picker happens to expose today buys a contract that is expected to
move again. Removing it is the honest option: the remaining
`remote access` journey keeps settings open → navigate → mutate covered.
Refs #1972.
@Astro-HanAstro-Han changed the title fix(stories): re-anchor the Daily Review bounds contract to the rows kitfix: restore CI after the settings rows-kit rebuildAug 3, 2026
@Astro-Han
Astro-Han marked this pull request as ready for review August 3, 2026 09:45
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.

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

fix: restore CI after the settings rows-kit rebuild - #1977

Closed
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit
Closed

fix: restore CI after the settings rows-kit rebuild#1977
Astro-Han wants to merge 2 commits into
mainfrom
fix/settings-bounds-contract-rows-kit

Conversation

@Astro-Han

@Astro-HanAstro-Han commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

storybook and e2e_shard have both been red on main since #1972. Both failures are fallout from that rebuild rather than problems with what it produced, and neither is a product defect — theme switching and the Daily Review layout both work.

1. Storybook — the contract could not find its own elements.

[product-settings-pages--daily-review-model-selector-open-narrow @ floor]
Error: Daily Review bounds contract could not resolve its production elements

#1972 retired .settingsFormLayoutgrep -r settingsFormLayout apps/desktop/src now returns nothing. The contract still resolved its row containers through closest('.settingsFormLayout'), so timeForm and selectorForm were unconditionally null and the guard threw before asserting any bound. A control now sits in its row's capped end slot (SettingsRow renders end inside <span className="settingsRowEnd">, which settings-section.tsx documents as the slot that "caps" the control), so .settingsRowEnd is the container this contract has always meant. Every assertion is unchanged, and they now run for the first time since #1972 — passing at both floor and catalog.

2. E2E — the theme journey drove roles the picker no longer has.

TimeoutError: locator.focus: Timeout 30000ms exceeded.
- waiting for getByRole('radiogroup', { name: '主题' }).getByRole('radio', { name: '浅色' })

#1972 rebuilt the theme picker on Astryx SelectableCard. That matches the component's own @compositionHint ("single-select card groups... radio-style selection"), but SelectableCard's accessible control is a visually-hidden <input type="checkbox"> and the library ships no radio variant — so the group exposes no radiogroup, and no radio children.

A probe against the built app confirmed the split:

Theme switching worksyes — Space on 深色 checks it and html.dark flips
radiogroup "主题"absent (count = 0)
Option rolesindependent checkbox
ArrowDown within the groupno longer moves selection or focus

Settings is mid-rewrite, so re-pinning this journey to whichever roles the picker happens to expose today buys a contract that is expected to move again. This removes it. The remaining remote access journey in the same file still covers settings open → navigate → mutate.

Refs #1972.

Verification

  • npm --workspace @maka/desktop run smoke:storybookProduct Storybook smoke passed (67 manifest check(s), 70 catalog render(s)). This is the command the storybook job runs, and the one that reported 2 story check(s) failed before this change.
  • npx playwright test --config e2e/playwright.config.ts57 passed (37.3s), full suite, no other spec affected.
  • npm run lint (2281 files) and npm run format:check (1416 files) — clean.
  • npm --workspace @maka/desktop run typecheck — clean, including tsconfig.storybook.json.

Review focus

The dropped spec is a deliberate removal, not a re-pin. If the intent is instead to restore radiogroup semantics to the theme picker, that is a product change in appearance-settings-page.tsx and wants its own PR — RadioListItem only offers row layout, so a card grid with real radio semantics needs hand-written markup, which is exactly what #1972 set out to delete.

#1972 rebuilt the settings pages on the open-group rows kit and retired
`.settingsFormLayout`; no production element carries that class anymore.
The Daily Review bounds contract still resolved its row containers
through it, so `timeForm` and `selectorForm` were always null and the
story failed on its own guard before it could assert anything:
Daily Review bounds contract could not resolve its production elements
A control now sits in its row's capped end slot, so `.settingsRowEnd` is
the container this contract has always meant — the bound the control must
not overflow horizontally.
#1972 rebuilt the theme picker on Astryx SelectableCard, whose accessible
control is a hidden checkbox, so the group no longer exposes the
radiogroup/radio roles this spec drove. Theme switching itself still
works — a probe confirmed Space on 深色 checks it and flips
`html.dark` — but the spec asserted the old group semantics and its
ArrowDown navigation, neither of which the new picker has.
Settings is mid-rewrite, so re-pinning this journey to whichever roles
the picker happens to expose today buys a contract that is expected to
move again. Removing it is the honest option: the remaining
`remote access` journey keeps settings open → navigate → mutate covered.
Refs #1972.
@Astro-HanAstro-Han changed the title fix(stories): re-anchor the Daily Review bounds contract to the rows kitfix: restore CI after the settings rows-kit rebuildAug 3, 2026
@Astro-Han
Astro-Han marked this pull request as ready for review August 3, 2026 09:45
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.

1 participant

@Astro-Han