Skip to content

fix: rail-shell polish — containment, presence de-clutter, Iconoir icons - #48

Merged
udaychandra merged 7 commits into
mainfrom
fix/mast-ui-polish-2
Aug 19, 2026
Merged

fix: rail-shell polish — containment, presence de-clutter, Iconoir icons#48
udaychandra merged 7 commits into
mainfrom
fix/mast-ui-polish-2

Conversation

@udaychandra

Copy link
Copy Markdown
Contributor

A second UI/UX polish pass on the section-rail shell, from field testing — fixing regressions the rail exposed, de-cluttering the presence/status language, and adopting a real icon set.

Layout regressions (all traced to the rail landing)

  • Content column overflowed the window. The flex-row shell's content column had no min-width: 0, so a wide view (board lanes, terminal, file workbench) pushed the whole window sideways instead of scrolling inside itself. That single defect was the terminal's horizontal scroll, the unreachable DONE lane, the off-screen board minimap, and the clipped project/snapshot controls. Fixed with min-width: 0 + an overflow: hidden backstop.
  • Board minimap only appeared after scrolling. The board mounts while hidden (views stay mounted and toggle visibility), so the canvas had zero size and the minimap viewport never computed. A ResizeObserver re-measures on the hidden→visible flip.
  • Column-header borders stair-stepped (list 64 / room header grew past 64 / drawer 52). Unified to a 64px header; the room header is a compact two rows (title, then one meta line).
  • Account menu and board filter/Select broke — both from the earlier DropdownPanel→portal move. The account menu, now at the rail's bottom-left, opens straight up. Filter/Select popovers no longer dismiss on click: a click inside any portaled .dropdown-panel counts as inside, so selecting an option lands.

Presence / status de-clutter

  • Killed the "LIVE" obsession: the board card's LIVE pill and the agent-log panel's redundant header LIVE dot are gone.
  • The detail header drops the spec-status pill (meaningless next to presence) and the duplicated guidance; meta is id + one presence pill that reads "Agent working" / "Agent idle".
  • Dots are box-shaped (square) and containers squared — the needs-reply chip lost its stray rounded border, and the presence chip got real padding with an un-uppercased elapsed so "3m" no longer reads as "3M".
  • Agent-log panel loses its status row: the run meta (elapsed · branch) moves onto the controls row, right-aligned opposite the build/review toggle + Raw. Failed/Stranded still surface there.
  • Rail hover labels use the Tooltip component; Actions-menu items drop the trailing "…"; the composer hint reads "shift + enter for new line"; the Actions button has real label↔caret spacing.

Icons → Iconoir

Replaced the hand-drawn glyphs with Iconoir (iconoir.com, MIT), vendored as inline SVG — no runtime dependency. 24×24 grid, round caps/joins, stroke 1.75 to hold weight at 13–20px. Rail: multi-bubble / kanban-board / terminal. The Mast Σ mark and the Spinner stay ours; the Σ sits higher now (dropped a dead 30px traffic-lights pad — the window uses a native title bar).

Verification

bun run typecheck clean; 517 tests green (board log-gating moved to the context-menu path; composer/log/header assertions updated). Eyeballed throughout via the demo web preview.

Regressions and polish uncovered after the rail landed:

- The content column had no min-width:0, so in the flex-row shell a wide
  view (board lanes, terminal, file workbench) pushed the whole window
  sideways instead of scrolling inside its own container. That was the
  terminal's horizontal scroll, the unreachable DONE lane, the board
  minimap parked off-screen (it's pinned right:20px of an over-wide
  wrap), and the clipped "All projects"/"Snapshots" controls — one
  missing rule. Add min-width:0 and an overflow:hidden backstop on the
  shell.

- The rail's hover labels used native title tooltips; use the Tooltip
  component (right-placed) to match the rest of the app.

- The three column headers ended at different heights (list 64, room
  header grew past 64 with its 3 stacked rows, drawer 52), so their
  bottom borders stair-stepped. Unify to a 64px header and compact the
  room header to two rows — title, then one meta line (id · status ·
  presence). Drops the duplicated draft note (the header guidance
  already carries it).
At 13px the file-tree folder glyph had a 1.5px tab that all but
vanished, leaving a plain rectangle. Redraw it with a clear 2.5px
top-left tab and a full-height left edge.
…gressions

Design pass from field feedback — fewer boxes, no "live" obsession,
pixel-tighter:

- Dots are round again (I over-squared them): badge dot and presence
  dot. Chips/pills stay squared. The needs-reply chip loses its rounded
  pill border — it was the one that slipped through.
- Presence chip gets real padding (was 1px, squished) and a separate,
  un-uppercased elapsed span so "3m" no longer reads as "3M/months".
- Kill the LIVE obsession: the board card's LIVE pill is gone (logs
  still open from the card's context menu and the detail view); the
  agent-log panel drops its redundant header "LIVE" dot (the RUNNING
  status already says it).
- The detail header stops showing spec status (meaningless next to
  presence) and the separate guidance line. Meta is now id + one
  presence pill; in the header that pill spells it out ("An agent is on
  it") via a new verbose mode.
- Actions button: real gap between label and caret.

Functional regressions, both from the earlier DropdownPanel→portal move:
- The account menu moved to the rail's bottom-left but still opened
  down-left (off-screen). Anchor its panel up-and-to-the-right there.
- Filter and Select popovers closed on any click because their
  portaled option lists count as "outside" the trigger. Treat a click
  inside any .dropdown-panel as inside, so selecting an option no longer
  dismisses the menu before the click lands.
Round of corrections from field review:

- Dots are box-shaped (square) everywhere, as intended — reverted the
  round badge/presence dots.
- Account menu opens straight up from the rail's bottom-left trigger
  (was floating off to the side).
- Presence verbose label shortened to "Agent working" / "Agent idle".
- Agent-log panel loses its status row: the RUNNING pill is dropped
  (an open log already implies running) and the run meta (elapsed ·
  branch) moves onto the controls row, right-aligned opposite the
  build/review toggle + Raw. An exceptional status (Failed, Stranded)
  still surfaces there.
- Actions menu items drop the trailing "…" (Dispatch, Re-dispatch,
  Invite).
- Composer hint now reads "shift + enter for new line".
- Board minimap appears on load again: the canvas mounts hidden
  (views stay mounted), so a ResizeObserver re-measures on the
  hidden→visible flip instead of waiting for the first scroll.
Replace the hand-drawn glyphs with Iconoir (iconoir.com, MIT), vendored
as inline SVG — no runtime dependency. Icons move to Iconoir's 24×24
grid with round caps/joins; stroke nudged to 1.75 so they keep presence
at the 13–20px sizes we render. Logo (the Mast mark) and Spinner stay
ours. Rail gets a proper chat bubble / kanban board / terminal prompt;
the file-tree folder and every button glyph come along too.
The macOS window uses a native title bar, so the rail never sits under
the traffic lights — the 30px in-shell clearance was pushing the Sigma
mark down for nothing. Drop it and tighten the base top padding.
@udaychandra
udaychandra merged commit c40ef24 into main Aug 19, 2026
2 checks passed
@udaychandra
udaychandra deleted the fix/mast-ui-polish-2 branch August 19, 2026 06:03
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