diff --git a/CHANGELOG.md b/CHANGELOG.md index 07a66bc..7719f42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v0.40.0 — 2026-09-21 13:06 +- **Top-bar version link (ISS-080).** The header's version tag (`components/Map.tsx`) is now an anchor to the repo's `CHANGELOG.md` on Gitea (`app-version` testid, opens in a new tab); one small CSS rule keeps it subtle against the dark header. E2E: `e2e/map.spec.ts` pins the exact href +- **On-board ICAO tags (ISS-081).** The on-board package row in the fleet list (`components/LeftPane.tsx`) shows 4-char ICAO tags instead of full airport names — both the route span (new `onboard-route-{id}` testid) and the "Fly to …" button label + title. Other name displays (in-flight leg, plane location, map popup, open-package rows, toasts) are unchanged. E2E: one new assertion in `e2e/actions.spec.ts` pins the ICAO route on a loaded package + ## v0.39.0 — 2026-09-21 12:02 - **Maintenance (ISS-069).** Planes wear out and can be repaired: distance-based health, a broken state that burns more fuel, and a repair action that grounds the plane for 3 sim days. New balance constants in `lib/game/catalog.ts` (all ponytail-tunable): `WEAR_PER_KM = 0.005`, `BROKEN_BURN_MULTIPLIER = 1.5`, `REPAIR_COST = 1_500` (flat), `REPAIR_DURATION_MS = 3 × 86_400_000`, plus the pure helper `conditionBurnMultiplier(health)` — exactly 1 above zero health, ×1.5 at/below it - **Schema.** Two new `planes` columns in all four places: Drizzle schema (`lib/db/schema.ts`), raw DDL + guarded `ALTER TABLE … ADD COLUMN` migrations in `migrateColumns()` (pre-existing rows backfill to full health / NULL gate, mirroring the weight_kg/special precedent), and the seed insert path — starter plane in `buildSeed` (`lib/game/seed.ts`) and every `buyPlane` delivery start at `health: 100`. New plane status `'repairing'` added to the three pinned unions (schema enum, `PlaneState`, OpenAPI) plus `mapData.ts`'s feature props diff --git a/app/globals.css b/app/globals.css index b362dfa..a7753bd 100644 --- a/app/globals.css +++ b/app/globals.css @@ -48,6 +48,16 @@ body { color: #94a3b8; } +/* ISS-080 (v0.40.0): the version tag links to the repo's CHANGELOG.md — keep it subtle, like the rest of the header. */ +.app-header a { + color: #7dd3fc; + text-decoration: none; +} + +.app-header a:hover { + text-decoration: underline; +} + /* Style switcher — kept subtle, like the version tag. */ .style-switch { font-size: 12px; diff --git a/components/LeftPane.tsx b/components/LeftPane.tsx index 30b09a7..953f76c 100644 --- a/components/LeftPane.tsx +++ b/components/LeftPane.tsx @@ -429,8 +429,9 @@ export default function LeftPane({ state, loading, error, onRefresh, applySnapsh // so "Fly to …" works from any state and the queue needs no dedicated input. onClick={() => void runAction(`/api/planes/${p.id}/${p.status === 'flying' ? 'queue' : 'fly'}`, { destIcao: pkg.destIcao })} > - - Fly to {pkg.destName} + {/* ISS-081 (v0.40.0): ICAO tags instead of full airport names. */} + + Fly to {pkg.destIcao}
@@ -455,7 +456,10 @@ export default function LeftPane({ state, loading, error, onRefresh, applySnapsh
- {pkg.originName} → {pkg.destName} + {/* ISS-081 (v0.40.0): ICAO tags instead of full airport names. */} + + {pkg.originIcao} → {pkg.destIcao} + {/* v0.37.0 (ISS-073): special-status badge — rendered only when the package has one. */} {pkg.special && ( diff --git a/components/Map.tsx b/components/Map.tsx index c0a925c..51ce84b 100644 --- a/components/Map.tsx +++ b/components/Map.tsx @@ -537,7 +537,9 @@ export default function FlightMap({ state, hovered, applySnapshot }: MapProps) {

Flight Ops

- v{pkg.version} + + v{pkg.version} +