Skip to content

fix(web): cross-discipline UI review fixes for the primary flow - #169

Merged
ZingerLittleBee merged 12 commits into
mainfrom
fix/ui-review-fixes
Aug 2, 2026
Merged

fix(web): cross-discipline UI review fixes for the primary flow#169
ZingerLittleBee merged 12 commits into
mainfrom
fix/ui-review-fixes

Conversation

@ZingerLittleBee

Copy link
Copy Markdown
Owner

Summary

A full cross-discipline interface review (accessibility, layout, writing, typography, colors, visual polish) of the highest-traffic flow — login → dashboard → server list → server detail — surfaced 32 verified issues. This PR fixes all of them across 9 commits.

High-severity fixes

  • Login errors shown as raw backend English (Unauthorized): now mapped to localized messages by HTTP status, with role="alert", aria-invalid, and focus management (d74158b5)
  • Offline servers dimmed to unreadable (measured 1.82:1 contrast under the scrim): replaced overlay/opacity with grayscale + bg-muted/40, text keeps full-contrast tokens — now 17.5:1 (7e98534c)
  • 320px viewport clipped card grid (WCAG 1.4.10 reflow failure): minmax(min(320px,100%),1fr) + min-w-0 cards (7e98534c)
  • Login page unreachable submit on short viewports: root h-dvh, fullscreen routes own their scrolling via ScrollArea (d74158b5)
  • Card network data invisible to keyboard/screen readers: tooltip triggers restored to focusable buttons; square grids expose a role="img" summary label (721e78e4)

Medium fixes

  • Dashboard switcher rendered a raw UUID due to a value-before-items race in the Base UI Select — label now resolves from the same data (47d2e540)
  • Grid search with no matches rendered a blank screen: dedicated empty state with "Clear search", shared by grid/table views (7e98534c)
  • Bulk delete confirm now restates count and consequences with proper plural keys (7e98534c)
  • Nested <main> landmarks deduped + site-wide skip link (47d2e540)
  • Status colors converged behind --status-healthy/warning/danger semantic tokens; stale Tailwind v3 hexes removed; three divergent getLossTextClassName copies unified (11740850)
  • transition-all removed from shared primitives so focus rings no longer fade in (11740850)
  • tabular-nums on all high-frequency metric numbers (721e78e4)
  • document.documentElement.lang now follows the active language (d74158b5)
  • Enrollment vocabulary unified (zh no longer mixes 注册码/Offer/Enrollment Offer/Agent Authority); hardcoded load / 5m ago strings localized via existing helpers (2006aaca)

Polish

  • Card surfaces aligned with the Card primitive (ring-1 instead of border+shadow), concentric inner radii, clearer group spacing, no sub-10px font sizes, truncated names get title, online dot no longer shares animate-pulse with skeletons (9a3eed9e)
  • Root-level antialiased, CJK font fallback stack, dark-mode --muted-foreground raised to APCA Lc 62.5, chart series palette tokenized as --chart-series-* (literal values to dodge Tailwind v4 theme tree-shaking) (dbc95a08)
  • sr-only <h1> landmarks on dashboard/servers pages, detail-page header focus order fixed, "HEALTHY/Healthy" stat card now shows real status (and no longer reports "No data" when all servers are offline), English sentence case sweep + i18next plural keys, icon sizes returned to primitive defaults (1b948632)

Deliberately deferred

  • Breadcrumb current-page entry on detail routes (needs a new data subscription in the app shell; detail pages already have an h1 + back link)
  • nav_* keys stay Title Case until the settings page titles are swept in the same change
  • ~15 remaining hand-rolled rounded-lg border bg-card surfaces app-wide (separate refactor)

Test plan

  • cargo-independent frontend suite: 730/730 tests pass, bun run typecheck clean, ultracite check clean (500 files)
  • Browser-verified against the seeded dev-demo stack in both themes: localized 401/429 errors with full a11y announcement chain, 320px reflow without clipping, offline card contrast, switcher label under injected 1.2s API delay, skip link, tab order on the detail header, chart series colors
  • New regression tests added: offline card must not use opacity/scrims, cards must shrink below 320px, no sub-10px font tiers, pulse must stay off the online dot, relative-time formatting

connect_agent returns when the client handshake completes, but the server
registers the agent in the async upgrade callback. On slow CI the terminal
handshake could hit the unaudited agent-offline rejection instead of the
audited capability gate, failing the audit assertion.
The handler persists the IP columns before writing the audit row, so
observing the updated IP does not guarantee the audit insert is visible
yet on slow CI.
Disconnect cleanup clears docker viewers after the ServerOffline
broadcast; on slow CI the reconnecting agent could observe the stale
viewer set and receive docker start frames the test asserts against.
Poll the persisted feature list, whose docker removal is the cleanup's
final step.
@ZingerLittleBee
ZingerLittleBee merged commit 9f70a3c into main Aug 2, 2026
3 checks passed
@ZingerLittleBee
ZingerLittleBee deleted the fix/ui-review-fixes branch August 2, 2026 16:03
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