App: phone/desktop list chrome from the approved mockup (slice 1) #516

Closed
kayg wants to merge 6 commits from issue/469-port-1 into dev
Owner

Refs #469, closes #511. Slice 1 of bringing the approved chrome mockup (issue/469-chrome-mockup-3) into the app. Not merged; waits for kayg.

Ported

  • Lists (Journal, All notes, tags, Pinned, Trash; phone and desktop): group headings are H2s in the title's face, sentence case; no "Today" pill in the list rows or the note header; list/gallery as a springy morph (morphLayout), glass gallery cards (the shared dense step, no blur per card). The gallery keeps windowing: a band of two cards is one windowed row.
  • Phone: large title placed lower with the count as a subtitle; headings share the title's left edge, rows are indented 16 pt.
  • Phone top chrome (apps/web/src/chrome/): floating glass pills (back; header pill that fades in when the title scrolls away; ⋯ and, when a page registers one, Share in one grouped pill with no divider), icon sizes from the mockup (glyph.ts), a short progressive blur (packages/ui/src/chrome/ProgressiveBlur.svelte) that is display: none until content is under it. What ⋯ holds comes from a page-actions registry (pages.ts, plugins/), what the header says from a header-source registry (header/).
  • Glass and look: float tint 0.30 / 0.36, blur 20, sat 180 (already the shared values); dense step 0.48 (the mockup is finalising it); look v2 ink, paper, shadows and radii as tokens; line height 1.6 and body 17 px kept (not v2's dense scale).
  • Text: #506's commit cherry-picked (no global antialiased; light body 460, ui 440).
  • "+" raises the keyboard inside the tap (hidden-field hand-over), then the editor puts the caret in the title. Verified on the iPhone simulator.

Decisions to look at

  • Share is not drawn yet: sharing is out of scope, and no fake buttons. The pill is the round ⋯ alone until a page calls registerPageShare; the grouped styling is in place.
  • Pills are on the list screens and the Trash only. A note keeps its band and back button; the note's header pill needs the heading tracker for the editor's own DOM, which is a later slice. Places has no pills yet.
  • Light panels keep their old tint: v2's lighter-ink, more see-through panel failed the contrast spec (4.5:1 on dawn/day) so only v2's inks, paper, shadows and radii are taken in light. Dark panels take v2's.
  • Dark dim 30% -> 42%: on v2's nearly black paper a 30% dim was not a different colour (phone-edges needs ΔE > 2).
  • The header pill fades through its glass layer and words, not an opacity on the pill (an opacity around glass failed glass.spec's backdrop-root check).

Tests

  • New e2e/list-chrome.spec.ts (title, subtitle, H2, indent, no Today pill, pills and blur, header pill follows the list, gallery, + focus).
  • e2e/colors.ts: phone-bars and phone-edges parse oklab() (the paper now computes to it); no threshold changed.
  • contrast.spec hides the + button while measuring (a row scrolled under it measured the button).
  • chromium-390, chromium-1440, contrast: the full suite once, then the affected specs again at the final commit: all green. webkit-390 and webkit-1440: same; the only failures were a 30 s timeout of tree.spec Style sheet under host load (passes alone, in 10 s) and results-folder collisions from my own parallel runs (rerun green). Dev baseline passes touch-select, tree, bar-stays, backdrops, links, pwa-update on webkit.
  • bun run check: 0 errors, the same 12 warnings.

Screenshots and the perf table are on #511.

🤖 Generated with Claude Code

https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b

Refs #469, closes #511. Slice 1 of bringing the approved chrome mockup (`issue/469-chrome-mockup-3`) into the app. Not merged; waits for kayg. ## Ported - **Lists** (Journal, All notes, tags, Pinned, Trash; phone and desktop): group headings are H2s in the title's face, sentence case; no "Today" pill in the list rows or the note header; list/gallery as a springy morph (`morphLayout`), glass gallery cards (the shared dense step, no blur per card). The gallery keeps windowing: a band of two cards is one windowed row. - **Phone**: large title placed lower with the count as a subtitle; headings share the title's left edge, rows are indented 16 pt. - **Phone top chrome** (`apps/web/src/chrome/`): floating glass pills (back; header pill that fades in when the title scrolls away; ⋯ and, when a page registers one, Share in one grouped pill with no divider), icon sizes from the mockup (`glyph.ts`), a short progressive blur (`packages/ui/src/chrome/ProgressiveBlur.svelte`) that is `display: none` until content is under it. What ⋯ holds comes from a page-actions registry (`pages.ts`, `plugins/`), what the header says from a header-source registry (`header/`). - **Glass and look**: float tint 0.30 / 0.36, blur 20, sat 180 (already the shared values); dense step 0.48 (the mockup is finalising it); look v2 ink, paper, shadows and radii as tokens; line height 1.6 and body 17 px kept (not v2's dense scale). - **Text**: #506's commit cherry-picked (no global antialiased; light body 460, ui 440). - **"+"** raises the keyboard inside the tap (hidden-field hand-over), then the editor puts the caret in the title. Verified on the iPhone simulator. ## Decisions to look at - **Share is not drawn yet**: sharing is out of scope, and no fake buttons. The pill is the round ⋯ alone until a page calls `registerPageShare`; the grouped styling is in place. - **Pills are on the list screens and the Trash only.** A note keeps its band and back button; the note's header pill needs the heading tracker for the editor's own DOM, which is a later slice. Places has no pills yet. - **Light panels keep their old tint**: v2's lighter-ink, more see-through panel failed the contrast spec (4.5:1 on dawn/day) so only v2's inks, paper, shadows and radii are taken in light. Dark panels take v2's. - **Dark dim 30% -> 42%**: on v2's nearly black paper a 30% dim was not a different colour (phone-edges needs ΔE > 2). - The header pill fades through its glass layer and words, not an opacity on the pill (an opacity around glass failed glass.spec's backdrop-root check). ## Tests - New `e2e/list-chrome.spec.ts` (title, subtitle, H2, indent, no Today pill, pills and blur, header pill follows the list, gallery, + focus). - `e2e/colors.ts`: phone-bars and phone-edges parse `oklab()` (the paper now computes to it); no threshold changed. - contrast.spec hides the + button while measuring (a row scrolled under it measured the button). - chromium-390, chromium-1440, contrast: the full suite once, then the affected specs again at the final commit: all green. webkit-390 and webkit-1440: same; the only failures were a 30 s timeout of `tree.spec` Style sheet under host load (passes alone, in 10 s) and results-folder collisions from my own parallel runs (rerun green). Dev baseline passes touch-select, tree, bar-stays, backdrops, links, pwa-update on webkit. - `bun run check`: 0 errors, the same 12 warnings. Screenshots and the perf table are on #511. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Drops the global -webkit-font-smoothing: antialiased (it thins text on macOS) and the dark-only resets it needed. Light --body-weight 410 -> 460, --ui-weight 420 -> 440; dark unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Test: the contrast measurement sees the glass under the + button, not the button (#469, #511)
Some checks failed
CI / server (pull_request) Successful in 26s
CI / rust (pull_request) Successful in 1m59s
CI / web (pull_request) Failing after 51m32s
61faad656f
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGa6qjALuHyi8H1naGp6b
Author
Owner

Replaced by #522: rebased onto train v (dev + #518 + #519, with #513 and #520). Closing.

Replaced by #522: rebased onto train v (dev + #518 + #519, with #513 and #520). Closing.
kayg closed this pull request 2026-10-17 06:17:37 +00:00
Some checks failed
CI / server (pull_request) Successful in 26s
CI / rust (pull_request) Successful in 1m59s
CI / web (pull_request) Failing after 51m32s

Pull request closed

Sign in to join this conversation.
No reviewers
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
kayg/calternal!516
No description provided.