Textual's `Footer` is a single horizontal row, so on a narrow terminal the keys at the end were cut off.
`KeyBar` replaces it on every screen:
- It reads the same active bindings (one entry per action, plus `^p palette`).
- It packs them greedily into rows that fit the width, and its height grows as needed.
At 80 columns with real data the bar takes two lines; at 140 columns it takes one.
Trade-off: the keys can no longer be clicked with the mouse.
Tests:
- a hypothesis property for `wrap_rows`: order is kept, rows fit the width, rows are packed greedily
- the bar wraps on a narrow terminal
- the bar is one line on a wide terminal
- the bar follows the info screen's bindings
Full suite passes (681 tests); ruff and betterleaks are clean.
Helped along the way with Claude Code
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Textual's Footer is a single horizontal row, so on a narrow terminal the
keys at the end were cut off. KeyBar replaces it on every screen: it reads
the same active bindings, packs them greedily into rows that fit the width,
and grows in height as needed.
Generated with AI
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Textual's
Footeris a single horizontal row, so on a narrow terminal the keys at the end were cut off.KeyBarreplaces it on every screen:^p palette).At 80 columns with real data the bar takes two lines; at 140 columns it takes one.
Trade-off: the keys can no longer be clicked with the mouse.
Tests:
wrap_rows: order is kept, rows fit the width, rows are packed greedilyFull suite passes (681 tests); ruff and betterleaks are clean.
Helped along the way with Claude Code
Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com