Part of the UI-system unification. Introduce the ambient instrument — one bottom-docked surface with a BASE/TUNE/MSG state machine — and land the BASE (status) state on it.
What to build
- An ambient surface module with a state machine and resolution priority: error-MSG > MSG > TUNE > BASE; expired non-sticky states fall back. The surface always reserves the taller (tuner) height so later states do not cause layout jump.
- BASE = the status line, reborn on the shared
RowBuf + L1 tokens. This fixes the standing bug where the status line hardcodes Gruvbox colors and is therefore visually wrong on the other four themes.
- BASE is the resting state and renders at rest. This is a behavior change, not a port: today the status line only appears when an overlay is open or paused. The at-rest render gate must be removed so BASE shows during normal running (gated only by the user status-bar/chrome preference).
State machine shape (from the design):
- BASE
- TUNE { param, until }
- MSG { level, text, sticky, until }
resolve(states, now) picks by the priority above after dropping expired non-sticky entries.
Acceptance criteria
Blocked by
Part of the UI-system unification. Introduce the ambient instrument — one bottom-docked surface with a BASE/TUNE/MSG state machine — and land the BASE (status) state on it.
What to build
RowBuf+ L1 tokens. This fixes the standing bug where the status line hardcodes Gruvbox colors and is therefore visually wrong on the other four themes.State machine shape (from the design):
resolve(states, now) picks by the priority above after dropping expired non-sticky entries.
Acceptance criteria
resolvepriority unit-tested (error outranks all; expired TUNE -> BASE; live MSG outranks TUNE)cargo test --lib+ clippy passBlocked by