Expand description
Conversation pane — scrollback of log entries with an explicit offset-from-bottom cursor.
§Scrollback model
ConversationPane::scroll is the number of rows the viewport
is shifted up from the newest entry. A scroll of 0 is the
“stuck to bottom” state — new entries appear at the bottom and
the oldest-visible entry scrolls up to make room. Any non-zero
scroll detaches the viewport; newly appended entries continue
to grow the backing log but do not yank the viewport. The
input layer re-zeroes the offset on submit so command output
always lands in view.
The pane clamps scroll to [0, max_offset] where max_offset
is log.len() - visible_rows; scrolling past either end is a
no-op rather than a panic so a held PageUp does not wrap.
§Screen-reader mode
When screen_reader is set the pane switches to a plainer
render path:
- timestamps drop their DIM modifier (AT-SPI and NVDA often skip dimmed text entirely);
- entry kind becomes an explicit
[system]/[alert]prefix instead of relying on color; and - the reversed-video and bold modifiers are removed so a high-contrast terminal does not double-style the row.
Keyboard behavior is unchanged — PageUp/PageDown still scroll whether the mode is on or off.