Skip to content

UI rework: Status / Tuning / Advanced with game-led tuning canvas#28

Merged
shiftedx merged 23 commits into
mainfrom
ui-improvements
Jun 11, 2026
Merged

UI rework: Status / Tuning / Advanced with game-led tuning canvas#28
shiftedx merged 23 commits into
mainfrom
ui-improvements

Conversation

@shiftedx

Copy link
Copy Markdown
Owner

Summary

Rebuilds the web UI from the four-route gamer HUD into a calm three-destination app per the approved design brief (docs/superpowers/specs/2026-06-10-ui-rework-design.md) and plan (docs/superpowers/plans/2026-06-10-ui-rework.md):

  • Visual system: Calm Console neutrals + PlayStation-blue accent tokens (tokens.css rewrite); Inter-only type, --font-mono for literal values; full prefers-reduced-motion support. All HUD-era chrome (grid textures, glows, ribbon) deleted.
  • IA: slim sidebar with Status (default) / Tuning / collapsible Advanced group (Controller details, Button mapping, Edge onboard slots). Old hashes (#/games, #/adaptive-triggers-haptics, #/controllers, #/button-mapping) redirect forever.
  • Status: sentence-of-truth dot, controller block with inline rename, Profile Resolution in plain words, needs-attention findings with setup-guide deep link.
  • Tuning canvas: per-game art header band with game dropdown + profile menu + telemetry chip; semantic columns (Brake · L2 / Throttle · R2 / Road feel / Lights); sticky 260px saved rail with saved→current diffs, ghost saved curves, "3s · nothing saved" preview, and a <900px bottom bar; in-canvas per-game setup guide with passive telemetry verification (listening box flips green itself) and chip re-entry.
  • Advanced: Controller details re-grouped (Live input / Connection / Power / Session readings / Support incl. Support Bundle download), Edge slots on their own gated route, button mapping re-skinned (copy/workflow untouched — smoke asserts it).

No changes to web/src/lib/api/*, web/src/lib/mock/*, web/src/lib/types.ts, or any Rust code. New pure modules: gameSelect.ts, savedDiff.ts, setupRequirements.ts, setupVerification.ts. Also fixes a pre-existing spurious "unsaved changes" state on first profile load (stale-alias read in the save-baseline capture).

Spec deviations (deliberate)

  • The spec §5 "⚙ Settings" sidebar entry was dropped at plan level; LAN access, Target Controller picker, and glyph override live in a slim utility toolbar pending a future settings home.
  • Onboarding tutorial and LAN panel copy kept current behavior per spec §15 (restyle only).

Overlap with the architecture-decomposition effort

This rework effectively decomposes App.svelte's route shells and will conflict with the companion decomposition branch in App.svelte's shell/wiring regions. App.svelte is 2,656 lines here vs 2,336 on main (+320: canvas/rail/setup wiring added, HUD shell removed); the four pure modules above are this branch's contribution toward that effort.

Accepted debt (from per-task reviews)

Menu positioning/keyboard plumbing duplicated between TuningHeader and ProfileMenu; transitional gating props on TelemetryRoutingPanel/TriggerCurvesPanel; EdgeSlotsView still uses export let; cold deep-links to guarded routes bounce until the first snapshot (pre-existing semantic); .lbl shared style lives in status.css; no unit tests for the pure modules.

Test plan

  • npm run check fully green (typecheck, source-audit, button-map, snapshot-map, haptics-graph, build, release-size, visual smoke at 3 viewports incl. 390px overflow + legacy-redirect assertions)
  • Eyes-on dev:mock walk: Status states, Tuning (Everyday / Forza with art band / zero-setup game), setup guide passive verification, saved-rail diff/discard/save, Advanced ×3 — desktop and 390px
  • Reviewer: walk npm run dev:mock per spec §11 states

🤖 Generated with Claude Code

shiftedx and others added 23 commits June 10, 2026 18:35
Design exploration artifacts for the Status/Tuning/Advanced rework:
spec, 10-task plan, PRODUCT.md register, and ignore the local
.superpowers scratch directory.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…edirects

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…adcrumbs

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t band

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace 'legacy' language with more descriptive alternatives:
- "legacy all-in-one panel" → "original all-in-one panel"
- "legacy two-curve block" → "original two-curve block"
- "Legacy panel chrome" → "Pre-canvas panel chrome"

This removes 3 source-audit findings, returning to baseline of 4.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…eaner group rows

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-entry

Selecting a game that has never produced telemetry swaps the tuning canvas
for its setup walkthrough (a canvas state, not a pop-up): numbered steps with
exact Data Out menu path and copy buttons for IP/port, plus a LISTENING box
bound to live telemetry that flips green and swaps the canvas in without a
click. Zero-setup games get a "No setup needed" reassurance with a pre-tune
offer. Verification persists per game id in localStorage; once verified the
guide only re-opens manually — via the now-clickable telemetry chip
(FRESH · setup ↗ / QUIET · fix ↗ / neutral / one-time-setup variants), the
game dropdown's setup entry, or the Status needs-attention deep link.
Telemetry loss never yanks the canvas; it only flags Status and the chip.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… a11y)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…apping reskin)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add --font-mono to :root block in tokens.css with JetBrains Mono stack
- Replace 11 hard-coded font-family instances across controllers.css and button-mapping/*.css with var(--font-mono)
- Convert font shorthand properties to longhand to use the token
- Delete unused hasPowerMetrics() function from ControllersView.svelte (zero call sites)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Delete ViewNav, ContextRibbon, GamesView, ProfileConsole, HapticsView,
HapticsAside and the stylesheets only they used (shell.css, ribbon.css,
games.css, games-catalog.css, workspace.css, haptics/profile-console.css,
button-mapping/stage.css). Still-used rules migrate to their new homes:
controller card styles into controllers.css, notice banners into
feedback.css, the RGB console and mini-button variants into the surviving
haptics files, dm-view-hidden into button-mapping/base.css.

Retire the temporary alias tokens in tokens.css and migrate every remaining
usage to the calm-console tokens; success toasts now use --ok. Prune dead
selectors from responsive.css and base.css, resolve the shell-v2 scroll-model
breadcrumbs, and reword audit-flagged comments. Update the onboarding
tutorial and controller card copy to the new IA names and copy law.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
profileSaveBaselineSignature was captured synchronously after
applyEditableConfig() reassigns forzaTuning, but currentProfileDraftValues()
read the `$:` alias variables (forzaEffects, forzaAbsTuning, ...) that Svelte
had not re-derived yet — so the baseline froze the previous (default) Forza
values and the freshly loaded config immediately compared as dirty, with no
visible diff in the saved rail. Read forzaTuning directly so the baseline and
the dirty check see the same values.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@shiftedx shiftedx merged commit ef51a81 into main Jun 11, 2026
3 checks passed
@shiftedx shiftedx deleted the ui-improvements branch June 11, 2026 15:14
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