refactor(desktop): componentize the settings page container + residual sweep - #1991

Merged
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container
Aug 3, 2026
Merged

refactor(desktop): componentize the settings page container + residual sweep#1991
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container

Conversation

@jackwener

Copy link
Copy Markdown
Member

Follow-up to #1972/#1984, per the review feedback that pages (记忆页 included) should not keep reaching for the bare settingsStructuredPage class.

Page container → kit component

  • settings-section.tsx gains SettingsPage (as: div|section, aria-label): the kit now owns the page root; pages never reference page-layout CSS directly.
  • Class renamed to .settingsPageStack — deliberately not.settingsPage, which would collide with the pre-existing .settingsModal.settingsPage fullscreen-shell modifier (caught in re-audit before shipping).
  • Kept as a grid with the fix(desktop): polish form-row pages — General and Appearance #1362minmax(0, 1fr) column on purpose — a flex VStack stack would reintroduce the min-width: auto min-content floor for wide <pre>/long mono paths. Documented in the component JSDoc.
  • All 14 container call sites converted (incl. the models wrapper in settings-surface.tsx, whose local router is renamed SettingsPageBody to free the name, and the provider story). Page rhythm unifies at 32px (daily-review was 24, permission 20, About 16).

Residual sweep (from the post-#1972 re-audit)

  • About: second page container .settingsAboutPage (16px rhythm) retired → SettingsPage.
  • Health: footnote p.settingsHealthFootnote floated outside every section → same supporting-Text treatment Permission Center uses.
  • Orphaned CSS deleted: .settingsFeatureStatusPage/Hero/Icon/HeroHeading (no consumers since the voice rebuild; check-dead-css missed them because the names survived in comments). .settingsFeatureStatusList stays (voice 边界 list).
  • Usage CSS out of bot.css: ~150 lines move to a new usage.css (pure move — the fix(ui): pin the box height of single-line chips so leading cannot move them #1879 height pins and 900px media query travel intact).
  • Storybook contract re-anchored: the daily-review bounds contract pointed at the deleted .settingsFormPage hook → now .settingsPageStack.
  • 7 inert classNames dropped (settingsHelpText, settingsHelpInlineTime ×5, settingsBotMetaTime ×2 — no CSS rule anywhere).

Verification

typecheck ✅ · check-dead-css ✅ · check-a11y/copy/console ✅ · product Storybook smoke 71 renders × 3 viewports ✅ (re-run after rebasing over #1929, which needed the new mermaid dep installed)

Net: 23 files, +105/−289.

Next PR: the bot-chat cluster (last page group on the pre-#1972 dialect) + remaining hand-tinted boxes in memory/web-search.

…l sweep
Settings pages reached for the bare `.settingsStructuredPage` class as
their root container — page-layout CSS referenced directly from 14 call
sites, plus three sibling page-root grids (About / Usage / the orphaned
voice hero vocabulary) carrying their own rhythms.
- settings-section.tsx gains `SettingsPage` (div/section + aria-label):
the kit now owns the page root. The class becomes `.settingsPageStack`
— NOT `.settingsPage`, which would have collided with the pre-existing
`.settingsModal.settingsPage` fullscreen-shell modifier — and keeps
the #1362 grid `minmax(0, 1fr)` column on purpose: a flex stack's
`min-width: auto` floor would let a wide <pre> or long mono path poke
past the content column again.
- All 14 containers move onto <SettingsPage>; the local section router
in settings-surface.tsx is renamed SettingsPageBody to free the name.
Page rhythm unifies at 32px (daily-review was 24, permission 20,
About 16).
- About's second container (`.settingsAboutPage`) retires; the Health
footnote moves off `p.settingsHealthFootnote` onto the same
supporting-Text treatment Permission Center already uses.
- The orphaned voice hero vocabulary (`.settingsFeatureStatusPage` /
Hero / Icon / HeroHeading — no consumers since the voice rebuild) is
deleted; `.settingsFeatureStatusList` stays (voice 边界 list).
- Usage CSS (~150 lines) moves out of bot.css into its own usage.css —
a pure move; the #1879 height pins and 900px media query travel
intact.
- The daily-review Storybook bounds contract re-anchors from the
deleted `.settingsFormPage` hook to `.settingsPageStack`; seven inert
classNames with no CSS rule (`settingsHelpText`,
`settingsHelpInlineTime` x5, `settingsBotMetaTime` x2) are dropped.
Verified: desktop typecheck, check-dead-css, check-a11y/copy/console,
product Storybook smoke (71 catalog renders x 3 viewports).
@jackwener
jackwener merged commit 75e0853 into mainAug 3, 2026
jackwener added a commit that referenced this pull request Aug 3, 2026
… seam (#1997)
Adversarial review of #1984/#1991/#1993 (two independent lenses,
findings verified before fixing) plus one user-reported shell defect.
Shell:
- The content column is a rounded floating plate flush to the sidebar;
the theme's full-height sidenav hairline ran on the same seam and
read as a doubled border beside the plate's corner radius. Dropped
in the expanded state too (collapsed already did) — separation is
tonal, per DESIGN.md's One Working Plane rule.
Regressions from #1993, confirmed and fixed:
- bot-chat-detail lost all inter-section rhythm: its wrapper pair kept
a gap on a display:block section (inert) and a class with no CSS
rule. The page is a SettingsPage now, like the overview next door;
the back button keeps only its optical inline outdent.
- bot.css had the file-header comment replace-all'd into the middle of
`.settingsBotDetailHeader > .settingsBotLogo`. Parsed by luck;
removed.
- MetadataList destructures a closed prop list, so the runtime grid's
aria-label was silently dropped — the group name rides a real
role="group" wrapper now.
- The kit section header now wraps: at the 480px window floor a
multi-button action cluster drops under the title instead of
crushing it (replaces the deleted bot-runtime media query).
- Overview rows go flush-inline (the 10px inset was old card-grid
residue); the WeChat QR dialog gets its height floor back (224px)
so state swaps stop resizing the modal.
Convergence completions the review surfaced:
- claude-subscription-card drops its SectionHeader + full-width Card
and repeated title: it renders under ProvidersPanel's RouteHeader
like its sibling OAuth panels, as a bare VStack with the shared
StatusDot + text status idiom.
- ProvidersPanel connection status Badge -> StatusDot + text; health's
hand-rolled five-arm dot mapping -> the shared statusDotVariant.
- subagent-presets panel: Card-wrapped .settingsRows + a lead Item
posing as a header -> SettingsSection; settings-surface fallback
drops its Card wrap.
- About hero pills referenced two classNames with no CSS rule —
they are the Badges about.css's comment always described.
- `.settingsPage .settingsPageStack` (rename slip) -> nested
`.settingsPageStack .settingsPageStack`; quota labels round.
Verified: typecheck, check-dead-css, check-a11y/copy/console,
format:check, product Storybook smoke (71 renders x 3 viewports).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 6, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (#1972), and
the settings-page kit (#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
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

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

refactor(desktop): componentize the settings page container + residual sweep - #1991

Merged
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container
Aug 3, 2026
Merged

refactor(desktop): componentize the settings page container + residual sweep#1991
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container

Conversation

@jackwener

Copy link
Copy Markdown
Member

Follow-up to #1972/#1984, per the review feedback that pages (记忆页 included) should not keep reaching for the bare settingsStructuredPage class.

Page container → kit component

  • settings-section.tsx gains SettingsPage (as: div|section, aria-label): the kit now owns the page root; pages never reference page-layout CSS directly.
  • Class renamed to .settingsPageStack — deliberately not.settingsPage, which would collide with the pre-existing .settingsModal.settingsPage fullscreen-shell modifier (caught in re-audit before shipping).
  • Kept as a grid with the fix(desktop): polish form-row pages — General and Appearance #1362minmax(0, 1fr) column on purpose — a flex VStack stack would reintroduce the min-width: auto min-content floor for wide <pre>/long mono paths. Documented in the component JSDoc.
  • All 14 container call sites converted (incl. the models wrapper in settings-surface.tsx, whose local router is renamed SettingsPageBody to free the name, and the provider story). Page rhythm unifies at 32px (daily-review was 24, permission 20, About 16).

Residual sweep (from the post-#1972 re-audit)

  • About: second page container .settingsAboutPage (16px rhythm) retired → SettingsPage.
  • Health: footnote p.settingsHealthFootnote floated outside every section → same supporting-Text treatment Permission Center uses.
  • Orphaned CSS deleted: .settingsFeatureStatusPage/Hero/Icon/HeroHeading (no consumers since the voice rebuild; check-dead-css missed them because the names survived in comments). .settingsFeatureStatusList stays (voice 边界 list).
  • Usage CSS out of bot.css: ~150 lines move to a new usage.css (pure move — the fix(ui): pin the box height of single-line chips so leading cannot move them #1879 height pins and 900px media query travel intact).
  • Storybook contract re-anchored: the daily-review bounds contract pointed at the deleted .settingsFormPage hook → now .settingsPageStack.
  • 7 inert classNames dropped (settingsHelpText, settingsHelpInlineTime ×5, settingsBotMetaTime ×2 — no CSS rule anywhere).

Verification

typecheck ✅ · check-dead-css ✅ · check-a11y/copy/console ✅ · product Storybook smoke 71 renders × 3 viewports ✅ (re-run after rebasing over #1929, which needed the new mermaid dep installed)

Net: 23 files, +105/−289.

Next PR: the bot-chat cluster (last page group on the pre-#1972 dialect) + remaining hand-tinted boxes in memory/web-search.

…l sweep
Settings pages reached for the bare `.settingsStructuredPage` class as
their root container — page-layout CSS referenced directly from 14 call
sites, plus three sibling page-root grids (About / Usage / the orphaned
voice hero vocabulary) carrying their own rhythms.
- settings-section.tsx gains `SettingsPage` (div/section + aria-label):
the kit now owns the page root. The class becomes `.settingsPageStack`
— NOT `.settingsPage`, which would have collided with the pre-existing
`.settingsModal.settingsPage` fullscreen-shell modifier — and keeps
the #1362 grid `minmax(0, 1fr)` column on purpose: a flex stack's
`min-width: auto` floor would let a wide <pre> or long mono path poke
past the content column again.
- All 14 containers move onto <SettingsPage>; the local section router
in settings-surface.tsx is renamed SettingsPageBody to free the name.
Page rhythm unifies at 32px (daily-review was 24, permission 20,
About 16).
- About's second container (`.settingsAboutPage`) retires; the Health
footnote moves off `p.settingsHealthFootnote` onto the same
supporting-Text treatment Permission Center already uses.
- The orphaned voice hero vocabulary (`.settingsFeatureStatusPage` /
Hero / Icon / HeroHeading — no consumers since the voice rebuild) is
deleted; `.settingsFeatureStatusList` stays (voice 边界 list).
- Usage CSS (~150 lines) moves out of bot.css into its own usage.css —
a pure move; the #1879 height pins and 900px media query travel
intact.
- The daily-review Storybook bounds contract re-anchors from the
deleted `.settingsFormPage` hook to `.settingsPageStack`; seven inert
classNames with no CSS rule (`settingsHelpText`,
`settingsHelpInlineTime` x5, `settingsBotMetaTime` x2) are dropped.
Verified: desktop typecheck, check-dead-css, check-a11y/copy/console,
product Storybook smoke (71 catalog renders x 3 viewports).
@jackwener
jackwener merged commit 75e0853 into mainAug 3, 2026
jackwener added a commit that referenced this pull request Aug 3, 2026
… seam (#1997)
Adversarial review of #1984/#1991/#1993 (two independent lenses,
findings verified before fixing) plus one user-reported shell defect.
Shell:
- The content column is a rounded floating plate flush to the sidebar;
the theme's full-height sidenav hairline ran on the same seam and
read as a doubled border beside the plate's corner radius. Dropped
in the expanded state too (collapsed already did) — separation is
tonal, per DESIGN.md's One Working Plane rule.
Regressions from #1993, confirmed and fixed:
- bot-chat-detail lost all inter-section rhythm: its wrapper pair kept
a gap on a display:block section (inert) and a class with no CSS
rule. The page is a SettingsPage now, like the overview next door;
the back button keeps only its optical inline outdent.
- bot.css had the file-header comment replace-all'd into the middle of
`.settingsBotDetailHeader > .settingsBotLogo`. Parsed by luck;
removed.
- MetadataList destructures a closed prop list, so the runtime grid's
aria-label was silently dropped — the group name rides a real
role="group" wrapper now.
- The kit section header now wraps: at the 480px window floor a
multi-button action cluster drops under the title instead of
crushing it (replaces the deleted bot-runtime media query).
- Overview rows go flush-inline (the 10px inset was old card-grid
residue); the WeChat QR dialog gets its height floor back (224px)
so state swaps stop resizing the modal.
Convergence completions the review surfaced:
- claude-subscription-card drops its SectionHeader + full-width Card
and repeated title: it renders under ProvidersPanel's RouteHeader
like its sibling OAuth panels, as a bare VStack with the shared
StatusDot + text status idiom.
- ProvidersPanel connection status Badge -> StatusDot + text; health's
hand-rolled five-arm dot mapping -> the shared statusDotVariant.
- subagent-presets panel: Card-wrapped .settingsRows + a lead Item
posing as a header -> SettingsSection; settings-surface fallback
drops its Card wrap.
- About hero pills referenced two classNames with no CSS rule —
they are the Badges about.css's comment always described.
- `.settingsPage .settingsPageStack` (rename slip) -> nested
`.settingsPageStack .settingsPageStack`; quota labels round.
Verified: typecheck, check-dead-css, check-a11y/copy/console,
format:check, product Storybook smoke (71 renders x 3 viewports).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 6, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (#1972), and
the settings-page kit (#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
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

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

refactor(desktop): componentize the settings page container + residual sweep - #1991

Merged
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container
Aug 3, 2026
Merged

refactor(desktop): componentize the settings page container + residual sweep#1991
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container

Conversation

@jackwener

Copy link
Copy Markdown
Member

Follow-up to #1972/#1984, per the review feedback that pages (记忆页 included) should not keep reaching for the bare settingsStructuredPage class.

Page container → kit component

  • settings-section.tsx gains SettingsPage (as: div|section, aria-label): the kit now owns the page root; pages never reference page-layout CSS directly.
  • Class renamed to .settingsPageStack — deliberately not.settingsPage, which would collide with the pre-existing .settingsModal.settingsPage fullscreen-shell modifier (caught in re-audit before shipping).
  • Kept as a grid with the fix(desktop): polish form-row pages — General and Appearance #1362minmax(0, 1fr) column on purpose — a flex VStack stack would reintroduce the min-width: auto min-content floor for wide <pre>/long mono paths. Documented in the component JSDoc.
  • All 14 container call sites converted (incl. the models wrapper in settings-surface.tsx, whose local router is renamed SettingsPageBody to free the name, and the provider story). Page rhythm unifies at 32px (daily-review was 24, permission 20, About 16).

Residual sweep (from the post-#1972 re-audit)

  • About: second page container .settingsAboutPage (16px rhythm) retired → SettingsPage.
  • Health: footnote p.settingsHealthFootnote floated outside every section → same supporting-Text treatment Permission Center uses.
  • Orphaned CSS deleted: .settingsFeatureStatusPage/Hero/Icon/HeroHeading (no consumers since the voice rebuild; check-dead-css missed them because the names survived in comments). .settingsFeatureStatusList stays (voice 边界 list).
  • Usage CSS out of bot.css: ~150 lines move to a new usage.css (pure move — the fix(ui): pin the box height of single-line chips so leading cannot move them #1879 height pins and 900px media query travel intact).
  • Storybook contract re-anchored: the daily-review bounds contract pointed at the deleted .settingsFormPage hook → now .settingsPageStack.
  • 7 inert classNames dropped (settingsHelpText, settingsHelpInlineTime ×5, settingsBotMetaTime ×2 — no CSS rule anywhere).

Verification

typecheck ✅ · check-dead-css ✅ · check-a11y/copy/console ✅ · product Storybook smoke 71 renders × 3 viewports ✅ (re-run after rebasing over #1929, which needed the new mermaid dep installed)

Net: 23 files, +105/−289.

Next PR: the bot-chat cluster (last page group on the pre-#1972 dialect) + remaining hand-tinted boxes in memory/web-search.

…l sweep
Settings pages reached for the bare `.settingsStructuredPage` class as
their root container — page-layout CSS referenced directly from 14 call
sites, plus three sibling page-root grids (About / Usage / the orphaned
voice hero vocabulary) carrying their own rhythms.
- settings-section.tsx gains `SettingsPage` (div/section + aria-label):
the kit now owns the page root. The class becomes `.settingsPageStack`
— NOT `.settingsPage`, which would have collided with the pre-existing
`.settingsModal.settingsPage` fullscreen-shell modifier — and keeps
the #1362 grid `minmax(0, 1fr)` column on purpose: a flex stack's
`min-width: auto` floor would let a wide <pre> or long mono path poke
past the content column again.
- All 14 containers move onto <SettingsPage>; the local section router
in settings-surface.tsx is renamed SettingsPageBody to free the name.
Page rhythm unifies at 32px (daily-review was 24, permission 20,
About 16).
- About's second container (`.settingsAboutPage`) retires; the Health
footnote moves off `p.settingsHealthFootnote` onto the same
supporting-Text treatment Permission Center already uses.
- The orphaned voice hero vocabulary (`.settingsFeatureStatusPage` /
Hero / Icon / HeroHeading — no consumers since the voice rebuild) is
deleted; `.settingsFeatureStatusList` stays (voice 边界 list).
- Usage CSS (~150 lines) moves out of bot.css into its own usage.css —
a pure move; the #1879 height pins and 900px media query travel
intact.
- The daily-review Storybook bounds contract re-anchors from the
deleted `.settingsFormPage` hook to `.settingsPageStack`; seven inert
classNames with no CSS rule (`settingsHelpText`,
`settingsHelpInlineTime` x5, `settingsBotMetaTime` x2) are dropped.
Verified: desktop typecheck, check-dead-css, check-a11y/copy/console,
product Storybook smoke (71 catalog renders x 3 viewports).
@jackwener
jackwener merged commit 75e0853 into mainAug 3, 2026
jackwener added a commit that referenced this pull request Aug 3, 2026
… seam (#1997)
Adversarial review of #1984/#1991/#1993 (two independent lenses,
findings verified before fixing) plus one user-reported shell defect.
Shell:
- The content column is a rounded floating plate flush to the sidebar;
the theme's full-height sidenav hairline ran on the same seam and
read as a doubled border beside the plate's corner radius. Dropped
in the expanded state too (collapsed already did) — separation is
tonal, per DESIGN.md's One Working Plane rule.
Regressions from #1993, confirmed and fixed:
- bot-chat-detail lost all inter-section rhythm: its wrapper pair kept
a gap on a display:block section (inert) and a class with no CSS
rule. The page is a SettingsPage now, like the overview next door;
the back button keeps only its optical inline outdent.
- bot.css had the file-header comment replace-all'd into the middle of
`.settingsBotDetailHeader > .settingsBotLogo`. Parsed by luck;
removed.
- MetadataList destructures a closed prop list, so the runtime grid's
aria-label was silently dropped — the group name rides a real
role="group" wrapper now.
- The kit section header now wraps: at the 480px window floor a
multi-button action cluster drops under the title instead of
crushing it (replaces the deleted bot-runtime media query).
- Overview rows go flush-inline (the 10px inset was old card-grid
residue); the WeChat QR dialog gets its height floor back (224px)
so state swaps stop resizing the modal.
Convergence completions the review surfaced:
- claude-subscription-card drops its SectionHeader + full-width Card
and repeated title: it renders under ProvidersPanel's RouteHeader
like its sibling OAuth panels, as a bare VStack with the shared
StatusDot + text status idiom.
- ProvidersPanel connection status Badge -> StatusDot + text; health's
hand-rolled five-arm dot mapping -> the shared statusDotVariant.
- subagent-presets panel: Card-wrapped .settingsRows + a lead Item
posing as a header -> SettingsSection; settings-surface fallback
drops its Card wrap.
- About hero pills referenced two classNames with no CSS rule —
they are the Badges about.css's comment always described.
- `.settingsPage .settingsPageStack` (rename slip) -> nested
`.settingsPageStack .settingsPageStack`; quota labels round.
Verified: typecheck, check-dead-css, check-a11y/copy/console,
format:check, product Storybook smoke (71 renders x 3 viewports).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 6, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (#1972), and
the settings-page kit (#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
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

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

refactor(desktop): componentize the settings page container + residual sweep - #1991

Merged
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container
Aug 3, 2026
Merged

refactor(desktop): componentize the settings page container + residual sweep#1991
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container

Conversation

@jackwener

Copy link
Copy Markdown
Member

Follow-up to #1972/#1984, per the review feedback that pages (记忆页 included) should not keep reaching for the bare settingsStructuredPage class.

Page container → kit component

  • settings-section.tsx gains SettingsPage (as: div|section, aria-label): the kit now owns the page root; pages never reference page-layout CSS directly.
  • Class renamed to .settingsPageStack — deliberately not.settingsPage, which would collide with the pre-existing .settingsModal.settingsPage fullscreen-shell modifier (caught in re-audit before shipping).
  • Kept as a grid with the fix(desktop): polish form-row pages — General and Appearance #1362minmax(0, 1fr) column on purpose — a flex VStack stack would reintroduce the min-width: auto min-content floor for wide <pre>/long mono paths. Documented in the component JSDoc.
  • All 14 container call sites converted (incl. the models wrapper in settings-surface.tsx, whose local router is renamed SettingsPageBody to free the name, and the provider story). Page rhythm unifies at 32px (daily-review was 24, permission 20, About 16).

Residual sweep (from the post-#1972 re-audit)

  • About: second page container .settingsAboutPage (16px rhythm) retired → SettingsPage.
  • Health: footnote p.settingsHealthFootnote floated outside every section → same supporting-Text treatment Permission Center uses.
  • Orphaned CSS deleted: .settingsFeatureStatusPage/Hero/Icon/HeroHeading (no consumers since the voice rebuild; check-dead-css missed them because the names survived in comments). .settingsFeatureStatusList stays (voice 边界 list).
  • Usage CSS out of bot.css: ~150 lines move to a new usage.css (pure move — the fix(ui): pin the box height of single-line chips so leading cannot move them #1879 height pins and 900px media query travel intact).
  • Storybook contract re-anchored: the daily-review bounds contract pointed at the deleted .settingsFormPage hook → now .settingsPageStack.
  • 7 inert classNames dropped (settingsHelpText, settingsHelpInlineTime ×5, settingsBotMetaTime ×2 — no CSS rule anywhere).

Verification

typecheck ✅ · check-dead-css ✅ · check-a11y/copy/console ✅ · product Storybook smoke 71 renders × 3 viewports ✅ (re-run after rebasing over #1929, which needed the new mermaid dep installed)

Net: 23 files, +105/−289.

Next PR: the bot-chat cluster (last page group on the pre-#1972 dialect) + remaining hand-tinted boxes in memory/web-search.

…l sweep
Settings pages reached for the bare `.settingsStructuredPage` class as
their root container — page-layout CSS referenced directly from 14 call
sites, plus three sibling page-root grids (About / Usage / the orphaned
voice hero vocabulary) carrying their own rhythms.
- settings-section.tsx gains `SettingsPage` (div/section + aria-label):
the kit now owns the page root. The class becomes `.settingsPageStack`
— NOT `.settingsPage`, which would have collided with the pre-existing
`.settingsModal.settingsPage` fullscreen-shell modifier — and keeps
the #1362 grid `minmax(0, 1fr)` column on purpose: a flex stack's
`min-width: auto` floor would let a wide <pre> or long mono path poke
past the content column again.
- All 14 containers move onto <SettingsPage>; the local section router
in settings-surface.tsx is renamed SettingsPageBody to free the name.
Page rhythm unifies at 32px (daily-review was 24, permission 20,
About 16).
- About's second container (`.settingsAboutPage`) retires; the Health
footnote moves off `p.settingsHealthFootnote` onto the same
supporting-Text treatment Permission Center already uses.
- The orphaned voice hero vocabulary (`.settingsFeatureStatusPage` /
Hero / Icon / HeroHeading — no consumers since the voice rebuild) is
deleted; `.settingsFeatureStatusList` stays (voice 边界 list).
- Usage CSS (~150 lines) moves out of bot.css into its own usage.css —
a pure move; the #1879 height pins and 900px media query travel
intact.
- The daily-review Storybook bounds contract re-anchors from the
deleted `.settingsFormPage` hook to `.settingsPageStack`; seven inert
classNames with no CSS rule (`settingsHelpText`,
`settingsHelpInlineTime` x5, `settingsBotMetaTime` x2) are dropped.
Verified: desktop typecheck, check-dead-css, check-a11y/copy/console,
product Storybook smoke (71 catalog renders x 3 viewports).
@jackwener
jackwener merged commit 75e0853 into mainAug 3, 2026
jackwener added a commit that referenced this pull request Aug 3, 2026
… seam (#1997)
Adversarial review of #1984/#1991/#1993 (two independent lenses,
findings verified before fixing) plus one user-reported shell defect.
Shell:
- The content column is a rounded floating plate flush to the sidebar;
the theme's full-height sidenav hairline ran on the same seam and
read as a doubled border beside the plate's corner radius. Dropped
in the expanded state too (collapsed already did) — separation is
tonal, per DESIGN.md's One Working Plane rule.
Regressions from #1993, confirmed and fixed:
- bot-chat-detail lost all inter-section rhythm: its wrapper pair kept
a gap on a display:block section (inert) and a class with no CSS
rule. The page is a SettingsPage now, like the overview next door;
the back button keeps only its optical inline outdent.
- bot.css had the file-header comment replace-all'd into the middle of
`.settingsBotDetailHeader > .settingsBotLogo`. Parsed by luck;
removed.
- MetadataList destructures a closed prop list, so the runtime grid's
aria-label was silently dropped — the group name rides a real
role="group" wrapper now.
- The kit section header now wraps: at the 480px window floor a
multi-button action cluster drops under the title instead of
crushing it (replaces the deleted bot-runtime media query).
- Overview rows go flush-inline (the 10px inset was old card-grid
residue); the WeChat QR dialog gets its height floor back (224px)
so state swaps stop resizing the modal.
Convergence completions the review surfaced:
- claude-subscription-card drops its SectionHeader + full-width Card
and repeated title: it renders under ProvidersPanel's RouteHeader
like its sibling OAuth panels, as a bare VStack with the shared
StatusDot + text status idiom.
- ProvidersPanel connection status Badge -> StatusDot + text; health's
hand-rolled five-arm dot mapping -> the shared statusDotVariant.
- subagent-presets panel: Card-wrapped .settingsRows + a lead Item
posing as a header -> SettingsSection; settings-surface fallback
drops its Card wrap.
- About hero pills referenced two classNames with no CSS rule —
they are the Badges about.css's comment always described.
- `.settingsPage .settingsPageStack` (rename slip) -> nested
`.settingsPageStack .settingsPageStack`; quota labels round.
Verified: typecheck, check-dead-css, check-a11y/copy/console,
format:check, product Storybook smoke (71 renders x 3 viewports).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 6, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (#1972), and
the settings-page kit (#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
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

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

refactor(desktop): componentize the settings page container + residual sweep - #1991

Merged
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container
Aug 3, 2026
Merged

refactor(desktop): componentize the settings page container + residual sweep#1991
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container

Conversation

@jackwener

Copy link
Copy Markdown
Member

Follow-up to #1972/#1984, per the review feedback that pages (记忆页 included) should not keep reaching for the bare settingsStructuredPage class.

Page container → kit component

  • settings-section.tsx gains SettingsPage (as: div|section, aria-label): the kit now owns the page root; pages never reference page-layout CSS directly.
  • Class renamed to .settingsPageStack — deliberately not.settingsPage, which would collide with the pre-existing .settingsModal.settingsPage fullscreen-shell modifier (caught in re-audit before shipping).
  • Kept as a grid with the fix(desktop): polish form-row pages — General and Appearance #1362minmax(0, 1fr) column on purpose — a flex VStack stack would reintroduce the min-width: auto min-content floor for wide <pre>/long mono paths. Documented in the component JSDoc.
  • All 14 container call sites converted (incl. the models wrapper in settings-surface.tsx, whose local router is renamed SettingsPageBody to free the name, and the provider story). Page rhythm unifies at 32px (daily-review was 24, permission 20, About 16).

Residual sweep (from the post-#1972 re-audit)

  • About: second page container .settingsAboutPage (16px rhythm) retired → SettingsPage.
  • Health: footnote p.settingsHealthFootnote floated outside every section → same supporting-Text treatment Permission Center uses.
  • Orphaned CSS deleted: .settingsFeatureStatusPage/Hero/Icon/HeroHeading (no consumers since the voice rebuild; check-dead-css missed them because the names survived in comments). .settingsFeatureStatusList stays (voice 边界 list).
  • Usage CSS out of bot.css: ~150 lines move to a new usage.css (pure move — the fix(ui): pin the box height of single-line chips so leading cannot move them #1879 height pins and 900px media query travel intact).
  • Storybook contract re-anchored: the daily-review bounds contract pointed at the deleted .settingsFormPage hook → now .settingsPageStack.
  • 7 inert classNames dropped (settingsHelpText, settingsHelpInlineTime ×5, settingsBotMetaTime ×2 — no CSS rule anywhere).

Verification

typecheck ✅ · check-dead-css ✅ · check-a11y/copy/console ✅ · product Storybook smoke 71 renders × 3 viewports ✅ (re-run after rebasing over #1929, which needed the new mermaid dep installed)

Net: 23 files, +105/−289.

Next PR: the bot-chat cluster (last page group on the pre-#1972 dialect) + remaining hand-tinted boxes in memory/web-search.

…l sweep
Settings pages reached for the bare `.settingsStructuredPage` class as
their root container — page-layout CSS referenced directly from 14 call
sites, plus three sibling page-root grids (About / Usage / the orphaned
voice hero vocabulary) carrying their own rhythms.
- settings-section.tsx gains `SettingsPage` (div/section + aria-label):
the kit now owns the page root. The class becomes `.settingsPageStack`
— NOT `.settingsPage`, which would have collided with the pre-existing
`.settingsModal.settingsPage` fullscreen-shell modifier — and keeps
the #1362 grid `minmax(0, 1fr)` column on purpose: a flex stack's
`min-width: auto` floor would let a wide <pre> or long mono path poke
past the content column again.
- All 14 containers move onto <SettingsPage>; the local section router
in settings-surface.tsx is renamed SettingsPageBody to free the name.
Page rhythm unifies at 32px (daily-review was 24, permission 20,
About 16).
- About's second container (`.settingsAboutPage`) retires; the Health
footnote moves off `p.settingsHealthFootnote` onto the same
supporting-Text treatment Permission Center already uses.
- The orphaned voice hero vocabulary (`.settingsFeatureStatusPage` /
Hero / Icon / HeroHeading — no consumers since the voice rebuild) is
deleted; `.settingsFeatureStatusList` stays (voice 边界 list).
- Usage CSS (~150 lines) moves out of bot.css into its own usage.css —
a pure move; the #1879 height pins and 900px media query travel
intact.
- The daily-review Storybook bounds contract re-anchors from the
deleted `.settingsFormPage` hook to `.settingsPageStack`; seven inert
classNames with no CSS rule (`settingsHelpText`,
`settingsHelpInlineTime` x5, `settingsBotMetaTime` x2) are dropped.
Verified: desktop typecheck, check-dead-css, check-a11y/copy/console,
product Storybook smoke (71 catalog renders x 3 viewports).
@jackwener
jackwener merged commit 75e0853 into mainAug 3, 2026
jackwener added a commit that referenced this pull request Aug 3, 2026
… seam (#1997)
Adversarial review of #1984/#1991/#1993 (two independent lenses,
findings verified before fixing) plus one user-reported shell defect.
Shell:
- The content column is a rounded floating plate flush to the sidebar;
the theme's full-height sidenav hairline ran on the same seam and
read as a doubled border beside the plate's corner radius. Dropped
in the expanded state too (collapsed already did) — separation is
tonal, per DESIGN.md's One Working Plane rule.
Regressions from #1993, confirmed and fixed:
- bot-chat-detail lost all inter-section rhythm: its wrapper pair kept
a gap on a display:block section (inert) and a class with no CSS
rule. The page is a SettingsPage now, like the overview next door;
the back button keeps only its optical inline outdent.
- bot.css had the file-header comment replace-all'd into the middle of
`.settingsBotDetailHeader > .settingsBotLogo`. Parsed by luck;
removed.
- MetadataList destructures a closed prop list, so the runtime grid's
aria-label was silently dropped — the group name rides a real
role="group" wrapper now.
- The kit section header now wraps: at the 480px window floor a
multi-button action cluster drops under the title instead of
crushing it (replaces the deleted bot-runtime media query).
- Overview rows go flush-inline (the 10px inset was old card-grid
residue); the WeChat QR dialog gets its height floor back (224px)
so state swaps stop resizing the modal.
Convergence completions the review surfaced:
- claude-subscription-card drops its SectionHeader + full-width Card
and repeated title: it renders under ProvidersPanel's RouteHeader
like its sibling OAuth panels, as a bare VStack with the shared
StatusDot + text status idiom.
- ProvidersPanel connection status Badge -> StatusDot + text; health's
hand-rolled five-arm dot mapping -> the shared statusDotVariant.
- subagent-presets panel: Card-wrapped .settingsRows + a lead Item
posing as a header -> SettingsSection; settings-surface fallback
drops its Card wrap.
- About hero pills referenced two classNames with no CSS rule —
they are the Badges about.css's comment always described.
- `.settingsPage .settingsPageStack` (rename slip) -> nested
`.settingsPageStack .settingsPageStack`; quota labels round.
Verified: typecheck, check-dead-css, check-a11y/copy/console,
format:check, product Storybook smoke (71 renders x 3 viewports).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 6, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (#1972), and
the settings-page kit (#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
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

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

refactor(desktop): componentize the settings page container + residual sweep - #1991

Merged
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container
Aug 3, 2026
Merged

refactor(desktop): componentize the settings page container + residual sweep#1991
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container

Conversation

@jackwener

Copy link
Copy Markdown
Member

Follow-up to #1972/#1984, per the review feedback that pages (记忆页 included) should not keep reaching for the bare settingsStructuredPage class.

Page container → kit component

  • settings-section.tsx gains SettingsPage (as: div|section, aria-label): the kit now owns the page root; pages never reference page-layout CSS directly.
  • Class renamed to .settingsPageStack — deliberately not.settingsPage, which would collide with the pre-existing .settingsModal.settingsPage fullscreen-shell modifier (caught in re-audit before shipping).
  • Kept as a grid with the fix(desktop): polish form-row pages — General and Appearance #1362minmax(0, 1fr) column on purpose — a flex VStack stack would reintroduce the min-width: auto min-content floor for wide <pre>/long mono paths. Documented in the component JSDoc.
  • All 14 container call sites converted (incl. the models wrapper in settings-surface.tsx, whose local router is renamed SettingsPageBody to free the name, and the provider story). Page rhythm unifies at 32px (daily-review was 24, permission 20, About 16).

Residual sweep (from the post-#1972 re-audit)

  • About: second page container .settingsAboutPage (16px rhythm) retired → SettingsPage.
  • Health: footnote p.settingsHealthFootnote floated outside every section → same supporting-Text treatment Permission Center uses.
  • Orphaned CSS deleted: .settingsFeatureStatusPage/Hero/Icon/HeroHeading (no consumers since the voice rebuild; check-dead-css missed them because the names survived in comments). .settingsFeatureStatusList stays (voice 边界 list).
  • Usage CSS out of bot.css: ~150 lines move to a new usage.css (pure move — the fix(ui): pin the box height of single-line chips so leading cannot move them #1879 height pins and 900px media query travel intact).
  • Storybook contract re-anchored: the daily-review bounds contract pointed at the deleted .settingsFormPage hook → now .settingsPageStack.
  • 7 inert classNames dropped (settingsHelpText, settingsHelpInlineTime ×5, settingsBotMetaTime ×2 — no CSS rule anywhere).

Verification

typecheck ✅ · check-dead-css ✅ · check-a11y/copy/console ✅ · product Storybook smoke 71 renders × 3 viewports ✅ (re-run after rebasing over #1929, which needed the new mermaid dep installed)

Net: 23 files, +105/−289.

Next PR: the bot-chat cluster (last page group on the pre-#1972 dialect) + remaining hand-tinted boxes in memory/web-search.

…l sweep
Settings pages reached for the bare `.settingsStructuredPage` class as
their root container — page-layout CSS referenced directly from 14 call
sites, plus three sibling page-root grids (About / Usage / the orphaned
voice hero vocabulary) carrying their own rhythms.
- settings-section.tsx gains `SettingsPage` (div/section + aria-label):
the kit now owns the page root. The class becomes `.settingsPageStack`
— NOT `.settingsPage`, which would have collided with the pre-existing
`.settingsModal.settingsPage` fullscreen-shell modifier — and keeps
the #1362 grid `minmax(0, 1fr)` column on purpose: a flex stack's
`min-width: auto` floor would let a wide <pre> or long mono path poke
past the content column again.
- All 14 containers move onto <SettingsPage>; the local section router
in settings-surface.tsx is renamed SettingsPageBody to free the name.
Page rhythm unifies at 32px (daily-review was 24, permission 20,
About 16).
- About's second container (`.settingsAboutPage`) retires; the Health
footnote moves off `p.settingsHealthFootnote` onto the same
supporting-Text treatment Permission Center already uses.
- The orphaned voice hero vocabulary (`.settingsFeatureStatusPage` /
Hero / Icon / HeroHeading — no consumers since the voice rebuild) is
deleted; `.settingsFeatureStatusList` stays (voice 边界 list).
- Usage CSS (~150 lines) moves out of bot.css into its own usage.css —
a pure move; the #1879 height pins and 900px media query travel
intact.
- The daily-review Storybook bounds contract re-anchors from the
deleted `.settingsFormPage` hook to `.settingsPageStack`; seven inert
classNames with no CSS rule (`settingsHelpText`,
`settingsHelpInlineTime` x5, `settingsBotMetaTime` x2) are dropped.
Verified: desktop typecheck, check-dead-css, check-a11y/copy/console,
product Storybook smoke (71 catalog renders x 3 viewports).
@jackwener
jackwener merged commit 75e0853 into mainAug 3, 2026
jackwener added a commit that referenced this pull request Aug 3, 2026
… seam (#1997)
Adversarial review of #1984/#1991/#1993 (two independent lenses,
findings verified before fixing) plus one user-reported shell defect.
Shell:
- The content column is a rounded floating plate flush to the sidebar;
the theme's full-height sidenav hairline ran on the same seam and
read as a doubled border beside the plate's corner radius. Dropped
in the expanded state too (collapsed already did) — separation is
tonal, per DESIGN.md's One Working Plane rule.
Regressions from #1993, confirmed and fixed:
- bot-chat-detail lost all inter-section rhythm: its wrapper pair kept
a gap on a display:block section (inert) and a class with no CSS
rule. The page is a SettingsPage now, like the overview next door;
the back button keeps only its optical inline outdent.
- bot.css had the file-header comment replace-all'd into the middle of
`.settingsBotDetailHeader > .settingsBotLogo`. Parsed by luck;
removed.
- MetadataList destructures a closed prop list, so the runtime grid's
aria-label was silently dropped — the group name rides a real
role="group" wrapper now.
- The kit section header now wraps: at the 480px window floor a
multi-button action cluster drops under the title instead of
crushing it (replaces the deleted bot-runtime media query).
- Overview rows go flush-inline (the 10px inset was old card-grid
residue); the WeChat QR dialog gets its height floor back (224px)
so state swaps stop resizing the modal.
Convergence completions the review surfaced:
- claude-subscription-card drops its SectionHeader + full-width Card
and repeated title: it renders under ProvidersPanel's RouteHeader
like its sibling OAuth panels, as a bare VStack with the shared
StatusDot + text status idiom.
- ProvidersPanel connection status Badge -> StatusDot + text; health's
hand-rolled five-arm dot mapping -> the shared statusDotVariant.
- subagent-presets panel: Card-wrapped .settingsRows + a lead Item
posing as a header -> SettingsSection; settings-surface fallback
drops its Card wrap.
- About hero pills referenced two classNames with no CSS rule —
they are the Badges about.css's comment always described.
- `.settingsPage .settingsPageStack` (rename slip) -> nested
`.settingsPageStack .settingsPageStack`; quota labels round.
Verified: typecheck, check-dead-css, check-a11y/copy/console,
format:check, product Storybook smoke (71 renders x 3 viewports).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 6, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (#1972), and
the settings-page kit (#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
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

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

refactor(desktop): componentize the settings page container + residual sweep - #1991

Merged
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container
Aug 3, 2026
Merged

refactor(desktop): componentize the settings page container + residual sweep#1991
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container

Conversation

@jackwener

Copy link
Copy Markdown
Member

Follow-up to #1972/#1984, per the review feedback that pages (记忆页 included) should not keep reaching for the bare settingsStructuredPage class.

Page container → kit component

  • settings-section.tsx gains SettingsPage (as: div|section, aria-label): the kit now owns the page root; pages never reference page-layout CSS directly.
  • Class renamed to .settingsPageStack — deliberately not.settingsPage, which would collide with the pre-existing .settingsModal.settingsPage fullscreen-shell modifier (caught in re-audit before shipping).
  • Kept as a grid with the fix(desktop): polish form-row pages — General and Appearance #1362minmax(0, 1fr) column on purpose — a flex VStack stack would reintroduce the min-width: auto min-content floor for wide <pre>/long mono paths. Documented in the component JSDoc.
  • All 14 container call sites converted (incl. the models wrapper in settings-surface.tsx, whose local router is renamed SettingsPageBody to free the name, and the provider story). Page rhythm unifies at 32px (daily-review was 24, permission 20, About 16).

Residual sweep (from the post-#1972 re-audit)

  • About: second page container .settingsAboutPage (16px rhythm) retired → SettingsPage.
  • Health: footnote p.settingsHealthFootnote floated outside every section → same supporting-Text treatment Permission Center uses.
  • Orphaned CSS deleted: .settingsFeatureStatusPage/Hero/Icon/HeroHeading (no consumers since the voice rebuild; check-dead-css missed them because the names survived in comments). .settingsFeatureStatusList stays (voice 边界 list).
  • Usage CSS out of bot.css: ~150 lines move to a new usage.css (pure move — the fix(ui): pin the box height of single-line chips so leading cannot move them #1879 height pins and 900px media query travel intact).
  • Storybook contract re-anchored: the daily-review bounds contract pointed at the deleted .settingsFormPage hook → now .settingsPageStack.
  • 7 inert classNames dropped (settingsHelpText, settingsHelpInlineTime ×5, settingsBotMetaTime ×2 — no CSS rule anywhere).

Verification

typecheck ✅ · check-dead-css ✅ · check-a11y/copy/console ✅ · product Storybook smoke 71 renders × 3 viewports ✅ (re-run after rebasing over #1929, which needed the new mermaid dep installed)

Net: 23 files, +105/−289.

Next PR: the bot-chat cluster (last page group on the pre-#1972 dialect) + remaining hand-tinted boxes in memory/web-search.

…l sweep
Settings pages reached for the bare `.settingsStructuredPage` class as
their root container — page-layout CSS referenced directly from 14 call
sites, plus three sibling page-root grids (About / Usage / the orphaned
voice hero vocabulary) carrying their own rhythms.
- settings-section.tsx gains `SettingsPage` (div/section + aria-label):
the kit now owns the page root. The class becomes `.settingsPageStack`
— NOT `.settingsPage`, which would have collided with the pre-existing
`.settingsModal.settingsPage` fullscreen-shell modifier — and keeps
the #1362 grid `minmax(0, 1fr)` column on purpose: a flex stack's
`min-width: auto` floor would let a wide <pre> or long mono path poke
past the content column again.
- All 14 containers move onto <SettingsPage>; the local section router
in settings-surface.tsx is renamed SettingsPageBody to free the name.
Page rhythm unifies at 32px (daily-review was 24, permission 20,
About 16).
- About's second container (`.settingsAboutPage`) retires; the Health
footnote moves off `p.settingsHealthFootnote` onto the same
supporting-Text treatment Permission Center already uses.
- The orphaned voice hero vocabulary (`.settingsFeatureStatusPage` /
Hero / Icon / HeroHeading — no consumers since the voice rebuild) is
deleted; `.settingsFeatureStatusList` stays (voice 边界 list).
- Usage CSS (~150 lines) moves out of bot.css into its own usage.css —
a pure move; the #1879 height pins and 900px media query travel
intact.
- The daily-review Storybook bounds contract re-anchors from the
deleted `.settingsFormPage` hook to `.settingsPageStack`; seven inert
classNames with no CSS rule (`settingsHelpText`,
`settingsHelpInlineTime` x5, `settingsBotMetaTime` x2) are dropped.
Verified: desktop typecheck, check-dead-css, check-a11y/copy/console,
product Storybook smoke (71 catalog renders x 3 viewports).
@jackwener
jackwener merged commit 75e0853 into mainAug 3, 2026
jackwener added a commit that referenced this pull request Aug 3, 2026
… seam (#1997)
Adversarial review of #1984/#1991/#1993 (two independent lenses,
findings verified before fixing) plus one user-reported shell defect.
Shell:
- The content column is a rounded floating plate flush to the sidebar;
the theme's full-height sidenav hairline ran on the same seam and
read as a doubled border beside the plate's corner radius. Dropped
in the expanded state too (collapsed already did) — separation is
tonal, per DESIGN.md's One Working Plane rule.
Regressions from #1993, confirmed and fixed:
- bot-chat-detail lost all inter-section rhythm: its wrapper pair kept
a gap on a display:block section (inert) and a class with no CSS
rule. The page is a SettingsPage now, like the overview next door;
the back button keeps only its optical inline outdent.
- bot.css had the file-header comment replace-all'd into the middle of
`.settingsBotDetailHeader > .settingsBotLogo`. Parsed by luck;
removed.
- MetadataList destructures a closed prop list, so the runtime grid's
aria-label was silently dropped — the group name rides a real
role="group" wrapper now.
- The kit section header now wraps: at the 480px window floor a
multi-button action cluster drops under the title instead of
crushing it (replaces the deleted bot-runtime media query).
- Overview rows go flush-inline (the 10px inset was old card-grid
residue); the WeChat QR dialog gets its height floor back (224px)
so state swaps stop resizing the modal.
Convergence completions the review surfaced:
- claude-subscription-card drops its SectionHeader + full-width Card
and repeated title: it renders under ProvidersPanel's RouteHeader
like its sibling OAuth panels, as a bare VStack with the shared
StatusDot + text status idiom.
- ProvidersPanel connection status Badge -> StatusDot + text; health's
hand-rolled five-arm dot mapping -> the shared statusDotVariant.
- subagent-presets panel: Card-wrapped .settingsRows + a lead Item
posing as a header -> SettingsSection; settings-surface fallback
drops its Card wrap.
- About hero pills referenced two classNames with no CSS rule —
they are the Badges about.css's comment always described.
- `.settingsPage .settingsPageStack` (rename slip) -> nested
`.settingsPageStack .settingsPageStack`; quota labels round.
Verified: typecheck, check-dead-css, check-a11y/copy/console,
format:check, product Storybook smoke (71 renders x 3 viewports).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 6, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (#1972), and
the settings-page kit (#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
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

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

refactor(desktop): componentize the settings page container + residual sweep - #1991

Merged
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container
Aug 3, 2026
Merged

refactor(desktop): componentize the settings page container + residual sweep#1991
jackwener merged 1 commit into
mainfrom
refactor/settings-page-kit-container

Conversation

@jackwener

Copy link
Copy Markdown
Member

Follow-up to #1972/#1984, per the review feedback that pages (记忆页 included) should not keep reaching for the bare settingsStructuredPage class.

Page container → kit component

  • settings-section.tsx gains SettingsPage (as: div|section, aria-label): the kit now owns the page root; pages never reference page-layout CSS directly.
  • Class renamed to .settingsPageStack — deliberately not.settingsPage, which would collide with the pre-existing .settingsModal.settingsPage fullscreen-shell modifier (caught in re-audit before shipping).
  • Kept as a grid with the fix(desktop): polish form-row pages — General and Appearance #1362minmax(0, 1fr) column on purpose — a flex VStack stack would reintroduce the min-width: auto min-content floor for wide <pre>/long mono paths. Documented in the component JSDoc.
  • All 14 container call sites converted (incl. the models wrapper in settings-surface.tsx, whose local router is renamed SettingsPageBody to free the name, and the provider story). Page rhythm unifies at 32px (daily-review was 24, permission 20, About 16).

Residual sweep (from the post-#1972 re-audit)

  • About: second page container .settingsAboutPage (16px rhythm) retired → SettingsPage.
  • Health: footnote p.settingsHealthFootnote floated outside every section → same supporting-Text treatment Permission Center uses.
  • Orphaned CSS deleted: .settingsFeatureStatusPage/Hero/Icon/HeroHeading (no consumers since the voice rebuild; check-dead-css missed them because the names survived in comments). .settingsFeatureStatusList stays (voice 边界 list).
  • Usage CSS out of bot.css: ~150 lines move to a new usage.css (pure move — the fix(ui): pin the box height of single-line chips so leading cannot move them #1879 height pins and 900px media query travel intact).
  • Storybook contract re-anchored: the daily-review bounds contract pointed at the deleted .settingsFormPage hook → now .settingsPageStack.
  • 7 inert classNames dropped (settingsHelpText, settingsHelpInlineTime ×5, settingsBotMetaTime ×2 — no CSS rule anywhere).

Verification

typecheck ✅ · check-dead-css ✅ · check-a11y/copy/console ✅ · product Storybook smoke 71 renders × 3 viewports ✅ (re-run after rebasing over #1929, which needed the new mermaid dep installed)

Net: 23 files, +105/−289.

Next PR: the bot-chat cluster (last page group on the pre-#1972 dialect) + remaining hand-tinted boxes in memory/web-search.

…l sweep
Settings pages reached for the bare `.settingsStructuredPage` class as
their root container — page-layout CSS referenced directly from 14 call
sites, plus three sibling page-root grids (About / Usage / the orphaned
voice hero vocabulary) carrying their own rhythms.
- settings-section.tsx gains `SettingsPage` (div/section + aria-label):
the kit now owns the page root. The class becomes `.settingsPageStack`
— NOT `.settingsPage`, which would have collided with the pre-existing
`.settingsModal.settingsPage` fullscreen-shell modifier — and keeps
the #1362 grid `minmax(0, 1fr)` column on purpose: a flex stack's
`min-width: auto` floor would let a wide <pre> or long mono path poke
past the content column again.
- All 14 containers move onto <SettingsPage>; the local section router
in settings-surface.tsx is renamed SettingsPageBody to free the name.
Page rhythm unifies at 32px (daily-review was 24, permission 20,
About 16).
- About's second container (`.settingsAboutPage`) retires; the Health
footnote moves off `p.settingsHealthFootnote` onto the same
supporting-Text treatment Permission Center already uses.
- The orphaned voice hero vocabulary (`.settingsFeatureStatusPage` /
Hero / Icon / HeroHeading — no consumers since the voice rebuild) is
deleted; `.settingsFeatureStatusList` stays (voice 边界 list).
- Usage CSS (~150 lines) moves out of bot.css into its own usage.css —
a pure move; the #1879 height pins and 900px media query travel
intact.
- The daily-review Storybook bounds contract re-anchors from the
deleted `.settingsFormPage` hook to `.settingsPageStack`; seven inert
classNames with no CSS rule (`settingsHelpText`,
`settingsHelpInlineTime` x5, `settingsBotMetaTime` x2) are dropped.
Verified: desktop typecheck, check-dead-css, check-a11y/copy/console,
product Storybook smoke (71 catalog renders x 3 viewports).
@jackwener
jackwener merged commit 75e0853 into mainAug 3, 2026
jackwener added a commit that referenced this pull request Aug 3, 2026
… seam (#1997)
Adversarial review of #1984/#1991/#1993 (two independent lenses,
findings verified before fixing) plus one user-reported shell defect.
Shell:
- The content column is a rounded floating plate flush to the sidebar;
the theme's full-height sidenav hairline ran on the same seam and
read as a doubled border beside the plate's corner radius. Dropped
in the expanded state too (collapsed already did) — separation is
tonal, per DESIGN.md's One Working Plane rule.
Regressions from #1993, confirmed and fixed:
- bot-chat-detail lost all inter-section rhythm: its wrapper pair kept
a gap on a display:block section (inert) and a class with no CSS
rule. The page is a SettingsPage now, like the overview next door;
the back button keeps only its optical inline outdent.
- bot.css had the file-header comment replace-all'd into the middle of
`.settingsBotDetailHeader > .settingsBotLogo`. Parsed by luck;
removed.
- MetadataList destructures a closed prop list, so the runtime grid's
aria-label was silently dropped — the group name rides a real
role="group" wrapper now.
- The kit section header now wraps: at the 480px window floor a
multi-button action cluster drops under the title instead of
crushing it (replaces the deleted bot-runtime media query).
- Overview rows go flush-inline (the 10px inset was old card-grid
residue); the WeChat QR dialog gets its height floor back (224px)
so state swaps stop resizing the modal.
Convergence completions the review surfaced:
- claude-subscription-card drops its SectionHeader + full-width Card
and repeated title: it renders under ProvidersPanel's RouteHeader
like its sibling OAuth panels, as a bare VStack with the shared
StatusDot + text status idiom.
- ProvidersPanel connection status Badge -> StatusDot + text; health's
hand-rolled five-arm dot mapping -> the shared statusDotVariant.
- subagent-presets panel: Card-wrapped .settingsRows + a lead Item
posing as a header -> SettingsSection; settings-surface fallback
drops its Card wrap.
- About hero pills referenced two classNames with no CSS rule —
they are the Badges about.css's comment always described.
- `.settingsPage .settingsPageStack` (rename slip) -> nested
`.settingsPageStack .settingsPageStack`; quota labels round.
Verified: typecheck, check-dead-css, check-a11y/copy/console,
format:check, product Storybook smoke (71 renders x 3 viewports).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 6, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
ARE404 added a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit to ARE404/maka-agent that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (apache#1972), and
the settings-page kit (apache#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
jackwener pushed a commit that referenced this pull request Aug 7, 2026
The 外观 page carried four leftovers from the moves that reshaped it —
identity going to 通用 (P2-13), the Astryx open-group rebuild (#1972), and
the settings-page kit (#1991).
- Page root: `AppearanceSettingsPage` wrapped a `ThemeSettingsPage` that
opened a `SettingsPage` of its own, so the page grid nested inside itself
(two `.settingsPageStack` in the DOM). The page IS the theme page, as its
own comment said, so it is now one component with one root. Same defect on
通用, where the identity block was a `*Page` rendered inside another page:
it is a section of someone else's page and is now named, filed, and shaped
as one (`personalization-settings-section.tsx`).
- Grouping: the 14 option tiles were loose in the accessibility tree — the
sections were unnamed landmarks and the visible 编辑器主题 / 产品色调
labels had no programmatic relationship to the grids they head. Sections
now carry `titleId`, and each grid is a `role="group"` named by its label.
- Copy: the nav description still advertised 界面语言 on 外观, a page that
has not had it since P2-13; 通用, which does, never mentioned it. Both
descriptions now say what their page holds.
- Dead copy: `sections.paletteHelp` was defined in both locales and read by
nobody, while the palette section reached into `appearance.persistenceHelp`
for its lede. The palette section now takes its lede from `sections`, the
same namespace the theme section above it uses, and the unread key is gone.
`AppearanceSettingsPage` also stops taking a `settings` prop it only passed
down one level to a component that never read it.
Contract: `astryx-component-behavior` pins one page stack, the four
labelledby anchors, three named groups, no 界面语言 on 外观, and that the
identity block opens no page stack of its own.
Verified: desktop typecheck; format:check; console/a11y/copy checks;
dead-css; 1754 desktop tests; and both pages re-rendered in a real Electron
fixture window (外观 unchanged apart from the two copy lines, 通用 pixel
identical).
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

@jackwener