diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index cc129f4..193f2e5 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -64,11 +64,7 @@ export function App() { const retry = () => void state.refetch(); if (state.isPending) { - return ( -

- Loading… -

- ); + return

Loading…

; } if (state.data === undefined) { // The first load failed: nothing to show yet. diff --git a/apps/web/src/GameRoot.tsx b/apps/web/src/GameRoot.tsx index 3428ea5..fdc6610 100644 --- a/apps/web/src/GameRoot.tsx +++ b/apps/web/src/GameRoot.tsx @@ -84,11 +84,7 @@ export function GameRoot({ game, children }: { game: Game; children: ReactNode } }; if (status === "starting") { - return ( -

- Loading… -

- ); + return

Loading…

; } if (status === "elsewhere") { return ( diff --git a/apps/web/src/components/AwaySummary.tsx b/apps/web/src/components/AwaySummary.tsx index 4e73520..6e91116 100644 --- a/apps/web/src/components/AwaySummary.tsx +++ b/apps/web/src/components/AwaySummary.tsx @@ -356,9 +356,7 @@ function Totals({ summary }: { summary: Summary }) { > {figures.map(([label, value, tone]) => (
-
- {label} -
+
{label}
{value}
))} @@ -382,7 +380,7 @@ function PilotLines({ summary }: { summary: Summary }) { })} {line.leveledUp && ( - + {words.leveledUp} )} diff --git a/apps/web/src/components/DealModal.tsx b/apps/web/src/components/DealModal.tsx index 07717b0..d06fd61 100644 --- a/apps/web/src/components/DealModal.tsx +++ b/apps/web/src/components/DealModal.tsx @@ -57,26 +57,22 @@ export function DealModal() {

-
- You get -
+
You get
A {courier.name} for you, a {clipper.name} for {veteran.name}, and a bay at {bay.name}
-
Pilot
+
Pilot
…and {veteran.name}. {veteran.bio}
-
Loan
+
Loan
{formatCredits(dealLoanAmount)}
-
- Repayment -
+
Repayment
{Math.round(loanRepaymentShare * 100)}% of every payout until it's paid off
diff --git a/apps/web/src/components/FleetSleep.tsx b/apps/web/src/components/FleetSleep.tsx index a1a9da4..448d47d 100644 --- a/apps/web/src/components/FleetSleep.tsx +++ b/apps/web/src/components/FleetSleep.tsx @@ -63,7 +63,7 @@ export function FleetAsleep() { if (!fleetQuiet(state)) return null; return ( -

+

Fleet asleep — waiting for your orders

diff --git a/apps/web/src/components/GoalsCard.tsx b/apps/web/src/components/GoalsCard.tsx index db4f315..df8521d 100644 --- a/apps/web/src/components/GoalsCard.tsx +++ b/apps/web/src/components/GoalsCard.tsx @@ -14,7 +14,7 @@ export function GoalsCard() { if (next.length === 0) return null; return ( - +

Goals diff --git a/apps/web/src/components/IndependentPilots.tsx b/apps/web/src/components/IndependentPilots.tsx index 852575c..af5d44e 100644 --- a/apps/web/src/components/IndependentPilots.tsx +++ b/apps/web/src/components/IndependentPilots.tsx @@ -22,7 +22,7 @@ export function DispatchOfficePanel() { if (state.dispatchOffice.owned) { return ( -

+

Dispatch Office

@@ -37,8 +37,8 @@ export function DispatchOfficePanel() { ); } return ( - -

Dispatch Office

+ +

Dispatch Office

Lets your hired pilots run jobs on their own, so the company keeps earning while you're away. @@ -100,9 +100,7 @@ export function PilotIndependence({ pilot }: { pilot: Pilot }) { return (

- - Flies - + Flies
{(["manual", "independent"] as const).map((mode) => (
); diff --git a/apps/web/src/components/Service.tsx b/apps/web/src/components/Service.tsx index ea60db8..2889459 100644 --- a/apps/web/src/components/Service.tsx +++ b/apps/web/src/components/Service.tsx @@ -275,7 +275,7 @@ export function ServiceSection({ shipId }: { shipId: string }) { className="mt-4 rounded-xl border border-space-600 bg-space-900/60 p-3 text-sm" >
- Service + Service {booking && ( {booking.by === "auto" ? "Auto" : "Booked"} )} diff --git a/apps/web/src/components/Toasts.tsx b/apps/web/src/components/Toasts.tsx index f6dba36..1ca69b3 100644 --- a/apps/web/src/components/Toasts.tsx +++ b/apps/web/src/components/Toasts.tsx @@ -136,7 +136,7 @@ export function Toasts() { dropOverflow(); void navigate("/logbook"); }} - className="pointer-events-auto self-end rounded-full border border-space-600 bg-space-900/95 px-3 py-1 font-display text-xs tracking-wide text-ink-200 shadow-panel" + className="pointer-events-auto self-end rounded-full border border-space-600 bg-space-900/95 px-3 py-1 font-display text-xs text-ink-200 shadow-panel" > +{more} more diff --git a/apps/web/src/components/Welcome.tsx b/apps/web/src/components/Welcome.tsx index e005b9b..9d876a2 100644 --- a/apps/web/src/components/Welcome.tsx +++ b/apps/web/src/components/Welcome.tsx @@ -87,17 +87,11 @@ export function WelcomeCards({ }} className="w-full max-w-md overflow-hidden rounded-t-2xl border border-amber-400/50 bg-space-900/95 p-6 pb-[max(1.5rem,env(safe-area-inset-bottom))] shadow-panel sm:rounded-2xl" > -

+

{index + 1} of {cards.length}

-

+

{card.title}

{welcomeBody(card.body)}

diff --git a/apps/web/src/index.css b/apps/web/src/index.css index f2dfad0..2594946 100644 --- a/apps/web/src/index.css +++ b/apps/web/src/index.css @@ -40,10 +40,68 @@ --color-problem: #ff8d7a; /* Something needs attention. */ --color-on-problem: #2a0a05; - --shadow-glow-amber: 0 0 0 1px rgb(251 191 36 / 0.45), 0 0 22px -4px rgb(251 191 36 / 0.6); - --shadow-glow-cyan: 0 0 0 1px rgb(34 211 238 / 0.4), 0 0 22px -4px rgb(34 211 238 / 0.55); - --shadow-glow-emerald: 0 0 0 1px rgb(52 211 153 / 0.4), 0 0 22px -4px rgb(52 211 153 / 0.55); - --shadow-panel: inset 0 1px 0 0 rgb(255 255 255 / 0.05), 0 12px 32px -12px rgb(0 0 0 / 0.8); + /* Accent scales in the role hues: amber action, blue flight, mint earned, coral problem. */ + --color-amber-50: #fff8e8; + --color-amber-100: #fff0d1; + --color-amber-200: #ffe2a8; + --color-amber-300: #ffd27a; + --color-amber-400: #ffc04d; + --color-amber-500: #f5a623; + --color-amber-600: #c97f10; + --color-amber-700: #9c620f; + --color-amber-800: #7a4d10; + --color-amber-900: #5c3b10; + --color-amber-950: #2e1c04; + --color-cyan-50: #eef6ff; + --color-cyan-100: #dcedff; + --color-cyan-200: #bddcff; + --color-cyan-300: #93c9ff; + --color-cyan-400: #68aef5; + --color-cyan-500: #4690e0; + --color-cyan-600: #2f74c2; + --color-cyan-700: #2a5c98; + --color-cyan-800: #244a78; + --color-cyan-900: #1f3d61; + --color-cyan-950: #122540; + --color-sky-50: #eef6ff; + --color-sky-100: #dcedff; + --color-sky-200: #bddcff; + --color-sky-300: #93c9ff; + --color-sky-400: #68aef5; + --color-sky-500: #4690e0; + --color-sky-600: #2f74c2; + --color-sky-700: #2a5c98; + --color-sky-800: #244a78; + --color-sky-900: #1f3d61; + --color-sky-950: #122540; + --color-emerald-50: #eafbf3; + --color-emerald-100: #d0f6e4; + --color-emerald-200: #aaf0cf; + --color-emerald-300: #84e3b5; + --color-emerald-400: #5ed09a; + --color-emerald-500: #3db680; + --color-emerald-600: #2c9367; + --color-emerald-700: #267553; + --color-emerald-800: #215d44; + --color-emerald-900: #1c4c39; + --color-emerald-950: #0e2c21; + --color-rose-50: #fff2ef; + --color-rose-100: #ffe2db; + --color-rose-200: #ffc8bb; + --color-rose-300: #ffa896; + --color-rose-400: #ff8d7a; + --color-rose-500: #f56f5a; + --color-rose-600: #dc5340; + --color-rose-700: #b54232; + --color-rose-800: #8f372b; + --color-rose-900: #732f26; + --color-rose-950: #3f1610; + + /* Selection rings, without the old neon blur. */ + --shadow-glow-amber: 0 0 0 1px rgb(255 192 77 / 0.55); + --shadow-glow-cyan: 0 0 0 1px rgb(147 201 255 / 0.5); + --shadow-glow-emerald: 0 0 0 1px rgb(132 227 181 / 0.5); + --shadow-panel: 0 10px 30px -14px rgb(0 0 0 / 0.7); --animate-rise: rise 0.35s cubic-bezier(0.2, 0.8, 0.2, 1) both; --animate-glow: glow 2.4s ease-in-out infinite; diff --git a/apps/web/src/layout/Layout.tsx b/apps/web/src/layout/Layout.tsx index 4926011..ff7810e 100644 --- a/apps/web/src/layout/Layout.tsx +++ b/apps/web/src/layout/Layout.tsx @@ -33,10 +33,8 @@ export function Layout({ {/* The wordmark only fits beside the chips from 640 px; on phones the mark alone. */}
- - DEADHEAD - - + DEADHEAD + Space Freight
@@ -131,15 +129,13 @@ function NavTab({ )} - - {label} - + {label} )} diff --git a/apps/web/src/map/MapCanvas.tsx b/apps/web/src/map/MapCanvas.tsx index 171cec5..49c3cb3 100644 --- a/apps/web/src/map/MapCanvas.tsx +++ b/apps/web/src/map/MapCanvas.tsx @@ -166,7 +166,7 @@ export function MapCanvas({ {loading && (

Loading map…

diff --git a/apps/web/src/screens/Dashboard.tsx b/apps/web/src/screens/Dashboard.tsx index 7bda6a1..69bab8d 100644 --- a/apps/web/src/screens/Dashboard.tsx +++ b/apps/web/src/screens/Dashboard.tsx @@ -113,7 +113,7 @@ export function Dashboard() {
{state.tutorial && ( - + Contract pilot

Flying for {content.tutorialCompanyName} @@ -140,10 +140,7 @@ export function Dashboard() { aria-labelledby="on-jobs-title" tone={onJobs.length ? "cyan" : "default"} > -

+

Ships on jobs

{onJobs.length === 0 ? ( @@ -186,7 +183,7 @@ export function Dashboard() {
-

+

Pilots resting: {resting.length}

{resting[0] ? ( @@ -204,7 +201,7 @@ export function Dashboard() { {inShop.length > 0 && ( -

+

In the shop: {inShop.length}

    @@ -227,7 +224,7 @@ export function Dashboard() { {!state.tutorial && ( -

    +

    Logbook

    @@ -258,7 +255,7 @@ function YourShip({ className = "" }: { className?: string }) { if (mine.kind === "none") { return ( - + Your ship

    You're not flying a ship right now.

    @@ -285,7 +282,6 @@ function YourShip({ className = "" }: { className?: string }) { @@ -301,7 +297,7 @@ function YourShip({ className = "" }: { className?: string }) {
    Your ship
    -

    {name}

    +

    {name}

    {dispatch ? ( In flight @@ -365,10 +361,8 @@ function YourShip({ className = "" }: { className?: string }) { aria-label="Your ship low fuel" className="mt-2 rounded-lg border border-rose-400/40 bg-rose-950/30 px-3 py-2 text-sm text-rose-200" > - - Low fuel - {" "} - · {locationName(low.destinationId)} needs {formatFu(low.fuelFu)} + Low fuel ·{" "} + {locationName(low.destinationId)} needs {formatFu(low.fuelFu)}

    )}
    @@ -440,7 +434,7 @@ function Alerts() {

    Alerts diff --git a/apps/web/src/screens/DevTools.tsx b/apps/web/src/screens/DevTools.tsx index cb8af6b..6783841 100644 --- a/apps/web/src/screens/DevTools.tsx +++ b/apps/web/src/screens/DevTools.tsx @@ -113,7 +113,7 @@ export function DevTools() { {state.pilots.length > 0 && (
    - Pilot + Pilot - - {option.shipName} - + {option.shipName} {option.modelName} · {option.pilotName ?? "no pilot"} @@ -537,7 +535,7 @@ export function DispatchSheet({ contract, onClose }: { contract: Contract; onClo function Cell({ label, value, good }: { label: string; value: string; good?: boolean }) { return (
    -
    {label}
    +
    {label}
    diff --git a/apps/web/src/screens/Fleet.tsx b/apps/web/src/screens/Fleet.tsx index 7578115..7b24fea 100644 --- a/apps/web/src/screens/Fleet.tsx +++ b/apps/web/src/screens/Fleet.tsx @@ -118,9 +118,7 @@ function ShipRow(props: {
    - - {ship.name} - + {ship.name} {dispatch ? ( In flight @@ -170,7 +168,7 @@ function ShipRow(props: { aria-label={`${ship.name} low fuel`} className="flex items-center gap-2 rounded-lg border border-rose-400/40 bg-rose-950/30 px-3 py-2 text-sm text-rose-200" > - Low fuel + Low fuel {locationName(low.destinationId)} needs {formatFu(low.fuelFu)} @@ -383,9 +381,7 @@ export function DeadheadPicker({ ship, onClose }: { ship: Ship; onClose: () => v {sprite && } - - {locationName(option.id)} - + {locationName(option.id)} {formatCredits(option.fuelCost)} fuel used · {formatDuration(option.tripMs)} @@ -425,7 +421,7 @@ export function HullGauge({ ship }: { ship: Ship }) { const tone = pct < needsRepairBelowPct ? "rose" : pct < noDangerousBelowPct ? "amber" : "emerald"; return (
    -
    +
    Hull {Math.round(pct)}%
    @@ -436,7 +432,7 @@ export function HullGauge({ ship }: { ship: Ship }) { aria-label={`${ship.name} needs repair`} className="mt-2 flex items-center gap-2 rounded-lg border border-rose-400/40 bg-rose-950/30 px-3 py-2 text-sm text-rose-200" > - Needs repair + Needs repair Repair it at an HQ

    )} diff --git a/apps/web/src/screens/HQs.tsx b/apps/web/src/screens/HQs.tsx index 799153f..3302026 100644 --- a/apps/web/src/screens/HQs.tsx +++ b/apps/web/src/screens/HQs.tsx @@ -58,7 +58,7 @@ function HqCard({ bay }: { bay: Bay }) { ); return ( - +
    {location && ( )}
    -

    {name}

    +

    {name}

    Fuel:

    diff --git a/apps/web/src/screens/LocationBoards.tsx b/apps/web/src/screens/LocationBoards.tsx index dfbe4a1..e6ddf7d 100644 --- a/apps/web/src/screens/LocationBoards.tsx +++ b/apps/web/src/screens/LocationBoards.tsx @@ -116,7 +116,7 @@ export function LocationBoards({ onSelect }: { onSelect?: (contract: Contract) = type="button" aria-pressed={id === locationId} onClick={() => setParams({ location: id }, { replace: true })} - className="flex shrink-0 items-center gap-2 rounded-full border border-space-600 bg-space-900/70 py-1 pr-3 pl-1 font-display text-sm font-semibold tracking-wide text-ink-300 backdrop-blur transition hover:border-space-500 hover:text-ink-50 aria-pressed:border-amber-400 aria-pressed:bg-amber-500/15 aria-pressed:text-amber-100 aria-pressed:shadow-glow-amber" + className="flex shrink-0 items-center gap-2 rounded-full border border-space-600 bg-space-900/70 py-1 pr-3 pl-1 font-display text-sm font-semibold text-ink-300 backdrop-blur transition hover:border-space-500 hover:text-ink-50 aria-pressed:border-amber-400 aria-pressed:bg-amber-500/15 aria-pressed:text-amber-100 aria-pressed:shadow-glow-amber" > {sprite ? : null} {locationName(id)} @@ -176,7 +176,7 @@ function LocationBoard({ const refresh = (

    New contracts in{" "} @@ -186,7 +186,7 @@ function LocationBoard({ {fresh.size > 0 && ( New contracts posted @@ -222,11 +222,10 @@ function LocationBoard({ as="li" key={contract.id} tone={contract.firstContact ? "amber" : "default"} - feature={contract.firstContact} className={`flex flex-col gap-2 ${fresh.has(contract.id) ? "animate-rise" : ""}`} >

    - + {locationName(contract.originId)} → {locationName(contract.destinationId)} @@ -234,7 +233,7 @@ function LocationBoard({
    -

    +

    {goodName(contract)}

    diff --git a/apps/web/src/screens/Locations.tsx b/apps/web/src/screens/Locations.tsx index b30bb1b..ccb66e4 100644 --- a/apps/web/src/screens/Locations.tsx +++ b/apps/web/src/screens/Locations.tsx @@ -52,9 +52,7 @@ export function Locations() { />
    -
    - {location.name} -
    +
    {location.name}
    Undiscovered — deliver here to unlock.
    @@ -76,16 +74,14 @@ export function Locations() { />
    - - {location.name} - + {location.name} {hasBay && ( HQ )}
    - + {location.id === "earth" ? "Home" : `${formatMillionKm(distanceAt("earth", location.id))} from Earth`} @@ -93,25 +89,15 @@ export function Locations() {
    -
    - Type -
    +
    Type
    {TYPE_LABELS[location.type]}
    -
    - Landing -
    +
    Landing
    {LANDING_LABELS[location.landingRequirement]}
    -
    - Produces -
    +
    Produces
    {location.cargoClassMix.produces.map(cargoName).join(", ") || "—"}
    -
    - Demands -
    +
    Demands
    {location.cargoClassMix.demands.map(cargoName).join(", ") || "—"}
    -
    - Fuel -
    +
    Fuel
    diff --git a/apps/web/src/screens/MapScreen.tsx b/apps/web/src/screens/MapScreen.tsx index bec1643..9736d30 100644 --- a/apps/web/src/screens/MapScreen.tsx +++ b/apps/web/src/screens/MapScreen.tsx @@ -74,7 +74,7 @@ function Panel({ {art}
    -

    {title}

    +

    {title}