@sensiblestats/widget-react 0.61.3 → 0.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/StatsWidget.tsx
2
- import { useCallback as useCallback9, useEffect as useEffect18, useMemo as useMemo3, useRef as useRef14, useState as useState38 } from "react";
2
+ import { useCallback as useCallback10, useEffect as useEffect19, useMemo as useMemo3, useRef as useRef15, useState as useState39 } from "react";
3
3
  import { StatsWidgetClient } from "@sensiblestats/widget-sdk";
4
4
 
5
5
  // src/kickoff.ts
@@ -89,6 +89,10 @@ var STRINGS = {
89
89
  inSlipLabel: "In slip",
90
90
  oddsUnavailable: "Odds unavailable right now",
91
91
  momentumLabel: "Momentum",
92
+ liveFactLabel: "Live fact",
93
+ liveFactAsk: "Ask about this",
94
+ liveFactEarlier: (n) => `Earlier facts (${n})`,
95
+ liveFactHideEarlier: "Hide earlier facts",
92
96
  accordionValueLabel: "Value",
93
97
  accordionRetry: "Couldn't load odds \u2014 tap to retry",
94
98
  accordionSuspended: "Suspended",
@@ -385,6 +389,10 @@ var STRINGS = {
385
389
  inSlipLabel: "Kuponda",
386
390
  oddsUnavailable: "Oranlar \u015Fu anda kullan\u0131lam\u0131yor",
387
391
  momentumLabel: "Momentum",
392
+ liveFactLabel: "Canl\u0131 bilgi",
393
+ liveFactAsk: "Bunu sor",
394
+ liveFactEarlier: (n) => `\xD6nceki bilgiler (${n})`,
395
+ liveFactHideEarlier: "\xD6nceki bilgileri gizle",
388
396
  accordionValueLabel: "De\u011Fer",
389
397
  accordionRetry: "Oranlar y\xFCklenemedi \u2014 yeniden dene",
390
398
  accordionSuspended: "Ask\u0131da",
@@ -614,6 +622,10 @@ var STRINGS = {
614
622
  function resolveLocaleStrings(locale) {
615
623
  return STRINGS[locale] ?? STRINGS.en;
616
624
  }
625
+ function isEnglishLocale(locale) {
626
+ const lang = (locale ?? "").trim().toLowerCase().split(/[-_]/)[0] ?? "";
627
+ return lang === "en" || !Object.prototype.hasOwnProperty.call(STRINGS, lang);
628
+ }
617
629
 
618
630
  // src/config.ts
619
631
  function normalizeUi(cfg) {
@@ -623,6 +635,7 @@ function normalizeUi(cfg) {
623
635
  accent: cfg.accent,
624
636
  logoUrl: cfg.logoUrl,
625
637
  headerTitle: cfg.headerTitle,
638
+ rawBettingLabels: isEnglishLocale(cfg.locale),
626
639
  cta: cfg.cta,
627
640
  surface: cfg.surface,
628
641
  ink: cfg.ink,
@@ -704,6 +717,10 @@ function normalizeUi(cfg) {
704
717
  inSlipLabel: strings.inSlipLabel,
705
718
  oddsUnavailable: strings.oddsUnavailable,
706
719
  momentumLabel: strings.momentumLabel,
720
+ liveFactLabel: strings.liveFactLabel,
721
+ liveFactAsk: strings.liveFactAsk,
722
+ liveFactEarlier: strings.liveFactEarlier,
723
+ liveFactHideEarlier: strings.liveFactHideEarlier,
707
724
  accordionValueLabel: strings.accordionValueLabel,
708
725
  accordionRetry: strings.accordionRetry,
709
726
  accordionSuspended: strings.accordionSuspended,
@@ -738,6 +755,24 @@ function toUserContext(cfg) {
738
755
 
739
756
  // src/slip.ts
740
757
  var ADD_TO_SLIP_TIMEOUT_MS = 1e4;
758
+ var MAX_SELECTION = 64;
759
+ var MAX_LINE = 32;
760
+ var MAX_ODDS = 1e4;
761
+ function slipPickFields(selection, label, line) {
762
+ const fields = {};
763
+ if (Number.isSafeInteger(selection.matchId) && selection.matchId > 0) fields.matchId = selection.matchId;
764
+ if (label && label.trim() && label.length <= MAX_SELECTION) fields.selection = label;
765
+ if (line && line.trim() && line.length <= MAX_LINE) fields.line = line;
766
+ const odds = selection.oddsDecimal;
767
+ if (Number.isFinite(odds) && odds > 1 && odds <= MAX_ODDS) fields.odds = odds;
768
+ return fields;
769
+ }
770
+ function chipSelection(market, matchId, conversationId) {
771
+ if (!market || !market.addToSlipEnabled || typeof market.matchOddsId !== "number" || typeof market.price !== "number") return null;
772
+ const selection = { matchOddsId: market.matchOddsId, matchId, oddsDecimal: market.price };
773
+ if (conversationId !== void 0) selection.conversationId = conversationId;
774
+ return selection;
775
+ }
741
776
  function wasAdded(result) {
742
777
  if (!result) return true;
743
778
  if (result.status === "price_changed") return result.accepted;
@@ -1024,6 +1059,8 @@ function toMarketOddsVM(card) {
1024
1059
  return {
1025
1060
  key: `${selection}:${str(r.line) ?? ""}:${i}`,
1026
1061
  selection,
1062
+ selectionLabel: str(r.selectionLabel),
1063
+ line: str(r.line),
1027
1064
  odds: price !== void 0 ? price.toFixed(2) : "",
1028
1065
  oddsDecimal: price,
1029
1066
  matchOddsId: typeof r.matchOddsId === "number" ? r.matchOddsId : void 0,
@@ -1454,7 +1491,7 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
1454
1491
  const send = useCallback((text, opts) => {
1455
1492
  const trimmed = text.trim();
1456
1493
  if (!trimmed) return;
1457
- run({ message: trimmed, actionId: opts?.actionId, actionRef: opts?.actionRef }, opts?.displayText);
1494
+ run({ message: trimmed, actionId: opts?.actionId, actionRef: opts?.actionRef, grounding: opts?.grounding }, opts?.displayText);
1458
1495
  }, [run]);
1459
1496
  const retry = useCallback(() => {
1460
1497
  const last = stateRef.current.lastUserInput;
@@ -1777,6 +1814,7 @@ function useLiveMonitor(opts) {
1777
1814
  const inFlightRef = useRef3(false);
1778
1815
  const timerRef = useRef3(void 0);
1779
1816
  const disabledRef = useRef3(false);
1817
+ const mountedRef = useRef3(false);
1780
1818
  const getLiveMonitorRef = useRef3(opts.getLiveMonitor);
1781
1819
  getLiveMonitorRef.current = opts.getLiveMonitor;
1782
1820
  const tick = useCallback2(async () => {
@@ -1784,6 +1822,7 @@ function useLiveMonitor(opts) {
1784
1822
  inFlightRef.current = true;
1785
1823
  try {
1786
1824
  const snap = await getLiveMonitorRef.current(pinsRef.current);
1825
+ if (!mountedRef.current) return;
1787
1826
  if (snap === null) {
1788
1827
  disabledRef.current = true;
1789
1828
  applySnapshot(null);
@@ -1805,10 +1844,16 @@ function useLiveMonitor(opts) {
1805
1844
  });
1806
1845
  scheduleRef.current = () => {
1807
1846
  window.clearTimeout(timerRef.current);
1808
- if (disabledRef.current || pinsRef.current.length === 0 || document.visibilityState === "hidden") return;
1847
+ if (!mountedRef.current || disabledRef.current || pinsRef.current.length === 0 || document.visibilityState === "hidden") return;
1809
1848
  const hinted = (snapshotRef.current?.nextPollSeconds ?? DEFAULT_POLL_MS / 1e3) * 1e3;
1810
1849
  timerRef.current = window.setTimeout(() => void tick(), Math.max(MIN_POLL_MS, hinted));
1811
1850
  };
1851
+ useEffect3(() => {
1852
+ mountedRef.current = true;
1853
+ return () => {
1854
+ mountedRef.current = false;
1855
+ };
1856
+ }, []);
1812
1857
  const prevPinsLengthRef = useRef3(0);
1813
1858
  useEffect3(() => {
1814
1859
  const wasEmpty = prevPinsLengthRef.current === 0;
@@ -2203,8 +2248,31 @@ function useEventLog() {
2203
2248
  return useContext(EventLogContext);
2204
2249
  }
2205
2250
 
2251
+ // src/popupTelemetry.ts
2252
+ import { useCallback as useCallback6, useEffect as useEffect7, useRef as useRef7 } from "react";
2253
+ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
2254
+ const shownRef = useRef7(/* @__PURE__ */ new Set());
2255
+ const closedTextRef = useRef7(null);
2256
+ useEffect7(() => {
2257
+ if (isOpen) {
2258
+ if (closedTextRef.current) log?.log({ name: "popup_opened" });
2259
+ closedTextRef.current = null;
2260
+ return;
2261
+ }
2262
+ closedTextRef.current = popupText;
2263
+ if (popupText && !shownRef.current.has(popupText)) {
2264
+ shownRef.current.add(popupText);
2265
+ log?.log({ name: "popup_shown" });
2266
+ }
2267
+ }, [log, isOpen, popupText]);
2268
+ return useCallback6(() => {
2269
+ log?.log({ name: "popup_dismissed" });
2270
+ dismissPopup();
2271
+ }, [log, dismissPopup]);
2272
+ }
2273
+
2206
2274
  // src/components/ChatFab.tsx
2207
- import { useEffect as useEffect7, useRef as useRef7, useState as useState7 } from "react";
2275
+ import { useEffect as useEffect8, useRef as useRef8, useState as useState7 } from "react";
2208
2276
 
2209
2277
  // src/components/BrandMark.tsx
2210
2278
  import { useState as useState6 } from "react";
@@ -2282,8 +2350,8 @@ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
2282
2350
  function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart }) {
2283
2351
  const bubble = popupText ?? greeting;
2284
2352
  const [intro, setIntro] = useState7(false);
2285
- const armedRef = useRef7(introAllowed);
2286
- useEffect7(() => {
2353
+ const armedRef = useRef8(introAllowed);
2354
+ useEffect8(() => {
2287
2355
  if (armedRef.current && bubble) {
2288
2356
  armedRef.current = false;
2289
2357
  setIntro(true);
@@ -2297,10 +2365,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
2297
2365
  }
2298
2366
 
2299
2367
  // src/components/ChatPanel.tsx
2300
- import { useEffect as useEffect17, useState as useState37 } from "react";
2368
+ import { useEffect as useEffect18, useState as useState38 } from "react";
2301
2369
 
2302
2370
  // src/components/ChatHeader.tsx
2303
- import { useEffect as useEffect8, useRef as useRef8, useState as useState8 } from "react";
2371
+ import { useEffect as useEffect9, useRef as useRef9, useState as useState8 } from "react";
2304
2372
  import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
2305
2373
  function ChatHeader({
2306
2374
  onClose,
@@ -2313,14 +2381,14 @@ function ChatHeader({
2313
2381
  moreOptionsLabel = "More options"
2314
2382
  }) {
2315
2383
  const [menuOpen, setMenuOpen] = useState8(false);
2316
- const wrapRef = useRef8(null);
2317
- const kebabRef = useRef8(null);
2318
- const firstItemRef = useRef8(null);
2384
+ const wrapRef = useRef9(null);
2385
+ const kebabRef = useRef9(null);
2386
+ const firstItemRef = useRef9(null);
2319
2387
  const hasMenu = !!(canReset && onNewConversation);
2320
- useEffect8(() => {
2388
+ useEffect9(() => {
2321
2389
  if (menuOpen) firstItemRef.current?.focus();
2322
2390
  }, [menuOpen]);
2323
- useEffect8(() => {
2391
+ useEffect9(() => {
2324
2392
  if (!menuOpen) return;
2325
2393
  const onPointer = (e) => {
2326
2394
  if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
@@ -2376,7 +2444,7 @@ function ChatHeader({
2376
2444
  }
2377
2445
 
2378
2446
  // src/components/MessageList.tsx
2379
- import { useEffect as useEffect12, useRef as useRef10 } from "react";
2447
+ import { useEffect as useEffect13, useRef as useRef11 } from "react";
2380
2448
 
2381
2449
  // src/components/Markdown.tsx
2382
2450
  import ReactMarkdown from "react-markdown";
@@ -2506,15 +2574,15 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
2506
2574
  import { useState as useState13 } from "react";
2507
2575
 
2508
2576
  // src/components/AddToSlipButton.tsx
2509
- import { useCallback as useCallback6, useState as useState10 } from "react";
2577
+ import { useCallback as useCallback7, useState as useState10 } from "react";
2510
2578
  import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
2511
2579
 
2512
2580
  // src/components/Toast.tsx
2513
- import { useEffect as useEffect9 } from "react";
2581
+ import { useEffect as useEffect10 } from "react";
2514
2582
  import { jsx as jsx8 } from "react/jsx-runtime";
2515
2583
  var DISMISS_MS = 4e3;
2516
2584
  function Toast({ toast, onDismiss }) {
2517
- useEffect9(() => {
2585
+ useEffect10(() => {
2518
2586
  if (!toast) return;
2519
2587
  const timer = setTimeout(onDismiss, DISMISS_MS);
2520
2588
  return () => clearTimeout(timer);
@@ -2531,18 +2599,19 @@ function withTimeout(value) {
2531
2599
  new Promise((_, reject) => setTimeout(() => reject(new Error("add-to-slip timed out")), ADD_TO_SLIP_TIMEOUT_MS))
2532
2600
  ]);
2533
2601
  }
2534
- function SlipButton({ selection, shownOdds, marketName, marketDeveloperName, slip, ui }) {
2602
+ function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui }) {
2535
2603
  const [pending, setPending] = useState10(false);
2536
2604
  const [settled, setSettled] = useState10(false);
2537
2605
  const [toast, setToast] = useState10(null);
2538
- const dismiss = useCallback6(() => setToast(null), []);
2606
+ const dismiss = useCallback7(() => setToast(null), []);
2539
2607
  const log = useEventLog();
2540
2608
  const handler = slip.onAddToSlip;
2541
2609
  if (!ui || !handler || !selection) return null;
2542
2610
  const onClick = async () => {
2543
2611
  setPending(true);
2612
+ const pick = slipPickFields(selection, ui.rawBettingLabels ? selectionLabel : void 0, line);
2544
2613
  if (marketDeveloperName !== void 0) {
2545
- log?.log({ name: "slip_click", entityType: "market", marketDeveloperName, entityId: marketDeveloperName });
2614
+ log?.log({ name: "slip_click", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, ...pick });
2546
2615
  }
2547
2616
  try {
2548
2617
  const raw = await withTimeout(Promise.resolve(handler(selection)));
@@ -2554,20 +2623,15 @@ function SlipButton({ selection, shownOdds, marketName, marketDeveloperName, sli
2554
2623
  entityType: "market",
2555
2624
  marketDeveloperName,
2556
2625
  entityId: marketDeveloperName,
2557
- outcome: slipOutcome(result)
2626
+ outcome: slipOutcome(result),
2627
+ ...pick
2558
2628
  });
2559
2629
  }
2560
2630
  setToast(resultToToast(result, shownOdds || selection.oddsDecimal.toFixed(2), ui));
2561
2631
  setSettled(isTerminal(result));
2562
- if (wasAdded(result) && slip.onMarketClicked) {
2563
- try {
2564
- slip.onMarketClicked(marketName);
2565
- } catch {
2566
- }
2567
- }
2568
2632
  } catch {
2569
2633
  if (marketDeveloperName !== void 0) {
2570
- log?.log({ name: "slip_result", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, outcome: "timeout" });
2634
+ log?.log({ name: "slip_result", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, outcome: "timeout", ...pick });
2571
2635
  }
2572
2636
  setToast({ kind: "error", text: ui.slipFailed });
2573
2637
  } finally {
@@ -2595,8 +2659,9 @@ function AddToSlipButton({ it, slip, ui }) {
2595
2659
  {
2596
2660
  selection,
2597
2661
  shownOdds: it.odds ?? "",
2598
- marketName: it.market,
2599
2662
  marketDeveloperName: it.marketDeveloperName,
2663
+ selectionLabel: it.selectionLabel,
2664
+ line: it.line,
2600
2665
  slip,
2601
2666
  ui
2602
2667
  }
@@ -2640,7 +2705,7 @@ function Crest2({ url, name, kind }) {
2640
2705
  }
2641
2706
 
2642
2707
  // src/components/PinToggle.tsx
2643
- import { useCallback as useCallback7, useState as useState12 } from "react";
2708
+ import { useCallback as useCallback8, useState as useState12 } from "react";
2644
2709
  import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
2645
2710
  var PIN_GLYPHS = {
2646
2711
  pin: { viewBox: "0 0 24 24", strokeWidth: 1.4, transform: "scale(1.5)", d: "M9.5 1.5 14.5 6.5 13 8l-.5-.5-3 3 .3 2.2-1.4 1.4L5.6 11.3l-3.3 3.3-1-1 3.3-3.3L1.9 7.5l1.4-1.4 2.2.3 3-3L8 2.9z" },
@@ -2649,7 +2714,7 @@ var PIN_GLYPHS = {
2649
2714
  };
2650
2715
  function PinToggle({ pin, monitor, ui }) {
2651
2716
  const [toast, setToast] = useState12(null);
2652
- const dismiss = useCallback7(() => setToast(null), []);
2717
+ const dismiss = useCallback8(() => setToast(null), []);
2653
2718
  const log = useEventLog();
2654
2719
  if (!monitor || !monitor.enabled) return null;
2655
2720
  const key = pinKey(pin);
@@ -2853,7 +2918,7 @@ function OddsRow({ vm, row, ui, slip, inSlipIds }) {
2853
2918
  "\u2713 ",
2854
2919
  ui.inSlipLabel
2855
2920
  ] }) : null,
2856
- /* @__PURE__ */ jsx14(SlipButton, { selection, shownOdds: row.odds, marketName: vm.market, marketDeveloperName: vm.marketDeveloperName, slip, ui })
2921
+ /* @__PURE__ */ jsx14(SlipButton, { selection, shownOdds: row.odds, marketDeveloperName: vm.marketDeveloperName, selectionLabel: row.selectionLabel, line: row.line, slip, ui })
2857
2922
  ] });
2858
2923
  }
2859
2924
  function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
@@ -3025,7 +3090,37 @@ function ActionButtons({ actions, loading, disabled, onAct }) {
3025
3090
  // src/components/dashboard/DashboardTile.tsx
3026
3091
  import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
3027
3092
  var MAX_CRESTS = 3;
3028
- function DashboardTile({ tile, onTap }) {
3093
+ var ODDS_TAIL = /\s*·\s*@(\d+(?:\.\d+)?)\s*$/;
3094
+ function splitOdds(subtitle) {
3095
+ const m = ODDS_TAIL.exec(subtitle);
3096
+ return m ? { text: subtitle.slice(0, m.index), odds: m[1] } : { text: subtitle };
3097
+ }
3098
+ function HeroTile({ tile, onTap, oddsLabel }) {
3099
+ const crests = (tile.imageUrls ?? []).filter(Boolean).slice(0, 2);
3100
+ const sub = tile.subtitle ? splitOdds(tile.subtitle) : null;
3101
+ return /* @__PURE__ */ jsxs13("button", { type: "button", className: "ss-w-dash-tile ss-w-dash-tile--full ss-w-dash-hero", onClick: onTap, children: [
3102
+ /* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-hero-top", children: [
3103
+ tile.badgeText ? /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-badge", children: tile.badgeText }) : null,
3104
+ sub?.odds ? /* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-hero-price", children: [
3105
+ /* @__PURE__ */ jsxs13("span", { className: "ss-g-sr", children: [
3106
+ oddsLabel,
3107
+ " "
3108
+ ] }),
3109
+ sub.odds
3110
+ ] }) : null,
3111
+ /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-chevron", children: /* @__PURE__ */ jsx17(ChevronIcon, {}) })
3112
+ ] }),
3113
+ /* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-hero-main", children: [
3114
+ /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-visual", "aria-hidden": "true", children: crests.length > 0 ? crests.map((url, i) => /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-crest", style: { backgroundImage: `url(${url})` } }, `${url}-${i}`)) : /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-icon", children: /* @__PURE__ */ jsx17(DashboardIcon, { name: tile.icon }) }) }),
3115
+ /* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-hero-body", children: [
3116
+ /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-title", children: tile.title }),
3117
+ sub?.text ? /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-subtitle", children: sub.text }) : null
3118
+ ] })
3119
+ ] })
3120
+ ] });
3121
+ }
3122
+ function DashboardTile({ tile, onTap, oddsLabel = "Odds" }) {
3123
+ if (tile.emphasis === "hero") return /* @__PURE__ */ jsx17(HeroTile, { tile, onTap, oddsLabel });
3029
3124
  const spanClass = tile.span === "full" ? "ss-w-dash-tile--full" : "ss-w-dash-tile--half";
3030
3125
  const crests = (tile.imageUrls ?? []).slice(0, MAX_CRESTS);
3031
3126
  const hasMeta = Boolean(tile.badgeText) || crests.length > 0;
@@ -3058,13 +3153,13 @@ var LAYOUT_CLASSES = {
3058
3153
  function layoutClass(layout) {
3059
3154
  return Object.prototype.hasOwnProperty.call(LAYOUT_CLASSES, layout) ? LAYOUT_CLASSES[layout] : LAYOUT_CLASSES.goal;
3060
3155
  }
3061
- function GreetingDashboard({ dashboard, onTap }) {
3156
+ function GreetingDashboard({ dashboard, onTap, oddsLabel }) {
3062
3157
  return /* @__PURE__ */ jsxs14("div", { className: `ss-w-dash ${layoutClass(dashboard.layout)}`, children: [
3063
3158
  /* @__PURE__ */ jsxs14("div", { className: "ss-w-dash-head", children: [
3064
3159
  /* @__PURE__ */ jsx18("span", { className: "ss-w-dash-title", children: dashboard.title }),
3065
3160
  dashboard.subtitle ? /* @__PURE__ */ jsx18("span", { className: "ss-w-dash-subtitle", children: dashboard.subtitle }) : null
3066
3161
  ] }),
3067
- /* @__PURE__ */ jsx18("div", { className: "ss-w-dash-grid", children: dashboard.tiles.map((t, i) => /* @__PURE__ */ jsx18(DashboardTile, { tile: t, onTap: () => onTap(t, i) }, `${t.title}-${i}`)) }),
3162
+ /* @__PURE__ */ jsx18("div", { className: "ss-w-dash-grid", children: dashboard.tiles.map((t, i) => /* @__PURE__ */ jsx18(DashboardTile, { tile: t, onTap: () => onTap(t, i), oddsLabel }, `${t.title}-${i}`)) }),
3068
3163
  dashboard.footerTip ? /* @__PURE__ */ jsx18("span", { className: "ss-w-dash-foot", children: dashboard.footerTip }) : null
3069
3164
  ] });
3070
3165
  }
@@ -3160,7 +3255,7 @@ function FixtureCard({ card }) {
3160
3255
  }
3161
3256
 
3162
3257
  // src/components/dashboard/CountdownCard.tsx
3163
- import { Fragment as Fragment6, useEffect as useEffect10, useState as useState15 } from "react";
3258
+ import { Fragment as Fragment6, useEffect as useEffect11, useState as useState15 } from "react";
3164
3259
  import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
3165
3260
  var DAY_MS = 864e5;
3166
3261
  function remainingSegments(kickoffUnix, nowMs, withSeconds) {
@@ -3184,7 +3279,7 @@ function CountdownCard({ card }) {
3184
3279
  () => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
3185
3280
  );
3186
3281
  const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
3187
- useEffect10(() => {
3282
+ useEffect11(() => {
3188
3283
  if (reduced) return;
3189
3284
  const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
3190
3285
  return () => window.clearInterval(id);
@@ -3541,10 +3636,10 @@ function RestingFormCard({ card }) {
3541
3636
  }
3542
3637
 
3543
3638
  // src/components/dashboard/LiveScoreCard.tsx
3544
- import { useRef as useRef9, useState as useState19 } from "react";
3639
+ import { useRef as useRef10, useState as useState19 } from "react";
3545
3640
 
3546
3641
  // src/useLiveClock.ts
3547
- import { useEffect as useEffect11, useState as useState18 } from "react";
3642
+ import { useEffect as useEffect12, useState as useState18 } from "react";
3548
3643
  var TICK_MS = 6e4;
3549
3644
  var MAX_LIVE_TICK_MINUTES = 15;
3550
3645
  function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
@@ -3556,7 +3651,7 @@ function useLiveClock(minute, clockRunning, receivedAtMs) {
3556
3651
  const [displayMinute, setDisplayMinute] = useState18(
3557
3652
  () => computeDisplayMinute(minute, clockRunning, receivedAtMs)
3558
3653
  );
3559
- useEffect11(() => {
3654
+ useEffect12(() => {
3560
3655
  setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
3561
3656
  if (!clockRunning) return;
3562
3657
  const id = window.setInterval(() => {
@@ -3592,7 +3687,7 @@ function LiveScoreCard({
3592
3687
  }) {
3593
3688
  const { data } = card;
3594
3689
  const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
3595
- const seedRef = useRef9(null);
3690
+ const seedRef = useRef10(null);
3596
3691
  if (!seedRef.current || seedRef.current.key !== seedKey) {
3597
3692
  seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
3598
3693
  }
@@ -3881,7 +3976,7 @@ function ChatMessage({ message, disabled, onAct, onTap, ui, slip, monitor }) {
3881
3976
  };
3882
3977
  return /* @__PURE__ */ jsxs37("div", { className: "ss-w-msg ss-w-bot", "data-msg-id": message.id, children: [
3883
3978
  message.text && !message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ jsx41(Markdown, { text: message.text }) : null,
3884
- message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ jsx41(GreetingDashboard, { dashboard: message.greetingDashboard, onTap }) : null,
3979
+ message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ jsx41(GreetingDashboard, { dashboard: message.greetingDashboard, onTap, oddsLabel: ui?.oddsLabel }) : null,
3885
3980
  message.clubFanDashboard ? /* @__PURE__ */ jsx41(ClubFanDashboard, { dashboard: message.clubFanDashboard, onTap: onFanDashboardTap, ui }) : null,
3886
3981
  /* @__PURE__ */ jsx41(EntityCardList, { cards: message.cards, disabled, showLessLabel: ui?.showLess, showMoreLabel: ui?.showMore }),
3887
3982
  /* @__PURE__ */ jsx41(BettingInsightList, { insights: message.insights, ui, slip, monitor }),
@@ -3914,11 +4009,11 @@ function turnAnchor(messages) {
3914
4009
  }
3915
4010
  function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
3916
4011
  const { state, send } = controller;
3917
- const listRef = useRef10(null);
3918
- const endRef = useRef10(null);
3919
- const pinnedRef = useRef10(true);
3920
- const anchoredTurnRef = useRef10(null);
3921
- useEffect12(() => {
4012
+ const listRef = useRef11(null);
4013
+ const endRef = useRef11(null);
4014
+ const pinnedRef = useRef11(true);
4015
+ const anchoredTurnRef = useRef11(null);
4016
+ useEffect13(() => {
3922
4017
  const anchor = turnAnchor(state.messages);
3923
4018
  const list = listRef.current;
3924
4019
  if (anchor && anchor.turnId !== anchoredTurnRef.current) {
@@ -4099,15 +4194,79 @@ function MarketAccordion({ match, monitor, ui, slip }) {
4099
4194
  }) });
4100
4195
  }
4101
4196
 
4102
- // src/components/MonitorMatchCard.tsx
4197
+ // src/components/LiveFactBlock.tsx
4198
+ import { useState as useState22 } from "react";
4103
4199
  import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
4104
- function chipSelection(row, matchId, conversationId) {
4105
- const chip = row.market;
4106
- if (!chip || !chip.addToSlipEnabled || typeof chip.matchOddsId !== "number" || typeof chip.price !== "number") return null;
4107
- const selection = { matchOddsId: chip.matchOddsId, matchId, oddsDecimal: chip.price };
4108
- if (conversationId !== void 0) selection.conversationId = conversationId;
4109
- return selection;
4200
+ function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
4201
+ const [expanded, setExpanded] = useState22(false);
4202
+ const [current, ...earlier] = facts;
4203
+ if (!current) return null;
4204
+ const m = current.market;
4205
+ return /* @__PURE__ */ jsxs42("section", { className: "ss-w-fact", "aria-label": ui.liveFactLabel, children: [
4206
+ /* @__PURE__ */ jsxs42("div", { className: "ss-w-fact-k", children: [
4207
+ /* @__PURE__ */ jsx47("span", { children: ui.liveFactLabel }),
4208
+ /* @__PURE__ */ jsxs42("span", { className: "ss-w-fact-min", children: [
4209
+ "\xB7 ",
4210
+ current.minuteLabel
4211
+ ] }),
4212
+ /* @__PURE__ */ jsx47("span", { className: "ss-w-fact-subj", children: current.subjectLabel })
4213
+ ] }),
4214
+ /* @__PURE__ */ jsx47("p", { className: "ss-w-fact-text", children: current.text }),
4215
+ /* @__PURE__ */ jsx47("div", { className: "ss-w-fact-basis", children: current.basis }),
4216
+ m && !m.isSuspended && /* @__PURE__ */ jsxs42("div", { className: "ss-w-fact-mkt", children: [
4217
+ /* @__PURE__ */ jsxs42("span", { children: [
4218
+ m.marketLabel,
4219
+ " \xB7 ",
4220
+ m.selectionLabel
4221
+ ] }),
4222
+ /* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-stat-mkt-right", children: [
4223
+ typeof m.price === "number" && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-price", children: m.price.toFixed(2) }),
4224
+ /* @__PURE__ */ jsx47(
4225
+ SlipButton,
4226
+ {
4227
+ selection: chipSelection(m, matchId, slip.conversationId),
4228
+ shownOdds: typeof m.price === "number" ? m.price.toFixed(2) : "",
4229
+ marketDeveloperName: m.marketDeveloperName,
4230
+ selectionLabel: m.selectionLabel,
4231
+ slip,
4232
+ ui
4233
+ }
4234
+ )
4235
+ ] })
4236
+ ] }),
4237
+ expanded && earlier.length > 0 && /* @__PURE__ */ jsx47("ul", { className: "ss-w-fact-hist", children: earlier.map((f) => /* @__PURE__ */ jsxs42("li", { children: [
4238
+ /* @__PURE__ */ jsx47("span", { className: "ss-w-fact-hmin", children: f.minuteLabel }),
4239
+ /* @__PURE__ */ jsxs42("div", { children: [
4240
+ /* @__PURE__ */ jsx47("p", { className: "ss-w-fact-htext", children: f.text }),
4241
+ /* @__PURE__ */ jsx47("div", { className: "ss-w-fact-basis", children: f.basis })
4242
+ ] })
4243
+ ] }, f.id)) }),
4244
+ /* @__PURE__ */ jsxs42("div", { className: "ss-w-fact-foot", children: [
4245
+ onAsk && /* @__PURE__ */ jsx47(
4246
+ "button",
4247
+ {
4248
+ type: "button",
4249
+ className: "ss-w-fact-link",
4250
+ onClick: () => onAsk(current.text, { kind: "liveFact", matchId, subject: current.text.slice(0, 400) }),
4251
+ children: ui.liveFactAsk
4252
+ }
4253
+ ),
4254
+ earlier.length > 0 && /* @__PURE__ */ jsx47(
4255
+ "button",
4256
+ {
4257
+ type: "button",
4258
+ className: "ss-w-fact-link ss-w-fact-link--muted",
4259
+ "aria-expanded": expanded,
4260
+ onClick: () => setExpanded((v) => !v),
4261
+ children: expanded ? ui.liveFactHideEarlier : ui.liveFactEarlier(earlier.length)
4262
+ }
4263
+ )
4264
+ ] })
4265
+ ] });
4110
4266
  }
4267
+
4268
+ // src/components/MonitorMatchCard.tsx
4269
+ import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
4111
4270
  function isPromoted(row, promotedPins) {
4112
4271
  const chip = row.market;
4113
4272
  if (!chip) return false;
@@ -4133,7 +4292,7 @@ function groupScorers(goals, ownGoalLabel) {
4133
4292
  return { player: name, label: name ? `${name} ${minutes}` : minutes };
4134
4293
  });
4135
4294
  }
4136
- function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
4295
+ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip, onAsk }) {
4137
4296
  const live = match.phase === "live";
4138
4297
  const goals = match.events.filter((e) => e.type === "goal");
4139
4298
  const homeScorers = groupScorers(goals.filter((e) => e.side === "home"), ui.ownGoalLabel);
@@ -4142,73 +4301,74 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
4142
4301
  const otherRows = match.statRows.filter((row) => !isPromoted(row, promotedPins));
4143
4302
  const orderedRows = [...promotedRows, ...otherRows];
4144
4303
  const kickoff = match.phase === "preMatch" && match.kickoffUtc ? ui.bettingKickoff(match.kickoffUtc) : void 0;
4145
- return /* @__PURE__ */ jsxs42("div", { className: "ss-w-mon", children: [
4146
- /* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-top", children: [
4147
- live && /* @__PURE__ */ jsxs42("span", { className: "ss-w-fandash-live-pill", children: [
4148
- /* @__PURE__ */ jsx47("span", { className: "ss-w-fandash-live-dot", "aria-hidden": "true" }),
4304
+ return /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon", children: [
4305
+ /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-top", children: [
4306
+ live && /* @__PURE__ */ jsxs43("span", { className: "ss-w-fandash-live-pill", children: [
4307
+ /* @__PURE__ */ jsx48("span", { className: "ss-w-fandash-live-dot", "aria-hidden": "true" }),
4149
4308
  ui.liveLabel
4150
4309
  ] }),
4151
- match.phase === "fullTime" && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
4152
- kickoff && /* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-pill", children: [
4310
+ match.phase === "fullTime" && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
4311
+ kickoff && /* @__PURE__ */ jsxs43("span", { className: "ss-w-mon-pill", children: [
4153
4312
  kickoff.dayLabel,
4154
4313
  " \xB7 ",
4155
4314
  kickoff.time
4156
4315
  ] }),
4157
- live && match.minuteLabel && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-min", children: match.minuteLabel }),
4158
- match.competitionName && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-comp", children: match.competitionName }),
4159
- /* @__PURE__ */ jsx47(PinToggle, { ui, monitor, pin: { kind: "match", matchId: match.matchId } })
4316
+ live && match.minuteLabel && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-min", children: match.minuteLabel }),
4317
+ match.competitionName && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-comp", children: match.competitionName }),
4318
+ /* @__PURE__ */ jsx48(PinToggle, { ui, monitor, pin: { kind: "match", matchId: match.matchId } })
4160
4319
  ] }),
4161
- /* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-main", children: [
4162
- /* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-side", children: [
4163
- /* @__PURE__ */ jsx47(Crest2, { kind: "team", url: match.homeCrestUrl ?? void 0, name: match.homeTeamName ?? void 0 }),
4164
- /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-name", children: match.homeTeamName })
4320
+ /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-main", children: [
4321
+ /* @__PURE__ */ jsxs43("span", { className: "ss-w-mon-side", children: [
4322
+ /* @__PURE__ */ jsx48(Crest2, { kind: "team", url: match.homeCrestUrl ?? void 0, name: match.homeTeamName ?? void 0 }),
4323
+ /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-name", children: match.homeTeamName })
4165
4324
  ] }),
4166
- match.phase === "preMatch" ? /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-vs", children: "vs" }) : /* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-score", children: [
4325
+ match.phase === "preMatch" ? /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-vs", children: "vs" }) : /* @__PURE__ */ jsxs43("span", { className: "ss-w-mon-score", children: [
4167
4326
  match.homeScore,
4168
- /* @__PURE__ */ jsx47("i", { children: "\u2013" }),
4327
+ /* @__PURE__ */ jsx48("i", { children: "\u2013" }),
4169
4328
  match.awayScore
4170
4329
  ] }),
4171
- /* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-side ss-w-mon-side--away", children: [
4172
- /* @__PURE__ */ jsx47(Crest2, { kind: "team", url: match.awayCrestUrl ?? void 0, name: match.awayTeamName ?? void 0 }),
4173
- /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-name", children: match.awayTeamName })
4330
+ /* @__PURE__ */ jsxs43("span", { className: "ss-w-mon-side ss-w-mon-side--away", children: [
4331
+ /* @__PURE__ */ jsx48(Crest2, { kind: "team", url: match.awayCrestUrl ?? void 0, name: match.awayTeamName ?? void 0 }),
4332
+ /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-name", children: match.awayTeamName })
4174
4333
  ] })
4175
4334
  ] }),
4176
- (homeScorers.length > 0 || awayScorers.length > 0) && /* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-scorers", children: [
4177
- /* @__PURE__ */ jsx47("ul", { className: "ss-w-mon-scorers-col ss-w-mon-scorers-home", children: homeScorers.map((s, i) => /* @__PURE__ */ jsx47("li", { children: s.label }, `${s.player}-${i}`)) }),
4178
- /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-scorers-ball", "aria-hidden": "true", children: "\u26BD" }),
4179
- /* @__PURE__ */ jsx47("ul", { className: "ss-w-mon-scorers-col ss-w-mon-scorers-away", children: awayScorers.map((s, i) => /* @__PURE__ */ jsx47("li", { children: s.label }, `${s.player}-${i}`)) })
4335
+ (homeScorers.length > 0 || awayScorers.length > 0) && /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-scorers", children: [
4336
+ /* @__PURE__ */ jsx48("ul", { className: "ss-w-mon-scorers-col ss-w-mon-scorers-home", children: homeScorers.map((s, i) => /* @__PURE__ */ jsx48("li", { children: s.label }, `${s.player}-${i}`)) }),
4337
+ /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-scorers-ball", "aria-hidden": "true", children: "\u26BD" }),
4338
+ /* @__PURE__ */ jsx48("ul", { className: "ss-w-mon-scorers-col ss-w-mon-scorers-away", children: awayScorers.map((s, i) => /* @__PURE__ */ jsx48("li", { children: s.label }, `${s.player}-${i}`)) })
4180
4339
  ] }),
4181
- /* @__PURE__ */ jsx47("div", { className: "ss-w-mon-stats", children: orderedRows.map((row) => {
4340
+ live && match.facts && match.facts.length > 0 && /* @__PURE__ */ jsx48(LiveFactBlock, { facts: match.facts, matchId: match.matchId, ui, slip, onAsk }),
4341
+ /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-stats", children: orderedRows.map((row) => {
4182
4342
  const total = row.homeNum + row.awayNum;
4183
4343
  const homePct = total > 0 ? row.homeNum / total * 75 : 0;
4184
4344
  const awayPct = total > 0 ? row.awayNum / total * 75 : 0;
4185
4345
  const promoted = isPromoted(row, promotedPins);
4186
- const selection = chipSelection(row, match.matchId, slip.conversationId);
4187
- return /* @__PURE__ */ jsxs42("div", { className: promoted ? "ss-w-mon-stat ss-w-mon-pstrip" : "ss-w-mon-stat", children: [
4188
- /* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-stat-row", children: [
4189
- /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--home", children: row.homeValue }),
4190
- /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-l", children: row.label }),
4191
- /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--away", children: row.awayValue })
4346
+ const selection = chipSelection(row.market, match.matchId, slip.conversationId);
4347
+ return /* @__PURE__ */ jsxs43("div", { className: promoted ? "ss-w-mon-stat ss-w-mon-pstrip" : "ss-w-mon-stat", children: [
4348
+ /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-stat-row", children: [
4349
+ /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--home", children: row.homeValue }),
4350
+ /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-stat-l", children: row.label }),
4351
+ /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--away", children: row.awayValue })
4192
4352
  ] }),
4193
- /* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-bar", children: [
4194
- /* @__PURE__ */ jsx47("b", { className: "ss-w-mon-bar-home", style: { width: `${homePct}%` } }),
4195
- /* @__PURE__ */ jsx47("i", { className: "ss-w-mon-bar-away", style: { width: `${awayPct}%` } })
4353
+ /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-bar", children: [
4354
+ /* @__PURE__ */ jsx48("b", { className: "ss-w-mon-bar-home", style: { width: `${homePct}%` } }),
4355
+ /* @__PURE__ */ jsx48("i", { className: "ss-w-mon-bar-away", style: { width: `${awayPct}%` } })
4196
4356
  ] }),
4197
- row.market && !row.market.isSuspended && /* @__PURE__ */ jsxs42("div", { className: promoted ? "ss-w-mon-stat-mkt ss-w-mon-mkt" : "ss-w-mon-stat-mkt", children: [
4198
- /* @__PURE__ */ jsxs42("span", { children: [
4357
+ row.market && !row.market.isSuspended && /* @__PURE__ */ jsxs43("div", { className: promoted ? "ss-w-mon-stat-mkt ss-w-mon-mkt" : "ss-w-mon-stat-mkt", children: [
4358
+ /* @__PURE__ */ jsxs43("span", { children: [
4199
4359
  row.market.marketLabel,
4200
4360
  " \xB7 ",
4201
4361
  row.market.selectionLabel
4202
4362
  ] }),
4203
- /* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-stat-mkt-right", children: [
4204
- typeof row.market.price === "number" && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-price", children: row.market.price.toFixed(2) }),
4205
- /* @__PURE__ */ jsx47(
4363
+ /* @__PURE__ */ jsxs43("span", { className: "ss-w-mon-stat-mkt-right", children: [
4364
+ typeof row.market.price === "number" && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-price", children: row.market.price.toFixed(2) }),
4365
+ /* @__PURE__ */ jsx48(
4206
4366
  SlipButton,
4207
4367
  {
4208
4368
  selection,
4209
4369
  shownOdds: typeof row.market.price === "number" ? row.market.price.toFixed(2) : "",
4210
- marketName: row.market.marketLabel,
4211
4370
  marketDeveloperName: row.market.marketDeveloperName,
4371
+ selectionLabel: row.market.selectionLabel,
4212
4372
  slip,
4213
4373
  ui
4214
4374
  }
@@ -4217,23 +4377,23 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
4217
4377
  ] })
4218
4378
  ] }, row.label);
4219
4379
  }) }),
4220
- match.status === "stale" && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-asof", children: ui.asOf(formatTime(match.asOfUtc)) }),
4221
- match.momentum.length > 0 && /* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-mom", children: [
4222
- /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-l", children: ui.momentumLabel }),
4223
- /* @__PURE__ */ jsx47(MomentumWave, { points: match.momentum, clubIsHome: true })
4380
+ match.status === "stale" && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-asof", children: ui.asOf(formatTime(match.asOfUtc)) }),
4381
+ match.momentum.length > 0 && /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-mom", children: [
4382
+ /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-stat-l", children: ui.momentumLabel }),
4383
+ /* @__PURE__ */ jsx48(MomentumWave, { points: match.momentum, clubIsHome: true })
4224
4384
  ] }),
4225
- match.phase === "fullTime" && /* @__PURE__ */ jsx47("div", { className: "ss-w-mon-grace", children: ui.graceNote })
4385
+ match.phase === "fullTime" && /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-grace", children: ui.graceNote })
4226
4386
  ] });
4227
4387
  }
4228
4388
 
4229
4389
  // src/components/MonitorTabs.tsx
4230
- import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
4390
+ import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
4231
4391
  function OddsLiveStrip({ m, ui }) {
4232
4392
  const showScore = m.phase !== "preMatch" && typeof m.homeScore === "number";
4233
4393
  const stale = m.status === "stale";
4234
4394
  if (!showScore && !m.minuteLabel && !(m.isSuspended && !m.isSettled) && !m.isSettled && !stale) return null;
4235
- return /* @__PURE__ */ jsxs43("div", { className: "ss-w-mk-live", children: [
4236
- showScore && /* @__PURE__ */ jsxs43("b", { className: "ss-w-mk-live-score", children: [
4395
+ return /* @__PURE__ */ jsxs44("div", { className: "ss-w-mk-live", children: [
4396
+ showScore && /* @__PURE__ */ jsxs44("b", { className: "ss-w-mk-live-score", children: [
4237
4397
  m.homeTeamName,
4238
4398
  " ",
4239
4399
  m.homeScore,
@@ -4242,27 +4402,28 @@ function OddsLiveStrip({ m, ui }) {
4242
4402
  " ",
4243
4403
  m.awayTeamName
4244
4404
  ] }),
4245
- m.minuteLabel && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-min", children: m.minuteLabel }),
4246
- m.isSuspended && !m.isSettled && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-susp", children: ui.suspendedLabel }),
4247
- m.isSettled && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
4248
- stale && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-asof", children: ui.asOf(new Date(m.asOfUtc).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" })) })
4405
+ m.minuteLabel && /* @__PURE__ */ jsx49("span", { className: "ss-w-mon-min", children: m.minuteLabel }),
4406
+ m.isSuspended && !m.isSettled && /* @__PURE__ */ jsx49("span", { className: "ss-w-mon-susp", children: ui.suspendedLabel }),
4407
+ m.isSettled && /* @__PURE__ */ jsx49("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
4408
+ stale && /* @__PURE__ */ jsx49("span", { className: "ss-w-mon-asof", children: ui.asOf(new Date(m.asOfUtc).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" })) })
4249
4409
  ] });
4250
4410
  }
4251
- function MatchesPanel({ monitor, ui, slip }) {
4411
+ function MatchesPanel({ monitor, ui, slip, onAsk }) {
4252
4412
  const matches = (monitor.snapshot?.matches ?? []).filter((m) => monitor.pins.some((p) => p.kind === "match" && p.matchId === m.matchId));
4253
- if (matches.length === 0) return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-empty", children: ui.emptyMatchesTab });
4254
- return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-list", children: matches.map((m) => /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-item", children: [
4255
- /* @__PURE__ */ jsx48(
4413
+ if (matches.length === 0) return /* @__PURE__ */ jsx49("div", { className: "ss-w-mon-empty", children: ui.emptyMatchesTab });
4414
+ return /* @__PURE__ */ jsx49("div", { className: "ss-w-mon-list", children: matches.map((m) => /* @__PURE__ */ jsxs44("div", { className: "ss-w-mon-item", children: [
4415
+ /* @__PURE__ */ jsx49(
4256
4416
  MonitorMatchCard,
4257
4417
  {
4258
4418
  match: m,
4259
4419
  promotedPins: monitor.pins.filter((p) => p.kind !== "match" && p.matchId === m.matchId),
4260
4420
  monitor,
4261
4421
  ui,
4262
- slip
4422
+ slip,
4423
+ onAsk
4263
4424
  }
4264
4425
  ),
4265
- /* @__PURE__ */ jsx48(MarketAccordion, { match: m, monitor, ui, slip })
4426
+ /* @__PURE__ */ jsx49(MarketAccordion, { match: m, monitor, ui, slip })
4266
4427
  ] }, m.matchId)) });
4267
4428
  }
4268
4429
  function withSinceViewMovement(vm, prev) {
@@ -4277,12 +4438,12 @@ function withSinceViewMovement(vm, prev) {
4277
4438
  }
4278
4439
  function OddsPanel({ monitor, ui, slip }) {
4279
4440
  const markets = (monitor.snapshot?.markets ?? []).filter((m) => monitor.pins.some((p) => p.key === m.key));
4280
- if (markets.length === 0) return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-empty", children: ui.emptyOddsTab });
4281
- return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-list", children: markets.map((m) => {
4441
+ if (markets.length === 0) return /* @__PURE__ */ jsx49("div", { className: "ss-w-mon-empty", children: ui.emptyOddsTab });
4442
+ return /* @__PURE__ */ jsx49("div", { className: "ss-w-mon-list", children: markets.map((m) => {
4282
4443
  const pin = monitor.pins.find((p) => p.key === m.key);
4283
- return /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-oddspin", "data-settled": m.isSettled || void 0, children: [
4284
- /* @__PURE__ */ jsx48(OddsLiveStrip, { m, ui }),
4285
- m.card && /* @__PURE__ */ jsx48(
4444
+ return /* @__PURE__ */ jsxs44("div", { className: "ss-w-mon-oddspin", "data-settled": m.isSettled || void 0, children: [
4445
+ /* @__PURE__ */ jsx49(OddsLiveStrip, { m, ui }),
4446
+ m.card && /* @__PURE__ */ jsx49(
4286
4447
  MarketOddsCardList,
4287
4448
  {
4288
4449
  cards: [withSinceViewMovement(toMarketOddsVM(m.card), monitor.lastViewedPrices[m.key])],
@@ -4293,22 +4454,22 @@ function OddsPanel({ monitor, ui, slip }) {
4293
4454
  inSlipIds: monitor.inSlip
4294
4455
  }
4295
4456
  ),
4296
- m.history && /* @__PURE__ */ jsx48(OddsMovementCardList, { cards: [toOddsMovementVM(m.history)], ui }),
4297
- !m.card && !m.history && /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-empty-card", children: ui.oddsUnavailable })
4457
+ m.history && /* @__PURE__ */ jsx49(OddsMovementCardList, { cards: [toOddsMovementVM(m.history)], ui }),
4458
+ !m.card && !m.history && /* @__PURE__ */ jsx49("div", { className: "ss-w-mon-empty-card", children: ui.oddsUnavailable })
4298
4459
  ] }, m.key);
4299
4460
  }) });
4300
4461
  }
4301
4462
 
4302
4463
  // src/components/FixtureRow.tsx
4303
- import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
4464
+ import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
4304
4465
  function kickoffLabel(kickoffUnix) {
4305
4466
  const d = new Date(kickoffUnix * 1e3);
4306
4467
  return `${`${d.getHours()}`.padStart(2, "0")}:${`${d.getMinutes()}`.padStart(2, "0")}`;
4307
4468
  }
4308
4469
  function Side({ name, crest, away = false }) {
4309
- return /* @__PURE__ */ jsxs44("span", { className: away ? "ss-w-drow-side ss-w-drow-side--away" : "ss-w-drow-side", children: [
4310
- crest ? /* @__PURE__ */ jsx49("img", { className: "ss-w-drow-crest", src: crest, alt: "" }) : null,
4311
- /* @__PURE__ */ jsx49("span", { className: "ss-w-drow-nm", children: name })
4470
+ return /* @__PURE__ */ jsxs45("span", { className: away ? "ss-w-drow-side ss-w-drow-side--away" : "ss-w-drow-side", children: [
4471
+ crest ? /* @__PURE__ */ jsx50("img", { className: "ss-w-drow-crest", src: crest, alt: "" }) : null,
4472
+ /* @__PURE__ */ jsx50("span", { className: "ss-w-drow-nm", children: name })
4312
4473
  ] });
4313
4474
  }
4314
4475
  function FixtureRow({ match, state, stale, ui, monitor }) {
@@ -4316,45 +4477,45 @@ function FixtureRow({ match, state, stale, ui, monitor }) {
4316
4477
  const hasScore = (state?.phase === "live" || state?.phase === "fullTime") && typeof state.homeScore === "number" && typeof state.awayScore === "number";
4317
4478
  const ticked = state?.phase === "live" ? state.minuteLabel ?? null : null;
4318
4479
  const when = state?.isHalfTime && !stale ? ui.halfTime : isLive ? ticked ?? "\u2014" : state?.phase === "live" ? "\u2014" : kickoffLabel(match.kickoffUnix);
4319
- return /* @__PURE__ */ jsxs44("div", { className: isLive || state?.isHalfTime ? "ss-w-drow ss-w-drow--live" : "ss-w-drow", children: [
4320
- /* @__PURE__ */ jsx49("span", { className: isLive || state?.isHalfTime ? "ss-w-drow-when ss-w-drow-when--live" : "ss-w-drow-when", children: when }),
4321
- /* @__PURE__ */ jsxs44("span", { className: "ss-w-drow-fx", children: [
4322
- /* @__PURE__ */ jsx49(Side, { name: match.homeTeamName, crest: match.homeTeamImagePath }),
4323
- /* @__PURE__ */ jsx49("span", { className: hasScore ? "ss-w-drow-sc" : "ss-w-drow-sc ss-w-drow-sc--idle", children: hasScore ? `${state.homeScore}\u2013${state.awayScore}` : "\u2013" }),
4324
- /* @__PURE__ */ jsx49(Side, { name: match.awayTeamName, crest: match.awayTeamImagePath, away: true })
4480
+ return /* @__PURE__ */ jsxs45("div", { className: isLive || state?.isHalfTime ? "ss-w-drow ss-w-drow--live" : "ss-w-drow", children: [
4481
+ /* @__PURE__ */ jsx50("span", { className: isLive || state?.isHalfTime ? "ss-w-drow-when ss-w-drow-when--live" : "ss-w-drow-when", children: when }),
4482
+ /* @__PURE__ */ jsxs45("span", { className: "ss-w-drow-fx", children: [
4483
+ /* @__PURE__ */ jsx50(Side, { name: match.homeTeamName, crest: match.homeTeamImagePath }),
4484
+ /* @__PURE__ */ jsx50("span", { className: hasScore ? "ss-w-drow-sc" : "ss-w-drow-sc ss-w-drow-sc--idle", children: hasScore ? `${state.homeScore}\u2013${state.awayScore}` : "\u2013" }),
4485
+ /* @__PURE__ */ jsx50(Side, { name: match.awayTeamName, crest: match.awayTeamImagePath, away: true })
4325
4486
  ] }),
4326
- /* @__PURE__ */ jsx49(PinToggle, { ui, monitor, pin: { kind: "match", matchId: match.matchId } })
4487
+ /* @__PURE__ */ jsx50(PinToggle, { ui, monitor, pin: { kind: "match", matchId: match.matchId } })
4327
4488
  ] });
4328
4489
  }
4329
4490
 
4330
4491
  // src/components/CompetitionGroup.tsx
4331
- import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
4492
+ import { jsx as jsx51, jsxs as jsxs46 } from "react/jsx-runtime";
4332
4493
  function CompetitionGroup({ group, open, onToggle, states, stale, ui, monitor, disambiguate = false }) {
4333
4494
  const own = group.matches.filter((m) => !isTreatedLive(states[m.matchId], stale));
4334
4495
  const hasLive = own.length !== group.matches.length;
4335
4496
  if (own.length === 0) {
4336
4497
  return null;
4337
4498
  }
4338
- return /* @__PURE__ */ jsxs45("div", { className: "ss-w-grp", children: [
4339
- /* @__PURE__ */ jsxs45("button", { type: "button", className: "ss-w-grp-head", "aria-expanded": open, onClick: onToggle, children: [
4340
- /* @__PURE__ */ jsx50("span", { className: "ss-w-grp-chev", children: open ? "\u25BE" : "\u25B8" }),
4341
- hasLive && /* @__PURE__ */ jsx50("span", { className: "ss-w-sec-dot", "aria-hidden": "true" }),
4342
- /* @__PURE__ */ jsxs45("span", { className: "ss-w-grp-name", children: [
4499
+ return /* @__PURE__ */ jsxs46("div", { className: "ss-w-grp", children: [
4500
+ /* @__PURE__ */ jsxs46("button", { type: "button", className: "ss-w-grp-head", "aria-expanded": open, onClick: onToggle, children: [
4501
+ /* @__PURE__ */ jsx51("span", { className: "ss-w-grp-chev", children: open ? "\u25BE" : "\u25B8" }),
4502
+ hasLive && /* @__PURE__ */ jsx51("span", { className: "ss-w-sec-dot", "aria-hidden": "true" }),
4503
+ /* @__PURE__ */ jsxs46("span", { className: "ss-w-grp-name", children: [
4343
4504
  group.competitionName,
4344
- disambiguate && group.competitionCountry ? /* @__PURE__ */ jsxs45("span", { className: "ss-w-grp-country", children: [
4505
+ disambiguate && group.competitionCountry ? /* @__PURE__ */ jsxs46("span", { className: "ss-w-grp-country", children: [
4345
4506
  " (",
4346
4507
  group.competitionCountry,
4347
4508
  ")"
4348
4509
  ] }) : null
4349
4510
  ] }),
4350
- /* @__PURE__ */ jsx50("span", { className: "ss-w-grp-count", children: own.length })
4511
+ /* @__PURE__ */ jsx51("span", { className: "ss-w-grp-count", children: own.length })
4351
4512
  ] }),
4352
- open && /* @__PURE__ */ jsx50("div", { className: "ss-w-grp-body", children: own.map((m) => /* @__PURE__ */ jsx50(FixtureRow, { match: m, state: states[m.matchId], stale, ui, monitor }, m.matchId)) })
4513
+ open && /* @__PURE__ */ jsx51("div", { className: "ss-w-grp-body", children: own.map((m) => /* @__PURE__ */ jsx51(FixtureRow, { match: m, state: states[m.matchId], stale, ui, monitor }, m.matchId)) })
4353
4514
  ] });
4354
4515
  }
4355
4516
 
4356
4517
  // src/components/TodayPanel.tsx
4357
- import { Fragment as Fragment7, jsx as jsx51, jsxs as jsxs46 } from "react/jsx-runtime";
4518
+ import { Fragment as Fragment7, jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
4358
4519
  function TodayPanel({ discovery, ui, monitor }) {
4359
4520
  const { groups, states, stale, expanded, toggleGroup } = discovery;
4360
4521
  const visibleGroups = visibleGroupsOf(groups, states);
@@ -4363,14 +4524,14 @@ function TodayPanel({ discovery, ui, monitor }) {
4363
4524
  acc[g.competitionName] = (acc[g.competitionName] ?? 0) + 1;
4364
4525
  return acc;
4365
4526
  }, {});
4366
- return /* @__PURE__ */ jsxs46("div", { className: "ss-w-mon-list", children: [
4367
- stale && /* @__PURE__ */ jsx51("div", { className: "ss-w-stale", children: ui.staleStates }),
4368
- liveRows.length > 0 && /* @__PURE__ */ jsxs46(Fragment7, { children: [
4369
- /* @__PURE__ */ jsxs46("div", { className: "ss-w-sec-head", children: [
4370
- /* @__PURE__ */ jsx51("span", { className: "ss-w-sec-dot", "aria-hidden": "true" }),
4527
+ return /* @__PURE__ */ jsxs47("div", { className: "ss-w-mon-list", children: [
4528
+ stale && /* @__PURE__ */ jsx52("div", { className: "ss-w-stale", children: ui.staleStates }),
4529
+ liveRows.length > 0 && /* @__PURE__ */ jsxs47(Fragment7, { children: [
4530
+ /* @__PURE__ */ jsxs47("div", { className: "ss-w-sec-head", children: [
4531
+ /* @__PURE__ */ jsx52("span", { className: "ss-w-sec-dot", "aria-hidden": "true" }),
4371
4532
  ui.sectionLive
4372
4533
  ] }),
4373
- /* @__PURE__ */ jsx51("div", { className: "ss-w-today-live", children: liveRows.map(({ match }) => /* @__PURE__ */ jsx51(
4534
+ /* @__PURE__ */ jsx52("div", { className: "ss-w-today-live", children: liveRows.map(({ match }) => /* @__PURE__ */ jsx52(
4374
4535
  FixtureRow,
4375
4536
  {
4376
4537
  match,
@@ -4382,7 +4543,7 @@ function TodayPanel({ discovery, ui, monitor }) {
4382
4543
  match.matchId
4383
4544
  )) })
4384
4545
  ] }),
4385
- visibleGroups.map((group) => /* @__PURE__ */ jsx51(
4546
+ visibleGroups.map((group) => /* @__PURE__ */ jsx52(
4386
4547
  CompetitionGroup,
4387
4548
  {
4388
4549
  group,
@@ -4400,16 +4561,16 @@ function TodayPanel({ discovery, ui, monitor }) {
4400
4561
  }
4401
4562
 
4402
4563
  // src/components/GamesPanel.tsx
4403
- import { useEffect as useEffect16, useState as useState35 } from "react";
4564
+ import { useEffect as useEffect17, useState as useState36 } from "react";
4404
4565
 
4405
4566
  // src/components/GamesLoginWall.tsx
4406
- import { jsx as jsx52 } from "react/jsx-runtime";
4567
+ import { jsx as jsx53 } from "react/jsx-runtime";
4407
4568
  function GamesLoginWall({ ui }) {
4408
- return /* @__PURE__ */ jsx52("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx52("div", { className: "ss-w-games-wall", children: /* @__PURE__ */ jsx52("p", { children: ui.gamesLoginRequired }) }) });
4569
+ return /* @__PURE__ */ jsx53("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx53("div", { className: "ss-w-games-wall", children: /* @__PURE__ */ jsx53("p", { children: ui.gamesLoginRequired }) }) });
4409
4570
  }
4410
4571
 
4411
4572
  // src/components/GamesHub.tsx
4412
- import { useEffect as useEffect13, useState as useState22 } from "react";
4573
+ import { useEffect as useEffect14, useState as useState23 } from "react";
4413
4574
 
4414
4575
  // src/components/games/ui/gameMeta.ts
4415
4576
  function prettifyGameId(gameId) {
@@ -4425,75 +4586,75 @@ function splitName(full) {
4425
4586
  }
4426
4587
 
4427
4588
  // src/components/GameTileArt.tsx
4428
- import { Fragment as Fragment8, jsx as jsx53, jsxs as jsxs47 } from "react/jsx-runtime";
4589
+ import { Fragment as Fragment8, jsx as jsx54, jsxs as jsxs48 } from "react/jsx-runtime";
4429
4590
  function GameTileArt({ gameId }) {
4430
- return /* @__PURE__ */ jsx53("svg", { className: "ss-g-art", viewBox: "0 0 120 74", "aria-hidden": "true", children: ART[gameId] ?? ART.default });
4591
+ return /* @__PURE__ */ jsx54("svg", { className: "ss-g-art", viewBox: "0 0 120 74", "aria-hidden": "true", children: ART[gameId] ?? ART.default });
4431
4592
  }
4432
- var head = (cx, cy, r, cls = "ss-g-art-fg") => /* @__PURE__ */ jsxs47("g", { className: cls, children: [
4433
- /* @__PURE__ */ jsx53("circle", { cx, cy: cy - r * 0.3, r: r * 0.45 }),
4434
- /* @__PURE__ */ jsx53("path", { d: `M${cx - r} ${cy + r}c0-${r * 0.8} ${r * 0.45}-${r * 1.1} ${r}-${r * 1.1}s${r} ${r * 0.3} ${r} ${r * 1.1}z` })
4593
+ var head = (cx, cy, r, cls = "ss-g-art-fg") => /* @__PURE__ */ jsxs48("g", { className: cls, children: [
4594
+ /* @__PURE__ */ jsx54("circle", { cx, cy: cy - r * 0.3, r: r * 0.45 }),
4595
+ /* @__PURE__ */ jsx54("path", { d: `M${cx - r} ${cy + r}c0-${r * 0.8} ${r * 0.45}-${r * 1.1} ${r}-${r * 1.1}s${r} ${r * 0.3} ${r} ${r * 1.1}z` })
4435
4596
  ] });
4436
4597
  var ART = {
4437
- "mystery-tiger": /* @__PURE__ */ jsxs47(Fragment8, { children: [
4598
+ "mystery-tiger": /* @__PURE__ */ jsxs48(Fragment8, { children: [
4438
4599
  head(60, 38, 26, "ss-g-art-fg"),
4439
- /* @__PURE__ */ jsx53("text", { x: "60", y: "36", className: "ss-g-art-q", textAnchor: "middle", children: "?" })
4600
+ /* @__PURE__ */ jsx54("text", { x: "60", y: "36", className: "ss-g-art-q", textAnchor: "middle", children: "?" })
4440
4601
  ] }),
4441
- "higher-or-lower": /* @__PURE__ */ jsxs47(Fragment8, { children: [
4602
+ "higher-or-lower": /* @__PURE__ */ jsxs48(Fragment8, { children: [
4442
4603
  head(32, 38, 20),
4443
4604
  head(88, 38, 20),
4444
- /* @__PURE__ */ jsx53("circle", { cx: "60", cy: "37", r: "11", className: "ss-g-art-accent" }),
4445
- /* @__PURE__ */ jsx53("path", { d: "M57 33l3-3 3 3M57 41l3 3 3-3", className: "ss-g-art-ink" })
4605
+ /* @__PURE__ */ jsx54("circle", { cx: "60", cy: "37", r: "11", className: "ss-g-art-accent" }),
4606
+ /* @__PURE__ */ jsx54("path", { d: "M57 33l3-3 3 3M57 41l3 3 3-3", className: "ss-g-art-ink" })
4446
4607
  ] }),
4447
- "guess-the-xi": /* @__PURE__ */ jsxs47(Fragment8, { children: [
4448
- /* @__PURE__ */ jsx53("rect", { x: "8", y: "4", width: "104", height: "66", rx: "6", className: "ss-g-art-pitch" }),
4449
- [[60, 60, "a"], [24, 46], [48, 46], [72, 46], [96, 46], [36, 30], [60, 30], [84, 30], [40, 14], [60, 14], [80, 14]].map(([x, y, a], i) => /* @__PURE__ */ jsx53("circle", { cx: x, cy: y, r: "4", className: a ? "ss-g-art-accent" : "ss-g-art-dot" }, i))
4608
+ "guess-the-xi": /* @__PURE__ */ jsxs48(Fragment8, { children: [
4609
+ /* @__PURE__ */ jsx54("rect", { x: "8", y: "4", width: "104", height: "66", rx: "6", className: "ss-g-art-pitch" }),
4610
+ [[60, 60, "a"], [24, 46], [48, 46], [72, 46], [96, 46], [36, 30], [60, 30], [84, 30], [40, 14], [60, 14], [80, 14]].map(([x, y, a], i) => /* @__PURE__ */ jsx54("circle", { cx: x, cy: y, r: "4", className: a ? "ss-g-art-accent" : "ss-g-art-dot" }, i))
4450
4611
  ] }),
4451
- "daily-quiz": /* @__PURE__ */ jsx53(Fragment8, { children: [[14, 8], [62, 8], [14, 40], [62, 40]].map(([x, y], i) => /* @__PURE__ */ jsx53("rect", { x, y, width: "44", height: "26", rx: "5", className: i === 1 ? "ss-g-art-correct" : "ss-g-art-block" }, i)) }),
4452
- "career-path": /* @__PURE__ */ jsxs47(Fragment8, { children: [
4453
- /* @__PURE__ */ jsx53("path", { d: "M18 22h24v10c0 7-5 11-12 13-7-2-12-6-12-13z", className: "ss-g-art-fg" }),
4454
- /* @__PURE__ */ jsx53("path", { d: "M48 37h8M84 37h8", className: "ss-g-art-line" }),
4455
- /* @__PURE__ */ jsx53("path", { d: "M60 22h24v10c0 7-5 11-12 13-7-2-12-6-12-13z", className: "ss-g-art-fg" }),
4456
- /* @__PURE__ */ jsx53("rect", { x: "96", y: "22", width: "18", height: "26", rx: "4", className: "ss-g-art-dash" }),
4457
- /* @__PURE__ */ jsx53("text", { x: "105", y: "40", className: "ss-g-art-q", textAnchor: "middle", children: "?" })
4612
+ "daily-quiz": /* @__PURE__ */ jsx54(Fragment8, { children: [[14, 8], [62, 8], [14, 40], [62, 40]].map(([x, y], i) => /* @__PURE__ */ jsx54("rect", { x, y, width: "44", height: "26", rx: "5", className: i === 1 ? "ss-g-art-correct" : "ss-g-art-block" }, i)) }),
4613
+ "career-path": /* @__PURE__ */ jsxs48(Fragment8, { children: [
4614
+ /* @__PURE__ */ jsx54("path", { d: "M18 22h24v10c0 7-5 11-12 13-7-2-12-6-12-13z", className: "ss-g-art-fg" }),
4615
+ /* @__PURE__ */ jsx54("path", { d: "M48 37h8M84 37h8", className: "ss-g-art-line" }),
4616
+ /* @__PURE__ */ jsx54("path", { d: "M60 22h24v10c0 7-5 11-12 13-7-2-12-6-12-13z", className: "ss-g-art-fg" }),
4617
+ /* @__PURE__ */ jsx54("rect", { x: "96", y: "22", width: "18", height: "26", rx: "4", className: "ss-g-art-dash" }),
4618
+ /* @__PURE__ */ jsx54("text", { x: "105", y: "40", className: "ss-g-art-q", textAnchor: "middle", children: "?" })
4458
4619
  ] }),
4459
- "beat-the-grid": /* @__PURE__ */ jsx53(Fragment8, { children: [0, 1, 2].flatMap((r) => [0, 1, 2].map((c) => /* @__PURE__ */ jsx53("rect", { x: 33 + c * 19, y: 10 + r * 19, width: "16", height: "16", rx: "3", className: (r + c) % 3 === 0 ? "ss-g-art-accent" : "ss-g-art-block" }, `${r}${c}`))) }),
4460
- "matchday-predictor": /* @__PURE__ */ jsxs47(Fragment8, { children: [
4461
- /* @__PURE__ */ jsx53("path", { d: "M10 20h20v9c0 6-4 9-10 11-6-2-10-5-10-11z", className: "ss-g-art-fg" }),
4462
- /* @__PURE__ */ jsx53("rect", { x: "38", y: "22", width: "18", height: "24", rx: "4", className: "ss-g-art-accent-stroke" }),
4463
- /* @__PURE__ */ jsx53("rect", { x: "64", y: "22", width: "18", height: "24", rx: "4", className: "ss-g-art-dash" }),
4464
- /* @__PURE__ */ jsx53("path", { d: "M90 20h20v9c0 6-4 9-10 11-6-2-10-5-10-11z", className: "ss-g-art-fg" })
4620
+ "beat-the-grid": /* @__PURE__ */ jsx54(Fragment8, { children: [0, 1, 2].flatMap((r) => [0, 1, 2].map((c) => /* @__PURE__ */ jsx54("rect", { x: 33 + c * 19, y: 10 + r * 19, width: "16", height: "16", rx: "3", className: (r + c) % 3 === 0 ? "ss-g-art-accent" : "ss-g-art-block" }, `${r}${c}`))) }),
4621
+ "matchday-predictor": /* @__PURE__ */ jsxs48(Fragment8, { children: [
4622
+ /* @__PURE__ */ jsx54("path", { d: "M10 20h20v9c0 6-4 9-10 11-6-2-10-5-10-11z", className: "ss-g-art-fg" }),
4623
+ /* @__PURE__ */ jsx54("rect", { x: "38", y: "22", width: "18", height: "24", rx: "4", className: "ss-g-art-accent-stroke" }),
4624
+ /* @__PURE__ */ jsx54("rect", { x: "64", y: "22", width: "18", height: "24", rx: "4", className: "ss-g-art-dash" }),
4625
+ /* @__PURE__ */ jsx54("path", { d: "M90 20h20v9c0 6-4 9-10 11-6-2-10-5-10-11z", className: "ss-g-art-fg" })
4465
4626
  ] }),
4466
- "starting-xi": /* @__PURE__ */ jsxs47(Fragment8, { children: [
4467
- /* @__PURE__ */ jsx53("rect", { x: "8", y: "4", width: "104", height: "66", rx: "6", className: "ss-g-art-pitch" }),
4468
- [[60, 60], [30, 46], [50, 46], [70, 46], [90, 46], [45, 30], [75, 30], [30, 16], [60, 16], [90, 16]].map(([x, y], i) => /* @__PURE__ */ jsx53("circle", { cx: x, cy: y, r: "5", className: i < 7 ? "ss-g-art-accent" : "ss-g-art-dash" }, i))
4627
+ "starting-xi": /* @__PURE__ */ jsxs48(Fragment8, { children: [
4628
+ /* @__PURE__ */ jsx54("rect", { x: "8", y: "4", width: "104", height: "66", rx: "6", className: "ss-g-art-pitch" }),
4629
+ [[60, 60], [30, 46], [50, 46], [70, 46], [90, 46], [45, 30], [75, 30], [30, 16], [60, 16], [90, 16]].map(([x, y], i) => /* @__PURE__ */ jsx54("circle", { cx: x, cy: y, r: "5", className: i < 7 ? "ss-g-art-accent" : "ss-g-art-dash" }, i))
4469
4630
  ] }),
4470
- "stat-ladder": /* @__PURE__ */ jsx53(Fragment8, { children: [[20, 70], [34, 52], [48, 34]].map(([y, w], i) => /* @__PURE__ */ jsx53("rect", { x: "24", y, width: w, height: "12", rx: "3", className: i === 1 ? "ss-g-art-accent" : "ss-g-art-block" }, i)) }),
4471
- "fan-motm": /* @__PURE__ */ jsxs47(Fragment8, { children: [
4472
- /* @__PURE__ */ jsx53("circle", { cx: "60", cy: "37", r: "26", className: "ss-g-art-accent-stroke" }),
4631
+ "stat-ladder": /* @__PURE__ */ jsx54(Fragment8, { children: [[20, 70], [34, 52], [48, 34]].map(([y, w], i) => /* @__PURE__ */ jsx54("rect", { x: "24", y, width: w, height: "12", rx: "3", className: i === 1 ? "ss-g-art-accent" : "ss-g-art-block" }, i)) }),
4632
+ "fan-motm": /* @__PURE__ */ jsxs48(Fragment8, { children: [
4633
+ /* @__PURE__ */ jsx54("circle", { cx: "60", cy: "37", r: "26", className: "ss-g-art-accent-stroke" }),
4473
4634
  head(60, 40, 18),
4474
- /* @__PURE__ */ jsx53("path", { d: "M84 8l2.4 5 5.4.6-4 3.7 1.1 5.4-4.9-2.7-4.9 2.7 1.1-5.4-4-3.7 5.4-.6z", className: "ss-g-art-accent" })
4635
+ /* @__PURE__ */ jsx54("path", { d: "M84 8l2.4 5 5.4.6-4 3.7 1.1 5.4-4.9-2.7-4.9 2.7 1.1-5.4-4-3.7 5.4-.6z", className: "ss-g-art-accent" })
4475
4636
  ] }),
4476
- default: /* @__PURE__ */ jsx53("circle", { cx: "60", cy: "37", r: "22", className: "ss-g-art-fg" })
4637
+ default: /* @__PURE__ */ jsx54("circle", { cx: "60", cy: "37", r: "22", className: "ss-g-art-fg" })
4477
4638
  };
4478
4639
 
4479
4640
  // src/components/games/ui/Chip.tsx
4480
- import { jsx as jsx54, jsxs as jsxs48 } from "react/jsx-runtime";
4641
+ import { jsx as jsx55, jsxs as jsxs49 } from "react/jsx-runtime";
4481
4642
  function Chip({ variant = "neutral", icon, children, className }) {
4482
- return /* @__PURE__ */ jsxs48("span", { className: `ss-g-chip ss-g-chip--${variant}${className ? ` ${className}` : ""}`, children: [
4643
+ return /* @__PURE__ */ jsxs49("span", { className: `ss-g-chip ss-g-chip--${variant}${className ? ` ${className}` : ""}`, children: [
4483
4644
  icon,
4484
4645
  children
4485
4646
  ] });
4486
4647
  }
4487
4648
  function StatStack({ value, label }) {
4488
- return /* @__PURE__ */ jsxs48("span", { className: "ss-g-statstack", children: [
4489
- /* @__PURE__ */ jsx54("span", { className: "ss-g-statstack-v", children: value }),
4490
- /* @__PURE__ */ jsx54("span", { className: "ss-g-statstack-l", children: label })
4649
+ return /* @__PURE__ */ jsxs49("span", { className: "ss-g-statstack", children: [
4650
+ /* @__PURE__ */ jsx55("span", { className: "ss-g-statstack-v", children: value }),
4651
+ /* @__PURE__ */ jsx55("span", { className: "ss-g-statstack-l", children: label })
4491
4652
  ] });
4492
4653
  }
4493
4654
 
4494
4655
  // src/components/games/ui/icons.tsx
4495
- import { jsx as jsx55 } from "react/jsx-runtime";
4496
- var svg = (size, children, fill = false) => /* @__PURE__ */ jsx55(
4656
+ import { jsx as jsx56 } from "react/jsx-runtime";
4657
+ var svg = (size, children, fill = false) => /* @__PURE__ */ jsx56(
4497
4658
  "svg",
4498
4659
  {
4499
4660
  width: size,
@@ -4508,25 +4669,25 @@ var svg = (size, children, fill = false) => /* @__PURE__ */ jsx55(
4508
4669
  children
4509
4670
  }
4510
4671
  );
4511
- var IconChevronLeft = ({ size = 20 }) => svg(size, /* @__PURE__ */ jsx55("path", { d: "M15 18l-6-6 6-6" }));
4512
- var IconLock = ({ size = 14 }) => svg(size, [/* @__PURE__ */ jsx55("rect", { x: "5", y: "11", width: "14", height: "10", rx: "2" }, "a"), /* @__PURE__ */ jsx55("path", { d: "M8 11V7a4 4 0 0 1 8 0v4" }, "b")]);
4513
- var IconCheck = ({ size = 14 }) => svg(size, /* @__PURE__ */ jsx55("path", { d: "M5 12l5 5 9-10" }));
4514
- var IconClose = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx55("path", { d: "M6 6l12 12M18 6L6 18" }));
4515
- var IconSearch = ({ size = 18 }) => svg(size, [/* @__PURE__ */ jsx55("circle", { cx: "11", cy: "11", r: "7" }, "a"), /* @__PURE__ */ jsx55("path", { d: "M20 20l-3.5-3.5" }, "b")]);
4516
- var IconPlus = ({ size = 20 }) => svg(size, /* @__PURE__ */ jsx55("path", { d: "M12 5v14M5 12h14" }));
4517
- var IconBulb = ({ size = 16 }) => svg(size, [/* @__PURE__ */ jsx55("path", { d: "M9 18h6M10 21h4" }, "a"), /* @__PURE__ */ jsx55("path", { d: "M12 3a6 6 0 0 0-3.5 10.9V16h7v-2.1A6 6 0 0 0 12 3z" }, "b")]);
4518
- var IconArrowUp = ({ size = 12 }) => svg(size, /* @__PURE__ */ jsx55("path", { d: "M12 19V5M5 12l7-7 7 7" }));
4519
- var IconArrowDown = ({ size = 12 }) => svg(size, /* @__PURE__ */ jsx55("path", { d: "M12 5v14M19 12l-7 7-7-7" }));
4520
- var IconCalendar = ({ size = 18 }) => svg(size, [/* @__PURE__ */ jsx55("rect", { x: "4", y: "5", width: "16", height: "15", rx: "2" }, "a"), /* @__PURE__ */ jsx55("path", { d: "M4 10h16M9 3v4M15 3v4" }, "b")]);
4521
- var IconShield = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx55("path", { d: "M12 3l7 3v6c0 5-3 8-7 9-4-1-7-4-7-9V6z" }));
4522
- var IconFlag = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx55("path", { d: "M5 21V4M5 4h12l-2 4 2 4H5" }));
4523
- var IconBall = ({ size = 18 }) => svg(size, [/* @__PURE__ */ jsx55("circle", { cx: "12", cy: "12", r: "9" }, "a"), /* @__PURE__ */ jsx55("path", { d: "M12 7l4 3-1.5 4.5h-5L8 10z" }, "b")]);
4524
- var IconBoot = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx55("path", { d: "M4 6h6l1 6 8 3v3H4z" }));
4525
- var IconGloves = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx55("path", { d: "M7 21v-8l-2-3V6a1.5 1.5 0 0 1 3 0v3V4a1.5 1.5 0 0 1 3 0v5V3.5a1.5 1.5 0 0 1 3 0V9V5a1.5 1.5 0 0 1 3 0v9l-2 3v4z" }));
4526
- var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx55("path", { d: "M12 3c1 4 5 5 5 10a5 5 0 0 1-10 0c0-3 2-4 2-7 1.5 1 2 2 2 3 1-2 1-4 1-6z" }), true);
4672
+ var IconChevronLeft = ({ size = 20 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M15 18l-6-6 6-6" }));
4673
+ var IconLock = ({ size = 14 }) => svg(size, [/* @__PURE__ */ jsx56("rect", { x: "5", y: "11", width: "14", height: "10", rx: "2" }, "a"), /* @__PURE__ */ jsx56("path", { d: "M8 11V7a4 4 0 0 1 8 0v4" }, "b")]);
4674
+ var IconCheck = ({ size = 14 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M5 12l5 5 9-10" }));
4675
+ var IconClose = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M6 6l12 12M18 6L6 18" }));
4676
+ var IconSearch = ({ size = 18 }) => svg(size, [/* @__PURE__ */ jsx56("circle", { cx: "11", cy: "11", r: "7" }, "a"), /* @__PURE__ */ jsx56("path", { d: "M20 20l-3.5-3.5" }, "b")]);
4677
+ var IconPlus = ({ size = 20 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M12 5v14M5 12h14" }));
4678
+ var IconBulb = ({ size = 16 }) => svg(size, [/* @__PURE__ */ jsx56("path", { d: "M9 18h6M10 21h4" }, "a"), /* @__PURE__ */ jsx56("path", { d: "M12 3a6 6 0 0 0-3.5 10.9V16h7v-2.1A6 6 0 0 0 12 3z" }, "b")]);
4679
+ var IconArrowUp = ({ size = 12 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M12 19V5M5 12l7-7 7 7" }));
4680
+ var IconArrowDown = ({ size = 12 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M12 5v14M19 12l-7 7-7-7" }));
4681
+ var IconCalendar = ({ size = 18 }) => svg(size, [/* @__PURE__ */ jsx56("rect", { x: "4", y: "5", width: "16", height: "15", rx: "2" }, "a"), /* @__PURE__ */ jsx56("path", { d: "M4 10h16M9 3v4M15 3v4" }, "b")]);
4682
+ var IconShield = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M12 3l7 3v6c0 5-3 8-7 9-4-1-7-4-7-9V6z" }));
4683
+ var IconFlag = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M5 21V4M5 4h12l-2 4 2 4H5" }));
4684
+ var IconBall = ({ size = 18 }) => svg(size, [/* @__PURE__ */ jsx56("circle", { cx: "12", cy: "12", r: "9" }, "a"), /* @__PURE__ */ jsx56("path", { d: "M12 7l4 3-1.5 4.5h-5L8 10z" }, "b")]);
4685
+ var IconBoot = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M4 6h6l1 6 8 3v3H4z" }));
4686
+ var IconGloves = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M7 21v-8l-2-3V6a1.5 1.5 0 0 1 3 0v3V4a1.5 1.5 0 0 1 3 0v5V3.5a1.5 1.5 0 0 1 3 0V9V5a1.5 1.5 0 0 1 3 0v9l-2 3v4z" }));
4687
+ var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M12 3c1 4 5 5 5 10a5 5 0 0 1-10 0c0-3 2-4 2-7 1.5 1 2 2 2 3 1-2 1-4 1-6z" }), true);
4527
4688
 
4528
4689
  // src/components/GameTile.tsx
4529
- import { Fragment as Fragment9, jsx as jsx56, jsxs as jsxs49 } from "react/jsx-runtime";
4690
+ import { Fragment as Fragment9, jsx as jsx57, jsxs as jsxs50 } from "react/jsx-runtime";
4530
4691
  function tileStatus(game, ui) {
4531
4692
  switch (game.status) {
4532
4693
  case "locked":
@@ -4550,38 +4711,38 @@ function GameTile({ game, onOpen, ui, variant = "tile" }) {
4550
4711
  const status = tileStatus(game, ui);
4551
4712
  const disabled = DISABLED.has(game.status);
4552
4713
  const title = gameTitle(game, ui.games.titles);
4553
- const body = variant === "hero" ? /* @__PURE__ */ jsxs49(Fragment9, { children: [
4554
- /* @__PURE__ */ jsxs49("span", { className: "ss-g-hero-text", children: [
4555
- /* @__PURE__ */ jsx56("span", { className: "ss-g-hero-eyebrow", children: ui.games.dailyChallenge }),
4556
- status.tone === "new" && /* @__PURE__ */ jsx56(Chip, { variant: "badge", children: ui.games.newToday }),
4557
- /* @__PURE__ */ jsx56("span", { className: "ss-g-hero-title", children: title }),
4558
- /* @__PURE__ */ jsx56("span", { className: "ss-g-hero-sub", children: ui.games.taglines[game.gameId] ?? "" }),
4559
- status.tone === "success" ? /* @__PURE__ */ jsx56("span", { className: "ss-g-tile-status", "data-tone": "success", children: status.text }) : /* @__PURE__ */ jsxs49("span", { className: "ss-g-hero-cta", children: [
4714
+ const body = variant === "hero" ? /* @__PURE__ */ jsxs50(Fragment9, { children: [
4715
+ /* @__PURE__ */ jsxs50("span", { className: "ss-g-hero-text", children: [
4716
+ /* @__PURE__ */ jsx57("span", { className: "ss-g-hero-eyebrow", children: ui.games.dailyChallenge }),
4717
+ status.tone === "new" && /* @__PURE__ */ jsx57(Chip, { variant: "badge", children: ui.games.newToday }),
4718
+ /* @__PURE__ */ jsx57("span", { className: "ss-g-hero-title", children: title }),
4719
+ /* @__PURE__ */ jsx57("span", { className: "ss-g-hero-sub", children: ui.games.taglines[game.gameId] ?? "" }),
4720
+ status.tone === "success" ? /* @__PURE__ */ jsx57("span", { className: "ss-g-tile-status", "data-tone": "success", children: status.text }) : /* @__PURE__ */ jsxs50("span", { className: "ss-g-hero-cta", children: [
4560
4721
  status.tone === "accent" ? ui.games.resume : ui.games.playNow,
4561
4722
  " \u2192"
4562
4723
  ] })
4563
4724
  ] }),
4564
- /* @__PURE__ */ jsx56("span", { className: "ss-g-hero-art", children: /* @__PURE__ */ jsx56(GameTileArt, { gameId: game.gameId }) })
4565
- ] }) : variant === "wide" ? /* @__PURE__ */ jsxs49(Fragment9, { children: [
4566
- /* @__PURE__ */ jsx56("span", { className: "ss-g-wide-art", children: /* @__PURE__ */ jsx56(GameTileArt, { gameId: game.gameId }) }),
4567
- /* @__PURE__ */ jsxs49("span", { className: "ss-g-wide-text", children: [
4568
- /* @__PURE__ */ jsx56("span", { className: "ss-g-tile-title", children: title }),
4569
- /* @__PURE__ */ jsx56("span", { className: "ss-g-tile-status", "data-tone": status.tone, children: status.text }),
4570
- status.tone === "new" && /* @__PURE__ */ jsx56(Chip, { variant: "badge", children: ui.games.newToday })
4725
+ /* @__PURE__ */ jsx57("span", { className: "ss-g-hero-art", children: /* @__PURE__ */ jsx57(GameTileArt, { gameId: game.gameId }) })
4726
+ ] }) : variant === "wide" ? /* @__PURE__ */ jsxs50(Fragment9, { children: [
4727
+ /* @__PURE__ */ jsx57("span", { className: "ss-g-wide-art", children: /* @__PURE__ */ jsx57(GameTileArt, { gameId: game.gameId }) }),
4728
+ /* @__PURE__ */ jsxs50("span", { className: "ss-g-wide-text", children: [
4729
+ /* @__PURE__ */ jsx57("span", { className: "ss-g-tile-title", children: title }),
4730
+ /* @__PURE__ */ jsx57("span", { className: "ss-g-tile-status", "data-tone": status.tone, children: status.text }),
4731
+ status.tone === "new" && /* @__PURE__ */ jsx57(Chip, { variant: "badge", children: ui.games.newToday })
4571
4732
  ] }),
4572
- /* @__PURE__ */ jsx56("span", { className: "ss-g-wide-chev", children: /* @__PURE__ */ jsx56(IconChevronLeft, { size: 18 }) })
4573
- ] }) : /* @__PURE__ */ jsxs49(Fragment9, { children: [
4574
- /* @__PURE__ */ jsx56("span", { className: "ss-g-tile-art", children: /* @__PURE__ */ jsx56(GameTileArt, { gameId: game.gameId }) }),
4575
- /* @__PURE__ */ jsx56("span", { className: "ss-g-tile-title", children: title }),
4576
- /* @__PURE__ */ jsx56("span", { className: "ss-g-tile-status", "data-tone": status.tone, children: status.text })
4733
+ /* @__PURE__ */ jsx57("span", { className: "ss-g-wide-chev", children: /* @__PURE__ */ jsx57(IconChevronLeft, { size: 18 }) })
4734
+ ] }) : /* @__PURE__ */ jsxs50(Fragment9, { children: [
4735
+ /* @__PURE__ */ jsx57("span", { className: "ss-g-tile-art", children: /* @__PURE__ */ jsx57(GameTileArt, { gameId: game.gameId }) }),
4736
+ /* @__PURE__ */ jsx57("span", { className: "ss-g-tile-title", children: title }),
4737
+ /* @__PURE__ */ jsx57("span", { className: "ss-g-tile-status", "data-tone": status.tone, children: status.text })
4577
4738
  ] });
4578
4739
  const cls = `ss-g-tile ss-g-tile--${variant}`;
4579
- if (disabled) return /* @__PURE__ */ jsx56("div", { className: cls, "data-disabled": true, "aria-disabled": "true", children: body });
4580
- return /* @__PURE__ */ jsx56("button", { type: "button", className: cls, "aria-label": `${title} \u2014 ${status.text}`, onClick: () => onOpen(game), children: body });
4740
+ if (disabled) return /* @__PURE__ */ jsx57("div", { className: cls, "data-disabled": true, "aria-disabled": "true", children: body });
4741
+ return /* @__PURE__ */ jsx57("button", { type: "button", className: cls, "aria-label": `${title} \u2014 ${status.text}`, onClick: () => onOpen(game), children: body });
4581
4742
  }
4582
4743
 
4583
4744
  // src/components/GamesHub.tsx
4584
- import { Fragment as Fragment10, jsx as jsx57, jsxs as jsxs50 } from "react/jsx-runtime";
4745
+ import { Fragment as Fragment10, jsx as jsx58, jsxs as jsxs51 } from "react/jsx-runtime";
4585
4746
  var PLAYABLE = /* @__PURE__ */ new Set(["available", "in_progress"]);
4586
4747
  var DONE = /* @__PURE__ */ new Set(["played", "graded"]);
4587
4748
  function pickHeroGame(games) {
@@ -4594,8 +4755,8 @@ function pickHeroGame(games) {
4594
4755
  }
4595
4756
  var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
4596
4757
  function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
4597
- const [, setTick] = useState22(0);
4598
- useEffect13(() => {
4758
+ const [, setTick] = useState23(0);
4759
+ useEffect14(() => {
4599
4760
  const id = setInterval(() => setTick((t) => t + 1), 6e4);
4600
4761
  return () => clearInterval(id);
4601
4762
  }, []);
@@ -4607,58 +4768,58 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
4607
4768
  const kickoffs = fixtures.map((g) => g.kickoffUtc).filter((k) => !!k).sort();
4608
4769
  const todayPts = games.filter((g) => DONE.has(g.status)).reduce((s, g) => s + (g.score ?? 0), 0);
4609
4770
  const dash = "\u2014";
4610
- return /* @__PURE__ */ jsxs50("div", { className: "ss-g-hub", children: [
4611
- /* @__PURE__ */ jsxs50("div", { className: "ss-g-stats", children: [
4612
- /* @__PURE__ */ jsxs50("div", { className: "ss-g-stat", children: [
4613
- /* @__PURE__ */ jsx57("span", { className: "ss-g-stat-l", children: ui.games.statStreak }),
4614
- /* @__PURE__ */ jsxs50("span", { className: "ss-g-stat-v", "data-testid": "stat-streak", children: [
4615
- myWeeklyRow ? /* @__PURE__ */ jsxs50(Fragment10, { children: [
4616
- /* @__PURE__ */ jsx57(IconFlame, {}),
4771
+ return /* @__PURE__ */ jsxs51("div", { className: "ss-g-hub", children: [
4772
+ /* @__PURE__ */ jsxs51("div", { className: "ss-g-stats", children: [
4773
+ /* @__PURE__ */ jsxs51("div", { className: "ss-g-stat", children: [
4774
+ /* @__PURE__ */ jsx58("span", { className: "ss-g-stat-l", children: ui.games.statStreak }),
4775
+ /* @__PURE__ */ jsxs51("span", { className: "ss-g-stat-v", "data-testid": "stat-streak", children: [
4776
+ myWeeklyRow ? /* @__PURE__ */ jsxs51(Fragment10, { children: [
4777
+ /* @__PURE__ */ jsx58(IconFlame, {}),
4617
4778
  myWeeklyRow.currentStreak
4618
4779
  ] }) : dash,
4619
- myWeeklyRow && /* @__PURE__ */ jsx57("small", { children: ui.games.unitDays })
4780
+ myWeeklyRow && /* @__PURE__ */ jsx58("small", { children: ui.games.unitDays })
4620
4781
  ] })
4621
4782
  ] }),
4622
- /* @__PURE__ */ jsxs50("div", { className: "ss-g-stat", children: [
4623
- /* @__PURE__ */ jsx57("span", { className: "ss-g-stat-l", children: ui.games.statToday }),
4624
- /* @__PURE__ */ jsxs50("span", { className: "ss-g-stat-v ss-g-stat-v--accent", "data-testid": "stat-today", children: [
4783
+ /* @__PURE__ */ jsxs51("div", { className: "ss-g-stat", children: [
4784
+ /* @__PURE__ */ jsx58("span", { className: "ss-g-stat-l", children: ui.games.statToday }),
4785
+ /* @__PURE__ */ jsxs51("span", { className: "ss-g-stat-v ss-g-stat-v--accent", "data-testid": "stat-today", children: [
4625
4786
  ui.games.formatPts(todayPts),
4626
- /* @__PURE__ */ jsx57("small", { children: ui.games.unitPts })
4787
+ /* @__PURE__ */ jsx58("small", { children: ui.games.unitPts })
4627
4788
  ] })
4628
4789
  ] }),
4629
- /* @__PURE__ */ jsxs50("div", { className: "ss-g-stat", children: [
4630
- /* @__PURE__ */ jsx57("span", { className: "ss-g-stat-l", children: ui.games.statRank }),
4631
- /* @__PURE__ */ jsxs50("span", { className: "ss-g-stat-v", "data-testid": "stat-rank", children: [
4790
+ /* @__PURE__ */ jsxs51("div", { className: "ss-g-stat", children: [
4791
+ /* @__PURE__ */ jsx58("span", { className: "ss-g-stat-l", children: ui.games.statRank }),
4792
+ /* @__PURE__ */ jsxs51("span", { className: "ss-g-stat-v", "data-testid": "stat-rank", children: [
4632
4793
  myWeeklyRow ? `#${myWeeklyRow.rank}` : dash,
4633
- myWeeklyRow && /* @__PURE__ */ jsx57("small", { children: ui.games.thisWeek })
4794
+ myWeeklyRow && /* @__PURE__ */ jsx58("small", { children: ui.games.thisWeek })
4634
4795
  ] })
4635
4796
  ] })
4636
4797
  ] }),
4637
- weeklyPrize && /* @__PURE__ */ jsx57(Chip, { variant: "accent", className: "ss-g-prize", children: weeklyPrize }),
4638
- hero && /* @__PURE__ */ jsx57(GameTile, { game: hero, onOpen, ui, variant: "hero" }),
4639
- (grid.length > 0 || wide) && /* @__PURE__ */ jsxs50("section", { className: "ss-g-sec", children: [
4640
- /* @__PURE__ */ jsxs50("div", { className: "ss-g-sec-head", children: [
4641
- /* @__PURE__ */ jsx57("h3", { children: ui.games.dailyGames }),
4642
- /* @__PURE__ */ jsx57("span", { children: ui.games.newSetAtMidnight })
4798
+ weeklyPrize && /* @__PURE__ */ jsx58(Chip, { variant: "accent", className: "ss-g-prize", children: weeklyPrize }),
4799
+ hero && /* @__PURE__ */ jsx58(GameTile, { game: hero, onOpen, ui, variant: "hero" }),
4800
+ (grid.length > 0 || wide) && /* @__PURE__ */ jsxs51("section", { className: "ss-g-sec", children: [
4801
+ /* @__PURE__ */ jsxs51("div", { className: "ss-g-sec-head", children: [
4802
+ /* @__PURE__ */ jsx58("h3", { children: ui.games.dailyGames }),
4803
+ /* @__PURE__ */ jsx58("span", { children: ui.games.newSetAtMidnight })
4643
4804
  ] }),
4644
- grid.length > 0 && /* @__PURE__ */ jsx57("div", { className: "ss-g-grid", children: grid.map((g) => /* @__PURE__ */ jsx57(GameTile, { game: g, onOpen, ui }, tileKey(g))) }),
4645
- wide && /* @__PURE__ */ jsx57(GameTile, { game: wide, onOpen, ui, variant: "wide" })
4805
+ grid.length > 0 && /* @__PURE__ */ jsx58("div", { className: "ss-g-grid", children: grid.map((g) => /* @__PURE__ */ jsx58(GameTile, { game: g, onOpen, ui }, tileKey(g))) }),
4806
+ wide && /* @__PURE__ */ jsx58(GameTile, { game: wide, onOpen, ui, variant: "wide" })
4646
4807
  ] }),
4647
- fixtures.length > 0 && /* @__PURE__ */ jsxs50("section", { className: "ss-g-sec", children: [
4648
- /* @__PURE__ */ jsxs50("div", { className: "ss-g-sec-head", children: [
4649
- /* @__PURE__ */ jsx57("h3", { children: ui.games.matchdayGames }),
4650
- kickoffs[0] && /* @__PURE__ */ jsx57("span", { children: ui.games.kickoffAt(ui.games.formatDayTime(kickoffs[0])) })
4808
+ fixtures.length > 0 && /* @__PURE__ */ jsxs51("section", { className: "ss-g-sec", children: [
4809
+ /* @__PURE__ */ jsxs51("div", { className: "ss-g-sec-head", children: [
4810
+ /* @__PURE__ */ jsx58("h3", { children: ui.games.matchdayGames }),
4811
+ kickoffs[0] && /* @__PURE__ */ jsx58("span", { children: ui.games.kickoffAt(ui.games.formatDayTime(kickoffs[0])) })
4651
4812
  ] }),
4652
- /* @__PURE__ */ jsx57("div", { className: "ss-g-grid", children: fixtures.map((g) => /* @__PURE__ */ jsx57(GameTile, { game: g, onOpen, ui }, tileKey(g))) })
4813
+ /* @__PURE__ */ jsx58("div", { className: "ss-g-grid", children: fixtures.map((g) => /* @__PURE__ */ jsx58(GameTile, { game: g, onOpen, ui }, tileKey(g))) })
4653
4814
  ] })
4654
4815
  ] });
4655
4816
  }
4656
4817
 
4657
4818
  // src/components/GameScreenHost.tsx
4658
- import { useEffect as useEffect15, useRef as useRef13, useState as useState34 } from "react";
4819
+ import { useEffect as useEffect16, useRef as useRef14, useState as useState35 } from "react";
4659
4820
 
4660
4821
  // src/useGamePlay.ts
4661
- import { useCallback as useCallback8, useRef as useRef11, useState as useState23 } from "react";
4822
+ import { useCallback as useCallback9, useRef as useRef12, useState as useState24 } from "react";
4662
4823
  function toSubmitResult(payload) {
4663
4824
  return {
4664
4825
  // 'pending' means the play is recorded but awaiting resolution (fixture games)
@@ -4670,17 +4831,17 @@ function toSubmitResult(payload) {
4670
4831
  };
4671
4832
  }
4672
4833
  function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
4673
- const [result, setResult] = useState23(null);
4674
- const [submitting, setSubmitting] = useState23(false);
4675
- const [rawStatus, setRawStatus] = useState23(null);
4676
- const inFlightRef = useRef11(false);
4677
- const convRef = useRef11(conversation);
4834
+ const [result, setResult] = useState24(null);
4835
+ const [submitting, setSubmitting] = useState24(false);
4836
+ const [rawStatus, setRawStatus] = useState24(null);
4837
+ const inFlightRef = useRef12(false);
4838
+ const convRef = useRef12(conversation);
4678
4839
  convRef.current = conversation;
4679
- const optsRef = useRef11({ gameId, gameDay, fixtureId, locale, refresh });
4840
+ const optsRef = useRef12({ gameId, gameDay, fixtureId, locale, refresh });
4680
4841
  optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
4681
- const resultRef = useRef11(null);
4842
+ const resultRef = useRef12(null);
4682
4843
  resultRef.current = result;
4683
- const refetch = useCallback8(async () => {
4844
+ const refetch = useCallback9(async () => {
4684
4845
  const conv = convRef.current;
4685
4846
  if (!conv) return;
4686
4847
  const opts = optsRef.current;
@@ -4696,7 +4857,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
4696
4857
  } catch {
4697
4858
  }
4698
4859
  }, []);
4699
- const submit = useCallback8(async (answerJson) => {
4860
+ const submit = useCallback9(async (answerJson) => {
4700
4861
  const conv = convRef.current;
4701
4862
  if (!conv || inFlightRef.current) return;
4702
4863
  inFlightRef.current = true;
@@ -4723,14 +4884,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
4723
4884
  setSubmitting(false);
4724
4885
  }
4725
4886
  }, [refetch]);
4726
- const hydrate = useCallback8(() => {
4887
+ const hydrate = useCallback9(() => {
4727
4888
  void refetch();
4728
4889
  }, [refetch]);
4729
4890
  return { result, submitting, submit, hydrate, rawStatus };
4730
4891
  }
4731
4892
 
4732
4893
  // src/components/games/MysteryTigerGame.tsx
4733
- import { useState as useState25, useId as useId2 } from "react";
4894
+ import { useState as useState26, useId as useId2 } from "react";
4734
4895
 
4735
4896
  // src/components/games/nationFlags.ts
4736
4897
  var FLAGS = {
@@ -4941,8 +5102,8 @@ function isNationCode(flag) {
4941
5102
  }
4942
5103
 
4943
5104
  // src/components/games/PlayerAvatar.tsx
4944
- import { useState as useState24 } from "react";
4945
- import { jsx as jsx58 } from "react/jsx-runtime";
5105
+ import { useState as useState25 } from "react";
5106
+ import { jsx as jsx59 } from "react/jsx-runtime";
4946
5107
  function initialsOf(name) {
4947
5108
  const parts = name.trim().split(/\s+/).filter(Boolean);
4948
5109
  const first = parts[0];
@@ -4959,41 +5120,41 @@ function PlayerAvatar({
4959
5120
  imagePath,
4960
5121
  className
4961
5122
  }) {
4962
- const [failed, setFailed] = useState24(false);
5123
+ const [failed, setFailed] = useState25(false);
4963
5124
  const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
4964
- return /* @__PURE__ */ jsx58("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ jsx58("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ jsx58("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
5125
+ return /* @__PURE__ */ jsx59("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ jsx59("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ jsx59("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
4965
5126
  }
4966
5127
 
4967
5128
  // src/components/games/ui/GameHeader.tsx
4968
- import { jsx as jsx59, jsxs as jsxs51 } from "react/jsx-runtime";
5129
+ import { jsx as jsx60, jsxs as jsxs52 } from "react/jsx-runtime";
4969
5130
  function GameHeader({ title, eyebrow, right, onBack, backLabel }) {
4970
- return /* @__PURE__ */ jsxs51("div", { className: "ss-g-head", children: [
4971
- onBack && /* @__PURE__ */ jsx59("button", { type: "button", className: "ss-g-back", "aria-label": backLabel, onClick: onBack, children: /* @__PURE__ */ jsx59(IconChevronLeft, {}) }),
4972
- /* @__PURE__ */ jsxs51("div", { className: "ss-g-head-text", children: [
4973
- eyebrow && /* @__PURE__ */ jsx59("span", { className: "ss-g-eyebrow", children: eyebrow }),
4974
- /* @__PURE__ */ jsx59("h2", { className: "ss-g-title", children: title })
5131
+ return /* @__PURE__ */ jsxs52("div", { className: "ss-g-head", children: [
5132
+ onBack && /* @__PURE__ */ jsx60("button", { type: "button", className: "ss-g-back", "aria-label": backLabel, onClick: onBack, children: /* @__PURE__ */ jsx60(IconChevronLeft, {}) }),
5133
+ /* @__PURE__ */ jsxs52("div", { className: "ss-g-head-text", children: [
5134
+ eyebrow && /* @__PURE__ */ jsx60("span", { className: "ss-g-eyebrow", children: eyebrow }),
5135
+ /* @__PURE__ */ jsx60("h2", { className: "ss-g-title", children: title })
4975
5136
  ] }),
4976
- right && /* @__PURE__ */ jsx59("div", { className: "ss-g-head-right", children: right })
5137
+ right && /* @__PURE__ */ jsx60("div", { className: "ss-g-head-right", children: right })
4977
5138
  ] });
4978
5139
  }
4979
5140
 
4980
5141
  // src/components/games/ui/SegmentProgress.tsx
4981
- import { jsx as jsx60, jsxs as jsxs52 } from "react/jsx-runtime";
5142
+ import { jsx as jsx61, jsxs as jsxs53 } from "react/jsx-runtime";
4982
5143
  function SegmentProgress({ segments, ariaLabel, leftLabel, rightLabel, right }) {
4983
- return /* @__PURE__ */ jsxs52("div", { className: "ss-g-progress", children: [
4984
- /* @__PURE__ */ jsxs52("div", { className: "ss-g-progress-main", children: [
4985
- (leftLabel || rightLabel) && /* @__PURE__ */ jsxs52("div", { className: "ss-g-progress-labels", children: [
4986
- /* @__PURE__ */ jsx60("span", { children: leftLabel }),
4987
- /* @__PURE__ */ jsx60("span", { className: "ss-g-progress-rl", children: rightLabel })
5144
+ return /* @__PURE__ */ jsxs53("div", { className: "ss-g-progress", children: [
5145
+ /* @__PURE__ */ jsxs53("div", { className: "ss-g-progress-main", children: [
5146
+ (leftLabel || rightLabel) && /* @__PURE__ */ jsxs53("div", { className: "ss-g-progress-labels", children: [
5147
+ /* @__PURE__ */ jsx61("span", { children: leftLabel }),
5148
+ /* @__PURE__ */ jsx61("span", { className: "ss-g-progress-rl", children: rightLabel })
4988
5149
  ] }),
4989
- /* @__PURE__ */ jsx60(
5150
+ /* @__PURE__ */ jsx61(
4990
5151
  "div",
4991
5152
  {
4992
5153
  className: "ss-g-segs",
4993
5154
  role: "img",
4994
5155
  "aria-label": ariaLabel,
4995
5156
  style: { gridTemplateColumns: `repeat(${segments.length}, minmax(0, 1fr))` },
4996
- children: segments.map((s, i) => /* @__PURE__ */ jsx60("span", { className: "ss-g-seg", "data-state": s }, i))
5157
+ children: segments.map((s, i) => /* @__PURE__ */ jsx61("span", { className: "ss-g-seg", "data-state": s }, i))
4997
5158
  }
4998
5159
  )
4999
5160
  ] }),
@@ -5002,13 +5163,13 @@ function SegmentProgress({ segments, ariaLabel, leftLabel, rightLabel, right })
5002
5163
  }
5003
5164
 
5004
5165
  // src/components/games/ui/SearchField.tsx
5005
- import { jsx as jsx61, jsxs as jsxs53 } from "react/jsx-runtime";
5166
+ import { jsx as jsx62, jsxs as jsxs54 } from "react/jsx-runtime";
5006
5167
  function SearchField({ id, label, labelHidden = false, placeholder, value, onChange, disabled, inputRef, onKeyDown }) {
5007
- return /* @__PURE__ */ jsxs53("div", { className: "ss-g-search", children: [
5008
- /* @__PURE__ */ jsx61("label", { htmlFor: id, className: labelHidden ? "ss-g-sr" : "ss-g-search-label", children: label }),
5009
- /* @__PURE__ */ jsxs53("div", { className: "ss-g-search-box", children: [
5010
- /* @__PURE__ */ jsx61(IconSearch, {}),
5011
- /* @__PURE__ */ jsx61(
5168
+ return /* @__PURE__ */ jsxs54("div", { className: "ss-g-search", children: [
5169
+ /* @__PURE__ */ jsx62("label", { htmlFor: id, className: labelHidden ? "ss-g-sr" : "ss-g-search-label", children: label }),
5170
+ /* @__PURE__ */ jsxs54("div", { className: "ss-g-search-box", children: [
5171
+ /* @__PURE__ */ jsx62(IconSearch, {}),
5172
+ /* @__PURE__ */ jsx62(
5012
5173
  "input",
5013
5174
  {
5014
5175
  id,
@@ -5027,52 +5188,52 @@ function SearchField({ id, label, labelHidden = false, placeholder, value, onCha
5027
5188
  }
5028
5189
 
5029
5190
  // src/components/games/ui/FooterBar.tsx
5030
- import { jsx as jsx62 } from "react/jsx-runtime";
5191
+ import { jsx as jsx63 } from "react/jsx-runtime";
5031
5192
  function FooterBar({ children }) {
5032
- return /* @__PURE__ */ jsx62("div", { className: "ss-g-footer", children });
5193
+ return /* @__PURE__ */ jsx63("div", { className: "ss-g-footer", children });
5033
5194
  }
5034
5195
 
5035
5196
  // src/components/games/ui/Silhouette.tsx
5036
- import { jsx as jsx63, jsxs as jsxs54 } from "react/jsx-runtime";
5197
+ import { jsx as jsx64, jsxs as jsxs55 } from "react/jsx-runtime";
5037
5198
  function Silhouette({ size, variant = "default" }) {
5038
- return /* @__PURE__ */ jsxs54("span", { className: `ss-g-sil ss-g-sil--${variant}`, style: { width: size, height: size }, "aria-hidden": "true", children: [
5039
- /* @__PURE__ */ jsxs54("svg", { width: size * 0.86, height: size * 0.86, viewBox: "0 0 100 100", children: [
5040
- /* @__PURE__ */ jsx63("circle", { cx: "50", cy: "40", r: "19", fill: "currentColor" }),
5041
- /* @__PURE__ */ jsx63("path", { d: "M12 100c0-23 17-38 38-38s38 15 38 38z", fill: "currentColor" })
5199
+ return /* @__PURE__ */ jsxs55("span", { className: `ss-g-sil ss-g-sil--${variant}`, style: { width: size, height: size }, "aria-hidden": "true", children: [
5200
+ /* @__PURE__ */ jsxs55("svg", { width: size * 0.86, height: size * 0.86, viewBox: "0 0 100 100", children: [
5201
+ /* @__PURE__ */ jsx64("circle", { cx: "50", cy: "40", r: "19", fill: "currentColor" }),
5202
+ /* @__PURE__ */ jsx64("path", { d: "M12 100c0-23 17-38 38-38s38 15 38 38z", fill: "currentColor" })
5042
5203
  ] }),
5043
- variant === "mystery" && /* @__PURE__ */ jsx63("span", { className: "ss-g-sil-q", children: "?" })
5204
+ variant === "mystery" && /* @__PURE__ */ jsx64("span", { className: "ss-g-sil-q", children: "?" })
5044
5205
  ] });
5045
5206
  }
5046
5207
 
5047
5208
  // src/components/games/ui/GameButton.tsx
5048
- import { jsx as jsx64 } from "react/jsx-runtime";
5209
+ import { jsx as jsx65 } from "react/jsx-runtime";
5049
5210
  function GameButton({ variant = "primary", block = false, className, type = "button", ...rest }) {
5050
5211
  const cls = `ss-g-btn ss-g-btn--${variant}${block ? " ss-g-btn--block" : ""}${className ? ` ${className}` : ""}`;
5051
- return /* @__PURE__ */ jsx64("button", { type, className: cls, ...rest });
5212
+ return /* @__PURE__ */ jsx65("button", { type, className: cls, ...rest });
5052
5213
  }
5053
5214
 
5054
5215
  // src/components/games/ui/ResultCard.tsx
5055
- import { jsx as jsx65, jsxs as jsxs55 } from "react/jsx-runtime";
5216
+ import { jsx as jsx66, jsxs as jsxs56 } from "react/jsx-runtime";
5056
5217
  function ResultCard({ tone, title, score, detail, onBack, ui }) {
5057
- return /* @__PURE__ */ jsxs55("div", { className: "ss-g-result", "data-tone": tone, role: "status", children: [
5058
- /* @__PURE__ */ jsx65("span", { className: "ss-g-result-title", children: title }),
5059
- score !== void 0 && /* @__PURE__ */ jsxs55("span", { className: "ss-g-result-score", children: [
5060
- /* @__PURE__ */ jsx65("span", { className: "ss-g-result-num", children: score }),
5218
+ return /* @__PURE__ */ jsxs56("div", { className: "ss-g-result", "data-tone": tone, role: "status", children: [
5219
+ /* @__PURE__ */ jsx66("span", { className: "ss-g-result-title", children: title }),
5220
+ score !== void 0 && /* @__PURE__ */ jsxs56("span", { className: "ss-g-result-score", children: [
5221
+ /* @__PURE__ */ jsx66("span", { className: "ss-g-result-num", children: score }),
5061
5222
  ui.games.unitPts
5062
5223
  ] }),
5063
- detail && /* @__PURE__ */ jsx65("span", { className: "ss-g-result-detail", children: detail }),
5064
- onBack && /* @__PURE__ */ jsx65(GameButton, { variant: "outline", onClick: onBack, children: ui.games.backToGames })
5224
+ detail && /* @__PURE__ */ jsx66("span", { className: "ss-g-result-detail", children: detail }),
5225
+ onBack && /* @__PURE__ */ jsx66(GameButton, { variant: "outline", onClick: onBack, children: ui.games.backToGames })
5065
5226
  ] });
5066
5227
  }
5067
5228
 
5068
5229
  // src/components/games/ui/OptionList.tsx
5069
- import { jsx as jsx66 } from "react/jsx-runtime";
5230
+ import { jsx as jsx67 } from "react/jsx-runtime";
5070
5231
  function OptionList({ label, options, onPick }) {
5071
- return /* @__PURE__ */ jsx66("div", { className: "ss-g-opts", role: "listbox", "aria-label": label, children: options.map((o) => /* @__PURE__ */ jsx66("button", { type: "button", role: "option", "aria-selected": false, className: "ss-g-opt", onClick: () => onPick(o.key), children: o.content }, o.key)) });
5232
+ return /* @__PURE__ */ jsx67("div", { className: "ss-g-opts", role: "listbox", "aria-label": label, children: options.map((o) => /* @__PURE__ */ jsx67("button", { type: "button", role: "option", "aria-selected": false, className: "ss-g-opt", onClick: () => onPick(o.key), children: o.content }, o.key)) });
5072
5233
  }
5073
5234
 
5074
5235
  // src/components/games/MysteryTigerGame.tsx
5075
- import { Fragment as Fragment11, jsx as jsx67, jsxs as jsxs56 } from "react/jsx-runtime";
5236
+ import { Fragment as Fragment11, jsx as jsx68, jsxs as jsxs57 } from "react/jsx-runtime";
5076
5237
  function parseClientState(json) {
5077
5238
  if (!json) return null;
5078
5239
  try {
@@ -5174,7 +5335,7 @@ function MysteryTigerGame({
5174
5335
  onBack
5175
5336
  }) {
5176
5337
  const t = ui.games.mysteryTiger;
5177
- const [query, setQuery] = useState25("");
5338
+ const [query, setQuery] = useState26("");
5178
5339
  const inputId = useId2();
5179
5340
  const clientState = parseClientState(result?.clientStateJson);
5180
5341
  const guessResults = clientState?.guessResults ?? [];
@@ -5196,22 +5357,22 @@ function MysteryTigerGame({
5196
5357
  setQuery("");
5197
5358
  onSubmit(JSON.stringify({ guesses: newGuesses }));
5198
5359
  }
5199
- const headerRight = !config ? void 0 : isOver ? /* @__PURE__ */ jsxs56(Chip, { variant: "accent", children: [
5360
+ const headerRight = !config ? void 0 : isOver ? /* @__PURE__ */ jsxs57(Chip, { variant: "accent", children: [
5200
5361
  score,
5201
5362
  " ",
5202
5363
  ui.games.unitPts
5203
- ] }) : /* @__PURE__ */ jsx67("span", { "data-testid": "mt-chip", children: /* @__PURE__ */ jsxs56(Chip, { children: [
5364
+ ] }) : /* @__PURE__ */ jsx68("span", { "data-testid": "mt-chip", children: /* @__PURE__ */ jsxs57(Chip, { children: [
5204
5365
  ui.games.guess,
5205
5366
  " ",
5206
- /* @__PURE__ */ jsx67("span", { className: "ss-g-num", children: guessesUsed + 1 }),
5367
+ /* @__PURE__ */ jsx68("span", { className: "ss-g-num", children: guessesUsed + 1 }),
5207
5368
  " / ",
5208
5369
  totalGuesses
5209
5370
  ] }) });
5210
5371
  const segments = Array.from({ length: totalGuesses }, (_, i) => i < guessesUsed ? "done" : i === guessesUsed ? "current" : "todo");
5211
5372
  const cols = { gridTemplateColumns: `minmax(0, 1fr) repeat(${keys.length}, 42px)` };
5212
5373
  const known = deriveKnownAttributes(guessResults, keys);
5213
- return /* @__PURE__ */ jsxs56("div", { className: "ss-g-screen ss-g-mt", "data-testid": "game-screen-mystery-tiger", children: [
5214
- /* @__PURE__ */ jsx67(
5374
+ return /* @__PURE__ */ jsxs57("div", { className: "ss-g-screen ss-g-mt", "data-testid": "game-screen-mystery-tiger", children: [
5375
+ /* @__PURE__ */ jsx68(
5215
5376
  GameHeader,
5216
5377
  {
5217
5378
  title: gameTitle({ gameId: "mystery-tiger" }, ui.games.titles),
@@ -5221,40 +5382,40 @@ function MysteryTigerGame({
5221
5382
  backLabel: ui.back
5222
5383
  }
5223
5384
  ),
5224
- !config && /* @__PURE__ */ jsx67("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
5225
- config && /* @__PURE__ */ jsxs56(Fragment11, { children: [
5226
- /* @__PURE__ */ jsxs56("div", { className: "ss-g-body", children: [
5227
- /* @__PURE__ */ jsxs56("div", { className: `ss-g-mt-card${isOver ? " ss-g-mt-card--reveal" : ""}`, children: [
5228
- /* @__PURE__ */ jsxs56("div", { className: "ss-g-mt-portrait", children: [
5229
- revealName ? /* @__PURE__ */ jsx67(PlayerAvatar, { className: "ss-g-mt-photo", name: revealName, imagePath: clientState?.revealedPlayerImagePath }) : /* @__PURE__ */ jsx67(Silhouette, { size: 150, variant: "mystery" }),
5230
- revealName && /* @__PURE__ */ jsx67("span", { className: "ss-g-mt-reveal-name", children: revealName })
5385
+ !config && /* @__PURE__ */ jsx68("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
5386
+ config && /* @__PURE__ */ jsxs57(Fragment11, { children: [
5387
+ /* @__PURE__ */ jsxs57("div", { className: "ss-g-body", children: [
5388
+ /* @__PURE__ */ jsxs57("div", { className: `ss-g-mt-card${isOver ? " ss-g-mt-card--reveal" : ""}`, children: [
5389
+ /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-portrait", children: [
5390
+ revealName ? /* @__PURE__ */ jsx68(PlayerAvatar, { className: "ss-g-mt-photo", name: revealName, imagePath: clientState?.revealedPlayerImagePath }) : /* @__PURE__ */ jsx68(Silhouette, { size: 150, variant: "mystery" }),
5391
+ revealName && /* @__PURE__ */ jsx68("span", { className: "ss-g-mt-reveal-name", children: revealName })
5231
5392
  ] }),
5232
- /* @__PURE__ */ jsx67("div", { className: "ss-g-mt-known", style: { gridTemplateColumns: `repeat(${keys.length}, minmax(0, 1fr))` }, children: known.map((k) => /* @__PURE__ */ jsxs56("div", { className: "ss-g-mt-known-cell", children: [
5233
- /* @__PURE__ */ jsx67("span", { className: "ss-g-mt-lab", children: t.labels[k.key] }),
5234
- /* @__PURE__ */ jsx67("span", { className: "ss-g-mt-known-v", "data-state": k.state, "data-testid": `known-${k.key}`, children: k.text })
5393
+ /* @__PURE__ */ jsx68("div", { className: "ss-g-mt-known", style: { gridTemplateColumns: `repeat(${keys.length}, minmax(0, 1fr))` }, children: known.map((k) => /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-known-cell", children: [
5394
+ /* @__PURE__ */ jsx68("span", { className: "ss-g-mt-lab", children: t.labels[k.key] }),
5395
+ /* @__PURE__ */ jsx68("span", { className: "ss-g-mt-known-v", "data-state": k.state, "data-testid": `known-${k.key}`, children: k.text })
5235
5396
  ] }, k.key)) })
5236
5397
  ] }),
5237
- !isOver && /* @__PURE__ */ jsx67(SegmentProgress, { segments, ariaLabel: t.progress(guessesUsed, totalGuesses) }),
5238
- guessResults.length > 0 && /* @__PURE__ */ jsxs56("div", { className: "ss-g-mt-table", children: [
5239
- /* @__PURE__ */ jsxs56("div", { className: "ss-g-mt-thead", style: cols, children: [
5240
- /* @__PURE__ */ jsx67("span", { children: t.yourGuesses }),
5241
- keys.map((k) => /* @__PURE__ */ jsx67("span", { children: t.labels[k] }, k))
5398
+ !isOver && /* @__PURE__ */ jsx68(SegmentProgress, { segments, ariaLabel: t.progress(guessesUsed, totalGuesses) }),
5399
+ guessResults.length > 0 && /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-table", children: [
5400
+ /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-thead", style: cols, children: [
5401
+ /* @__PURE__ */ jsx68("span", { children: t.yourGuesses }),
5402
+ keys.map((k) => /* @__PURE__ */ jsx68("span", { children: t.labels[k] }, k))
5242
5403
  ] }),
5243
5404
  guessResults.map((gr, i) => {
5244
5405
  const name = config.squadPlayers.find((p) => p.id === gr.playerId)?.name ?? `#${gr.playerId}`;
5245
5406
  const { first, last } = splitName(name);
5246
- return /* @__PURE__ */ jsxs56("div", { className: "ss-g-mt-row", style: cols, children: [
5247
- /* @__PURE__ */ jsxs56("div", { className: "ss-g-mt-who", children: [
5248
- /* @__PURE__ */ jsx67(PlayerAvatar, { className: "ss-g-mt-av", name }),
5249
- /* @__PURE__ */ jsxs56("span", { className: "ss-g-mt-names", children: [
5250
- first && /* @__PURE__ */ jsx67("span", { className: "ss-g-mt-first", children: first }),
5251
- /* @__PURE__ */ jsx67("span", { className: "ss-g-mt-last", children: last })
5407
+ return /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-row", style: cols, children: [
5408
+ /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-who", children: [
5409
+ /* @__PURE__ */ jsx68(PlayerAvatar, { className: "ss-g-mt-av", name }),
5410
+ /* @__PURE__ */ jsxs57("span", { className: "ss-g-mt-names", children: [
5411
+ first && /* @__PURE__ */ jsx68("span", { className: "ss-g-mt-first", children: first }),
5412
+ /* @__PURE__ */ jsx68("span", { className: "ss-g-mt-last", children: last })
5252
5413
  ] })
5253
5414
  ] }),
5254
5415
  keys.map((key) => {
5255
5416
  const v = gr[key];
5256
5417
  const arrow = directionArrow(v);
5257
- return /* @__PURE__ */ jsxs56(
5418
+ return /* @__PURE__ */ jsxs57(
5258
5419
  "div",
5259
5420
  {
5260
5421
  className: "ss-g-mt-cell",
@@ -5262,8 +5423,8 @@ function MysteryTigerGame({
5262
5423
  "data-verdict": v.verdict,
5263
5424
  "aria-label": `${t.labels[key]}: ${v.value ?? v.verdict}${v.direction ? ` ${v.direction}` : ""}`,
5264
5425
  children: [
5265
- /* @__PURE__ */ jsx67("span", { className: "ss-g-mt-cell-v", "aria-hidden": "true", children: tileFace(key, v) }),
5266
- arrow && /* @__PURE__ */ jsx67("span", { className: "ss-g-mt-cell-dir", "aria-hidden": "true", children: arrow })
5426
+ /* @__PURE__ */ jsx68("span", { className: "ss-g-mt-cell-v", "aria-hidden": "true", children: tileFace(key, v) }),
5427
+ arrow && /* @__PURE__ */ jsx68("span", { className: "ss-g-mt-cell-dir", "aria-hidden": "true", children: arrow })
5267
5428
  ]
5268
5429
  },
5269
5430
  key
@@ -5272,25 +5433,25 @@ function MysteryTigerGame({
5272
5433
  ] }, gr.playerId);
5273
5434
  })
5274
5435
  ] }),
5275
- !isOver && /* @__PURE__ */ jsxs56("div", { className: "ss-g-mt-legend", children: [
5276
- /* @__PURE__ */ jsxs56("span", { children: [
5277
- /* @__PURE__ */ jsx67("i", { className: "ss-g-mt-sw", "data-verdict": "exact" }),
5436
+ !isOver && /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-legend", children: [
5437
+ /* @__PURE__ */ jsxs57("span", { children: [
5438
+ /* @__PURE__ */ jsx68("i", { className: "ss-g-mt-sw", "data-verdict": "exact" }),
5278
5439
  t.legendMatch
5279
5440
  ] }),
5280
- /* @__PURE__ */ jsxs56("span", { children: [
5281
- /* @__PURE__ */ jsx67("i", { className: "ss-g-mt-sw", "data-verdict": "near" }),
5441
+ /* @__PURE__ */ jsxs57("span", { children: [
5442
+ /* @__PURE__ */ jsx68("i", { className: "ss-g-mt-sw", "data-verdict": "near" }),
5282
5443
  t.legendClose
5283
5444
  ] }),
5284
- /* @__PURE__ */ jsxs56("span", { children: [
5445
+ /* @__PURE__ */ jsxs57("span", { children: [
5285
5446
  "\u25B2 ",
5286
5447
  t.legendHigher
5287
5448
  ] })
5288
5449
  ] }),
5289
- clientState?.hintLine && !isOver && /* @__PURE__ */ jsxs56("div", { className: "ss-g-mt-hint", children: [
5290
- /* @__PURE__ */ jsx67(IconBulb, {}),
5291
- /* @__PURE__ */ jsx67("span", { children: clientState.hintLine })
5450
+ clientState?.hintLine && !isOver && /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-hint", children: [
5451
+ /* @__PURE__ */ jsx68(IconBulb, {}),
5452
+ /* @__PURE__ */ jsx68("span", { children: clientState.hintLine })
5292
5453
  ] }),
5293
- isOver && /* @__PURE__ */ jsx67(
5454
+ isOver && /* @__PURE__ */ jsx68(
5294
5455
  ResultCard,
5295
5456
  {
5296
5457
  tone: clientState?.solved ? "win" : clientState?.failed ? "lose" : "neutral",
@@ -5302,22 +5463,22 @@ function MysteryTigerGame({
5302
5463
  }
5303
5464
  )
5304
5465
  ] }),
5305
- !isOver && /* @__PURE__ */ jsxs56(FooterBar, { children: [
5306
- query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx67(
5466
+ !isOver && /* @__PURE__ */ jsxs57(FooterBar, { children: [
5467
+ query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx68(
5307
5468
  OptionList,
5308
5469
  {
5309
5470
  label: t.optionsLabel,
5310
5471
  options: filtered.map((p) => ({
5311
5472
  key: p.id,
5312
- content: /* @__PURE__ */ jsxs56(Fragment11, { children: [
5313
- /* @__PURE__ */ jsx67(PlayerAvatar, { className: "ss-g-opt-av", name: p.name }),
5314
- /* @__PURE__ */ jsx67("span", { children: p.name })
5473
+ content: /* @__PURE__ */ jsxs57(Fragment11, { children: [
5474
+ /* @__PURE__ */ jsx68(PlayerAvatar, { className: "ss-g-opt-av", name: p.name }),
5475
+ /* @__PURE__ */ jsx68("span", { children: p.name })
5315
5476
  ] })
5316
5477
  })),
5317
5478
  onPick: (k) => handleSelect(Number(k))
5318
5479
  }
5319
5480
  ),
5320
- /* @__PURE__ */ jsx67(
5481
+ /* @__PURE__ */ jsx68(
5321
5482
  SearchField,
5322
5483
  {
5323
5484
  id: inputId,
@@ -5334,7 +5495,7 @@ function MysteryTigerGame({
5334
5495
  }
5335
5496
 
5336
5497
  // src/components/games/HigherOrLowerGame.tsx
5337
- import { Fragment as Fragment12, jsx as jsx68, jsxs as jsxs57 } from "react/jsx-runtime";
5498
+ import { Fragment as Fragment12, jsx as jsx69, jsxs as jsxs58 } from "react/jsx-runtime";
5338
5499
  var POINTS_PER_CORRECT = 10;
5339
5500
  function parseClientState2(json) {
5340
5501
  if (!json) return null;
@@ -5346,11 +5507,11 @@ function parseClientState2(json) {
5346
5507
  }
5347
5508
  function PlayerCard({ name, imagePath, highlight, children }) {
5348
5509
  const { first, last } = splitName(name);
5349
- return /* @__PURE__ */ jsxs57("div", { className: `ss-g-hl-card${highlight ? " ss-g-hl-card--b" : ""}`, children: [
5350
- /* @__PURE__ */ jsx68("div", { className: "ss-g-hl-photo-wrap", children: imagePath ? /* @__PURE__ */ jsx68(PlayerAvatar, { className: "ss-g-hl-photo", name, imagePath }) : /* @__PURE__ */ jsx68(Silhouette, { size: 150 }) }),
5351
- /* @__PURE__ */ jsxs57("div", { className: "ss-g-hl-info", children: [
5352
- first && /* @__PURE__ */ jsx68("span", { className: "ss-g-hl-first", children: first }),
5353
- /* @__PURE__ */ jsx68("span", { className: "ss-g-hl-surname", children: last }),
5510
+ return /* @__PURE__ */ jsxs58("div", { className: `ss-g-hl-card${highlight ? " ss-g-hl-card--b" : ""}`, children: [
5511
+ /* @__PURE__ */ jsx69("div", { className: "ss-g-hl-photo-wrap", children: imagePath ? /* @__PURE__ */ jsx69(PlayerAvatar, { className: "ss-g-hl-photo", name, imagePath }) : /* @__PURE__ */ jsx69(Silhouette, { size: 150 }) }),
5512
+ /* @__PURE__ */ jsxs58("div", { className: "ss-g-hl-info", children: [
5513
+ first && /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-first", children: first }),
5514
+ /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-surname", children: last }),
5354
5515
  children
5355
5516
  ] })
5356
5517
  ] });
@@ -5382,47 +5543,47 @@ function HigherOrLowerGame({
5382
5543
  const newAnswers = [...prevAnswers, { pairIndex: currentPair.pairIndex, pick }];
5383
5544
  onSubmit(JSON.stringify({ answers: newAnswers }));
5384
5545
  }
5385
- return /* @__PURE__ */ jsxs57("div", { className: "ss-g-screen ss-g-hl", "data-testid": "game-screen-higher-or-lower", children: [
5386
- /* @__PURE__ */ jsx68(
5546
+ return /* @__PURE__ */ jsxs58("div", { className: "ss-g-screen ss-g-hl", "data-testid": "game-screen-higher-or-lower", children: [
5547
+ /* @__PURE__ */ jsx69(
5387
5548
  GameHeader,
5388
5549
  {
5389
5550
  title: gameTitle({ gameId: "higher-or-lower" }, ui.games.titles),
5390
5551
  eyebrow: t.eyebrow(POINTS_PER_CORRECT),
5391
- right: config ? /* @__PURE__ */ jsx68(StatStack, { value: runLength, label: t.streak }) : void 0,
5552
+ right: config ? /* @__PURE__ */ jsx69(StatStack, { value: runLength, label: t.streak }) : void 0,
5392
5553
  onBack,
5393
5554
  backLabel: ui.back
5394
5555
  }
5395
5556
  ),
5396
- !config && /* @__PURE__ */ jsx68("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
5397
- config && /* @__PURE__ */ jsxs57(Fragment12, { children: [
5398
- /* @__PURE__ */ jsxs57("div", { className: "ss-g-body", children: [
5399
- /* @__PURE__ */ jsxs57("div", { className: "ss-g-hl-prompt", "data-testid": "hol-prompt", children: [
5400
- /* @__PURE__ */ jsx68("span", { className: "ss-g-hl-prompt-q", children: t.whoHadMore }),
5401
- /* @__PURE__ */ jsx68("span", { className: "ss-g-hl-prompt-stat", children: config.statLabel }),
5402
- /* @__PURE__ */ jsx68("span", { className: "ss-g-hl-prompt-season", children: t.season(config.seasonLabel) })
5557
+ !config && /* @__PURE__ */ jsx69("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
5558
+ config && /* @__PURE__ */ jsxs58(Fragment12, { children: [
5559
+ /* @__PURE__ */ jsxs58("div", { className: "ss-g-body", children: [
5560
+ /* @__PURE__ */ jsxs58("div", { className: "ss-g-hl-prompt", "data-testid": "hol-prompt", children: [
5561
+ /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-prompt-q", children: t.whoHadMore }),
5562
+ /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-prompt-stat", children: config.statLabel }),
5563
+ /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-prompt-season", children: t.season(config.seasonLabel) })
5403
5564
  ] }),
5404
- currentPair && /* @__PURE__ */ jsxs57("div", { className: "ss-g-hl-pair", children: [
5405
- /* @__PURE__ */ jsxs57(PlayerCard, { name: currentPair.playerAName, imagePath: currentPair.playerAImagePath, children: [
5406
- /* @__PURE__ */ jsx68("span", { className: "ss-g-hl-value", children: currentPair.playerAValue }),
5407
- /* @__PURE__ */ jsx68("span", { className: "ss-g-hl-stat", children: config.statLabel })
5565
+ currentPair && /* @__PURE__ */ jsxs58("div", { className: "ss-g-hl-pair", children: [
5566
+ /* @__PURE__ */ jsxs58(PlayerCard, { name: currentPair.playerAName, imagePath: currentPair.playerAImagePath, children: [
5567
+ /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-value", children: currentPair.playerAValue }),
5568
+ /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-stat", children: config.statLabel })
5408
5569
  ] }),
5409
- /* @__PURE__ */ jsx68("span", { className: "ss-g-hl-vs", "aria-hidden": "true", children: t.vs }),
5410
- /* @__PURE__ */ jsx68(PlayerCard, { name: currentPair.playerBName, imagePath: currentPair.playerBImagePath, highlight: true, children: /* @__PURE__ */ jsxs57("div", { className: "ss-g-hl-btns", children: [
5411
- /* @__PURE__ */ jsxs57(GameButton, { variant: "primary", disabled: submitting, onClick: () => handlePick("higher"), children: [
5412
- /* @__PURE__ */ jsx68(IconArrowUp, { size: 16 }),
5570
+ /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-vs", "aria-hidden": "true", children: t.vs }),
5571
+ /* @__PURE__ */ jsx69(PlayerCard, { name: currentPair.playerBName, imagePath: currentPair.playerBImagePath, highlight: true, children: /* @__PURE__ */ jsxs58("div", { className: "ss-g-hl-btns", children: [
5572
+ /* @__PURE__ */ jsxs58(GameButton, { variant: "primary", disabled: submitting, onClick: () => handlePick("higher"), children: [
5573
+ /* @__PURE__ */ jsx69(IconArrowUp, { size: 16 }),
5413
5574
  t.higher
5414
5575
  ] }),
5415
- /* @__PURE__ */ jsxs57(GameButton, { variant: "outline", disabled: submitting, onClick: () => handlePick("lower"), children: [
5416
- /* @__PURE__ */ jsx68(IconArrowDown, { size: 16 }),
5576
+ /* @__PURE__ */ jsxs58(GameButton, { variant: "outline", disabled: submitting, onClick: () => handlePick("lower"), children: [
5577
+ /* @__PURE__ */ jsx69(IconArrowDown, { size: 16 }),
5417
5578
  t.lower
5418
5579
  ] })
5419
5580
  ] }) })
5420
5581
  ] }),
5421
- lastAnswer && lastAnswerPair && /* @__PURE__ */ jsxs57("p", { className: "ss-g-hl-feedback", "data-testid": "hol-last", "data-correct": lastAnswer.wasCorrect ? "true" : "false", children: [
5422
- lastAnswer.wasCorrect ? /* @__PURE__ */ jsx68(IconCheck, {}) : /* @__PURE__ */ jsx68(IconClose, {}),
5582
+ lastAnswer && lastAnswerPair && /* @__PURE__ */ jsxs58("p", { className: "ss-g-hl-feedback", "data-testid": "hol-last", "data-correct": lastAnswer.wasCorrect ? "true" : "false", children: [
5583
+ lastAnswer.wasCorrect ? /* @__PURE__ */ jsx69(IconCheck, {}) : /* @__PURE__ */ jsx69(IconClose, {}),
5423
5584
  t.lastAnswer(splitName(lastAnswerPair.playerBName).last, lastAnswer.playerBValue)
5424
5585
  ] }),
5425
- isOver && /* @__PURE__ */ jsx68(
5586
+ isOver && /* @__PURE__ */ jsx69(
5426
5587
  ResultCard,
5427
5588
  {
5428
5589
  tone: runEndedWrong ? "lose" : allPairsAnswered ? "win" : "neutral",
@@ -5434,15 +5595,15 @@ function HigherOrLowerGame({
5434
5595
  }
5435
5596
  )
5436
5597
  ] }),
5437
- !isOver && /* @__PURE__ */ jsx68(FooterBar, { children: /* @__PURE__ */ jsxs57("div", { className: "ss-g-hl-foot", children: [
5438
- /* @__PURE__ */ jsx68("div", { className: "ss-g-hl-dots", role: "img", "aria-label": t.answersSoFar(answeredCount, config.pairs.length), children: config.pairs.map((p, i) => {
5598
+ !isOver && /* @__PURE__ */ jsx69(FooterBar, { children: /* @__PURE__ */ jsxs58("div", { className: "ss-g-hl-foot", children: [
5599
+ /* @__PURE__ */ jsx69("div", { className: "ss-g-hl-dots", role: "img", "aria-label": t.answersSoFar(answeredCount, config.pairs.length), children: config.pairs.map((p, i) => {
5439
5600
  const a = answeredPairs[i];
5440
- return /* @__PURE__ */ jsx68("span", { className: "ss-g-hl-dot", "data-state": a ? a.wasCorrect ? "correct" : "wrong" : "todo" }, p.pairIndex);
5601
+ return /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-dot", "data-state": a ? a.wasCorrect ? "correct" : "wrong" : "todo" }, p.pairIndex);
5441
5602
  }) }),
5442
- /* @__PURE__ */ jsxs57("span", { className: "ss-g-hl-pts", children: [
5443
- /* @__PURE__ */ jsx68("span", { "data-testid": "hol-score", children: score }),
5603
+ /* @__PURE__ */ jsxs58("span", { className: "ss-g-hl-pts", children: [
5604
+ /* @__PURE__ */ jsx69("span", { "data-testid": "hol-score", children: score }),
5444
5605
  " ",
5445
- /* @__PURE__ */ jsx68("span", { className: "ss-g-hl-pts-unit", children: ui.games.unitPts })
5606
+ /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-pts-unit", children: ui.games.unitPts })
5446
5607
  ] })
5447
5608
  ] }) })
5448
5609
  ] })
@@ -5450,21 +5611,21 @@ function HigherOrLowerGame({
5450
5611
  }
5451
5612
 
5452
5613
  // src/components/games/CareerPathGame.tsx
5453
- import { useState as useState27, useId as useId3 } from "react";
5614
+ import { useState as useState28, useId as useId3 } from "react";
5454
5615
 
5455
5616
  // src/components/games/ui/CrestShield.tsx
5456
- import { useState as useState26 } from "react";
5457
- import { jsx as jsx69 } from "react/jsx-runtime";
5617
+ import { useState as useState27 } from "react";
5618
+ import { jsx as jsx70 } from "react/jsx-runtime";
5458
5619
  function CrestShield({ src, name, size = 28 }) {
5459
- const [failed, setFailed] = useState26(false);
5620
+ const [failed, setFailed] = useState27(false);
5460
5621
  if (src && !isPlaceholderImage(src) && !failed) {
5461
- return /* @__PURE__ */ jsx69("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
5622
+ return /* @__PURE__ */ jsx70("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
5462
5623
  }
5463
- return /* @__PURE__ */ jsx69("svg", { className: "ss-g-crest ss-g-crest--ph", width: size, height: size * 32 / 28, viewBox: "0 0 28 32", role: "img", "aria-label": name, children: /* @__PURE__ */ jsx69("path", { d: "M2 3h24v12c0 9-6 14-12 17C8 29 2 24 2 15z", fill: "currentColor" }) });
5624
+ return /* @__PURE__ */ jsx70("svg", { className: "ss-g-crest ss-g-crest--ph", width: size, height: size * 32 / 28, viewBox: "0 0 28 32", role: "img", "aria-label": name, children: /* @__PURE__ */ jsx70("path", { d: "M2 3h24v12c0 9-6 14-12 17C8 29 2 24 2 15z", fill: "currentColor" }) });
5464
5625
  }
5465
5626
 
5466
5627
  // src/components/games/CareerPathGame.tsx
5467
- import { Fragment as Fragment13, jsx as jsx70, jsxs as jsxs58 } from "react/jsx-runtime";
5628
+ import { Fragment as Fragment13, jsx as jsx71, jsxs as jsxs59 } from "react/jsx-runtime";
5468
5629
  function parseClientState3(json) {
5469
5630
  if (!json) return null;
5470
5631
  try {
@@ -5488,15 +5649,15 @@ function CareerPathGame({
5488
5649
  }) {
5489
5650
  const s = ui.games.careerPath;
5490
5651
  const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
5491
- const [query, setQuery] = useState27("");
5652
+ const [query, setQuery] = useState28("");
5492
5653
  const inputId = useId3();
5493
5654
  const clientState = parseClientState3(result?.clientStateJson);
5494
5655
  const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
5495
5656
  const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
5496
5657
  if (!config) {
5497
- return /* @__PURE__ */ jsxs58("div", { className: "ss-g-screen", "data-testid": "game-screen-career-path", children: [
5498
- /* @__PURE__ */ jsx70(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
5499
- /* @__PURE__ */ jsx70("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
5658
+ return /* @__PURE__ */ jsxs59("div", { className: "ss-g-screen", "data-testid": "game-screen-career-path", children: [
5659
+ /* @__PURE__ */ jsx71(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
5660
+ /* @__PURE__ */ jsx71("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
5500
5661
  ] });
5501
5662
  }
5502
5663
  const visiblePath = clientState?.visiblePath ?? config.initialPath;
@@ -5512,60 +5673,60 @@ function CareerPathGame({
5512
5673
  setQuery("");
5513
5674
  onSubmit(JSON.stringify({ guesses: newGuesses }));
5514
5675
  }
5515
- const right = !isOver && clientState ? /* @__PURE__ */ jsx70("span", { "data-testid": "cp-guess-chip", children: /* @__PURE__ */ jsxs58(Chip, { variant: "neutral", children: [
5676
+ const right = !isOver && clientState ? /* @__PURE__ */ jsx71("span", { "data-testid": "cp-guess-chip", children: /* @__PURE__ */ jsxs59(Chip, { variant: "neutral", children: [
5516
5677
  ui.games.guess,
5517
5678
  " ",
5518
- /* @__PURE__ */ jsx70("span", { className: "ss-g-num", children: clientState.guessesUsed + 1 }),
5679
+ /* @__PURE__ */ jsx71("span", { className: "ss-g-num", children: clientState.guessesUsed + 1 }),
5519
5680
  " / ",
5520
5681
  clientState.guessesUsed + clientState.guessesRemaining
5521
5682
  ] }) }) : void 0;
5522
5683
  const outcome = clientState?.solved ? s.solved : clientState?.failed ? s.failed : ui.games.done;
5523
- return /* @__PURE__ */ jsxs58("div", { className: "ss-g-screen", "data-testid": "game-screen-career-path", children: [
5524
- /* @__PURE__ */ jsx70(GameHeader, { title, eyebrow: s.eyebrow, right, onBack, backLabel: ui.back }),
5525
- /* @__PURE__ */ jsxs58("div", { className: "ss-g-body", children: [
5526
- /* @__PURE__ */ jsxs58("div", { className: "ss-g-cp-card", children: [
5527
- isOver && clientState?.revealedPlayerName ? /* @__PURE__ */ jsx70(PlayerAvatar, { className: "ss-g-cp-photo", name: clientState.revealedPlayerName, imagePath: clientState.revealedPlayerImagePath }) : /* @__PURE__ */ jsx70(Silhouette, { size: 64, variant: isOver ? "default" : "mystery" }),
5528
- /* @__PURE__ */ jsxs58("div", { className: "ss-g-cp-card-text", children: [
5529
- /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-card-title", children: isOver && clientState?.revealedPlayerName ? clientState.revealedPlayerName : s.mysteryPlayer }),
5530
- clientState?.hintLine ? /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-hint", children: clientState.hintLine }) : !isOver ? /* @__PURE__ */ jsxs58("span", { className: "ss-g-cp-locks", children: [
5531
- /* @__PURE__ */ jsx70(Chip, { variant: "lock", icon: /* @__PURE__ */ jsx70(IconLock, { size: 11 }), children: s.lockPosition }),
5532
- /* @__PURE__ */ jsx70(Chip, { variant: "lock", icon: /* @__PURE__ */ jsx70(IconLock, { size: 11 }), children: s.lockNationality })
5684
+ return /* @__PURE__ */ jsxs59("div", { className: "ss-g-screen", "data-testid": "game-screen-career-path", children: [
5685
+ /* @__PURE__ */ jsx71(GameHeader, { title, eyebrow: s.eyebrow, right, onBack, backLabel: ui.back }),
5686
+ /* @__PURE__ */ jsxs59("div", { className: "ss-g-body", children: [
5687
+ /* @__PURE__ */ jsxs59("div", { className: "ss-g-cp-card", children: [
5688
+ isOver && clientState?.revealedPlayerName ? /* @__PURE__ */ jsx71(PlayerAvatar, { className: "ss-g-cp-photo", name: clientState.revealedPlayerName, imagePath: clientState.revealedPlayerImagePath }) : /* @__PURE__ */ jsx71(Silhouette, { size: 64, variant: isOver ? "default" : "mystery" }),
5689
+ /* @__PURE__ */ jsxs59("div", { className: "ss-g-cp-card-text", children: [
5690
+ /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-card-title", children: isOver && clientState?.revealedPlayerName ? clientState.revealedPlayerName : s.mysteryPlayer }),
5691
+ clientState?.hintLine ? /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-hint", children: clientState.hintLine }) : !isOver ? /* @__PURE__ */ jsxs59("span", { className: "ss-g-cp-locks", children: [
5692
+ /* @__PURE__ */ jsx71(Chip, { variant: "lock", icon: /* @__PURE__ */ jsx71(IconLock, { size: 11 }), children: s.lockPosition }),
5693
+ /* @__PURE__ */ jsx71(Chip, { variant: "lock", icon: /* @__PURE__ */ jsx71(IconLock, { size: 11 }), children: s.lockNationality })
5533
5694
  ] }) : null
5534
5695
  ] })
5535
5696
  ] }),
5536
- /* @__PURE__ */ jsxs58("ol", { className: "ss-g-cp-line", children: [
5697
+ /* @__PURE__ */ jsxs59("ol", { className: "ss-g-cp-line", children: [
5537
5698
  visiblePath.map((spell, i) => {
5538
5699
  const years = i === 0 ? s.firstClub : spellYears(spell);
5539
- return /* @__PURE__ */ jsxs58("li", { className: "ss-g-cp-step", children: [
5540
- /* @__PURE__ */ jsxs58("span", { className: "ss-g-cp-rail", children: [
5541
- /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-tile", children: /* @__PURE__ */ jsx70(CrestShield, { src: spell.crestUrl, name: spell.clubName, size: 30 }) }),
5542
- /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-conn", "aria-hidden": "true" })
5700
+ return /* @__PURE__ */ jsxs59("li", { className: "ss-g-cp-step", children: [
5701
+ /* @__PURE__ */ jsxs59("span", { className: "ss-g-cp-rail", children: [
5702
+ /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-tile", children: /* @__PURE__ */ jsx71(CrestShield, { src: spell.crestUrl, name: spell.clubName, size: 30 }) }),
5703
+ /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-conn", "aria-hidden": "true" })
5543
5704
  ] }),
5544
- /* @__PURE__ */ jsxs58("span", { className: "ss-g-cp-step-text", children: [
5545
- /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-club", children: spell.clubName }),
5546
- /* @__PURE__ */ jsxs58("span", { className: "ss-g-cp-sub", children: [
5547
- /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-years", children: years }),
5548
- spell.isLoan && /* @__PURE__ */ jsxs58(Fragment13, { children: [
5705
+ /* @__PURE__ */ jsxs59("span", { className: "ss-g-cp-step-text", children: [
5706
+ /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-club", children: spell.clubName }),
5707
+ /* @__PURE__ */ jsxs59("span", { className: "ss-g-cp-sub", children: [
5708
+ /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-years", children: years }),
5709
+ spell.isLoan && /* @__PURE__ */ jsxs59(Fragment13, { children: [
5549
5710
  years ? " \xB7 " : "",
5550
- /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-loan", children: s.loan })
5711
+ /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-loan", children: s.loan })
5551
5712
  ] })
5552
5713
  ] })
5553
5714
  ] })
5554
5715
  ] }, `${spell.clubName}-${i}`);
5555
5716
  }),
5556
- hidden > 0 && /* @__PURE__ */ jsxs58("li", { className: "ss-g-cp-step ss-g-cp-step--hidden", children: [
5557
- /* @__PURE__ */ jsxs58("span", { className: "ss-g-cp-rail", children: [
5558
- /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-tile ss-g-cp-tile--locked", children: /* @__PURE__ */ jsx70(IconLock, { size: 18 }) }),
5559
- hidden > 1 && /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-conn ss-g-cp-conn--faint", "aria-hidden": "true" })
5717
+ hidden > 0 && /* @__PURE__ */ jsxs59("li", { className: "ss-g-cp-step ss-g-cp-step--hidden", children: [
5718
+ /* @__PURE__ */ jsxs59("span", { className: "ss-g-cp-rail", children: [
5719
+ /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-tile ss-g-cp-tile--locked", children: /* @__PURE__ */ jsx71(IconLock, { size: 18 }) }),
5720
+ hidden > 1 && /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-conn ss-g-cp-conn--faint", "aria-hidden": "true" })
5560
5721
  ] }),
5561
- /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-step-text", children: /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-sub", children: s.nextClubHidden }) })
5722
+ /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-step-text", children: /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-sub", children: s.nextClubHidden }) })
5562
5723
  ] }),
5563
- hidden > 1 && /* @__PURE__ */ jsxs58("li", { className: "ss-g-cp-step ss-g-cp-step--more", children: [
5564
- /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-rail", children: /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-tile ss-g-cp-tile--faint", children: /* @__PURE__ */ jsx70(IconLock, { size: 18 }) }) }),
5565
- /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-step-text", children: /* @__PURE__ */ jsx70("span", { className: "ss-g-cp-sub", children: s.moreClubs(hidden - 1) }) })
5724
+ hidden > 1 && /* @__PURE__ */ jsxs59("li", { className: "ss-g-cp-step ss-g-cp-step--more", children: [
5725
+ /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-rail", children: /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-tile ss-g-cp-tile--faint", children: /* @__PURE__ */ jsx71(IconLock, { size: 18 }) }) }),
5726
+ /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-step-text", children: /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-sub", children: s.moreClubs(hidden - 1) }) })
5566
5727
  ] })
5567
5728
  ] }),
5568
- isOver && /* @__PURE__ */ jsx70(
5729
+ isOver && /* @__PURE__ */ jsx71(
5569
5730
  ResultCard,
5570
5731
  {
5571
5732
  tone: clientState?.solved ? "win" : clientState?.failed ? "lose" : "neutral",
@@ -5577,22 +5738,22 @@ function CareerPathGame({
5577
5738
  }
5578
5739
  )
5579
5740
  ] }),
5580
- !isOver && /* @__PURE__ */ jsxs58(FooterBar, { children: [
5581
- query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx70(
5741
+ !isOver && /* @__PURE__ */ jsxs59(FooterBar, { children: [
5742
+ query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx71(
5582
5743
  OptionList,
5583
5744
  {
5584
5745
  label: s.searchLabel,
5585
5746
  options: filtered.map((p) => ({
5586
5747
  key: p.id,
5587
- content: /* @__PURE__ */ jsxs58(Fragment13, { children: [
5588
- /* @__PURE__ */ jsx70(PlayerAvatar, { className: "ss-g-opt-av", name: p.name }),
5589
- /* @__PURE__ */ jsx70("span", { children: p.name })
5748
+ content: /* @__PURE__ */ jsxs59(Fragment13, { children: [
5749
+ /* @__PURE__ */ jsx71(PlayerAvatar, { className: "ss-g-opt-av", name: p.name }),
5750
+ /* @__PURE__ */ jsx71("span", { children: p.name })
5590
5751
  ] })
5591
5752
  })),
5592
5753
  onPick: (k) => handleSelect(Number(k))
5593
5754
  }
5594
5755
  ),
5595
- /* @__PURE__ */ jsx70(
5756
+ /* @__PURE__ */ jsx71(
5596
5757
  SearchField,
5597
5758
  {
5598
5759
  id: inputId,
@@ -5608,8 +5769,8 @@ function CareerPathGame({
5608
5769
  }
5609
5770
 
5610
5771
  // src/components/games/BeatTheGridGame.tsx
5611
- import React, { useEffect as useEffect14, useId as useId4, useRef as useRef12, useState as useState28 } from "react";
5612
- import { Fragment as Fragment14, jsx as jsx71, jsxs as jsxs59 } from "react/jsx-runtime";
5772
+ import React, { useEffect as useEffect15, useId as useId4, useRef as useRef13, useState as useState29 } from "react";
5773
+ import { Fragment as Fragment14, jsx as jsx72, jsxs as jsxs60 } from "react/jsx-runtime";
5613
5774
  function criterionIconKind(label, key) {
5614
5775
  const l = (key ?? label).toLowerCase();
5615
5776
  if (l.includes("app")) return "calendar";
@@ -5627,34 +5788,34 @@ function rowAbbrev(label, map, key) {
5627
5788
  function CriterionIcon({ kind }) {
5628
5789
  switch (kind) {
5629
5790
  case "calendar":
5630
- return /* @__PURE__ */ jsx71(IconCalendar, {});
5791
+ return /* @__PURE__ */ jsx72(IconCalendar, {});
5631
5792
  case "ball":
5632
- return /* @__PURE__ */ jsx71(IconBall, {});
5793
+ return /* @__PURE__ */ jsx72(IconBall, {});
5633
5794
  case "boot":
5634
- return /* @__PURE__ */ jsx71(IconBoot, {});
5795
+ return /* @__PURE__ */ jsx72(IconBoot, {});
5635
5796
  case "gloves":
5636
- return /* @__PURE__ */ jsx71(IconGloves, {});
5797
+ return /* @__PURE__ */ jsx72(IconGloves, {});
5637
5798
  case "shield":
5638
- return /* @__PURE__ */ jsx71(IconShield, {});
5799
+ return /* @__PURE__ */ jsx72(IconShield, {});
5639
5800
  default:
5640
- return /* @__PURE__ */ jsx71(IconFlag, {});
5801
+ return /* @__PURE__ */ jsx72(IconFlag, {});
5641
5802
  }
5642
5803
  }
5643
5804
  function HeaderVisual({ label, textKey: iKey, meta }) {
5644
5805
  if (!meta) {
5645
- return /* @__PURE__ */ jsx71(CriterionIcon, { kind: criterionIconKind(label, iKey) });
5806
+ return /* @__PURE__ */ jsx72(CriterionIcon, { kind: criterionIconKind(label, iKey) });
5646
5807
  }
5647
5808
  switch (meta.kind) {
5648
5809
  case "club":
5649
- return /* @__PURE__ */ jsx71(CrestShield, { src: meta.imageUrl, name: label, size: 24 });
5810
+ return /* @__PURE__ */ jsx72(CrestShield, { src: meta.imageUrl, name: label, size: 24 });
5650
5811
  case "coach":
5651
- return /* @__PURE__ */ jsx71(PlayerAvatar, { name: label, imagePath: meta.imageUrl, className: "ss-g-btg-coach-av" });
5812
+ return /* @__PURE__ */ jsx72(PlayerAvatar, { name: label, imagePath: meta.imageUrl, className: "ss-g-btg-coach-av" });
5652
5813
  case "country":
5653
- return /* @__PURE__ */ jsx71("span", { className: "ss-g-btg-hdr-flag", "aria-hidden": "true", children: nationalityFlag(meta.country ?? label) });
5814
+ return /* @__PURE__ */ jsx72("span", { className: "ss-g-btg-hdr-flag", "aria-hidden": "true", children: nationalityFlag(meta.country ?? label) });
5654
5815
  case "position":
5655
- return /* @__PURE__ */ jsx71(Fragment14, {});
5816
+ return /* @__PURE__ */ jsx72(Fragment14, {});
5656
5817
  default:
5657
- return /* @__PURE__ */ jsx71(CriterionIcon, { kind: criterionIconKind(label, iKey) });
5818
+ return /* @__PURE__ */ jsx72(CriterionIcon, { kind: criterionIconKind(label, iKey) });
5658
5819
  }
5659
5820
  }
5660
5821
  function parseClientState4(json) {
@@ -5689,21 +5850,21 @@ function SearchSheet({
5689
5850
  ui
5690
5851
  }) {
5691
5852
  const s = ui.games.beatTheGrid;
5692
- const [query, setQuery] = useState28("");
5853
+ const [query, setQuery] = useState29("");
5693
5854
  const inputId = useId4();
5694
- const inputRef = useRef12(null);
5695
- useEffect14(() => {
5855
+ const inputRef = useRef13(null);
5856
+ useEffect15(() => {
5696
5857
  inputRef.current?.focus();
5697
5858
  }, [row, col]);
5698
5859
  const filtered = playerPool.filter(
5699
5860
  (p) => !alreadyFilledIds.has(p.id) && p.name.toLowerCase().includes(query.toLowerCase())
5700
5861
  );
5701
- return /* @__PURE__ */ jsxs59("div", { className: "ss-g-btg-sheet", "data-testid": "btg-search-sheet", children: [
5702
- /* @__PURE__ */ jsxs59("div", { className: "ss-g-btg-sheet-hdr", children: [
5703
- /* @__PURE__ */ jsx71(Chip, { variant: "neutral", children: rowLabel }),
5704
- /* @__PURE__ */ jsx71("span", { className: "ss-g-btg-sheet-x", "aria-hidden": "true", children: /* @__PURE__ */ jsx71(IconClose, { size: 12 }) }),
5705
- /* @__PURE__ */ jsx71(Chip, { variant: "accent", children: colLabel }),
5706
- /* @__PURE__ */ jsx71(
5862
+ return /* @__PURE__ */ jsxs60("div", { className: "ss-g-btg-sheet", "data-testid": "btg-search-sheet", children: [
5863
+ /* @__PURE__ */ jsxs60("div", { className: "ss-g-btg-sheet-hdr", children: [
5864
+ /* @__PURE__ */ jsx72(Chip, { variant: "neutral", children: rowLabel }),
5865
+ /* @__PURE__ */ jsx72("span", { className: "ss-g-btg-sheet-x", "aria-hidden": "true", children: /* @__PURE__ */ jsx72(IconClose, { size: 12 }) }),
5866
+ /* @__PURE__ */ jsx72(Chip, { variant: "accent", children: colLabel }),
5867
+ /* @__PURE__ */ jsx72(
5707
5868
  "button",
5708
5869
  {
5709
5870
  type: "button",
@@ -5711,12 +5872,12 @@ function SearchSheet({
5711
5872
  "data-testid": "btg-sheet-dismiss",
5712
5873
  "aria-label": s.closeSearch,
5713
5874
  onClick: onDismiss,
5714
- children: /* @__PURE__ */ jsx71(IconClose, {})
5875
+ children: /* @__PURE__ */ jsx72(IconClose, {})
5715
5876
  }
5716
5877
  )
5717
5878
  ] }),
5718
- playerPool.length === 0 ? /* @__PURE__ */ jsx71("div", { className: "ss-g-btg-sheet-empty", children: s.emptyPool }) : /* @__PURE__ */ jsxs59(Fragment14, { children: [
5719
- /* @__PURE__ */ jsx71(
5879
+ playerPool.length === 0 ? /* @__PURE__ */ jsx72("div", { className: "ss-g-btg-sheet-empty", children: s.emptyPool }) : /* @__PURE__ */ jsxs60(Fragment14, { children: [
5880
+ /* @__PURE__ */ jsx72(
5720
5881
  SearchField,
5721
5882
  {
5722
5883
  id: inputId,
@@ -5728,16 +5889,16 @@ function SearchSheet({
5728
5889
  inputRef
5729
5890
  }
5730
5891
  ),
5731
- query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx71(
5892
+ query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx72(
5732
5893
  OptionList,
5733
5894
  {
5734
5895
  label: s.searchLabel(rowLabel, colLabel),
5735
5896
  options: filtered.map((p) => ({
5736
5897
  key: p.id,
5737
- content: /* @__PURE__ */ jsxs59(Fragment14, { children: [
5738
- /* @__PURE__ */ jsx71(PlayerAvatar, { name: p.name, imagePath: p.imagePath, className: "ss-g-opt-av" }),
5739
- /* @__PURE__ */ jsx71("span", { className: "ss-g-btg-result-name", children: p.name }),
5740
- /* @__PURE__ */ jsx71("span", { className: "ss-g-btg-result-plus", "aria-hidden": "true", children: /* @__PURE__ */ jsx71(IconPlus, { size: 18 }) })
5898
+ content: /* @__PURE__ */ jsxs60(Fragment14, { children: [
5899
+ /* @__PURE__ */ jsx72(PlayerAvatar, { name: p.name, imagePath: p.imagePath, className: "ss-g-opt-av" }),
5900
+ /* @__PURE__ */ jsx72("span", { className: "ss-g-btg-result-name", children: p.name }),
5901
+ /* @__PURE__ */ jsx72("span", { className: "ss-g-btg-result-plus", "aria-hidden": "true", children: /* @__PURE__ */ jsx72(IconPlus, { size: 18 }) })
5741
5902
  ] })
5742
5903
  })),
5743
5904
  onPick: (k) => onPick(row, col, Number(k))
@@ -5757,7 +5918,7 @@ function BeatTheGridGame({
5757
5918
  }) {
5758
5919
  const s = ui.games.beatTheGrid;
5759
5920
  const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
5760
- const [activeCell, setActiveCell] = useState28(null);
5921
+ const [activeCell, setActiveCell] = useState29(null);
5761
5922
  const clientState = parseClientState4(result?.clientStateJson);
5762
5923
  const filledCells = clientState?.cells ?? [];
5763
5924
  const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
@@ -5775,9 +5936,9 @@ function BeatTheGridGame({
5775
5936
  onSubmit(JSON.stringify({ cells: newCells }));
5776
5937
  }
5777
5938
  if (!config) {
5778
- return /* @__PURE__ */ jsxs59("div", { className: "ss-g-screen", "data-testid": "game-screen-beat-the-grid", children: [
5779
- /* @__PURE__ */ jsx71(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
5780
- /* @__PURE__ */ jsx71("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
5939
+ return /* @__PURE__ */ jsxs60("div", { className: "ss-g-screen", "data-testid": "game-screen-beat-the-grid", children: [
5940
+ /* @__PURE__ */ jsx72(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
5941
+ /* @__PURE__ */ jsx72("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
5781
5942
  ] });
5782
5943
  }
5783
5944
  const rows = config.rows;
@@ -5790,20 +5951,20 @@ function BeatTheGridGame({
5790
5951
  (_, i) => i < correctCount ? "correct" : i < correctCount + wrongCount ? "wrong" : "todo"
5791
5952
  );
5792
5953
  const totalScore = clientState?.totalScore ?? result?.score ?? 0;
5793
- return /* @__PURE__ */ jsxs59("div", { className: "ss-g-screen", "data-testid": "game-screen-beat-the-grid", children: [
5794
- /* @__PURE__ */ jsx71(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
5795
- /* @__PURE__ */ jsx71(
5954
+ return /* @__PURE__ */ jsxs60("div", { className: "ss-g-screen", "data-testid": "game-screen-beat-the-grid", children: [
5955
+ /* @__PURE__ */ jsx72(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
5956
+ /* @__PURE__ */ jsx72(
5796
5957
  SegmentProgress,
5797
5958
  {
5798
5959
  segments,
5799
5960
  ariaLabel: s.progressAria(filledCells.length, total),
5800
5961
  leftLabel: s.filled(filledCells.length, total),
5801
5962
  rightLabel: s.toGo(Math.max(0, total - filledCells.length)),
5802
- right: /* @__PURE__ */ jsx71(Chip, { variant: "accent", children: `${totalScore} ${ui.games.unitPts}` })
5963
+ right: /* @__PURE__ */ jsx72(Chip, { variant: "accent", children: `${totalScore} ${ui.games.unitPts}` })
5803
5964
  }
5804
5965
  ),
5805
- /* @__PURE__ */ jsxs59("div", { className: "ss-g-body", children: [
5806
- /* @__PURE__ */ jsxs59(
5966
+ /* @__PURE__ */ jsxs60("div", { className: "ss-g-body", children: [
5967
+ /* @__PURE__ */ jsxs60(
5807
5968
  "div",
5808
5969
  {
5809
5970
  className: activeCell !== null ? "ss-g-btg-grid ss-g-btg-grid--fit" : "ss-g-btg-grid",
@@ -5813,31 +5974,31 @@ function BeatTheGridGame({
5813
5974
  },
5814
5975
  role: "grid",
5815
5976
  children: [
5816
- /* @__PURE__ */ jsx71("div", { className: "ss-g-btg-corner" }),
5977
+ /* @__PURE__ */ jsx72("div", { className: "ss-g-btg-corner" }),
5817
5978
  cols.map((col, colIdx) => {
5818
5979
  const colMeta = config.colsMeta?.[colIdx];
5819
- return /* @__PURE__ */ jsxs59("div", { className: "ss-g-btg-colhdr", "data-meta": colMeta ? "true" : void 0, children: [
5820
- /* @__PURE__ */ jsx71(HeaderVisual, { label: col, textKey: config.colsI18n?.[colIdx]?.key, meta: colMeta }),
5821
- /* @__PURE__ */ jsx71("span", { children: col })
5980
+ return /* @__PURE__ */ jsxs60("div", { className: "ss-g-btg-colhdr", "data-meta": colMeta ? "true" : void 0, children: [
5981
+ /* @__PURE__ */ jsx72(HeaderVisual, { label: col, textKey: config.colsI18n?.[colIdx]?.key, meta: colMeta }),
5982
+ /* @__PURE__ */ jsx72("span", { children: col })
5822
5983
  ] }, col);
5823
5984
  }),
5824
5985
  rows.map((rowLabel, rowIdx) => {
5825
5986
  const rowMeta = config.rowsMeta?.[rowIdx];
5826
5987
  const abbr = rowAbbrev(rowLabel, s.rowAbbrev, config.rowsI18n?.[rowIdx]?.key);
5827
- const rowHeaderContent = rowMeta ? /* @__PURE__ */ jsxs59(Fragment14, { children: [
5828
- /* @__PURE__ */ jsx71(HeaderVisual, { label: rowLabel, textKey: config.rowsI18n?.[rowIdx]?.key, meta: rowMeta }),
5829
- /* @__PURE__ */ jsx71("span", { children: rowLabel })
5830
- ] }) : abbr === rowLabel ? /* @__PURE__ */ jsx71("span", { children: rowLabel }) : /* @__PURE__ */ jsxs59(Fragment14, { children: [
5831
- /* @__PURE__ */ jsx71("span", { "aria-hidden": "true", children: abbr }),
5832
- /* @__PURE__ */ jsx71("span", { className: "ss-g-sr", children: rowLabel })
5988
+ const rowHeaderContent = rowMeta ? /* @__PURE__ */ jsxs60(Fragment14, { children: [
5989
+ /* @__PURE__ */ jsx72(HeaderVisual, { label: rowLabel, textKey: config.rowsI18n?.[rowIdx]?.key, meta: rowMeta }),
5990
+ /* @__PURE__ */ jsx72("span", { children: rowLabel })
5991
+ ] }) : abbr === rowLabel ? /* @__PURE__ */ jsx72("span", { children: rowLabel }) : /* @__PURE__ */ jsxs60(Fragment14, { children: [
5992
+ /* @__PURE__ */ jsx72("span", { "aria-hidden": "true", children: abbr }),
5993
+ /* @__PURE__ */ jsx72("span", { className: "ss-g-sr", children: rowLabel })
5833
5994
  ] });
5834
- return /* @__PURE__ */ jsxs59(React.Fragment, { children: [
5835
- /* @__PURE__ */ jsx71("div", { className: "ss-g-btg-rowhdr", "data-meta": rowMeta ? "true" : void 0, children: rowHeaderContent }),
5995
+ return /* @__PURE__ */ jsxs60(React.Fragment, { children: [
5996
+ /* @__PURE__ */ jsx72("div", { className: "ss-g-btg-rowhdr", "data-meta": rowMeta ? "true" : void 0, children: rowHeaderContent }),
5836
5997
  cols.map((colLabel, colIdx) => {
5837
5998
  const filled = findCellResult(filledCells, rowIdx, colIdx);
5838
5999
  const isActive = activeCell?.row === rowIdx && activeCell?.col === colIdx;
5839
6000
  const state = filled ? filled.isCorrect ? "correct" : "wrong" : isActive ? "active" : "empty";
5840
- return /* @__PURE__ */ jsx71(
6001
+ return /* @__PURE__ */ jsx72(
5841
6002
  "button",
5842
6003
  {
5843
6004
  type: "button",
@@ -5848,20 +6009,20 @@ function BeatTheGridGame({
5848
6009
  className: "ss-g-btg-cell",
5849
6010
  disabled: isLocked2 || submitting,
5850
6011
  onClick: () => handleCellClick(rowIdx, colIdx),
5851
- children: filled ? /* @__PURE__ */ jsxs59(Fragment14, { children: [
5852
- /* @__PURE__ */ jsx71(
6012
+ children: filled ? /* @__PURE__ */ jsxs60(Fragment14, { children: [
6013
+ /* @__PURE__ */ jsx72(
5853
6014
  "span",
5854
6015
  {
5855
6016
  className: `ss-g-btg-badge ss-g-btg-badge--${filled.isCorrect ? "correct" : "wrong"}`,
5856
6017
  role: "img",
5857
6018
  "aria-label": filled.isCorrect ? s.correct : s.wrong,
5858
- children: filled.isCorrect ? /* @__PURE__ */ jsx71(IconCheck, { size: 11 }) : /* @__PURE__ */ jsx71(IconClose, { size: 11 })
6019
+ children: filled.isCorrect ? /* @__PURE__ */ jsx72(IconCheck, { size: 11 }) : /* @__PURE__ */ jsx72(IconClose, { size: 11 })
5859
6020
  }
5860
6021
  ),
5861
- /* @__PURE__ */ jsx71("span", { className: "ss-g-btg-rarity", children: filled.rarityScore }),
6022
+ /* @__PURE__ */ jsx72("span", { className: "ss-g-btg-rarity", children: filled.rarityScore }),
5862
6023
  (() => {
5863
6024
  const entry = playerPool.find((p) => p.id === filled.playerId);
5864
- return /* @__PURE__ */ jsx71(
6025
+ return /* @__PURE__ */ jsx72(
5865
6026
  PlayerAvatar,
5866
6027
  {
5867
6028
  name: entry?.name ?? "",
@@ -5870,8 +6031,8 @@ function BeatTheGridGame({
5870
6031
  }
5871
6032
  );
5872
6033
  })(),
5873
- /* @__PURE__ */ jsx71("span", { className: "ss-g-btg-name", children: shortName(playerPool.find((p) => p.id === filled.playerId)?.name) })
5874
- ] }) : /* @__PURE__ */ jsx71("span", { className: "ss-g-btg-plus", "aria-hidden": "true", children: /* @__PURE__ */ jsx71(IconPlus, { size: 22 }) })
6034
+ /* @__PURE__ */ jsx72("span", { className: "ss-g-btg-name", children: shortName(playerPool.find((p) => p.id === filled.playerId)?.name) })
6035
+ ] }) : /* @__PURE__ */ jsx72("span", { className: "ss-g-btg-plus", "aria-hidden": "true", children: /* @__PURE__ */ jsx72(IconPlus, { size: 22 }) })
5875
6036
  },
5876
6037
  `cell-${rowIdx}-${colIdx}`
5877
6038
  );
@@ -5881,7 +6042,7 @@ function BeatTheGridGame({
5881
6042
  ]
5882
6043
  }
5883
6044
  ),
5884
- isLocked2 && /* @__PURE__ */ jsx71(
6045
+ isLocked2 && /* @__PURE__ */ jsx72(
5885
6046
  ResultCard,
5886
6047
  {
5887
6048
  tone: "neutral",
@@ -5893,7 +6054,7 @@ function BeatTheGridGame({
5893
6054
  }
5894
6055
  )
5895
6056
  ] }),
5896
- activeCell !== null && /* @__PURE__ */ jsx71("div", { className: "ss-g-btg-pin", children: /* @__PURE__ */ jsx71(
6057
+ activeCell !== null && /* @__PURE__ */ jsx72("div", { className: "ss-g-btg-pin", children: /* @__PURE__ */ jsx72(
5897
6058
  SearchSheet,
5898
6059
  {
5899
6060
  row: activeCell.row,
@@ -5912,21 +6073,21 @@ function BeatTheGridGame({
5912
6073
  }
5913
6074
 
5914
6075
  // src/components/games/GuessTheXiGame.tsx
5915
- import { useState as useState29, useId as useId5 } from "react";
6076
+ import { useState as useState30, useId as useId5 } from "react";
5916
6077
 
5917
6078
  // src/components/games/ui/PitchSvg.tsx
5918
- import { Fragment as Fragment15, jsx as jsx72, jsxs as jsxs60 } from "react/jsx-runtime";
6079
+ import { Fragment as Fragment15, jsx as jsx73, jsxs as jsxs61 } from "react/jsx-runtime";
5919
6080
  function PitchSvg({ variant }) {
5920
- return /* @__PURE__ */ jsxs60("svg", { className: "ss-g-pitch-svg", viewBox: variant === "full" ? "0 0 100 150" : "0 0 100 100", preserveAspectRatio: "none", "aria-hidden": "true", children: [
5921
- /* @__PURE__ */ jsx72("rect", { x: "4", y: "4", width: "92", height: variant === "full" ? 142 : 92, fill: "none" }),
5922
- variant === "full" ? /* @__PURE__ */ jsxs60(Fragment15, { children: [
5923
- /* @__PURE__ */ jsx72("line", { x1: "4", y1: "75", x2: "96", y2: "75" }),
5924
- /* @__PURE__ */ jsx72("circle", { cx: "50", cy: "75", r: "12", fill: "none" }),
5925
- /* @__PURE__ */ jsx72("rect", { x: "26", y: "4", width: "48", height: "20", fill: "none" }),
5926
- /* @__PURE__ */ jsx72("rect", { x: "26", y: "126", width: "48", height: "20", fill: "none" })
5927
- ] }) : /* @__PURE__ */ jsxs60(Fragment15, { children: [
5928
- /* @__PURE__ */ jsx72("path", { d: "M38 4a12 12 0 0 0 24 0", fill: "none" }),
5929
- /* @__PURE__ */ jsx72("rect", { x: "26", y: "76", width: "48", height: "20", fill: "none" })
6081
+ return /* @__PURE__ */ jsxs61("svg", { className: "ss-g-pitch-svg", viewBox: variant === "full" ? "0 0 100 150" : "0 0 100 100", preserveAspectRatio: "none", "aria-hidden": "true", children: [
6082
+ /* @__PURE__ */ jsx73("rect", { x: "4", y: "4", width: "92", height: variant === "full" ? 142 : 92, fill: "none" }),
6083
+ variant === "full" ? /* @__PURE__ */ jsxs61(Fragment15, { children: [
6084
+ /* @__PURE__ */ jsx73("line", { x1: "4", y1: "75", x2: "96", y2: "75" }),
6085
+ /* @__PURE__ */ jsx73("circle", { cx: "50", cy: "75", r: "12", fill: "none" }),
6086
+ /* @__PURE__ */ jsx73("rect", { x: "26", y: "4", width: "48", height: "20", fill: "none" }),
6087
+ /* @__PURE__ */ jsx73("rect", { x: "26", y: "126", width: "48", height: "20", fill: "none" })
6088
+ ] }) : /* @__PURE__ */ jsxs61(Fragment15, { children: [
6089
+ /* @__PURE__ */ jsx73("path", { d: "M38 4a12 12 0 0 0 24 0", fill: "none" }),
6090
+ /* @__PURE__ */ jsx73("rect", { x: "26", y: "76", width: "48", height: "20", fill: "none" })
5930
6091
  ] })
5931
6092
  ] });
5932
6093
  }
@@ -5982,7 +6143,7 @@ function positionsBySlot(formation, rowsAttackFirst) {
5982
6143
  }
5983
6144
 
5984
6145
  // src/components/games/GuessTheXiGame.tsx
5985
- import { Fragment as Fragment16, jsx as jsx73, jsxs as jsxs61 } from "react/jsx-runtime";
6146
+ import { Fragment as Fragment16, jsx as jsx74, jsxs as jsxs62 } from "react/jsx-runtime";
5986
6147
  var MAX_GUESSES2 = 3;
5987
6148
  function parseClientState5(json) {
5988
6149
  if (!json) return null;
@@ -6001,7 +6162,7 @@ function GuessTheXiGame({
6001
6162
  onBack
6002
6163
  }) {
6003
6164
  const t = ui.games.guessTheXi;
6004
- const [query, setQuery] = useState29("");
6165
+ const [query, setQuery] = useState30("");
6005
6166
  const inputId = useId5();
6006
6167
  const clientState = parseClientState5(result?.clientStateJson);
6007
6168
  const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
@@ -6032,30 +6193,30 @@ function GuessTheXiGame({
6032
6193
  const wrongGuesses = (clientState?.guessHistory ?? []).filter((g) => !g.wasCorrect);
6033
6194
  const guessesLeft = Math.max(0, MAX_GUESSES2 - (clientState?.guessesUsed ?? 0));
6034
6195
  const teamName = (id) => config?.teamPool.find((tm) => tm.teamId === id)?.teamName ?? `#${id}`;
6035
- return /* @__PURE__ */ jsxs61("div", { className: "ss-g-screen ss-g-gxi", "data-testid": "game-screen-guess-the-xi", children: [
6036
- /* @__PURE__ */ jsx73(
6196
+ return /* @__PURE__ */ jsxs62("div", { className: "ss-g-screen ss-g-gxi", "data-testid": "game-screen-guess-the-xi", children: [
6197
+ /* @__PURE__ */ jsx74(
6037
6198
  GameHeader,
6038
6199
  {
6039
6200
  title: gameTitle({ gameId: "guess-the-xi" }, ui.games.titles),
6040
6201
  eyebrow: config?.poolLabel,
6041
- right: formation ? /* @__PURE__ */ jsx73(Chip, { variant: "accent", children: formation }) : void 0,
6202
+ right: formation ? /* @__PURE__ */ jsx74(Chip, { variant: "accent", children: formation }) : void 0,
6042
6203
  onBack,
6043
6204
  backLabel: ui.back
6044
6205
  }
6045
6206
  ),
6046
- !config && /* @__PURE__ */ jsx73("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
6047
- config && /* @__PURE__ */ jsxs61(Fragment16, { children: [
6048
- /* @__PURE__ */ jsxs61("div", { className: "ss-g-body", children: [
6049
- rows.length > 0 && /* @__PURE__ */ jsxs61("div", { className: "ss-g-gxi-pitch", role: "group", "aria-label": t.pitchLabel, children: [
6050
- /* @__PURE__ */ jsx73(PitchSvg, { variant: "full" }),
6051
- /* @__PURE__ */ jsx73("div", { className: "ss-g-gxi-rows", children: rows.map((row, r) => /* @__PURE__ */ jsx73("div", { className: "ss-g-gxi-row", children: row.map((pos, c) => {
6207
+ !config && /* @__PURE__ */ jsx74("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
6208
+ config && /* @__PURE__ */ jsxs62(Fragment16, { children: [
6209
+ /* @__PURE__ */ jsxs62("div", { className: "ss-g-body", children: [
6210
+ rows.length > 0 && /* @__PURE__ */ jsxs62("div", { className: "ss-g-gxi-pitch", role: "group", "aria-label": t.pitchLabel, children: [
6211
+ /* @__PURE__ */ jsx74(PitchSvg, { variant: "full" }),
6212
+ /* @__PURE__ */ jsx74("div", { className: "ss-g-gxi-rows", children: rows.map((row, r) => /* @__PURE__ */ jsx74("div", { className: "ss-g-gxi-row", children: row.map((pos, c) => {
6052
6213
  const posLabel = pos.slot ? posBySlot.get(pos.slot) ?? "" : "";
6053
6214
  const name = pos.slot ? nameBySlot.get(pos.slot) : void 0;
6054
6215
  const lineupEntry = pos.slot ? lineupBySlot.get(pos.slot) : void 0;
6055
6216
  const flag = nationalityFlag(pos.nationality);
6056
6217
  if (lineupEntry) {
6057
- return /* @__PURE__ */ jsxs61("div", { className: "ss-g-gxi-node", "data-revealed": "true", children: [
6058
- /* @__PURE__ */ jsx73(
6218
+ return /* @__PURE__ */ jsxs62("div", { className: "ss-g-gxi-node", "data-revealed": "true", children: [
6219
+ /* @__PURE__ */ jsx74(
6059
6220
  PlayerAvatar,
6060
6221
  {
6061
6222
  name: lineupEntry.name,
@@ -6063,11 +6224,11 @@ function GuessTheXiGame({
6063
6224
  className: "ss-g-gxi-disc ss-g-gxi-disc--photo"
6064
6225
  }
6065
6226
  ),
6066
- /* @__PURE__ */ jsx73("span", { className: "ss-g-gxi-pos ss-g-gxi-pos--name", children: splitName(lineupEntry.name).last })
6227
+ /* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-pos ss-g-gxi-pos--name", children: splitName(lineupEntry.name).last })
6067
6228
  ] }, `${pos.slot}-${c}`);
6068
6229
  }
6069
- return /* @__PURE__ */ jsxs61("div", { className: "ss-g-gxi-node", "data-revealed": name ? "true" : void 0, children: [
6070
- /* @__PURE__ */ jsx73(
6230
+ return /* @__PURE__ */ jsxs62("div", { className: "ss-g-gxi-node", "data-revealed": name ? "true" : void 0, children: [
6231
+ /* @__PURE__ */ jsx74(
6071
6232
  "span",
6072
6233
  {
6073
6234
  className: "ss-g-gxi-disc",
@@ -6078,22 +6239,22 @@ function GuessTheXiGame({
6078
6239
  children: flag
6079
6240
  }
6080
6241
  ),
6081
- name ? /* @__PURE__ */ jsx73("span", { className: "ss-g-gxi-pos ss-g-gxi-pos--name", children: splitName(name).last }) : posLabel && /* @__PURE__ */ jsx73("span", { className: "ss-g-gxi-pos", children: posLabel })
6242
+ name ? /* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-pos ss-g-gxi-pos--name", children: splitName(name).last }) : posLabel && /* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-pos", children: posLabel })
6082
6243
  ] }, `${pos.slot}-${c}`);
6083
6244
  }) }, r)) })
6084
6245
  ] }),
6085
- !isOver && wrongGuesses.length > 0 && /* @__PURE__ */ jsxs61("div", { className: "ss-g-gxi-wrong", children: [
6086
- /* @__PURE__ */ jsx73("span", { className: "ss-g-gxi-wrong-l", children: t.notThem }),
6246
+ !isOver && wrongGuesses.length > 0 && /* @__PURE__ */ jsxs62("div", { className: "ss-g-gxi-wrong", children: [
6247
+ /* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-wrong-l", children: t.notThem }),
6087
6248
  wrongGuesses.map((g) => {
6088
6249
  const crestUrl = config?.teamPool.find((tm) => tm.teamId === g.teamId)?.crestUrl;
6089
- return /* @__PURE__ */ jsxs61("span", { className: "ss-g-gxi-wrong-chip", children: [
6090
- /* @__PURE__ */ jsx73(CrestShield, { src: crestUrl, name: teamName(g.teamId), size: 18 }),
6091
- /* @__PURE__ */ jsx73("s", { children: teamName(g.teamId) })
6250
+ return /* @__PURE__ */ jsxs62("span", { className: "ss-g-gxi-wrong-chip", children: [
6251
+ /* @__PURE__ */ jsx74(CrestShield, { src: crestUrl, name: teamName(g.teamId), size: 18 }),
6252
+ /* @__PURE__ */ jsx74("s", { children: teamName(g.teamId) })
6092
6253
  ] }, g.teamId);
6093
6254
  })
6094
6255
  ] }),
6095
- isOver && /* @__PURE__ */ jsxs61(Fragment16, { children: [
6096
- /* @__PURE__ */ jsx73(
6256
+ isOver && /* @__PURE__ */ jsxs62(Fragment16, { children: [
6257
+ /* @__PURE__ */ jsx74(
6097
6258
  ResultCard,
6098
6259
  {
6099
6260
  tone: solved ? "win" : failed ? "lose" : "neutral",
@@ -6104,29 +6265,29 @@ function GuessTheXiGame({
6104
6265
  ui
6105
6266
  }
6106
6267
  ),
6107
- (solved || failed) && clientState?.answer && /* @__PURE__ */ jsxs61("div", { className: "ss-g-gxi-answer", "data-testid": "gxi-answer-reveal", children: [
6108
- /* @__PURE__ */ jsx73("span", { className: "ss-g-gxi-answer-label", children: t.theAnswer }),
6109
- /* @__PURE__ */ jsx73(CrestShield, { src: clientState.answer.crestUrl, name: clientState.answer.teamName, size: 32 }),
6110
- /* @__PURE__ */ jsx73("span", { className: "ss-g-gxi-answer-name", children: clientState.answer.teamName })
6268
+ (solved || failed) && clientState?.answer && /* @__PURE__ */ jsxs62("div", { className: "ss-g-gxi-answer", "data-testid": "gxi-answer-reveal", children: [
6269
+ /* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-answer-label", children: t.theAnswer }),
6270
+ /* @__PURE__ */ jsx74(CrestShield, { src: clientState.answer.crestUrl, name: clientState.answer.teamName, size: 32 }),
6271
+ /* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-answer-name", children: clientState.answer.teamName })
6111
6272
  ] })
6112
6273
  ] })
6113
6274
  ] }),
6114
- !isOver && /* @__PURE__ */ jsxs61(FooterBar, { children: [
6115
- query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx73(
6275
+ !isOver && /* @__PURE__ */ jsxs62(FooterBar, { children: [
6276
+ query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx74(
6116
6277
  OptionList,
6117
6278
  {
6118
6279
  label: t.optionsLabel,
6119
6280
  options: filtered.map((tm) => ({
6120
6281
  key: tm.teamId,
6121
- content: /* @__PURE__ */ jsxs61(Fragment16, { children: [
6122
- /* @__PURE__ */ jsx73(CrestShield, { src: tm.crestUrl, name: tm.teamName, size: 28 }),
6123
- /* @__PURE__ */ jsx73("span", { children: tm.teamName })
6282
+ content: /* @__PURE__ */ jsxs62(Fragment16, { children: [
6283
+ /* @__PURE__ */ jsx74(CrestShield, { src: tm.crestUrl, name: tm.teamName, size: 28 }),
6284
+ /* @__PURE__ */ jsx74("span", { children: tm.teamName })
6124
6285
  ] })
6125
6286
  })),
6126
6287
  onPick: (k) => handlePick(Number(k))
6127
6288
  }
6128
6289
  ),
6129
- /* @__PURE__ */ jsx73(
6290
+ /* @__PURE__ */ jsx74(
6130
6291
  SearchField,
6131
6292
  {
6132
6293
  id: inputId,
@@ -6143,8 +6304,8 @@ function GuessTheXiGame({
6143
6304
  }
6144
6305
 
6145
6306
  // src/components/games/DailyQuizGame.tsx
6146
- import { useState as useState30 } from "react";
6147
- import { Fragment as Fragment17, jsx as jsx74, jsxs as jsxs62 } from "react/jsx-runtime";
6307
+ import { useState as useState31 } from "react";
6308
+ import { Fragment as Fragment17, jsx as jsx75, jsxs as jsxs63 } from "react/jsx-runtime";
6148
6309
  function parseClientState6(json) {
6149
6310
  if (!json) return null;
6150
6311
  try {
@@ -6165,13 +6326,13 @@ function OptionName({ text }) {
6165
6326
  const tokens = base.split(/\s+/).filter(Boolean);
6166
6327
  const isPlainName = tokens.length >= 1 && tokens.length <= 4 && tokens.every((t) => NAME_TOKEN.test(t));
6167
6328
  if (!isPlainName || base === "") {
6168
- return /* @__PURE__ */ jsx74("span", { className: "ss-g-dq-opt-name", children: /* @__PURE__ */ jsx74("span", { className: "ss-g-dq-opt-full", children: text }) });
6329
+ return /* @__PURE__ */ jsx75("span", { className: "ss-g-dq-opt-name", children: /* @__PURE__ */ jsx75("span", { className: "ss-g-dq-opt-full", children: text }) });
6169
6330
  }
6170
6331
  const { first, last } = splitName(base);
6171
- return /* @__PURE__ */ jsxs62("span", { className: "ss-g-dq-opt-name", children: [
6172
- first && /* @__PURE__ */ jsx74("span", { className: "ss-g-dq-opt-first", children: first }),
6173
- /* @__PURE__ */ jsx74("span", { className: "ss-g-dq-opt-last", children: last }),
6174
- suffix && /* @__PURE__ */ jsx74("span", { className: "ss-g-dq-opt-suffix", children: suffix })
6332
+ return /* @__PURE__ */ jsxs63("span", { className: "ss-g-dq-opt-name", children: [
6333
+ first && /* @__PURE__ */ jsx75("span", { className: "ss-g-dq-opt-first", children: first }),
6334
+ /* @__PURE__ */ jsx75("span", { className: "ss-g-dq-opt-last", children: last }),
6335
+ suffix && /* @__PURE__ */ jsx75("span", { className: "ss-g-dq-opt-suffix", children: suffix })
6175
6336
  ] });
6176
6337
  }
6177
6338
  function DailyQuizGame({
@@ -6184,15 +6345,15 @@ function DailyQuizGame({
6184
6345
  }) {
6185
6346
  const s = ui.games.dailyQuiz;
6186
6347
  const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
6187
- const [selections, setSelections] = useState30(/* @__PURE__ */ new Map());
6188
- const [page, setPage] = useState30(0);
6348
+ const [selections, setSelections] = useState31(/* @__PURE__ */ new Map());
6349
+ const [page, setPage] = useState31(0);
6189
6350
  const clientState = parseClientState6(result?.clientStateJson);
6190
6351
  const results = clientState?.results ?? [];
6191
6352
  const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
6192
6353
  if (!config) {
6193
- return /* @__PURE__ */ jsxs62("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
6194
- /* @__PURE__ */ jsx74(GameHeader, { title, onBack, backLabel: ui.back }),
6195
- /* @__PURE__ */ jsx74("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
6354
+ return /* @__PURE__ */ jsxs63("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
6355
+ /* @__PURE__ */ jsx75(GameHeader, { title, onBack, backLabel: ui.back }),
6356
+ /* @__PURE__ */ jsx75("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
6196
6357
  ] });
6197
6358
  }
6198
6359
  const questions = config.questions;
@@ -6227,11 +6388,11 @@ function DailyQuizGame({
6227
6388
  return r.isCorrect ? "correct" : "wrong";
6228
6389
  });
6229
6390
  const correctCount = results.filter((r) => r.isCorrect).length;
6230
- return /* @__PURE__ */ jsxs62("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
6231
- /* @__PURE__ */ jsx74(GameHeader, { title, eyebrow: s.results, onBack, backLabel: ui.back }),
6232
- /* @__PURE__ */ jsx74(SegmentProgress, { segments: segments2, ariaLabel: s.results }),
6233
- /* @__PURE__ */ jsxs62("div", { className: "ss-g-body", children: [
6234
- /* @__PURE__ */ jsx74(
6391
+ return /* @__PURE__ */ jsxs63("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
6392
+ /* @__PURE__ */ jsx75(GameHeader, { title, eyebrow: s.results, onBack, backLabel: ui.back }),
6393
+ /* @__PURE__ */ jsx75(SegmentProgress, { segments: segments2, ariaLabel: s.results }),
6394
+ /* @__PURE__ */ jsxs63("div", { className: "ss-g-body", children: [
6395
+ /* @__PURE__ */ jsx75(
6235
6396
  ResultCard,
6236
6397
  {
6237
6398
  tone: "neutral",
@@ -6244,15 +6405,15 @@ function DailyQuizGame({
6244
6405
  questions.map((q) => {
6245
6406
  const r = findResult(results, q.index);
6246
6407
  const picked = selections.get(q.index);
6247
- return /* @__PURE__ */ jsxs62("div", { className: "ss-g-dq-rq", children: [
6248
- /* @__PURE__ */ jsx74("div", { className: "ss-g-dq-rq-stem", children: q.stem }),
6249
- r && /* @__PURE__ */ jsx74("div", { className: "ss-g-dq-rq-opts", children: q.options.map((opt, optIdx) => {
6408
+ return /* @__PURE__ */ jsxs63("div", { className: "ss-g-dq-rq", children: [
6409
+ /* @__PURE__ */ jsx75("div", { className: "ss-g-dq-rq-stem", children: q.stem }),
6410
+ r && /* @__PURE__ */ jsx75("div", { className: "ss-g-dq-rq-opts", children: q.options.map((opt, optIdx) => {
6250
6411
  let cls = "ss-g-dq-rq-opt";
6251
6412
  if (optIdx === r.correctOptionIndex) cls += " ss-g-dq-rq-opt--correct";
6252
6413
  else if (optIdx === picked && !r.isCorrect) cls += " ss-g-dq-rq-opt--wrong";
6253
- return /* @__PURE__ */ jsx74("span", { className: cls, children: opt }, optIdx);
6414
+ return /* @__PURE__ */ jsx75("span", { className: cls, children: opt }, optIdx);
6254
6415
  }) }),
6255
- r?.revealText && /* @__PURE__ */ jsx74("div", { className: "ss-g-dq-why", children: r.revealText })
6416
+ r?.revealText && /* @__PURE__ */ jsx75("div", { className: "ss-g-dq-why", children: r.revealText })
6256
6417
  ] }, q.index);
6257
6418
  })
6258
6419
  ] })
@@ -6260,16 +6421,16 @@ function DailyQuizGame({
6260
6421
  }
6261
6422
  const segments = questions.map((_, i) => i < page ? "done" : i === page ? "current" : "todo");
6262
6423
  const selectedIdx = current ? selections.get(current.index) : void 0;
6263
- return /* @__PURE__ */ jsxs62("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
6264
- /* @__PURE__ */ jsx74(GameHeader, { title, eyebrow: s.questionOf(page + 1, total), onBack, backLabel: ui.back }),
6265
- /* @__PURE__ */ jsx74(SegmentProgress, { segments, ariaLabel: s.progressAria(page + 1, total) }),
6266
- /* @__PURE__ */ jsx74("div", { className: "ss-g-body", children: current && /* @__PURE__ */ jsxs62(Fragment17, { children: [
6267
- /* @__PURE__ */ jsx74("h3", { className: "ss-g-dq-stem", children: current.stem }),
6268
- /* @__PURE__ */ jsx74("div", { className: "ss-g-dq-opts", children: current.options.map((opt, optIdx) => {
6424
+ return /* @__PURE__ */ jsxs63("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
6425
+ /* @__PURE__ */ jsx75(GameHeader, { title, eyebrow: s.questionOf(page + 1, total), onBack, backLabel: ui.back }),
6426
+ /* @__PURE__ */ jsx75(SegmentProgress, { segments, ariaLabel: s.progressAria(page + 1, total) }),
6427
+ /* @__PURE__ */ jsx75("div", { className: "ss-g-body", children: current && /* @__PURE__ */ jsxs63(Fragment17, { children: [
6428
+ /* @__PURE__ */ jsx75("h3", { className: "ss-g-dq-stem", children: current.stem }),
6429
+ /* @__PURE__ */ jsx75("div", { className: "ss-g-dq-opts", children: current.options.map((opt, optIdx) => {
6269
6430
  const selected = optIdx === selectedIdx;
6270
6431
  const imagePath = current.optionImagePaths?.[optIdx] ?? void 0;
6271
6432
  const playerName = opt;
6272
- return /* @__PURE__ */ jsxs62(
6433
+ return /* @__PURE__ */ jsxs63(
6273
6434
  "button",
6274
6435
  {
6275
6436
  type: "button",
@@ -6278,25 +6439,25 @@ function DailyQuizGame({
6278
6439
  disabled: submitting,
6279
6440
  onClick: () => handleSelect(current.index, optIdx),
6280
6441
  children: [
6281
- current.optionImagePaths && /* @__PURE__ */ jsx74(PlayerAvatar, { name: playerName, imagePath, className: "ss-g-dq-opt-av" }),
6282
- /* @__PURE__ */ jsx74("span", { className: "ss-g-dq-badge", "aria-hidden": "true", children: selected ? /* @__PURE__ */ jsx74(IconCheck, {}) : String.fromCharCode(65 + optIdx) }),
6283
- /* @__PURE__ */ jsx74(OptionName, { text: opt })
6442
+ current.optionImagePaths && /* @__PURE__ */ jsx75(PlayerAvatar, { name: playerName, imagePath, className: "ss-g-dq-opt-av" }),
6443
+ /* @__PURE__ */ jsx75("span", { className: "ss-g-dq-badge", "aria-hidden": "true", children: selected ? /* @__PURE__ */ jsx75(IconCheck, {}) : String.fromCharCode(65 + optIdx) }),
6444
+ /* @__PURE__ */ jsx75(OptionName, { text: opt })
6284
6445
  ]
6285
6446
  },
6286
6447
  optIdx
6287
6448
  );
6288
6449
  }) })
6289
6450
  ] }) }),
6290
- /* @__PURE__ */ jsx74(FooterBar, { children: /* @__PURE__ */ jsxs62("div", { className: "ss-g-dq-nav", children: [
6291
- page > 0 && /* @__PURE__ */ jsx74(GameButton, { variant: "outline", onClick: goPrev, disabled: submitting, children: s.previous }),
6292
- isLast ? /* @__PURE__ */ jsx74(GameButton, { variant: "primary", block: true, onClick: handleSubmit, disabled: !currentAnswered || !allAnswered || submitting, children: submitting ? s.submitting : s.submit }) : /* @__PURE__ */ jsx74(GameButton, { variant: "primary", block: true, onClick: goNext, disabled: !currentAnswered || submitting, children: s.next })
6451
+ /* @__PURE__ */ jsx75(FooterBar, { children: /* @__PURE__ */ jsxs63("div", { className: "ss-g-dq-nav", children: [
6452
+ page > 0 && /* @__PURE__ */ jsx75(GameButton, { variant: "outline", onClick: goPrev, disabled: submitting, children: s.previous }),
6453
+ isLast ? /* @__PURE__ */ jsx75(GameButton, { variant: "primary", block: true, onClick: handleSubmit, disabled: !currentAnswered || !allAnswered || submitting, children: submitting ? s.submitting : s.submit }) : /* @__PURE__ */ jsx75(GameButton, { variant: "primary", block: true, onClick: goNext, disabled: !currentAnswered || submitting, children: s.next })
6293
6454
  ] }) })
6294
6455
  ] });
6295
6456
  }
6296
6457
 
6297
6458
  // src/components/games/MatchdayPredictorGame.tsx
6298
- import { useId as useId6, useState as useState31 } from "react";
6299
- import { jsx as jsx75, jsxs as jsxs63 } from "react/jsx-runtime";
6459
+ import { useId as useId6, useState as useState32 } from "react";
6460
+ import { jsx as jsx76, jsxs as jsxs64 } from "react/jsx-runtime";
6300
6461
  var SCORER_SEARCH_THRESHOLD = 9;
6301
6462
  function parseClientState7(json) {
6302
6463
  if (!json) return null;
@@ -6314,7 +6475,7 @@ function isLocked(kickoffUtc) {
6314
6475
  }
6315
6476
  }
6316
6477
  function IconMinus() {
6317
- return /* @__PURE__ */ jsx75(
6478
+ return /* @__PURE__ */ jsx76(
6318
6479
  "svg",
6319
6480
  {
6320
6481
  width: 18,
@@ -6325,20 +6486,20 @@ function IconMinus() {
6325
6486
  strokeWidth: 2.2,
6326
6487
  strokeLinecap: "round",
6327
6488
  "aria-hidden": "true",
6328
- children: /* @__PURE__ */ jsx75("path", { d: "M5 12h14" })
6489
+ children: /* @__PURE__ */ jsx76("path", { d: "M5 12h14" })
6329
6490
  }
6330
6491
  );
6331
6492
  }
6332
6493
  function TeamBadge({ team, label }) {
6333
- return /* @__PURE__ */ jsxs63("div", { className: "ss-g-mp-team", children: [
6334
- /* @__PURE__ */ jsx75(CrestShield, { name: team.name, size: 44 }),
6335
- /* @__PURE__ */ jsx75("span", { className: "ss-g-mp-team-name", children: team.name }),
6336
- /* @__PURE__ */ jsx75("span", { className: "ss-g-mp-team-side", children: label })
6494
+ return /* @__PURE__ */ jsxs64("div", { className: "ss-g-mp-team", children: [
6495
+ /* @__PURE__ */ jsx76(CrestShield, { name: team.name, size: 44 }),
6496
+ /* @__PURE__ */ jsx76("span", { className: "ss-g-mp-team-name", children: team.name }),
6497
+ /* @__PURE__ */ jsx76("span", { className: "ss-g-mp-team-side", children: label })
6337
6498
  ] });
6338
6499
  }
6339
6500
  function ScoreCard({ home, away, h, a, t, edit }) {
6340
- const col = (side, team, value) => /* @__PURE__ */ jsxs63("div", { className: "ss-g-mp-col", children: [
6341
- edit && /* @__PURE__ */ jsx75(
6501
+ const col = (side, team, value) => /* @__PURE__ */ jsxs64("div", { className: "ss-g-mp-col", children: [
6502
+ edit && /* @__PURE__ */ jsx76(
6342
6503
  "button",
6343
6504
  {
6344
6505
  type: "button",
@@ -6346,11 +6507,11 @@ function ScoreCard({ home, away, h, a, t, edit }) {
6346
6507
  "aria-label": t.goalsUp(team.name),
6347
6508
  disabled: edit.disabled,
6348
6509
  onClick: () => edit.onStep(side, 1),
6349
- children: /* @__PURE__ */ jsx75(IconPlus, { size: 18 })
6510
+ children: /* @__PURE__ */ jsx76(IconPlus, { size: 18 })
6350
6511
  }
6351
6512
  ),
6352
- /* @__PURE__ */ jsx75("span", { className: "ss-g-mp-digit", "data-testid": "mp-digit", "data-active": edit ? String(edit.active === side) : "false", children: value }),
6353
- edit && /* @__PURE__ */ jsx75(
6513
+ /* @__PURE__ */ jsx76("span", { className: "ss-g-mp-digit", "data-testid": "mp-digit", "data-active": edit ? String(edit.active === side) : "false", children: value }),
6514
+ edit && /* @__PURE__ */ jsx76(
6354
6515
  "button",
6355
6516
  {
6356
6517
  type: "button",
@@ -6358,27 +6519,27 @@ function ScoreCard({ home, away, h, a, t, edit }) {
6358
6519
  "aria-label": t.goalsDown(team.name),
6359
6520
  disabled: edit.disabled || value <= 0,
6360
6521
  onClick: () => edit.onStep(side, -1),
6361
- children: /* @__PURE__ */ jsx75(IconMinus, {})
6522
+ children: /* @__PURE__ */ jsx76(IconMinus, {})
6362
6523
  }
6363
6524
  )
6364
6525
  ] });
6365
- return /* @__PURE__ */ jsxs63("div", { className: "ss-g-mp-card", children: [
6366
- /* @__PURE__ */ jsx75(TeamBadge, { team: home, label: t.home }),
6367
- /* @__PURE__ */ jsxs63("div", { className: "ss-g-mp-scores", children: [
6526
+ return /* @__PURE__ */ jsxs64("div", { className: "ss-g-mp-card", children: [
6527
+ /* @__PURE__ */ jsx76(TeamBadge, { team: home, label: t.home }),
6528
+ /* @__PURE__ */ jsxs64("div", { className: "ss-g-mp-scores", children: [
6368
6529
  col("home", home, h),
6369
- /* @__PURE__ */ jsx75("span", { className: "ss-g-mp-dash", "aria-hidden": "true", children: "\u2013" }),
6530
+ /* @__PURE__ */ jsx76("span", { className: "ss-g-mp-dash", "aria-hidden": "true", children: "\u2013" }),
6370
6531
  col("away", away, a)
6371
6532
  ] }),
6372
- /* @__PURE__ */ jsx75(TeamBadge, { team: away, label: t.away })
6533
+ /* @__PURE__ */ jsx76(TeamBadge, { team: away, label: t.away })
6373
6534
  ] });
6374
6535
  }
6375
6536
  function OutcomeRow({ label, ok, detail, t }) {
6376
- return /* @__PURE__ */ jsxs63("li", { className: "ss-g-mp-row", "data-testid": "mp-row", "data-ok": String(ok), children: [
6377
- /* @__PURE__ */ jsx75("span", { className: "ss-g-mp-row-k", children: label }),
6378
- /* @__PURE__ */ jsxs63("span", { className: "ss-g-mp-row-v", children: [
6379
- ok ? /* @__PURE__ */ jsx75(IconCheck, {}) : /* @__PURE__ */ jsx75(IconClose, { size: 14 }),
6380
- /* @__PURE__ */ jsx75("span", { className: "ss-g-sr", children: ok ? t.correct : t.incorrect }),
6381
- detail ? /* @__PURE__ */ jsx75("span", { className: "ss-g-mp-row-d", children: detail }) : null
6537
+ return /* @__PURE__ */ jsxs64("li", { className: "ss-g-mp-row", "data-testid": "mp-row", "data-ok": String(ok), children: [
6538
+ /* @__PURE__ */ jsx76("span", { className: "ss-g-mp-row-k", children: label }),
6539
+ /* @__PURE__ */ jsxs64("span", { className: "ss-g-mp-row-v", children: [
6540
+ ok ? /* @__PURE__ */ jsx76(IconCheck, {}) : /* @__PURE__ */ jsx76(IconClose, { size: 14 }),
6541
+ /* @__PURE__ */ jsx76("span", { className: "ss-g-sr", children: ok ? t.correct : t.incorrect }),
6542
+ detail ? /* @__PURE__ */ jsx76("span", { className: "ss-g-mp-row-d", children: detail }) : null
6382
6543
  ] })
6383
6544
  ] });
6384
6545
  }
@@ -6391,20 +6552,20 @@ function MatchdayPredictorGame({
6391
6552
  onBack
6392
6553
  }) {
6393
6554
  const t = ui.games.predictor;
6394
- const [homeScore, setHomeScore] = useState31(0);
6395
- const [awayScore, setAwayScore] = useState31(0);
6396
- const [firstScorerPlayerId, setFirstScorerPlayerId] = useState31(null);
6397
- const [lastEdited, setLastEdited] = useState31("home");
6398
- const [query, setQuery] = useState31("");
6555
+ const [homeScore, setHomeScore] = useState32(0);
6556
+ const [awayScore, setAwayScore] = useState32(0);
6557
+ const [firstScorerPlayerId, setFirstScorerPlayerId] = useState32(null);
6558
+ const [lastEdited, setLastEdited] = useState32("home");
6559
+ const [query, setQuery] = useState32("");
6399
6560
  const searchId = useId6();
6400
6561
  const clientState = parseClientState7(result?.clientStateJson);
6401
6562
  const alreadyPlayed = result?.alreadyPlayed === true;
6402
- const header = /* @__PURE__ */ jsx75(
6563
+ const header = /* @__PURE__ */ jsx76(
6403
6564
  GameHeader,
6404
6565
  {
6405
6566
  title: gameTitle({ gameId: "matchday-predictor" }, ui.games.titles),
6406
6567
  eyebrow: config ? t.eyebrow(config.homeTeam.name, config.awayTeam.name) : void 0,
6407
- right: config ? /* @__PURE__ */ jsx75(Chip, { icon: /* @__PURE__ */ jsx75(IconLock, {}), children: ui.games.formatDayTime(config.kickoffUtc) }) : void 0,
6568
+ right: config ? /* @__PURE__ */ jsx76(Chip, { icon: /* @__PURE__ */ jsx76(IconLock, {}), children: ui.games.formatDayTime(config.kickoffUtc) }) : void 0,
6408
6569
  onBack,
6409
6570
  backLabel: ui.back
6410
6571
  }
@@ -6412,10 +6573,10 @@ function MatchdayPredictorGame({
6412
6573
  if (alreadyPlayed && clientState) {
6413
6574
  if (!clientState.graded) {
6414
6575
  const scorer = config?.scorerPool.find((p) => p.playerId === clientState.predictedFirstScorerPlayerId) ?? null;
6415
- return /* @__PURE__ */ jsxs63("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
6576
+ return /* @__PURE__ */ jsxs64("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
6416
6577
  header,
6417
- /* @__PURE__ */ jsxs63("div", { className: "ss-g-body", children: [
6418
- config && /* @__PURE__ */ jsx75(
6578
+ /* @__PURE__ */ jsxs64("div", { className: "ss-g-body", children: [
6579
+ config && /* @__PURE__ */ jsx76(
6419
6580
  ScoreCard,
6420
6581
  {
6421
6582
  home: config.homeTeam,
@@ -6425,7 +6586,7 @@ function MatchdayPredictorGame({
6425
6586
  t
6426
6587
  }
6427
6588
  ),
6428
- /* @__PURE__ */ jsx75(
6589
+ /* @__PURE__ */ jsx76(
6429
6590
  ResultCard,
6430
6591
  {
6431
6592
  tone: "neutral",
@@ -6442,28 +6603,28 @@ function MatchdayPredictorGame({
6442
6603
  }
6443
6604
  )
6444
6605
  ] }),
6445
- /* @__PURE__ */ jsx75(FooterBar, { children: /* @__PURE__ */ jsx75("p", { className: "ss-g-mp-fun", children: t.forFun }) })
6606
+ /* @__PURE__ */ jsx76(FooterBar, { children: /* @__PURE__ */ jsx76("p", { className: "ss-g-mp-fun", children: t.forFun }) })
6446
6607
  ] });
6447
6608
  }
6448
6609
  const r = clientState.result;
6449
- return /* @__PURE__ */ jsxs63("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
6610
+ return /* @__PURE__ */ jsxs64("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
6450
6611
  header,
6451
- /* @__PURE__ */ jsxs63("div", { className: "ss-g-body", children: [
6452
- config && /* @__PURE__ */ jsx75(ScoreCard, { home: config.homeTeam, away: config.awayTeam, h: r.homeScore, a: r.awayScore, t }),
6453
- /* @__PURE__ */ jsx75(ResultCard, { tone: "neutral", title: t.fullTime(r.homeScore, r.awayScore), onBack, ui }),
6454
- /* @__PURE__ */ jsxs63("ul", { className: "ss-g-mp-rows", children: [
6455
- /* @__PURE__ */ jsx75(OutcomeRow, { label: t.exactScore, ok: clientState.exactScoreCorrect, t }),
6456
- /* @__PURE__ */ jsx75(OutcomeRow, { label: t.outcome, ok: clientState.outcomeCorrect, t }),
6457
- !clientState.firstScorerVoid && /* @__PURE__ */ jsx75(OutcomeRow, { label: t.firstScorerRow, ok: clientState.firstScorerCorrect, detail: r.firstScorerName, t })
6612
+ /* @__PURE__ */ jsxs64("div", { className: "ss-g-body", children: [
6613
+ config && /* @__PURE__ */ jsx76(ScoreCard, { home: config.homeTeam, away: config.awayTeam, h: r.homeScore, a: r.awayScore, t }),
6614
+ /* @__PURE__ */ jsx76(ResultCard, { tone: "neutral", title: t.fullTime(r.homeScore, r.awayScore), onBack, ui }),
6615
+ /* @__PURE__ */ jsxs64("ul", { className: "ss-g-mp-rows", children: [
6616
+ /* @__PURE__ */ jsx76(OutcomeRow, { label: t.exactScore, ok: clientState.exactScoreCorrect, t }),
6617
+ /* @__PURE__ */ jsx76(OutcomeRow, { label: t.outcome, ok: clientState.outcomeCorrect, t }),
6618
+ !clientState.firstScorerVoid && /* @__PURE__ */ jsx76(OutcomeRow, { label: t.firstScorerRow, ok: clientState.firstScorerCorrect, detail: r.firstScorerName, t })
6458
6619
  ] })
6459
6620
  ] }),
6460
- /* @__PURE__ */ jsx75(FooterBar, { children: /* @__PURE__ */ jsx75("p", { className: "ss-g-mp-fun", children: t.forFun }) })
6621
+ /* @__PURE__ */ jsx76(FooterBar, { children: /* @__PURE__ */ jsx76("p", { className: "ss-g-mp-fun", children: t.forFun }) })
6461
6622
  ] });
6462
6623
  }
6463
6624
  if (!config) {
6464
- return /* @__PURE__ */ jsxs63("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
6625
+ return /* @__PURE__ */ jsxs64("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
6465
6626
  header,
6466
- /* @__PURE__ */ jsx75("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
6627
+ /* @__PURE__ */ jsx76("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
6467
6628
  ] });
6468
6629
  }
6469
6630
  const locked = isLocked(config.kickoffUtc);
@@ -6487,10 +6648,10 @@ function MatchdayPredictorGame({
6487
6648
  const showSearch = pool.length > SCORER_SEARCH_THRESHOLD;
6488
6649
  const q = query.trim().toLowerCase();
6489
6650
  const visible = showSearch && q ? pool.filter((p) => p.playerName.toLowerCase().includes(q)) : pool;
6490
- return /* @__PURE__ */ jsxs63("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
6651
+ return /* @__PURE__ */ jsxs64("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
6491
6652
  header,
6492
- /* @__PURE__ */ jsxs63("div", { className: "ss-g-body", children: [
6493
- /* @__PURE__ */ jsx75(
6653
+ /* @__PURE__ */ jsxs64("div", { className: "ss-g-body", children: [
6654
+ /* @__PURE__ */ jsx76(
6494
6655
  ScoreCard,
6495
6656
  {
6496
6657
  home: config.homeTeam,
@@ -6501,12 +6662,12 @@ function MatchdayPredictorGame({
6501
6662
  edit: { disabled, active: lastEdited, onStep: step }
6502
6663
  }
6503
6664
  ),
6504
- pool.length > 0 && /* @__PURE__ */ jsxs63("section", { className: "ss-g-mp-scorer", children: [
6505
- /* @__PURE__ */ jsxs63("div", { className: "ss-g-mp-sec-head", children: [
6506
- /* @__PURE__ */ jsx75("h3", { children: t.firstScorer }),
6507
- /* @__PURE__ */ jsx75("span", { children: t.optional })
6665
+ pool.length > 0 && /* @__PURE__ */ jsxs64("section", { className: "ss-g-mp-scorer", children: [
6666
+ /* @__PURE__ */ jsxs64("div", { className: "ss-g-mp-sec-head", children: [
6667
+ /* @__PURE__ */ jsx76("h3", { children: t.firstScorer }),
6668
+ /* @__PURE__ */ jsx76("span", { children: t.optional })
6508
6669
  ] }),
6509
- showSearch && /* @__PURE__ */ jsx75(
6670
+ showSearch && /* @__PURE__ */ jsx76(
6510
6671
  SearchField,
6511
6672
  {
6512
6673
  id: searchId,
@@ -6518,9 +6679,9 @@ function MatchdayPredictorGame({
6518
6679
  disabled
6519
6680
  }
6520
6681
  ),
6521
- /* @__PURE__ */ jsx75("div", { className: "ss-g-mp-grid", children: visible.map((p) => {
6682
+ /* @__PURE__ */ jsx76("div", { className: "ss-g-mp-grid", children: visible.map((p) => {
6522
6683
  const selected = firstScorerPlayerId === p.playerId;
6523
- return /* @__PURE__ */ jsxs63(
6684
+ return /* @__PURE__ */ jsxs64(
6524
6685
  "button",
6525
6686
  {
6526
6687
  type: "button",
@@ -6530,15 +6691,15 @@ function MatchdayPredictorGame({
6530
6691
  disabled,
6531
6692
  onClick: () => setFirstScorerPlayerId((id) => id === p.playerId ? null : p.playerId),
6532
6693
  children: [
6533
- selected && /* @__PURE__ */ jsx75("span", { className: "ss-g-mp-pcheck", children: /* @__PURE__ */ jsx75(IconCheck, { size: 12 }) }),
6534
- /* @__PURE__ */ jsx75(Silhouette, { size: 52, variant: selected ? "selected" : "default" }),
6535
- /* @__PURE__ */ jsx75("span", { className: "ss-g-mp-pname", children: splitName(p.playerName).last })
6694
+ selected && /* @__PURE__ */ jsx76("span", { className: "ss-g-mp-pcheck", children: /* @__PURE__ */ jsx76(IconCheck, { size: 12 }) }),
6695
+ /* @__PURE__ */ jsx76(Silhouette, { size: 52, variant: selected ? "selected" : "default" }),
6696
+ /* @__PURE__ */ jsx76("span", { className: "ss-g-mp-pname", children: splitName(p.playerName).last })
6536
6697
  ]
6537
6698
  },
6538
6699
  p.playerId
6539
6700
  );
6540
6701
  }) }),
6541
- /* @__PURE__ */ jsxs63(
6702
+ /* @__PURE__ */ jsxs64(
6542
6703
  "button",
6543
6704
  {
6544
6705
  type: "button",
@@ -6547,24 +6708,24 @@ function MatchdayPredictorGame({
6547
6708
  disabled,
6548
6709
  onClick: () => setFirstScorerPlayerId(null),
6549
6710
  children: [
6550
- /* @__PURE__ */ jsx75("span", { className: "ss-g-mp-radio", "aria-hidden": "true" }),
6711
+ /* @__PURE__ */ jsx76("span", { className: "ss-g-mp-radio", "aria-hidden": "true" }),
6551
6712
  t.noScorer
6552
6713
  ]
6553
6714
  }
6554
6715
  )
6555
6716
  ] }),
6556
- locked && /* @__PURE__ */ jsx75("p", { className: "ss-g-mp-closed", children: t.closed })
6717
+ locked && /* @__PURE__ */ jsx76("p", { className: "ss-g-mp-closed", children: t.closed })
6557
6718
  ] }),
6558
- /* @__PURE__ */ jsxs63(FooterBar, { children: [
6559
- /* @__PURE__ */ jsx75(GameButton, { variant: "primary", block: true, disabled, onClick: handleSubmit, children: submitting ? t.saving : t.save }),
6560
- /* @__PURE__ */ jsx75("p", { className: "ss-g-mp-fun", children: t.forFun })
6719
+ /* @__PURE__ */ jsxs64(FooterBar, { children: [
6720
+ /* @__PURE__ */ jsx76(GameButton, { variant: "primary", block: true, disabled, onClick: handleSubmit, children: submitting ? t.saving : t.save }),
6721
+ /* @__PURE__ */ jsx76("p", { className: "ss-g-mp-fun", children: t.forFun })
6561
6722
  ] })
6562
6723
  ] });
6563
6724
  }
6564
6725
 
6565
6726
  // src/components/games/StartingXiGame.tsx
6566
- import { useId as useId7, useState as useState32 } from "react";
6567
- import { Fragment as Fragment18, jsx as jsx76, jsxs as jsxs64 } from "react/jsx-runtime";
6727
+ import { useId as useId7, useState as useState33 } from "react";
6728
+ import { Fragment as Fragment18, jsx as jsx77, jsxs as jsxs65 } from "react/jsx-runtime";
6568
6729
  var POINTS_PER_STARTER = 8;
6569
6730
  var XI_SIZE = 11;
6570
6731
  var DEFAULT_FORMATION = "4-3-3";
@@ -6607,26 +6768,26 @@ function StartingXiGame({
6607
6768
  lockAtUtc
6608
6769
  }) {
6609
6770
  const t = ui.games.startingXi;
6610
- const [slotPlayers, setSlotPlayers] = useState32(() => Array(XI_SIZE).fill(null));
6611
- const [active, setActive] = useState32(0);
6612
- const [query, setQuery] = useState32("");
6771
+ const [slotPlayers, setSlotPlayers] = useState33(() => Array(XI_SIZE).fill(null));
6772
+ const [active, setActive] = useState33(0);
6773
+ const [query, setQuery] = useState33("");
6613
6774
  const searchId = useId7();
6614
6775
  const clientState = parseClientState8(result?.clientStateJson);
6615
6776
  const alreadyPlayed = result?.alreadyPlayed === true;
6616
- const header = /* @__PURE__ */ jsx76(
6777
+ const header = /* @__PURE__ */ jsx77(
6617
6778
  GameHeader,
6618
6779
  {
6619
6780
  title: gameTitle({ gameId: "starting-xi" }, ui.games.titles),
6620
6781
  eyebrow: t.eyebrow,
6621
- right: /* @__PURE__ */ jsx76(Chip, { variant: "accent", children: t.perStarter(POINTS_PER_STARTER) }),
6782
+ right: /* @__PURE__ */ jsx77(Chip, { variant: "accent", children: t.perStarter(POINTS_PER_STARTER) }),
6622
6783
  onBack,
6623
6784
  backLabel: ui.back
6624
6785
  }
6625
6786
  );
6626
6787
  function statusScreen(title, score) {
6627
- return /* @__PURE__ */ jsxs64("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
6788
+ return /* @__PURE__ */ jsxs65("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
6628
6789
  header,
6629
- /* @__PURE__ */ jsx76("div", { className: "ss-g-body", children: /* @__PURE__ */ jsx76(ResultCard, { tone: "neutral", title, score, onBack, ui }) })
6790
+ /* @__PURE__ */ jsx77("div", { className: "ss-g-body", children: /* @__PURE__ */ jsx77(ResultCard, { tone: "neutral", title, score, onBack, ui }) })
6630
6791
  ] });
6631
6792
  }
6632
6793
  if (alreadyPlayed) {
@@ -6635,9 +6796,9 @@ function StartingXiGame({
6635
6796
  if (clientState.status === "graded") return statusScreen(t.gradedLine(clientState.correctCount), clientState.score);
6636
6797
  }
6637
6798
  if (!config) {
6638
- return /* @__PURE__ */ jsxs64("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
6799
+ return /* @__PURE__ */ jsxs65("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
6639
6800
  header,
6640
- /* @__PURE__ */ jsx76("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
6801
+ /* @__PURE__ */ jsx77("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
6641
6802
  ] });
6642
6803
  }
6643
6804
  const { formation, slots } = formationSlots(config.formation);
@@ -6672,27 +6833,27 @@ function StartingXiGame({
6672
6833
  onSubmit(JSON.stringify({ predictedPlayerIds: slotPlayers }));
6673
6834
  }
6674
6835
  const segments = slotPlayers.map((p) => p !== null ? "current" : "todo");
6675
- return /* @__PURE__ */ jsxs64("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
6836
+ return /* @__PURE__ */ jsxs65("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
6676
6837
  header,
6677
- /* @__PURE__ */ jsx76(
6838
+ /* @__PURE__ */ jsx77(
6678
6839
  SegmentProgress,
6679
6840
  {
6680
6841
  segments,
6681
6842
  ariaLabel: t.picked(pickedCount),
6682
6843
  leftLabel: t.picked(pickedCount),
6683
6844
  rightLabel: t.toGo(XI_SIZE - pickedCount),
6684
- right: /* @__PURE__ */ jsx76(Chip, { children: formation })
6845
+ right: /* @__PURE__ */ jsx77(Chip, { children: formation })
6685
6846
  }
6686
6847
  ),
6687
- /* @__PURE__ */ jsxs64("div", { className: "ss-g-body", children: [
6688
- /* @__PURE__ */ jsxs64("div", { className: "ss-g-xi-pitch", children: [
6689
- /* @__PURE__ */ jsx76(PitchSvg, { variant: "half" }),
6848
+ /* @__PURE__ */ jsxs65("div", { className: "ss-g-body", children: [
6849
+ /* @__PURE__ */ jsxs65("div", { className: "ss-g-xi-pitch", children: [
6850
+ /* @__PURE__ */ jsx77(PitchSvg, { variant: "half" }),
6690
6851
  slots.map((s) => {
6691
6852
  const playerId = slotPlayers[s.index] ?? null;
6692
6853
  const player = playerId !== null ? byId.get(playerId) ?? null : null;
6693
6854
  const name = player?.playerName ?? "";
6694
6855
  const state = player ? "filled" : active === s.index ? "active" : "empty";
6695
- return /* @__PURE__ */ jsxs64(
6856
+ return /* @__PURE__ */ jsxs65(
6696
6857
  "button",
6697
6858
  {
6698
6859
  type: "button",
@@ -6704,21 +6865,21 @@ function StartingXiGame({
6704
6865
  disabled: submitting,
6705
6866
  onClick: () => tapSlot(s.index),
6706
6867
  children: [
6707
- /* @__PURE__ */ jsx76("span", { className: "ss-g-xi-ring", "aria-hidden": "true", children: player ? player.jerseyNumber ?? "" : /* @__PURE__ */ jsx76(IconPlus, { size: 18 }) }),
6708
- /* @__PURE__ */ jsx76("span", { className: "ss-g-xi-tag", "aria-hidden": "true", children: player ? splitName(name).last : s.label })
6868
+ /* @__PURE__ */ jsx77("span", { className: "ss-g-xi-ring", "aria-hidden": "true", children: player ? player.jerseyNumber ?? "" : /* @__PURE__ */ jsx77(IconPlus, { size: 18 }) }),
6869
+ /* @__PURE__ */ jsx77("span", { className: "ss-g-xi-tag", "aria-hidden": "true", children: player ? splitName(name).last : s.label })
6709
6870
  ]
6710
6871
  },
6711
6872
  s.index
6712
6873
  );
6713
6874
  })
6714
6875
  ] }),
6715
- /* @__PURE__ */ jsxs64("div", { className: "ss-g-xi-picker", children: [
6716
- /* @__PURE__ */ jsx76("div", { className: "ss-g-xi-picker-head", children: activeSlot ? /* @__PURE__ */ jsxs64(Fragment18, { children: [
6717
- /* @__PURE__ */ jsx76(Chip, { variant: "badge", children: activeSlot.label }),
6718
- /* @__PURE__ */ jsx76("strong", { children: t.pickFor(activeSlot.label) })
6719
- ] }) : /* @__PURE__ */ jsx76("strong", { children: t.allPicked }) }),
6720
- activeSlot && /* @__PURE__ */ jsxs64(Fragment18, { children: [
6721
- /* @__PURE__ */ jsx76(
6876
+ /* @__PURE__ */ jsxs65("div", { className: "ss-g-xi-picker", children: [
6877
+ /* @__PURE__ */ jsx77("div", { className: "ss-g-xi-picker-head", children: activeSlot ? /* @__PURE__ */ jsxs65(Fragment18, { children: [
6878
+ /* @__PURE__ */ jsx77(Chip, { variant: "badge", children: activeSlot.label }),
6879
+ /* @__PURE__ */ jsx77("strong", { children: t.pickFor(activeSlot.label) })
6880
+ ] }) : /* @__PURE__ */ jsx77("strong", { children: t.allPicked }) }),
6881
+ activeSlot && /* @__PURE__ */ jsxs65(Fragment18, { children: [
6882
+ /* @__PURE__ */ jsx77(
6722
6883
  SearchField,
6723
6884
  {
6724
6885
  id: searchId,
@@ -6730,18 +6891,18 @@ function StartingXiGame({
6730
6891
  disabled: submitting
6731
6892
  }
6732
6893
  ),
6733
- /* @__PURE__ */ jsx76("ul", { className: "ss-g-xi-list", children: available.map((p) => /* @__PURE__ */ jsx76("li", { children: /* @__PURE__ */ jsxs64("button", { type: "button", className: "ss-g-xi-opt", disabled: submitting, onClick: () => pick(p.playerId), children: [
6734
- /* @__PURE__ */ jsx76("span", { className: "ss-g-xi-opt-no", "aria-hidden": "true", children: p.jerseyNumber ?? "" }),
6735
- /* @__PURE__ */ jsx76("span", { className: "ss-g-xi-opt-name", children: p.playerName }),
6736
- /* @__PURE__ */ jsx76("span", { className: "ss-g-xi-opt-pos", children: p.positionName })
6894
+ /* @__PURE__ */ jsx77("ul", { className: "ss-g-xi-list", children: available.map((p) => /* @__PURE__ */ jsx77("li", { children: /* @__PURE__ */ jsxs65("button", { type: "button", className: "ss-g-xi-opt", disabled: submitting, onClick: () => pick(p.playerId), children: [
6895
+ /* @__PURE__ */ jsx77("span", { className: "ss-g-xi-opt-no", "aria-hidden": "true", children: p.jerseyNumber ?? "" }),
6896
+ /* @__PURE__ */ jsx77("span", { className: "ss-g-xi-opt-name", children: p.playerName }),
6897
+ /* @__PURE__ */ jsx77("span", { className: "ss-g-xi-opt-pos", children: p.positionName })
6737
6898
  ] }) }, p.playerId)) })
6738
6899
  ] })
6739
6900
  ] })
6740
6901
  ] }),
6741
- /* @__PURE__ */ jsxs64(FooterBar, { children: [
6742
- /* @__PURE__ */ jsx76(GameButton, { variant: "primary", block: true, disabled: !canSubmit, onClick: handleSubmit, children: submitting ? t.submitting : t.submit }),
6743
- /* @__PURE__ */ jsxs64("p", { className: "ss-g-xi-lock", children: [
6744
- /* @__PURE__ */ jsx76(IconLock, {}),
6902
+ /* @__PURE__ */ jsxs65(FooterBar, { children: [
6903
+ /* @__PURE__ */ jsx77(GameButton, { variant: "primary", block: true, disabled: !canSubmit, onClick: handleSubmit, children: submitting ? t.submitting : t.submit }),
6904
+ /* @__PURE__ */ jsxs65("p", { className: "ss-g-xi-lock", children: [
6905
+ /* @__PURE__ */ jsx77(IconLock, {}),
6745
6906
  lockAtUtc ? t.locksAt(ui.games.formatDayTime(lockAtUtc)) : t.locksSoon
6746
6907
  ] })
6747
6908
  ] })
@@ -6749,8 +6910,8 @@ function StartingXiGame({
6749
6910
  }
6750
6911
 
6751
6912
  // src/components/games/StatLadderGame.tsx
6752
- import { useId as useId8, useState as useState33 } from "react";
6753
- import { jsx as jsx77, jsxs as jsxs65 } from "react/jsx-runtime";
6913
+ import { useId as useId8, useState as useState34 } from "react";
6914
+ import { jsx as jsx78, jsxs as jsxs66 } from "react/jsx-runtime";
6754
6915
  function ladderClue(ladder) {
6755
6916
  const mystery = ladder.find((r) => r.rank === 2);
6756
6917
  if (!mystery) return null;
@@ -6772,9 +6933,9 @@ function parseClientState9(json) {
6772
6933
  }
6773
6934
  function NameStack({ name }) {
6774
6935
  const { first, last } = splitName(name);
6775
- return /* @__PURE__ */ jsxs65("span", { className: "ss-g-sl-name", children: [
6776
- first && /* @__PURE__ */ jsx77("small", { children: `${first[0]}.` }),
6777
- /* @__PURE__ */ jsx77("b", { children: last })
6936
+ return /* @__PURE__ */ jsxs66("span", { className: "ss-g-sl-name", children: [
6937
+ first && /* @__PURE__ */ jsx78("small", { children: `${first[0]}.` }),
6938
+ /* @__PURE__ */ jsx78("b", { children: last })
6778
6939
  ] });
6779
6940
  }
6780
6941
  function StatLadderGame({
@@ -6786,16 +6947,16 @@ function StatLadderGame({
6786
6947
  onBack
6787
6948
  }) {
6788
6949
  const t = ui.games.statLadder;
6789
- const [query, setQuery] = useState33("");
6790
- const [selectedId, setSelectedId] = useState33(null);
6950
+ const [query, setQuery] = useState34("");
6951
+ const [selectedId, setSelectedId] = useState34(null);
6791
6952
  const searchId = useId8();
6792
6953
  const clientState = parseClientState9(result?.clientStateJson);
6793
6954
  const revealed = clientState != null;
6794
- const header = /* @__PURE__ */ jsx77(GameHeader, { title: gameTitle({ gameId: "stat-ladder" }, ui.games.titles), eyebrow: t.eyebrow, onBack, backLabel: ui.back });
6955
+ const header = /* @__PURE__ */ jsx78(GameHeader, { title: gameTitle({ gameId: "stat-ladder" }, ui.games.titles), eyebrow: t.eyebrow, onBack, backLabel: ui.back });
6795
6956
  if (!config) {
6796
- return /* @__PURE__ */ jsxs65("div", { className: "ss-g-screen", "data-testid": "game-screen-stat-ladder", children: [
6957
+ return /* @__PURE__ */ jsxs66("div", { className: "ss-g-screen", "data-testid": "game-screen-stat-ladder", children: [
6797
6958
  header,
6798
- /* @__PURE__ */ jsx77("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
6959
+ /* @__PURE__ */ jsx78("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
6799
6960
  ] });
6800
6961
  }
6801
6962
  const question = t.question(config.statLabel);
@@ -6807,44 +6968,44 @@ function StatLadderGame({
6807
6968
  if (selectedId === null || submitting || revealed) return;
6808
6969
  onSubmit(JSON.stringify({ guessedPlayerId: selectedId }));
6809
6970
  }
6810
- return /* @__PURE__ */ jsxs65("div", { className: "ss-g-screen", "data-testid": "game-screen-stat-ladder", children: [
6971
+ return /* @__PURE__ */ jsxs66("div", { className: "ss-g-screen", "data-testid": "game-screen-stat-ladder", children: [
6811
6972
  header,
6812
- /* @__PURE__ */ jsxs65("div", { className: "ss-g-body", children: [
6813
- /* @__PURE__ */ jsxs65("div", { className: "ss-g-sl-prompt", children: [
6814
- /* @__PURE__ */ jsx77(Chip, { variant: "accent", icon: /* @__PURE__ */ jsx77(IconShield, { size: 14 }), className: "ss-g-sl-stat", children: config.statLabel }),
6815
- /* @__PURE__ */ jsxs65("h3", { className: "ss-g-sl-q", children: [
6973
+ /* @__PURE__ */ jsxs66("div", { className: "ss-g-body", children: [
6974
+ /* @__PURE__ */ jsxs66("div", { className: "ss-g-sl-prompt", children: [
6975
+ /* @__PURE__ */ jsx78(Chip, { variant: "accent", icon: /* @__PURE__ */ jsx78(IconShield, { size: 14 }), className: "ss-g-sl-stat", children: config.statLabel }),
6976
+ /* @__PURE__ */ jsxs66("h3", { className: "ss-g-sl-q", children: [
6816
6977
  question.pre,
6817
- /* @__PURE__ */ jsx77("em", { children: question.emph }),
6978
+ /* @__PURE__ */ jsx78("em", { children: question.emph }),
6818
6979
  question.post
6819
6980
  ] })
6820
6981
  ] }),
6821
- /* @__PURE__ */ jsx77("ol", { className: "ss-g-sl-rungs", children: rungs.map(
6822
- (rung) => rung.rank === 2 ? /* @__PURE__ */ jsxs65(
6982
+ /* @__PURE__ */ jsx78("ol", { className: "ss-g-sl-rungs", children: rungs.map(
6983
+ (rung) => rung.rank === 2 ? /* @__PURE__ */ jsxs66(
6823
6984
  "li",
6824
6985
  {
6825
6986
  className: "ss-g-sl-rung ss-g-sl-rung--mystery",
6826
6987
  "data-testid": "sl-mystery-rung",
6827
6988
  "data-result": revealed ? clientState.isCorrect ? "correct" : "wrong" : void 0,
6828
6989
  children: [
6829
- /* @__PURE__ */ jsx77("span", { className: "ss-g-sl-rank", children: "2" }),
6830
- revealed ? /* @__PURE__ */ jsx77(PlayerAvatar, { name: clientState.revealedRank2.playerName, className: "ss-g-sl-av" }) : /* @__PURE__ */ jsx77(Silhouette, { size: 52, variant: "mystery" }),
6831
- revealed ? /* @__PURE__ */ jsx77(NameStack, { name: clientState.revealedRank2.playerName }) : /* @__PURE__ */ jsx77("span", { className: "ss-g-sl-who", children: t.whoSecond }),
6832
- /* @__PURE__ */ jsx77("span", { className: "ss-g-sl-val ss-g-sl-val--mystery", children: rung.statValue })
6990
+ /* @__PURE__ */ jsx78("span", { className: "ss-g-sl-rank", children: "2" }),
6991
+ revealed ? /* @__PURE__ */ jsx78(PlayerAvatar, { name: clientState.revealedRank2.playerName, className: "ss-g-sl-av" }) : /* @__PURE__ */ jsx78(Silhouette, { size: 52, variant: "mystery" }),
6992
+ revealed ? /* @__PURE__ */ jsx78(NameStack, { name: clientState.revealedRank2.playerName }) : /* @__PURE__ */ jsx78("span", { className: "ss-g-sl-who", children: t.whoSecond }),
6993
+ /* @__PURE__ */ jsx78("span", { className: "ss-g-sl-val ss-g-sl-val--mystery", children: rung.statValue })
6833
6994
  ]
6834
6995
  },
6835
6996
  rung.rank
6836
- ) : /* @__PURE__ */ jsxs65("li", { className: "ss-g-sl-rung", children: [
6837
- /* @__PURE__ */ jsx77("span", { className: "ss-g-sl-rank", children: rung.rank }),
6838
- /* @__PURE__ */ jsx77(PlayerAvatar, { name: rung.playerName ?? "?", className: "ss-g-sl-av" }),
6839
- /* @__PURE__ */ jsx77(NameStack, { name: rung.playerName ?? "?" }),
6840
- /* @__PURE__ */ jsx77("span", { className: "ss-g-sl-val", children: rung.statValue })
6997
+ ) : /* @__PURE__ */ jsxs66("li", { className: "ss-g-sl-rung", children: [
6998
+ /* @__PURE__ */ jsx78("span", { className: "ss-g-sl-rank", children: rung.rank }),
6999
+ /* @__PURE__ */ jsx78(PlayerAvatar, { name: rung.playerName ?? "?", className: "ss-g-sl-av" }),
7000
+ /* @__PURE__ */ jsx78(NameStack, { name: rung.playerName ?? "?" }),
7001
+ /* @__PURE__ */ jsx78("span", { className: "ss-g-sl-val", children: rung.statValue })
6841
7002
  ] }, rung.rank)
6842
7003
  ) }),
6843
- clue && /* @__PURE__ */ jsxs65("p", { className: "ss-g-sl-clue", children: [
6844
- /* @__PURE__ */ jsx77(IconBulb, {}),
6845
- /* @__PURE__ */ jsx77("span", { children: t.clue(clue, config.statLabel) })
7004
+ clue && /* @__PURE__ */ jsxs66("p", { className: "ss-g-sl-clue", children: [
7005
+ /* @__PURE__ */ jsx78(IconBulb, {}),
7006
+ /* @__PURE__ */ jsx78("span", { children: t.clue(clue, config.statLabel) })
6846
7007
  ] }),
6847
- !revealed && /* @__PURE__ */ jsx77("ul", { className: "ss-g-sl-pool", children: pool.map((p) => /* @__PURE__ */ jsx77("li", { children: /* @__PURE__ */ jsxs65(
7008
+ !revealed && /* @__PURE__ */ jsx78("ul", { className: "ss-g-sl-pool", children: pool.map((p) => /* @__PURE__ */ jsx78("li", { children: /* @__PURE__ */ jsxs66(
6848
7009
  "button",
6849
7010
  {
6850
7011
  type: "button",
@@ -6857,13 +7018,13 @@ function StatLadderGame({
6857
7018
  setQuery(p.playerName);
6858
7019
  },
6859
7020
  children: [
6860
- /* @__PURE__ */ jsx77(PlayerAvatar, { name: p.playerName, className: "ss-g-sl-opt-av" }),
6861
- /* @__PURE__ */ jsx77("span", { className: "ss-g-sl-opt-name", children: p.playerName }),
6862
- selectedId === p.playerId && /* @__PURE__ */ jsx77(IconCheck, {})
7021
+ /* @__PURE__ */ jsx78(PlayerAvatar, { name: p.playerName, className: "ss-g-sl-opt-av" }),
7022
+ /* @__PURE__ */ jsx78("span", { className: "ss-g-sl-opt-name", children: p.playerName }),
7023
+ selectedId === p.playerId && /* @__PURE__ */ jsx78(IconCheck, {})
6863
7024
  ]
6864
7025
  }
6865
7026
  ) }, p.playerId)) }),
6866
- revealed && /* @__PURE__ */ jsx77(
7027
+ revealed && /* @__PURE__ */ jsx78(
6867
7028
  ResultCard,
6868
7029
  {
6869
7030
  tone: clientState.isCorrect ? "win" : "lose",
@@ -6874,8 +7035,8 @@ function StatLadderGame({
6874
7035
  }
6875
7036
  )
6876
7037
  ] }),
6877
- !revealed && /* @__PURE__ */ jsx77(FooterBar, { children: /* @__PURE__ */ jsxs65("div", { className: "ss-g-sl-guess", children: [
6878
- /* @__PURE__ */ jsx77(
7038
+ !revealed && /* @__PURE__ */ jsx78(FooterBar, { children: /* @__PURE__ */ jsxs66("div", { className: "ss-g-sl-guess", children: [
7039
+ /* @__PURE__ */ jsx78(
6879
7040
  SearchField,
6880
7041
  {
6881
7042
  id: searchId,
@@ -6890,13 +7051,13 @@ function StatLadderGame({
6890
7051
  disabled: submitting
6891
7052
  }
6892
7053
  ),
6893
- /* @__PURE__ */ jsx77(GameButton, { variant: "primary", disabled: selectedId === null || submitting, onClick: guess, children: t.guess })
7054
+ /* @__PURE__ */ jsx78(GameButton, { variant: "primary", disabled: selectedId === null || submitting, onClick: guess, children: t.guess })
6894
7055
  ] }) })
6895
7056
  ] });
6896
7057
  }
6897
7058
 
6898
7059
  // src/components/games/FanMotmGame.tsx
6899
- import { jsx as jsx78, jsxs as jsxs66 } from "react/jsx-runtime";
7060
+ import { jsx as jsx79, jsxs as jsxs67 } from "react/jsx-runtime";
6900
7061
  function parseClientState10(json) {
6901
7062
  if (!json) return null;
6902
7063
  try {
@@ -6917,20 +7078,20 @@ function FanMotmGame({
6917
7078
  const clientState = parseClientState10(result?.clientStateJson);
6918
7079
  const alreadyVoted = result?.alreadyPlayed === true;
6919
7080
  const pickedId = clientState?.pickedPlayerId ?? null;
6920
- const header = /* @__PURE__ */ jsx78(
7081
+ const header = /* @__PURE__ */ jsx79(
6921
7082
  GameHeader,
6922
7083
  {
6923
7084
  title: t.title,
6924
7085
  eyebrow: t.eyebrow,
6925
- right: alreadyVoted ? /* @__PURE__ */ jsx78(Chip, { variant: "success", icon: /* @__PURE__ */ jsx78(IconCheck, {}), children: t.voted }) : void 0,
7086
+ right: alreadyVoted ? /* @__PURE__ */ jsx79(Chip, { variant: "success", icon: /* @__PURE__ */ jsx79(IconCheck, {}), children: t.voted }) : void 0,
6926
7087
  onBack,
6927
7088
  backLabel: ui.back
6928
7089
  }
6929
7090
  );
6930
7091
  if (!config) {
6931
- return /* @__PURE__ */ jsxs66("div", { className: "ss-g-screen", "data-testid": "game-screen-fan-motm", children: [
7092
+ return /* @__PURE__ */ jsxs67("div", { className: "ss-g-screen", "data-testid": "game-screen-fan-motm", children: [
6932
7093
  header,
6933
- /* @__PURE__ */ jsx78("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
7094
+ /* @__PURE__ */ jsx79("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
6934
7095
  ] });
6935
7096
  }
6936
7097
  const picked = config.candidates.find((c) => c.playerId === pickedId) ?? null;
@@ -6938,12 +7099,12 @@ function FanMotmGame({
6938
7099
  if (alreadyVoted || submitting) return;
6939
7100
  onSubmit(JSON.stringify({ pickedPlayerId: candidateId }));
6940
7101
  }
6941
- return /* @__PURE__ */ jsxs66("div", { className: "ss-g-screen", "data-testid": "game-screen-fan-motm", children: [
7102
+ return /* @__PURE__ */ jsxs67("div", { className: "ss-g-screen", "data-testid": "game-screen-fan-motm", children: [
6942
7103
  header,
6943
- /* @__PURE__ */ jsxs66("div", { className: "ss-g-body", children: [
6944
- /* @__PURE__ */ jsx78("ul", { className: "ss-g-motm-list", children: config.candidates.map((c) => {
7104
+ /* @__PURE__ */ jsxs67("div", { className: "ss-g-body", children: [
7105
+ /* @__PURE__ */ jsx79("ul", { className: "ss-g-motm-list", children: config.candidates.map((c) => {
6945
7106
  const isVoted = alreadyVoted && pickedId === c.playerId;
6946
- return /* @__PURE__ */ jsx78("li", { children: /* @__PURE__ */ jsxs66(
7107
+ return /* @__PURE__ */ jsx79("li", { children: /* @__PURE__ */ jsxs67(
6947
7108
  "button",
6948
7109
  {
6949
7110
  type: "button",
@@ -6952,24 +7113,24 @@ function FanMotmGame({
6952
7113
  disabled: alreadyVoted || submitting,
6953
7114
  onClick: () => handleVote(c.playerId),
6954
7115
  children: [
6955
- /* @__PURE__ */ jsx78(PlayerAvatar, { name: c.playerName, className: "ss-g-motm-av" }),
6956
- /* @__PURE__ */ jsx78("span", { className: "ss-g-motm-name", children: c.playerName }),
6957
- isVoted && /* @__PURE__ */ jsx78(Chip, { variant: "accent", className: "ss-g-motm-pill", children: t.yourVote })
7116
+ /* @__PURE__ */ jsx79(PlayerAvatar, { name: c.playerName, className: "ss-g-motm-av" }),
7117
+ /* @__PURE__ */ jsx79("span", { className: "ss-g-motm-name", children: c.playerName }),
7118
+ isVoted && /* @__PURE__ */ jsx79(Chip, { variant: "accent", className: "ss-g-motm-pill", children: t.yourVote })
6958
7119
  ]
6959
7120
  }
6960
7121
  ) }, c.playerId);
6961
7122
  }) }),
6962
- alreadyVoted && picked && /* @__PURE__ */ jsx78(ResultCard, { tone: "neutral", title: t.youVoted(picked.playerName), detail: t.thanks, onBack, ui })
7123
+ alreadyVoted && picked && /* @__PURE__ */ jsx79(ResultCard, { tone: "neutral", title: t.youVoted(picked.playerName), detail: t.thanks, onBack, ui })
6963
7124
  ] }),
6964
- /* @__PURE__ */ jsxs66(FooterBar, { children: [
6965
- !alreadyVoted && /* @__PURE__ */ jsx78("p", { className: "ss-g-motm-foot", children: t.tapToVote }),
6966
- /* @__PURE__ */ jsx78("p", { className: "ss-g-motm-fun", children: t.forFun })
7125
+ /* @__PURE__ */ jsxs67(FooterBar, { children: [
7126
+ !alreadyVoted && /* @__PURE__ */ jsx79("p", { className: "ss-g-motm-foot", children: t.tapToVote }),
7127
+ /* @__PURE__ */ jsx79("p", { className: "ss-g-motm-fun", children: t.forFun })
6967
7128
  ] })
6968
7129
  ] });
6969
7130
  }
6970
7131
 
6971
7132
  // src/components/GameScreenHost.tsx
6972
- import { jsx as jsx79 } from "react/jsx-runtime";
7133
+ import { jsx as jsx80 } from "react/jsx-runtime";
6973
7134
  var FIXTURE_GAME_IDS = /* @__PURE__ */ new Set([
6974
7135
  "matchday-predictor",
6975
7136
  "starting-xi",
@@ -6993,8 +7154,8 @@ function GameScreenHost({
6993
7154
  ui
6994
7155
  }) {
6995
7156
  const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
6996
- const [configJson, setConfigJson] = useState34(null);
6997
- useEffect15(() => {
7157
+ const [configJson, setConfigJson] = useState35(null);
7158
+ useEffect16(() => {
6998
7159
  setConfigJson(null);
6999
7160
  if (!conversation) return;
7000
7161
  let cancelled = false;
@@ -7017,12 +7178,12 @@ function GameScreenHost({
7017
7178
  fixtureId: fixtureId || void 0,
7018
7179
  locale: ui.games.lang
7019
7180
  });
7020
- useEffect15(() => {
7181
+ useEffect16(() => {
7021
7182
  if (conversation) hydrate();
7022
7183
  }, [conversation, gameId]);
7023
- const hydrateRef = useRef13(hydrate);
7184
+ const hydrateRef = useRef14(hydrate);
7024
7185
  hydrateRef.current = hydrate;
7025
- useEffect15(() => {
7186
+ useEffect16(() => {
7026
7187
  if (!FIXTURE_GAME_IDS.has(gameId)) return;
7027
7188
  if (rawStatus !== "pending") return;
7028
7189
  const timerId = setInterval(() => {
@@ -7045,7 +7206,7 @@ function GameScreenHost({
7045
7206
  function renderScreen() {
7046
7207
  switch (gameId) {
7047
7208
  case "mystery-tiger":
7048
- return /* @__PURE__ */ jsx79(
7209
+ return /* @__PURE__ */ jsx80(
7049
7210
  MysteryTigerGame,
7050
7211
  {
7051
7212
  ...sharedProps,
@@ -7053,7 +7214,7 @@ function GameScreenHost({
7053
7214
  }
7054
7215
  );
7055
7216
  case "higher-or-lower":
7056
- return /* @__PURE__ */ jsx79(
7217
+ return /* @__PURE__ */ jsx80(
7057
7218
  HigherOrLowerGame,
7058
7219
  {
7059
7220
  ...sharedProps,
@@ -7061,7 +7222,7 @@ function GameScreenHost({
7061
7222
  }
7062
7223
  );
7063
7224
  case "career-path":
7064
- return /* @__PURE__ */ jsx79(
7225
+ return /* @__PURE__ */ jsx80(
7065
7226
  CareerPathGame,
7066
7227
  {
7067
7228
  ...sharedProps,
@@ -7070,7 +7231,7 @@ function GameScreenHost({
7070
7231
  );
7071
7232
  case "beat-the-grid": {
7072
7233
  const btgConfig = safeParseConfig(configJson);
7073
- return /* @__PURE__ */ jsx79(
7234
+ return /* @__PURE__ */ jsx80(
7074
7235
  BeatTheGridGame,
7075
7236
  {
7076
7237
  ...sharedProps,
@@ -7080,7 +7241,7 @@ function GameScreenHost({
7080
7241
  );
7081
7242
  }
7082
7243
  case "guess-the-xi":
7083
- return /* @__PURE__ */ jsx79(
7244
+ return /* @__PURE__ */ jsx80(
7084
7245
  GuessTheXiGame,
7085
7246
  {
7086
7247
  ...sharedProps,
@@ -7088,7 +7249,7 @@ function GameScreenHost({
7088
7249
  }
7089
7250
  );
7090
7251
  case "daily-quiz":
7091
- return /* @__PURE__ */ jsx79(
7252
+ return /* @__PURE__ */ jsx80(
7092
7253
  DailyQuizGame,
7093
7254
  {
7094
7255
  ...sharedProps,
@@ -7096,7 +7257,7 @@ function GameScreenHost({
7096
7257
  }
7097
7258
  );
7098
7259
  case "matchday-predictor":
7099
- return /* @__PURE__ */ jsx79(
7260
+ return /* @__PURE__ */ jsx80(
7100
7261
  MatchdayPredictorGame,
7101
7262
  {
7102
7263
  ...sharedProps,
@@ -7104,7 +7265,7 @@ function GameScreenHost({
7104
7265
  }
7105
7266
  );
7106
7267
  case "starting-xi":
7107
- return /* @__PURE__ */ jsx79(
7268
+ return /* @__PURE__ */ jsx80(
7108
7269
  StartingXiGame,
7109
7270
  {
7110
7271
  ...sharedProps,
@@ -7112,7 +7273,7 @@ function GameScreenHost({
7112
7273
  }
7113
7274
  );
7114
7275
  case "stat-ladder":
7115
- return /* @__PURE__ */ jsx79(
7276
+ return /* @__PURE__ */ jsx80(
7116
7277
  StatLadderGame,
7117
7278
  {
7118
7279
  ...sharedProps,
@@ -7120,7 +7281,7 @@ function GameScreenHost({
7120
7281
  }
7121
7282
  );
7122
7283
  case "fan-motm":
7123
- return /* @__PURE__ */ jsx79(
7284
+ return /* @__PURE__ */ jsx80(
7124
7285
  FanMotmGame,
7125
7286
  {
7126
7287
  ...sharedProps,
@@ -7128,10 +7289,10 @@ function GameScreenHost({
7128
7289
  }
7129
7290
  );
7130
7291
  default:
7131
- return /* @__PURE__ */ jsx79("div", { className: "ss-g-screen", "data-testid": `game-screen-${gameId}`, children: /* @__PURE__ */ jsx79(GameHeader, { title: gameTitle({ gameId }, ui.games.titles), onBack, backLabel: ui.back }) });
7292
+ return /* @__PURE__ */ jsx80("div", { className: "ss-g-screen", "data-testid": `game-screen-${gameId}`, children: /* @__PURE__ */ jsx80(GameHeader, { title: gameTitle({ gameId }, ui.games.titles), onBack, backLabel: ui.back }) });
7132
7293
  }
7133
7294
  }
7134
- return /* @__PURE__ */ jsx79("div", { className: "ss-w-gscreen", "data-testid": "gscreen", "data-lock-at": lockAtUtc ?? void 0, children: renderScreen() });
7295
+ return /* @__PURE__ */ jsx80("div", { className: "ss-w-gscreen", "data-testid": "gscreen", "data-lock-at": lockAtUtc ?? void 0, children: renderScreen() });
7135
7296
  }
7136
7297
 
7137
7298
  // src/components/games/ui/fonts.ts
@@ -7148,7 +7309,7 @@ function ensureGamesFonts(doc = document) {
7148
7309
  }
7149
7310
 
7150
7311
  // src/components/GamesPanel.tsx
7151
- import { jsx as jsx80 } from "react/jsx-runtime";
7312
+ import { jsx as jsx81 } from "react/jsx-runtime";
7152
7313
  function GamesPanel({
7153
7314
  loggedIn,
7154
7315
  games,
@@ -7157,13 +7318,13 @@ function GamesPanel({
7157
7318
  leaderboard,
7158
7319
  refreshHub
7159
7320
  }) {
7160
- const [selected, setSelected] = useState35(null);
7161
- useEffect16(() => {
7321
+ const [selected, setSelected] = useState36(null);
7322
+ useEffect17(() => {
7162
7323
  ensureGamesFonts();
7163
7324
  }, []);
7164
- if (!loggedIn) return /* @__PURE__ */ jsx80(GamesLoginWall, { ui });
7325
+ if (!loggedIn) return /* @__PURE__ */ jsx81(GamesLoginWall, { ui });
7165
7326
  if (selected !== null) {
7166
- return /* @__PURE__ */ jsx80("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ jsx80(
7327
+ return /* @__PURE__ */ jsx81("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ jsx81(
7167
7328
  GameScreenHost,
7168
7329
  {
7169
7330
  selected,
@@ -7177,7 +7338,7 @@ function GamesPanel({
7177
7338
  }
7178
7339
  ) });
7179
7340
  }
7180
- return /* @__PURE__ */ jsx80("div", { className: "ss-g-hub-wrap", "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ jsx80(
7341
+ return /* @__PURE__ */ jsx81("div", { className: "ss-g-hub-wrap", "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ jsx81(
7181
7342
  GamesHub,
7182
7343
  {
7183
7344
  games,
@@ -7189,10 +7350,10 @@ function GamesPanel({
7189
7350
  }
7190
7351
 
7191
7352
  // src/components/Leaderboard.tsx
7192
- import { useState as useState36 } from "react";
7353
+ import { useState as useState37 } from "react";
7193
7354
 
7194
7355
  // src/components/LeaderboardRow.tsx
7195
- import { jsx as jsx81, jsxs as jsxs67 } from "react/jsx-runtime";
7356
+ import { jsx as jsx82, jsxs as jsxs68 } from "react/jsx-runtime";
7196
7357
  function formatPoints(n) {
7197
7358
  return n.toLocaleString("en");
7198
7359
  }
@@ -7201,14 +7362,14 @@ function LeaderboardWeeklyRow({
7201
7362
  isMe
7202
7363
  }) {
7203
7364
  const rankClass = `ss-w-lb2-rank${row.rank <= 3 ? " ss-w-lb2-rank--top3" : ""}`;
7204
- return /* @__PURE__ */ jsxs67("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
7205
- /* @__PURE__ */ jsxs67("span", { className: rankClass, children: [
7365
+ return /* @__PURE__ */ jsxs68("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
7366
+ /* @__PURE__ */ jsxs68("span", { className: rankClass, children: [
7206
7367
  "#",
7207
7368
  row.rank
7208
7369
  ] }),
7209
- /* @__PURE__ */ jsx81("span", { className: "ss-w-lb2-handle", children: row.handle }),
7210
- /* @__PURE__ */ jsx81("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
7211
- row.currentStreak > 0 && /* @__PURE__ */ jsxs67("span", { className: "ss-w-lb2-streak", children: [
7370
+ /* @__PURE__ */ jsx82("span", { className: "ss-w-lb2-handle", children: row.handle }),
7371
+ /* @__PURE__ */ jsx82("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
7372
+ row.currentStreak > 0 && /* @__PURE__ */ jsxs68("span", { className: "ss-w-lb2-streak", children: [
7212
7373
  "\u{1F525} ",
7213
7374
  row.currentStreak
7214
7375
  ] })
@@ -7219,18 +7380,18 @@ function LeaderboardAllTimeRow({
7219
7380
  isMe
7220
7381
  }) {
7221
7382
  const rankClass = `ss-w-lb2-rank${row.rank <= 3 ? " ss-w-lb2-rank--top3" : ""}`;
7222
- return /* @__PURE__ */ jsxs67("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
7223
- /* @__PURE__ */ jsxs67("span", { className: rankClass, children: [
7383
+ return /* @__PURE__ */ jsxs68("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
7384
+ /* @__PURE__ */ jsxs68("span", { className: rankClass, children: [
7224
7385
  "#",
7225
7386
  row.rank
7226
7387
  ] }),
7227
- /* @__PURE__ */ jsx81("span", { className: "ss-w-lb2-handle", children: row.handle }),
7228
- /* @__PURE__ */ jsx81("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
7388
+ /* @__PURE__ */ jsx82("span", { className: "ss-w-lb2-handle", children: row.handle }),
7389
+ /* @__PURE__ */ jsx82("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
7229
7390
  ] });
7230
7391
  }
7231
7392
 
7232
7393
  // src/components/LeaderboardEmpty.tsx
7233
- import { jsx as jsx82, jsxs as jsxs68 } from "react/jsx-runtime";
7394
+ import { jsx as jsx83, jsxs as jsxs69 } from "react/jsx-runtime";
7234
7395
  function LeaderboardEmpty({
7235
7396
  segment,
7236
7397
  lastWeek,
@@ -7239,48 +7400,48 @@ function LeaderboardEmpty({
7239
7400
  ui
7240
7401
  }) {
7241
7402
  if (segment === "alltime") {
7242
- return /* @__PURE__ */ jsxs68("div", { className: "ss-w-lb-empty ss-w-lb-empty--alltime", children: [
7243
- /* @__PURE__ */ jsx82("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
7244
- /* @__PURE__ */ jsx82("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
7403
+ return /* @__PURE__ */ jsxs69("div", { className: "ss-w-lb-empty ss-w-lb-empty--alltime", children: [
7404
+ /* @__PURE__ */ jsx83("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
7405
+ /* @__PURE__ */ jsx83("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
7245
7406
  ] });
7246
7407
  }
7247
7408
  const fresh = lastWeek != null;
7248
7409
  const title = fresh ? ui.leaderboardEmptyFreshTitle : ui.leaderboardEmptyColdTitle;
7249
7410
  const body = fresh ? ui.leaderboardEmptyFreshBody : ui.leaderboardEmptyColdBody;
7250
- return /* @__PURE__ */ jsxs68("div", { className: "ss-w-lb-empty", children: [
7251
- weeklyPrize && /* @__PURE__ */ jsxs68("div", { className: "ss-w-prize", children: [
7252
- /* @__PURE__ */ jsx82("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
7253
- /* @__PURE__ */ jsx82("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ jsx82("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
7411
+ return /* @__PURE__ */ jsxs69("div", { className: "ss-w-lb-empty", children: [
7412
+ weeklyPrize && /* @__PURE__ */ jsxs69("div", { className: "ss-w-prize", children: [
7413
+ /* @__PURE__ */ jsx83("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
7414
+ /* @__PURE__ */ jsx83("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ jsx83("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
7254
7415
  ] }),
7255
- /* @__PURE__ */ jsxs68("div", { className: "ss-w-lb-empty-hero", children: [
7256
- /* @__PURE__ */ jsx82("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
7257
- /* @__PURE__ */ jsx82("h4", { className: "ss-w-lb-empty-title", children: title }),
7258
- /* @__PURE__ */ jsx82("p", { className: "ss-w-lb-empty-body", children: body }),
7259
- onPlay && /* @__PURE__ */ jsx82("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
7416
+ /* @__PURE__ */ jsxs69("div", { className: "ss-w-lb-empty-hero", children: [
7417
+ /* @__PURE__ */ jsx83("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
7418
+ /* @__PURE__ */ jsx83("h4", { className: "ss-w-lb-empty-title", children: title }),
7419
+ /* @__PURE__ */ jsx83("p", { className: "ss-w-lb-empty-body", children: body }),
7420
+ onPlay && /* @__PURE__ */ jsx83("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
7260
7421
  ] }),
7261
- fresh && lastWeek && /* @__PURE__ */ jsxs68("div", { className: "ss-w-lb-last", children: [
7262
- /* @__PURE__ */ jsx82("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
7263
- /* @__PURE__ */ jsx82("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
7264
- /* @__PURE__ */ jsx82("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
7265
- /* @__PURE__ */ jsx82("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
7422
+ fresh && lastWeek && /* @__PURE__ */ jsxs69("div", { className: "ss-w-lb-last", children: [
7423
+ /* @__PURE__ */ jsx83("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
7424
+ /* @__PURE__ */ jsx83("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
7425
+ /* @__PURE__ */ jsx83("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
7426
+ /* @__PURE__ */ jsx83("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
7266
7427
  ] })
7267
7428
  ] });
7268
7429
  }
7269
7430
 
7270
7431
  // src/components/Leaderboard.tsx
7271
- import { Fragment as Fragment19, jsx as jsx83, jsxs as jsxs69 } from "react/jsx-runtime";
7432
+ import { Fragment as Fragment19, jsx as jsx84, jsxs as jsxs70 } from "react/jsx-runtime";
7272
7433
  function Leaderboard({
7273
7434
  data,
7274
7435
  ui,
7275
7436
  onPlay
7276
7437
  }) {
7277
- const [segment, setSegment] = useState36("weekly");
7438
+ const [segment, setSegment] = useState37("weekly");
7278
7439
  const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
7279
7440
  const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
7280
7441
  const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
7281
- return /* @__PURE__ */ jsxs69("div", { className: "ss-w-lb2", children: [
7282
- /* @__PURE__ */ jsxs69("div", { className: "ss-w-seg", children: [
7283
- /* @__PURE__ */ jsx83(
7442
+ return /* @__PURE__ */ jsxs70("div", { className: "ss-w-lb2", children: [
7443
+ /* @__PURE__ */ jsxs70("div", { className: "ss-w-seg", children: [
7444
+ /* @__PURE__ */ jsx84(
7284
7445
  "button",
7285
7446
  {
7286
7447
  type: "button",
@@ -7290,7 +7451,7 @@ function Leaderboard({
7290
7451
  children: ui.leaderboardThisWeek
7291
7452
  }
7292
7453
  ),
7293
- /* @__PURE__ */ jsx83(
7454
+ /* @__PURE__ */ jsx84(
7294
7455
  "button",
7295
7456
  {
7296
7457
  type: "button",
@@ -7301,7 +7462,7 @@ function Leaderboard({
7301
7462
  }
7302
7463
  )
7303
7464
  ] }),
7304
- isEmpty ? /* @__PURE__ */ jsx83(
7465
+ isEmpty ? /* @__PURE__ */ jsx84(
7305
7466
  LeaderboardEmpty,
7306
7467
  {
7307
7468
  segment,
@@ -7310,15 +7471,15 @@ function Leaderboard({
7310
7471
  onPlay,
7311
7472
  ui
7312
7473
  }
7313
- ) : /* @__PURE__ */ jsxs69(Fragment19, { children: [
7314
- /* @__PURE__ */ jsx83("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ jsx83(
7474
+ ) : /* @__PURE__ */ jsxs70(Fragment19, { children: [
7475
+ /* @__PURE__ */ jsx84("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ jsx84(
7315
7476
  LeaderboardWeeklyRow,
7316
7477
  {
7317
7478
  row,
7318
7479
  isMe: row.operatorUserId === data.myWeeklyRow?.operatorUserId
7319
7480
  },
7320
7481
  row.operatorUserId
7321
- )) : data.allTimeTop.map((row) => /* @__PURE__ */ jsx83(
7482
+ )) : data.allTimeTop.map((row) => /* @__PURE__ */ jsx84(
7322
7483
  LeaderboardAllTimeRow,
7323
7484
  {
7324
7485
  row,
@@ -7326,18 +7487,18 @@ function Leaderboard({
7326
7487
  },
7327
7488
  row.operatorUserId
7328
7489
  )) }),
7329
- /* @__PURE__ */ jsx83("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
7330
- myRow != null && (offBoard ? /* @__PURE__ */ jsx83("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ jsxs69("div", { className: "ss-w-lb2-rows", children: [
7331
- segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ jsx83(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
7332
- segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ jsx83(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
7490
+ /* @__PURE__ */ jsx84("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
7491
+ myRow != null && (offBoard ? /* @__PURE__ */ jsx84("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ jsxs70("div", { className: "ss-w-lb2-rows", children: [
7492
+ segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ jsx84(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
7493
+ segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ jsx84(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
7333
7494
  ] })),
7334
- segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ jsx83("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ jsx83("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ jsx83("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
7495
+ segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ jsx84("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ jsx84("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ jsx84("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
7335
7496
  ] })
7336
7497
  ] });
7337
7498
  }
7338
7499
 
7339
7500
  // src/components/LeaderboardPanel.tsx
7340
- import { jsx as jsx84 } from "react/jsx-runtime";
7501
+ import { jsx as jsx85 } from "react/jsx-runtime";
7341
7502
  var EMPTY_PAYLOAD = {
7342
7503
  week: "",
7343
7504
  weeklyTop: [],
@@ -7348,17 +7509,17 @@ var EMPTY_PAYLOAD = {
7348
7509
  lastWeek: null
7349
7510
  };
7350
7511
  function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
7351
- if (!loggedIn) return /* @__PURE__ */ jsx84(GamesLoginWall, { ui });
7352
- if (data === null && loading) return /* @__PURE__ */ jsx84("div", { className: "ss-w-mon-list" });
7353
- return /* @__PURE__ */ jsx84("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx84(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
7512
+ if (!loggedIn) return /* @__PURE__ */ jsx85(GamesLoginWall, { ui });
7513
+ if (data === null && loading) return /* @__PURE__ */ jsx85("div", { className: "ss-w-mon-list" });
7514
+ return /* @__PURE__ */ jsx85("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx85(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
7354
7515
  }
7355
7516
 
7356
7517
  // src/components/ChatPanel.tsx
7357
- import { jsx as jsx85, jsxs as jsxs70 } from "react/jsx-runtime";
7518
+ import { jsx as jsx86, jsxs as jsxs71 } from "react/jsx-runtime";
7358
7519
  var FULLSCREEN_QUERY = "(max-width: 639px)";
7359
7520
  function useIsModal() {
7360
- const [modal, setModal] = useState37(false);
7361
- useEffect17(() => {
7521
+ const [modal, setModal] = useState38(false);
7522
+ useEffect18(() => {
7362
7523
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
7363
7524
  const mql = window.matchMedia(FULLSCREEN_QUERY);
7364
7525
  const sync = () => setModal(mql.matches);
@@ -7371,7 +7532,7 @@ function useIsModal() {
7371
7532
  function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, loggedIn, conversation }) {
7372
7533
  const { state, close, stop, send, reset } = controller;
7373
7534
  const isModal = useIsModal();
7374
- useEffect17(() => {
7535
+ useEffect18(() => {
7375
7536
  const onKey = (e) => {
7376
7537
  if (e.key === "Escape") close();
7377
7538
  };
@@ -7382,11 +7543,15 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
7382
7543
  monitor?.setActiveTab("chat");
7383
7544
  send(text);
7384
7545
  };
7385
- useEffect17(() => {
7546
+ const handleAsk = (text, grounding) => {
7547
+ monitor?.setActiveTab("chat");
7548
+ send(text, { grounding });
7549
+ };
7550
+ useEffect18(() => {
7386
7551
  if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
7387
7552
  }, [monitor, state.isStreaming, state.messages.length]);
7388
- return /* @__PURE__ */ jsxs70("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
7389
- /* @__PURE__ */ jsx85(
7553
+ return /* @__PURE__ */ jsxs71("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
7554
+ /* @__PURE__ */ jsx86(
7390
7555
  ChatHeader,
7391
7556
  {
7392
7557
  onClose: close,
@@ -7399,7 +7564,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
7399
7564
  moreOptionsLabel: ui.moreOptions
7400
7565
  }
7401
7566
  ),
7402
- monitor && /* @__PURE__ */ jsx85(
7567
+ monitor && /* @__PURE__ */ jsx86(
7403
7568
  TabBar,
7404
7569
  {
7405
7570
  monitor,
@@ -7411,17 +7576,17 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
7411
7576
  gamesEnabled: gamesResult?.enabled ?? false
7412
7577
  }
7413
7578
  ),
7414
- /* @__PURE__ */ jsx85(
7579
+ /* @__PURE__ */ jsx86(
7415
7580
  "div",
7416
7581
  {
7417
7582
  style: !monitor || monitor.activeTab === "chat" ? { display: "contents" } : { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" },
7418
- children: /* @__PURE__ */ jsx85(MessageList, { controller, ui, slip, onDashboardTap, monitor })
7583
+ children: /* @__PURE__ */ jsx86(MessageList, { controller, ui, slip, onDashboardTap, monitor })
7419
7584
  }
7420
7585
  ),
7421
- monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx85(TodayPanel, { discovery, ui, monitor }),
7422
- monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx85(MatchesPanel, { monitor, ui, slip }),
7423
- monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx85(OddsPanel, { monitor, ui, slip }),
7424
- monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx85(
7586
+ monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx86(TodayPanel, { discovery, ui, monitor }),
7587
+ monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx86(MatchesPanel, { monitor, ui, slip, onAsk: handleAsk }),
7588
+ monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx86(OddsPanel, { monitor, ui, slip }),
7589
+ monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx86(
7425
7590
  GamesPanel,
7426
7591
  {
7427
7592
  loggedIn: !!loggedIn,
@@ -7435,7 +7600,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
7435
7600
  }
7436
7601
  }
7437
7602
  ),
7438
- monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */ jsx85(
7603
+ monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */ jsx86(
7439
7604
  LeaderboardPanel,
7440
7605
  {
7441
7606
  loggedIn: !!loggedIn,
@@ -7445,7 +7610,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
7445
7610
  ui
7446
7611
  }
7447
7612
  ),
7448
- (!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */ jsx85(ChatInput, { placeholder: ui.placeholder, streaming: state.isStreaming, onSend: handleSend, onStop: stop, stopLabel: ui.stopResponse, sendLabel: ui.sendMessage })
7613
+ (!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */ jsx86(ChatInput, { placeholder: ui.placeholder, streaming: state.isStreaming, onSend: handleSend, onStop: stop, stopLabel: ui.stopResponse, sendLabel: ui.sendMessage })
7449
7614
  ] });
7450
7615
  }
7451
7616
 
@@ -7993,6 +8158,59 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
7993
8158
  .ss-w-dash--discovery .ss-w-dash-tile:nth-child(2) { background: color-mix(in srgb, #3a82f6 10%, var(--ss-w-panel)); }
7994
8159
  .ss-w-dash--discovery .ss-w-dash-tile:nth-child(3) { background: color-mix(in srgb, #f5a623 10%, var(--ss-w-panel)); }
7995
8160
  .ss-w-dash--discovery .ss-w-dash-tile:nth-child(4) { background: color-mix(in srgb, #a855f7 10%, var(--ss-w-panel)); }
8161
+ /* A hero tile would take the first tint position; count only regular tiles where \`of S\` parses. */
8162
+ .ss-w-dash--discovery .ss-w-dash-tile:nth-child(1 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #34c759 10%, var(--ss-w-panel)); }
8163
+ .ss-w-dash--discovery .ss-w-dash-tile:nth-child(2 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #3a82f6 10%, var(--ss-w-panel)); }
8164
+ .ss-w-dash--discovery .ss-w-dash-tile:nth-child(3 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #f5a623 10%, var(--ss-w-panel)); }
8165
+ .ss-w-dash--discovery .ss-w-dash-tile:nth-child(4 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #a855f7 10%, var(--ss-w-panel)); }
8166
+
8167
+ /* Hero: the personalized lead tile. Declared after the layout rules and at three-class
8168
+ specificity so it keeps one look in every layout -- no market rail, no goal pill, no
8169
+ discovery tint or stacking. Colours derive from accent/panel/ink so an operator surface
8170
+ and dark mode both work without their own rules. */
8171
+ .ss-w-dash .ss-w-dash-grid .ss-w-dash-hero {
8172
+ display: flex; flex-direction: column; align-items: stretch; gap: 10px;
8173
+ padding: 12px 14px 14px; border-radius: 16px;
8174
+ border: 1px solid color-mix(in srgb, var(--ss-w-accent) 38%, var(--ss-w-line));
8175
+ background:
8176
+ radial-gradient(120% 140% at 0% 0%, color-mix(in srgb, var(--ss-w-accent) 18%, transparent) 0%, transparent 60%),
8177
+ var(--ss-w-panel);
8178
+ box-shadow: 0 10px 24px -18px color-mix(in srgb, var(--ss-w-accent) 80%, transparent);
8179
+ }
8180
+ .ss-w-dash .ss-w-dash-grid .ss-w-dash-hero:hover { border-color: var(--ss-w-accent); }
8181
+ .ss-w-dash .ss-w-dash-grid .ss-w-dash-hero:focus-visible { outline: 2px solid var(--ss-w-accent); outline-offset: 2px; }
8182
+ .ss-w-dash-hero-top { display: flex; align-items: center; gap: 8px; min-height: 20px; }
8183
+ .ss-w-dash-hero-badge {
8184
+ font-size: 10.5px; font-weight: 750; letter-spacing: .06em; text-transform: uppercase;
8185
+ color: var(--ss-w-panel); background: color-mix(in srgb, var(--ss-w-accent) 45%, var(--ss-w-ink)); border-radius: 999px; padding: 3px 10px;
8186
+ white-space: nowrap;
8187
+ }
8188
+ .ss-w-dash-hero-chevron { flex: none; width: 14px; height: 14px; color: var(--ss-w-faint); }
8189
+ .ss-w-dash-hero-badge { margin-right: auto; }
8190
+ .ss-w-dash-hero-chevron:only-child { margin-left: auto; }
8191
+ .ss-w-dash-hero-main { display: flex; align-items: center; gap: 12px; min-width: 0; }
8192
+ .ss-w-dash-hero-visual { flex: none; display: flex; align-items: center; }
8193
+ .ss-w-dash-hero-crest {
8194
+ width: 40px; height: 40px; border-radius: 50%;
8195
+ background-color: color-mix(in srgb, var(--ss-w-ink) 4%, var(--ss-w-panel));
8196
+ background-size: 72%; background-position: center; background-repeat: no-repeat;
8197
+ box-shadow: 0 0 0 2px var(--ss-w-panel), 0 0 0 3px color-mix(in srgb, var(--ss-w-ink) 10%, var(--ss-w-panel));
8198
+ }
8199
+ .ss-w-dash-hero-crest + .ss-w-dash-hero-crest { margin-left: -8px; }
8200
+ .ss-w-dash-hero-icon {
8201
+ display: grid; place-items: center; width: 40px; height: 40px; border-radius: 50%; font-size: 22px;
8202
+ background: color-mix(in srgb, var(--ss-w-accent) 14%, var(--ss-w-panel));
8203
+ }
8204
+ .ss-w-dash-hero-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
8205
+ .ss-w-dash-hero-title { font-size: 15.5px; font-weight: 700; line-height: 1.25; color: var(--ss-w-ink); overflow-wrap: anywhere; }
8206
+ .ss-w-dash-hero-subtitle { font-size: 12px; color: var(--ss-w-faint); overflow-wrap: anywhere; }
8207
+ .ss-w-dash-hero-price {
8208
+ flex: none; margin-left: auto;
8209
+ font-family: ui-monospace, monospace; font-variant-numeric: tabular-nums; font-size: 15px; font-weight: 750; line-height: 1;
8210
+ color: color-mix(in srgb, var(--ss-w-accent) 45%, var(--ss-w-ink)); padding: 5px 9px; border-radius: 8px;
8211
+ background: color-mix(in srgb, var(--ss-w-accent) 12%, var(--ss-w-panel));
8212
+ border: 1px solid color-mix(in srgb, var(--ss-w-accent) 30%, var(--ss-w-panel));
8213
+ }
7996
8214
 
7997
8215
  /* club fan pre-match dashboard */
7998
8216
  .ss-w-fandash { display: flex; flex-direction: column; gap: 10px; padding: 4px 0; }
@@ -8333,6 +8551,21 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
8333
8551
  .ss-w-mon-scorers-home { text-align: right; }
8334
8552
  .ss-w-mon-scorers-away { text-align: left; }
8335
8553
  .ss-w-mon-scorers-ball { flex: none; align-self: start; line-height: 1.35; }
8554
+ .ss-w-fact { display: flex; flex-direction: column; gap: 7px; padding: 10px 12px; border-radius: 10px; background: color-mix(in srgb, var(--ss-w-accent) 9%, transparent); border: 1px solid color-mix(in srgb, var(--ss-w-accent) 22%, transparent); }
8555
+ .ss-w-fact-k { display: flex; align-items: center; gap: 6px; font-size: 10.5px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase; color: var(--ss-w-accent); }
8556
+ .ss-w-fact-min { color: var(--ss-w-ink); letter-spacing: 0; }
8557
+ .ss-w-fact-subj { margin-left: auto; text-transform: none; letter-spacing: 0; font-weight: 650; color: var(--ss-w-faint); }
8558
+ .ss-w-fact-text { margin: 0; font-size: 13.5px; line-height: 1.45; color: var(--ss-w-ink); }
8559
+ .ss-w-fact-basis { font-size: 10.5px; color: var(--ss-w-faint); }
8560
+ .ss-w-fact-mkt { display: flex; align-items: center; gap: 8px; font-size: 11.5px; border: 1px solid var(--ss-w-line); border-radius: 8px; padding: 6px 8px; }
8561
+ .ss-w-fact-foot { display: flex; align-items: center; gap: 14px; }
8562
+ .ss-w-fact-link { font: inherit; font-size: 11.5px; font-weight: 700; color: var(--ss-w-accent); background: none; border: none; padding: 4px 0; min-height: 32px; cursor: pointer; }
8563
+ .ss-w-fact-link--muted { color: var(--ss-w-faint); margin-left: auto; }
8564
+ .ss-w-fact-hist { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--ss-w-line); }
8565
+ .ss-w-fact-hist li { display: grid; grid-template-columns: 34px 1fr; gap: 8px; padding: 9px 0; border-bottom: 1px solid var(--ss-w-line); }
8566
+ .ss-w-fact-hist li:last-child { border-bottom: none; }
8567
+ .ss-w-fact-hmin { font-size: 11px; font-weight: 800; color: var(--ss-w-faint); font-variant-numeric: tabular-nums; }
8568
+ .ss-w-fact-htext { margin: 0; font-size: 12.5px; line-height: 1.4; color: var(--ss-w-ink); }
8336
8569
  .ss-w-mon-stats { display: flex; flex-direction: column; gap: 10px; }
8337
8570
  .ss-w-mon-stat { display: flex; flex-direction: column; gap: 5px; }
8338
8571
  .ss-w-mon-pstrip { padding: 6px 8px; border-radius: 8px; background: color-mix(in srgb, var(--ss-w-accent) 8%, transparent); }
@@ -8866,7 +9099,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
8866
9099
  `;
8867
9100
 
8868
9101
  // src/StatsWidget.tsx
8869
- import { jsx as jsx86 } from "react/jsx-runtime";
9102
+ import { jsx as jsx87 } from "react/jsx-runtime";
8870
9103
  function buildClient(props) {
8871
9104
  try {
8872
9105
  if ("client" in props && props.client) {
@@ -8900,14 +9133,14 @@ function StatsWidget(props) {
8900
9133
  [built?.client]
8901
9134
  );
8902
9135
  const ui = useMemo3(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
8903
- const rootRef = useRef14(null);
8904
- const introDoneRef = useRef14(false);
8905
- const markIntroDone = useCallback9(() => {
9136
+ const rootRef = useRef15(null);
9137
+ const introDoneRef = useRef15(false);
9138
+ const markIntroDone = useCallback10(() => {
8906
9139
  introDoneRef.current = true;
8907
9140
  }, []);
8908
9141
  const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
8909
9142
  const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
8910
- const [hasToday, setHasToday] = useState38(false);
9143
+ const [hasToday, setHasToday] = useState39(false);
8911
9144
  const monitor = useLiveMonitor({
8912
9145
  getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
8913
9146
  getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
@@ -8915,11 +9148,11 @@ function StatsWidget(props) {
8915
9148
  isOpen: controller.state.isOpen,
8916
9149
  hasToday
8917
9150
  });
8918
- const getSchedule = useCallback9(
9151
+ const getSchedule = useCallback10(
8919
9152
  (localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes) : Promise.resolve(null),
8920
9153
  [built]
8921
9154
  );
8922
- const getStates = useCallback9(
9155
+ const getStates = useCallback10(
8923
9156
  (matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
8924
9157
  [built]
8925
9158
  );
@@ -8935,14 +9168,14 @@ function StatsWidget(props) {
8935
9168
  pinnedMatchIds
8936
9169
  });
8937
9170
  const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
8938
- useEffect18(() => {
9171
+ useEffect19(() => {
8939
9172
  setHasToday(todayHasContent);
8940
9173
  }, [todayHasContent]);
8941
9174
  const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
8942
9175
  const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
8943
9176
  const markTodayActivity = monitor.markTodayActivity;
8944
- const prevLiveCountRef = useRef14(0);
8945
- useEffect18(() => {
9177
+ const prevLiveCountRef = useRef15(0);
9178
+ useEffect19(() => {
8946
9179
  const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
8947
9180
  prevLiveCountRef.current = discovery.liveCount;
8948
9181
  if (rose) markTodayActivity();
@@ -8959,29 +9192,24 @@ function StatsWidget(props) {
8959
9192
  if (wasAdded(result)) monitor.markInSlip(sel.matchOddsId);
8960
9193
  return result;
8961
9194
  }),
8962
- conversationId: controller.state.conversationId ?? void 0,
8963
- onMarketClicked: (marketName) => {
8964
- try {
8965
- void built?.conversation.sendSignal({ signalType: "InsightMarketClicked", entityType: "Market", entityName: marketName }).catch(() => void 0);
8966
- } catch {
8967
- }
8968
- }
9195
+ conversationId: controller.state.conversationId ?? void 0
8969
9196
  };
8970
9197
  },
8971
- [props.config?.onAddToSlip, controller.state.conversationId, built, monitor.markInSlip]
9198
+ [props.config?.onAddToSlip, controller.state.conversationId, monitor.markInSlip]
8972
9199
  );
8973
9200
  const onDashboardTap = useMemo3(
8974
9201
  () => built ? createDashboardTapSignal((input) => built.conversation.sendSignal(input), logger) : void 0,
8975
9202
  [built, logger]
8976
9203
  );
9204
+ const dismissPopup = usePopupTelemetry(logger, controller.state.isOpen, controller.state.popupText, controller.dismissPopup);
8977
9205
  const operatorUserId = cfg?.userContext?.operatorUserId;
8978
9206
  const anonymousUserId = cfg?.userContext?.anonymousUserId;
8979
9207
  const conversationId = controller.state.conversationId ?? void 0;
8980
- useEffect18(() => {
9208
+ useEffect19(() => {
8981
9209
  if (!logger) return;
8982
9210
  logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
8983
9211
  }, [logger, operatorUserId, anonymousUserId, conversationId]);
8984
- useEffect18(() => {
9212
+ useEffect19(() => {
8985
9213
  if (!logger) return;
8986
9214
  const onHide = () => {
8987
9215
  logger.flushOnHide();
@@ -8998,14 +9226,14 @@ function StatsWidget(props) {
8998
9226
  logger.dispose();
8999
9227
  };
9000
9228
  }, [logger]);
9001
- useEffect18(() => {
9229
+ useEffect19(() => {
9002
9230
  if (!built || !ui.injectStyles) return;
9003
9231
  const node = rootRef.current?.getRootNode();
9004
9232
  if (node) injectStyles(node);
9005
9233
  }, [built, ui.injectStyles]);
9006
9234
  if (!built) return null;
9007
9235
  const attrs = themeAttrs(ui);
9008
- return /* @__PURE__ */ jsx86(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx86("div", { ref: rootRef, className: "ss-w-root", "data-ss-w-theme": attrs["data-ss-w-theme"], "data-ss-w-pos": attrs["data-ss-w-pos"], style: attrs.style, children: controller.state.isOpen ? /* @__PURE__ */ jsx86(
9236
+ return /* @__PURE__ */ jsx87(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx87("div", { ref: rootRef, className: "ss-w-root", "data-ss-w-theme": attrs["data-ss-w-theme"], "data-ss-w-pos": attrs["data-ss-w-pos"], style: attrs.style, children: controller.state.isOpen ? /* @__PURE__ */ jsx87(
9009
9237
  ChatPanel,
9010
9238
  {
9011
9239
  controller,
@@ -9019,7 +9247,7 @@ function StatsWidget(props) {
9019
9247
  loggedIn: !!operatorUserId,
9020
9248
  conversation: built?.conversation ?? null
9021
9249
  }
9022
- ) : /* @__PURE__ */ jsx86(
9250
+ ) : /* @__PURE__ */ jsx87(
9023
9251
  ChatFab,
9024
9252
  {
9025
9253
  label: ui.launcherLabel,
@@ -9027,7 +9255,7 @@ function StatsWidget(props) {
9027
9255
  popupText: controller.state.popupText,
9028
9256
  logoUrl: ui.logoUrl,
9029
9257
  onOpen: controller.open,
9030
- onDismissPopup: controller.dismissPopup,
9258
+ onDismissPopup: dismissPopup,
9031
9259
  dismissLabel: ui.dismissGreeting,
9032
9260
  introAllowed: !introDoneRef.current,
9033
9261
  onIntroStart: markIntroDone