Stage 8 polish: keyboard-aware modals, consistent select pickers, required game type
Tests · UI / test (push) Successful in 17s

Third owner-review pass (iPhone):
- Modals (and the chat) size their backdrop to window.visualViewport, so they stay
  fully above the software keyboard (dvh alone left the sheet partly behind it).
- On the owner's call, every profile / new-game picker is a native <select> for
  consistent cross-platform behaviour: the away window returns to hour + 10-minute
  selects (which also avoids the iOS time-wheel "clear" button), alongside the offset
  timezone and the game-type / move-time / hints selects. Native time/wheel inputs
  render differently per OS and cannot be forced to match.
- New-game "play with friends" has no preselected game type — an explicit, required
  pick (empty placeholder); Send invitation stays disabled until both a type and a
  friend are chosen. A smart default (from play history / language) is TODO-6.
This commit is contained in:
Ilia Denisov
2026-06-03 23:14:51 +02:00
parent 8b83543632
commit b7d469a06e
4 changed files with 93 additions and 32 deletions
+16 -7
View File
@@ -594,13 +594,16 @@ Open details: deployment target/host; dashboards; load expectations.
game, an "add to friends" item flips to a disabled "request sent"; chat send/nudge
became ⬆️/🛎️ icons; a **finished game** drops its last-word highlight, hides Check
word / Drop game, disables zoom, and draws an **inert footer** (greyed rack + tab
bar) instead of hiding it. A second **iPhone-simulator** pass then made the chat
and modals keyboard-aware (`dvh` sizing), returned the away window to a native
`<input type="time" step="600">` (the iOS wheel with 10-minute steps; the timezone
stays a native offset `<select>`), reserved the rack height so a finished footer
does not collapse, and compacted the play-with-friends form (a searchable
bounded-scroll friend list, native game-type / move-time / hints selects in one
row, a pinned invite).
bar) instead of hiding it. Two **iPhone-simulator** passes then made the chat and
modals keyboard-aware (`dvh` plus a `visualViewport` listener that sizes the modal
backdrop to the area above the keyboard), reserved the rack height so a finished
footer does not collapse, and compacted the play-with-friends form (a searchable
bounded-scroll friend list, a pinned invite, and an explicit, **required game
type** — a smart default is TODO-6). On the owner's call, **every profile / new-game
picker is a native `<select>`** (the away window as hour + 10-minute selects, the
timezone as a UTC-offset select): native time/wheel inputs render differently per
OS and can't be forced to match, and a select also avoids the iOS "clear" button
that would empty a time field.
## Deferred TODOs (cross-stage)
@@ -639,3 +642,9 @@ Open details: deployment target/host; dashboards; load expectations.
exists (Stage 9), wrap a code in a deep link and render it as a QR so a friend can
add you by scanning rather than typing. The code semantics (12 h TTL, single use,
one active per issuer) stay as-is; only the delivery changes.
- **TODO-6 — smart default for the friend-game "game type" (owner's idea, Stage 8).**
The play-with-friends form has no preselected variant today (an empty, required
pick). Default it from the player's history (the variant they play most, from
`account_stats` or a games query), falling back to their interface language
(en → English, ru → Russian/Эрудит). Until then the explicit pick avoids guessing
wrong.