98441fae15
Pulled the pointer→cell math out of cellAt() into a pure cellFromPoint(rect, x, y, n) in $lib/wordsearch.js (only getBoundingClientRect stays in the component), and covered it with vitest — including the last-column case that was drifting under the old overflowing layout, plus clamping and a scrolled-origin rect. 11 vitest tests now; real-device testing remains the final validator. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>