Skip to content

char_* presets: rotate_from, scale/baseline jitter, reflow (undelivered parts of #363) #429

Description

@LeadcodeDev

Context

#363 was closed after fixing char_* on rich_text/gradient_text, but three requested capabilities were not delivered and are rejected as unknown fields. rules/char-animation-rich-and-gradient-text.md only notes them as absent.

To do

  • rotate_from (+ rotate_origin): each unit starts tilted and straightens while it settles (staircase word reveal).
  • scale_jitter / baseline_jitter with seed: deterministic per-unit size and baseline variation (letters born at different sizes, then aligning).
  • reflow / reflow_easing on char_* presets and typewriter: a centred line stays centred while it is being written, instead of growing from a fixed left edge.

Definition of done

  • A test that fails on current main is written first. For anything visual it is a render test (scenario → frame → pixel assertions); tests that build AnimatedProperties by hand are not enough — that is exactly how the regressions listed here slipped through.
  • Each item is verified end to end: scenario JSON, rustmotion validate, render, image inspected.
  • cargo fmt --all --check, cargo clippy --workspace --all-targets -- -D warnings, cargo test --workspace pass.
  • Vocabulary changes update crates/rustmotion/skills/SKILL.md, the relevant rules/ file and the exported schema. A field the validator accepts must have an effect, otherwise the validator rejects it or warns.
  • No comments in Rust code (repository rule). Commits follow <type>: <verb> <message>. No AI attribution in commits, PRs or issue comments.

Activity

  1. LeadcodeDev commented on Sep 29, 2026

    @LeadcodeDev
    OwnerAuthor

    All three items are on CharAnimationTiming on main — rotate_from/rotate_origin, scale_jitter/baseline_jitter with seed, and reflow/reflow_easing (merged in #450).

    The two gaps #450 asked to be read before closing are both resolved, each the way the repository rule allows — a field the validator accepts must have an effect, or the validator rejects it or warns:

    • reflow on rich_text is named rather than silently inert. check_reflow_reaches_this_component (merged in fix(validate): stop the false positives, name the right edge, warn once #449) emits reflow has no effect on rich_text, because that component's char animation lays out from token positions it precomputes independently.
    • reflow on typewriter is rejected outright, verified just now: unknown field reflow, expected one of delay, duration, loop, …, and the component is refused rather than silently dropped. AnimationEffect::Typewriter carries a bare AnimationTiming, and putting reflow there would make it inert on every other preset — the same violation, moved.

    Whether typewriter should gain real reflow is a feature question, not this issue's unfinished business: #450 recorded that the original complaint did not reproduce. Open a new issue if a scenario shows it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions