Stage 7 UI polish: fix ad-marquee end, drop-time zoom, focus centring, sticky rack selection
Tests · UI / test (push) Successful in 11s
Tests · Go / test (pull_request) Successful in 6s
Tests · Integration / integration (pull_request) Successful in 12s
Tests · UI / test (pull_request) Successful in 11s

- AdBanner: move the side inset onto the scrolling track so the long message
  scrolls to its very end; pin body text-size-adjust:100% so iOS/Safari stops
  inflating the long marquee text.
- Game: do not zoom on drag start (the player may change their mind) — zoom and
  centre happen on drop, in attemptPlace; a stray tap on an occupied cell no
  longer cancels the rack selection (wait for an empty cell).
- Board: centre the focus cell after the zoom width transition finishes (was
  clamping to top-left mid-transition); compute the cell from the rendered
  scrollWidth.
This commit is contained in:
Ilia Denisov
2026-06-03 16:22:01 +02:00
parent 10d48884ac
commit 1e7da5925a
4 changed files with 35 additions and 8 deletions
+5 -1
View File
@@ -132,7 +132,8 @@
dragMoved = true;
const slot = placement.rack[downInfo.index];
drag = { letter: slot, blank: slot === BLANK, x: e.clientX, y: e.clientY };
if (isCoarse() && !zoomed) zoomed = true;
// No zoom on drag start: the player may still change their mind. The zoom
// (and centring) happens on drop, in attemptPlace.
}
if (drag) drag = { ...drag, x: e.clientX, y: e.clientY };
}
@@ -169,6 +170,9 @@
return;
}
if (selected != null) {
// A committed tile already sits here: keep the rack selection so a stray tap
// on an occupied cell doesn't cancel placement — wait for an empty cell.
if (board[row]?.[col]) return;
attemptPlace(selected, row, col);
selected = null;
}