Skip to content

Redesign the app bar with a fixed three-column layout and grouped controls - #333

Merged
dovvnloading merged 2 commits into
mainfrom
feat/appbar-redesign
Aug 16, 2026
Merged

Redesign the app bar with a fixed three-column layout and grouped controls#333
dovvnloading merged 2 commits into
mainfrom
feat/appbar-redesign

Conversation

@dovvnloading

Copy link
Copy Markdown
Owner

Problem

The top bar was carried over from the Qt port as a single unbroken flex row of buttons with no visual grouping. The connection-status badge stayed anchored to the window edge only by consuming whatever space was left over from a sibling flex item; at narrow widths, or once enough buttons were present, it ended up pressed against the last toolbar button instead of the window edge. Below a threshold width the toolbar had no shrink or overflow behavior at all, causing horizontal scroll across the entire document.

Change

  • Layout. The header is now a three-column CSS grid - brand, toolbar, connection status - so each region occupies a declared track and cannot encroach on the others.
  • Grouping. Toolbar actions are organized into labeled clusters (Session, History, Viewport, Arrange, Panels, Workspace Tools, Settings), each with consistent internal spacing and a shared surface, replacing the undifferentiated run of buttons.
  • Icons vs. labels. Frequent, app-specific actions (Library, Save, Organize, View, Plugins) keep text labels. Universally recognizable actions (undo/redo, the four zoom controls, the workspace-tools cluster) become icon buttons, each carrying its full wording as both tooltip and accessible name.
  • Overflow behavior. The existing container-query overflow mechanism now collapses whole groups instead of individual buttons, so a cluster of related actions is never left as a partial fragment at in-between widths. Global Search, which previously had no overflow-menu counterpart, now has one - it would otherwise have become unreachable once its tier collapsed.
  • Connection status. The indicator now only renders when the connection is degraded. A permanently visible "connected" badge reports the expected state on every frame with no informational value; the reconnecting state carries real information (intents are queued or refused while it shows), so that state alone is surfaced.

Test plan

  • Full frontend check passes: schema, types, lint (0 errors), 1930/1930 tests, production build, bundle size
  • Geometry verified across six viewport widths (560px-1600px): zero region overlap, constant 47px row height, uniform 26px control height, no document horizontal overflow at any width
  • Two icon glyphs (Settings, Knowledge) were redrawn after an initial render proved ambiguous at 15px

dovvnloading and others added 2 commits August 16, 2026 09:28
…trols

The top bar was a single unbroken flex row of buttons carried over from
the Qt port, with no visual grouping and a connection badge that only
stayed anchored to the window edge by consuming whatever space was left
over from a sibling flex item. At narrow widths, or once enough buttons
were present, the badge would end up pressed against the last toolbar
button instead of the window edge.

The header is now a three-column grid - brand, toolbar, connection
status - so each region has a declared track and cannot encroach on the
others. Toolbar actions are organized into labeled groups (Session,
History, Viewport, Arrange, Panels, Workspace Tools, Settings) with
consistent internal spacing and a shared surface per group, replacing the
undifferentiated run of buttons. Frequent, app-specific actions keep text
labels; universally recognizable actions (undo/redo, zoom controls, the
workspace-tools cluster) become icon buttons with the same wording
carried in their tooltip and accessible name.

The existing overflow-menu mechanism (container queries collapsing by
width tier) now collapses whole groups instead of individual buttons, so
a cluster of related actions is never left as a partial fragment at
in-between widths. The Global Search action, which previously had no
overflow-menu counterpart, now has one - it would otherwise have become
unreachable once its tier collapsed.

The connection-status indicator only renders when the connection is
degraded. A permanently visible "connected" badge reports the expected
state on every frame and adds visual noise without carrying information;
the reconnecting state does carry real information (intents are queued
or refused while it shows), so that state alone is surfaced.

Geometry was verified across six viewport widths (560px-1600px): zero
region overlap, a constant 47px row height, uniform 26px control height,
and no document horizontal overflow at any width. Two icon glyphs
(Settings, Knowledge) were redrawn after an initial render was
ambiguous at 15px.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The E2E suite's shared boot helper, and boot.spec.ts directly, both
waited on the connection badge (.app-conn-open) becoming visible as
their signal that the real WebSocket handshake had completed before
touching anything. The app bar redesign made that badge exception-only
(App.tsx renders nothing there for a healthy connection by design), so
the element the suite was waiting on no longer exists on the success
path, and every spec that goes through gotoApp failed identically in
CI.

The app shell now carries the same underlying connection status as a
data-connection-status attribute, independent of whatever the topbar
chooses to display for it. The boot helper and boot.spec.ts wait on
that attribute instead of the badge's visibility.

Verified against the real backend: all 5 specs that failed in CI pass
locally, along with the full frontend check (1930 tests, 0 lint
errors, build, bundle size).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@dovvnloading
dovvnloading merged commit 429ad57 into main Aug 16, 2026
4 checks passed
@dovvnloading
dovvnloading deleted the feat/appbar-redesign branch August 16, 2026 14:00
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.

1 participant