Flip the client to region-key resolution + region names in the dossier (v0.19 P1 of #16)

- src/lib/regions.ts (new): cached, turf-free same-origin fetches of
  /region-keys.json (feature id -> key) and /regions.geo.json (id -> name) so
  WorldMap and NationPanel share one fetch each.
- WorldMap.tsx: stamps each feature's properties.regionKey (from the manifest,
  by its stable id) and resolves owner / flash / hover / click from that key via
  the shared mapFeatureOwner; the per-region flash lights the exact sub-region
  whose owner changed; click carries only the sub-region name.
- NationPanel.tsx: territory chips show the region's human name (falling back
  to the raw key) with the key in the title / data-attr.
- App.tsx: the selected-region dossier label drops the now-unused parent code.
This commit is contained in:
2026-10-14 09:14:17 +00:00
parent 325bdc5255
commit 29927bae34
4 changed files with 194 additions and 96 deletions
+4 -5
View File
@@ -591,12 +591,11 @@ function GameScreen({
const [viewingId, setViewingId] = useState(game.playerNationId);
// When the dossier target was set by a map click, remember which sub-region
// was clicked, for a small label in the dossier. The label shows only the
// region's name — the static parent-country code (which never updates on a
// transfer) is no longer displayed, though the info object still carries it.
// Cleared when the user picks a nation via the manual Inspect select.
const [selectedRegion, setSelectedRegion] = useState<{ parent?: string; name?: string } | null>(null);
// region's name. Cleared when the user picks a nation via the manual Inspect
// select.
const [selectedRegion, setSelectedRegion] = useState<{ name?: string } | null>(null);
const focusNation = useCallback(
(id: string, info?: { parent?: string; name?: string }) => {
(id: string, info?: { name?: string }) => {
setViewingId(id);
setSelectedRegion(info ?? null);
},