fix: rail-shell polish — containment, presence de-clutter, Iconoir icons - #48
Merged
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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)
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 withmin-width: 0+ anoverflow: hiddenbackstop.ResizeObserverre-measures on the hidden→visible flip..dropdown-panelcounts as inside, so selecting an option lands.Presence / status de-clutter
id+ one presence pill that reads "Agent working" / "Agent idle".needs-replychip lost its stray rounded border, and the presence chip got real padding with an un-uppercased elapsed so "3m" no longer reads as "3M".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 typecheckclean; 517 tests green (board log-gating moved to the context-menu path; composer/log/header assertions updated). Eyeballed throughout via the demo web preview.