diff --git a/src/App.tsx b/src/App.tsx index 65f0b5c..ad54d26 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -475,7 +475,15 @@ function AppInner() { // names; mutant_wasteland uses class+name). The DB primary key // for the seat is (slug, player_id), so the slot is mostly // descriptive metadata that flows back via SEAT_CONFIRMED. + // + // The server emits `character.model_dump()` which nests the + // name under `core.name` (Python pydantic model). The flat + // `name` / `character_name` fallbacks are kept for any + // historical or alternative emission paths but the canonical + // location is `core.name`. + const charCore = charData?.core as Record | undefined; const charNameForSeat = + (charCore?.name as string | undefined) ?? (charData?.name as string | undefined) ?? (charData?.character_name as string | undefined); if (charNameForSeat && sendRef.current) { diff --git a/src/components/CharacterCreation/CharacterCreation.tsx b/src/components/CharacterCreation/CharacterCreation.tsx index cb3ddeb..4fdfae3 100644 --- a/src/components/CharacterCreation/CharacterCreation.tsx +++ b/src/components/CharacterCreation/CharacterCreation.tsx @@ -59,10 +59,19 @@ export function CharacterCreation({ scene, loading, onRespond }: CharacterCreati // turn. "Waiting for the narrator..." is true regardless of which // chargen step we're between. Genre packs can override via // ``scene.loading_text``. + // + // The heartbeat dot is the "system is alive" cue — playtest 2026-04-24 + // flagged the all-text spinner as indistinguishable from a crash. Pulse + // matches the in-game MultiplayerTurnBanner idiom (emerald, w-2 h-2). return (
+ className="flex items-center justify-center gap-2 min-h-[200px]"> +