First standalone release. Extracted from the jackin-project/jackin monorepo, where the crate lived as crates/jackin-term (the owned terminal model of the jackin❯ Capsule PTY multiplexer); history preserved via git filter-repo. Renamed jackin-term → termpane (lib jackin_term → termpane). The extraction itself carries no behavior changes vs the monorepo source; this release additionally lands the tui-snap parity surface listed below.
Added
- DECAWM (
CSI ?7 h/l) modeled with vt100-fork print semantics: wrap-off
overwrites at the clamped right column, a wide glyph that cannot fit is
suppressed, combining marks still join, re-enabling restores wrap.
Serialized in every replay form (contents_*,input_mode_*,state_*). - DECSED/DECSEL (
CSI ? J/CSI ? K) distinct parse arms with plain-erase
parity (upstream vt100 has no protection model; documented as parity). - Bell: BEL emits typed
PassthroughEvent::Bell(one per byte, in order),
never a cell side effect. CSI ?12text-cursor-enable tracked as tri-stateOption<bool>
(text_cursor_enable()), plus application keypad (ESC =/ESC >) and
DEC 2026 synchronized-update (in_synchronized_update()) tracking.- Replayable serialization API:
contents_formatted,contents_diff,
input_mode_formatted,input_mode_diff,state_formatted,state_diff,
andstate_eqreplay contract (exact reproduction incl. DECAWM, phantom
pending-wrap cursor, bracketed paste, mouse mode/encoding, app cursor
keys, alt screen, cursor visibility/style). Covered by unit pins and a
proptest property; fuzz target asserts one-shot vs byte-split equality
(incl.mid_sequence) andstate_formatted/state_diffround-trips. - Harness surface:
mid_sequence()parser ground-state scanner (vte 0.15
exposes none), publicdecrqm_status()for every tracked DEC mode
(declines 2027, 0 for untracked/ANSI),set_size()content-preserving
resize, scrollback offset views, documented phantom pending-wrap
cursor_position()(adapter clamps tocols-1). proptestdev-dependency for the serialization round-trip property.
Clarified
CSI ?12(text-cursor-enable), DEC 2026 (synchronized update), and DEC 1004
(focus events) are tracked + queryable via live getters but intentionally
outside every replay form (contents_*,input_mode_*,state_*) and
state_eq— by design; the conformance/fuzz harnesses read the live getters.- Invalid ED/EL/DECSED/DECSEL modes (
CSI 5J,CSI ?5J,CSI 5K,CSI ?5K)
are swallowed silently (upstream unhandled-hook parity, noDroppedCsi);
pinned by unit test, exercised for determinism by
tests/fixtures/basic/decsed-decsel.vt. - DECRQM on never-set
?12reports reset (tri-stateNonereads as reset). ?6DECOM is absorbed as a non-goal (no origin-mode emulation).- Scrollback rows keep their capture widths across
set_size(resize preserves
content, does not re-wrap history).