2e25476d0a
Holding ← or → now triggers continuous step at 100 ms cadence (10 steps/sec) — matches the mockup's `[← →] scrub` terminology while keeping single-press = single-step semantics. Implementation: per-key accumulators in a new `ReplayScrubKeyHold` resource. Each frame the key is held, the corresponding accumulator absorbs `time.delta_secs()`; when it exceeds `SCRUB_REPEAT_INTERVAL_SECS` (0.1s) the handler fires another step and resets the accumulator. `just_pressed` events bypass the accumulator entirely and fire immediately — release resets to 0 so the next fresh press also fires immediately rather than at half-interval. Symmetric handling for ← (backwards step via undo) and → (forward step). Both keys remain paused-only via the same destructure-gate pattern in the underlying step helpers. Footer text unchanged (`[← →] step`) — the only-wired-keybinds discipline says "list what works"; held-key continuous scrub is a discoverable enhancement to the same keybind, not a new keybind. `handle_arrow_keyboard` gains `Res<Time>` and `ResMut<ReplayScrubKeyHold>` parameters. `Time` is provided by MinimalPlugins's TimePlugin so headless tests already have it. 2 new tests (in addition to the 4 existing arrow scenarios): - arrow_right_keyboard_repeats_while_held: drives time at exactly SCRUB_REPEAT_INTERVAL_SECS per tick and asserts that a second step fires after the just_pressed one. - arrow_keyboard_release_resets_accumulator: verifies the release branch zeros the per-key accumulator. Tests: 1252 → 1254. Clippy clean. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>