Restyle the app in the UI language v2 foundations #238
No reviewers
Labels
No labels
No milestone
No project
No assignees
5 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Grandiras/Ponente!238
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "ui-v2-foundations"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ports the UI language v2 foundations from the canvas onto the app's current structure. Nothing about how the app behaves changes; the sidebar, inspector, Done deck, save-on-leave and Undo wait for sign-off and come as separate PRs.
What changes
--fill-*for fields, tracks and hovers,--bg-panel/--bg-group/--bg-thumb, concentric radii (panel 26 / tray 22 / card 14 / field 12 / row 10), and two-way depth. Trays are recessed (--shadow-recessed); tiles and panels are raised (--shadow-sm…xl), with shadow colours as tokens.BoardTintputs the open board'sBoardPalettecolour on:rootfor the board, its settings and its calendar; a Home tile wears its own inline. One block re-lights it in OKLCH:--brandfills; white text on it passes AA in both themes. Six of the eight palette hues fail AA at their own lightness.--brand-inkcarries accent text, icons, rings and focus.scale .97) instead of floating, and danger buttons are tinted.theme-colorfollows the new--bg-1(#292725, spec updated), the manifest splash follows the new ground,offline.htmlmatches, there is a changelog line in both locales, anddocs/frontend.md(Theming) explains the accent, chosen states and depth.Found by the e2e suite and fixed:
backdrop-filteron the header made it the containing block of its fixed children, so the nav menu's click-catcher shrank to the header and clicking outside no longer closed the menu. The blur now sits on a::beforelayer.Checked
tools/verify.shpasses (584 tests).Follow-up: the traced canvas frames now predate this look (noted in the docs). The tracer's seed no longer runs against the current schema, and a separate task fixes it and retraces.
🤖 Generated with Claude Code
🤖 Reviewing this PR — the review will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the review runs.
🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
✅ Verdict: approve — no blocking issues found.
This is a coherent restyle. It is token-driven, with the OKLCH accent block and
--brand-inksplit cleanly out, and thedocs/frontend.mdand changelog updates are in place. I read the diff only and did not run the app or the e2e suite.backdrop-filteronto.board-header::beforeis the right fix for the fixed-children containing-block regression.BoardTint: it is wired into the board, settings and calendar pages. The calendar only tints in single-board scope..request-email-none { }is now an empty rule after itsfont-stylewas removed. It could be deleted.oklch(from …)) andlight-dark(). That is fine for current evergreen browsers, but older browsers get no accent colours at all. This is worth confirming as an accepted floor.🧠 claude-sonnet-5-5 · ⏱ 0m 12s · 2 turns · tokens: 43.3k in / 1.5k out (+12.2k cache-read)
📜 Full session transcript
✅ Verdict: approve — no blocking issues found.
Good to merge. This is a large, careful restyle and the parts that could silently break check out:
BoardPalettehues re-lit at the declared lightnesses: white on--brandis ≥ ~4.75:1 in both themes (worst: teal/green in dark), and--brand-inkis ≥ ~6:1 on its surfaces. The "six of eight fail at their own lightness" premise holds too.backdrop-filterto az-index: -1::beforeinside the sticky header keeps the header out of the containing-block business for fixed children while the sticky stacking context still paints the pseudo above the scrolled content.#292725matches acrossApp.razor(both the meta tag and the head script),--bg-1dark, andprefs.spec.js; the manifest splash andoffline.htmlfollow the new ground; the two shadow e2e checks now correctly split shadows on commas outside parens and skip inset layers, and every non-inset segment still yields offsets.BoardTintwiring is clean:html:rootinHeadContentoutranks the:rootdefault and is withdrawn on unmount, the calendar only tints when a board is scoped, and the[style*="--board-color"]re-light block covers the inline cases (Home tiles,BoardPhoneBar).Minor notes, none blocking:
--warning/--warning-bgand--toast-accentare defined but not used anywhere yet (var(--warning)appears only in--warning-bg's own definition). Fine as groundwork; just confirming it's intentional.BrandMark.razor, icons) still use#7c3aedwhile the default accent is now the re-lit#7048e8— presumably the brand mark keeps its own violet, but worth a glance that the header mark doesn't visibly clash with the new default accent next to it.design/trace/build.pystill maps Figtree/Bricolage families; consistent with the docs note that traced frames predate the restyle and the tracer fix is a separate task.The one thing I'd like an answer on (see the inline finding) is the browser-support band between
light-dark()and relative color syntax — either a@supportsfallback or a documented floor.⏱ 5m 59s · 10 steps · $0.0295 · tokens: 82.0k in / 3.7k out (+323.5k cache-read) · Go: 5h 0% · wk 7% · mo 86%
📜 Full session transcript
@ -123,0 +133,4 @@icons and focus rings, which need more contrast than a fill. */:root,[style*="--board-color"] {--brand: light-dark(oklch(from var(--board-color) 0.52 min(c, 0.17) h), oklch(from var(--board-color) 0.54 min(c, 0.17) h));Compatibility question, non-blocking:
light-dark()needs Chrome 123+/Safari 17.5+/Firefox 130+, but full relative-color support starts at Chrome 131 / Safari 18.0 / Firefox 133 (caniuse marks 119–130 Chrome, 16.4–17.6 Safari, 128–132 Firefox as partial — and the older partials are exactly the gaps around math functions on channels likemin(c, 0.17)). On a browser in that band this declaration can fail at computed-value time, and since custom-property fallbacks don't help here (a broken value on--brandmakes everyvar(--brand)consumer unset, e.g. a transparent primary button with white text), the only real guard is an@supports not (color: oklch(from red 0 0 h))block with static token values. If the team has decided the floor is Chrome 131+/Safari 18+/FF 133+, this can be closed with a sentence in docs/frontend.md's Theming section; otherwise worth a fallback.Thanks to both reviewers. Addressed in the latest push: an
@supports not (color: oklch(from red 0.5 min(c, 0.17) h))block now gives browsers in the light-dark()-but-no-relative-colours band static, already re-lit brand values (no board tint), and the floor is documented in docs/frontend.md (Theming); the empty.request-email-nonerule and the unused--warning/--warning-bg/--toast-accentare gone. The brand mark keeps its own gradient on purpose:BrandMarkis the logo's source of truth (docs/brand.md), separate from the UI accent. The tracer's Figtree/Bricolage mapping is being fixed in the retrace PR stacked on this one. Full e2e ate6a0de2on an isolated stack: 156/156 passed.🤖 Reviewing this PR — the review will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the review runs.
🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
✅ Verdict: approve — no blocking issues found.
The only leftover from my last pass is resolved: the diff now deletes
.request-email-noneentirely instead of leaving an empty rule. I read the diff only. I did not run the app or the e2e suite.The earlier notes still hold:
backdrop-filteronto.board-header::beforeis the right fix for the fixed-children containing-block regression.BoardTint: it is wired into the board, settings and calendar pages. The calendar tints only in single-board scope.@supports notfallback gives older browsers brand violet, sovar(--brand)is never left unset there. Chrome before 131, Safari before 18 and Firefox before 133 get no board tint. The docs state this floor, so it reads as accepted.Before merge, confirm the e2e re-run on the head is green. The PR description said it was still in progress.
🧠 claude-sonnet-5-5 · ⏱ 0m 6s · 2 turns · tokens: 44.2k in / 901 out (+12.2k cache-read)
📜 Full session transcript
✅ Verdict: approve — no blocking issues found.
Re-review: both open items from the previous pass are resolved on the head.
@supports not (color: oklch(from red 0.5 min(c, 0.17) h))block gives browsers withlight-dark()but without relative colors (Chrome 119–130, Safari 16.4–17.6, FF 128–132) static brand violet for--brand/--brand-bright/--brand-dim/--brand-inkand matching--bg-0/--bg-2/--material, so a broken computed value on--brandcan no longer blank out the accent. The test condition is well chosen (it exercises relative color and channel math, and browsers that can't parse it evaluatenottrue), the fallback set matchesoffline.html, anddocs/frontend.md's Theming section documents the floor.--brand-glow/--brand-surfaceusecolor-mix, which the whole affected band supports, and they correctly derive from the fallback--brand..request-email-nonerule is deleted.The rest stands as reviewed: AA contrast for white on
--brandholds across the palette, the header containing-block fix is correct, the#292725theme-color value is consistent acrossApp.razor,--bg-1, the spec andprefs.spec.js, and the updated shadow e2e checks parse the new multi-layer/inset shadows correctly. The remaining minor notes from last time still hold as non-issues: unused--warningtokens are groundwork, the brand mark keeps its own violet, and the traced frames predate the restyle by design (documented).⏱ 0m 54s · 4 steps · $0.0104 · tokens: 44.4k in / 871 out (+80.3k cache-read) · Go: 5h 0% · wk 7% · mo 86%
📜 Full session transcript