scene: per-sky-state ink for names and phone-dusk labels; New Messages as plain label #74

Merged
void merged 1 commit from void/scene-ink into dev 2026-11-10 17:58:24 +00:00
Member

Per-scene-state ink, chromeless: no tint, panel, halo or new fill. Source: ratatoskr-sidebar-contrast-20261110/results.md (ink-proposals.json, T3/T4).

What changes

  • src/app/features/scene/skyInk.ts is the one owner of ink for a sky state (pure): inkForState, userColorInk, labelInk, sceneInk.
  • Sender names (timeline): same OKLCH hue and chroma, lightness stepped 0.005 (darker at day/dusk, lighter at night) until 4.5:1 against the LIGHTEST measured 24x12 terrain patch for that state and viewport. Applied to power-tag colours (via useAccessiblePowerTagColors, timeline only) and the hash palette --mx-uc-1..8 (via Message). Reproduces the measured Aqua values exactly: #05707f / #016a78 (day desktop/phone), #055763 / #03454f (dusk), #43e5f8 (night desktop).
  • Night lightening is capped at OKLCH L 0.90 so hue survives. Phone night Aqua is #87f1ff, not the near-white #c3f8ff; the price is 4.03:1 on the single lightest snow patch (hash hues 3.83-3.99), not 4.5. Against the sky's own lightest (skyBackdrop night, 0.0816) it clears 4.5.
  • Phone dusk sidebar labels: #342d25 -> #29221a (same hue and chroma), set as --sky-label-ink on <html> by AuthRouteThemeManager, read by the phone label rules (NavLabel, CategoryButton). Other states keep the theme ink.
  • "New Messages": the solid green Badge is a plain Text in the sky label ink; the divider line stays Success.Main.
  • Explicit user theme wins: the ink is only worn when sceneThemeId picks the sky theme (logic unchanged, moved into one hook useSceneSkyThemeId; fixed sky state still wins as before) and a scene runs. Tested.
  • colorMXID.js gains indexColorMXID (the hash index; cssColorMXID uses it).

Luminance used

Measured terrain-patch luminance (results.md T3), not skyBackdrop: day 0.777 desktop / 0.703 phone, dusk 0.531 / 0.400, night 0.103 / 0.149. skyBackdrop is the bare sky's extreme (day 0.90, dusk 0.97), which the terrain under the timeline never shows, and its night lightest (0.0816) is below the measured snow. Phone = ScreenSize.Mobile (<= 750px); tablet reads as desktop.

Measured / computed / unseen

  • Measured (SwiftShader, not GPU, by the handoff): patch luminances; sidebar glyph contrast; phone dusk median 3.98 as shipped.
  • Computed here: every ink hex and ratio (skyInk.test.ts pins 54 rows); phone dusk label #29221a re-scored over the shipped dusk phone glyph pixels (halo kept): median 3.98 -> 4.53, worst 1.66 -> 1.92 (worst stays under 4.5; the ochre sits at the ink's luminance).
  • Unseen: nothing rendered. Not measured: real-GPU terrain, the unread divider, other call sites (search results, pins, inbox, reply quotes still use the theme colours), tablet widths, whether var(--sky-label-ink, inherit) behaves in the target browsers.
  • For a real GPU or Meta's eyes: do darker day/dusk names still read as the same Persona hue; is phone-night #87f1ff recognisably aqua; is "New Messages" as bare text enough of an anchor with the green line; does phone dusk look right.

Tests: whole vitest suite passes; prettier clean; eslint has the same 6 preexisting errors in Message.tsx and none new.

🤖 Generated with Claude Code

Per-scene-state ink, chromeless: no tint, panel, halo or new fill. Source: ratatoskr-sidebar-contrast-20261110/results.md (ink-proposals.json, T3/T4). ## What changes - `src/app/features/scene/skyInk.ts` is the one owner of ink for a sky state (pure): `inkForState`, `userColorInk`, `labelInk`, `sceneInk`. - Sender names (timeline): same OKLCH hue and chroma, lightness stepped 0.005 (darker at day/dusk, lighter at night) until 4.5:1 against the LIGHTEST measured 24x12 terrain patch for that state and viewport. Applied to power-tag colours (via `useAccessiblePowerTagColors`, timeline only) and the hash palette `--mx-uc-1..8` (via `Message`). Reproduces the measured Aqua values exactly: #05707f / #016a78 (day desktop/phone), #055763 / #03454f (dusk), #43e5f8 (night desktop). - Night lightening is capped at OKLCH L 0.90 so hue survives. Phone night Aqua is #87f1ff, not the near-white #c3f8ff; the price is 4.03:1 on the single lightest snow patch (hash hues 3.83-3.99), not 4.5. Against the sky's own lightest (`skyBackdrop` night, 0.0816) it clears 4.5. - Phone dusk sidebar labels: #342d25 -> #29221a (same hue and chroma), set as `--sky-label-ink` on `<html>` by `AuthRouteThemeManager`, read by the phone label rules (NavLabel, CategoryButton). Other states keep the theme ink. - "New Messages": the solid green Badge is a plain Text in the sky label ink; the divider line stays `Success.Main`. - Explicit user theme wins: the ink is only worn when `sceneThemeId` picks the sky theme (logic unchanged, moved into one hook `useSceneSkyThemeId`; fixed sky state still wins as before) and a scene runs. Tested. - `colorMXID.js` gains `indexColorMXID` (the hash index; `cssColorMXID` uses it). ## Luminance used Measured terrain-patch luminance (results.md T3), not `skyBackdrop`: day 0.777 desktop / 0.703 phone, dusk 0.531 / 0.400, night 0.103 / 0.149. `skyBackdrop` is the bare sky's extreme (day 0.90, dusk 0.97), which the terrain under the timeline never shows, and its night lightest (0.0816) is below the measured snow. Phone = ScreenSize.Mobile (<= 750px); tablet reads as desktop. ## Measured / computed / unseen - Measured (SwiftShader, not GPU, by the handoff): patch luminances; sidebar glyph contrast; phone dusk median 3.98 as shipped. - Computed here: every ink hex and ratio (skyInk.test.ts pins 54 rows); phone dusk label #29221a re-scored over the shipped dusk phone glyph pixels (halo kept): median 3.98 -> 4.53, worst 1.66 -> 1.92 (worst stays under 4.5; the ochre sits at the ink's luminance). - Unseen: nothing rendered. Not measured: real-GPU terrain, the unread divider, other call sites (search results, pins, inbox, reply quotes still use the theme colours), tablet widths, whether `var(--sky-label-ink, inherit)` behaves in the target browsers. - For a real GPU or Meta's eyes: do darker day/dusk names still read as the same Persona hue; is phone-night #87f1ff recognisably aqua; is "New Messages" as bare text enough of an anchor with the green line; does phone dusk look right. Tests: whole vitest suite passes; prettier clean; eslint has the same 6 preexisting errors in Message.tsx and none new. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
scene: one owner of ink per sky state (names, phone-dusk labels), New Messages as plain label ink
Some checks failed
Build pull request / Build pull request (pull_request) Failing after 2m37s
aa0dfc0ee9
Sender names over the terrain step to the state's ink: same OKLCH hue and chroma, darker by day and dusk, lighter at night, until 4.5:1 on the lightest measured terrain patch (capped at OKLCH L 0.9 at night). Sidebar labels get a darker dusk ink on phones. An explicit theme still wins. The unread divider keeps only its green line.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
void merged commit 1499e9a810 into dev 2026-11-10 17:58:24 +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!74
No description provided.