From 18aaa9dbe3c0e6b4bd0b417773ebe87866909611 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 11 Aug 2026 16:00:14 +0000 Subject: [PATCH 1/4] Trim the live controls, and let the screen say more about the match MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Six things asked for from the touchline, all on /games/{id}/live. The pause button is gone: a youth match is not paused, and it was one more thing to hit by accident. PauseClockAsync stays in the service, and "Resume" now appears only for a live period whose clock is somehow stopped — without it, a match paused before this change could never be run to full time. Every goal on the timeline now carries the score it made it, in the scoreboard's order. ScoreProgressionReport counts forwards over the whole match and the page looks each goal up by id, because the timeline runs newest first and a total accumulated while rendering would count down. The rule for which end a goal lands on moves onto GameGoal.CountsForUs, so the running total and Game.CountOurGoals cannot disagree. Tapping a player now offers two changes, one dropdown each: someone comes on for them, or they trade positions with a team-mate who stays on. Choosing in either list clears the other, so the single button always has exactly one change to make and says which. The swap is a new MatchSubstitutionService method that writes no GameSubstitution — nobody left the pitch, and a row there would say they did. "Opstelling wisselen" is now "Volgende opstelling": it brings the next quarter's planned line-up on without stopping the clock, which is what the "Changes at half-way" card above it is listing. The control buttons fill their panel again. `.live-control-row > *` was in the page's scoped CSS and matched nothing — every child is a MudButton, and the