Skip to content

refactor(frontend): modernize and align the design system - #1518

Merged
hmans merged 16 commits into
mainfrom
hmans/frontend-alignment-cleanup
Jul 14, 2026
Merged

refactor(frontend): modernize and align the design system#1518
hmans merged 16 commits into
mainfrom
hmans/frontend-alignment-cleanup

Conversation

@hmans

@hmans hmans commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Why

Chatto's frontend design system had accumulated overlapping token names,
numbered surfaces, decorative control gradients, and several one-off versions
of controls that already existed as shared primitives. That made ordinary UI
heavier than necessary and left agents with multiple plausible implementation
paths.

This PR simplifies that surface while keeping Chatto's IBM Plex typography,
cool-neutral palette, sky action color, indigo server identity, and restrained
conversation-first tone.

Closes #1517.

What changed

  • Reworked the color system around semantic action, foreground, and surface
    tokens; removed historical aliases and numbered surfaces; and restored a
    clearer framed light-mode hierarchy with WCAG-aware solid-fill text.
  • Modernized shared controls and layouts with flatter styling, tighter radii and
    spacing, consistent panels/tables/dialogs, and broader use of Button,
    Combobox, Checkbox, and the new accessible RangeField primitives.
  • Simplified settings and server-admin screens, unified role assignment and
    permission-matrix presentation, and added coordinated row/column hover states.
  • Streamlined sidebar and voice-call chrome: aligned the call toolbar and user
    card, replaced the fragile room label with a call-UI action, and made both
    sidebar resize separators symmetric, hoverable, accessible, and non-blocking.
  • Improved navigation and test semantics with aria-current, semantic E2E
    locators, and explicit foreground tokens for badges and status indicators.
  • Updated the design-system documentation, agent guidance, automated guardrails,
    Storybook catalog, component/E2E coverage, and Darwin/Linux visual baselines.

Compatibility and rollout

  • Frontend-internal only: no protobuf, public API, persistence, permission,
    deployment, or migration changes.
  • User workflows are preserved; the intended changes are visual hierarchy,
    internal component reuse, interaction polish, and accessibility semantics.

Test plan

  • mise lint-frontend — passed (design guardrails, Paraglide, Svelte check,
    ESLint; 0 diagnostics)
  • mise test-frontend — passed (250 files, 2,104 tests)
  • Targeted Playwright accessibility, notification-badge, and composer-focus
    regressions — passed (4 tests)
  • Storybook build and Storybook tests — passed
  • Darwin and Linux visual baselines — reviewed in light/dark desktop/mobile
  • Latest GitHub Actions run — passed: frontend, CLI, license, codegen drift,
    media E2E, and all four standard E2E shards

The in-app browser connection was unavailable in this workspace. Visual review
used the browser-rendered committed baseline suite and user-provided screenshots;
live-state behavior used Playwright E2E coverage.

@hmans
hmans marked this pull request as ready for review July 14, 2026 08:06
@hmans hmans changed the title refactor(frontend): simplify the design system refactor(frontend): modernize and align the design system Jul 14, 2026
@hmans
hmans merged commit 64f7287 into main Jul 14, 2026
12 checks passed
@hmans
hmans deleted the hmans/frontend-alignment-cleanup branch July 14, 2026 16:20
hmans added a commit that referenced this pull request Jul 15, 2026
…e-mapping

* origin/main: (35 commits)
  feat(frontend): add inline message timestamps (#1558)
  docs(architecture): improve inventory readability (#1555)
  perf(connect): reuse DEKs across request hydration (#1554)
  docs(architecture): split runtime inventory by category (#1552)
  fix(core): decrypt projected user PII on demand (#1551)
  fix(frontend): avoid blank line when enabling rich mode (#1548)
  feat(rooms): add joinable room previews (#1546)
  feat(core): bound projection snapshot cleanup (#1538)
  fix(frontend): restore subtle design colors (#1545)
  fix(core): preserve cleared RBAC defaults (#1543)
  fix(pwa): use server name for installed app (#1542)
  fix(frontend): show pending permission updates (#1540)
  fix(frontend): collapse invisible markdown spacing (#1539)
  feat(frontend): expand lazy-loaded locale support (#1537)
  refactor(frontend): modernize and align the design system (#1518)
  feat(core): add encrypted projection snapshot canary (#1488)
  fix(frontend): allow app-wide mobile sidebar swipes (#1534)
  ci: add remote server compatibility smoke test (#1531)
  feat(frontend): add regional English locales (#1532)
  fix(frontend): support remote-only sessions (#1530)
  ...

# Conflicts:
#	cli/internal/core/external_identities.go
#	docs/ARCHITECTURE.md
#	docs/adr/INDEX.md
#	docs/fdr/FDR-001-roles-and-permissions.md
tha23rd added a commit to tha23rd/chatto that referenced this pull request Jul 16, 2026
Upstream's design-system realignment (chattocorp#1518) shifted the dark ladder one step
darker, anchoring `--color-background` at `neutral-950` (#0a0a0a). That reads as
pure black and is what people have been complaining about. Anchor the dark theme
at Discord's chat plane (#313338) instead and retint the surface ladder, text,
input and accent tones to Discord's palette.

The surface ladder still rises from `background`, which is deliberately not
Discord's arrangement (Discord's sidebar is darker than its chat plane).
Inverting it would push Chatto's ~105 `surface` consumers — panels, dialogs,
menus — below the page and make them read as holes instead of raised cards.

Raising the background costs every foreground ~2-3 stops of contrast, so several
tokens had to move to hold WCAG AA:

- `muted` -> Discord's --interactive-normal (#b5bac1). It renders on
  `surface-emphasized` too, where Discord's own --text-muted manages only
  3.55:1.
- `action` -> the light end of the blurple family (#a5b4fc). The token both fills
  buttons and paints accent text/icons at 24 sites; Discord's exact #5865f2 is a
  dark accent that carries white as a fill but reaches only 2.74:1 as text.
  Splitting fill and text roles the way Discord does is left as follow-up.
- `server` -> violet-300. indigo-400 drops to 4.24:1, and indigo-300 is now
  exactly `action`, which would collapse the server pill into the action accent.
- `presence-offline` -> Discord's offline grey, the only presence tone needing a
  dark override; gray-500 fails even the 3:1 non-text bar here.
- Syntax `comment`/`keyword` -> GitHub's dark *high-contrast* variants, since code
  blocks render on far lighter surfaces than before.

Also fix two hardcoded colours that upstream left behind when chattocorp#1518 moved the
token: the pre-hydration background hint in app.html still painted #171717 and
the dark `theme-color` meta still declared #262626, so first load flashed from
the old colour to the new one. Both now track `--color-background`.

Add dark-theme accessibility scans. The existing route scans run under
Chromium's default light colour scheme, so they cannot see a dark-only contrast
regression — the `muted` and `action` failures above were invisible to every
other check in the suite and only surfaced once dark was scanned directly.

Light theme is untouched.

Co-authored-by: tha23rd <zgbluhm@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

refactor(frontend): simplify and modernize the design system

1 participant