Skip to content

feat(ui): move app chrome into a topbar and dock the session workspace rail#103426

Merged
steipete merged 4 commits into
mainfrom
claude/sidebar-redesign-layout-d076f8
Jul 10, 2026
Merged

feat(ui): move app chrome into a topbar and dock the session workspace rail#103426
steipete merged 4 commits into
mainfrom
claude/sidebar-redesign-layout-d076f8

Conversation

@steipete

Copy link
Copy Markdown
Contributor

What Problem This Solves

The desktop Control UI spent a ~258px column on chrome: brand row, pinned nav, a "More" tree, New session, the session list, and a footer icon row. The chrome cost is worst in chat split view, which is exactly where horizontal space matters. Two adjacent defects in the same surface: the collapsed session-workspace strip rendered a document glyph styled like a button that did nothing (a bare span, aria-hidden, no handler), and the workspace rail was hard-fixed to the pane's right edge even though the terminal panel already demonstrates right/bottom docking.

Fixes #103420.

Why This Change Was Made

Requested by the maintainer: move the sidebar's buttons into a top bar, make the layout calmer, fix the dead second button in the pane strip, and make the per-session panel dockable/draggable inside its session pane ("the sidebar is attached to the selection", like the terminal's right/bottom dock).

Design decisions:

  • Topbar owns app chrome. Brand (with the connection dot riding on the logo), Chat + pinned route pills, a More menu (unpinned routes, plugin tabs, Docs, pin editor), the command-palette search pill, pairing, theme toggle, and Settings. The left column becomes a sessions-only panel; Cmd+B now hides it completely and the 78px icon rail is deleted (navigation no longer needs a rail fallback).
  • Split view drops its fixed toolbar. The old toolbar mirrored the split flex geometry above the panes with scrollLeft syncing. Each pane now renders an in-flow header (static title + split/close actions), which deletes the geometry mirroring, the scroll sync, and three viewport-specific CSS inset hacks.
  • Session workspace rail docks right or bottom. Drag the rail header onto the pane's right/bottom band (drop zones highlight, mirroring the terminal panel) or use the dock toggle button. The preference persists browser-locally (chatWorkspaceDock, only written when non-default). The collapsed strip's file glyph is now a real "Show session files" button with a changed-file count badge.
  • Mac app compatibility. The native drag-region geometry (78-254px brand strip) is unchanged; the web topbar keeps that strip passive/non-interactive on openclaw-native-macos so shipped Mac apps keep working against a new gateway UI. The injected chrome CSS drops its two desktop padding rules (now web-owned); the settings-sidebar header class rename and the panel's non-sidebar-shell container keep stale injected padding from double-applying during app/gateway version drift, and the narrow-width drawer gets web-owned titlebar clearance.

User Impact

  • Full-width content on every page with a slim 48px topbar; the session panel reads as content, not chrome, and can be hidden entirely (Cmd+B).
  • Split view panes get honest per-pane title bars; the topbar stays put instead of appearing only in split view.
  • The session workspace rail can live on the right or the bottom of its pane, per user preference, moved by drag or button; the dead collapsed-strip icon now works and shows the changed-file count.
  • Narrow viewports keep the existing drawer flow (drawer holds brand + nav + sessions + utility footer).
  • Docs: https://docs.openclaw.ai/web/control-ui

Screenshots (mock gateway, deterministic):

Overview Chat split More menu
overview split more
Panel hidden Rail right dock Rail bottom dock
collapsed rail bottom
Settings takeover Drawer (900px) Dark split
settings drawer dark

Evidence

  • Remote (Blacksmith Testbox): full pnpm check:changed green, exit 0 (lint/type/guard lanes + 5 Vitest shards), actions run 29070305914.
  • Remote focused units: pnpm test over chat-page, chat-view, chat-session-workspace, app-sidebar, settings.node, app-navigation, app-host — 241 passed. chat-realtime.test.ts fails on the box even when run alone with an untouched import graph (localStorage.clear is not a function in its own beforeEach); documented pre-existing environment quirk, green on CI Linux.
  • Local e2e (Playwright Chromium, mock gateway): chat-flow.e2e.test.ts 37/37, sidebar-customization.e2e.test.ts 2/2, mobile-pairing.e2e.test.ts 1/1 — all three rewritten/touched by this PR.
  • pnpm ui:i18n:sync + pnpm ui:i18n:check clean (keyless raw-copy fallbacks, matching CI).
  • Visual proof: ten deterministic mock-gateway screenshots above (light + dark, desktop + drawer + both docks).
  • swiftformat (repo config): changed Swift regions clean; two pre-existing wrap findings elsewhere in DashboardWindowSmokeTests.swift are local-version drift, untouched.
  • Autoreview (Codex gpt-5.5, thinking high): feature commit reviewed with one accepted P2 (native macOS drawer lost its titlebar clearance at narrow widths), fixed in the follow-up commit; the fix commit re-reviewed clean ("no accepted/actionable findings").

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation app: macos App: macos app: web-ui App: web-ui size: XL maintainer Maintainer-authored PR labels Jul 10, 2026
steipete added 3 commits July 9, 2026 22:49
…e rail

The desktop shell now uses a slim topbar for brand, primary navigation
(Chat + pinned routes + More menu), command-palette search, pairing,
theme, and Settings; the left column slims down to a sessions-only
panel (Cmd+B hides it entirely — the 78px icon rail is gone). Split
view drops the fixed geometry-mirroring toolbar for in-flow per-pane
headers. The session workspace rail can dock right or bottom inside
its pane — drag its header between edges or use the dock button — and
the collapsed strip's file glyph is now a real button (it used to be a
dead, button-looking span) with a changed-file count badge. The Mac
app's injected chrome CSS slims down accordingly; its drag-region
geometry is unchanged and the topbar brand strip stays passive under
it.
The narrow-width slide-over drawer sits fixed at the window top, over
the AppKit traffic lights and drag regions. The old Mac-app-injected
CSS padded .sidebar-shell for this; that rule moved web-side for the
desktop topbar, so restore drawer clearance here for both the app
drawer and the in-drawer settings sidebar.
@steipete
steipete force-pushed the claude/sidebar-redesign-layout-d076f8 branch from c7d69d9 to 5e9ac43 Compare July 10, 2026 05:50
@steipete
steipete merged commit 4a72a6c into main Jul 10, 2026
74 checks passed
@steipete
steipete deleted the claude/sidebar-redesign-layout-d076f8 branch July 10, 2026 06:33
@steipete

Copy link
Copy Markdown
Contributor Author

Merged via squash.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 10, 2026
…e rail (openclaw#103426)

* feat(ui): move app chrome into a topbar and dock the session workspace rail

The desktop shell now uses a slim topbar for brand, primary navigation
(Chat + pinned routes + More menu), command-palette search, pairing,
theme, and Settings; the left column slims down to a sessions-only
panel (Cmd+B hides it entirely — the 78px icon rail is gone). Split
view drops the fixed geometry-mirroring toolbar for in-flow per-pane
headers. The session workspace rail can dock right or bottom inside
its pane — drag its header between edges or use the dock button — and
the collapsed strip's file glyph is now a real button (it used to be a
dead, button-looking span) with a changed-file count badge. The Mac
app's injected chrome CSS slims down accordingly; its drag-region
geometry is unchanged and the topbar brand strip stays passive under
it.

* chore(ui): regenerate locale bundles for topbar and workspace dock strings

* fix(ui): keep the native macOS drawer clear of the titlebar overlay

The narrow-width slide-over drawer sits fixed at the window top, over
the AppKit traffic lights and drag regions. The old Mac-app-injected
CSS padded .sidebar-shell for this; that rule moved web-side for the
desktop topbar, so restore drawer clearance here for both the app
drawer and the in-drawer settings sidebar.

* chore(ui): translate topbar and workspace dock strings; regen docs map
steipete added a commit that referenced this pull request Jul 10, 2026
…mpact native narrow header (#103561)

* feat(ui): restore sidebar chrome and remove the pane workspace strip

Reverse course from #103426 on the app chrome: the left sidebar owns
brand, pinned navigation + More, New session, sessions, and the footer
(status dot, Settings, Docs, pairing, theme) again, and the desktop
topbar is gone. What stays from that PR: the dockable workspace rail
(right/bottom, drag or button), the in-flow split-pane headers, and
Cmd+B now hides the sidebar entirely (no 78px icon rail) with a
floating expand control.

The real target of the original request: the vertical icon strip at
each pane's right edge is deleted. A collapsed workspace rail renders
nothing; the toggle (with a changed-file badge) lives in the split-pane
header next to split/close, or floats at the top-right in single-pane
chat. Shift+Cmd+B still toggles.

Narrow native macOS windows (e.g. the in-app link browser splitting
the window) previously stacked 50px of injected titlebar padding on
top of the 58px drawer row; the web CSS now folds that into one
compact 58px row beside the traffic lights, with selectors that
outrank the rules shipped Mac apps inject.

* chore(ui): regenerate locale bundles and docs map for sidebar restore

* fix(ui): bind showPaneHeader explicitly on the classic single pane

* chore(ui): reconcile locale metadata after rebase onto lobster wild cards
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 11, 2026
…mpact native narrow header (openclaw#103561)

* feat(ui): restore sidebar chrome and remove the pane workspace strip

Reverse course from openclaw#103426 on the app chrome: the left sidebar owns
brand, pinned navigation + More, New session, sessions, and the footer
(status dot, Settings, Docs, pairing, theme) again, and the desktop
topbar is gone. What stays from that PR: the dockable workspace rail
(right/bottom, drag or button), the in-flow split-pane headers, and
Cmd+B now hides the sidebar entirely (no 78px icon rail) with a
floating expand control.

The real target of the original request: the vertical icon strip at
each pane's right edge is deleted. A collapsed workspace rail renders
nothing; the toggle (with a changed-file badge) lives in the split-pane
header next to split/close, or floats at the top-right in single-pane
chat. Shift+Cmd+B still toggles.

Narrow native macOS windows (e.g. the in-app link browser splitting
the window) previously stacked 50px of injected titlebar padding on
top of the 58px drawer row; the web CSS now folds that into one
compact 58px row beside the traffic lights, with selectors that
outrank the rules shipped Mac apps inject.

* chore(ui): regenerate locale bundles and docs map for sidebar restore

* fix(ui): bind showPaneHeader explicitly on the classic single pane

* chore(ui): reconcile locale metadata after rebase onto lobster wild cards
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: macos App: macos app: web-ui App: web-ui docs Improvements or additions to documentation maintainer Maintainer-authored PR size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Control UI: replace the thick sidebar with topbar chrome; make the session workspace rail dockable

1 participant