Part of the UI-system unification. Hand-rolled motion substrate (verdict: hand-roll, drop the tachyonfx dependency — it beat the library on every axis and the library was unused). Independent of the token/widget foundation; can run in parallel.
What to build
A small, allocation-light animation layer that every overlay fade and the identity "breath" ride on.
- A persistent phase clock on the runtime state, advanced each frame by
dt, that outlives overlay open/close (so fade-OUT can play).
- A motion helper module:
lerp_rgb, ease curves (ease_out_cubic, ease_in_out), a bounded breath oscillator, dim_overlay, crossfade, clip_rows.
- Extend the composite stage so a rich overlay can be drawn with a
dim: f32 (lerps set fg/bg toward the background). Existing draw path becomes a dim = 1.0 wrapper so current renders are byte-identical.
- Remove
tachyonfx from the manifest (terminal feature + deps). Note: there is no spike code to delete on this base — motion is greenfield here.
Acceptance criteria
Blocked by
None - can start immediately
Part of the UI-system unification. Hand-rolled motion substrate (verdict: hand-roll, drop the
tachyonfxdependency — it beat the library on every axis and the library was unused). Independent of the token/widget foundation; can run in parallel.What to build
A small, allocation-light animation layer that every overlay fade and the identity "breath" ride on.
dt, that outlives overlay open/close (so fade-OUT can play).lerp_rgb, ease curves (ease_out_cubic,ease_in_out), a boundedbreathoscillator,dim_overlay,crossfade,clip_rows.dim: f32(lerps set fg/bg toward the background). Existing draw path becomes adim = 1.0wrapper so current renders are byte-identical.tachyonfxfrom the manifest (terminal feature + deps). Note: there is no spike code to delete on this base — motion is greenfield here.Acceptance criteria
dtand wraps safely (unit test)dim = 1.0composite path leaves all existing visual-regression goldens unchangedtachyonfxremoved;cargo build --features terminal+cargo test+ clippy passBlocked by
None - can start immediately