Native text slots authored as slots[id].p = { a:0, k:[{t,s}] } (or with a
missing a) render blank in Skottie: it treats the keyframe array as a static
value and resolves empty text. Document the a:1 requirement in the player
contract, correct the canonical test fixture to the render-safe shape, and add
a local structural invariant test that flags keyframed text slots missing a:1.
CanvasKit's getTextSlot mangles non-ASCII text (mojibake on save), so
read text slot values from the source JSON plus an in-memory overrides
map instead of off the animation. Edits now write to both the slot
document and its bound layer fallback.
- canvas.tsx: track text edits in a textOverrides signal, derive slots
from sourceDoc + overrides, reset overrides when the scene reloads,
and bail out of save on a failed HTTP response
- lottie.ts: add readTextSlotValue/writeTextSlotValue and export
LottieDoc; cover slot document and bound-layer shapes
- add scripts/text-slot-unicode.test.mjs and a check:text-slots script