Switch map to sub-national regions (v0.12.0)
CI / build + unit + e2e (pull_request) Successful in 1m18s

Part of #16
This commit is contained in:
2026-10-12 01:07:33 +00:00
parent 344b5b4a5e
commit 06cdbf3d81
7 changed files with 284 additions and 143 deletions
+26 -2
View File
@@ -589,6 +589,17 @@ function GameScreen({
}: GameScreenProps) {
// Which nation's dossier to show. Defaults to the player; remounts per game.
const [viewingId, setViewingId] = useState(game.playerNationId);
// When the dossier target was set by a map click, remember which sub-region
// (its own name + parent country) was clicked, for a small label in the
// dossier. Cleared when the user picks a nation via the manual Inspect select.
const [selectedRegion, setSelectedRegion] = useState<{ parent?: string; name?: string } | null>(null);
const focusNation = useCallback(
(id: string, info?: { parent?: string; name?: string }) => {
setViewingId(id);
setSelectedRegion(info ?? null);
},
[],
);
const player = game.nations[game.playerNationId];
const viewed = game.nations[viewingId] ?? player;
const nations = Object.values(game.nations).sort((a, b) => a.name.localeCompare(b.name));
@@ -641,7 +652,7 @@ function GameScreen({
playerNationId={game.playerNationId}
nations={game.nations}
presetId={game.presetId}
onFocusNation={setViewingId}
onFocusNation={focusNation}
/>
{/* Pinned top bar: brand, turn + date, player nation, live status, Focus map.
@@ -747,7 +758,14 @@ function GameScreen({
<div className="mb-1.5 text-xs font-medium uppercase tracking-wide text-muted-foreground">
Inspect
</div>
<Select value={viewingId} onValueChange={setViewingId}>
<Select
value={viewingId}
onValueChange={(id) => {
// A manual pick supersedes a map-click selection: clear the label.
setViewingId(id);
setSelectedRegion(null);
}}
>
<SelectTrigger className="w-full" data-testid="inspect-select">
<SelectValue />
</SelectTrigger>
@@ -759,6 +777,12 @@ function GameScreen({
))}
</SelectContent>
</Select>
{selectedRegion && (
<div className="mt-1.5 truncate text-[11px] text-muted-foreground" data-testid="selected-region">
Selected: {selectedRegion.name ?? selectedRegion.parent ?? 'region'}
{selectedRegion.parent ? ` (${selectedRegion.parent})` : ''}
</div>
)}
</div>
<NationPanel nation={viewed} nations={game.nations} isPlayer={viewingId === game.playerNationId} inWindow />
</FloatingWindow>