Skip to content

feat(console): warm-quiet shell: sidebar surface, nav marker, account row, phone top bar - #2974

Merged
freeqaz merged 9 commits into
mainfrom
ux-p2
Oct 20, 2026
Merged

freeqaz merged 9 commits into
mainfrom
ux-p2

Conversation

@freeqaz

@freeqaz freeqaz commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

The console shell does not read as premium: the sidebar is the page colour, so chrome and content blur together; the current nav item is an accent-tinted pill with accent text (one of 7 accent elements on the Agents page); the brand is "OCE" in accent caps; the account control is a product-name button that never says who is signed in; and at phone width an "Open navigation" text button sits above the page header, pushing the Agents header to 245 px. The focus ring is 3 px accent, so a focused empty required field reads as a validation error.

UX spec docs/analysis/ux-design-1019/spec.md row P2 (section 3.1, S1a, "warm quiet" direction V1), plus the shell-wide focus ring token (spec 6.1 Q1, provisional owner answer: 2 px navy).

Change

  • Sidebar: --color-surface-2 background with the 1 px --color-border right edge. Wordmark = 20 px mascot + "OpenClaw Enterprise" in --color-text-strong, --text-base semibold, normal case (the shared .brand rule, so the sign-in brand is ink and not caps too; its 40 px mascot and alignment are left to P11, which owns the sign-in page).
  • Nav: 36 px items, --radius-md, 12 px gap, 16 px icon; the current item is a white pill, --color-text-strong semibold, with box-shadow: inset 3px 0 0 var(--color-accent) (square on the bar side; forced-colors gets a Highlight border). Hover --color-surface-hover.
  • Account row: 32 px initials avatar (from session.user.name, email as fallback) + name (--text-base medium) + email (--text-sm muted), both ellipsised, + chevron, on a white bordered --radius-md card. Its accessible name is the name and email. The menu keeps Settings; "Logout" becomes "Sign out".
  • Phone (<= 760 px): a 56 px top bar on --color-surface with a hairline: icon "Open navigation" toggle (44 px, same accessible name), the wordmark, and a 44 px avatar button (Account: <name>) that opens its own account menu under it, without the drawer. Opening the drawer closes that menu. The drawer is the same sidebar; its close button is now a 44 px icon (same "Close navigation" name), because the wordmark ran under the old text button. Drawer links keep a 44 px target. Content gutters 16 px.
  • Focus ring: new --color-focus (= --color-info, navy) and --focus-ring: 2px solid var(--color-focus); offsets unchanged.
  • Changing between desktop and phone layouts closes the account menu that the change hides. In forced colours the current-page bar is a Highlight border inside the same padding, so the text does not move.
  • Storybook: new "Mobile account menu" story; the Mobile drawer and Sign-out stories follow the new controls. Docs: the account menu offers Settings and Sign out; the build-identification note, the navigation table and the debug-fields table name the wordmark instead of OCE.

Verification

Acceptance (spec section 5, P2), measured with the spec's shots.mjs and a probe on the Storybook frames:

Check main this PR
Sidebar background #faf9f7 rgb(244, 241, 236) = #f4f1ec
Current nav item accent tint + accent text white, rgb(189, 69, 49) 3px 0px 0px 0px inset, 36 px (44 in the drawer)
Account row "OpenClaw Enterprise ⌃" "DO · Demo Operator · operator@example.com ⌃"
Agents header bottom at 390 245 px 236 px (<= 240)
Top bar at 390 none (text button row) 56 px
Accent elements, Agents 1440 7 3 (1 once merged with #2972)
Accent elements, failed Agent page 1440 (P1 target <= 3) 9 (7 after #2972) 3
Focus ring 3 px accent 2 px rgb(30, 58, 95)

Tests:

  • New tests/browser/console-shell.test.mjs (mapped to checks-browser): desktop sidebar surface, wordmark, current-nav bar, account row and Sign out; focus ring colour and width; phone top bar height, 44 px targets, avatar menu without the drawer, Escape focus return, drawer surface and 44 px links, Settings from the avatar. A fourth checks that a layout change closes the account menu it hides. All four fail on main and pass here (the fourth also fails without this PR's resize fix); 20/20 at 2 CPUs (four tests a run). The three edited console.test.mjs tests and the edited agent-logs download test are also 20/20 at 2 CPUs.
  • Touched files green in full: console.test.mjs (48), console-refocus-focus (6), console-drafts-kept (18), console-focus-ring (4), console-retained-revalidation (65), console-agent-presets (32), console-agent-logs (49; one member-named lookup made exact). Updated selectors only where the shell changed: the account toggle by class (it now carries the person's name), menuitem "Sign out", the sidebar wordmark text, and three Settings email checks scoped to #main (the account row shows the email too).
  • The other 32 browser files in one local sweep: 582/583; the one failure is docs-compute-matrix (github-slugger is not installed in this local worktree), unrelated.
  • After merging main at 92ee883 (one conflict: the debug-fields.md row, main's wording kept with "Hash beside wordmark"): console-shell 20/20 again at 2 CPUs (four tests a run), and in full console.test.mjs (48), console-agent-logs (49), console-agent-presets (32), console-retained-revalidation (65), console-refocus-focus (6), console-focus-ring (4), console-drafts-kept (18), plus main's new console-button-hierarchy (10), console-form-fields (13), console-form-fields-2 (12) and console-namespace-create (7): all green.
  • node scripts/ci/run-tests.mjs audit clean; prettier and eslint clean on touched files. The keycloak integration test only had its menu clicks renamed (not run locally: needs the Keycloak lane).

Internal design review (screenshots against the spec and mockups): match with nits; the two code nits (menu left open across a layout change, forced-colours text shift) are fixed here, and the sign-in brand size is P11's.

Open PRs (3-way merge-tree, conflict hunks against main vs against this head): #2972 0/0, #2596 4/4, #2524 6/6, #2445 9/9 (the suite entry sits mid-list to avoid its append), #1619 18/18, #2922, #2833, #2518, #2258, #2255, #2253 0/0, #2505 2/2, #2502 6/6, #2958 2/1, #1605 7/6, #2268 18/18. One new hunk: #906 rewrites the same agent-details.md paragraph ("Logout" menu); unavoidable without leaving that guide stale.

Screenshots

Before / after / mockup, Agents at 1440 (Storybook "Pages/Agents · Populated"):

main this PR mockup (shell V1)
before-agents-1440 after-agents-1440 mockup-shell-v1-1440

Agents at 390 (first screen) and the top-bar reference from the spec's phone mockup:

main this PR mockup (top bar)
before-agents-390 after-agents-390 mockup-topbar-390

Account menu at 1440 and from the phone avatar, the drawer at 390, and the navy focus ring on the Create Namespace field:

after-account-menu-1440 after-account-menu-390
after-drawer-390 after-focus-ring-1440

Recordings (final revision): desktop account menu, keyboard and Escape focus return · phone avatar menu, drawer open, Escape and close button with focus return.

Stories: Components/Navigation · Account menu, Mobile account menu (new), Mobile drawer; Pages/Agents · Populated; Pages/Namespaces · create dialog. Mockup render liberties per spec section 2 (sample data, icon set, mascot drawing, larger wordmark) are not reproduced; sizes follow the spec (20 px mascot, --text-base wordmark).

Risks

Visual only plus two copy changes ("Logout" to "Sign out", "OCE" to "OpenClaw Enterprise"); any external script that clicked "Logout" or the "OpenClaw Enterprise" button by name needs the new names. The phone top bar has a second copy of the account menu (separate id), retained across a load's two renders like the sidebar one; focus restoration maps its items to its avatar. P3 (header and compact Namespace control) and P11 (sign-in) touch neighbouring rules and will merge on top.

… row, phone top bar

Sidebar on surface-2 with a hairline; the current nav item is a white pill
with a 3 px accent inset bar; the wordmark reads OpenClaw Enterprise in ink.
The account row shows initials, name and email, and its menu says Sign out.
At phone width a 56 px top bar holds the navigation toggle, the wordmark and
an avatar that opens the account menu without the drawer. The focus ring is
2 px in the new --color-focus (navy) token.
…t follow the new shell

The wordmark now runs under a text Close navigation button, so the drawer's
close is a 44 px icon button with the same accessible name. The Mobile drawer
story clicks the toggle by class, and the Settings email checks look inside
main, since the account row also shows the email.
Prettier on the touched files; the test reads computed style through
globalThis. The suite entry sits after console-namespace-create, so it does not
collide with open PRs that append to the end of checks-browser.
The account row's accessible name carries the signed-in person's name and
email; this test's member is named late-download, so a substring match on
Download found the account row too.
@freeqaz
freeqaz requested a review from a team as a code owner October 19, 2026 21:54
@clawsweeper

clawsweeper Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@clawsweeper clawsweeper Bot added clawsweeper:intake:feature Preliminary submission classification; full source review pending. P3 Low-risk cleanup, docs, polish, ergonomics, or speculative feature. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed clawsweeper:intake:feature Preliminary submission classification; full source review pending. labels Oct 19, 2026
@clawsweeper

clawsweeper Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge.

What this changes

This PR refreshes console navigation, displays account identity, adds a phone account menu, and changes keyboard focus styling.

Example: Demo Operator opens Agents at a 390 px viewport.

  • Before: A text navigation button appears above the page, and account actions require opening the drawer.
  • After: A 56 px top bar provides navigation and an account avatar that opens Settings and Sign out.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) The scoped implementation and browser coverage are sound; the repository's native UI attachment gate remains unmet.
Proof confidence 🦐 gold shrimp (3/6) Real behavior proof is not required for maintainer- or bot-authored pull requests.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Feature · Worth it: Yes · Fix scope: Complete
User problem: The shell obscures account identity, provides weak separation between navigation and content, and makes phone account actions harder to reach.
Reason: The collaborator-authored direction is authorized, and the change improves account recognition and phone navigation within the existing console architecture.

Merge readiness

✅ Ready for maintainer review

Keep this maintainer-authored PR open: the console refresh has clear scope, and review found no actionable code defect.

Priority: P3
Reviewed head: 36a2ae248c624a1aad03c8c3252ef97d3c35e9b8

Before merge

None.

Findings

None.

Tests

  • Missing end-to-end proof: The remaining UI evidence requirement is native GitHub screenshot and interaction-video attachments showing the final desktop and phone controls.
Agent review details

How this fits together

The controller serves the console shell, which turns session identity, route, and Namespace state into navigation and account controls using the existing navigation and sign-out handlers.

flowchart TB
  A[Session and route state] --> B[Console shell]
  C[Shared stylesheet] --> B
  B --> D[Desktop sidebar]
  B --> E[Phone top bar and drawer]
  D --> F[Navigation and account actions]
  E --> F
Loading

Technical review

Best possible solution:

Keep the refresh within the existing shell and shared stylesheet while preserving menu retention, navigation guards, and server authorization.

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

This is a presentation improvement rather than a reported runtime bug; source and inspected desktop captures establish the existing and proposed shell differences.

Is this the best way to solve the issue?

The implementation uses the existing shell owner and shared tokens, extracts shared account-menu behavior, and preserves the earlier retention and responsive-navigation repairs.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against a920060d1bd9.

Provenance checked

Testing

Proof path: in-process harness.

Security

None.

Evidence

What I checked:

  • Reviewed introduced change: The pinned diff changes shell presentation and account controls without changing API authorization, persistence, credentials, or deployment behavior. (apps/controller/src/console/shell.mjs:207, 36a2ae248c62)
  • Existing menu behavior preserved: The retained-menu repair in fix(console): keep an open account menu across a page load's second render #2299 keeps an opened menu stable across loading renders; this PR retains that lifetime and focus restoration for both account controls. (apps/controller/src/console/shell.mjs:208, 3c0af48f98d6)
  • Native UI attachments remain required: Root policy requires screenshots and a short video as native GitHub attachments before merging UI changes; Verification still links Gist-hosted media, so the previous review's upload request remains applicable. (AGENTS.md:460, 36a2ae248c62)
  • Meaningful browser coverage: Four new browser cases cover desktop account behavior, focus styling, phone controls, and menu closure during layout changes through the real Fastify console with in-memory fixtures; existing menu-retention coverage remains. (tests/browser/console-shell.test.mjs:44, 36a2ae248c62)
  • Current checks: Both Console Browser checks succeeded for the reviewed head; other checks remain queued or running, with no observed diff-caused failure. (36a2ae248c62)
  • Media inspection boundary: Inspected all four prepared images, including the desktop before/after comparison. The manifest contains no videos or contact sheets; further raw-media access was proxy-blocked, and saving additional artifacts failed because the scratch filesystem is read-only. (/home/runner/work/clawsweeper/clawsweeper/artifacts/event/codex/proof-scratch/2974/media-proof-manifest.json)

Likely related people:

  • Free Wortley: Raw commit f47e1b1 adds apps/controller/src/console/shell.mjs:74 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: f47e1b1935d1; files: apps/controller/src/console/shell.mjs)
  • kevinlin-openai: Raw commit 835b1cc adds apps/controller/src/console/shell.mjs:65 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 835b1cc9b775; files: apps/controller/src/console/shell.mjs)
  • Steven Lee: Raw commit 05e2093 adds apps/controller/src/console/shell.mjs:76 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 05e209393cdf; files: apps/controller/src/console/shell.mjs)

Labels

Label changes:

No label changes.

Label justifications:

  • P3: This is a scoped presentation and navigation ergonomics improvement without an established urgent runtime failure.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Upload the existing final-revision screenshots and interaction videos as native GitHub attachments in Verification.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

History

Review history (2 earlier review cycles)
  • reviewed 2026-10-19T22:10:06.611Z sha a0fe94c :: needs changes before merge. :: [P3] Update the remaining references to the old sidebar mark
  • reviewed 2026-10-19T22:47:44.929Z sha 768644e :: needs maintainer review before merge. :: none

Reviewed October 19, 2026, 9:13 PM ET / October 20, 2026, 01:13 UTC (Revision 3).

…forced-colours text still

Review nits: a menu left open in the sidebar stayed open when the layout
switched to phone and reappeared in the drawer, so any layout change now
closes both account menus. In forced colours the current-page bar is a border,
so its padding gives the 3 px back and the text does not shift.
The sidebar mark is now the wordmark, so the build-identification note, the
navigation table and the debug-fields table follow it (review item).
@freeqaz

freeqaz commented Oct 19, 2026

Copy link
Copy Markdown
Collaborator Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added clawsweeper:intake:feature Preliminary submission classification; full source review pending. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. clawsweeper:intake:feature Preliminary submission classification; full source review pending. labels Oct 19, 2026
# Conflicts:
#	docs/reference/console/debug-fields.md
@freeqaz

freeqaz commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added the clawsweeper:intake:feature Preliminary submission classification; full source review pending. label Oct 20, 2026
@clawsweeper clawsweeper Bot removed the clawsweeper:intake:feature Preliminary submission classification; full source review pending. label Oct 20, 2026
@freeqaz
freeqaz merged commit 698112e into main Oct 20, 2026
55 of 56 checks passed
@freeqaz
freeqaz deleted the ux-p2 branch October 20, 2026 01:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P3 Low-risk cleanup, docs, polish, ergonomics, or speculative feature. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. 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