89 lines
5.3 KiB
Markdown
89 lines
5.3 KiB
Markdown
# UX package 7 and iPhone screen edges — 2026-10-07
|
||
|
||
The operator approved continuing with package 7 and requested a continuous
|
||
background behind the iPhone 17 Pro camera/battery/status area. They also
|
||
confirmed that the generation-554 reconnect fix works on their device.
|
||
Sol High retained; no delegation or model change.
|
||
|
||
## Behavior
|
||
|
||
Buttons have at least 44 × 44 CSS-pixel hit areas with compact icons and
|
||
visible focus. Phone headers wrap when needed; video calling moves to More
|
||
actions. Menus support keyboard entry, arrow/Home/End selection, Escape with
|
||
focus return, Tab and outside-pointer dismissal. A native modal fingerprint
|
||
dialog contains focus and makes the background inert; the explicit opener
|
||
gets focus after closing, even when opening did not focus it. New-chat and
|
||
invitation fields take focus explicitly and Escape returns to their trigger.
|
||
Group person actions focus their heading and return to the selected person.
|
||
|
||
The existing viewport-fit=cover is supplemented with the Apple standalone
|
||
and black-translucent status-bar metadata. Canvas/theme color match the header
|
||
surface under light/dark/system themes, including a system theme change.
|
||
All four safe-area insets protect controls; the connection banner consumes
|
||
the top inset once. Portrait-only manifest orientation is removed.
|
||
Implementation/source references: the root README's phone-controls section.
|
||
|
||
## Candidate evidence
|
||
|
||
Zero svelte-check errors/warnings, production build, runner syntax/diff review
|
||
and 68 passing tests (`node --test --test-isolation=none test/*.test.ts`).
|
||
Reports/captures stay private under `/tmp/chat-ux-runner/results`; credentials
|
||
and stable A/B profiles remain outside Git. No new audit device identities.
|
||
|
||
- Chromium `state-chromium-1791409417010`: phone controls, drafts, actual
|
||
closed-profile offline recovery, immediate Retry and group flow pass.
|
||
Its old pagination assertion incorrectly required the first visible key
|
||
to stay identical when a newly loaded preceding row occupied the old
|
||
Load older/date space. The original message's position is now measured
|
||
directly; corrected `state-chromium-1791409565255` passes navigation,
|
||
reload, pagination, late sizing and latest jump with unchanged source.
|
||
- WebKit `state-webkit-1791409597716`: controls, drafts, corrected reading
|
||
anchors, Retry and complete group flow pass, zero page errors.
|
||
- Controls are measured at 320/402 px portrait, 740 px compact landscape
|
||
with simulated 58 px side insets, and 1280 px desktop. Simulated top/bottom
|
||
insets, 32 px control text, themes, native modal containment/inertness,
|
||
Escape/return, menu navigation/dismissal and the offline banner are checked.
|
||
Screenshots inspected; no document overflow, composer remains on screen.
|
||
- Group checks use disposable owned rooms, exercise owner/admin/member
|
||
permission differences and absent people, verify person-heading focus
|
||
and return, nickname navigation, invite/leave and retained drafts. Rooms
|
||
are destroyed and their bookmarks removed; production policy is untouched.
|
||
|
||
The explicit-opener regression opens the dialog while the textarea still
|
||
owns focus. Final Chromium `state-chromium-1791409730063` and WebKit
|
||
`state-webkit-1791409761823` pass it and all phone-controls checks, zero page
|
||
errors. Final JS `assets/index-CLrBYhSP.js`, SHA-256
|
||
`2a2ac49b608c8bfcdada74bbbcf4aae53bf54d13dab06d8019d20d55733833e6`.
|
||
## Release and live evidence
|
||
|
||
Client `f6feaa7` is pushed to main and pinned by blunix `f96d8e1`, pushed
|
||
to capability-layout. Switch succeeded as **generation 555**, system
|
||
`/nix/store/ph97mfjp2p9czfby65vbgzp7ih56lzvm-nixos-system-blunix-26.11.20260910.8ce4ef6`;
|
||
nginx root `/nix/store/mch7r3n3h0yak6f0k6hvrkgvwixgzgml-0ff-chat-0.1.0`.
|
||
Candidate, store and HTTPS JS hashes match. HTTP 200, unchanged strict CSP,
|
||
screen-edge metadata and revalidation headers verified. Only nginx restarted;
|
||
all ten checked platform services are active and there are zero failed units.
|
||
Fallback is **554**. Existing 177 blunix handoff additions remain unstaged.
|
||
|
||
Live Chromium `state-chromium-1791409921061`: matching HTTPS bundle/CSP,
|
||
phone controls/focus/themes/layouts and actual closed-profile offline
|
||
history/draft recovery pass. Retry begins in 66 ms and is online in 214 ms.
|
||
Zero page errors. Live WebKit `state-webkit-1791409975210` passes matching
|
||
HTTPS bundle/CSP, phone controls/focus/themes/layouts and the full owned
|
||
group/person flow, with zero page errors. All fourteen owned audit rooms
|
||
are confirmed absent after cleanup; their bookmarks were removed by the
|
||
group runner. The local preview is stopped.
|
||
|
||
The operator reloaded and fully reopened the PWA and explicitly answered
|
||
“Ja, der Hintergrund geht durch” for the camera/battery/status area on their
|
||
iPhone 17 Pro. This confirms that screen-edge request on the physical device;
|
||
it does not certify VoiceOver, keyboard behavior or every native control.
|
||
|
||
## Remaining physical-device checks
|
||
|
||
Screen-edge appearance is operator-confirmed above. Further keyboard/safe-area
|
||
response, touch comfort and VoiceOver checks require the operator's phone.
|
||
Linux WebKit is not native iOS certification. Fully offline WebKit emulation retains the
|
||
documented limitation; actual closed-profile offline coverage uses Chromium.
|
||
Reload and fully reopen the installed PWA after future rollouts. Do not clear
|
||
browser storage as a routine update step. Packages 8–9 remain planned.
|