Skip to content

feat(tui): full-frame board and proportional overlays (#151) - #154

Merged
aksOps merged 3 commits into
mainfrom
restyle/layout-parity
Aug 20, 2026
Merged

feat(tui): full-frame board and proportional overlays (#151)#154
aksOps merged 3 commits into
mainfrom
restyle/layout-parity

Conversation

@aksOps

@aksOps aksOps commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Closes #151. Part of map #136.

Dogfood findings on the redesign build: the board did not fill the frame and the card-detail popup was far too small. Reference hardware is a 14-inch laptop terminal, ~180-220 columns by 45-60 rows; layout parity with the deleted web UI is the bar.

Board

MaxColumnWidth (52) is replaced by MinColumnWidth (16). Columns split the whole frame evenly with the remainder to the leftmost; if the split ever falls below the floor, every column takes the floor and the row clips at the frame edge. The sub-100-column collapse to a single column is unchanged.

Frame Before After
200x50 4x52 centered, ~50 dead columns [49 49 49 48], spans 199 of 200
120x35 [30 30 29 29] (clamp idle) [29 29 29 28], spans 119 of 120

Overlays

Card detail, editor, settings, ADR split and import all resolve theme.Metrics.OverlayPane. Two regimes, split at the same WideFrame threshold of 100 the board collapses on:

  • frameW < 100frameW - 4 by frameH - 2, the size v1.0.1 shipped. Nothing on a small terminal shrank to buy this.
  • frameW >= 100 — 85% of the frame width, 88% of its height, floored at 24x8 and held two cells clear of the edge the shadow falls on.
Frame Detail pane before After
200x50 72x13 (36% w, 26% h) 170x44 (85% w, 88% h)
120x35 72x13 (60% w, 37% h) 102x31 (85% w, 89% h)
80x24 72x13 76x22

Prose inside a panel is capped at a ContentMax measure of 96 so a 170-column panel does not render one 166-column line. Bands span the full panel width.

Settings previously rendered full-frame with no backdrop; it now composes over the dimmed board as an elevated panel, with its pointer regions offset to match. The pw < 24 || ph < 8 fallback to a full-frame pane is preserved everywhere, so the frozen v1.0.1 dismissal behaviors stay reachable on a terminal too small to center anything in.

The task-action confirm (72) and keyboard help (56) keep their fixed caps: their height is their content, and a proportional panel would frame four rows in a screenful of surface.

Spec

docs/design/tui-design-spec.md sections 2.5 and 4 amended on the design/tui-spec branch (commit 6933686), with the superseded numbers and the reason recorded in place.

Verification

  • go build ./..., go vet ./... clean
  • go test -race ./internal/tui/... — 641 passed
  • sh scripts/check-go-coverage.sh — total 96.9% (gate 96.4%), internal/tui 96.5% (floor 90%), internal/tui/theme 100%, every package above 95%
  • Renders checked at 200x50 and 120x35: no dead canvas, overlay proportions as tabled above

Interaction behavior is frozen and unchanged. Goldens regenerated where the geometry moved; the editor and ADR split goldens are byte-identical because their fixtures sit in the narrow regime, and the 120x40 board goldens are untouched because the even split already governed there.

aksOps added 3 commits August 20, 2026 05:19
The board clamped every column to a MaxColumnWidth of 52 and centered the
group, so a 200-column laptop terminal rendered a centered strip with ~50
dead columns of canvas either side of it. The clamp is gone: the columns
split the whole frame evenly, with a MinColumnWidth floor of 16 taking over
if the split ever falls below a width that can hold a title. The sub-100
column collapse to a single column is unchanged.

Every content overlay - card detail, editor, settings, ADR split, import -
now resolves the same panel geometry through theme.Metrics.OverlayPane. It
has two regimes, split at the WideFrame threshold of 100 the board already
collapses on: below it a panel keeps the near-full-frame size v1.0.1
shipped, so nothing on a small terminal shrank; at or above it a panel
spans 85% of the frame width and 88% of its height. The card detail pane
therefore goes from 72x13 to 170x44 on a 200x50 frame. Prose inside a panel
is held to a ContentMax measure of 96 so a wide panel does not become one
very long line.

Settings composes over the dimmed board as an elevated panel instead of
taking the whole frame, which is what made it the one overlay with no
backdrop. Its pointer regions move with the panel. The small-frame
fallback to a full-frame pane is preserved on every overlay, so the frozen
v1.0.1 dismissal behaviors stay reachable.

Interaction behavior is unchanged. Goldens regenerated where the geometry
moved; the 120x40 board goldens are untouched because the even split
already governed at that width.
The import panel's height used to follow its row count, so the review
window could be computed against the frame and still fit. The panel is now
sized independently, so a window sized against the frame can overflow the
body and lose rows off the bottom. reviewLimit now takes the panel body
height and spends the 8 rows of chrome inside it, which is the same visible
count on a narrow frame and the correct larger one on a wide frame.
splitWidths never returns a width below 1, so the MinColumnWidth > 0 arm of
the floor check could not be reached.
@aksOps
aksOps force-pushed the restyle/layout-parity branch from 701786b to 35319ae Compare August 20, 2026 05:24
@sonarqubecloud

Copy link
Copy Markdown

@aksOps
aksOps merged commit 0dd5b25 into main Aug 20, 2026
9 checks passed
@aksOps
aksOps deleted the restyle/layout-parity branch August 20, 2026 05:28
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.

Web-like layout: full-frame board and proportional overlays

1 participant