Skip to content

feat(ui,web): consume the design system everywhere + brand distinctiveness pass#127

Merged
Zach Dunn (zachdunn) merged 5 commits into
mainfrom
claude/design-system-agents-plan-55542f
Jul 13, 2026
Merged

feat(ui,web): consume the design system everywhere + brand distinctiveness pass#127
Zach Dunn (zachdunn) merged 5 commits into
mainfrom
claude/design-system-agents-plan-55542f

Conversation

@zachdunn

Copy link
Copy Markdown
Member

Follow-up to #121, executing the brand-distinctiveness handoff
(.context/2026-07-13-uploads-brand-distinctiveness-handoff.md). An /impeccable audit
(three parallel auditors; full report + plan in
.context/2026-07-13-impeccable-audit-and-agent-plan.md) scored the tree 10/20, with one
root cause behind most findings: the design system existed but 13 of 14 pages didn't
consume it. This PR fixes the architecture, the audit's a11y/responsive findings, and
ships the first distinctiveness pass with the agreed direction (mono-first, evolve the
purple, no left stripes).

What changed

1. One design-system pipeline (was: 11 hand-copied :root blocks)

  • New BaseHead.astro gives every page the @uploads/ui stylesheet, favicon, and font
    preloads; all inline token blocks and renamed aliases (--ok, --danger, --purple,
    --bezel, --cyan, --purple-dim) are gone.
  • One font pipeline: dropped @fontsource-variable/geist{,-mono} and a duplicate
    checked-in Geist Pixel binary (the build shipped byte-identical woff2s twice). Auth +
    admin pages now actually load Geist Mono (they declared it but never loaded it);
    public gallery pages get the brand fonts back.
  • Brand.astro now mirrors Brand.tsx (ul-brand classes) instead of a drifted fork
    with a hardcoded mark fill.

2. A11y + responsive fixes (audit P1/P2s)

  • Live regions: console #out, admin invite status, all copy buttons; Callout uses
    role="alert" for errors; Field renders a real associated <label>.
  • Headings: sr-only <h1> on console/account/admin/gallery item; landing section heads
    are real <h2>s; panel switcher moves focus.
  • Docs TOC no longer slides off-screen at 1200–1220px; landing header wraps at 320px;
    touch-target bumps; --muted lifted to #8a8a83 (~5.5:1 on panel); reduced-motion
    fallback for the file spinner; account file browsers mount lazily.

3. Distinctiveness pass (per the handoff levers)

  • Callouts speak CLI. The left-stripe status block (the audit's one confirmed AI
    tell, hand-copied on 5 pages) is replaced by the product's own output grammar: a
    tone-colored >> marker, mono text, hairline border + faint tint. Works via modifier
    class or data-state, so the plain-HTML auth pages share the exact DS treatment.
  • Accent evolves #b794ff#c27eff (more chroma, still 7.3:1 on bg).
  • The wordmark morphs. Geist Pixel's ELSH axis animates Square→Circle on
    hover/focus, gated on prefers-reduced-motion.
  • Chevron motif spreads: Divider chevron variant; GalleryTile empty thumbs show
    the faint stacked-chevron mark.
  • .ul-surface body face is mono by intent (CLI-first identity); impeccable
    overused-font ignores persisted for Geist/Geist Mono with the recorded rationale.

Screenshots

Home (1280) Login — new callouts Home (375)
Homepage after the brand pass Login with the new CLI-voice callouts Homepage at 375px

Verification

  • pnpm --filter @uploads/ui typecheck, astro check (0 errors), @uploads/web
    vitest 4 files / 24 tests green, full astro build green.
  • Browser-verified on the dev server: all three Geist faces load on every checked route,
    zero console errors, callout tones render via both class and data-state, mobile
    header wraps at 375px.
  • Deterministic impeccable detector: zero side-tab findings remain (was the flagged
    tell); remaining warnings are the persisted font decision and prose-style nits.

Not in this PR

  • Claude Design re-sync of the "Uploads" project — the .ds-sync harness is
    ephemeral and needs regeneration; spun off as a follow-up task.
  • invite.astro still uses a system-mono body stack by design of this pass (never
    referenced the brand tokens); candidate for the next mono-first sweep.

- BaseHead.astro: shared head baseline importing @uploads/ui/styles.css
  with font preloads and the shared favicon
- Brand.astro: mirror Brand.tsx (ul-brand classes, var(--panel) mark fill,
  href/size/label props) instead of a drifted fork
- one font pipeline: drop @fontsource-variable/geist{,-mono} and the
  duplicate checked-in Geist Pixel binary; all three woff2s now ship
  from packages/ui/fonts via @uploads/ui/styles.css
- @uploads/ui: export ./fonts/* for preload URLs
Replace 11 hand-copied :root token blocks and per-page favicon/meta
boilerplate with the shared BaseHead component. Canonicalize renamed
tokens (--ok/--green-ok to --green, --danger to --red, --purple to
--accent, --bezel to --line, --cyan to --body, --purple-dim to --muted)
and swap radius literals matching DS tokens to var(--radius-*).

Intended visual fixes riding along: auth + admin surfaces now actually
load Geist Mono Variable (was declared but never loaded), and the
public gallery pages get the brand font stacks back.
- live regions: console #out, admin .invite-status, copy buttons
- Callout: role=alert for error tone; Field: real label association
- sr-only h1 on console/account/admin/gallery item; sect-head p to h2
- panel switcher moves focus to shown panel heading
- docs TOC breakpoint 1200 to 1240px (calc went negative below 1220)
- landing header wraps; star count hidden under 420px
- touch targets: ul-btn--sm, login submit, sidebar nav padding bumps
- muted token #7d7d77 to #8a8a83 (4.5:1 to ~5.5:1 on panel)
- reduced-motion fallback for file spinner; aria-hidden on decorative
  icons; aria-current on active breadcrumb
- account file browsers mount via IntersectionObserver
…ent, ELSH morph

- Callout: replace the left-stripe status block with the uploads CLI's own
  output grammar — a tone-colored '>>' marker, mono text, hairline border
  with a faint tone tint. Tone works via modifier class or data-state so
  the plain-HTML auth pages share the exact DS treatment; the five pages'
  hand-rolled .status CSS is deleted in favor of ul-callout classes
- accent evolves #b794ff -> #c27eff (more chroma, still 7.3:1 on bg);
  all fallback literals and the favicon updated
- Brand wordmark morphs along Geist Pixel's ELSH axis on hover/focus
  (Square 1 -> Circle 20), gated on prefers-reduced-motion
- Divider gains a chevron variant; GalleryTile's empty thumb shows the
  faint stacked-chevron mark instead of a bare gray box
- Surface body face is now mono by intent (CLI-first identity)
- persist impeccable overused-font ignores for Geist/Geist Mono with the
  recorded rationale
@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are limited based on label configuration.

🏷️ Required labels (at least one) (2)
  • coderabbit:review
  • review
🚫 Excluded labels (none allowed) (1)
  • wip

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: af413b4b-4805-49fd-8159-4b58851f36fa

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/design-system-agents-plan-55542f

Comment @coderabbitai help to get the list of available commands.

@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
uploads-api c21fddf Commit Preview URL

Branch Preview URL
Jul 13 2026, 03:27 PM

@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
uploads-auth c21fddf Commit Preview URL

Branch Preview URL
Jul 13 2026, 03:27 PM

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 13, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
uploads-web 2a760e2 Commit Preview URL

Branch Preview URL
Jul 13 2026, 03:35 PM

Port the branch's work onto the #125/#126 restructure:
- AccountLayout/AdminLayout adopt BaseHead (DS tokens/fonts/favicon);
  SITE_FAVICON removed from signed-in-page.ts
- signed-in-shell.css drops its :root copy and the side-stripe .status;
  session-gate blocks render as ul-callout (data-state=error for denied)
  and each shell gets an sr-only h1
- workspaces.astro: file browsers mount via IntersectionObserver;
  invite copy buttons announce via aria-live
- account-shell.ts taken from main wholesale (hash-panel focus fix is
  obsolete under path-based navigation)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant