Fix fly-to vertical centering at non-1 zoom levels #250

Merged
justin merged 1 commits from fix-fly-to-vertical-centering into main 2026-06-11 08:58:38 -04:00
Owner

×N fly-to sometimes landed in a blank area far below the tree. Cause: family-chart cardToMiddle scales datum.x by the zoom k but not datum.y (y = height/2 - datum.y, missing the ·k), so vertical centering is only correct at k=1 and drifts by datum.y·(k−1) otherwise — worse the deeper the person sits (hence "way below the tree", and it only worked near 1:1). Fix: pre-multiply the y passed to cardToMiddle by the current scale, cancelling the missing ·k. x was already correct. Frontend only.

🤖 Generated with Claude Code

`×N` fly-to sometimes landed in a blank area far below the tree. **Cause:** family-chart `cardToMiddle` scales `datum.x` by the zoom `k` but **not** `datum.y` (`y = height/2 - datum.y`, missing the `·k`), so vertical centering is only correct at `k=1` and drifts by `datum.y·(k−1)` otherwise — worse the deeper the person sits (hence "way below the tree", and it only worked near 1:1). **Fix:** pre-multiply the `y` passed to `cardToMiddle` by the current scale, cancelling the missing `·k`. `x` was already correct. Frontend only. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
justin added 1 commit 2026-06-11 08:58:37 -04:00
Clicking ×N sometimes flew to a blank area far below the tree. Cause:
family-chart's cardToMiddle scales datum.x by the zoom factor k but not datum.y
(`y = height/2 - datum.y`, missing the ·k), so vertical centering is only
correct at k=1 and drifts by datum.y·(k−1) at any other zoom — worse the deeper
the person sits. That's why it worked only when the view happened to be near 1:1.

Compensate by pre-multiplying the y we pass to cardToMiddle by the current
scale, cancelling the library's missing ·k. x was already correct.

Signed-off-by: Justin Paul <justin@jpaul.me>
justin merged commit 3731d77d4b into main 2026-06-11 08:58:38 -04:00
justin deleted branch fix-fly-to-vertical-centering 2026-06-11 08:58:38 -04:00
Sign in to join this conversation.