Skip to content

fix(sidenav): align indicators and preserve width across Settings - #371

Merged
wesbillman merged 12 commits into
mainfrom
cynthiac/sidenav-polish-followup
Sep 29, 2026
Merged

wesbillman merged 12 commits into
mainfrom
cynthiac/sidenav-polish-followup

Conversation

@cynfria

@cynfria cynfria commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

Why

The sidenav allowed unread dots to sit outside row highlights, clipped section names, and changed width when opening Settings. Section controls and row highlights also had inconsistent spacing.

What

  • Align unread dots inside row highlights and move them 4px left.
  • Fade overflowing section names using the existing channel-row treatment, and align section actions with tighter spacing.
  • Set a 220px minimum and preserve width across Settings, Back, and reload. Retain width in memory when storage writes fail.
  • Use the existing collapsible navigation drawer at widths of 650px and below, so the sidebar does not squeeze phone-width content. Keep header controls reachable at 320px.
  • Give Settings its own sidebar while preserving personal Profile access and restoring the previous channel view on Back.

How

Reuse the existing sidebar width clamping and community/viewer storage scope. Share the existing overflow-label component between rows and section names. Keep channel labels full-width unless a DM name accessory needs space.

Risk

This touches app navigation, shared shell sizing, and sidebar geometry. At windows no wider than 650px, navigation opens as a 220px drawer over the content and starts collapsed on destination changes. If storage fails, width recovery lasts only for the current app session.

Testing

Current locally checked commit: 0c7356f0 (hosted CI pending). Previous hosted green commit: 279d6fc9. Original polish checks below were at e1060411.

  • The affected-file browser batch passed 84 Chromium/WebKit cases before rebase. Ten rebase-sensitive cases passed afterward, followed by four geometry cases after equivalent spacing-token corrections. Mandatory type, related-unit, and design hooks passed at the pushed head.
  • Added seven browser cases, removed none; three existing cases were renamed. New coverage checks Settings replacement/Back, width restoration/reload, narrow-window width, failed storage writes, section fading/recovery, scrollbar inset, and row-fill bounds. These depend on real layout, browser storage, or route integration.
  • The dot-alignment regression failed in both engines before the layout correction and passed afterward. Other new cases have passing coverage but no separately recorded fail-before run.
  • The old persistent-sidebar assertion now checks Settings replacement and restored scroll/collapse state. The existing narrow Settings test checks full-row visibility after programmatic scrolling; it no longer proves native wheel scrolling.

CI follow-up

  • Hosted CI passed at 279d6fc9: all six Chromium/WebKit journey shards, JavaScript, Rust/tool integration, and browser measurements. Hosted DCO passed; Windows native validation was skipped by the workflow.

  • Migrated Settings journeys to the replacement sidebar, its Back action, and drawer controls. The pending-modal test now exercises the channel drawer directly; its uncertain-publication, Escape, modal-inertness, and focus assertions remain.

  • Extended the width journey to check that opening the phone drawer does not shrink the content and that desktop width is restored. Existing 320px/200% text-size coverage exercises pointer access to Settings controls. No browser cases were added or removed in this follow-up.

  • Accounted for the exact native scrollbar gutter in the row-fill assertion and waited for applied resize geometry without changing tolerances. Restored the real wheel-scroll journey against the current Settings scroll container.

  • Local Chromium/WebKit batch: 165/170 passed before the final corrections. Full affected-file reruns then passed 64 cases, followed by all 10 Settings cases after updating the narrow Back assertion. These reruns cover all failures from that batch. Commands used pnpm test:browser <affected files> --project chromium --project webkit --no-deps on macOS; broad hosted CI remains authoritative for Linux.

  • After integrating main and resolving the agent-activity test overlap, all 16 agent-activity/channel-leave browser cases passed in Chromium and WebKit at bd1af890.

  • The startup-style journey now opens the phone drawer before inspecting navigation controls and closes it afterward; all styling assertions remain. The full file passed in Chromium and WebKit (2 cases, 6.4 seconds) at 279d6fc9. The preceding hosted run had only this stale-test failure in each engine; its other shards passed.

  • At the pushed head, mandatory TypeScript, 71 related unit tests, and all design guards passed. All PR commits have DCO sign-offs.

  • The original JavaScript failure was a timeout in unchanged relay replay coverage; it is tracked independently in Emergency main fix: bound live replay test runtime #372.

Review follow-up

  • Restored the gated community-profile publication journey: pending busy/disabled controls, repeated Enter, rejection with retained Save focus, keyboard retry, success focus recovery, and Cancel focus recovery. Both requests are released in finally; final request counts guard duplicate publication.
  • Preserved an accessible level-one Settings heading and corrected the shell documentation for replacement Settings navigation and the all-page phone drawer.
  • After integrating main, all 22 cases in settings.spec.mjs, notification-settings.spec.mjs, and plugin-import.spec.mjs passed in Chromium and WebKit on macOS (32.0 seconds) at 9b114052. No cases added or removed.
  • Fixed the phone drawer close signal using the existing navigation attempt ID, including reselecting the current destination. Narrow navigation hands focus to main content; channel selection retains the existing composer focus. Desktop navigation remains visible and preserves its focus behavior. Removed manual Hide clicks from the shared Settings helper and channel-selection helper.
  • The narrow channel-switch regression failed before the fix in both engines (drawer remained visible). The final affected eight-file batch passed all 78 Chromium/WebKit cases on macOS in 1.7 minutes before the formatting-only commit hook (8b9ff420). Coverage includes keyboard channel switching and typing, Settings-section/reselection focus, width restoration, and existing profile publication failure/retry. No browser cases added or removed.
  • After merging current main and retaining both navigation helper imports, all 28 layout/drawer cases passed in Chromium and WebKit (58.3 seconds) at 0c7356f0.
  • Top-bar styling and animation remain in PR Polish top bar and animate contextual sidebar toggle #360; its shared shell changes must retain this navigation-attempt close signal when integrated.

Before and after

Matched WebKit fixture captures using synthetic data, light mode, a 1200×800 viewport, and 2× pixel density. Before: base 3a19fa43; after: e1060411. These illustrate browser layout; native visual acceptance remains outstanding.

Unread row — 260px sidebar

Same Alice Fixture row, hovered in both captures.

Before After
Before: unread DM row at 260px After: unread DM row at 260px

Section label and actions — 220px sidebar

Same long section label, with its actions revealed in both captures.

Before After
Before: section label and controls at 220px After: faded section label and aligned controls at 220px

Opening Settings — 360px sidebar

Both captures start with the sidebar resized to 360px before opening Settings. The updated Settings navigation occupies that same sidebar width.

Before After
Before: Settings alongside channel sidebar After: Settings replaces sidebar at the preserved width

Remaining before ready for review

  • Final native screenshots at 220px and 260px, plus a short recording and human visual acceptance, are still outstanding. Browser geometry does not establish native optical alignment.
  • The 200% Settings case uses programmatic scrolling; representative real wheel coverage passes in the layout journey.

Generated with Codex

Align row indicators and section controls, fade overflowing section names, and enforce a 220px minimum sidebar width. Keep Settings width consistent across navigation, narrow windows, and storage failures, and retain personal Profile access.

Signed-off-by: Codex <noreply@openai.com>
Signed-off-by: Codex <noreply@openai.com>
…sh-followup

* origin/main:
  Open pages from search by keyboard once the palette is final (#365)
  feat(agents): one-click Pi install and provider setup (slice 5/5) (#330)

Signed-off-by: Codex <noreply@openai.com>
…sh-followup

* origin/main:
  fix(workflows): keep deletion on the grid with toast recovery (#328)
  feat(channels): leave channels from the management pane (#363)

Signed-off-by: Codex <noreply@openai.com>

# Conflicts:
#	tests/browser/agent-activity.spec.mjs
@cynfria
cynfria marked this pull request as ready for review September 28, 2026 22:26
@cynfria
cynfria requested review from a team, comp615 and wesbillman as code owners September 28, 2026 22:26
Signed-off-by: Codex <noreply@openai.com>

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Star Lord automated source review (via Wes’s account)

Reviewed head 279d6fc900823ea6bb6a16e39113d4da2b099481 against base 5ce7836b197fc4f19b9bd4c23d3f8cd56495df3b. This is a COMMENT, not approval or merge authorization.

Findings

Two actionable findings are attached inline: the narrow overlay does not close for channel/Settings-section navigation, and the Settings test migration removes the held-publication keyboard/failure/retry regression journey without equivalent browser coverage. The latter is a coverage-contract regression, not a claim that profile publication is currently broken.

Assessment: minimalness 9/10, elegance 9/10, correctness 8/10 pending the drawer repair and preservation of the affected recovery contract. Width clamping/session fallback and extraction of the existing fading-label behavior reuse existing owners appropriately. Groot’s independent navigation/accessibility source review was reconciled against the same snapshot.

Optional improvements

  • Preserve a screen-reader-accessible level-one Settings heading. Settings.module.css:104–106 hides the old sidebar including the h1 in Settings.tsx:182; the replacement sidebar has group h2s and the detail headers default to h2. The region still has its Settings name, so this is heading-navigation polish, not an unnamed-region defect. An sr-only heading in the detail pane would preserve that landmark in heading traversal.
  • Update docs/shell-design.md to describe the Settings replacement sidebar and all-page narrow drawer; its persistent-channel-sidebar/Settings-only disclosure descriptions now contradict the implementation.

Evidence and limits

  • Read the full 37-file diff, relevant owners/callers, repository instructions and design/vision documents. Reviewed success/cancel separately from error/retry/focus paths. The retained real-wheel Settings journey at tests/browser/layout.spec.mjs:640–680 addresses representative wheel input; the 200% case is explicitly programmatic, as the description discloses.
  • Reviewed the public description, all six attached images and all six commit messages. No additional public-material disclosure finding in those inputs or the changed source/configuration/fixtures. The synthetic browser images compare 3a19fa43 to e1060411, not this head.
  • Isolated exact-head source archive: 1,649 Git blobs verified, then SHA-256 contents rechecked unchanged; no dirty source inputs or live-checkout changes.
  • Source-only: no PR code, tests, builds, installs or app launches executed. One hosted CI snapshot for run 36493396900 reports JavaScript, Rust/tool integration, all six Chromium/WebKit journey shards, browser measurements and CI required passing at this head; Windows native validation was skipped. Author-reported local checks were not independently rerun. Green CI does not establish the missing behavior.
  • Current-head native geometry, browser focus/recovery behavior and human acceptance remain unverified. The description itself leaves final native captures/recording and human visual acceptance outstanding; this review does not attest the readiness checklist or buzz-review-completed.

Comment thread src/app/shell/AppShell.tsx Outdated
Comment thread tests/browser/settings.spec.mjs Outdated
Signed-off-by: Codex <noreply@openai.com>
Signed-off-by: Codex <noreply@openai.com>
Signed-off-by: Codex <noreply@openai.com>
…sh-followup

* origin/main:
  Add message-level read and unread controls (#352)
  feat: add per-category notification alert sounds with app-owned playback (#356)
  test(relay): stabilize per-channel replay boundary coverage (#378)
  fix(design-system): keep button labels single-line and corners capsule-shaped (#357)

Signed-off-by: Codex <noreply@openai.com>
Signed-off-by: Codex <noreply@openai.com>
@cynfria
cynfria marked this pull request as draft September 29, 2026 00:04
…sh-followup

* origin/main:
  Keep image attachments compact with scrolling thumbnail strips (#313)
  Retire the notification presentation wait when its service closes (#379)

Signed-off-by: Codex <noreply@openai.com>

# Conflicts:
#	tests/browser/layout.spec.mjs
@cynfria
cynfria marked this pull request as ready for review September 29, 2026 00:08

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Carl, an automated reviewer, commenting via Wes’s GitHub account.

No blocking findings at 0c7356f0d5591e541f60591a4dd2249c9a1e8a98. This is a follow-up COMMENT, not approval or merge authorization. Minimalness, elegance and correctness: 9/10 each.

  • Both prior P2 findings are resolved: navigation attempts close the phone drawer and hand off focus, including Settings-section reselection; the gated profile publication failure/keyboard-retry journey is restored. The accessible Settings heading and shell documentation are also corrected. Independent navigation and profile/persistence source-review lanes agree.
  • Independently ran the complete settings.spec.mjs and settings-sidebar-width.spec.mjs files in Chromium and WebKit on macOS at this clean head: 16/16 passed (20.6s). This covers drawer focus, width persistence/reload/storage failure and profile rejection/retry. One optional P3 remains inline: restore the distinct-local-default reload guard. It is a coverage weakness, not a demonstrated runtime defect.
  • Current-head hosted CI is still in progress; native visual acceptance and the final native captures/recording remain outstanding as disclosed in the description. Browser checks do not certify those. Reviewed the full base-to-head diff, description, attached media and commit text for publication hygiene; no internal-information or accidental committed review-artifact finding in those materials.

Code review is non-blocking. Finish hosted checks and the disclosed human/native acceptance before claiming the readiness checklist complete.

await page.getByRole("menuitem", { name: "Settings", exact: true }).click();
await expect(
page.getByRole("menu", { name: "Updated community profile" }),
page.getByRole("menu", { name: "Updated local profile" }),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P3, optional] Restore the distinct local-default reload guard

The migrated test no longer changes the saved local profile before reload. A successful community save also updates that local default (src/app/ProfileSettings.tsx:270–277), so both now contain “Updated community profile”: the reload assertions can pass even if Settings/the header incorrectly use the local seed instead of confirmed community state. The base deliberately set saved.profile.name = "Local default only" before reloading to distinguish them.

Please restore that injection and check the actual menu name here (Updated community profile). Updated local profile is not supplied anywhere else in the current src/tests inputs, so this hidden assertion currently passes without proving dismissal. This is lost regression coverage, not evidence that runtime profile loading is broken.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Star Lord automated source review (via Wes’s account)

Reviewed head 0c7356f0d5591e541f60591a4dd2249c9a1e8a98 against base 423f7215e124aa68b828c85f9040703a3fe9913d. This is a COMMENT, not approval or merge authorization.

Follow-up result

Both prior P2 findings are addressed in source; no new actionable finding in the repairs. This follow-up preserves the previous review’s exit criteria rather than reopening unrelated portions of the change.

  • Narrow drawer navigation: App.tsx:157 supplies the existing navigation-attempt ID to AppShell.tsx:56–62. The controller starts a fresh attempt for channel/Settings-section selection, reselection and ordinary retry, while in-place target normalization retains the ID. The drawer therefore closes on navigation, not on unrelated resolution updates. Focus is handed to the main region only when the narrow toggle is visible; desktop section focus is not changed by this effect. Reviewed the supported navigation callers, failure/retry presentation and composer mount-focus ownership. settings-sidebar-width.spec.mjs:76–116 now asserts channel closure and typing, Settings-section closure and main focus, and same-section reselection. The shared helpers no longer hide the drawer on the implementation’s behalf.
  • Profile publication coverage: settings.spec.mjs:408–573 restores an explicit request gate, pending busy/disabled assertions, repeated Enter, rejection with retained Save focus, keyboard retry, success/Cancel focus recovery and exactly two publication requests. Both held requests are released in finally. These assertions match the existing form, publication receipt and focus-cleanup owners; this resolves the earlier coverage-contract finding, not a claim of newly repaired publication code.
  • The previously optional accessible Settings heading and shell-documentation corrections are also present.

Source assessment: minimalness 9/10, elegance 9/10, correctness 9/10. The repair reuses the navigation owner rather than adding another route tracker. Groot’s bounded independent navigation/accessibility lane is complete and reconciled against this snapshot.

Evidence and limits

  • Reviewed the follow-up changes and affected owners/callers against repository instructions, contribution/test-layer rules, shell design and the relevant Buzz vision documents. Success/cancel and error/retry focus paths were considered separately.
  • Inspected the public description, all six attached images, all twelve PR commit messages and the changed publication surface. No additional disclosure finding in those reviewed inputs. The synthetic images compare 3a19fa43 to e1060411, not this head.
  • Isolated exact-head archive: 1,679 Git blobs verified, then SHA-256 contents rechecked unchanged; no dirty source inputs or live-checkout changes.
  • Source-only: no PR code, tests, builds, installs or app launches executed. The single hosted CI snapshot for run 36501498676 showed browser measurements, DCO, Semgrep and zizmor passing; JavaScript, Rust/tool integration and all six browser-journey shards were still in progress. Windows native validation was skipped. This is a snapshot, not a current CI-green claim; author-reported local runs were not independently rerun.
  • Current-head browser focus/recovery behavior, native geometry and human acceptance remain independently unverified. The description still leaves final native captures/recording and human visual acceptance outstanding. This review does not attest the readiness checklist or buzz-review-completed.

@wesbillman
wesbillman merged commit 7e065bd into main Sep 29, 2026
14 checks passed
@wesbillman
wesbillman deleted the cynthiac/sidenav-polish-followup branch September 29, 2026 00:38
Sign up for free to 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.

3 participants