Run these checks before merging large changesets. Automated tests catch logic errors; humans catch visual regressions.
Prerequisites: Unit & e2e tests pass, Docker runs, browser console clean.
- Open http://localhost:3000/home.html
- Visual check
- Ctrl-Shift-M Mobile view visual check
- Start Here button works
- Create mixed doc: 2–3 drawing shapes, 3 toys, 2 boundaries
- Export → edit in Inkscape (change boundary name) → re-import
- Verify: toys same position, boundary name updated, no structural corruption
- Export again, diff against edited SVG (allow whitespace, not structural)
-
Single boundary: Create boundary named
"toy", toy with class"toy"inside- Drag to edges; should stop (no jitter)
- Rename boundary to
"other"; toy now free-moving - Move toy outside via edit panel, drag; should be unconstrained
-
Multiple boundaries: Two overlapping boundaries named
"toy", toy in overlap- Drag; should respect union of both
- Tool:
'pos-grid-sq', spacing80, snap-radius30 - Draw 240×240px; expect 4×4=16 circles
- Inspector: each
<circle>hascx,cy,r="30" - Drag toy near grid point; should snap when within radius
- Edit panel: change snap-radius to
50; all circles update tor="50"
- Tool:
'pos-grid-hex', hex-size40, snap-radius30 - Draw 300×300px; circles form staggered pointy-top pattern
- Inspector: odd rows offset by
hexSize * √3/2(≈34.6px) - Drag toy; should snap to nearest hex point
- Compare with square grid on same canvas; no confusion
- Boundary named
"toy", position set named"toy", toy with class"toy"inside - Drag toy; should snap only to grid points inside boundary
- Snap point outside boundary rejected
- Create boundary + position set, modify toy position → undo 3× → redo 3×
- Elements reappear with identical geometry
- Inspector: no orphaned elements, correct child counts
- Boundary: Edit
name→ label updates; editx/y→ boundary moves - Position set: Edit
nameandsnap-radius→ both update in one transaction
- Create 2 boundaries, 2 position sets, toys
- Toggle boundaries-positions layer off/on
- Boundaries and position sets hide/show; toys unaffected
- Boundary:
<g data-bounpos-type="boundary">has 2 children (<path>,<text>); all attrs in Yjs - Position set:
<g data-bounpos-type="pos-set">has<path>,<text>, N<circle>children;snap-radius,data-gen-type,data-gen-paramon<g> - Yjs sync (two windows): Create boundary in one; appears in other within 1–2s
- Sections above all pass
- Inspector: correct structure and child counts
- No visual regressions