@sensiblestats/widget-react 0.61.2 → 0.62.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.cjs CHANGED
@@ -36,7 +36,7 @@ __export(index_exports, {
36
36
  module.exports = __toCommonJS(index_exports);
37
37
 
38
38
  // src/StatsWidget.tsx
39
- var import_react44 = require("react");
39
+ var import_react45 = require("react");
40
40
  var import_widget_sdk5 = require("@sensiblestats/widget-sdk");
41
41
 
42
42
  // src/kickoff.ts
@@ -651,6 +651,10 @@ var STRINGS = {
651
651
  function resolveLocaleStrings(locale) {
652
652
  return STRINGS[locale] ?? STRINGS.en;
653
653
  }
654
+ function isEnglishLocale(locale) {
655
+ const lang = (locale ?? "").trim().toLowerCase().split(/[-_]/)[0] ?? "";
656
+ return lang === "en" || !Object.prototype.hasOwnProperty.call(STRINGS, lang);
657
+ }
654
658
 
655
659
  // src/config.ts
656
660
  function normalizeUi(cfg) {
@@ -660,6 +664,7 @@ function normalizeUi(cfg) {
660
664
  accent: cfg.accent,
661
665
  logoUrl: cfg.logoUrl,
662
666
  headerTitle: cfg.headerTitle,
667
+ rawBettingLabels: isEnglishLocale(cfg.locale),
663
668
  cta: cfg.cta,
664
669
  surface: cfg.surface,
665
670
  ink: cfg.ink,
@@ -775,6 +780,18 @@ function toUserContext(cfg) {
775
780
 
776
781
  // src/slip.ts
777
782
  var ADD_TO_SLIP_TIMEOUT_MS = 1e4;
783
+ var MAX_SELECTION = 64;
784
+ var MAX_LINE = 32;
785
+ var MAX_ODDS = 1e4;
786
+ function slipPickFields(selection, label, line) {
787
+ const fields = {};
788
+ if (Number.isSafeInteger(selection.matchId) && selection.matchId > 0) fields.matchId = selection.matchId;
789
+ if (label && label.trim() && label.length <= MAX_SELECTION) fields.selection = label;
790
+ if (line && line.trim() && line.length <= MAX_LINE) fields.line = line;
791
+ const odds = selection.oddsDecimal;
792
+ if (Number.isFinite(odds) && odds > 1 && odds <= MAX_ODDS) fields.odds = odds;
793
+ return fields;
794
+ }
778
795
  function wasAdded(result) {
779
796
  if (!result) return true;
780
797
  if (result.status === "price_changed") return result.accepted;
@@ -1061,6 +1078,8 @@ function toMarketOddsVM(card) {
1061
1078
  return {
1062
1079
  key: `${selection}:${str(r.line) ?? ""}:${i}`,
1063
1080
  selection,
1081
+ selectionLabel: str(r.selectionLabel),
1082
+ line: str(r.line),
1064
1083
  odds: price !== void 0 ? price.toFixed(2) : "",
1065
1084
  oddsDecimal: price,
1066
1085
  matchOddsId: typeof r.matchOddsId === "number" ? r.matchOddsId : void 0,
@@ -1814,6 +1833,7 @@ function useLiveMonitor(opts) {
1814
1833
  const inFlightRef = (0, import_react4.useRef)(false);
1815
1834
  const timerRef = (0, import_react4.useRef)(void 0);
1816
1835
  const disabledRef = (0, import_react4.useRef)(false);
1836
+ const mountedRef = (0, import_react4.useRef)(false);
1817
1837
  const getLiveMonitorRef = (0, import_react4.useRef)(opts.getLiveMonitor);
1818
1838
  getLiveMonitorRef.current = opts.getLiveMonitor;
1819
1839
  const tick = (0, import_react4.useCallback)(async () => {
@@ -1821,6 +1841,7 @@ function useLiveMonitor(opts) {
1821
1841
  inFlightRef.current = true;
1822
1842
  try {
1823
1843
  const snap = await getLiveMonitorRef.current(pinsRef.current);
1844
+ if (!mountedRef.current) return;
1824
1845
  if (snap === null) {
1825
1846
  disabledRef.current = true;
1826
1847
  applySnapshot(null);
@@ -1842,10 +1863,16 @@ function useLiveMonitor(opts) {
1842
1863
  });
1843
1864
  scheduleRef.current = () => {
1844
1865
  window.clearTimeout(timerRef.current);
1845
- if (disabledRef.current || pinsRef.current.length === 0 || document.visibilityState === "hidden") return;
1866
+ if (!mountedRef.current || disabledRef.current || pinsRef.current.length === 0 || document.visibilityState === "hidden") return;
1846
1867
  const hinted = (snapshotRef.current?.nextPollSeconds ?? DEFAULT_POLL_MS / 1e3) * 1e3;
1847
1868
  timerRef.current = window.setTimeout(() => void tick(), Math.max(MIN_POLL_MS, hinted));
1848
1869
  };
1870
+ (0, import_react4.useEffect)(() => {
1871
+ mountedRef.current = true;
1872
+ return () => {
1873
+ mountedRef.current = false;
1874
+ };
1875
+ }, []);
1849
1876
  const prevPinsLengthRef = (0, import_react4.useRef)(0);
1850
1877
  (0, import_react4.useEffect)(() => {
1851
1878
  const wasEmpty = prevPinsLengthRef.current === 0;
@@ -2240,11 +2267,34 @@ function useEventLog() {
2240
2267
  return (0, import_react8.useContext)(EventLogContext);
2241
2268
  }
2242
2269
 
2270
+ // src/popupTelemetry.ts
2271
+ var import_react9 = require("react");
2272
+ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
2273
+ const shownRef = (0, import_react9.useRef)(/* @__PURE__ */ new Set());
2274
+ const closedTextRef = (0, import_react9.useRef)(null);
2275
+ (0, import_react9.useEffect)(() => {
2276
+ if (isOpen) {
2277
+ if (closedTextRef.current) log?.log({ name: "popup_opened" });
2278
+ closedTextRef.current = null;
2279
+ return;
2280
+ }
2281
+ closedTextRef.current = popupText;
2282
+ if (popupText && !shownRef.current.has(popupText)) {
2283
+ shownRef.current.add(popupText);
2284
+ log?.log({ name: "popup_shown" });
2285
+ }
2286
+ }, [log, isOpen, popupText]);
2287
+ return (0, import_react9.useCallback)(() => {
2288
+ log?.log({ name: "popup_dismissed" });
2289
+ dismissPopup();
2290
+ }, [log, dismissPopup]);
2291
+ }
2292
+
2243
2293
  // src/components/ChatFab.tsx
2244
- var import_react10 = require("react");
2294
+ var import_react11 = require("react");
2245
2295
 
2246
2296
  // src/components/BrandMark.tsx
2247
- var import_react9 = require("react");
2297
+ var import_react10 = require("react");
2248
2298
 
2249
2299
  // src/assets/logo.ts
2250
2300
  var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
@@ -2293,7 +2343,7 @@ function DashboardIcon({ name }) {
2293
2343
  // src/components/BrandMark.tsx
2294
2344
  var import_jsx_runtime2 = require("react/jsx-runtime");
2295
2345
  function BrandMark({ logoUrl, className }) {
2296
- const [failed, setFailed] = (0, import_react9.useState)(false);
2346
+ const [failed, setFailed] = (0, import_react10.useState)(false);
2297
2347
  if (!logoUrl || failed) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SsMark, { className });
2298
2348
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
2299
2349
  }
@@ -2318,9 +2368,9 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss" }) {
2318
2368
  var import_jsx_runtime4 = require("react/jsx-runtime");
2319
2369
  function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart }) {
2320
2370
  const bubble = popupText ?? greeting;
2321
- const [intro, setIntro] = (0, import_react10.useState)(false);
2322
- const armedRef = (0, import_react10.useRef)(introAllowed);
2323
- (0, import_react10.useEffect)(() => {
2371
+ const [intro, setIntro] = (0, import_react11.useState)(false);
2372
+ const armedRef = (0, import_react11.useRef)(introAllowed);
2373
+ (0, import_react11.useEffect)(() => {
2324
2374
  if (armedRef.current && bubble) {
2325
2375
  armedRef.current = false;
2326
2376
  setIntro(true);
@@ -2334,10 +2384,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
2334
2384
  }
2335
2385
 
2336
2386
  // src/components/ChatPanel.tsx
2337
- var import_react43 = require("react");
2387
+ var import_react44 = require("react");
2338
2388
 
2339
2389
  // src/components/ChatHeader.tsx
2340
- var import_react11 = require("react");
2390
+ var import_react12 = require("react");
2341
2391
  var import_jsx_runtime5 = require("react/jsx-runtime");
2342
2392
  function ChatHeader({
2343
2393
  onClose,
@@ -2349,15 +2399,15 @@ function ChatHeader({
2349
2399
  newConversationLabel = "New conversation",
2350
2400
  moreOptionsLabel = "More options"
2351
2401
  }) {
2352
- const [menuOpen, setMenuOpen] = (0, import_react11.useState)(false);
2353
- const wrapRef = (0, import_react11.useRef)(null);
2354
- const kebabRef = (0, import_react11.useRef)(null);
2355
- const firstItemRef = (0, import_react11.useRef)(null);
2402
+ const [menuOpen, setMenuOpen] = (0, import_react12.useState)(false);
2403
+ const wrapRef = (0, import_react12.useRef)(null);
2404
+ const kebabRef = (0, import_react12.useRef)(null);
2405
+ const firstItemRef = (0, import_react12.useRef)(null);
2356
2406
  const hasMenu = !!(canReset && onNewConversation);
2357
- (0, import_react11.useEffect)(() => {
2407
+ (0, import_react12.useEffect)(() => {
2358
2408
  if (menuOpen) firstItemRef.current?.focus();
2359
2409
  }, [menuOpen]);
2360
- (0, import_react11.useEffect)(() => {
2410
+ (0, import_react12.useEffect)(() => {
2361
2411
  if (!menuOpen) return;
2362
2412
  const onPointer = (e) => {
2363
2413
  if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
@@ -2413,7 +2463,7 @@ function ChatHeader({
2413
2463
  }
2414
2464
 
2415
2465
  // src/components/MessageList.tsx
2416
- var import_react26 = require("react");
2466
+ var import_react27 = require("react");
2417
2467
 
2418
2468
  // src/components/Markdown.tsx
2419
2469
  var import_react_markdown = __toESM(require("react-markdown"), 1);
@@ -2431,7 +2481,7 @@ function Markdown({ text }) {
2431
2481
  }
2432
2482
 
2433
2483
  // src/components/EntityCardList.tsx
2434
- var import_react12 = require("react");
2484
+ var import_react13 = require("react");
2435
2485
  var import_jsx_runtime7 = require("react/jsx-runtime");
2436
2486
  var MAX_VISIBLE = 3;
2437
2487
  var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
@@ -2515,7 +2565,7 @@ function ScopeTabs({ scopes, active, onSelect }) {
2515
2565
  )) });
2516
2566
  }
2517
2567
  function EntityCardItem({ c }) {
2518
- const [active, setActive] = (0, import_react12.useState)(0);
2568
+ const [active, setActive] = (0, import_react13.useState)(0);
2519
2569
  const hasBody = c.scopes.length > 0;
2520
2570
  if (!hasBody) {
2521
2571
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { c, showScopeCrest: false }) });
@@ -2529,7 +2579,7 @@ function EntityCardItem({ c }) {
2529
2579
  ] });
2530
2580
  }
2531
2581
  function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
2532
- const [expanded, setExpanded] = (0, import_react12.useState)(false);
2582
+ const [expanded, setExpanded] = (0, import_react13.useState)(false);
2533
2583
  if (cards.length === 0) return null;
2534
2584
  const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
2535
2585
  const overflow = cards.length - MAX_VISIBLE;
@@ -2540,18 +2590,18 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
2540
2590
  }
2541
2591
 
2542
2592
  // src/components/BettingInsightList.tsx
2543
- var import_react17 = require("react");
2593
+ var import_react18 = require("react");
2544
2594
 
2545
2595
  // src/components/AddToSlipButton.tsx
2546
- var import_react14 = require("react");
2596
+ var import_react15 = require("react");
2547
2597
  var import_widget_sdk4 = require("@sensiblestats/widget-sdk");
2548
2598
 
2549
2599
  // src/components/Toast.tsx
2550
- var import_react13 = require("react");
2600
+ var import_react14 = require("react");
2551
2601
  var import_jsx_runtime8 = require("react/jsx-runtime");
2552
2602
  var DISMISS_MS = 4e3;
2553
2603
  function Toast({ toast, onDismiss }) {
2554
- (0, import_react13.useEffect)(() => {
2604
+ (0, import_react14.useEffect)(() => {
2555
2605
  if (!toast) return;
2556
2606
  const timer = setTimeout(onDismiss, DISMISS_MS);
2557
2607
  return () => clearTimeout(timer);
@@ -2568,18 +2618,19 @@ function withTimeout(value) {
2568
2618
  new Promise((_, reject) => setTimeout(() => reject(new Error("add-to-slip timed out")), ADD_TO_SLIP_TIMEOUT_MS))
2569
2619
  ]);
2570
2620
  }
2571
- function SlipButton({ selection, shownOdds, marketName, marketDeveloperName, slip, ui }) {
2572
- const [pending, setPending] = (0, import_react14.useState)(false);
2573
- const [settled, setSettled] = (0, import_react14.useState)(false);
2574
- const [toast, setToast] = (0, import_react14.useState)(null);
2575
- const dismiss = (0, import_react14.useCallback)(() => setToast(null), []);
2621
+ function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui }) {
2622
+ const [pending, setPending] = (0, import_react15.useState)(false);
2623
+ const [settled, setSettled] = (0, import_react15.useState)(false);
2624
+ const [toast, setToast] = (0, import_react15.useState)(null);
2625
+ const dismiss = (0, import_react15.useCallback)(() => setToast(null), []);
2576
2626
  const log = useEventLog();
2577
2627
  const handler = slip.onAddToSlip;
2578
2628
  if (!ui || !handler || !selection) return null;
2579
2629
  const onClick = async () => {
2580
2630
  setPending(true);
2631
+ const pick = slipPickFields(selection, ui.rawBettingLabels ? selectionLabel : void 0, line);
2581
2632
  if (marketDeveloperName !== void 0) {
2582
- log?.log({ name: "slip_click", entityType: "market", marketDeveloperName, entityId: marketDeveloperName });
2633
+ log?.log({ name: "slip_click", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, ...pick });
2583
2634
  }
2584
2635
  try {
2585
2636
  const raw = await withTimeout(Promise.resolve(handler(selection)));
@@ -2591,20 +2642,15 @@ function SlipButton({ selection, shownOdds, marketName, marketDeveloperName, sli
2591
2642
  entityType: "market",
2592
2643
  marketDeveloperName,
2593
2644
  entityId: marketDeveloperName,
2594
- outcome: slipOutcome(result)
2645
+ outcome: slipOutcome(result),
2646
+ ...pick
2595
2647
  });
2596
2648
  }
2597
2649
  setToast(resultToToast(result, shownOdds || selection.oddsDecimal.toFixed(2), ui));
2598
2650
  setSettled(isTerminal(result));
2599
- if (wasAdded(result) && slip.onMarketClicked) {
2600
- try {
2601
- slip.onMarketClicked(marketName);
2602
- } catch {
2603
- }
2604
- }
2605
2651
  } catch {
2606
2652
  if (marketDeveloperName !== void 0) {
2607
- log?.log({ name: "slip_result", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, outcome: "timeout" });
2653
+ log?.log({ name: "slip_result", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, outcome: "timeout", ...pick });
2608
2654
  }
2609
2655
  setToast({ kind: "error", text: ui.slipFailed });
2610
2656
  } finally {
@@ -2632,8 +2678,9 @@ function AddToSlipButton({ it, slip, ui }) {
2632
2678
  {
2633
2679
  selection,
2634
2680
  shownOdds: it.odds ?? "",
2635
- marketName: it.market,
2636
2681
  marketDeveloperName: it.marketDeveloperName,
2682
+ selectionLabel: it.selectionLabel,
2683
+ line: it.line,
2637
2684
  slip,
2638
2685
  ui
2639
2686
  }
@@ -2662,14 +2709,14 @@ function OddsMovementBadge({
2662
2709
  }
2663
2710
 
2664
2711
  // src/components/Crest.tsx
2665
- var import_react15 = require("react");
2712
+ var import_react16 = require("react");
2666
2713
  var import_jsx_runtime11 = require("react/jsx-runtime");
2667
2714
  function initials2(name) {
2668
2715
  return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
2669
2716
  }
2670
2717
  function Crest2({ url, name, kind }) {
2671
2718
  const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
2672
- const [failed, setFailed] = (0, import_react15.useState)(false);
2719
+ const [failed, setFailed] = (0, import_react16.useState)(false);
2673
2720
  if (url && !failed) {
2674
2721
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
2675
2722
  }
@@ -2677,7 +2724,7 @@ function Crest2({ url, name, kind }) {
2677
2724
  }
2678
2725
 
2679
2726
  // src/components/PinToggle.tsx
2680
- var import_react16 = require("react");
2727
+ var import_react17 = require("react");
2681
2728
  var import_jsx_runtime12 = require("react/jsx-runtime");
2682
2729
  var PIN_GLYPHS = {
2683
2730
  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" },
@@ -2685,8 +2732,8 @@ var PIN_GLYPHS = {
2685
2732
  bookmark: { viewBox: "0 0 24 24", strokeWidth: 2, d: "M7 3h10a1.5 1.5 0 0 1 1.5 1.5V21l-6.5-3.6L5.5 21V4.5A1.5 1.5 0 0 1 7 3z" }
2686
2733
  };
2687
2734
  function PinToggle({ pin, monitor, ui }) {
2688
- const [toast, setToast] = (0, import_react16.useState)(null);
2689
- const dismiss = (0, import_react16.useCallback)(() => setToast(null), []);
2735
+ const [toast, setToast] = (0, import_react17.useState)(null);
2736
+ const dismiss = (0, import_react17.useCallback)(() => setToast(null), []);
2690
2737
  const log = useEventLog();
2691
2738
  if (!monitor || !monitor.enabled) return null;
2692
2739
  const key = pinKey(pin);
@@ -2746,7 +2793,7 @@ function StatRows({ stats }) {
2746
2793
  ] }, `${s.label}:${s.value}`)) });
2747
2794
  }
2748
2795
  function ScopedStats({ scopes }) {
2749
- const [active, setActive] = (0, import_react17.useState)(0);
2796
+ const [active, setActive] = (0, import_react18.useState)(0);
2750
2797
  const current = scopes[active] ?? scopes[0] ?? { key: "", label: "", stats: [] };
2751
2798
  return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ss-w-bi-scoped", children: [
2752
2799
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "ss-w-bi-scopes", role: "group", children: scopes.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("button", { type: "button", className: "ss-w-bi-chip", "aria-pressed": i === active, onClick: () => setActive(i), children: s.label }, s.key)) }),
@@ -2757,7 +2804,7 @@ function hasStatsContent(it) {
2757
2804
  return !!it.scopes && it.scopes.length >= 2 || it.stats.length > 0;
2758
2805
  }
2759
2806
  function ReasonStrip({ it, ui }) {
2760
- const [open, setOpen] = (0, import_react17.useState)(false);
2807
+ const [open, setOpen] = (0, import_react18.useState)(false);
2761
2808
  const log = useEventLog();
2762
2809
  const hasScopes = !!it.scopes && it.scopes.length >= 2;
2763
2810
  const hasStats = hasStatsContent(it);
@@ -2877,7 +2924,7 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
2877
2924
  }
2878
2925
 
2879
2926
  // src/components/MarketOddsCardList.tsx
2880
- var import_react18 = require("react");
2927
+ var import_react19 = require("react");
2881
2928
  var import_jsx_runtime14 = require("react/jsx-runtime");
2882
2929
  function OddsRow({ vm, row, ui, slip, inSlipIds }) {
2883
2930
  const selection = vm.addToSlipEnabled ? marketOddsRowToSlipSelection(vm, row, slip.conversationId) : null;
@@ -2890,11 +2937,11 @@ function OddsRow({ vm, row, ui, slip, inSlipIds }) {
2890
2937
  "\u2713 ",
2891
2938
  ui.inSlipLabel
2892
2939
  ] }) : null,
2893
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SlipButton, { selection, shownOdds: row.odds, marketName: vm.market, marketDeveloperName: vm.marketDeveloperName, slip, ui })
2940
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SlipButton, { selection, shownOdds: row.odds, marketDeveloperName: vm.marketDeveloperName, selectionLabel: row.selectionLabel, line: row.line, slip, ui })
2894
2941
  ] });
2895
2942
  }
2896
2943
  function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
2897
- const [open, setOpen] = (0, import_react18.useState)(false);
2944
+ const [open, setOpen] = (0, import_react19.useState)(false);
2898
2945
  const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
2899
2946
  const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
2900
2947
  const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
@@ -3062,7 +3109,37 @@ function ActionButtons({ actions, loading, disabled, onAct }) {
3062
3109
  // src/components/dashboard/DashboardTile.tsx
3063
3110
  var import_jsx_runtime17 = require("react/jsx-runtime");
3064
3111
  var MAX_CRESTS = 3;
3065
- function DashboardTile({ tile, onTap }) {
3112
+ var ODDS_TAIL = /\s*·\s*@(\d+(?:\.\d+)?)\s*$/;
3113
+ function splitOdds(subtitle) {
3114
+ const m = ODDS_TAIL.exec(subtitle);
3115
+ return m ? { text: subtitle.slice(0, m.index), odds: m[1] } : { text: subtitle };
3116
+ }
3117
+ function HeroTile({ tile, onTap, oddsLabel }) {
3118
+ const crests = (tile.imageUrls ?? []).filter(Boolean).slice(0, 2);
3119
+ const sub = tile.subtitle ? splitOdds(tile.subtitle) : null;
3120
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("button", { type: "button", className: "ss-w-dash-tile ss-w-dash-tile--full ss-w-dash-hero", onClick: onTap, children: [
3121
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-dash-hero-top", children: [
3122
+ tile.badgeText ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-badge", children: tile.badgeText }) : null,
3123
+ sub?.odds ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-dash-hero-price", children: [
3124
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-g-sr", children: [
3125
+ oddsLabel,
3126
+ " "
3127
+ ] }),
3128
+ sub.odds
3129
+ ] }) : null,
3130
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-chevron", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ChevronIcon, {}) })
3131
+ ] }),
3132
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-dash-hero-main", children: [
3133
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-visual", "aria-hidden": "true", children: crests.length > 0 ? crests.map((url, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-crest", style: { backgroundImage: `url(${url})` } }, `${url}-${i}`)) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-icon", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(DashboardIcon, { name: tile.icon }) }) }),
3134
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-dash-hero-body", children: [
3135
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-title", children: tile.title }),
3136
+ sub?.text ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-subtitle", children: sub.text }) : null
3137
+ ] })
3138
+ ] })
3139
+ ] });
3140
+ }
3141
+ function DashboardTile({ tile, onTap, oddsLabel = "Odds" }) {
3142
+ if (tile.emphasis === "hero") return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(HeroTile, { tile, onTap, oddsLabel });
3066
3143
  const spanClass = tile.span === "full" ? "ss-w-dash-tile--full" : "ss-w-dash-tile--half";
3067
3144
  const crests = (tile.imageUrls ?? []).slice(0, MAX_CRESTS);
3068
3145
  const hasMeta = Boolean(tile.badgeText) || crests.length > 0;
@@ -3095,13 +3172,13 @@ var LAYOUT_CLASSES = {
3095
3172
  function layoutClass(layout) {
3096
3173
  return Object.prototype.hasOwnProperty.call(LAYOUT_CLASSES, layout) ? LAYOUT_CLASSES[layout] : LAYOUT_CLASSES.goal;
3097
3174
  }
3098
- function GreetingDashboard({ dashboard, onTap }) {
3175
+ function GreetingDashboard({ dashboard, onTap, oddsLabel }) {
3099
3176
  return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: `ss-w-dash ${layoutClass(dashboard.layout)}`, children: [
3100
3177
  /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "ss-w-dash-head", children: [
3101
3178
  /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "ss-w-dash-title", children: dashboard.title }),
3102
3179
  dashboard.subtitle ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "ss-w-dash-subtitle", children: dashboard.subtitle }) : null
3103
3180
  ] }),
3104
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "ss-w-dash-grid", children: dashboard.tiles.map((t, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(DashboardTile, { tile: t, onTap: () => onTap(t, i) }, `${t.title}-${i}`)) }),
3181
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "ss-w-dash-grid", children: dashboard.tiles.map((t, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(DashboardTile, { tile: t, onTap: () => onTap(t, i), oddsLabel }, `${t.title}-${i}`)) }),
3105
3182
  dashboard.footerTip ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "ss-w-dash-foot", children: dashboard.footerTip }) : null
3106
3183
  ] });
3107
3184
  }
@@ -3197,7 +3274,7 @@ function FixtureCard({ card }) {
3197
3274
  }
3198
3275
 
3199
3276
  // src/components/dashboard/CountdownCard.tsx
3200
- var import_react19 = require("react");
3277
+ var import_react20 = require("react");
3201
3278
  var import_jsx_runtime20 = require("react/jsx-runtime");
3202
3279
  var DAY_MS = 864e5;
3203
3280
  function remainingSegments(kickoffUnix, nowMs, withSeconds) {
@@ -3216,12 +3293,12 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
3216
3293
  function CountdownCard({ card }) {
3217
3294
  const { data } = card;
3218
3295
  const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
3219
- const [nowMs, setNowMs] = (0, import_react19.useState)(() => Date.now());
3220
- const [reduced] = (0, import_react19.useState)(
3296
+ const [nowMs, setNowMs] = (0, import_react20.useState)(() => Date.now());
3297
+ const [reduced] = (0, import_react20.useState)(
3221
3298
  () => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
3222
3299
  );
3223
3300
  const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
3224
- (0, import_react19.useEffect)(() => {
3301
+ (0, import_react20.useEffect)(() => {
3225
3302
  if (reduced) return;
3226
3303
  const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
3227
3304
  return () => window.clearInterval(id);
@@ -3229,7 +3306,7 @@ function CountdownCard({ card }) {
3229
3306
  const segments = remainingSegments(data.kickoffUnix, nowMs, withinDay && !reduced);
3230
3307
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "ss-w-fandash-card ss-w-fandash-countdown", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "ss-w-fandash-countdown-top", children: [
3231
3308
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title ?? "Kick-off in" }),
3232
- segments ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_react19.Fragment, { children: [
3309
+ segments ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_react20.Fragment, { children: [
3233
3310
  i > 0 ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-colon", children: ":" }) : null,
3234
3311
  /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("span", { className: "ss-w-fandash-countdown-seg", children: [
3235
3312
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-value", children: s.value }),
@@ -3240,7 +3317,7 @@ function CountdownCard({ card }) {
3240
3317
  }
3241
3318
 
3242
3319
  // src/components/dashboard/InjuriesCard.tsx
3243
- var import_react20 = require("react");
3320
+ var import_react21 = require("react");
3244
3321
  var import_jsx_runtime21 = require("react/jsx-runtime");
3245
3322
  var SHOWN = 3;
3246
3323
  function ColHead({ name, crestUrl }) {
@@ -3263,7 +3340,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
3263
3340
  }
3264
3341
  function InjuriesCard({ card, ui }) {
3265
3342
  const { data } = card;
3266
- const [expanded, setExpanded] = (0, import_react20.useState)(false);
3343
+ const [expanded, setExpanded] = (0, import_react21.useState)(false);
3267
3344
  const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
3268
3345
  const limit = expanded ? void 0 : SHOWN;
3269
3346
  const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
@@ -3369,7 +3446,7 @@ function LinksCard({ card }) {
3369
3446
  }
3370
3447
 
3371
3448
  // src/components/dashboard/PostMatchResultCard.tsx
3372
- var import_react21 = require("react");
3449
+ var import_react22 = require("react");
3373
3450
  var import_jsx_runtime27 = require("react/jsx-runtime");
3374
3451
  function initials3(name) {
3375
3452
  return name.trim().slice(0, 3).toUpperCase();
@@ -3379,7 +3456,7 @@ function PostMatchCrest({
3379
3456
  name,
3380
3457
  side
3381
3458
  }) {
3382
- const [failed, setFailed] = (0, import_react21.useState)(false);
3459
+ const [failed, setFailed] = (0, import_react22.useState)(false);
3383
3460
  const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
3384
3461
  if (url && !failed) {
3385
3462
  return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -3578,10 +3655,10 @@ function RestingFormCard({ card }) {
3578
3655
  }
3579
3656
 
3580
3657
  // src/components/dashboard/LiveScoreCard.tsx
3581
- var import_react23 = require("react");
3658
+ var import_react24 = require("react");
3582
3659
 
3583
3660
  // src/useLiveClock.ts
3584
- var import_react22 = require("react");
3661
+ var import_react23 = require("react");
3585
3662
  var TICK_MS = 6e4;
3586
3663
  var MAX_LIVE_TICK_MINUTES = 15;
3587
3664
  function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
@@ -3590,10 +3667,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
3590
3667
  return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
3591
3668
  }
3592
3669
  function useLiveClock(minute, clockRunning, receivedAtMs) {
3593
- const [displayMinute, setDisplayMinute] = (0, import_react22.useState)(
3670
+ const [displayMinute, setDisplayMinute] = (0, import_react23.useState)(
3594
3671
  () => computeDisplayMinute(minute, clockRunning, receivedAtMs)
3595
3672
  );
3596
- (0, import_react22.useEffect)(() => {
3673
+ (0, import_react23.useEffect)(() => {
3597
3674
  setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
3598
3675
  if (!clockRunning) return;
3599
3676
  const id = window.setInterval(() => {
@@ -3610,7 +3687,7 @@ function initials5(name) {
3610
3687
  return name.trim().slice(0, 3).toUpperCase();
3611
3688
  }
3612
3689
  function LiveCrest({ url, name, side }) {
3613
- const [failed, setFailed] = (0, import_react23.useState)(false);
3690
+ const [failed, setFailed] = (0, import_react24.useState)(false);
3614
3691
  const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
3615
3692
  if (url && !failed) {
3616
3693
  return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -3629,7 +3706,7 @@ function LiveScoreCard({
3629
3706
  }) {
3630
3707
  const { data } = card;
3631
3708
  const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
3632
- const seedRef = (0, import_react23.useRef)(null);
3709
+ const seedRef = (0, import_react24.useRef)(null);
3633
3710
  if (!seedRef.current || seedRef.current.key !== seedKey) {
3634
3711
  seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
3635
3712
  }
@@ -3669,7 +3746,7 @@ function LiveScoreCard({
3669
3746
  }
3670
3747
 
3671
3748
  // src/components/dashboard/LiveTimelineCard.tsx
3672
- var import_react24 = require("react");
3749
+ var import_react25 = require("react");
3673
3750
  var import_jsx_runtime37 = require("react/jsx-runtime");
3674
3751
  var SHOWN2 = 3;
3675
3752
  function EventIcon({ type }) {
@@ -3711,7 +3788,7 @@ function EventRow({ e }) {
3711
3788
  ] });
3712
3789
  }
3713
3790
  function LiveTimelineCard({ card, ui }) {
3714
- const [expanded, setExpanded] = (0, import_react24.useState)(false);
3791
+ const [expanded, setExpanded] = (0, import_react25.useState)(false);
3715
3792
  const events = card.data.events;
3716
3793
  if (!events || events.length === 0) return null;
3717
3794
  const sorted = [...events].sort((a, b) => b.minute - a.minute);
@@ -3736,7 +3813,7 @@ function LiveTimelineCard({ card, ui }) {
3736
3813
  }
3737
3814
 
3738
3815
  // src/components/dashboard/MomentumWave.tsx
3739
- var import_react25 = require("react");
3816
+ var import_react26 = require("react");
3740
3817
  var import_jsx_runtime38 = require("react/jsx-runtime");
3741
3818
  var WIDTH = 270;
3742
3819
  var HEIGHT = 56;
@@ -3760,7 +3837,7 @@ function MomentumWave({
3760
3837
  }) {
3761
3838
  if (points.length === 0) return null;
3762
3839
  const { area, line, lastLeftPct, lastTopPx } = buildPaths(points);
3763
- const clipId = (0, import_react25.useId)();
3840
+ const clipId = (0, import_react26.useId)();
3764
3841
  const topClipId = `${clipId}-top`;
3765
3842
  const bottomClipId = `${clipId}-bottom`;
3766
3843
  const topClass = clubIsHome ? "ss-w-fandash-live-mom-home" : "ss-w-fandash-live-mom-away";
@@ -3918,7 +3995,7 @@ function ChatMessage({ message, disabled, onAct, onTap, ui, slip, monitor }) {
3918
3995
  };
3919
3996
  return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "ss-w-msg ss-w-bot", "data-msg-id": message.id, children: [
3920
3997
  message.text && !message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Markdown, { text: message.text }) : null,
3921
- message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(GreetingDashboard, { dashboard: message.greetingDashboard, onTap }) : null,
3998
+ message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(GreetingDashboard, { dashboard: message.greetingDashboard, onTap, oddsLabel: ui?.oddsLabel }) : null,
3922
3999
  message.clubFanDashboard ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(ClubFanDashboard, { dashboard: message.clubFanDashboard, onTap: onFanDashboardTap, ui }) : null,
3923
4000
  /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(EntityCardList, { cards: message.cards, disabled, showLessLabel: ui?.showLess, showMoreLabel: ui?.showMore }),
3924
4001
  /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(BettingInsightList, { insights: message.insights, ui, slip, monitor }),
@@ -3951,11 +4028,11 @@ function turnAnchor(messages) {
3951
4028
  }
3952
4029
  function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
3953
4030
  const { state, send } = controller;
3954
- const listRef = (0, import_react26.useRef)(null);
3955
- const endRef = (0, import_react26.useRef)(null);
3956
- const pinnedRef = (0, import_react26.useRef)(true);
3957
- const anchoredTurnRef = (0, import_react26.useRef)(null);
3958
- (0, import_react26.useEffect)(() => {
4031
+ const listRef = (0, import_react27.useRef)(null);
4032
+ const endRef = (0, import_react27.useRef)(null);
4033
+ const pinnedRef = (0, import_react27.useRef)(true);
4034
+ const anchoredTurnRef = (0, import_react27.useRef)(null);
4035
+ (0, import_react27.useEffect)(() => {
3959
4036
  const anchor = turnAnchor(state.messages);
3960
4037
  const list = listRef.current;
3961
4038
  if (anchor && anchor.turnId !== anchoredTurnRef.current) {
@@ -4011,10 +4088,10 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
4011
4088
  }
4012
4089
 
4013
4090
  // src/components/ChatInput.tsx
4014
- var import_react27 = require("react");
4091
+ var import_react28 = require("react");
4015
4092
  var import_jsx_runtime44 = require("react/jsx-runtime");
4016
4093
  function ChatInput({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message" }) {
4017
- const [value, setValue] = (0, import_react27.useState)("");
4094
+ const [value, setValue] = (0, import_react28.useState)("");
4018
4095
  const submit = () => {
4019
4096
  const t = value.trim();
4020
4097
  if (!t) return;
@@ -4244,8 +4321,8 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
4244
4321
  {
4245
4322
  selection,
4246
4323
  shownOdds: typeof row.market.price === "number" ? row.market.price.toFixed(2) : "",
4247
- marketName: row.market.marketLabel,
4248
4324
  marketDeveloperName: row.market.marketDeveloperName,
4325
+ selectionLabel: row.market.selectionLabel,
4249
4326
  slip,
4250
4327
  ui
4251
4328
  }
@@ -4437,7 +4514,7 @@ function TodayPanel({ discovery, ui, monitor }) {
4437
4514
  }
4438
4515
 
4439
4516
  // src/components/GamesPanel.tsx
4440
- var import_react41 = require("react");
4517
+ var import_react42 = require("react");
4441
4518
 
4442
4519
  // src/components/GamesLoginWall.tsx
4443
4520
  var import_jsx_runtime52 = require("react/jsx-runtime");
@@ -4446,7 +4523,7 @@ function GamesLoginWall({ ui }) {
4446
4523
  }
4447
4524
 
4448
4525
  // src/components/GamesHub.tsx
4449
- var import_react28 = require("react");
4526
+ var import_react29 = require("react");
4450
4527
 
4451
4528
  // src/components/games/ui/gameMeta.ts
4452
4529
  function prettifyGameId(gameId) {
@@ -4631,8 +4708,8 @@ function pickHeroGame(games) {
4631
4708
  }
4632
4709
  var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
4633
4710
  function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
4634
- const [, setTick] = (0, import_react28.useState)(0);
4635
- (0, import_react28.useEffect)(() => {
4711
+ const [, setTick] = (0, import_react29.useState)(0);
4712
+ (0, import_react29.useEffect)(() => {
4636
4713
  const id = setInterval(() => setTick((t) => t + 1), 6e4);
4637
4714
  return () => clearInterval(id);
4638
4715
  }, []);
@@ -4692,10 +4769,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
4692
4769
  }
4693
4770
 
4694
4771
  // src/components/GameScreenHost.tsx
4695
- var import_react40 = require("react");
4772
+ var import_react41 = require("react");
4696
4773
 
4697
4774
  // src/useGamePlay.ts
4698
- var import_react29 = require("react");
4775
+ var import_react30 = require("react");
4699
4776
  function toSubmitResult(payload) {
4700
4777
  return {
4701
4778
  // 'pending' means the play is recorded but awaiting resolution (fixture games)
@@ -4707,17 +4784,17 @@ function toSubmitResult(payload) {
4707
4784
  };
4708
4785
  }
4709
4786
  function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
4710
- const [result, setResult] = (0, import_react29.useState)(null);
4711
- const [submitting, setSubmitting] = (0, import_react29.useState)(false);
4712
- const [rawStatus, setRawStatus] = (0, import_react29.useState)(null);
4713
- const inFlightRef = (0, import_react29.useRef)(false);
4714
- const convRef = (0, import_react29.useRef)(conversation);
4787
+ const [result, setResult] = (0, import_react30.useState)(null);
4788
+ const [submitting, setSubmitting] = (0, import_react30.useState)(false);
4789
+ const [rawStatus, setRawStatus] = (0, import_react30.useState)(null);
4790
+ const inFlightRef = (0, import_react30.useRef)(false);
4791
+ const convRef = (0, import_react30.useRef)(conversation);
4715
4792
  convRef.current = conversation;
4716
- const optsRef = (0, import_react29.useRef)({ gameId, gameDay, fixtureId, locale, refresh });
4793
+ const optsRef = (0, import_react30.useRef)({ gameId, gameDay, fixtureId, locale, refresh });
4717
4794
  optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
4718
- const resultRef = (0, import_react29.useRef)(null);
4795
+ const resultRef = (0, import_react30.useRef)(null);
4719
4796
  resultRef.current = result;
4720
- const refetch = (0, import_react29.useCallback)(async () => {
4797
+ const refetch = (0, import_react30.useCallback)(async () => {
4721
4798
  const conv = convRef.current;
4722
4799
  if (!conv) return;
4723
4800
  const opts = optsRef.current;
@@ -4733,7 +4810,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
4733
4810
  } catch {
4734
4811
  }
4735
4812
  }, []);
4736
- const submit = (0, import_react29.useCallback)(async (answerJson) => {
4813
+ const submit = (0, import_react30.useCallback)(async (answerJson) => {
4737
4814
  const conv = convRef.current;
4738
4815
  if (!conv || inFlightRef.current) return;
4739
4816
  inFlightRef.current = true;
@@ -4760,14 +4837,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
4760
4837
  setSubmitting(false);
4761
4838
  }
4762
4839
  }, [refetch]);
4763
- const hydrate = (0, import_react29.useCallback)(() => {
4840
+ const hydrate = (0, import_react30.useCallback)(() => {
4764
4841
  void refetch();
4765
4842
  }, [refetch]);
4766
4843
  return { result, submitting, submit, hydrate, rawStatus };
4767
4844
  }
4768
4845
 
4769
4846
  // src/components/games/MysteryTigerGame.tsx
4770
- var import_react31 = require("react");
4847
+ var import_react32 = require("react");
4771
4848
 
4772
4849
  // src/components/games/nationFlags.ts
4773
4850
  var FLAGS = {
@@ -4978,7 +5055,7 @@ function isNationCode(flag) {
4978
5055
  }
4979
5056
 
4980
5057
  // src/components/games/PlayerAvatar.tsx
4981
- var import_react30 = require("react");
5058
+ var import_react31 = require("react");
4982
5059
  var import_jsx_runtime58 = require("react/jsx-runtime");
4983
5060
  function initialsOf(name) {
4984
5061
  const parts = name.trim().split(/\s+/).filter(Boolean);
@@ -4996,7 +5073,7 @@ function PlayerAvatar({
4996
5073
  imagePath,
4997
5074
  className
4998
5075
  }) {
4999
- const [failed, setFailed] = (0, import_react30.useState)(false);
5076
+ const [failed, setFailed] = (0, import_react31.useState)(false);
5000
5077
  const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
5001
5078
  return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
5002
5079
  }
@@ -5211,8 +5288,8 @@ function MysteryTigerGame({
5211
5288
  onBack
5212
5289
  }) {
5213
5290
  const t = ui.games.mysteryTiger;
5214
- const [query, setQuery] = (0, import_react31.useState)("");
5215
- const inputId = (0, import_react31.useId)();
5291
+ const [query, setQuery] = (0, import_react32.useState)("");
5292
+ const inputId = (0, import_react32.useId)();
5216
5293
  const clientState = parseClientState(result?.clientStateJson);
5217
5294
  const guessResults = clientState?.guessResults ?? [];
5218
5295
  const alreadyGuessedIds = new Set(guessResults.map((g) => g.playerId));
@@ -5487,13 +5564,13 @@ function HigherOrLowerGame({
5487
5564
  }
5488
5565
 
5489
5566
  // src/components/games/CareerPathGame.tsx
5490
- var import_react33 = require("react");
5567
+ var import_react34 = require("react");
5491
5568
 
5492
5569
  // src/components/games/ui/CrestShield.tsx
5493
- var import_react32 = require("react");
5570
+ var import_react33 = require("react");
5494
5571
  var import_jsx_runtime69 = require("react/jsx-runtime");
5495
5572
  function CrestShield({ src, name, size = 28 }) {
5496
- const [failed, setFailed] = (0, import_react32.useState)(false);
5573
+ const [failed, setFailed] = (0, import_react33.useState)(false);
5497
5574
  if (src && !isPlaceholderImage(src) && !failed) {
5498
5575
  return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
5499
5576
  }
@@ -5525,8 +5602,8 @@ function CareerPathGame({
5525
5602
  }) {
5526
5603
  const s = ui.games.careerPath;
5527
5604
  const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
5528
- const [query, setQuery] = (0, import_react33.useState)("");
5529
- const inputId = (0, import_react33.useId)();
5605
+ const [query, setQuery] = (0, import_react34.useState)("");
5606
+ const inputId = (0, import_react34.useId)();
5530
5607
  const clientState = parseClientState3(result?.clientStateJson);
5531
5608
  const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
5532
5609
  const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
@@ -5561,7 +5638,7 @@ function CareerPathGame({
5561
5638
  /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(GameHeader, { title, eyebrow: s.eyebrow, right, onBack, backLabel: ui.back }),
5562
5639
  /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: "ss-g-body", children: [
5563
5640
  /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: "ss-g-cp-card", children: [
5564
- /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(Silhouette, { size: 64, variant: isOver ? "default" : "mystery" }),
5641
+ isOver && clientState?.revealedPlayerName ? /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(PlayerAvatar, { className: "ss-g-cp-photo", name: clientState.revealedPlayerName, imagePath: clientState.revealedPlayerImagePath }) : /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(Silhouette, { size: 64, variant: isOver ? "default" : "mystery" }),
5565
5642
  /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: "ss-g-cp-card-text", children: [
5566
5643
  /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("span", { className: "ss-g-cp-card-title", children: isOver && clientState?.revealedPlayerName ? clientState.revealedPlayerName : s.mysteryPlayer }),
5567
5644
  clientState?.hintLine ? /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("span", { className: "ss-g-cp-hint", children: clientState.hintLine }) : !isOver ? /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("span", { className: "ss-g-cp-locks", children: [
@@ -5645,7 +5722,7 @@ function CareerPathGame({
5645
5722
  }
5646
5723
 
5647
5724
  // src/components/games/BeatTheGridGame.tsx
5648
- var import_react34 = __toESM(require("react"), 1);
5725
+ var import_react35 = __toESM(require("react"), 1);
5649
5726
  var import_jsx_runtime71 = require("react/jsx-runtime");
5650
5727
  function criterionIconKind(label, key) {
5651
5728
  const l = (key ?? label).toLowerCase();
@@ -5726,10 +5803,10 @@ function SearchSheet({
5726
5803
  ui
5727
5804
  }) {
5728
5805
  const s = ui.games.beatTheGrid;
5729
- const [query, setQuery] = (0, import_react34.useState)("");
5730
- const inputId = (0, import_react34.useId)();
5731
- const inputRef = (0, import_react34.useRef)(null);
5732
- (0, import_react34.useEffect)(() => {
5806
+ const [query, setQuery] = (0, import_react35.useState)("");
5807
+ const inputId = (0, import_react35.useId)();
5808
+ const inputRef = (0, import_react35.useRef)(null);
5809
+ (0, import_react35.useEffect)(() => {
5733
5810
  inputRef.current?.focus();
5734
5811
  }, [row, col]);
5735
5812
  const filtered = playerPool.filter(
@@ -5794,7 +5871,7 @@ function BeatTheGridGame({
5794
5871
  }) {
5795
5872
  const s = ui.games.beatTheGrid;
5796
5873
  const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
5797
- const [activeCell, setActiveCell] = (0, import_react34.useState)(null);
5874
+ const [activeCell, setActiveCell] = (0, import_react35.useState)(null);
5798
5875
  const clientState = parseClientState4(result?.clientStateJson);
5799
5876
  const filledCells = clientState?.cells ?? [];
5800
5877
  const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
@@ -5868,7 +5945,7 @@ function BeatTheGridGame({
5868
5945
  /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { "aria-hidden": "true", children: abbr }),
5869
5946
  /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-sr", children: rowLabel })
5870
5947
  ] });
5871
- return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_react34.default.Fragment, { children: [
5948
+ return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_react35.default.Fragment, { children: [
5872
5949
  /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("div", { className: "ss-g-btg-rowhdr", "data-meta": rowMeta ? "true" : void 0, children: rowHeaderContent }),
5873
5950
  cols.map((colLabel, colIdx) => {
5874
5951
  const filled = findCellResult(filledCells, rowIdx, colIdx);
@@ -5949,7 +6026,7 @@ function BeatTheGridGame({
5949
6026
  }
5950
6027
 
5951
6028
  // src/components/games/GuessTheXiGame.tsx
5952
- var import_react35 = require("react");
6029
+ var import_react36 = require("react");
5953
6030
 
5954
6031
  // src/components/games/ui/PitchSvg.tsx
5955
6032
  var import_jsx_runtime72 = require("react/jsx-runtime");
@@ -5977,7 +6054,8 @@ function toRows(positions) {
5977
6054
  bucket.push(p);
5978
6055
  byRow.set(rowKey, bucket);
5979
6056
  });
5980
- return [...byRow.keys()].sort((a, b) => b - a).map((k) => byRow.get(k));
6057
+ const col = (p) => Number(p.slot?.split(":")[1]) || 0;
6058
+ return [...byRow.keys()].sort((a, b) => b - a).map((k) => [...byRow.get(k)].sort((a, b) => col(b) - col(a)));
5981
6059
  }
5982
6060
  function formationLabel(rowsAttackFirst) {
5983
6061
  if (rowsAttackFirst.length < 2) return "";
@@ -6037,8 +6115,8 @@ function GuessTheXiGame({
6037
6115
  onBack
6038
6116
  }) {
6039
6117
  const t = ui.games.guessTheXi;
6040
- const [query, setQuery] = (0, import_react35.useState)("");
6041
- const inputId = (0, import_react35.useId)();
6118
+ const [query, setQuery] = (0, import_react36.useState)("");
6119
+ const inputId = (0, import_react36.useId)();
6042
6120
  const clientState = parseClientState5(result?.clientStateJson);
6043
6121
  const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
6044
6122
  const solved = clientState?.status === "solved";
@@ -6179,7 +6257,7 @@ function GuessTheXiGame({
6179
6257
  }
6180
6258
 
6181
6259
  // src/components/games/DailyQuizGame.tsx
6182
- var import_react36 = require("react");
6260
+ var import_react37 = require("react");
6183
6261
  var import_jsx_runtime74 = require("react/jsx-runtime");
6184
6262
  function parseClientState6(json) {
6185
6263
  if (!json) return null;
@@ -6220,8 +6298,8 @@ function DailyQuizGame({
6220
6298
  }) {
6221
6299
  const s = ui.games.dailyQuiz;
6222
6300
  const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
6223
- const [selections, setSelections] = (0, import_react36.useState)(/* @__PURE__ */ new Map());
6224
- const [page, setPage] = (0, import_react36.useState)(0);
6301
+ const [selections, setSelections] = (0, import_react37.useState)(/* @__PURE__ */ new Map());
6302
+ const [page, setPage] = (0, import_react37.useState)(0);
6225
6303
  const clientState = parseClientState6(result?.clientStateJson);
6226
6304
  const results = clientState?.results ?? [];
6227
6305
  const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
@@ -6331,7 +6409,7 @@ function DailyQuizGame({
6331
6409
  }
6332
6410
 
6333
6411
  // src/components/games/MatchdayPredictorGame.tsx
6334
- var import_react37 = require("react");
6412
+ var import_react38 = require("react");
6335
6413
  var import_jsx_runtime75 = require("react/jsx-runtime");
6336
6414
  var SCORER_SEARCH_THRESHOLD = 9;
6337
6415
  function parseClientState7(json) {
@@ -6427,12 +6505,12 @@ function MatchdayPredictorGame({
6427
6505
  onBack
6428
6506
  }) {
6429
6507
  const t = ui.games.predictor;
6430
- const [homeScore, setHomeScore] = (0, import_react37.useState)(0);
6431
- const [awayScore, setAwayScore] = (0, import_react37.useState)(0);
6432
- const [firstScorerPlayerId, setFirstScorerPlayerId] = (0, import_react37.useState)(null);
6433
- const [lastEdited, setLastEdited] = (0, import_react37.useState)("home");
6434
- const [query, setQuery] = (0, import_react37.useState)("");
6435
- const searchId = (0, import_react37.useId)();
6508
+ const [homeScore, setHomeScore] = (0, import_react38.useState)(0);
6509
+ const [awayScore, setAwayScore] = (0, import_react38.useState)(0);
6510
+ const [firstScorerPlayerId, setFirstScorerPlayerId] = (0, import_react38.useState)(null);
6511
+ const [lastEdited, setLastEdited] = (0, import_react38.useState)("home");
6512
+ const [query, setQuery] = (0, import_react38.useState)("");
6513
+ const searchId = (0, import_react38.useId)();
6436
6514
  const clientState = parseClientState7(result?.clientStateJson);
6437
6515
  const alreadyPlayed = result?.alreadyPlayed === true;
6438
6516
  const header = /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
@@ -6599,7 +6677,7 @@ function MatchdayPredictorGame({
6599
6677
  }
6600
6678
 
6601
6679
  // src/components/games/StartingXiGame.tsx
6602
- var import_react38 = require("react");
6680
+ var import_react39 = require("react");
6603
6681
  var import_jsx_runtime76 = require("react/jsx-runtime");
6604
6682
  var POINTS_PER_STARTER = 8;
6605
6683
  var XI_SIZE = 11;
@@ -6643,10 +6721,10 @@ function StartingXiGame({
6643
6721
  lockAtUtc
6644
6722
  }) {
6645
6723
  const t = ui.games.startingXi;
6646
- const [slotPlayers, setSlotPlayers] = (0, import_react38.useState)(() => Array(XI_SIZE).fill(null));
6647
- const [active, setActive] = (0, import_react38.useState)(0);
6648
- const [query, setQuery] = (0, import_react38.useState)("");
6649
- const searchId = (0, import_react38.useId)();
6724
+ const [slotPlayers, setSlotPlayers] = (0, import_react39.useState)(() => Array(XI_SIZE).fill(null));
6725
+ const [active, setActive] = (0, import_react39.useState)(0);
6726
+ const [query, setQuery] = (0, import_react39.useState)("");
6727
+ const searchId = (0, import_react39.useId)();
6650
6728
  const clientState = parseClientState8(result?.clientStateJson);
6651
6729
  const alreadyPlayed = result?.alreadyPlayed === true;
6652
6730
  const header = /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
@@ -6785,7 +6863,7 @@ function StartingXiGame({
6785
6863
  }
6786
6864
 
6787
6865
  // src/components/games/StatLadderGame.tsx
6788
- var import_react39 = require("react");
6866
+ var import_react40 = require("react");
6789
6867
  var import_jsx_runtime77 = require("react/jsx-runtime");
6790
6868
  function ladderClue(ladder) {
6791
6869
  const mystery = ladder.find((r) => r.rank === 2);
@@ -6822,9 +6900,9 @@ function StatLadderGame({
6822
6900
  onBack
6823
6901
  }) {
6824
6902
  const t = ui.games.statLadder;
6825
- const [query, setQuery] = (0, import_react39.useState)("");
6826
- const [selectedId, setSelectedId] = (0, import_react39.useState)(null);
6827
- const searchId = (0, import_react39.useId)();
6903
+ const [query, setQuery] = (0, import_react40.useState)("");
6904
+ const [selectedId, setSelectedId] = (0, import_react40.useState)(null);
6905
+ const searchId = (0, import_react40.useId)();
6828
6906
  const clientState = parseClientState9(result?.clientStateJson);
6829
6907
  const revealed = clientState != null;
6830
6908
  const header = /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(GameHeader, { title: gameTitle({ gameId: "stat-ladder" }, ui.games.titles), eyebrow: t.eyebrow, onBack, backLabel: ui.back });
@@ -7029,8 +7107,8 @@ function GameScreenHost({
7029
7107
  ui
7030
7108
  }) {
7031
7109
  const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
7032
- const [configJson, setConfigJson] = (0, import_react40.useState)(null);
7033
- (0, import_react40.useEffect)(() => {
7110
+ const [configJson, setConfigJson] = (0, import_react41.useState)(null);
7111
+ (0, import_react41.useEffect)(() => {
7034
7112
  setConfigJson(null);
7035
7113
  if (!conversation) return;
7036
7114
  let cancelled = false;
@@ -7053,12 +7131,12 @@ function GameScreenHost({
7053
7131
  fixtureId: fixtureId || void 0,
7054
7132
  locale: ui.games.lang
7055
7133
  });
7056
- (0, import_react40.useEffect)(() => {
7134
+ (0, import_react41.useEffect)(() => {
7057
7135
  if (conversation) hydrate();
7058
7136
  }, [conversation, gameId]);
7059
- const hydrateRef = (0, import_react40.useRef)(hydrate);
7137
+ const hydrateRef = (0, import_react41.useRef)(hydrate);
7060
7138
  hydrateRef.current = hydrate;
7061
- (0, import_react40.useEffect)(() => {
7139
+ (0, import_react41.useEffect)(() => {
7062
7140
  if (!FIXTURE_GAME_IDS.has(gameId)) return;
7063
7141
  if (rawStatus !== "pending") return;
7064
7142
  const timerId = setInterval(() => {
@@ -7193,8 +7271,8 @@ function GamesPanel({
7193
7271
  leaderboard,
7194
7272
  refreshHub
7195
7273
  }) {
7196
- const [selected, setSelected] = (0, import_react41.useState)(null);
7197
- (0, import_react41.useEffect)(() => {
7274
+ const [selected, setSelected] = (0, import_react42.useState)(null);
7275
+ (0, import_react42.useEffect)(() => {
7198
7276
  ensureGamesFonts();
7199
7277
  }, []);
7200
7278
  if (!loggedIn) return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(GamesLoginWall, { ui });
@@ -7225,7 +7303,7 @@ function GamesPanel({
7225
7303
  }
7226
7304
 
7227
7305
  // src/components/Leaderboard.tsx
7228
- var import_react42 = require("react");
7306
+ var import_react43 = require("react");
7229
7307
 
7230
7308
  // src/components/LeaderboardRow.tsx
7231
7309
  var import_jsx_runtime81 = require("react/jsx-runtime");
@@ -7310,7 +7388,7 @@ function Leaderboard({
7310
7388
  ui,
7311
7389
  onPlay
7312
7390
  }) {
7313
- const [segment, setSegment] = (0, import_react42.useState)("weekly");
7391
+ const [segment, setSegment] = (0, import_react43.useState)("weekly");
7314
7392
  const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
7315
7393
  const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
7316
7394
  const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
@@ -7393,8 +7471,8 @@ function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
7393
7471
  var import_jsx_runtime85 = require("react/jsx-runtime");
7394
7472
  var FULLSCREEN_QUERY = "(max-width: 639px)";
7395
7473
  function useIsModal() {
7396
- const [modal, setModal] = (0, import_react43.useState)(false);
7397
- (0, import_react43.useEffect)(() => {
7474
+ const [modal, setModal] = (0, import_react44.useState)(false);
7475
+ (0, import_react44.useEffect)(() => {
7398
7476
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
7399
7477
  const mql = window.matchMedia(FULLSCREEN_QUERY);
7400
7478
  const sync = () => setModal(mql.matches);
@@ -7407,7 +7485,7 @@ function useIsModal() {
7407
7485
  function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, loggedIn, conversation }) {
7408
7486
  const { state, close, stop, send, reset } = controller;
7409
7487
  const isModal = useIsModal();
7410
- (0, import_react43.useEffect)(() => {
7488
+ (0, import_react44.useEffect)(() => {
7411
7489
  const onKey = (e) => {
7412
7490
  if (e.key === "Escape") close();
7413
7491
  };
@@ -7418,7 +7496,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
7418
7496
  monitor?.setActiveTab("chat");
7419
7497
  send(text);
7420
7498
  };
7421
- (0, import_react43.useEffect)(() => {
7499
+ (0, import_react44.useEffect)(() => {
7422
7500
  if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
7423
7501
  }, [monitor, state.isStreaming, state.messages.length]);
7424
7502
  return /* @__PURE__ */ (0, import_jsx_runtime85.jsxs)("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
@@ -8029,6 +8107,59 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
8029
8107
  .ss-w-dash--discovery .ss-w-dash-tile:nth-child(2) { background: color-mix(in srgb, #3a82f6 10%, var(--ss-w-panel)); }
8030
8108
  .ss-w-dash--discovery .ss-w-dash-tile:nth-child(3) { background: color-mix(in srgb, #f5a623 10%, var(--ss-w-panel)); }
8031
8109
  .ss-w-dash--discovery .ss-w-dash-tile:nth-child(4) { background: color-mix(in srgb, #a855f7 10%, var(--ss-w-panel)); }
8110
+ /* A hero tile would take the first tint position; count only regular tiles where \`of S\` parses. */
8111
+ .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)); }
8112
+ .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)); }
8113
+ .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)); }
8114
+ .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)); }
8115
+
8116
+ /* Hero: the personalized lead tile. Declared after the layout rules and at three-class
8117
+ specificity so it keeps one look in every layout -- no market rail, no goal pill, no
8118
+ discovery tint or stacking. Colours derive from accent/panel/ink so an operator surface
8119
+ and dark mode both work without their own rules. */
8120
+ .ss-w-dash .ss-w-dash-grid .ss-w-dash-hero {
8121
+ display: flex; flex-direction: column; align-items: stretch; gap: 10px;
8122
+ padding: 12px 14px 14px; border-radius: 16px;
8123
+ border: 1px solid color-mix(in srgb, var(--ss-w-accent) 38%, var(--ss-w-line));
8124
+ background:
8125
+ radial-gradient(120% 140% at 0% 0%, color-mix(in srgb, var(--ss-w-accent) 18%, transparent) 0%, transparent 60%),
8126
+ var(--ss-w-panel);
8127
+ box-shadow: 0 10px 24px -18px color-mix(in srgb, var(--ss-w-accent) 80%, transparent);
8128
+ }
8129
+ .ss-w-dash .ss-w-dash-grid .ss-w-dash-hero:hover { border-color: var(--ss-w-accent); }
8130
+ .ss-w-dash .ss-w-dash-grid .ss-w-dash-hero:focus-visible { outline: 2px solid var(--ss-w-accent); outline-offset: 2px; }
8131
+ .ss-w-dash-hero-top { display: flex; align-items: center; gap: 8px; min-height: 20px; }
8132
+ .ss-w-dash-hero-badge {
8133
+ font-size: 10.5px; font-weight: 750; letter-spacing: .06em; text-transform: uppercase;
8134
+ 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;
8135
+ white-space: nowrap;
8136
+ }
8137
+ .ss-w-dash-hero-chevron { flex: none; width: 14px; height: 14px; color: var(--ss-w-faint); }
8138
+ .ss-w-dash-hero-badge { margin-right: auto; }
8139
+ .ss-w-dash-hero-chevron:only-child { margin-left: auto; }
8140
+ .ss-w-dash-hero-main { display: flex; align-items: center; gap: 12px; min-width: 0; }
8141
+ .ss-w-dash-hero-visual { flex: none; display: flex; align-items: center; }
8142
+ .ss-w-dash-hero-crest {
8143
+ width: 40px; height: 40px; border-radius: 50%;
8144
+ background-color: color-mix(in srgb, var(--ss-w-ink) 4%, var(--ss-w-panel));
8145
+ background-size: 72%; background-position: center; background-repeat: no-repeat;
8146
+ 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));
8147
+ }
8148
+ .ss-w-dash-hero-crest + .ss-w-dash-hero-crest { margin-left: -8px; }
8149
+ .ss-w-dash-hero-icon {
8150
+ display: grid; place-items: center; width: 40px; height: 40px; border-radius: 50%; font-size: 22px;
8151
+ background: color-mix(in srgb, var(--ss-w-accent) 14%, var(--ss-w-panel));
8152
+ }
8153
+ .ss-w-dash-hero-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
8154
+ .ss-w-dash-hero-title { font-size: 15.5px; font-weight: 700; line-height: 1.25; color: var(--ss-w-ink); overflow-wrap: anywhere; }
8155
+ .ss-w-dash-hero-subtitle { font-size: 12px; color: var(--ss-w-faint); overflow-wrap: anywhere; }
8156
+ .ss-w-dash-hero-price {
8157
+ flex: none; margin-left: auto;
8158
+ font-family: ui-monospace, monospace; font-variant-numeric: tabular-nums; font-size: 15px; font-weight: 750; line-height: 1;
8159
+ color: color-mix(in srgb, var(--ss-w-accent) 45%, var(--ss-w-ink)); padding: 5px 9px; border-radius: 8px;
8160
+ background: color-mix(in srgb, var(--ss-w-accent) 12%, var(--ss-w-panel));
8161
+ border: 1px solid color-mix(in srgb, var(--ss-w-accent) 30%, var(--ss-w-panel));
8162
+ }
8032
8163
 
8033
8164
  /* club fan pre-match dashboard */
8034
8165
  .ss-w-fandash { display: flex; flex-direction: column; gap: 10px; padding: 4px 0; }
@@ -8533,6 +8664,8 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
8533
8664
  .ss-g-mt-portrait .ss-g-sil { font-size: 46px; }
8534
8665
  .ss-g-mt-photo { width: 132px; height: 132px; margin-bottom: 30px; border-radius: 50%; overflow: hidden; display: grid; place-items: center; background: var(--ss-g-accent-tint); color: var(--ss-w-accent); font: 800 40px var(--ss-g-font-display); }
8535
8666
  .ss-g-mt-photo img { width: 100%; height: 100%; object-fit: cover; }
8667
+ .ss-g-cp-photo { width: 64px; height: 64px; flex: none; border-radius: 50%; overflow: hidden; display: grid; place-items: center; background: var(--ss-g-accent-tint); color: var(--ss-w-accent); font: 800 22px var(--ss-g-font-display); }
8668
+ .ss-g-cp-photo img { width: 100%; height: 100%; object-fit: cover; }
8536
8669
  .ss-g-mt-reveal-name { position: absolute; bottom: 6px; left: 12px; right: 12px; text-align: center; font: 800 20px var(--ss-g-font-display); text-transform: uppercase; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
8537
8670
  .ss-g-mt-known { display: grid; gap: 6px; padding: 12px; }
8538
8671
  .ss-g-mt-known-cell { display: flex; flex-direction: column; align-items: center; gap: 4px; min-width: 0; }
@@ -8925,23 +9058,23 @@ function injectStyles(root) {
8925
9058
  function StatsWidget(props) {
8926
9059
  const injectedClient = "client" in props ? props.client : void 0;
8927
9060
  const cfg = props.config;
8928
- const built = (0, import_react44.useMemo)(() => buildClient(props), [injectedClient, cfg?.operatorId, cfg?.publicKey, cfg?.baseUrl]);
8929
- const logger = (0, import_react44.useMemo)(
9061
+ const built = (0, import_react45.useMemo)(() => buildClient(props), [injectedClient, cfg?.operatorId, cfg?.publicKey, cfg?.baseUrl]);
9062
+ const logger = (0, import_react45.useMemo)(
8930
9063
  () => built ? built.client.createEventLogger({
8931
9064
  operatorUserId: cfg?.userContext?.operatorUserId,
8932
9065
  anonymousUserId: cfg?.userContext?.anonymousUserId
8933
9066
  }) : null,
8934
9067
  [built?.client]
8935
9068
  );
8936
- const ui = (0, import_react44.useMemo)(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
8937
- const rootRef = (0, import_react44.useRef)(null);
8938
- const introDoneRef = (0, import_react44.useRef)(false);
8939
- const markIntroDone = (0, import_react44.useCallback)(() => {
9069
+ const ui = (0, import_react45.useMemo)(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
9070
+ const rootRef = (0, import_react45.useRef)(null);
9071
+ const introDoneRef = (0, import_react45.useRef)(false);
9072
+ const markIntroDone = (0, import_react45.useCallback)(() => {
8940
9073
  introDoneRef.current = true;
8941
9074
  }, []);
8942
9075
  const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
8943
9076
  const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
8944
- const [hasToday, setHasToday] = (0, import_react44.useState)(false);
9077
+ const [hasToday, setHasToday] = (0, import_react45.useState)(false);
8945
9078
  const monitor = useLiveMonitor({
8946
9079
  getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
8947
9080
  getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
@@ -8949,15 +9082,15 @@ function StatsWidget(props) {
8949
9082
  isOpen: controller.state.isOpen,
8950
9083
  hasToday
8951
9084
  });
8952
- const getSchedule = (0, import_react44.useCallback)(
9085
+ const getSchedule = (0, import_react45.useCallback)(
8953
9086
  (localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes) : Promise.resolve(null),
8954
9087
  [built]
8955
9088
  );
8956
- const getStates = (0, import_react44.useCallback)(
9089
+ const getStates = (0, import_react45.useCallback)(
8957
9090
  (matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
8958
9091
  [built]
8959
9092
  );
8960
- const pinnedMatchIds = (0, import_react44.useMemo)(
9093
+ const pinnedMatchIds = (0, import_react45.useMemo)(
8961
9094
  () => monitor.pins.filter((p) => p.kind === "match").map((p) => p.matchId),
8962
9095
  [monitor.pins]
8963
9096
  );
@@ -8969,19 +9102,19 @@ function StatsWidget(props) {
8969
9102
  pinnedMatchIds
8970
9103
  });
8971
9104
  const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
8972
- (0, import_react44.useEffect)(() => {
9105
+ (0, import_react45.useEffect)(() => {
8973
9106
  setHasToday(todayHasContent);
8974
9107
  }, [todayHasContent]);
8975
9108
  const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
8976
9109
  const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
8977
9110
  const markTodayActivity = monitor.markTodayActivity;
8978
- const prevLiveCountRef = (0, import_react44.useRef)(0);
8979
- (0, import_react44.useEffect)(() => {
9111
+ const prevLiveCountRef = (0, import_react45.useRef)(0);
9112
+ (0, import_react45.useEffect)(() => {
8980
9113
  const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
8981
9114
  prevLiveCountRef.current = discovery.liveCount;
8982
9115
  if (rose) markTodayActivity();
8983
9116
  }, [discovery.liveCount, markTodayActivity]);
8984
- const slip = (0, import_react44.useMemo)(
9117
+ const slip = (0, import_react45.useMemo)(
8985
9118
  () => {
8986
9119
  const handler = props.config?.onAddToSlip;
8987
9120
  return {
@@ -8993,29 +9126,24 @@ function StatsWidget(props) {
8993
9126
  if (wasAdded(result)) monitor.markInSlip(sel.matchOddsId);
8994
9127
  return result;
8995
9128
  }),
8996
- conversationId: controller.state.conversationId ?? void 0,
8997
- onMarketClicked: (marketName) => {
8998
- try {
8999
- void built?.conversation.sendSignal({ signalType: "InsightMarketClicked", entityType: "Market", entityName: marketName }).catch(() => void 0);
9000
- } catch {
9001
- }
9002
- }
9129
+ conversationId: controller.state.conversationId ?? void 0
9003
9130
  };
9004
9131
  },
9005
- [props.config?.onAddToSlip, controller.state.conversationId, built, monitor.markInSlip]
9132
+ [props.config?.onAddToSlip, controller.state.conversationId, monitor.markInSlip]
9006
9133
  );
9007
- const onDashboardTap = (0, import_react44.useMemo)(
9134
+ const onDashboardTap = (0, import_react45.useMemo)(
9008
9135
  () => built ? createDashboardTapSignal((input) => built.conversation.sendSignal(input), logger) : void 0,
9009
9136
  [built, logger]
9010
9137
  );
9138
+ const dismissPopup = usePopupTelemetry(logger, controller.state.isOpen, controller.state.popupText, controller.dismissPopup);
9011
9139
  const operatorUserId = cfg?.userContext?.operatorUserId;
9012
9140
  const anonymousUserId = cfg?.userContext?.anonymousUserId;
9013
9141
  const conversationId = controller.state.conversationId ?? void 0;
9014
- (0, import_react44.useEffect)(() => {
9142
+ (0, import_react45.useEffect)(() => {
9015
9143
  if (!logger) return;
9016
9144
  logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
9017
9145
  }, [logger, operatorUserId, anonymousUserId, conversationId]);
9018
- (0, import_react44.useEffect)(() => {
9146
+ (0, import_react45.useEffect)(() => {
9019
9147
  if (!logger) return;
9020
9148
  const onHide = () => {
9021
9149
  logger.flushOnHide();
@@ -9032,7 +9160,7 @@ function StatsWidget(props) {
9032
9160
  logger.dispose();
9033
9161
  };
9034
9162
  }, [logger]);
9035
- (0, import_react44.useEffect)(() => {
9163
+ (0, import_react45.useEffect)(() => {
9036
9164
  if (!built || !ui.injectStyles) return;
9037
9165
  const node = rootRef.current?.getRootNode();
9038
9166
  if (node) injectStyles(node);
@@ -9061,7 +9189,7 @@ function StatsWidget(props) {
9061
9189
  popupText: controller.state.popupText,
9062
9190
  logoUrl: ui.logoUrl,
9063
9191
  onOpen: controller.open,
9064
- onDismissPopup: controller.dismissPopup,
9192
+ onDismissPopup: dismissPopup,
9065
9193
  dismissLabel: ui.dismissGreeting,
9066
9194
  introAllowed: !introDoneRef.current,
9067
9195
  onIntroStart: markIntroDone