feat(mgmt/web): show the running game, and who decides when it ends
The host knows what it launched and, after a disconnect, that it is counting down to closing it. None of that was visible: the console showed a stream with no game, and a game on its way to being closed was something you found out about afterwards. The Dashboard gains a running-game card above the session card — box art matched against the catalog it already fetches, so no new endpoint and no request on the 2 s status poll. "End now" means the two different things the row's state implies: a live game ends by stopping its session (what then happens to the game follows the policy — stopping a session is not licence to close a game), while one already waiting out its reconnect window has no session left to stop and is ended directly. The settings card sits next to the display keep-alive policy because that is the same question one step out: keep-alive decides how long a *display* outlives a disconnect, this decides whether the *game* does. The copy says plainly what `always` costs, that a drop is not someone pressing Stop, and that a display kept forever is unaffected either way — the precedence rule that would otherwise surprise someone. Where a build enforces nothing (macOS, no launch path) the controls are shown disabled rather than hidden: "does nothing here" is information. Also fixes the story fixtures, which had gone stale against the `games[]` field Phase 1 added, and adds a story for the state the card exists for — a game whose client walked away. web: build + tsc clean, biome-formatted; en/de messages complete.
This commit is contained in:
+24
-1
@@ -376,5 +376,28 @@
|
||||
"store_phase_rolling_back": "Wird zurückgerollt",
|
||||
"store_phase_recording": "Herkunft wird vermerkt",
|
||||
"store_phase_restarting": "Plugin-Runner startet neu",
|
||||
"store_phase_done": "Fertig"
|
||||
"store_phase_done": "Fertig",
|
||||
"games_title": "Laufende Spiele",
|
||||
"games_state_launching": "Startet",
|
||||
"games_state_running": "Läuft",
|
||||
"games_state_exited": "Beendet",
|
||||
"games_state_grace": "Wartet auf Client",
|
||||
"games_closing_in": "Client ist weg – wird in {time} geschlossen, falls er nicht zurückkommt",
|
||||
"games_end_now": "Jetzt beenden",
|
||||
"session_game_title": "Wenn ein Spiel oder eine Sitzung endet",
|
||||
"session_game_help": "Eine Streaming-Sitzung und das Spiel, das sie gestartet hat, können ihr Schicksal teilen. Diese Einstellungen betreffen das Spiel; das Offenhalten oben betrifft die Anzeige, und beide haben eigene Zeitfenster.",
|
||||
"session_game_on_exit": "Wenn das Spiel endet",
|
||||
"session_game_on_exit_help": "Wer das Spiel beendet, landet wieder in der eigenen Bibliothek statt auf deinem Desktop. Schalte es aus, wenn du den Desktop streamst und das Spiel nebensächlich ist.",
|
||||
"session_game_on_exit_end": "Sitzung beenden",
|
||||
"session_game_on_exit_keep": "Weiter streamen",
|
||||
"session_game_end_game": "Wenn die Sitzung endet",
|
||||
"session_game_end_game_help": "Ob das Stoppen (oder der Verlust) einer Sitzung auch das gestartete Spiel schließt. Gilt nie für ein Spiel, das du selbst gestartet hast – nur für eines, das dieser Host für die Sitzung gestartet hat.",
|
||||
"session_game_end_keep": "Weiterlaufen lassen",
|
||||
"session_game_end_on_quit": "Beim Stoppen schließen",
|
||||
"session_game_end_always": "Immer schließen",
|
||||
"session_game_always_warning": "Ein Spiel zu schließen kostet alles, was es nicht gespeichert hat. Der Host bittet es zuerst höflich und erzwingt es nur, wenn es sich weigert – aber ein Verbindungsabbruch ist kein bewusstes Stoppen, deshalb bekommt ein abgerissener Client erst das Zeitfenster unten. Eine dauerhaft offen gehaltene Anzeige bleibt davon unberührt: Diese Einstellung regelt das Spiel, nicht den Bildschirm.",
|
||||
"session_game_grace": "Zeitfenster für die Rückkehr",
|
||||
"session_game_grace_help": "Wie lange ein verschwundener Client Zeit hat zurückzukommen, bevor sein Spiel geschlossen wird. Die Konsole zeigt den Countdown; eine neue Verbindung bricht ihn ab.",
|
||||
"session_game_saved": "Sitzungs- und Spieleinstellungen gespeichert",
|
||||
"session_game_inert": "Dieser Host kann keine Spiele starten – hier bewirken diese Einstellungen nichts"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user