fix: history TUI frame fills screen + items grouped with separators + tab-bar gap + SELECTED removed The duplicate hint bar came from term.rows() returning ws.row - 3 for safety, leaving the frame 3 rows short of the actual screen. After any terminal-state shift the previous taller frame's statusbar survived on screen below the new shorter frame's statusbar, stacking two hint bars. term.screenRows() returns ws.row raw; the new render emits exactly screenRows lines per frame (1 topbar + 1 tab-gap + screenRows-3 content + 1 statusbar), with \x1b[2K on every line and \x1b[H at start, so a previous frame can never leave remnants regardless of size. buildListLines now distributes slots evenly across the body. Each slot has equal height (off by at most 1) with the same internal structure: top filler, header, message, meta-or-blank, separator, bottom filler. A muted ─-rule separator renders at the bottom of every slot — selected or empty — so six items read as six distinct blocks. The third line of a non-selected slot is no longer blank-on-blank: it's a real separator and the slot total stays consistent regardless of selection. Layout reserves 1 row for the topbar, 1 for the tab-bar gap, 1 for the statusbar; content = screenRows - 3. Tab-bar gap is a single cleared blank line between the topbar and the first slot, giving the chrome above breathing room before items begin. Selected state is shown only by the prefix (▸/◉/·), color contrast, and the meta line on the selected item. The literal 'SELECTED' label is gone from both buildSelectedHeader and buildDetailTitle.

dev · 2 weeks ago · 2026-06-30 · 10.5 MB

session: history TUI frame stacking + layout · agent: claude-opus-4-8

$ koh steal kepr.uk/koh@e6fbe58638f1
·
← 62c1a13e8ea5 26dc27733f4e →
⇓ download .face