UI rework: Status / Tuning / Advanced with game-led tuning canvas#28
Merged
Conversation
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>
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
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):tokens.cssrewrite); Inter-only type,--font-monofor literal values; fullprefers-reduced-motionsupport. All HUD-era chrome (grid textures, glows, ribbon) deleted.#/games,#/adaptive-triggers-haptics,#/controllers,#/button-mapping) redirect forever.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)
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);.lblshared style lives in status.css; no unit tests for the pure modules.Test plan
npm run checkfully green (typecheck, source-audit, button-map, snapshot-map, haptics-graph, build, release-size, visual smoke at 3 viewports incl. 390px overflow + legacy-redirect assertions)dev:mockwalk: Status states, Tuning (Everyday / Forza with art band / zero-setup game), setup guide passive verification, saved-rail diff/discard/save, Advanced ×3 — desktop and 390pxnpm run dev:mockper spec §11 states🤖 Generated with Claude Code