Skip to content

fix(ui): sidebar Settings entry scrolls away instead of staying pinned in the footer#100443

Closed
steipete wants to merge 1 commit into
mainfrom
claude/adoring-leakey-8d6771
Closed

fix(ui): sidebar Settings entry scrolls away instead of staying pinned in the footer#100443
steipete wants to merge 1 commit into
mainfrom
claude/adoring-leakey-8d6771

Conversation

@steipete

@steipete steipete commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Fixes an issue where the Control UI sidebar rendered Settings as its own collapsible "SETTINGS" group inside the scrollable navigation area. With enough nav items (or a short window) the Settings entry scrolled out of view, while the footer (Docs, connection status) stayed pinned — Settings belongs with those fixed utility entries.

Why This Change Was Made

The settings group carried a single route (config), so a whole scrollable section (with collapse toggle) was overhead for one entry. The Settings nav item now renders inside the fixed sidebar footer, above Docs. The scrollable sections are reduced to chat/control/agent, and the now-unused isRouteInSidebarSection helper (test-only after this change) is deleted. Active-state highlighting for nested settings routes is unchanged — renderRoute("config") already resolves it via isSettingsNavigationRoute.

User Impact

Settings is always visible at the bottom of the sidebar (expanded and collapsed rail), pinned with Docs and the connection status instead of scrolling with the nav. No route, URL, or behavior changes otherwise.

Evidence

  • Focused tests: ui/src/app-navigation.test.ts + ui/src/app-navigation-groups.test.ts — 34 passed.
  • Visual check on the Vite dev server: expanded sidebar footer renders Settings → Docs → Online pinned below the nav divider; collapsed rail shows gear → book → pair → status dot. DOM assertion confirmed scrollable nav items no longer include Settings and footer order is ["Settings", "Docs", "Online"].
  • Plugin sidebar tabs are unaffected: declared tab groups are limited to control/agent (ui/src/api/gateway.ts), so nothing routed to the removed group.
  • Codex autoreview (gpt-5.5): clean, no actionable findings.

Before / After

Same window height (760px). Before: Settings lives in a scrollable "SETTINGS" group and is scrolled out of view; after: Settings is pinned in the fixed footer above Docs and the connection status.

Before After
Before: Settings scrolled out of view in the nav After: Settings pinned in the footer above Docs
Before: collapsed rail After: collapsed rail with pinned gear icon

@openclaw-barnacle openclaw-barnacle Bot added app: web-ui App: web-ui size: XS maintainer Maintainer-authored PR labels Jul 5, 2026
@clawsweeper

clawsweeper Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 5, 2026, 4:19 PM ET / 20:19 UTC.

Summary
Moves the Control UI Settings route out of scrollable sidebar sections into the fixed sidebar footer and adjusts navigation tests.

PR surface: Source -9, Tests -14. Total -23 across 4 files.

Reproducibility: yes. from source and screenshots: current main puts Settings in SIDEBAR_SECTIONS rendered inside the scrollable .sidebar-nav, and the before/after images show the placement change. I did not run a local browser because this review is read-only.

Review metrics: none identified.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • none.

Risk before merge

Maintainer options:

  1. Decide the mitigation before merge
    Land this narrow footer placement fix if maintainers want immediate Settings visibility, or explicitly fold it into the broader sidebar redesign only if that larger PR becomes the chosen landing path.
  2. Pause or close
    Do not merge this PR until maintainers decide whether the risk is worth taking.

Next step before merge

  • [P2] Manual review only: the protected maintainer label and overlapping broader sidebar redesign make this a maintainer sequencing decision, with no actionable code repair for ClawSweeper.

Maintainer decision needed

  • Question: Should this narrow Settings-footer fix land independently, or should maintainers fold it into the broader pinned-nav redesign at feat(ui): declutter the Control UI sidebar with customizable pinned nav and a More section #100296?
  • Rationale: The patch is small and correct, but the protected maintainer label plus overlapping open sidebar redesign make landing order and UX direction a maintainer choice.
  • Likely owner: steipete — He is the visible recent owner for the touched Control UI sidebar surface and the overlapping broader redesign.
  • Options:
    • Land The Narrow Fix (recommended): Merge this small PR now to keep Settings pinned without taking the larger persisted-navigation redesign.
    • Fold Into Broader Redesign: Close or defer this PR only if maintainers decide the broader pinned-nav PR should own the Settings-footer behavior too.
    • Pause Sidebar Changes: Hold this PR if maintainers want a different sidebar information architecture before changing Settings placement.

Security
Cleared: The diff only changes Control UI navigation placement and tests; it does not touch dependencies, workflows, credentials, build scripts, or other security-sensitive surfaces.

Review details

Best possible solution:

Land this narrow footer placement fix if maintainers want immediate Settings visibility, or explicitly fold it into the broader sidebar redesign only if that larger PR becomes the chosen landing path.

Do we have a high-confidence way to reproduce the issue?

Yes from source and screenshots: current main puts Settings in SIDEBAR_SECTIONS rendered inside the scrollable .sidebar-nav, and the before/after images show the placement change. I did not run a local browser because this review is read-only.

Is this the best way to solve the issue?

Yes for the narrow bug: reusing renderRoute("config") in the existing footer preserves route, preload, and active-state behavior while removing the redundant one-item scrollable section. The broader pinned-nav PR is a larger product change, not a necessary prerequisite for this fix.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 09f9a85145c0.

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR includes direct before/after sidebar screenshots showing Settings pinned above Docs in expanded and collapsed states, plus reported Vite visual and DOM checks.
  • add proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. The PR includes direct before/after sidebar screenshots showing Settings pinned above Docs in expanded and collapsed states, plus reported Vite visual and DOM checks.

Label justifications:

  • P3: This is a low-risk Control UI ergonomics fix with limited blast radius and no evidence of blocked setup, data loss, or runtime failure.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (screenshot): The PR includes direct before/after sidebar screenshots showing Settings pinned above Docs in expanded and collapsed states, plus reported Vite visual and DOM checks.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR includes direct before/after sidebar screenshots showing Settings pinned above Docs in expanded and collapsed states, plus reported Vite visual and DOM checks.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. The PR includes direct before/after sidebar screenshots showing Settings pinned above Docs in expanded and collapsed states, plus reported Vite visual and DOM checks.
Evidence reviewed

PR surface:

Source -9, Tests -14. Total -23 across 4 files.

View PR surface stats
Area Files Added Removed Net
Source 2 2 11 -9
Tests 2 5 19 -14
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 4 7 30 -23

What I checked:

  • Repository policy read: Root AGENTS.md and the scoped UI AGENTS.md were read fully; the review applied the repo's read-beyond-diff and Control UI ownership guidance. (AGENTS.md:1, 09f9a85145c0)
  • Current main scrollable placement: Current main includes { label: "settings", routes: ["config"] } in SIDEBAR_SECTIONS, so Settings is part of the scrollable section list. (ui/src/app-navigation.ts:17, 09f9a85145c0)
  • Current main render boundary: AppSidebar.render() maps SIDEBAR_SECTIONS inside .sidebar-nav, then renders the footer after that nav block. (ui/src/components/app-sidebar.ts:725, 09f9a85145c0)
  • Scroll and footer CSS: .sidebar-nav is the vertical scroll container, while .sidebar-shell__footer is flex-shrink: 0 and separate from the scrolling body. (ui/src/styles/layout.css:519, 09f9a85145c0)
  • PR head footer placement: At PR head, renderRoute("config") is inserted before Docs inside the fixed footer utility group. (ui/src/components/app-sidebar.ts:762, 7e32d8495e76)
  • PR head section model: At PR head, SIDEBAR_SECTIONS is reduced to chat/control/agent while SETTINGS_NAVIGATION_ROUTES and isSettingsNavigationRoute remain available for settings active-state behavior. (ui/src/app-navigation.ts:17, 7e32d8495e76)

Likely related people:

  • steipete: Peter Steinberger authored recent merged Control UI sidebar/tab work touching app-sidebar.ts, app-navigation.ts, and api/gateway.ts, and also owns the overlapping broader sidebar redesign discussion. (role: recent area contributor and likely follow-up owner; confidence: high; commits: c730d8f1f1bb, 89ef6632dea0; files: ui/src/components/app-sidebar.ts, ui/src/app-navigation.ts, ui/src/api/gateway.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (1 earlier review cycle)
  • reviewed 2026-07-05T19:41:28.775Z sha 7e32d84 :: needs real behavior proof before merge. :: none

@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. labels Jul 5, 2026
@steipete

steipete commented Jul 5, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #100296, which landed on main (51771c3) while this PR was in flight.

The sidebar restructure in #100296 includes exactly this fix: the scrollable "SETTINGS" nav group is gone and the Settings entry is pinned in the fixed sidebar footer.

Proof on current main:

  • ui/src/components/app-sidebar.ts renders renderRoute("config") inside sidebar-shell__footer (line 880), above the Docs link and connection status — the same placement this PR proposed.
  • ui/src/app-navigation.ts documents the contract: "Chat is reachable through the session list and Settings/Docs live in the sidebar footer, so neither is listed here" — SIDEBAR_SECTIONS and the settings group no longer exist.
  • The isRouteInSidebarSection helper this PR deleted is also gone on main.

Closing since main already has same-or-better behavior. The before/after screenshots in the PR body still illustrate the user-facing change.

@steipete steipete closed this Jul 5, 2026
@steipete
steipete deleted the claude/adoring-leakey-8d6771 branch July 5, 2026 22:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: web-ui App: web-ui maintainer Maintainer-authored PR P3 Low-priority cleanup, docs, polish, ergonomics, or speculative work. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: XS status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant