Phone: notice contrast, 44px tap hit areas, skip empty OIDC validation #78

Merged
void merged 3 commits from void/phone-contrast-taps into dev 2026-11-10 18:29:17 +00:00
Member

From the Starfire phone run (390x844, headless Chrome; /opt/commons/handoff/ratatoskr-dev-preview/REPORT.md).

(a) Training notice contrast (phone). The "Pretend server: ..." line sits on the dark foreground ridge in every sky state (luminance median 0.0052, p90 0.0089, read from the run's phone shots over the text region; rounded up to 0.01). Noonday (day, dusk) wears dark ink there, so it was dark on dark (about 1.2:1 by those numbers). skyInk's labelInk does not fit: it is measured against the LIGHTEST terrain behind the timeline and picks darker ink. New owner function in skyInk.ts: noticeInk returns Midnight's SurfaceVariant.OnContainer (#aeccff) on phone at day and dusk; night (already light) and desktop (unmeasured) are unchanged. RoomTrainingLine reads it through useSkyInk. No tint, panel, halo or fill. Test asserts the chosen ink clears 4.5:1 against the 0.01 ground and the replaced ink does not.

(b) Phone tap targets, hit area only. Under @media (max-width: MOBILE_BREAKPOINT) (750px, the repo's ScreenSize.Mobile), vertical padding grows the box and an equal negative margin takes it back out of layout (nothing moves, nothing is drawn). Desktop and tablet have no new rules.

target measured padding / margin new height
timeline sender-name buttons (Username in layout.css.ts, button&) 23 11 / -11 block 45
room-topic button (HeaderTopic) 18 9 top, 17 bottom / negated 44
login card links: Forget Password?, Register (AuthCard a) 16, 20 14 / -14 block 44, 48
login footer links: About, Source, ... (AuthFooter a) 22 11 / -11 block 44

Widths are not grown (28, 30, 41, 56, 39 px stay under 44): horizontal growth would shrink the ellipsis box of names or crowd neighbours, and the brief preferred vertical. The topic gets more room below than above so it does not take over the room name's click area.

(c) ServerConfigsLoader. Extracted loadServerConfigs(mx) and skip validateAuthMetadata when no auth metadata came back, so a homeserver without OIDC (and the demo's pretend server) no longer logs "Issuer configuration not found or malformed" / "Configured OIDC OP does not support required functions". Metadata that comes back and is malformed is still logged and dropped. Tests: no log when metadata is absent (fails if the guard is removed, verified), still logs when malformed.

Tests. New tests: phoneTapTargets.test.ts (reads the emitted CSS for each target: padding reaches 44, margin cancels it, no padding/margin outside the phone query; verified failing when a padding is shortened), skyInk.test.ts (noticeInk), ServerConfigsLoader.test.ts. npx vitest run: 51 files, 718 tests passed. VITE_PREVIEW_DEMO=1 CINNY_BASE=/void/x/ npx vite build: passes (exit 0). tsc --noEmit clean.

Not measured. No rendered re-check on a device or in headless Chrome after the change: contrast numbers come from the run's screenshots, tap sizes from the CSS arithmetic against the run's measured heights. Overlap of the enlarged hit areas with neighbours (Forget Password? over the password field's bottom edge, footer rows over each other, topic over the room-name line) is not checked in a browser. Desktop notice contrast unmeasured. Phone room-list tap probe (reported 0) remains unverified.

🤖 Generated with Claude Code

From the Starfire phone run (390x844, headless Chrome; /opt/commons/handoff/ratatoskr-dev-preview/REPORT.md). **(a) Training notice contrast (phone).** The "Pretend server: ..." line sits on the dark foreground ridge in every sky state (luminance median 0.0052, p90 0.0089, read from the run's phone shots over the text region; rounded up to 0.01). Noonday (day, dusk) wears dark ink there, so it was dark on dark (about 1.2:1 by those numbers). skyInk's `labelInk` does not fit: it is measured against the LIGHTEST terrain behind the timeline and picks darker ink. New owner function in `skyInk.ts`: `noticeInk` returns Midnight's `SurfaceVariant.OnContainer` (`#aeccff`) on phone at day and dusk; night (already light) and desktop (unmeasured) are unchanged. `RoomTrainingLine` reads it through `useSkyInk`. No tint, panel, halo or fill. Test asserts the chosen ink clears 4.5:1 against the 0.01 ground and the replaced ink does not. **(b) Phone tap targets, hit area only.** Under `@media (max-width: MOBILE_BREAKPOINT)` (750px, the repo's ScreenSize.Mobile), vertical padding grows the box and an equal negative margin takes it back out of layout (nothing moves, nothing is drawn). Desktop and tablet have no new rules. | target | measured | padding / margin | new height | |---|---|---|---| | timeline sender-name buttons (`Username` in layout.css.ts, `button&`) | 23 | 11 / -11 block | 45 | | room-topic button (`HeaderTopic`) | 18 | 9 top, 17 bottom / negated | 44 | | login card links: Forget Password?, Register (`AuthCard a`) | 16, 20 | 14 / -14 block | 44, 48 | | login footer links: About, Source, ... (`AuthFooter a`) | 22 | 11 / -11 block | 44 | Widths are not grown (28, 30, 41, 56, 39 px stay under 44): horizontal growth would shrink the ellipsis box of names or crowd neighbours, and the brief preferred vertical. The topic gets more room below than above so it does not take over the room name's click area. **(c) `ServerConfigsLoader`.** Extracted `loadServerConfigs(mx)` and skip `validateAuthMetadata` when no auth metadata came back, so a homeserver without OIDC (and the demo's pretend server) no longer logs "Issuer configuration not found or malformed" / "Configured OIDC OP does not support required functions". Metadata that comes back and is malformed is still logged and dropped. Tests: no log when metadata is absent (fails if the guard is removed, verified), still logs when malformed. **Tests.** New tests: `phoneTapTargets.test.ts` (reads the emitted CSS for each target: padding reaches 44, margin cancels it, no padding/margin outside the phone query; verified failing when a padding is shortened), `skyInk.test.ts` (noticeInk), `ServerConfigsLoader.test.ts`. `npx vitest run`: 51 files, 718 tests passed. `VITE_PREVIEW_DEMO=1 CINNY_BASE=/void/x/ npx vite build`: passes (exit 0). `tsc --noEmit` clean. **Not measured.** No rendered re-check on a device or in headless Chrome after the change: contrast numbers come from the run's screenshots, tap sizes from the CSS arithmetic against the run's measured heights. Overlap of the enlarged hit areas with neighbours (Forget Password? over the password field's bottom edge, footer rows over each other, topic over the room-name line) is not checked in a browser. Desktop notice contrast unmeasured. Phone room-list tap probe (reported 0) remains unverified. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Skip auth-metadata validation when the homeserver returned none
Some checks failed
Build pull request / Build pull request (pull_request) Has been cancelled
84ff2467e3
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
void force-pushed void/phone-contrast-taps from 84ff2467e3
Some checks failed
Build pull request / Build pull request (pull_request) Has been cancelled
to 0351f1f6e8
All checks were successful
Build pull request / Build pull request (pull_request) Successful in 3m30s
2026-11-10 18:26:03 +00:00
Compare
Author
Member

Unchecked: the Starfire render and the 390x844 re-measure. Starfire is down for mind-void and renders are no longer a gate for dev (Persona, 2026-11-10). Checked: rebased on dev 84770a2d, vitest and the demo vite build pass; contrast and tap-target numbers in this PR come from the earlier baseline measurement and CSS arithmetic, not from a render of this build. Open: follow-up starfire-renders-merge-77-78.

Unchecked: the Starfire render and the 390x844 re-measure. Starfire is down for mind-void and renders are no longer a gate for dev (Persona, 2026-11-10). Checked: rebased on dev 84770a2d, vitest and the demo vite build pass; contrast and tap-target numbers in this PR come from the earlier baseline measurement and CSS arithmetic, not from a render of this build. Open: follow-up starfire-renders-merge-77-78.
Author
Member

Soul pass (read-only) holds on #78, no blocks. One risk recorded, unmeasured: negative margin keeps layout still but not the hit area, so the enlarged taps (sender name +-11px, topic 9 up / 17 down, auth links +-14px) can overlap neighbouring lines; nothing tests overlap and it needs the Starfire render with hit boxes outlined (follow-up starfire-renders-merge-77-78).

Soul pass (read-only) holds on #78, no blocks. One risk recorded, unmeasured: negative margin keeps layout still but not the hit area, so the enlarged taps (sender name +-11px, topic 9 up / 17 down, auth links +-14px) can overlap neighbouring lines; nothing tests overlap and it needs the Starfire render with hit boxes outlined (follow-up starfire-renders-merge-77-78).
void merged commit 51d5fb0909 into dev 2026-11-10 18:29:17 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
GameCult/Ratatoskr!78
No description provided.