8.7 KiB
Change Request CR-005 — UI Overhaul
Project: Deadhead: Space Freight Tycoon
Applies to: a build with Phases 1–10, CR-001, CR-002, CR-003 and CR-004 complete
Do this: as Phase 10E, after Phase 10D and before Phase 11
Related docs: implementation-plan.md, CR-003-map-art.md, DECISIONS.md
1. Why
Every screen except the map is plain slate cards with small text, and navigation is a row of seven small text links at the bottom of the screen. It works, but it doesn't look or feel like a game. The map art from CR-003 is the only place the game's look shows up.
This change gives the whole client one visual identity, a "freight terminal HUD": deep-space backgrounds, glowing amber and cyan accents, a techy display font for headings and numbers, big icon navigation, and the existing planet and ship art used on the screens, not just the map.
It is presentation only. No game rules, API calls, copy or accessible names change, so the existing client tests are the regression suite for this phase.
2. Visual direction
| Element | Direction |
|---|---|
| Background | The map's bg.webp behind every screen, dimmed under a navy gradient, so all screens are "in space". |
| Surfaces | Translucent navy panels with a thin cool border, a soft inner highlight and corner brackets on feature panels. |
| Accents | Amber = primary actions and the player's selection. Cyan = in flight and info. Emerald = money in and success. Rose = errors and blocks. Fuchsia = scripted story jobs. |
| Type | Chakra Petch (display: headings, numbers, tab labels, buttons, uppercase eyebrow labels) and Barlow (body). Self-hosted with @fontsource, so it works offline (Phase 11 PWA). |
| Numbers | Credits, payouts and countdowns use the display font with tabular figures; key numbers are large. |
| Navigation | Icon and label tabs. Phone: a bottom bar with 24 px icons and a glowing active indicator. Desktop (≥ 768 px): a left rail. Small badges call attention to things waiting for the player. |
| Art | The map's sprites (public/assets/map-gen): ship art on Fleet, Market and the dispatch sheet; planet art on Locations, the contract cards' route, the map panels and HQ. |
| Motion | Screens fade and rise in; buttons press down; claimable goals and ready badges pulse gently. All motion is off under prefers-reduced-motion. |
3. Rules for this change
- All rules in
implementation-plan.md§0.1 apply: steps in order, one commit per step, each step's test must pass, andprogress.mdis updated after every step. - No behavior changes. Visible copy, roles and accessible names stay as they are, except where a step says otherwise. Existing tests must keep passing without edits to their assertions (a test may change only to follow a renamed or moved element that a step names).
- Styling goes through the UI kit and theme tokens (Step 10E.1–10E.2). Screens should not hard-code the old
slate-*palette. - No new art. Screens reuse the generated map sprites; the map's style config (
map/style.ts) stays the map's own. - Visual quality is a manual check: steps marked "manual check" end with desktop and phone screenshots in
docs/screenshots/, named inprogress.md. Stop for the user's review at the end of Phase 10E.
4. Decisions
Record these in DECISIONS.md (as plan §0.5.47–0.5.51).
- 0.5.47 Visual identity. One "freight terminal HUD" look for the whole client (§2): space background, translucent panels, amber/cyan/emerald/rose/fuchsia accent roles, Chakra Petch + Barlow, self-hosted.
- 0.5.48 Tokens and kit. Colors, fonts, radii, shadows and motion are Tailwind theme tokens in
apps/web/src/index.css. Shared components (buttons, panels, sheets, stat tiles, meters, pills, screen headers, art) live inapps/web/src/ui/. Screens compose these. - 0.5.49 Navigation. Icon tabs, bottom bar on phones and a left rail from 768 px wide. Tab order and labels are unchanged. Attention badges are decorative (
aria-hidden), so each tab's accessible name stays its label; the same information is on the screens. - 0.5.50 Art on screens. Ships and locations show their content
spritefrom the generated map art, as plain<img>with emptyalt(the name is always in text next to it). A missing image hides itself, matching decision 0.5.41. - 0.5.51 Presentation only. The overhaul changes no game rules, API calls, copy or accessible names (§3).
5. Steps — Phase 10E
Step 10E.1 — Fonts, theme tokens and backdrop
- Add
@fontsource/chakra-petchand@fontsource/barlow. Define theme tokens inindex.css(@theme): fonts, the panel/ink color scale, accent colors, glow shadows and keyframes (rise-in, pulse). Body uses Barlow; a global backdrop showsbg.webpunder a dark gradient. - Respect
prefers-reduced-motionglobally. - Test: a test reads
index.cssand checks the font families, the backdrop image and the reduced-motion rule are present.
Step 10E.2 — UI kit
src/ui/:Button(primary, secondary, ghost, success, danger; sizes; pressed feedback),Panel(plain, feature with corner brackets, tone),Sheet(modal shell: backdrop, bottom sheet on phones, centered card fromsm),StatTile,Meter(labelledprogressbar),Pill,ScreenHeader(eyebrow, title as the screen'sh1, subtitle),Art(sprite image), and the icon set used by navigation and screens.- Test:
ui-kit.test.tsx: buttons keeptype="button"and forwarddisabled;Meterexposes progressbar values;Sheetis anaria-modaldialog labelled by its title;ScreenHeaderrenders a level-1 heading;Artresolves sprite URLs and hides on error.
Step 10E.3 — App shell
- HUD header: logo mark and wordmark, credits in a glowing chip, game clock chip. The
CreditsandGame clocklabels stay. - Navigation per decision 0.5.49: bottom icon bar on phones, left rail from
md. Badges: HQ = goals ready to claim; Jobs = idle crewed ships not resting; Pilots = pilots with unspent skill points. Computed by a puretabAttention(state). - The map screen fills exactly the space left by the new header and navigation on both layouts.
- Test: existing
layout.test.tsxpasses; new tests fortabAttentionand for a badge appearing without changing the tab's accessible name.
Step 10E.4 — HQ dashboard
- Company hero (name, credits large), icon stat tiles, a "Next arrival" panel with a route strip and live progress, pilot rest, the tutorial card as a story panel, goals with reward pills, the loan with a meter.
- Test: existing HQ, goals, loan and rest tests pass. Manual check.
Step 10E.5 — Contracts and dispatch
- Location switcher as planet chips. Contract cards: a route strip (origin art → line → destination art), cargo and mass, a large payout, requirement pills, expiry, and a prominent Dispatch button. The tutorial board gets the same card, with suggested and scripted variants. The dispatch sheet uses the
Sheetand shows each ship with its art and the numbers as stat tiles. - Test: existing contracts, tutorial board, dispatch and board refresh tests pass. Manual check.
Step 10E.6 — Fleet and Market
- Ship cards with ship art, a status pill (idle, in flight), the route and a progress meter in flight, and actions as buttons. The deadhead picker uses
Sheet. Market cards are "showroom" cards: large art, price, and stat meters for speed, capacity and range relative to the best model, plus landing class. - Test: existing fleet and market tests pass. Manual check.
Step 10E.7 — Pilots
- Pilot cards with an initials badge, level and XP meter, skills as pips out of their maximum with a raise button, the duty meter (amber, rose when near the limit) or rest status, and actions as buttons. The hire panel becomes a feature panel.
- Test: existing pilots and duty tests pass. Manual check.
Step 10E.8 — Locations, map panels, start screen and dialogs
- Location cards with planet art, details as a compact spec list, the HQ status pill and the lease button. Undiscovered locations show dimmed art and a lock. The map's location and flight panels get the panel style with art. The start screen becomes a title screen over the space backdrop, with the sun and planets. The away summary and the deal use
Sheet. - Test: existing locations, map interaction, onboarding, away summary and deal tests pass. Manual check.
Step 10E.9 — Regression and review
- Full suite, coverage, lint, typecheck and web build green. Screenshots of every screen at desktop and phone width (tutorial and mid-game). Phase 10E complete — stop for review.
6. Amendments to earlier steps
- Step 8.2 (layout): the header and bottom navigation are restyled per decision 0.5.49; desktop uses a left rail.
- Step 11.1 (PWA): the self-hosted font files are part of the offline asset cache.