Building a curve by mouse alone was fiddly: there was no way to put a
point on an exact value, no grid, and the running preview could not be
stopped at a chosen moment. The hand cursor over points also looked
like a link instead of a drawing tool.
- Number fields t and v in the header show the selected point. Typing
or dragging on them goes through the same rules as a mouse drag, so
points never overtake and handles stay clamped. One undo step each.
t is greyed out on the two end points.
- The magnet button from Vector art snaps points and handles to a
0.05 grid in t and v, when placing on free space and when dragging.
- Points and handles keep the default arrow in the curve tab and in
Vector art. The pixel art palette dropped pointer as well, which is
beyond the issue. Collider corners never had it.
- The preview now starts off. A vertical time line with a knob under
the t axis sets t when dragged sideways. Dragging the dot on the
rail jumps to the first t where the curve reaches that value, or to
the closest one if it never does.
- The rules are pure functions in curveView.ts (withCurvePointSet,
snappedToGrid, shareAtValue, previewSecondsAt), the canvas only
calls them.
Tests:
- ./check.sh: 180 files, 2616 tests, CHECK EXIT 0
- GM_STEPS=1,47,53: ALL PASSED, 87 checks
- 4 new unit tests in curve-view.test.ts, 4 new e2e checks in 53
(53h-53k) and 1 in 47, all with real mouse and keyboard
- Counter-probes bite: without "first t" 1 unit test fails, with
pointer, no snap, no field commit, no scrub or preview on 5 browser
checks fail, pointer in Vector art fails the new 47 check
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
debugHook.ts had grown to 1097 lines of unrelated test hooks. They
now live in seven files under src/editor/debug/, grouped by topic.
debugHook.ts only assembles them and is down to 86 lines.
- The shape of window.__gm is unchanged for tools/. Measured in the
browser before and after: 120 top-level keys and 313 leaves with
their arity, byte-identical JSON.
- The Text import is explicit in the helpers. Without it the name
fell back to the DOM type and instanceof would never have matched.
Findings:
- The comment for vectorArt sat above pixelArt. It is back in place.
- An orphaned duplicate comment on assetRow is gone.
Tests:
- ./check.sh: 145 files, 2192 tests, CHECK EXIT 0 (unchanged)
- e2e 1-16,37,39-43,47,48: ALL PASSED, 734 checks
- The shape probe turns red against a deliberately misnested hook.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>