feat(tui): full-frame board and proportional overlays (#151) - #154
Merged
Conversation
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
force-pushed
the
restyle/layout-parity
branch
from
August 20, 2026 05:24
701786b to
35319ae
Compare
|
This was referenced Aug 20, 2026
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.



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 byMinColumnWidth(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.[49 49 49 48], spans 199 of 200[30 30 29 29](clamp idle)[29 29 29 28], spans 119 of 120Overlays
Card detail, editor, settings, ADR split and import all resolve
theme.Metrics.OverlayPane. Two regimes, split at the sameWideFramethreshold of 100 the board collapses on:frameW < 100—frameW - 4byframeH - 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.Prose inside a panel is capped at a
ContentMaxmeasure 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 < 8fallback 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.mdsections 2.5 and 4 amended on thedesign/tui-specbranch (commit6933686), with the superseded numbers and the reason recorded in place.Verification
go build ./...,go vet ./...cleango test -race ./internal/tui/...— 641 passedsh scripts/check-go-coverage.sh— total 96.9% (gate 96.4%),internal/tui96.5% (floor 90%),internal/tui/theme100%, every package above 95%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.