TextUI 0.6.0
Added
:textaccepts:wrapwithbalanced(default, Knuth–Plass) orgreedy, a linear-time low-latency break strategy for interactive readers. Greedy stays kinsoku-aware, preserves attributed source characters, and keeps the non-final-line pixel-justification contract (ADR 0036).- A bounded paragraph layout cache (
textui-text-layout-cache-size, default 2048 entries) memoizes text planning per content, pixel width, and wrap strategy. Cache keys include resolved named-face metrics, a theme/font environment generation, andface-remap-alistentries in both proper-list and dotted-pair forms;textui-invalidate-text-layout-cacheis the manual escape hatch.
Fixed
- The graphical
:imagepath built rows as unibyte strings and spliced alt text withstore-substring: a CJK alt signaled "Attempt to store non-byte value into unibyte string" and alt text properties were dropped. Rows are now multibyte and property-preserving. - Alt splicing is bounded by both display width and character count, so combining-mark or variation-selector sequences no longer signal
args-out-of-range. - A letterboxed image now places its alt and property carrier on the leaf's first row, keeping external row-range bookkeeping aligned to the leaf.
- Action-triggered refreshes read focus/position snapshots via
buffer-local-valuefrom the target buffer, fixing lost point andwrong-type-argumenterrors when a widget action ran while another buffer was current.
Full test suite: 120/120.