@sensiblestats/widget-react 0.64.0 → 0.65.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 useCallback11, useEffect as useEffect20, useMemo as useMemo4, useRef as useRef16, useState as useState40 } from "react";
2
+ import { useCallback as useCallback11, useEffect as useEffect20, useMemo as useMemo4, useRef as useRef16, useState as useState39 } from "react";
3
3
  import { StatsWidgetClient } from "@sensiblestats/widget-sdk";
4
4
 
5
5
  // src/kickoff.ts
@@ -32,8 +32,6 @@ var STRINGS = {
32
32
  retry: "Retry",
33
33
  showLess: "Show less",
34
34
  showMore: (n) => `Show ${n} more`,
35
- showStats: "Show stats",
36
- hideStats: "Hide stats",
37
35
  oddsLabel: "Odds",
38
36
  liveLabel: "Live",
39
37
  marketFloorLabel: "Market price \xB7 not a value pick",
@@ -94,7 +92,6 @@ var STRINGS = {
94
92
  liveFactAsk: "Ask about this",
95
93
  liveFactEarlier: (n) => `Earlier facts (${n})`,
96
94
  liveFactHideEarlier: "Hide earlier facts",
97
- accordionValueLabel: "Value",
98
95
  accordionRetry: "Couldn't load odds \u2014 tap to retry",
99
96
  accordionSuspended: "Suspended",
100
97
  tabToday: "Today",
@@ -333,8 +330,6 @@ var STRINGS = {
333
330
  retry: "Tekrar dene",
334
331
  showLess: "Daha az g\xF6ster",
335
332
  showMore: (n) => `${n} tane daha g\xF6ster`,
336
- showStats: "\u0130statistikleri g\xF6ster",
337
- hideStats: "\u0130statistikleri gizle",
338
333
  oddsLabel: "Oran",
339
334
  liveLabel: "Canl\u0131",
340
335
  marketFloorLabel: "Piyasa oran\u0131 \xB7 de\u011Fer bahsi de\u011Fil",
@@ -395,7 +390,6 @@ var STRINGS = {
395
390
  liveFactAsk: "Bunu sor",
396
391
  liveFactEarlier: (n) => `\xD6nceki bilgiler (${n})`,
397
392
  liveFactHideEarlier: "\xD6nceki bilgileri gizle",
398
- accordionValueLabel: "De\u011Fer",
399
393
  accordionRetry: "Oranlar y\xFCklenemedi \u2014 yeniden dene",
400
394
  accordionSuspended: "Ask\u0131da",
401
395
  tabToday: "Bug\xFCn",
@@ -662,8 +656,6 @@ function normalizeUi(cfg) {
662
656
  retry: strings.retry,
663
657
  showLess: strings.showLess,
664
658
  showMore: strings.showMore,
665
- showStats: strings.showStats,
666
- hideStats: strings.hideStats,
667
659
  oddsLabel: strings.oddsLabel,
668
660
  liveLabel: strings.liveLabel,
669
661
  marketFloorLabel: strings.marketFloorLabel,
@@ -724,7 +716,6 @@ function normalizeUi(cfg) {
724
716
  liveFactAsk: strings.liveFactAsk,
725
717
  liveFactEarlier: strings.liveFactEarlier,
726
718
  liveFactHideEarlier: strings.liveFactHideEarlier,
727
- accordionValueLabel: strings.accordionValueLabel,
728
719
  accordionRetry: strings.accordionRetry,
729
720
  accordionSuspended: strings.accordionSuspended,
730
721
  tabGames: strings.tabGames,
@@ -815,10 +806,10 @@ function resultToToast(result, shownOdds, ui) {
815
806
  }
816
807
 
817
808
  // src/useHostEvents.ts
818
- import { useCallback as useCallback4, useEffect as useEffect11, useMemo, useRef as useRef7, useState as useState33 } from "react";
809
+ import { useCallback as useCallback4, useEffect as useEffect11, useMemo, useRef as useRef7, useState as useState32 } from "react";
819
810
 
820
811
  // src/components/ChatPanel.tsx
821
- import { useEffect as useEffect10, useState as useState32 } from "react";
812
+ import { useEffect as useEffect10, useState as useState31 } from "react";
822
813
 
823
814
  // src/components/ChatHeader.tsx
824
815
  import { useEffect, useRef, useState as useState2 } from "react";
@@ -1078,16 +1069,6 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
1078
1069
  ] });
1079
1070
  }
1080
1071
 
1081
- // src/components/BettingInsightList.tsx
1082
- import { useState as useState7 } from "react";
1083
-
1084
- // src/eventLogContext.ts
1085
- import { createContext, useContext } from "react";
1086
- var EventLogContext = createContext(null);
1087
- function useEventLog() {
1088
- return useContext(EventLogContext);
1089
- }
1090
-
1091
1072
  // src/components/AddToSlipButton.tsx
1092
1073
  import { useCallback, useState as useState4 } from "react";
1093
1074
  import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
@@ -1211,7 +1192,6 @@ function toInsightVM(insight) {
1211
1192
  const away = str(insight.awayTeamName);
1212
1193
  const fixture = home && away ? `${home} vs ${away}` : void 0;
1213
1194
  const competition = str(insight.competitionName);
1214
- const scopes = Array.isArray(insight.scopes) ? insight.scopes.map((s) => ({ key: str(s.key), label: str(s.label), stats: readStatCells(s.stats) })).filter((s) => !!s.key && !!s.label) : void 0;
1215
1195
  const previousValue = insight.odds?.previousValue;
1216
1196
  const previous = typeof previousValue === "number" && Number.isFinite(previousValue) ? previousValue : void 0;
1217
1197
  const direction = insight.odds?.movementDirection === "shortened" || insight.odds?.movementDirection === "drifted" ? insight.odds.movementDirection : void 0;
@@ -1226,9 +1206,7 @@ function toInsightVM(insight) {
1226
1206
  phase: str(insight.phase),
1227
1207
  fixture,
1228
1208
  competition,
1229
- scopes,
1230
1209
  text: str(insight.text) ?? "",
1231
- stats: readStatCells(insight.stats),
1232
1210
  disclaimer: str(insight.disclaimer),
1233
1211
  matchId: typeof insight.matchId === "number" ? insight.matchId : 0,
1234
1212
  matchOddsId,
@@ -1365,6 +1343,13 @@ function marketOddsRowToSlipSelection(vm, row, conversationId) {
1365
1343
  return selection;
1366
1344
  }
1367
1345
 
1346
+ // src/eventLogContext.ts
1347
+ import { createContext, useContext } from "react";
1348
+ var EventLogContext = createContext(null);
1349
+ function useEventLog() {
1350
+ return useContext(EventLogContext);
1351
+ }
1352
+
1368
1353
  // src/slipStateContext.ts
1369
1354
  import { createContext as createContext2, useContext as useContext2 } from "react";
1370
1355
  var SlipStateContext = createContext2(null);
@@ -1726,55 +1711,11 @@ function MatchLink({ matchId, home, away, detail, className, as: Tag = "span", c
1726
1711
 
1727
1712
  // src/components/BettingInsightList.tsx
1728
1713
  import { Fragment, jsx as jsx12, jsxs as jsxs7 } from "react/jsx-runtime";
1729
- function StatRows({ stats }) {
1730
- return /* @__PURE__ */ jsx12("div", { className: "ss-w-bi-rows", children: stats.map((s) => /* @__PURE__ */ jsxs7("div", { className: "ss-w-bi-row", children: [
1731
- /* @__PURE__ */ jsx12("span", { className: "ss-w-bi-row-lbl", children: s.label }),
1732
- /* @__PURE__ */ jsx12("span", { className: "ss-w-bi-row-num", children: s.value })
1733
- ] }, `${s.label}:${s.value}`)) });
1734
- }
1735
- function ScopedStats({ scopes }) {
1736
- const [active, setActive] = useState7(0);
1737
- const current = scopes[active] ?? scopes[0] ?? { key: "", label: "", stats: [] };
1738
- return /* @__PURE__ */ jsxs7("div", { className: "ss-w-bi-scoped", children: [
1739
- /* @__PURE__ */ jsx12("div", { className: "ss-w-bi-scopes", role: "group", children: scopes.map((s, i) => /* @__PURE__ */ jsx12("button", { type: "button", className: "ss-w-bi-chip", "aria-pressed": i === active, onClick: () => setActive(i), children: s.label }, s.key)) }),
1740
- /* @__PURE__ */ jsx12(StatRows, { stats: current.stats }, current.key)
1741
- ] });
1742
- }
1743
- function hasStatsContent(it) {
1744
- return !!it.scopes && it.scopes.length >= 2 || it.stats.length > 0;
1745
- }
1746
- function ReasonStrip({ it, ui }) {
1747
- const [open, setOpen] = useState7(false);
1748
- const log = useEventLog();
1749
- const hasScopes = !!it.scopes && it.scopes.length >= 2;
1750
- const hasStats = hasStatsContent(it);
1751
- const hasText = !!it.text;
1752
- if (!hasText && !hasStats) return null;
1753
- const expandable = hasStats || (it.text?.length ?? 0) > 90;
1754
- const onToggle = () => {
1755
- setOpen((v) => {
1756
- const next = !v;
1757
- if (next) log?.log({ name: "insight_expand", entityType: "match", entityId: String(it.matchId) });
1758
- return next;
1759
- });
1760
- };
1714
+ function ReasonStrip({ it }) {
1715
+ if (!it.text) return null;
1761
1716
  return /* @__PURE__ */ jsxs7("div", { className: "ss-w-bi-reason", children: [
1762
1717
  /* @__PURE__ */ jsx12("span", { className: "ss-w-bi-chart", "aria-hidden": "true" }),
1763
- /* @__PURE__ */ jsxs7("div", { className: "ss-w-bi-reason-body", children: [
1764
- hasText ? /* @__PURE__ */ jsx12("p", { className: `ss-w-bi-text${open ? "" : " ss-w-bi-text-clamp"}`, children: it.text }) : null,
1765
- open && hasStats ? hasScopes ? /* @__PURE__ */ jsx12(ScopedStats, { scopes: it.scopes }) : /* @__PURE__ */ jsx12(StatRows, { stats: it.stats }) : null
1766
- ] }),
1767
- expandable ? /* @__PURE__ */ jsx12(
1768
- "button",
1769
- {
1770
- type: "button",
1771
- className: "ss-w-bi-expand",
1772
- "aria-expanded": open,
1773
- "aria-label": open ? ui?.hideStats ?? "Hide stats" : ui?.showStats ?? "Show stats",
1774
- onClick: onToggle,
1775
- children: /* @__PURE__ */ jsx12("span", { className: `ss-w-bi-arrow${open ? " ss-w-bi-arrow-open" : ""}`, "aria-hidden": "true" })
1776
- }
1777
- ) : null
1718
+ /* @__PURE__ */ jsx12("p", { className: "ss-w-bi-text", children: it.text })
1778
1719
  ] });
1779
1720
  }
1780
1721
  function CardFixture({ it }) {
@@ -1854,7 +1795,7 @@ function InsightCard({ it, ui, slip, monitor }) {
1854
1795
  ] })
1855
1796
  ] }),
1856
1797
  it.isMarketFloor ? /* @__PURE__ */ jsx12("span", { className: "ss-w-bi-floor", children: ui?.marketFloorLabel ?? "Market price \xB7 not a value pick" }) : null,
1857
- /* @__PURE__ */ jsx12(ReasonStrip, { it, ui }),
1798
+ /* @__PURE__ */ jsx12(ReasonStrip, { it }),
1858
1799
  it.disclaimer ? /* @__PURE__ */ jsx12("p", { className: "ss-w-bi-disc", children: it.disclaimer }) : null
1859
1800
  ] });
1860
1801
  }
@@ -1864,7 +1805,7 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
1864
1805
  }
1865
1806
 
1866
1807
  // src/components/MarketOddsCardList.tsx
1867
- import { useState as useState8 } from "react";
1808
+ import { useState as useState7 } from "react";
1868
1809
  import { Fragment as Fragment2, jsx as jsx13, jsxs as jsxs8 } from "react/jsx-runtime";
1869
1810
  function OddsRow({ vm, row, ui, slip, inSlipIds }) {
1870
1811
  const selection = vm.addToSlipEnabled ? marketOddsRowToSlipSelection(vm, row, slip.conversationId) : null;
@@ -1881,7 +1822,7 @@ function OddsRow({ vm, row, ui, slip, inSlipIds }) {
1881
1822
  ] });
1882
1823
  }
1883
1824
  function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
1884
- const [open, setOpen] = useState8(false);
1825
+ const [open, setOpen] = useState7(false);
1885
1826
  const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
1886
1827
  const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
1887
1828
  const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
@@ -2214,7 +2155,7 @@ function FixtureCard({ card }) {
2214
2155
  }
2215
2156
 
2216
2157
  // src/components/dashboard/CountdownCard.tsx
2217
- import { Fragment as Fragment6, useEffect as useEffect3, useState as useState9 } from "react";
2158
+ import { Fragment as Fragment6, useEffect as useEffect3, useState as useState8 } from "react";
2218
2159
  import { jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
2219
2160
  var DAY_MS = 864e5;
2220
2161
  function remainingSegments(kickoffUnix, nowMs, withSeconds) {
@@ -2233,8 +2174,8 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
2233
2174
  function CountdownCard({ card }) {
2234
2175
  const { data } = card;
2235
2176
  const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
2236
- const [nowMs, setNowMs] = useState9(() => Date.now());
2237
- const [reduced] = useState9(
2177
+ const [nowMs, setNowMs] = useState8(() => Date.now());
2178
+ const [reduced] = useState8(
2238
2179
  () => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
2239
2180
  );
2240
2181
  const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
@@ -2257,7 +2198,7 @@ function CountdownCard({ card }) {
2257
2198
  }
2258
2199
 
2259
2200
  // src/components/dashboard/InjuriesCard.tsx
2260
- import { useState as useState10 } from "react";
2201
+ import { useState as useState9 } from "react";
2261
2202
  import { jsx as jsx20, jsxs as jsxs15 } from "react/jsx-runtime";
2262
2203
  var SHOWN = 3;
2263
2204
  function ColHead({ name, crestUrl }) {
@@ -2280,7 +2221,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
2280
2221
  }
2281
2222
  function InjuriesCard({ card, ui }) {
2282
2223
  const { data } = card;
2283
- const [expanded, setExpanded] = useState10(false);
2224
+ const [expanded, setExpanded] = useState9(false);
2284
2225
  const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
2285
2226
  const limit = expanded ? void 0 : SHOWN;
2286
2227
  const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
@@ -2386,7 +2327,7 @@ function LinksCard({ card }) {
2386
2327
  }
2387
2328
 
2388
2329
  // src/components/dashboard/PostMatchResultCard.tsx
2389
- import { useState as useState11 } from "react";
2330
+ import { useState as useState10 } from "react";
2390
2331
  import { jsx as jsx26, jsxs as jsxs21 } from "react/jsx-runtime";
2391
2332
  function initials3(name) {
2392
2333
  return name.trim().slice(0, 3).toUpperCase();
@@ -2396,7 +2337,7 @@ function PostMatchCrest({
2396
2337
  name,
2397
2338
  side
2398
2339
  }) {
2399
- const [failed, setFailed] = useState11(false);
2340
+ const [failed, setFailed] = useState10(false);
2400
2341
  const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
2401
2342
  if (url && !failed) {
2402
2343
  return /* @__PURE__ */ jsx26("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -2595,10 +2536,10 @@ function RestingFormCard({ card }) {
2595
2536
  }
2596
2537
 
2597
2538
  // src/components/dashboard/LiveScoreCard.tsx
2598
- import { useRef as useRef2, useState as useState13 } from "react";
2539
+ import { useRef as useRef2, useState as useState12 } from "react";
2599
2540
 
2600
2541
  // src/useLiveClock.ts
2601
- import { useEffect as useEffect4, useState as useState12 } from "react";
2542
+ import { useEffect as useEffect4, useState as useState11 } from "react";
2602
2543
  var TICK_MS = 6e4;
2603
2544
  var MAX_LIVE_TICK_MINUTES = 15;
2604
2545
  function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
@@ -2607,7 +2548,7 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
2607
2548
  return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
2608
2549
  }
2609
2550
  function useLiveClock(minute, clockRunning, receivedAtMs) {
2610
- const [displayMinute, setDisplayMinute] = useState12(
2551
+ const [displayMinute, setDisplayMinute] = useState11(
2611
2552
  () => computeDisplayMinute(minute, clockRunning, receivedAtMs)
2612
2553
  );
2613
2554
  useEffect4(() => {
@@ -2627,7 +2568,7 @@ function initials5(name) {
2627
2568
  return name.trim().slice(0, 3).toUpperCase();
2628
2569
  }
2629
2570
  function LiveCrest({ url, name, side }) {
2630
- const [failed, setFailed] = useState13(false);
2571
+ const [failed, setFailed] = useState12(false);
2631
2572
  const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
2632
2573
  if (url && !failed) {
2633
2574
  return /* @__PURE__ */ jsx35("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -2686,7 +2627,7 @@ function LiveScoreCard({
2686
2627
  }
2687
2628
 
2688
2629
  // src/components/dashboard/LiveTimelineCard.tsx
2689
- import { useState as useState14 } from "react";
2630
+ import { useState as useState13 } from "react";
2690
2631
  import { jsx as jsx36, jsxs as jsxs31 } from "react/jsx-runtime";
2691
2632
  var SHOWN2 = 3;
2692
2633
  function EventIcon({ type }) {
@@ -2728,7 +2669,7 @@ function EventRow({ e }) {
2728
2669
  ] });
2729
2670
  }
2730
2671
  function LiveTimelineCard({ card, ui }) {
2731
- const [expanded, setExpanded] = useState14(false);
2672
+ const [expanded, setExpanded] = useState13(false);
2732
2673
  const events = card.data.events;
2733
2674
  if (!events || events.length === 0) return null;
2734
2675
  const sorted = [...events].sort((a, b) => b.minute - a.minute);
@@ -3028,10 +2969,10 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
3028
2969
  }
3029
2970
 
3030
2971
  // src/components/ChatInput.tsx
3031
- import { useState as useState15 } from "react";
2972
+ import { useState as useState14 } from "react";
3032
2973
  import { jsx as jsx43, jsxs as jsxs37 } from "react/jsx-runtime";
3033
2974
  function ChatInput({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message" }) {
3034
- const [value, setValue] = useState15("");
2975
+ const [value, setValue] = useState14("");
3035
2976
  const submit = () => {
3036
2977
  const t = value.trim();
3037
2978
  if (!t) return;
@@ -3133,11 +3074,7 @@ function MarketAccordion({ match, monitor, ui, slip }) {
3133
3074
  children: ui.accordionRetry
3134
3075
  }
3135
3076
  ),
3136
- entry?.block?.insight?.text && /* @__PURE__ */ jsxs39("div", { className: "ss-w-acc-insight", children: [
3137
- /* @__PURE__ */ jsx45("span", { className: "ss-w-acc-badge", children: ui.accordionValueLabel }),
3138
- " ",
3139
- entry.block.insight.text
3140
- ] }),
3077
+ entry?.block?.insight?.text && /* @__PURE__ */ jsx45("div", { className: "ss-w-acc-insight", children: entry.block.insight.text }),
3141
3078
  entry?.block?.card && /* @__PURE__ */ jsx45(
3142
3079
  MarketOddsCardList,
3143
3080
  {
@@ -3155,10 +3092,10 @@ function MarketAccordion({ match, monitor, ui, slip }) {
3155
3092
  }
3156
3093
 
3157
3094
  // src/components/LiveFactBlock.tsx
3158
- import { useState as useState16 } from "react";
3095
+ import { useState as useState15 } from "react";
3159
3096
  import { jsx as jsx46, jsxs as jsxs40 } from "react/jsx-runtime";
3160
3097
  function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
3161
- const [expanded, setExpanded] = useState16(false);
3098
+ const [expanded, setExpanded] = useState15(false);
3162
3099
  const [current, ...earlier] = facts;
3163
3100
  if (!current) return null;
3164
3101
  const m = current.market;
@@ -3545,7 +3482,7 @@ function TodayPanel({ discovery, ui, monitor }) {
3545
3482
  }
3546
3483
 
3547
3484
  // src/components/GamesPanel.tsx
3548
- import { useEffect as useEffect9, useState as useState30 } from "react";
3485
+ import { useEffect as useEffect9, useState as useState29 } from "react";
3549
3486
 
3550
3487
  // src/components/GamesLoginWall.tsx
3551
3488
  import { jsx as jsx52 } from "react/jsx-runtime";
@@ -3554,7 +3491,7 @@ function GamesLoginWall({ ui }) {
3554
3491
  }
3555
3492
 
3556
3493
  // src/components/GamesHub.tsx
3557
- import { useEffect as useEffect6, useState as useState17 } from "react";
3494
+ import { useEffect as useEffect6, useState as useState16 } from "react";
3558
3495
 
3559
3496
  // src/components/games/ui/gameMeta.ts
3560
3497
  function prettifyGameId(gameId) {
@@ -3739,7 +3676,7 @@ function pickHeroGame(games) {
3739
3676
  }
3740
3677
  var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
3741
3678
  function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
3742
- const [, setTick] = useState17(0);
3679
+ const [, setTick] = useState16(0);
3743
3680
  useEffect6(() => {
3744
3681
  const id = setInterval(() => setTick((t) => t + 1), 6e4);
3745
3682
  return () => clearInterval(id);
@@ -3800,10 +3737,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
3800
3737
  }
3801
3738
 
3802
3739
  // src/components/GameScreenHost.tsx
3803
- import { useEffect as useEffect8, useRef as useRef6, useState as useState29 } from "react";
3740
+ import { useEffect as useEffect8, useRef as useRef6, useState as useState28 } from "react";
3804
3741
 
3805
3742
  // src/useGamePlay.ts
3806
- import { useCallback as useCallback3, useRef as useRef4, useState as useState18 } from "react";
3743
+ import { useCallback as useCallback3, useRef as useRef4, useState as useState17 } from "react";
3807
3744
  function toSubmitResult(payload) {
3808
3745
  return {
3809
3746
  // 'pending' means the play is recorded but awaiting resolution (fixture games)
@@ -3815,9 +3752,9 @@ function toSubmitResult(payload) {
3815
3752
  };
3816
3753
  }
3817
3754
  function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
3818
- const [result, setResult] = useState18(null);
3819
- const [submitting, setSubmitting] = useState18(false);
3820
- const [rawStatus, setRawStatus] = useState18(null);
3755
+ const [result, setResult] = useState17(null);
3756
+ const [submitting, setSubmitting] = useState17(false);
3757
+ const [rawStatus, setRawStatus] = useState17(null);
3821
3758
  const inFlightRef = useRef4(false);
3822
3759
  const convRef = useRef4(conversation);
3823
3760
  convRef.current = conversation;
@@ -3875,7 +3812,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
3875
3812
  }
3876
3813
 
3877
3814
  // src/components/games/MysteryTigerGame.tsx
3878
- import { useState as useState20, useId as useId2 } from "react";
3815
+ import { useState as useState19, useId as useId2 } from "react";
3879
3816
 
3880
3817
  // src/components/games/nationFlags.ts
3881
3818
  var FLAGS = {
@@ -4086,7 +4023,7 @@ function isNationCode(flag) {
4086
4023
  }
4087
4024
 
4088
4025
  // src/components/games/PlayerAvatar.tsx
4089
- import { useState as useState19 } from "react";
4026
+ import { useState as useState18 } from "react";
4090
4027
  import { jsx as jsx58 } from "react/jsx-runtime";
4091
4028
  function initialsOf(name) {
4092
4029
  const parts = name.trim().split(/\s+/).filter(Boolean);
@@ -4104,7 +4041,7 @@ function PlayerAvatar({
4104
4041
  imagePath,
4105
4042
  className
4106
4043
  }) {
4107
- const [failed, setFailed] = useState19(false);
4044
+ const [failed, setFailed] = useState18(false);
4108
4045
  const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
4109
4046
  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) }) });
4110
4047
  }
@@ -4319,7 +4256,7 @@ function MysteryTigerGame({
4319
4256
  onBack
4320
4257
  }) {
4321
4258
  const t = ui.games.mysteryTiger;
4322
- const [query, setQuery] = useState20("");
4259
+ const [query, setQuery] = useState19("");
4323
4260
  const inputId = useId2();
4324
4261
  const clientState = parseClientState(result?.clientStateJson);
4325
4262
  const guessResults = clientState?.guessResults ?? [];
@@ -4595,13 +4532,13 @@ function HigherOrLowerGame({
4595
4532
  }
4596
4533
 
4597
4534
  // src/components/games/CareerPathGame.tsx
4598
- import { useState as useState22, useId as useId3 } from "react";
4535
+ import { useState as useState21, useId as useId3 } from "react";
4599
4536
 
4600
4537
  // src/components/games/ui/CrestShield.tsx
4601
- import { useState as useState21 } from "react";
4538
+ import { useState as useState20 } from "react";
4602
4539
  import { jsx as jsx69 } from "react/jsx-runtime";
4603
4540
  function CrestShield({ src, name, size = 28 }) {
4604
- const [failed, setFailed] = useState21(false);
4541
+ const [failed, setFailed] = useState20(false);
4605
4542
  if (src && !isPlaceholderImage(src) && !failed) {
4606
4543
  return /* @__PURE__ */ jsx69("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
4607
4544
  }
@@ -4633,7 +4570,7 @@ function CareerPathGame({
4633
4570
  }) {
4634
4571
  const s = ui.games.careerPath;
4635
4572
  const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
4636
- const [query, setQuery] = useState22("");
4573
+ const [query, setQuery] = useState21("");
4637
4574
  const inputId = useId3();
4638
4575
  const clientState = parseClientState3(result?.clientStateJson);
4639
4576
  const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
@@ -4753,7 +4690,7 @@ function CareerPathGame({
4753
4690
  }
4754
4691
 
4755
4692
  // src/components/games/BeatTheGridGame.tsx
4756
- import React, { useEffect as useEffect7, useId as useId4, useRef as useRef5, useState as useState23 } from "react";
4693
+ import React, { useEffect as useEffect7, useId as useId4, useRef as useRef5, useState as useState22 } from "react";
4757
4694
  import { Fragment as Fragment14, jsx as jsx71, jsxs as jsxs58 } from "react/jsx-runtime";
4758
4695
  function criterionIconKind(label, key) {
4759
4696
  const l = (key ?? label).toLowerCase();
@@ -4834,7 +4771,7 @@ function SearchSheet({
4834
4771
  ui
4835
4772
  }) {
4836
4773
  const s = ui.games.beatTheGrid;
4837
- const [query, setQuery] = useState23("");
4774
+ const [query, setQuery] = useState22("");
4838
4775
  const inputId = useId4();
4839
4776
  const inputRef = useRef5(null);
4840
4777
  useEffect7(() => {
@@ -4902,7 +4839,7 @@ function BeatTheGridGame({
4902
4839
  }) {
4903
4840
  const s = ui.games.beatTheGrid;
4904
4841
  const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
4905
- const [activeCell, setActiveCell] = useState23(null);
4842
+ const [activeCell, setActiveCell] = useState22(null);
4906
4843
  const clientState = parseClientState4(result?.clientStateJson);
4907
4844
  const filledCells = clientState?.cells ?? [];
4908
4845
  const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
@@ -5057,7 +4994,7 @@ function BeatTheGridGame({
5057
4994
  }
5058
4995
 
5059
4996
  // src/components/games/GuessTheXiGame.tsx
5060
- import { useState as useState24, useId as useId5 } from "react";
4997
+ import { useState as useState23, useId as useId5 } from "react";
5061
4998
 
5062
4999
  // src/components/games/ui/PitchSvg.tsx
5063
5000
  import { Fragment as Fragment15, jsx as jsx72, jsxs as jsxs59 } from "react/jsx-runtime";
@@ -5146,7 +5083,7 @@ function GuessTheXiGame({
5146
5083
  onBack
5147
5084
  }) {
5148
5085
  const t = ui.games.guessTheXi;
5149
- const [query, setQuery] = useState24("");
5086
+ const [query, setQuery] = useState23("");
5150
5087
  const inputId = useId5();
5151
5088
  const clientState = parseClientState5(result?.clientStateJson);
5152
5089
  const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
@@ -5288,7 +5225,7 @@ function GuessTheXiGame({
5288
5225
  }
5289
5226
 
5290
5227
  // src/components/games/DailyQuizGame.tsx
5291
- import { useState as useState25 } from "react";
5228
+ import { useState as useState24 } from "react";
5292
5229
  import { Fragment as Fragment17, jsx as jsx74, jsxs as jsxs61 } from "react/jsx-runtime";
5293
5230
  function parseClientState6(json) {
5294
5231
  if (!json) return null;
@@ -5329,8 +5266,8 @@ function DailyQuizGame({
5329
5266
  }) {
5330
5267
  const s = ui.games.dailyQuiz;
5331
5268
  const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
5332
- const [selections, setSelections] = useState25(/* @__PURE__ */ new Map());
5333
- const [page, setPage] = useState25(0);
5269
+ const [selections, setSelections] = useState24(/* @__PURE__ */ new Map());
5270
+ const [page, setPage] = useState24(0);
5334
5271
  const clientState = parseClientState6(result?.clientStateJson);
5335
5272
  const results = clientState?.results ?? [];
5336
5273
  const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
@@ -5440,7 +5377,7 @@ function DailyQuizGame({
5440
5377
  }
5441
5378
 
5442
5379
  // src/components/games/MatchdayPredictorGame.tsx
5443
- import { useId as useId6, useState as useState26 } from "react";
5380
+ import { useId as useId6, useState as useState25 } from "react";
5444
5381
  import { jsx as jsx75, jsxs as jsxs62 } from "react/jsx-runtime";
5445
5382
  var SCORER_SEARCH_THRESHOLD = 9;
5446
5383
  function parseClientState7(json) {
@@ -5536,11 +5473,11 @@ function MatchdayPredictorGame({
5536
5473
  onBack
5537
5474
  }) {
5538
5475
  const t = ui.games.predictor;
5539
- const [homeScore, setHomeScore] = useState26(0);
5540
- const [awayScore, setAwayScore] = useState26(0);
5541
- const [firstScorerPlayerId, setFirstScorerPlayerId] = useState26(null);
5542
- const [lastEdited, setLastEdited] = useState26("home");
5543
- const [query, setQuery] = useState26("");
5476
+ const [homeScore, setHomeScore] = useState25(0);
5477
+ const [awayScore, setAwayScore] = useState25(0);
5478
+ const [firstScorerPlayerId, setFirstScorerPlayerId] = useState25(null);
5479
+ const [lastEdited, setLastEdited] = useState25("home");
5480
+ const [query, setQuery] = useState25("");
5544
5481
  const searchId = useId6();
5545
5482
  const clientState = parseClientState7(result?.clientStateJson);
5546
5483
  const alreadyPlayed = result?.alreadyPlayed === true;
@@ -5708,7 +5645,7 @@ function MatchdayPredictorGame({
5708
5645
  }
5709
5646
 
5710
5647
  // src/components/games/StartingXiGame.tsx
5711
- import { useId as useId7, useState as useState27 } from "react";
5648
+ import { useId as useId7, useState as useState26 } from "react";
5712
5649
  import { Fragment as Fragment18, jsx as jsx76, jsxs as jsxs63 } from "react/jsx-runtime";
5713
5650
  var POINTS_PER_STARTER = 8;
5714
5651
  var XI_SIZE = 11;
@@ -5752,9 +5689,9 @@ function StartingXiGame({
5752
5689
  lockAtUtc
5753
5690
  }) {
5754
5691
  const t = ui.games.startingXi;
5755
- const [slotPlayers, setSlotPlayers] = useState27(() => Array(XI_SIZE).fill(null));
5756
- const [active, setActive] = useState27(0);
5757
- const [query, setQuery] = useState27("");
5692
+ const [slotPlayers, setSlotPlayers] = useState26(() => Array(XI_SIZE).fill(null));
5693
+ const [active, setActive] = useState26(0);
5694
+ const [query, setQuery] = useState26("");
5758
5695
  const searchId = useId7();
5759
5696
  const clientState = parseClientState8(result?.clientStateJson);
5760
5697
  const alreadyPlayed = result?.alreadyPlayed === true;
@@ -5894,7 +5831,7 @@ function StartingXiGame({
5894
5831
  }
5895
5832
 
5896
5833
  // src/components/games/StatLadderGame.tsx
5897
- import { useId as useId8, useState as useState28 } from "react";
5834
+ import { useId as useId8, useState as useState27 } from "react";
5898
5835
  import { jsx as jsx77, jsxs as jsxs64 } from "react/jsx-runtime";
5899
5836
  function ladderClue(ladder) {
5900
5837
  const mystery = ladder.find((r) => r.rank === 2);
@@ -5931,8 +5868,8 @@ function StatLadderGame({
5931
5868
  onBack
5932
5869
  }) {
5933
5870
  const t = ui.games.statLadder;
5934
- const [query, setQuery] = useState28("");
5935
- const [selectedId, setSelectedId] = useState28(null);
5871
+ const [query, setQuery] = useState27("");
5872
+ const [selectedId, setSelectedId] = useState27(null);
5936
5873
  const searchId = useId8();
5937
5874
  const clientState = parseClientState9(result?.clientStateJson);
5938
5875
  const revealed = clientState != null;
@@ -6138,7 +6075,7 @@ function GameScreenHost({
6138
6075
  ui
6139
6076
  }) {
6140
6077
  const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
6141
- const [configJson, setConfigJson] = useState29(null);
6078
+ const [configJson, setConfigJson] = useState28(null);
6142
6079
  useEffect8(() => {
6143
6080
  setConfigJson(null);
6144
6081
  if (!conversation) return;
@@ -6302,7 +6239,7 @@ function GamesPanel({
6302
6239
  leaderboard,
6303
6240
  refreshHub
6304
6241
  }) {
6305
- const [selected, setSelected] = useState30(null);
6242
+ const [selected, setSelected] = useState29(null);
6306
6243
  useEffect9(() => {
6307
6244
  ensureGamesFonts();
6308
6245
  }, []);
@@ -6334,7 +6271,7 @@ function GamesPanel({
6334
6271
  }
6335
6272
 
6336
6273
  // src/components/Leaderboard.tsx
6337
- import { useState as useState31 } from "react";
6274
+ import { useState as useState30 } from "react";
6338
6275
 
6339
6276
  // src/components/LeaderboardRow.tsx
6340
6277
  import { jsx as jsx81, jsxs as jsxs66 } from "react/jsx-runtime";
@@ -6419,7 +6356,7 @@ function Leaderboard({
6419
6356
  ui,
6420
6357
  onPlay
6421
6358
  }) {
6422
- const [segment, setSegment] = useState31("weekly");
6359
+ const [segment, setSegment] = useState30("weekly");
6423
6360
  const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
6424
6361
  const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
6425
6362
  const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
@@ -6502,7 +6439,7 @@ function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
6502
6439
  import { jsx as jsx85, jsxs as jsxs69 } from "react/jsx-runtime";
6503
6440
  var FULLSCREEN_QUERY = "(max-width: 639px)";
6504
6441
  function useIsModal() {
6505
- const [modal, setModal] = useState32(false);
6442
+ const [modal, setModal] = useState31(false);
6506
6443
  useEffect10(() => {
6507
6444
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
6508
6445
  const mql = window.matchMedia(FULLSCREEN_QUERY);
@@ -6803,8 +6740,8 @@ function toSlipEvent(name, entry) {
6803
6740
  // src/useHostEvents.ts
6804
6741
  function useHostEvents(opts) {
6805
6742
  const { host, operatorId, currentUser, logger, isOpen, closePanel, onOpenMatch, openMatchLabel } = opts;
6806
- const [added, setAdded] = useState33({});
6807
- const [settled, setSettled] = useState33({});
6743
+ const [added, setAdded] = useState32({});
6744
+ const [settled, setSettled] = useState32({});
6808
6745
  const markAdded = useCallback4((matchOddsId) => {
6809
6746
  setAdded((prev) => prev[matchOddsId] ? prev : { ...prev, [matchOddsId]: true });
6810
6747
  }, []);
@@ -7406,12 +7343,12 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
7406
7343
  }
7407
7344
 
7408
7345
  // src/useLiveMonitor.ts
7409
- import { useCallback as useCallback6, useEffect as useEffect14, useRef as useRef10, useState as useState35 } from "react";
7346
+ import { useCallback as useCallback6, useEffect as useEffect14, useRef as useRef10, useState as useState34 } from "react";
7410
7347
 
7411
7348
  // src/useTabs.ts
7412
- import { useState as useState34 } from "react";
7349
+ import { useState as useState33 } from "react";
7413
7350
  function useTabs(initial = "chat") {
7414
- const [activeTab, setActiveTab] = useState34(initial);
7351
+ const [activeTab, setActiveTab] = useState33(initial);
7415
7352
  return { activeTab, setActiveTab };
7416
7353
  }
7417
7354
 
@@ -7436,18 +7373,18 @@ function phaseForPin(snapshot, pin) {
7436
7373
  }
7437
7374
  function useLiveMonitor(opts) {
7438
7375
  const sessionIdRef = useRef10(crypto.randomUUID());
7439
- const [pins, setPins] = useState35([]);
7440
- const [store] = useState35(() => createPinStore(opts.storageKey, sessionIdRef.current, setPins));
7441
- const [enabled, setEnabled] = useState35(true);
7442
- const [snapshot, setSnapshotState] = useState35(null);
7376
+ const [pins, setPins] = useState34([]);
7377
+ const [store] = useState34(() => createPinStore(opts.storageKey, sessionIdRef.current, setPins));
7378
+ const [enabled, setEnabled] = useState34(true);
7379
+ const [snapshot, setSnapshotState] = useState34(null);
7443
7380
  const { activeTab, setActiveTab: setActiveTabState } = useTabs("chat");
7444
- const [chatDot, setChatDot] = useState35(false);
7445
- const [matchesDot, setMatchesDot] = useState35(false);
7446
- const [oddsDot, setOddsDot] = useState35(false);
7447
- const [todayDot, setTodayDot] = useState35(false);
7448
- const [lastViewedPrices, setLastViewedPrices] = useState35({});
7449
- const [openMarket, setOpenMarket] = useState35({});
7450
- const [marketOdds, setMarketOdds] = useState35({});
7381
+ const [chatDot, setChatDot] = useState34(false);
7382
+ const [matchesDot, setMatchesDot] = useState34(false);
7383
+ const [oddsDot, setOddsDot] = useState34(false);
7384
+ const [todayDot, setTodayDot] = useState34(false);
7385
+ const [lastViewedPrices, setLastViewedPrices] = useState34({});
7386
+ const [openMarket, setOpenMarket] = useState34({});
7387
+ const [marketOdds, setMarketOdds] = useState34({});
7451
7388
  const pinsRef = useRef10(pins);
7452
7389
  pinsRef.current = pins;
7453
7390
  const activeTabRef = useRef10(activeTab);
@@ -7688,7 +7625,7 @@ function useLiveMonitor(opts) {
7688
7625
  }
7689
7626
 
7690
7627
  // src/useMatchDiscovery.ts
7691
- import { useCallback as useCallback7, useEffect as useEffect15, useMemo as useMemo3, useRef as useRef11, useState as useState36 } from "react";
7628
+ import { useCallback as useCallback7, useEffect as useEffect15, useMemo as useMemo3, useRef as useRef11, useState as useState35 } from "react";
7692
7629
 
7693
7630
  // src/scheduleCache.ts
7694
7631
  var PREFIX = "ss-w-schedule:";
@@ -7776,11 +7713,11 @@ function localDateOf(now) {
7776
7713
  return `${y}-${m}-${d}`;
7777
7714
  }
7778
7715
  function useMatchDiscovery(opts) {
7779
- const [groups, setGroups] = useState36([]);
7780
- const [states, setStates] = useState36({});
7781
- const [failures, setFailures] = useState36(0);
7782
- const [expanded, setExpanded] = useState36({});
7783
- const [touched, setTouched] = useState36({});
7716
+ const [groups, setGroups] = useState35([]);
7717
+ const [states, setStates] = useState35({});
7718
+ const [failures, setFailures] = useState35(0);
7719
+ const [expanded, setExpanded] = useState35({});
7720
+ const [touched, setTouched] = useState35({});
7784
7721
  const groupsRef = useRef11(groups);
7785
7722
  groupsRef.current = groups;
7786
7723
  const statesRef = useRef11(states);
@@ -7788,7 +7725,7 @@ function useMatchDiscovery(opts) {
7788
7725
  const getStatesRef = useRef11(opts.getStates);
7789
7726
  getStatesRef.current = opts.getStates;
7790
7727
  const pinnedKey = opts.pinnedMatchIds.join(",");
7791
- const [localDate, setLocalDate] = useState36(() => localDateOf(/* @__PURE__ */ new Date()));
7728
+ const [localDate, setLocalDate] = useState35(() => localDateOf(/* @__PURE__ */ new Date()));
7792
7729
  useEffect15(() => {
7793
7730
  const id = setInterval(() => {
7794
7731
  const next = localDateOf(/* @__PURE__ */ new Date());
@@ -7869,17 +7806,17 @@ function useMatchDiscovery(opts) {
7869
7806
  }
7870
7807
 
7871
7808
  // src/useGames.ts
7872
- import { useCallback as useCallback8, useEffect as useEffect16, useRef as useRef12, useState as useState37 } from "react";
7809
+ import { useCallback as useCallback8, useEffect as useEffect16, useRef as useRef12, useState as useState36 } from "react";
7873
7810
  var GAMES_POLL_MS = 6e4;
7874
7811
  var DEFAULT_TZ = "Europe/London";
7875
7812
  function computeGameDay(timezone) {
7876
7813
  return new Intl.DateTimeFormat("en-CA", { timeZone: timezone }).format(/* @__PURE__ */ new Date());
7877
7814
  }
7878
7815
  function useGames(conversation, { activeTab, operatorTimezone }) {
7879
- const [enabled, setEnabled] = useState37(false);
7880
- const [games, setGames] = useState37([]);
7881
- const [loading, setLoading] = useState37(false);
7882
- const [refreshCount, setRefreshCount] = useState37(0);
7816
+ const [enabled, setEnabled] = useState36(false);
7817
+ const [games, setGames] = useState36([]);
7818
+ const [loading, setLoading] = useState36(false);
7819
+ const [refreshCount, setRefreshCount] = useState36(0);
7883
7820
  const inFlightRef = useRef12(false);
7884
7821
  const hardOffRef = useRef12(false);
7885
7822
  const conversationRef = useRef12(conversation);
@@ -7937,11 +7874,11 @@ function useGames(conversation, { activeTab, operatorTimezone }) {
7937
7874
  }
7938
7875
 
7939
7876
  // src/useLeaderboard.ts
7940
- import { useCallback as useCallback9, useEffect as useEffect17, useRef as useRef13, useState as useState38 } from "react";
7877
+ import { useCallback as useCallback9, useEffect as useEffect17, useRef as useRef13, useState as useState37 } from "react";
7941
7878
  function useLeaderboard(conversation, { activeTab }) {
7942
- const [data, setData] = useState38(null);
7943
- const [loading, setLoading] = useState38(false);
7944
- const [refreshCount, setRefreshCount] = useState38(0);
7879
+ const [data, setData] = useState37(null);
7880
+ const [loading, setLoading] = useState37(false);
7881
+ const [refreshCount, setRefreshCount] = useState37(0);
7945
7882
  const inFlightRef = useRef13(false);
7946
7883
  const conversationRef = useRef13(conversation);
7947
7884
  conversationRef.current = conversation;
@@ -7998,7 +7935,7 @@ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
7998
7935
  }
7999
7936
 
8000
7937
  // src/components/ChatFab.tsx
8001
- import { useEffect as useEffect19, useRef as useRef15, useState as useState39 } from "react";
7938
+ import { useEffect as useEffect19, useRef as useRef15, useState as useState38 } from "react";
8002
7939
 
8003
7940
  // src/components/GreetingBubble.tsx
8004
7941
  import { jsx as jsx86, jsxs as jsxs70 } from "react/jsx-runtime";
@@ -8020,7 +7957,7 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss" }) {
8020
7957
  import { jsx as jsx87, jsxs as jsxs71 } from "react/jsx-runtime";
8021
7958
  function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart }) {
8022
7959
  const bubble = popupText ?? greeting;
8023
- const [intro, setIntro] = useState39(false);
7960
+ const [intro, setIntro] = useState38(false);
8024
7961
  const armedRef = useRef15(introAllowed);
8025
7962
  useEffect19(() => {
8026
7963
  if (armedRef.current && bubble) {
@@ -8396,7 +8333,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
8396
8333
  .ss-w-bi-book { font-size: 9.5px; color: var(--ss-w-faint); }
8397
8334
  .ss-w-bi-pick-row .ss-w-slip { flex: none; }
8398
8335
 
8399
- /* row 3: bar-chart glyph + reasoning prose + stats-expander chevron, in a subtle strip */
8336
+ /* row 3: bar-chart glyph + reasoning prose, in a subtle strip */
8400
8337
  .ss-w-bi-reason { display: flex; align-items: flex-start; gap: 8px; background: var(--ss-w-bubble); border-radius: 10px; padding: 8px 10px; }
8401
8338
  .ss-w-bi-chart { flex: none; width: 13px; height: 12px; margin-top: 2px; opacity: .55;
8402
8339
  background:
@@ -8405,23 +8342,8 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
8405
8342
  linear-gradient(var(--ss-w-accent), var(--ss-w-accent)) right / 3px 75% no-repeat;
8406
8343
  background-position: left bottom, center bottom, right bottom;
8407
8344
  }
8408
- .ss-w-bi-reason-body { display: flex; flex-direction: column; gap: 8px; min-width: 0; flex: 1; }
8409
- .ss-w-bi-text { font-size: 12px; line-height: 1.45; color: var(--ss-w-ink); }
8410
- .ss-w-bi-text-clamp { display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
8411
- .ss-w-bi-expand { flex: none; align-self: center; display: grid; place-items: center; width: 22px; height: 22px; margin: -2px -4px -2px 0; background: none; border: none; color: var(--ss-w-faint); cursor: pointer; }
8412
- .ss-w-bi-expand:hover { color: var(--ss-w-ink); }
8413
- .ss-w-bi-arrow { width: 7px; height: 7px; border-right: 1.6px solid currentColor; border-top: 1.6px solid currentColor; transform: rotate(45deg); transition: transform .15s ease; }
8414
- .ss-w-bi-arrow-open { transform: rotate(135deg); }
8415
- .ss-w-bi-rows { display: flex; flex-direction: column; }
8416
- .ss-w-bi-row { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding: 5px 0; border-top: 1px solid var(--ss-w-line); }
8417
- .ss-w-bi-row:first-child { border-top: none; }
8418
- .ss-w-bi-row-lbl { font-size: 11.5px; color: var(--ss-w-faint); min-width: 0; }
8419
- .ss-w-bi-row-num { font-family: ui-monospace, monospace; font-weight: 700; font-variant-numeric: tabular-nums; font-size: 13px; flex: none; color: var(--ss-w-ink); }
8345
+ .ss-w-bi-text { flex: 1; min-width: 0; font-size: 12px; line-height: 1.45; color: var(--ss-w-ink); }
8420
8346
  .ss-w-bi-disc { font-size: 10px; font-style: italic; color: var(--ss-w-faint); }
8421
- .ss-w-bi-scoped { display: flex; flex-direction: column; gap: 8px; }
8422
- .ss-w-bi-scopes { display: inline-flex; align-items: center; gap: 2px; flex-wrap: wrap; align-self: flex-start; background: var(--ss-w-bubble); border: 1px solid var(--ss-w-line); border-radius: 9px; padding: 2px; }
8423
- .ss-w-bi-chip { font-size: 11px; font-weight: 600; border: none; border-radius: 7px; padding: 4px 10px; color: var(--ss-w-faint); background: none; cursor: pointer; }
8424
- .ss-w-bi-chip[aria-pressed="true"] { color: var(--ss-w-ink); background: var(--ss-w-panel); box-shadow: 0 1px 2px rgba(0,0,0,.08); }
8425
8347
 
8426
8348
  /* market odds card */
8427
8349
  .ss-w-mocards { display: flex; flex-direction: column; gap: 7px; }
@@ -9578,7 +9500,7 @@ function StatsWidget(props) {
9578
9500
  }, []);
9579
9501
  const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
9580
9502
  const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
9581
- const [hasToday, setHasToday] = useState40(false);
9503
+ const [hasToday, setHasToday] = useState39(false);
9582
9504
  const monitor = useLiveMonitor({
9583
9505
  getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
9584
9506
  getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),