feat(app,site): post-refactor UI review pass#16
Merged
Conversation
Audit and polish the surfaces left inconsistent by the Catalyst utility-first refactor series. The review follows the web-design-reviewer workflow: capture a baseline, audit drift, apply fixes, re-capture, and ship recordings as evidence. PR1: replace `font-display` with `font-heading` across the auth routes, the brand wordmark, and the recipes doc. The canonical heading utility per tokens.md is `font-heading`. PR2: tighten the `app-auth-layout` sticky header. Drop duplicate background utilities, make sticky behavior unconditional so the chrome stays reachable on mobile after scroll, replace `min-h-[calc(100vh-64px)]` with `min-h-dvh`. PR3: tighten `app-auth-card` mobile padding to a 24px floor. Add `data-od-id="submit"` to every auth route's primary CTA and `data-od-id="brand"` to the brand link for visual e2e. PR4: add `scripts/capture-ui-snapshots.cjs` driving a structured snapshot grid (12 site PNGs + 60 auth PNGs) against a single BASE_URL, regenerate auth flow recordings, bump version to 1.5.0, update roadmap. Bonus: fix activation page tab bindings. The previous `[class.bg-white dark:bg-zinc-950]` threw `InvalidCharacterError` in Angular's renderer on every SSR render. Follow recipes.md: split each multi-class binding into per-mode `[class.X]` entries. Replaces the retired `text-accent` token with `text-blue-600` / `dark:text-blue-500` per tokens.md. Unblocks 2 activation e2e specs. Verification: app:lint, app:typecheck, app:vite:test, site:lint, ui-designer:lint, app-e2e:e2e (44/44), site-e2e:e2e all pass. Static guards confirm zero `font-display`, zero duplicate auth layout utilities, zero broken multi-class bindings, and the expected `data-od-id` hook counts. See docs/specs/2026-06-27-post-refactor-ui-review/ for the full SDD.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Audit and polish the surfaces left inconsistent by the Catalyst utility-first refactor series (Catalyst Angular foundation, pure tokens alignment, site utility-first migration, UI designer app). The review follows the
web-design-reviewerworkflow: capture a baseline, audit drift, apply focused fixes, re-capture, and ship recordings as evidence.Spec
docs/specs/2026-06-27-post-refactor-ui-review/— full SDD, plan, requirements, and validation log.Changes
Auth heading utility alignment (PR1)
Replace
font-display(a non-canonical alias) withfont-heading(the canonical utility pertokens.mdandrecipes.md) in 10 source locations: the auth route templates (sign-in,sign-up,verify-email,verify-device,forgotten-password,reset-password), the brand wordmark (logo.html), and theapp-auth-layoutbrand link.Auth layout shell (PR2)
Drop duplicate background utilities (
bg-white sm:bg-white,dark:bg-zinc-950 dark:bg-zinc-950/85) in theapp-auth-layoutsticky header and replace the magicmin-h-[calc(100vh-64px)]withmin-h-dvhso the auth card centers regardless of header height. The sticky behavior is now unconditional across breakpoints so the chrome stays reachable on mobile after scroll.Auth card padding + chrome hooks (PR3)
Tighten
app-auth-cardmobile padding frompx-5to apx-6floor. Adddata-od-id="submit"to every auth route's primary CTA (sign-in, sign-up, forgotten-password, two in reset-password) anddata-od-id="brand"to the brand link so visual e2e suites can target the chrome without relying on accessible names.Capture scripts + recordings (PR4)
Add
scripts/capture-ui-snapshots.cjsdriving a structured snapshot grid (12 site PNGs + 60 auth PNGs) against a singleBASE_URL(gateway at:8081), regenerate the auth flow recordings (mobile 825 KB, HD 1.4 MB), bumpapps/web/app/version.jsonto1.5.0, and update the roadmap with the new phase entry.Bonus: activation page tab bindings
The previous
[class.bg-white dark:bg-zinc-950](a multi-class string in one binding) threwInvalidCharacterErrorin Angular's renderer on every SSR render. Split into per-mode[class.X]entries perrecipes.mdand replace the retiredtext-accenttoken withtext-blue-600/dark:text-blue-500pertokens.md. This unblocks two previously failingapp-e2especs (can generate an API key and see it displayed once,shows seed configuration section).Visual evidence
media/ui-snapshots/site-{en,es}-home-{375,768,1280}-{light,dark}.png— 12 site PNGsmedia/ui-snapshots/auth-{sign-in,sign-up,forgotten-password,verify-email,verify-device,reset-password}-{360,390,520,768,1280}-{light,dark}.png— 60 auth PNGsmedia/auth-flow-videos/auth-flow-iphone-13-mini.webm— full auth flow on mobilemedia/auth-flow-videos/auth-flow-hd-1920x1080.webm— full auth flow on desktopVerification
pnpm nx run app:lintpnpm nx run app:typecheckpnpm nx run app:vite:testpnpm nx run site:lintpnpm nx run ui-designer:lintpnpm nx e2e app-e2epnpm nx e2e site-e2eStatic guards confirm:
font-displayinapps/web/app/srcapp-auth-layout(sm:bg-white,dark:bg-zinc-950 dark:bg-zinc-950)min-h-[calc(100vh-64px)]magic constantsactivation.htmldata-od-id="submit"+ 1data-od-id="brand"hooksRisks
app-e2epre-commit hook. The fix follows the documented contract (recipes.md,tokens.md) and has no behavioral effect beyond restoring SSR rendering of the page.astro previewserver does not serve_astro/static assets in middleware mode. The capture script tolerates either base URL viaBASE_URL; the canonical workflow usesastro devfor the site half, but a single gateway run covers both halves and is the documented default.Follow-ups (P3)
apps/web/app/src/app/shared/layout/sidebar-menu/sidebar-menu.html:34usesfocus:outline-primary(not a Tailwind utility); replace withfocus-visible:outline-blue-600 dark:focus-visible:outline-blue-500.apps/web/site/src/pages/docs/index.astrostill referencesbg-slate-*in its hero card; re-verify after the next site migration.🤖 Generated with opencode