@sensiblestats/widget-react 0.83.0 → 0.85.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 useCallback21, useEffect as useEffect32, useMemo as useMemo6, useRef as useRef28, useState as useState51 } from "react";
2
+ import { useCallback as useCallback23, useEffect as useEffect34, useMemo as useMemo6, useRef as useRef31, useState as useState53 } from "react";
3
3
  import { StatsWidgetClient } from "@sensiblestats/widget-sdk";
4
4
 
5
5
  // src/kickoff.ts
@@ -119,6 +119,38 @@ var STRINGS = {
119
119
  clubFixturesEmpty: "No fixtures yet.",
120
120
  clubStandingsEmpty: "Standings are not available yet.",
121
121
  clubSquadEmpty: "Squad is not available yet.",
122
+ footRight: "Right",
123
+ footLeft: "Left",
124
+ footBoth: "Both",
125
+ positionGoalkeeper: "Goalkeeper",
126
+ positionDefender: "Defender",
127
+ positionMidfielder: "Midfielder",
128
+ positionAttacker: "Attacker",
129
+ tabRecords: "Records",
130
+ clubSquadStatsEmpty: "Squad stats are not available yet.",
131
+ clubPlayerDetailEmpty: "Player details are not available.",
132
+ clubRecordsEmpty: "Club records are not available yet.",
133
+ squadViewRoster: "Roster",
134
+ squadViewStats: "Stats",
135
+ statColApps: "Apps",
136
+ statColGoals: "Goals",
137
+ statColAssists: "Assists",
138
+ statColRating: "Rating",
139
+ statColMinutes: "Minutes",
140
+ statColYellow: "Yellow cards",
141
+ statColRed: "Red cards",
142
+ statColXg: "xG",
143
+ statColShots: "Shots",
144
+ detailNationality: "Nationality",
145
+ detailAge: "Age",
146
+ detailHeight: "Height",
147
+ detailFoot: "Foot",
148
+ detailSeason: "Season {season}",
149
+ clubPlayerBack: "Back",
150
+ recordsTopScorers: "Top scorers",
151
+ recordsMostAppearances: "Most appearances",
152
+ recordsMostAssists: "Most assists",
153
+ recordsSince: "Since {season}",
122
154
  standingsColClub: "Club",
123
155
  standingsColPlayed: "P",
124
156
  standingsColWon: "W",
@@ -500,6 +532,38 @@ var STRINGS = {
500
532
  clubFixturesEmpty: "Hen\xFCz fikst\xFCr yok.",
501
533
  clubStandingsEmpty: "Puan durumu hen\xFCz mevcut de\u011Fil.",
502
534
  clubSquadEmpty: "Kadro hen\xFCz mevcut de\u011Fil.",
535
+ footRight: "Sa\u011F",
536
+ footLeft: "Sol",
537
+ footBoth: "\u0130ki ayak",
538
+ positionGoalkeeper: "Kaleci",
539
+ positionDefender: "Defans",
540
+ positionMidfielder: "Orta saha",
541
+ positionAttacker: "Forvet",
542
+ tabRecords: "Rekorlar",
543
+ clubSquadStatsEmpty: "Kadro istatistikleri hen\xFCz mevcut de\u011Fil.",
544
+ clubPlayerDetailEmpty: "Oyuncu bilgileri mevcut de\u011Fil.",
545
+ clubRecordsEmpty: "Kul\xFCp rekorlar\u0131 hen\xFCz mevcut de\u011Fil.",
546
+ squadViewRoster: "Kadro",
547
+ squadViewStats: "\u0130statistik",
548
+ statColApps: "Ma\xE7",
549
+ statColGoals: "Gol",
550
+ statColAssists: "Asist",
551
+ statColRating: "Puan",
552
+ statColMinutes: "Dakika",
553
+ statColYellow: "Sar\u0131 kart",
554
+ statColRed: "K\u0131rm\u0131z\u0131 kart",
555
+ statColXg: "xG",
556
+ statColShots: "\u015Eut",
557
+ detailNationality: "Uyruk",
558
+ detailAge: "Ya\u015F",
559
+ detailHeight: "Boy",
560
+ detailFoot: "Ayak",
561
+ detailSeason: "{season} sezonu",
562
+ clubPlayerBack: "Geri",
563
+ recordsTopScorers: "En \xE7ok gol atanlar",
564
+ recordsMostAppearances: "En \xE7ok ma\xE7 yapanlar",
565
+ recordsMostAssists: "En \xE7ok asist yapanlar",
566
+ recordsSince: "{season} sezonundan beri",
503
567
  standingsColClub: "Tak\u0131m",
504
568
  standingsColPlayed: "O",
505
569
  standingsColWon: "G",
@@ -878,6 +942,38 @@ function normalizeUi(cfg) {
878
942
  clubFixturesEmpty: strings.clubFixturesEmpty,
879
943
  clubStandingsEmpty: strings.clubStandingsEmpty,
880
944
  clubSquadEmpty: strings.clubSquadEmpty,
945
+ footRight: strings.footRight,
946
+ footLeft: strings.footLeft,
947
+ footBoth: strings.footBoth,
948
+ positionGoalkeeper: strings.positionGoalkeeper,
949
+ positionDefender: strings.positionDefender,
950
+ positionMidfielder: strings.positionMidfielder,
951
+ positionAttacker: strings.positionAttacker,
952
+ tabRecords: strings.tabRecords,
953
+ clubSquadStatsEmpty: strings.clubSquadStatsEmpty,
954
+ clubPlayerDetailEmpty: strings.clubPlayerDetailEmpty,
955
+ clubRecordsEmpty: strings.clubRecordsEmpty,
956
+ squadViewRoster: strings.squadViewRoster,
957
+ squadViewStats: strings.squadViewStats,
958
+ statColApps: strings.statColApps,
959
+ statColGoals: strings.statColGoals,
960
+ statColAssists: strings.statColAssists,
961
+ statColRating: strings.statColRating,
962
+ statColMinutes: strings.statColMinutes,
963
+ statColYellow: strings.statColYellow,
964
+ statColRed: strings.statColRed,
965
+ statColXg: strings.statColXg,
966
+ statColShots: strings.statColShots,
967
+ detailNationality: strings.detailNationality,
968
+ detailAge: strings.detailAge,
969
+ detailHeight: strings.detailHeight,
970
+ detailFoot: strings.detailFoot,
971
+ detailSeason: strings.detailSeason,
972
+ clubPlayerBack: strings.clubPlayerBack,
973
+ recordsTopScorers: strings.recordsTopScorers,
974
+ recordsMostAppearances: strings.recordsMostAppearances,
975
+ recordsMostAssists: strings.recordsMostAssists,
976
+ recordsSince: strings.recordsSince,
881
977
  standingsColClub: strings.standingsColClub,
882
978
  standingsColPlayed: strings.standingsColPlayed,
883
979
  standingsColWon: strings.standingsColWon,
@@ -1177,6 +1273,7 @@ function toMarketOddsVM(card) {
1177
1273
  mainLine: str(card.mainLine),
1178
1274
  pinEnabled: card.pinEnabled === true,
1179
1275
  statText: card.insight && typeof card.insight === "object" ? str(card.insight.text) : void 0,
1276
+ statTexts: Array.isArray(card.insights) ? card.insights.map((i) => str(i?.text)).filter((t) => !!t) : void 0,
1180
1277
  tag: card.tag === "your_market" ? "your_market" : void 0,
1181
1278
  live: card.live ?? null,
1182
1279
  marketCount: typeof card.marketCount === "number" && Number.isFinite(card.marketCount) ? card.marketCount : void 0
@@ -3242,8 +3339,83 @@ function useClubSquad(conversation, { activeTab, enabled }) {
3242
3339
  return { data, loading: effectiveLoading, refresh };
3243
3340
  }
3244
3341
 
3342
+ // src/useClubSquadStats.ts
3343
+ import { useCallback as useCallback10, useEffect as useEffect11, useRef as useRef11, useState as useState10 } from "react";
3344
+ function useClubSquadStats(conversation, { activeTab, enabled }) {
3345
+ const [data, setData] = useState10(null);
3346
+ const [seasonName, setSeasonName] = useState10(null);
3347
+ const [loading, setLoading] = useState10(false);
3348
+ const [refreshCount, setRefreshCount] = useState10(0);
3349
+ const inFlightRef = useRef11(false);
3350
+ const conversationRef = useRef11(conversation);
3351
+ conversationRef.current = conversation;
3352
+ useEffect11(() => {
3353
+ if (activeTab !== "squad" || !enabled) return;
3354
+ let active = true;
3355
+ const doFetch = async () => {
3356
+ const conv = conversationRef.current;
3357
+ if (!conv || inFlightRef.current) return;
3358
+ inFlightRef.current = true;
3359
+ setLoading(true);
3360
+ try {
3361
+ const result = await conv.getClubSquadStats();
3362
+ if (active) {
3363
+ setData(result?.players ?? null);
3364
+ setSeasonName(result?.seasonName ?? null);
3365
+ }
3366
+ } catch {
3367
+ } finally {
3368
+ inFlightRef.current = false;
3369
+ if (active) setLoading(false);
3370
+ }
3371
+ };
3372
+ void doFetch();
3373
+ return () => {
3374
+ active = false;
3375
+ inFlightRef.current = false;
3376
+ };
3377
+ }, [activeTab, enabled, refreshCount]);
3378
+ const refresh = useCallback10(() => {
3379
+ setRefreshCount((c) => c + 1);
3380
+ }, []);
3381
+ const effectiveLoading = loading || activeTab === "squad" && enabled && data === null;
3382
+ return { data, seasonName, loading: effectiveLoading, refresh };
3383
+ }
3384
+
3385
+ // src/useClubPlayerDetail.ts
3386
+ import { useCallback as useCallback11, useRef as useRef12, useState as useState11 } from "react";
3387
+ function useClubPlayerDetail(conversation) {
3388
+ const [data, setData] = useState11(null);
3389
+ const [loading, setLoading] = useState11(false);
3390
+ const requestSeqRef = useRef12(0);
3391
+ const conversationRef = useRef12(conversation);
3392
+ conversationRef.current = conversation;
3393
+ const fetch = useCallback11((playerId) => {
3394
+ const conv = conversationRef.current;
3395
+ if (!conv) return;
3396
+ const seq = ++requestSeqRef.current;
3397
+ setData(null);
3398
+ setLoading(true);
3399
+ void (async () => {
3400
+ try {
3401
+ const result = await conv.getClubPlayerDetail(playerId);
3402
+ if (seq === requestSeqRef.current) setData(result);
3403
+ } catch {
3404
+ } finally {
3405
+ if (seq === requestSeqRef.current) setLoading(false);
3406
+ }
3407
+ })();
3408
+ }, []);
3409
+ const clear = useCallback11(() => {
3410
+ requestSeqRef.current++;
3411
+ setData(null);
3412
+ setLoading(false);
3413
+ }, []);
3414
+ return { data, loading, fetch, clear };
3415
+ }
3416
+
3245
3417
  // src/usePresetGrid.ts
3246
- import { useEffect as useEffect11, useRef as useRef11, useState as useState10 } from "react";
3418
+ import { useEffect as useEffect12, useRef as useRef13, useState as useState12 } from "react";
3247
3419
 
3248
3420
  // src/presetGrid.ts
3249
3421
  var DEFAULT_SINGLES_LIMITS = [1.3, 1.5, 1.7, 2];
@@ -3386,22 +3558,22 @@ function marketDisplay(cell, s) {
3386
3558
  // src/usePresetGrid.ts
3387
3559
  var GRID_MAX_AGE_MS = 6e5;
3388
3560
  function usePresetGrid({ getPricePresets, isOpen, locale, now = Date.now }) {
3389
- const [grid, setGrid] = useState10(null);
3390
- const keptRef = useRef11(null);
3391
- const localeRef = useRef11(locale);
3392
- const inFlightRef = useRef11(false);
3393
- const mountedRef = useRef11(true);
3394
- const getRef = useRef11(getPricePresets);
3561
+ const [grid, setGrid] = useState12(null);
3562
+ const keptRef = useRef13(null);
3563
+ const localeRef = useRef13(locale);
3564
+ const inFlightRef = useRef13(false);
3565
+ const mountedRef = useRef13(true);
3566
+ const getRef = useRef13(getPricePresets);
3395
3567
  getRef.current = getPricePresets;
3396
- const nowRef = useRef11(now);
3568
+ const nowRef = useRef13(now);
3397
3569
  nowRef.current = now;
3398
- useEffect11(() => {
3570
+ useEffect12(() => {
3399
3571
  mountedRef.current = true;
3400
3572
  return () => {
3401
3573
  mountedRef.current = false;
3402
3574
  };
3403
3575
  }, []);
3404
- useEffect11(() => {
3576
+ useEffect12(() => {
3405
3577
  if (localeRef.current !== locale) {
3406
3578
  localeRef.current = locale;
3407
3579
  keptRef.current = null;
@@ -3451,11 +3623,11 @@ function useEventLog() {
3451
3623
  }
3452
3624
 
3453
3625
  // src/popupTelemetry.ts
3454
- import { useCallback as useCallback10, useEffect as useEffect12, useRef as useRef12 } from "react";
3626
+ import { useCallback as useCallback12, useEffect as useEffect13, useRef as useRef14 } from "react";
3455
3627
  function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
3456
- const shownRef = useRef12(/* @__PURE__ */ new Set());
3457
- const closedTextRef = useRef12(null);
3458
- useEffect12(() => {
3628
+ const shownRef = useRef14(/* @__PURE__ */ new Set());
3629
+ const closedTextRef = useRef14(null);
3630
+ useEffect13(() => {
3459
3631
  if (isOpen) {
3460
3632
  if (closedTextRef.current) log?.log({ name: "popup_opened" });
3461
3633
  closedTextRef.current = null;
@@ -3467,17 +3639,17 @@ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
3467
3639
  log?.log({ name: "popup_shown" });
3468
3640
  }
3469
3641
  }, [log, isOpen, popupText]);
3470
- return useCallback10(() => {
3642
+ return useCallback12(() => {
3471
3643
  log?.log({ name: "popup_dismissed" });
3472
3644
  dismissPopup();
3473
3645
  }, [log, dismissPopup]);
3474
3646
  }
3475
3647
 
3476
3648
  // src/openTelemetry.ts
3477
- import { useEffect as useEffect13, useRef as useRef13 } from "react";
3649
+ import { useEffect as useEffect14, useRef as useRef15 } from "react";
3478
3650
  function useOpenTelemetry(log, isOpen) {
3479
- const openLoggedRef = useRef13(false);
3480
- useEffect13(() => {
3651
+ const openLoggedRef = useRef15(false);
3652
+ useEffect14(() => {
3481
3653
  if (!isOpen) {
3482
3654
  openLoggedRef.current = false;
3483
3655
  return;
@@ -3489,10 +3661,10 @@ function useOpenTelemetry(log, isOpen) {
3489
3661
  }
3490
3662
 
3491
3663
  // src/components/ChatFab.tsx
3492
- import { useEffect as useEffect14, useRef as useRef14, useState as useState12 } from "react";
3664
+ import { useEffect as useEffect15, useRef as useRef16, useState as useState14 } from "react";
3493
3665
 
3494
3666
  // src/components/BrandMark.tsx
3495
- import { useState as useState11 } from "react";
3667
+ import { useState as useState13 } from "react";
3496
3668
 
3497
3669
  // src/assets/logo.ts
3498
3670
  var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
@@ -3555,7 +3727,7 @@ function DashboardIcon({ name }) {
3555
3727
  // src/components/BrandMark.tsx
3556
3728
  import { jsx as jsx2 } from "react/jsx-runtime";
3557
3729
  function BrandMark({ logoUrl, className }) {
3558
- const [failed, setFailed] = useState11(false);
3730
+ const [failed, setFailed] = useState13(false);
3559
3731
  if (!logoUrl || failed) return /* @__PURE__ */ jsx2(SsMark, { className });
3560
3732
  return /* @__PURE__ */ jsx2("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
3561
3733
  }
@@ -3591,9 +3763,9 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss", ask
3591
3763
  import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
3592
3764
  function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart, asks }) {
3593
3765
  const bubble = popupText ?? greeting;
3594
- const [intro, setIntro] = useState12(false);
3595
- const armedRef = useRef14(introAllowed);
3596
- useEffect14(() => {
3766
+ const [intro, setIntro] = useState14(false);
3767
+ const armedRef = useRef16(introAllowed);
3768
+ useEffect15(() => {
3597
3769
  if (armedRef.current && bubble) {
3598
3770
  armedRef.current = false;
3599
3771
  setIntro(true);
@@ -3607,10 +3779,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
3607
3779
  }
3608
3780
 
3609
3781
  // src/components/ChatPanel.tsx
3610
- import { useCallback as useCallback20, useEffect as useEffect31, useMemo as useMemo5, useRef as useRef27, useState as useState50 } from "react";
3782
+ import { useCallback as useCallback22, useEffect as useEffect33, useLayoutEffect, useMemo as useMemo5, useRef as useRef30, useState as useState52 } from "react";
3611
3783
 
3612
3784
  // src/components/ChatHeader.tsx
3613
- import { useEffect as useEffect15, useRef as useRef15, useState as useState13 } from "react";
3785
+ import { useEffect as useEffect16, useRef as useRef17, useState as useState15 } from "react";
3614
3786
  import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
3615
3787
  function ChatHeader({
3616
3788
  onClose,
@@ -3622,15 +3794,15 @@ function ChatHeader({
3622
3794
  newConversationLabel = "New conversation",
3623
3795
  moreOptionsLabel = "More options"
3624
3796
  }) {
3625
- const [menuOpen, setMenuOpen] = useState13(false);
3626
- const wrapRef = useRef15(null);
3627
- const kebabRef = useRef15(null);
3628
- const firstItemRef = useRef15(null);
3797
+ const [menuOpen, setMenuOpen] = useState15(false);
3798
+ const wrapRef = useRef17(null);
3799
+ const kebabRef = useRef17(null);
3800
+ const firstItemRef = useRef17(null);
3629
3801
  const hasMenu = !!(canReset && onNewConversation);
3630
- useEffect15(() => {
3802
+ useEffect16(() => {
3631
3803
  if (menuOpen) firstItemRef.current?.focus();
3632
3804
  }, [menuOpen]);
3633
- useEffect15(() => {
3805
+ useEffect16(() => {
3634
3806
  if (!menuOpen) return;
3635
3807
  const onPointer = (e) => {
3636
3808
  if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
@@ -3686,7 +3858,7 @@ function ChatHeader({
3686
3858
  }
3687
3859
 
3688
3860
  // src/components/MessageList.tsx
3689
- import { useEffect as useEffect21, useRef as useRef18 } from "react";
3861
+ import { useEffect as useEffect22, useRef as useRef20 } from "react";
3690
3862
 
3691
3863
  // src/components/Markdown.tsx
3692
3864
  import ReactMarkdown from "react-markdown";
@@ -3704,7 +3876,7 @@ function Markdown({ text }) {
3704
3876
  }
3705
3877
 
3706
3878
  // src/components/EntityCardList.tsx
3707
- import { useState as useState14 } from "react";
3879
+ import { useState as useState16 } from "react";
3708
3880
  import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
3709
3881
  var MAX_VISIBLE = 3;
3710
3882
  var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
@@ -3788,7 +3960,7 @@ function ScopeTabs({ scopes, active, onSelect }) {
3788
3960
  )) });
3789
3961
  }
3790
3962
  function EntityCardItem({ c }) {
3791
- const [active, setActive] = useState14(0);
3963
+ const [active, setActive] = useState16(0);
3792
3964
  const hasBody = c.scopes.length > 0;
3793
3965
  if (!hasBody) {
3794
3966
  return /* @__PURE__ */ jsx7("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ jsx7(CardHeader, { c, showScopeCrest: false }) });
@@ -3802,7 +3974,7 @@ function EntityCardItem({ c }) {
3802
3974
  ] });
3803
3975
  }
3804
3976
  function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
3805
- const [expanded, setExpanded] = useState14(false);
3977
+ const [expanded, setExpanded] = useState16(false);
3806
3978
  if (cards.length === 0) return null;
3807
3979
  const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
3808
3980
  const overflow = cards.length - MAX_VISIBLE;
@@ -3813,10 +3985,10 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
3813
3985
  }
3814
3986
 
3815
3987
  // src/components/AddToSlipButton.tsx
3816
- import { useCallback as useCallback12, useState as useState15 } from "react";
3988
+ import { useCallback as useCallback14, useState as useState17 } from "react";
3817
3989
 
3818
3990
  // src/slipAdd.ts
3819
- import { useCallback as useCallback11 } from "react";
3991
+ import { useCallback as useCallback13 } from "react";
3820
3992
  import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
3821
3993
 
3822
3994
  // src/slipStateContext.ts
@@ -3838,7 +4010,7 @@ function useSlipAdd(slip, ui) {
3838
4010
  const slipState = useSlipState();
3839
4011
  const handler = slip.onAddToSlip;
3840
4012
  const rawLabels = !!ui?.rawBettingLabels;
3841
- return useCallback11(async (selection, { marketDeveloperName, selectionLabel, line }) => {
4013
+ return useCallback13(async (selection, { marketDeveloperName, selectionLabel, line }) => {
3842
4014
  if (!handler) return { kind: "failed" };
3843
4015
  const pick = slipPickFields(selection, rawLabels ? selectionLabel : void 0, line);
3844
4016
  if (marketDeveloperName !== void 0) {
@@ -3875,11 +4047,11 @@ function useSlipAdd(slip, ui) {
3875
4047
  }
3876
4048
 
3877
4049
  // src/components/Toast.tsx
3878
- import { useEffect as useEffect16 } from "react";
4050
+ import { useEffect as useEffect17 } from "react";
3879
4051
  import { jsx as jsx8 } from "react/jsx-runtime";
3880
4052
  var DISMISS_MS = 4e3;
3881
4053
  function Toast({ toast, onDismiss }) {
3882
- useEffect16(() => {
4054
+ useEffect17(() => {
3883
4055
  if (!toast) return;
3884
4056
  const timer = setTimeout(onDismiss, DISMISS_MS);
3885
4057
  return () => clearTimeout(timer);
@@ -3891,10 +4063,10 @@ function Toast({ toast, onDismiss }) {
3891
4063
  // src/components/AddToSlipButton.tsx
3892
4064
  import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
3893
4065
  function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui, price, ariaLabel }) {
3894
- const [pending, setPending] = useState15(false);
3895
- const [settledLocal, setSettledLocal] = useState15(false);
3896
- const [toast, setToast] = useState15(null);
3897
- const dismiss = useCallback12(() => setToast(null), []);
4066
+ const [pending, setPending] = useState17(false);
4067
+ const [settledLocal, setSettledLocal] = useState17(false);
4068
+ const [toast, setToast] = useState17(null);
4069
+ const dismiss = useCallback14(() => setToast(null), []);
3898
4070
  const add = useSlipAdd(slip, ui);
3899
4071
  const slipState = useSlipState();
3900
4072
  const handler = slip.onAddToSlip;
@@ -3982,14 +4154,14 @@ function OddsMovementBadge({
3982
4154
  }
3983
4155
 
3984
4156
  // src/components/Crest.tsx
3985
- import { useState as useState16 } from "react";
4157
+ import { useState as useState18 } from "react";
3986
4158
  import { jsx as jsx11 } from "react/jsx-runtime";
3987
4159
  function initials2(name) {
3988
4160
  return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
3989
4161
  }
3990
4162
  function Crest2({ url, name, kind }) {
3991
4163
  const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
3992
- const [failed, setFailed] = useState16(false);
4164
+ const [failed, setFailed] = useState18(false);
3993
4165
  if (url && !failed) {
3994
4166
  return /* @__PURE__ */ jsx11("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
3995
4167
  }
@@ -3997,7 +4169,7 @@ function Crest2({ url, name, kind }) {
3997
4169
  }
3998
4170
 
3999
4171
  // src/components/PinToggle.tsx
4000
- import { useCallback as useCallback13, useState as useState17 } from "react";
4172
+ import { useCallback as useCallback15, useState as useState19 } from "react";
4001
4173
  import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
4002
4174
  var PIN_GLYPHS = {
4003
4175
  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" },
@@ -4005,8 +4177,8 @@ var PIN_GLYPHS = {
4005
4177
  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" }
4006
4178
  };
4007
4179
  function PinToggle({ pin, monitor, ui, market }) {
4008
- const [toast, setToast] = useState17(null);
4009
- const dismiss = useCallback13(() => setToast(null), []);
4180
+ const [toast, setToast] = useState19(null);
4181
+ const dismiss = useCallback15(() => setToast(null), []);
4010
4182
  const log = useEventLog();
4011
4183
  if (!monitor || !monitor.enabled) return null;
4012
4184
  const key = pinKey(pin);
@@ -4063,11 +4235,11 @@ function PinToggle({ pin, monitor, ui, market }) {
4063
4235
  }
4064
4236
 
4065
4237
  // src/components/PriceHistoryButton.tsx
4066
- import { useCallback as useCallback14, useState as useState18 } from "react";
4238
+ import { useCallback as useCallback16, useState as useState20 } from "react";
4067
4239
  import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
4068
4240
  function PriceHistoryButton({ selection, monitor, ui }) {
4069
- const [toast, setToast] = useState18(null);
4070
- const dismiss = useCallback14(() => setToast(null), []);
4241
+ const [toast, setToast] = useState20(null);
4242
+ const dismiss = useCallback16(() => setToast(null), []);
4071
4243
  const log = useEventLog();
4072
4244
  if (!monitor || !monitor.enabled) return null;
4073
4245
  const name = joinSelection(selection.selectionLabel ?? void 0, selection.line ?? void 0);
@@ -4182,15 +4354,15 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
4182
4354
  }
4183
4355
 
4184
4356
  // src/components/AddAllToSlipButton.tsx
4185
- import { useCallback as useCallback15, useState as useState19 } from "react";
4357
+ import { useCallback as useCallback17, useState as useState21 } from "react";
4186
4358
  import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
4187
4359
  function AddAllToSlipButton({ legs, slip, ui }) {
4188
4360
  const add = useSlipAdd(slip, ui);
4189
4361
  const slipState = useSlipState();
4190
- const [pending, setPending] = useState19(false);
4191
- const [settledLocal, setSettledLocal] = useState19({});
4192
- const [toast, setToast] = useState19(null);
4193
- const dismiss = useCallback15(() => setToast(null), []);
4362
+ const [pending, setPending] = useState21(false);
4363
+ const [settledLocal, setSettledLocal] = useState21({});
4364
+ const [toast, setToast] = useState21(null);
4365
+ const dismiss = useCallback17(() => setToast(null), []);
4194
4366
  if (!ui || !slip.onAddToSlip || legs.length < 2) return null;
4195
4367
  const settled = slipState ? slipState.settled : settledLocal;
4196
4368
  const open = legs.filter((leg) => !settled[leg.matchOddsId]);
@@ -4300,7 +4472,7 @@ function ComboCardList({ cards, ui, slip, monitor }) {
4300
4472
  }
4301
4473
 
4302
4474
  // src/components/MarketOddsCardList.tsx
4303
- import { useEffect as useEffect17, useState as useState20 } from "react";
4475
+ import { useEffect as useEffect18, useState as useState22 } from "react";
4304
4476
 
4305
4477
  // src/components/AllMarketsButton.tsx
4306
4478
  import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
@@ -4363,7 +4535,7 @@ function fmtHhMm(iso, locale) {
4363
4535
  return new Date(iso).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", hour12: false });
4364
4536
  }
4365
4537
  function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
4366
- const [open, setOpen] = useState20(false);
4538
+ const [open, setOpen] = useState22(false);
4367
4539
  const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
4368
4540
  const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
4369
4541
  const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
@@ -4373,9 +4545,9 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
4373
4545
  const asOfMs = live ? new Date(live.asOfUtc).getTime() : NaN;
4374
4546
  const isStale = live != null && !isClosed && (vm.awaitingLiveUpdate === true || Date.now() - asOfMs > STALE_AFTER_MS);
4375
4547
  const staleTime = isStale && live ? fmtHhMm(live.asOfUtc, ui?.locale ?? "en") : null;
4376
- const [, setStaleTick] = useState20(0);
4548
+ const [, setStaleTick] = useState22(0);
4377
4549
  const watchStale = live != null && !isClosed && !isStale;
4378
- useEffect17(() => {
4550
+ useEffect18(() => {
4379
4551
  if (!watchStale) return;
4380
4552
  const id = window.setTimeout(() => setStaleTick((n) => n + 1), Math.max(0, asOfMs + STALE_AFTER_MS - Date.now()) + 1);
4381
4553
  return () => window.clearTimeout(id);
@@ -4429,7 +4601,7 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
4429
4601
  ] }) : null
4430
4602
  ] }) : null
4431
4603
  ] }),
4432
- vm.statText && !hideHeader && !pinRef ? /* @__PURE__ */ jsx18("div", { className: "ss-w-mo-stat", children: vm.statText }) : null,
4604
+ !hideHeader && !pinRef ? (vm.statTexts && vm.statTexts.length > 0 ? vm.statTexts : vm.statText ? [vm.statText] : []).map((text, i) => /* @__PURE__ */ jsx18("div", { className: "ss-w-mo-stat", children: text }, i)) : null,
4433
4605
  isClosed ? /* @__PURE__ */ jsx18("div", { className: "ss-w-mo-closed", children: closedReason === "suspended" ? /* @__PURE__ */ jsx18("span", { children: ui?.liveCard.suspended ?? "Market suspended" }) : closedReason === "no_live_price" ? /* @__PURE__ */ jsx18("span", { children: ui?.liveCard.noPrice ?? "No live price available" }) : closedReason === "full_time" ? /* @__PURE__ */ jsx18("span", { children: ui?.liveCard.fullTime ?? "Full time" }) : null }) : /* @__PURE__ */ jsxs14(Fragment2, { children: [
4434
4606
  /* @__PURE__ */ jsxs14("div", { className: "ss-w-mo-rows", children: [
4435
4607
  vm.mainRows.map((row) => /* @__PURE__ */ jsx18(OddsRow, { vm, row, ui, slip, inSlipIds, history, suppressSlip: isStale }, row.key)),
@@ -4454,7 +4626,7 @@ function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds, hideHeader, p
4454
4626
  }
4455
4627
 
4456
4628
  // src/components/CompactOddsList.tsx
4457
- import { useEffect as useEffect18, useRef as useRef16, useState as useState21 } from "react";
4629
+ import { useEffect as useEffect19, useRef as useRef18, useState as useState23 } from "react";
4458
4630
 
4459
4631
  // src/compactList.ts
4460
4632
  var COMPACT_MIN_CARDS = 3;
@@ -4568,11 +4740,11 @@ function Row({ row, columns, ui, slip, monitor, rowRef }) {
4568
4740
  ] });
4569
4741
  }
4570
4742
  function CompactOddsList({ list, ui, slip, monitor }) {
4571
- const [shown, setShown] = useState21(COMPACT_PAGE);
4743
+ const [shown, setShown] = useState23(COMPACT_PAGE);
4572
4744
  const hidden = list.rowCount - shown;
4573
- const [focusIndex, setFocusIndex] = useState21(null);
4574
- const focusRef = useRef16(null);
4575
- useEffect18(() => {
4745
+ const [focusIndex, setFocusIndex] = useState23(null);
4746
+ const focusRef = useRef18(null);
4747
+ useEffect19(() => {
4576
4748
  if (focusIndex !== null) focusRef.current?.focus();
4577
4749
  }, [focusIndex]);
4578
4750
  let left = shown;
@@ -4877,7 +5049,7 @@ function FixtureCard({ card }) {
4877
5049
  }
4878
5050
 
4879
5051
  // src/components/dashboard/CountdownCard.tsx
4880
- import { Fragment as Fragment6, useEffect as useEffect19, useState as useState22 } from "react";
5052
+ import { Fragment as Fragment6, useEffect as useEffect20, useState as useState24 } from "react";
4881
5053
  import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
4882
5054
  var DAY_MS = 864e5;
4883
5055
  function remainingSegments(kickoffUnix, nowMs, withSeconds) {
@@ -4896,12 +5068,12 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
4896
5068
  function CountdownCard({ card }) {
4897
5069
  const { data } = card;
4898
5070
  const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
4899
- const [nowMs, setNowMs] = useState22(() => Date.now());
4900
- const [reduced] = useState22(
5071
+ const [nowMs, setNowMs] = useState24(() => Date.now());
5072
+ const [reduced] = useState24(
4901
5073
  () => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
4902
5074
  );
4903
5075
  const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
4904
- useEffect19(() => {
5076
+ useEffect20(() => {
4905
5077
  if (reduced) return;
4906
5078
  const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
4907
5079
  return () => window.clearInterval(id);
@@ -4920,7 +5092,7 @@ function CountdownCard({ card }) {
4920
5092
  }
4921
5093
 
4922
5094
  // src/components/dashboard/InjuriesCard.tsx
4923
- import { useState as useState23 } from "react";
5095
+ import { useState as useState25 } from "react";
4924
5096
  import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
4925
5097
  var SHOWN = 3;
4926
5098
  function ColHead({ name, crestUrl }) {
@@ -4943,7 +5115,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
4943
5115
  }
4944
5116
  function InjuriesCard({ card, ui }) {
4945
5117
  const { data } = card;
4946
- const [expanded, setExpanded] = useState23(false);
5118
+ const [expanded, setExpanded] = useState25(false);
4947
5119
  const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
4948
5120
  const limit = expanded ? void 0 : SHOWN;
4949
5121
  const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
@@ -5049,7 +5221,7 @@ function LinksCard({ card }) {
5049
5221
  }
5050
5222
 
5051
5223
  // src/components/dashboard/PostMatchResultCard.tsx
5052
- import { useState as useState24 } from "react";
5224
+ import { useState as useState26 } from "react";
5053
5225
  import { jsx as jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
5054
5226
  function initials3(name) {
5055
5227
  return name.trim().slice(0, 3).toUpperCase();
@@ -5059,7 +5231,7 @@ function PostMatchCrest({
5059
5231
  name,
5060
5232
  side
5061
5233
  }) {
5062
- const [failed, setFailed] = useState24(false);
5234
+ const [failed, setFailed] = useState26(false);
5063
5235
  const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
5064
5236
  if (url && !failed) {
5065
5237
  return /* @__PURE__ */ jsx32("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -5258,10 +5430,10 @@ function RestingFormCard({ card }) {
5258
5430
  }
5259
5431
 
5260
5432
  // src/components/dashboard/LiveScoreCard.tsx
5261
- import { useRef as useRef17, useState as useState26 } from "react";
5433
+ import { useRef as useRef19, useState as useState28 } from "react";
5262
5434
 
5263
5435
  // src/useLiveClock.ts
5264
- import { useEffect as useEffect20, useState as useState25 } from "react";
5436
+ import { useEffect as useEffect21, useState as useState27 } from "react";
5265
5437
  var TICK_MS = 6e4;
5266
5438
  var MAX_LIVE_TICK_MINUTES = 15;
5267
5439
  function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
@@ -5270,10 +5442,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
5270
5442
  return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
5271
5443
  }
5272
5444
  function useLiveClock(minute, clockRunning, receivedAtMs) {
5273
- const [displayMinute, setDisplayMinute] = useState25(
5445
+ const [displayMinute, setDisplayMinute] = useState27(
5274
5446
  () => computeDisplayMinute(minute, clockRunning, receivedAtMs)
5275
5447
  );
5276
- useEffect20(() => {
5448
+ useEffect21(() => {
5277
5449
  setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
5278
5450
  if (!clockRunning) return;
5279
5451
  const id = window.setInterval(() => {
@@ -5290,7 +5462,7 @@ function initials5(name) {
5290
5462
  return name.trim().slice(0, 3).toUpperCase();
5291
5463
  }
5292
5464
  function LiveCrest({ url, name, side }) {
5293
- const [failed, setFailed] = useState26(false);
5465
+ const [failed, setFailed] = useState28(false);
5294
5466
  const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
5295
5467
  if (url && !failed) {
5296
5468
  return /* @__PURE__ */ jsx41("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -5309,7 +5481,7 @@ function LiveScoreCard({
5309
5481
  }) {
5310
5482
  const { data } = card;
5311
5483
  const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
5312
- const seedRef = useRef17(null);
5484
+ const seedRef = useRef19(null);
5313
5485
  if (!seedRef.current || seedRef.current.key !== seedKey) {
5314
5486
  seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
5315
5487
  }
@@ -5349,7 +5521,7 @@ function LiveScoreCard({
5349
5521
  }
5350
5522
 
5351
5523
  // src/components/dashboard/LiveTimelineCard.tsx
5352
- import { useState as useState27 } from "react";
5524
+ import { useState as useState29 } from "react";
5353
5525
  import { jsx as jsx42, jsxs as jsxs38 } from "react/jsx-runtime";
5354
5526
  var SHOWN2 = 3;
5355
5527
  function EventIcon({ type }) {
@@ -5391,7 +5563,7 @@ function EventRow({ e }) {
5391
5563
  ] });
5392
5564
  }
5393
5565
  function LiveTimelineCard({ card, ui }) {
5394
- const [expanded, setExpanded] = useState27(false);
5566
+ const [expanded, setExpanded] = useState29(false);
5395
5567
  const events = card.data.events;
5396
5568
  if (!events || events.length === 0) return null;
5397
5569
  const sorted = [...events].sort((a, b) => b.minute - a.minute);
@@ -5633,11 +5805,11 @@ function turnAnchor(messages) {
5633
5805
  }
5634
5806
  function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
5635
5807
  const { state, send } = controller;
5636
- const listRef = useRef18(null);
5637
- const endRef = useRef18(null);
5638
- const pinnedRef = useRef18(true);
5639
- const anchoredTurnRef = useRef18(null);
5640
- useEffect21(() => {
5808
+ const listRef = useRef20(null);
5809
+ const endRef = useRef20(null);
5810
+ const pinnedRef = useRef20(true);
5811
+ const anchoredTurnRef = useRef20(null);
5812
+ useEffect22(() => {
5641
5813
  const anchor = turnAnchor(state.messages);
5642
5814
  const list = listRef.current;
5643
5815
  if (anchor && anchor.turnId !== anchoredTurnRef.current) {
@@ -5694,13 +5866,13 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
5694
5866
  }
5695
5867
 
5696
5868
  // src/components/ChatInput.tsx
5697
- import { forwardRef, useEffect as useEffect22, useImperativeHandle, useRef as useRef19, useState as useState28 } from "react";
5869
+ import { forwardRef, useEffect as useEffect23, useImperativeHandle, useRef as useRef21, useState as useState30 } from "react";
5698
5870
  import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
5699
5871
  var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message", disabled = false, onType }, ref) {
5700
- const [value, setValue] = useState28("");
5701
- const textareaRef = useRef19(null);
5702
- const stopRef = useRef19(null);
5703
- const textBoxWantsFocusRef = useRef19(false);
5872
+ const [value, setValue] = useState30("");
5873
+ const textareaRef = useRef21(null);
5874
+ const stopRef = useRef21(null);
5875
+ const textBoxWantsFocusRef = useRef21(false);
5704
5876
  const submit = () => {
5705
5877
  if (disabled) return;
5706
5878
  const t = value.trim();
@@ -5726,7 +5898,7 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
5726
5898
  stopRef.current?.focus();
5727
5899
  }
5728
5900
  }), []);
5729
- useEffect22(() => {
5901
+ useEffect23(() => {
5730
5902
  if (streaming || disabled || !textBoxWantsFocusRef.current) return;
5731
5903
  textBoxWantsFocusRef.current = false;
5732
5904
  const box = textareaRef.current;
@@ -5758,6 +5930,7 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
5758
5930
  });
5759
5931
 
5760
5932
  // src/components/TabBar.tsx
5933
+ import { useEffect as useEffect24, useRef as useRef22 } from "react";
5761
5934
  import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
5762
5935
  function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled, clubEnabled }) {
5763
5936
  const tabs = [
@@ -5773,8 +5946,16 @@ function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, game
5773
5946
  ],
5774
5947
  ...gamesEnabled ? [{ tab: "games", label: ui.tabGames, count: 0, dot: false }] : []
5775
5948
  ];
5949
+ const listRef = useRef22(null);
5950
+ const activeTab = monitor.activeTab;
5951
+ useEffect24(() => {
5952
+ const el = listRef.current?.querySelector("[data-on]");
5953
+ if (!el || typeof el.scrollIntoView !== "function") return;
5954
+ const reduce = typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
5955
+ el.scrollIntoView({ block: "nearest", inline: "nearest", behavior: reduce ? "auto" : "smooth" });
5956
+ }, [activeTab]);
5776
5957
  if (tabs.length < 2) return null;
5777
- return /* @__PURE__ */ jsx50("div", { className: "ss-w-tabs", role: "tablist", children: tabs.map(({ tab, label, count, dot }) => {
5958
+ return /* @__PURE__ */ jsx50("div", { className: "ss-w-tabs", role: "tablist", ref: listRef, children: tabs.map(({ tab, label, count, dot }) => {
5778
5959
  const active = monitor.activeTab === tab;
5779
5960
  return /* @__PURE__ */ jsxs45(
5780
5961
  "button",
@@ -5851,10 +6032,10 @@ function MarketAccordion({ match, monitor, ui, slip }) {
5851
6032
  }
5852
6033
 
5853
6034
  // src/components/LiveFactBlock.tsx
5854
- import { useState as useState29 } from "react";
6035
+ import { useState as useState31 } from "react";
5855
6036
  import { jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
5856
6037
  function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
5857
- const [expanded, setExpanded] = useState29(false);
6038
+ const [expanded, setExpanded] = useState31(false);
5858
6039
  const [current, ...earlier] = facts;
5859
6040
  if (!current) return null;
5860
6041
  const m = current.market;
@@ -6120,7 +6301,7 @@ function OddsPanel({ monitor, ui, slip }) {
6120
6301
  }
6121
6302
 
6122
6303
  // src/components/TodayPanel.tsx
6123
- import { useEffect as useEffect24, useId as useId2, useMemo as useMemo4, useState as useState32 } from "react";
6304
+ import { useEffect as useEffect26, useId as useId2, useMemo as useMemo4, useState as useState34 } from "react";
6124
6305
 
6125
6306
  // src/placement.ts
6126
6307
  function placeLeagues(visible, pinnedMatchIds) {
@@ -6183,11 +6364,11 @@ function matchingFixtures(group, query) {
6183
6364
  }
6184
6365
 
6185
6366
  // src/useStarTap.ts
6186
- import { useCallback as useCallback16, useRef as useRef20, useState as useState30 } from "react";
6367
+ import { useCallback as useCallback18, useRef as useRef23, useState as useState32 } from "react";
6187
6368
  function useStarTap(starLeague) {
6188
- const [pendingId, setPendingId] = useState30(null);
6189
- const pendingRef = useRef20(null);
6190
- const tap = useCallback16(async (competitionId, next) => {
6369
+ const [pendingId, setPendingId] = useState32(null);
6370
+ const pendingRef = useRef23(null);
6371
+ const tap = useCallback18(async (competitionId, next) => {
6191
6372
  if (pendingRef.current !== null) return false;
6192
6373
  pendingRef.current = competitionId;
6193
6374
  setPendingId(competitionId);
@@ -6246,7 +6427,7 @@ function LeagueTile({ group, starClickable: starClickable2, disambiguate, onOpen
6246
6427
  }
6247
6428
 
6248
6429
  // src/components/LeagueDetail.tsx
6249
- import { useEffect as useEffect23, useState as useState31 } from "react";
6430
+ import { useEffect as useEffect25, useState as useState33 } from "react";
6250
6431
 
6251
6432
  // src/components/FixtureRow.tsx
6252
6433
  import { jsx as jsx56, jsxs as jsxs51 } from "react/jsx-runtime";
@@ -6281,11 +6462,11 @@ function FixtureRow({ match, state, stale, ui, monitor }) {
6281
6462
  import { jsx as jsx57, jsxs as jsxs52 } from "react/jsx-runtime";
6282
6463
  var STAR_PATH2 = "M12 2.5l2.9 5.9 6.5.95-4.7 4.58 1.1 6.47L12 17.35 6.1 20.4l1.1-6.47L2.5 9.35l6.5-.95z";
6283
6464
  function LeagueDetail({ group, position, states, stale, ui, monitor, starTap, onBack, onPrev, onNext }) {
6284
- const [toast, setToast] = useState31(null);
6285
- useEffect23(() => {
6465
+ const [toast, setToast] = useState33(null);
6466
+ useEffect25(() => {
6286
6467
  setToast(null);
6287
6468
  }, [group.competitionId]);
6288
- useEffect23(() => {
6469
+ useEffect25(() => {
6289
6470
  if (toast === null) return;
6290
6471
  const id = setTimeout(() => setToast(null), 4e3);
6291
6472
  return () => clearTimeout(id);
@@ -6417,7 +6598,7 @@ function LeagueRowGroup({ group, states, stale, cap, starClickable: starClickabl
6417
6598
  }
6418
6599
 
6419
6600
  // src/components/games/ui/SearchField.tsx
6420
- import { useCallback as useCallback17, useRef as useRef21 } from "react";
6601
+ import { useCallback as useCallback19, useRef as useRef24 } from "react";
6421
6602
 
6422
6603
  // src/components/games/ui/icons.tsx
6423
6604
  import { jsx as jsx59 } from "react/jsx-runtime";
@@ -6456,8 +6637,8 @@ var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx59("path", { d:
6456
6637
  // src/components/games/ui/SearchField.tsx
6457
6638
  import { jsx as jsx60, jsxs as jsxs54 } from "react/jsx-runtime";
6458
6639
  function SearchField({ id, label, labelHidden = false, placeholder, value, onChange, disabled, inputRef, onKeyDown, clearLabel }) {
6459
- const localRef = useRef21(null);
6460
- const setInputRef = useCallback17((node) => {
6640
+ const localRef = useRef24(null);
6641
+ const setInputRef = useCallback19((node) => {
6461
6642
  localRef.current = node;
6462
6643
  if (typeof inputRef === "function") inputRef(node);
6463
6644
  else if (inputRef) inputRef.current = node;
@@ -6502,10 +6683,10 @@ import { Fragment as Fragment7, jsx as jsx61, jsxs as jsxs55 } from "react/jsx-r
6502
6683
  function TodayPanel({ discovery, ui, monitor }) {
6503
6684
  const { groups, states, stale, starLeague } = discovery;
6504
6685
  const searchId = useId2();
6505
- const [query, setQuery] = useState32("");
6506
- const [selectedCompetitionId, setSelectedCompetitionId] = useState32(null);
6507
- const [toast, setToast] = useState32(null);
6508
- useEffect24(() => {
6686
+ const [query, setQuery] = useState34("");
6687
+ const [selectedCompetitionId, setSelectedCompetitionId] = useState34(null);
6688
+ const [toast, setToast] = useState34(null);
6689
+ useEffect26(() => {
6509
6690
  if (toast === null) return;
6510
6691
  const id = setTimeout(() => setToast(null), 4e3);
6511
6692
  return () => clearTimeout(id);
@@ -6551,7 +6732,7 @@ function TodayPanel({ discovery, ui, monitor }) {
6551
6732
  }
6552
6733
  const openIndex = selectedCompetitionId === null ? -1 : placement.order.findIndex((g) => g.competitionId === selectedCompetitionId);
6553
6734
  const openGroup = openIndex === -1 ? void 0 : placement.order[openIndex];
6554
- useEffect24(() => {
6735
+ useEffect26(() => {
6555
6736
  if (selectedCompetitionId !== null && openGroup === void 0) setSelectedCompetitionId(null);
6556
6737
  }, [selectedCompetitionId, openGroup]);
6557
6738
  const liveRows = stale ? [] : visibleGroups.flatMap((group) => group.matches.filter((m) => isTreatedLive(states[m.matchId], stale)).map((match) => ({ match, rank: group.rank }))).sort((a, b) => a.rank - b.rank);
@@ -6698,7 +6879,7 @@ function TodayPanel({ discovery, ui, monitor }) {
6698
6879
  }
6699
6880
 
6700
6881
  // src/components/GamesPanel.tsx
6701
- import { useEffect as useEffect28, useState as useState47 } from "react";
6882
+ import { useEffect as useEffect30, useState as useState49 } from "react";
6702
6883
 
6703
6884
  // src/components/GamesLoginWall.tsx
6704
6885
  import { jsx as jsx62 } from "react/jsx-runtime";
@@ -6707,7 +6888,7 @@ function GamesLoginWall({ ui }) {
6707
6888
  }
6708
6889
 
6709
6890
  // src/components/GamesHub.tsx
6710
- import { useEffect as useEffect25, useState as useState33 } from "react";
6891
+ import { useEffect as useEffect27, useState as useState35 } from "react";
6711
6892
 
6712
6893
  // src/components/games/ui/gameMeta.ts
6713
6894
  function prettifyGameId(gameId) {
@@ -6858,8 +7039,8 @@ function pickHeroGame(games) {
6858
7039
  }
6859
7040
  var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
6860
7041
  function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
6861
- const [, setTick] = useState33(0);
6862
- useEffect25(() => {
7042
+ const [, setTick] = useState35(0);
7043
+ useEffect27(() => {
6863
7044
  const id = setInterval(() => setTick((t) => t + 1), 6e4);
6864
7045
  return () => clearInterval(id);
6865
7046
  }, []);
@@ -6919,10 +7100,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
6919
7100
  }
6920
7101
 
6921
7102
  // src/components/GameScreenHost.tsx
6922
- import { useEffect as useEffect27, useRef as useRef24, useState as useState45 } from "react";
7103
+ import { useEffect as useEffect29, useRef as useRef27, useState as useState47 } from "react";
6923
7104
 
6924
7105
  // src/useGamePlay.ts
6925
- import { useCallback as useCallback18, useRef as useRef22, useState as useState34 } from "react";
7106
+ import { useCallback as useCallback20, useRef as useRef25, useState as useState36 } from "react";
6926
7107
  function toSubmitResult(payload) {
6927
7108
  return {
6928
7109
  // 'pending' means the play is recorded but awaiting resolution (fixture games)
@@ -6934,17 +7115,17 @@ function toSubmitResult(payload) {
6934
7115
  };
6935
7116
  }
6936
7117
  function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
6937
- const [result, setResult] = useState34(null);
6938
- const [submitting, setSubmitting] = useState34(false);
6939
- const [rawStatus, setRawStatus] = useState34(null);
6940
- const inFlightRef = useRef22(false);
6941
- const convRef = useRef22(conversation);
7118
+ const [result, setResult] = useState36(null);
7119
+ const [submitting, setSubmitting] = useState36(false);
7120
+ const [rawStatus, setRawStatus] = useState36(null);
7121
+ const inFlightRef = useRef25(false);
7122
+ const convRef = useRef25(conversation);
6942
7123
  convRef.current = conversation;
6943
- const optsRef = useRef22({ gameId, gameDay, fixtureId, locale, refresh });
7124
+ const optsRef = useRef25({ gameId, gameDay, fixtureId, locale, refresh });
6944
7125
  optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
6945
- const resultRef = useRef22(null);
7126
+ const resultRef = useRef25(null);
6946
7127
  resultRef.current = result;
6947
- const refetch = useCallback18(async () => {
7128
+ const refetch = useCallback20(async () => {
6948
7129
  const conv = convRef.current;
6949
7130
  if (!conv) return;
6950
7131
  const opts = optsRef.current;
@@ -6960,7 +7141,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
6960
7141
  } catch {
6961
7142
  }
6962
7143
  }, []);
6963
- const submit = useCallback18(async (answerJson) => {
7144
+ const submit = useCallback20(async (answerJson) => {
6964
7145
  const conv = convRef.current;
6965
7146
  if (!conv || inFlightRef.current) return;
6966
7147
  inFlightRef.current = true;
@@ -6987,14 +7168,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
6987
7168
  setSubmitting(false);
6988
7169
  }
6989
7170
  }, [refetch]);
6990
- const hydrate = useCallback18(() => {
7171
+ const hydrate = useCallback20(() => {
6991
7172
  void refetch();
6992
7173
  }, [refetch]);
6993
7174
  return { result, submitting, submit, hydrate, rawStatus };
6994
7175
  }
6995
7176
 
6996
7177
  // src/components/games/MysteryTigerGame.tsx
6997
- import { useState as useState36, useId as useId3 } from "react";
7178
+ import { useState as useState38, useId as useId3 } from "react";
6998
7179
 
6999
7180
  // src/components/games/nationFlags.ts
7000
7181
  var FLAGS = {
@@ -7205,7 +7386,7 @@ function isNationCode(flag) {
7205
7386
  }
7206
7387
 
7207
7388
  // src/components/games/PlayerAvatar.tsx
7208
- import { useState as useState35 } from "react";
7389
+ import { useState as useState37 } from "react";
7209
7390
  import { jsx as jsx67 } from "react/jsx-runtime";
7210
7391
  function initialsOf(name) {
7211
7392
  const parts = name.trim().split(/\s+/).filter(Boolean);
@@ -7223,7 +7404,7 @@ function PlayerAvatar({
7223
7404
  imagePath,
7224
7405
  className
7225
7406
  }) {
7226
- const [failed, setFailed] = useState35(false);
7407
+ const [failed, setFailed] = useState37(false);
7227
7408
  const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
7228
7409
  return /* @__PURE__ */ jsx67("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ jsx67("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ jsx67("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
7229
7410
  }
@@ -7464,7 +7645,7 @@ function MysteryTigerGame({
7464
7645
  onBack
7465
7646
  }) {
7466
7647
  const t = ui.games.mysteryTiger;
7467
- const [query, setQuery] = useState36("");
7648
+ const [query, setQuery] = useState38("");
7468
7649
  const inputId = useId3();
7469
7650
  const clientState = parseClientState(result?.clientStateJson);
7470
7651
  const guessResults = clientState?.guessResults ?? [];
@@ -7726,13 +7907,13 @@ function HigherOrLowerGame({
7726
7907
  }
7727
7908
 
7728
7909
  // src/components/games/CareerPathGame.tsx
7729
- import { useState as useState38, useId as useId4 } from "react";
7910
+ import { useState as useState40, useId as useId4 } from "react";
7730
7911
 
7731
7912
  // src/components/games/ui/CrestShield.tsx
7732
- import { useState as useState37 } from "react";
7913
+ import { useState as useState39 } from "react";
7733
7914
  import { jsx as jsx78 } from "react/jsx-runtime";
7734
7915
  function CrestShield({ src, name, size = 28 }) {
7735
- const [failed, setFailed] = useState37(false);
7916
+ const [failed, setFailed] = useState39(false);
7736
7917
  if (src && !isPlaceholderImage(src) && !failed) {
7737
7918
  return /* @__PURE__ */ jsx78("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
7738
7919
  }
@@ -7764,7 +7945,7 @@ function CareerPathGame({
7764
7945
  }) {
7765
7946
  const s = ui.games.careerPath;
7766
7947
  const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
7767
- const [query, setQuery] = useState38("");
7948
+ const [query, setQuery] = useState40("");
7768
7949
  const inputId = useId4();
7769
7950
  const clientState = parseClientState3(result?.clientStateJson);
7770
7951
  const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
@@ -7871,7 +8052,7 @@ function CareerPathGame({
7871
8052
  }
7872
8053
 
7873
8054
  // src/components/games/BeatTheGridGame.tsx
7874
- import React, { useEffect as useEffect26, useId as useId5, useRef as useRef23, useState as useState39 } from "react";
8055
+ import React, { useEffect as useEffect28, useId as useId5, useRef as useRef26, useState as useState41 } from "react";
7875
8056
 
7876
8057
  // src/components/games/ui/OptionList.tsx
7877
8058
  import { jsx as jsx80 } from "react/jsx-runtime";
@@ -7960,10 +8141,10 @@ function SearchSheet({
7960
8141
  ui
7961
8142
  }) {
7962
8143
  const s = ui.games.beatTheGrid;
7963
- const [query, setQuery] = useState39("");
8144
+ const [query, setQuery] = useState41("");
7964
8145
  const inputId = useId5();
7965
- const inputRef = useRef23(null);
7966
- useEffect26(() => {
8146
+ const inputRef = useRef26(null);
8147
+ useEffect28(() => {
7967
8148
  inputRef.current?.focus();
7968
8149
  }, [row, col]);
7969
8150
  const filtered = playerPool.filter(
@@ -8028,7 +8209,7 @@ function BeatTheGridGame({
8028
8209
  }) {
8029
8210
  const s = ui.games.beatTheGrid;
8030
8211
  const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
8031
- const [activeCell, setActiveCell] = useState39(null);
8212
+ const [activeCell, setActiveCell] = useState41(null);
8032
8213
  const clientState = parseClientState4(result?.clientStateJson);
8033
8214
  const filledCells = clientState?.cells ?? [];
8034
8215
  const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
@@ -8183,7 +8364,7 @@ function BeatTheGridGame({
8183
8364
  }
8184
8365
 
8185
8366
  // src/components/games/GuessTheXiGame.tsx
8186
- import { useState as useState40, useId as useId6 } from "react";
8367
+ import { useState as useState42, useId as useId6 } from "react";
8187
8368
 
8188
8369
  // src/components/games/ui/PitchSvg.tsx
8189
8370
  import { Fragment as Fragment16, jsx as jsx82, jsxs as jsxs70 } from "react/jsx-runtime";
@@ -8272,7 +8453,7 @@ function GuessTheXiGame({
8272
8453
  onBack
8273
8454
  }) {
8274
8455
  const t = ui.games.guessTheXi;
8275
- const [query, setQuery] = useState40("");
8456
+ const [query, setQuery] = useState42("");
8276
8457
  const inputId = useId6();
8277
8458
  const clientState = parseClientState5(result?.clientStateJson);
8278
8459
  const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
@@ -8415,7 +8596,7 @@ function GuessTheXiGame({
8415
8596
  }
8416
8597
 
8417
8598
  // src/components/games/DailyQuizGame.tsx
8418
- import { useState as useState41 } from "react";
8599
+ import { useState as useState43 } from "react";
8419
8600
  import { Fragment as Fragment18, jsx as jsx84, jsxs as jsxs72 } from "react/jsx-runtime";
8420
8601
  function parseClientState6(json) {
8421
8602
  if (!json) return null;
@@ -8456,8 +8637,8 @@ function DailyQuizGame({
8456
8637
  }) {
8457
8638
  const s = ui.games.dailyQuiz;
8458
8639
  const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
8459
- const [selections, setSelections] = useState41(/* @__PURE__ */ new Map());
8460
- const [page, setPage] = useState41(0);
8640
+ const [selections, setSelections] = useState43(/* @__PURE__ */ new Map());
8641
+ const [page, setPage] = useState43(0);
8461
8642
  const clientState = parseClientState6(result?.clientStateJson);
8462
8643
  const results = clientState?.results ?? [];
8463
8644
  const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
@@ -8567,7 +8748,7 @@ function DailyQuizGame({
8567
8748
  }
8568
8749
 
8569
8750
  // src/components/games/MatchdayPredictorGame.tsx
8570
- import { useId as useId7, useState as useState42 } from "react";
8751
+ import { useId as useId7, useState as useState44 } from "react";
8571
8752
  import { jsx as jsx85, jsxs as jsxs73 } from "react/jsx-runtime";
8572
8753
  var SCORER_SEARCH_THRESHOLD = 9;
8573
8754
  function parseClientState7(json) {
@@ -8663,11 +8844,11 @@ function MatchdayPredictorGame({
8663
8844
  onBack
8664
8845
  }) {
8665
8846
  const t = ui.games.predictor;
8666
- const [homeScore, setHomeScore] = useState42(0);
8667
- const [awayScore, setAwayScore] = useState42(0);
8668
- const [firstScorerPlayerId, setFirstScorerPlayerId] = useState42(null);
8669
- const [lastEdited, setLastEdited] = useState42("home");
8670
- const [query, setQuery] = useState42("");
8847
+ const [homeScore, setHomeScore] = useState44(0);
8848
+ const [awayScore, setAwayScore] = useState44(0);
8849
+ const [firstScorerPlayerId, setFirstScorerPlayerId] = useState44(null);
8850
+ const [lastEdited, setLastEdited] = useState44("home");
8851
+ const [query, setQuery] = useState44("");
8671
8852
  const searchId = useId7();
8672
8853
  const clientState = parseClientState7(result?.clientStateJson);
8673
8854
  const alreadyPlayed = result?.alreadyPlayed === true;
@@ -8835,7 +9016,7 @@ function MatchdayPredictorGame({
8835
9016
  }
8836
9017
 
8837
9018
  // src/components/games/StartingXiGame.tsx
8838
- import { useId as useId8, useState as useState43 } from "react";
9019
+ import { useId as useId8, useState as useState45 } from "react";
8839
9020
  import { Fragment as Fragment19, jsx as jsx86, jsxs as jsxs74 } from "react/jsx-runtime";
8840
9021
  var POINTS_PER_STARTER = 8;
8841
9022
  var XI_SIZE = 11;
@@ -8879,9 +9060,9 @@ function StartingXiGame({
8879
9060
  lockAtUtc
8880
9061
  }) {
8881
9062
  const t = ui.games.startingXi;
8882
- const [slotPlayers, setSlotPlayers] = useState43(() => Array(XI_SIZE).fill(null));
8883
- const [active, setActive] = useState43(0);
8884
- const [query, setQuery] = useState43("");
9063
+ const [slotPlayers, setSlotPlayers] = useState45(() => Array(XI_SIZE).fill(null));
9064
+ const [active, setActive] = useState45(0);
9065
+ const [query, setQuery] = useState45("");
8885
9066
  const searchId = useId8();
8886
9067
  const clientState = parseClientState8(result?.clientStateJson);
8887
9068
  const alreadyPlayed = result?.alreadyPlayed === true;
@@ -9021,7 +9202,7 @@ function StartingXiGame({
9021
9202
  }
9022
9203
 
9023
9204
  // src/components/games/StatLadderGame.tsx
9024
- import { useId as useId9, useState as useState44 } from "react";
9205
+ import { useId as useId9, useState as useState46 } from "react";
9025
9206
  import { jsx as jsx87, jsxs as jsxs75 } from "react/jsx-runtime";
9026
9207
  function ladderClue(ladder) {
9027
9208
  const mystery = ladder.find((r) => r.rank === 2);
@@ -9058,8 +9239,8 @@ function StatLadderGame({
9058
9239
  onBack
9059
9240
  }) {
9060
9241
  const t = ui.games.statLadder;
9061
- const [query, setQuery] = useState44("");
9062
- const [selectedId, setSelectedId] = useState44(null);
9242
+ const [query, setQuery] = useState46("");
9243
+ const [selectedId, setSelectedId] = useState46(null);
9063
9244
  const searchId = useId9();
9064
9245
  const clientState = parseClientState9(result?.clientStateJson);
9065
9246
  const revealed = clientState != null;
@@ -9266,8 +9447,8 @@ function GameScreenHost({
9266
9447
  ui
9267
9448
  }) {
9268
9449
  const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
9269
- const [configJson, setConfigJson] = useState45(null);
9270
- useEffect27(() => {
9450
+ const [configJson, setConfigJson] = useState47(null);
9451
+ useEffect29(() => {
9271
9452
  setConfigJson(null);
9272
9453
  if (!conversation) return;
9273
9454
  let cancelled = false;
@@ -9290,12 +9471,12 @@ function GameScreenHost({
9290
9471
  fixtureId: fixtureId || void 0,
9291
9472
  locale: ui.games.lang
9292
9473
  });
9293
- useEffect27(() => {
9474
+ useEffect29(() => {
9294
9475
  if (conversation) hydrate();
9295
9476
  }, [conversation, gameId]);
9296
- const hydrateRef = useRef24(hydrate);
9477
+ const hydrateRef = useRef27(hydrate);
9297
9478
  hydrateRef.current = hydrate;
9298
- useEffect27(() => {
9479
+ useEffect29(() => {
9299
9480
  if (!FIXTURE_GAME_IDS.has(gameId)) return;
9300
9481
  if (rawStatus !== "pending") return;
9301
9482
  const timerId = setInterval(() => {
@@ -9408,7 +9589,7 @@ function GameScreenHost({
9408
9589
  }
9409
9590
 
9410
9591
  // src/components/Leaderboard.tsx
9411
- import { useState as useState46 } from "react";
9592
+ import { useState as useState48 } from "react";
9412
9593
 
9413
9594
  // src/components/LeaderboardRow.tsx
9414
9595
  import { jsx as jsx90, jsxs as jsxs77 } from "react/jsx-runtime";
@@ -9493,7 +9674,7 @@ function Leaderboard({
9493
9674
  ui,
9494
9675
  onPlay
9495
9676
  }) {
9496
- const [segment, setSegment] = useState46("weekly");
9677
+ const [segment, setSegment] = useState48("weekly");
9497
9678
  const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
9498
9679
  const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
9499
9680
  const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
@@ -9596,9 +9777,9 @@ function GamesPanel({
9596
9777
  leaderboardLoading,
9597
9778
  refreshHub
9598
9779
  }) {
9599
- const [selected, setSelected] = useState47(null);
9600
- const [segment, setSegment] = useState47("play");
9601
- useEffect28(() => {
9780
+ const [selected, setSelected] = useState49(null);
9781
+ const [segment, setSegment] = useState49("play");
9782
+ useEffect30(() => {
9602
9783
  ensureGamesFonts();
9603
9784
  }, []);
9604
9785
  if (!loggedIn) return /* @__PURE__ */ jsx94(GamesLoginWall, { ui });
@@ -9746,8 +9927,7 @@ function Standings({ standings, loading, ui }) {
9746
9927
  ] }, `${gi}-${group.table ?? "none"}`)) });
9747
9928
  }
9748
9929
 
9749
- // src/components/Squad.tsx
9750
- import { jsx as jsx97, jsxs as jsxs83 } from "react/jsx-runtime";
9930
+ // src/components/groupByPosition.ts
9751
9931
  function groupByPosition(players) {
9752
9932
  const groups = [];
9753
9933
  for (const p of players) {
@@ -9757,26 +9937,181 @@ function groupByPosition(players) {
9757
9937
  }
9758
9938
  return groups;
9759
9939
  }
9760
- function Squad({ squad, loading, ui }) {
9761
- if (squad === null && loading) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-list" });
9762
- if (squad === null || squad.length === 0) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-empty", children: ui.clubSquadEmpty });
9763
- return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-list", children: groupByPosition(squad).map((group, gi) => /* @__PURE__ */ jsxs83("div", { children: [
9764
- group.positionName && /* @__PURE__ */ jsx97("div", { className: "ss-w-club-eyebrow", children: group.positionName }),
9765
- group.items.map((p) => /* @__PURE__ */ jsxs83("div", { className: "ss-w-sq-row", children: [
9766
- /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-num", children: p.jerseyNumber ?? "" }),
9767
- /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-name", children: p.playerName })
9768
- ] }, p.playerId))
9769
- ] }, `${gi}-${group.positionName ?? "none"}`)) });
9940
+
9941
+ // src/components/labels.ts
9942
+ function positionLabel(ui, name) {
9943
+ switch (name) {
9944
+ case "Goalkeeper":
9945
+ return ui.positionGoalkeeper;
9946
+ case "Defender":
9947
+ return ui.positionDefender;
9948
+ case "Midfielder":
9949
+ return ui.positionMidfielder;
9950
+ case "Attacker":
9951
+ return ui.positionAttacker;
9952
+ default:
9953
+ return name;
9954
+ }
9955
+ }
9956
+ function footLabel(ui, foot) {
9957
+ const v = foot?.trim() ?? "";
9958
+ if (v === "" || v.toUpperCase() === "N/A") return null;
9959
+ switch (v.toLowerCase()) {
9960
+ case "right":
9961
+ return ui.footRight;
9962
+ case "left":
9963
+ return ui.footLeft;
9964
+ case "both":
9965
+ return ui.footBoth;
9966
+ default:
9967
+ return v;
9968
+ }
9969
+ }
9970
+
9971
+ // src/components/SquadStats.tsx
9972
+ import { jsx as jsx97, jsxs as jsxs83 } from "react/jsx-runtime";
9973
+ function SquadStats({ stats, loading, ui, onSelectPlayer }) {
9974
+ if (stats === null && loading) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-list" });
9975
+ if (stats === null || stats.length === 0) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-empty", children: ui.clubSquadStatsEmpty });
9976
+ return /* @__PURE__ */ jsxs83("div", { className: "ss-w-mon-list", children: [
9977
+ /* @__PURE__ */ jsxs83("div", { className: "ss-w-sq-row ss-w-sq-head", "aria-hidden": "true", children: [
9978
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-num" }),
9979
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-name" }),
9980
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: ui.statColApps }),
9981
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: ui.statColGoals }),
9982
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: ui.statColAssists }),
9983
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: ui.statColRating })
9984
+ ] }),
9985
+ groupByPosition(stats).map((group, gi) => /* @__PURE__ */ jsxs83("div", { children: [
9986
+ group.positionName && /* @__PURE__ */ jsx97("div", { className: "ss-w-club-eyebrow", children: positionLabel(ui, group.positionName) }),
9987
+ group.items.map((p) => /* @__PURE__ */ jsxs83("button", { type: "button", className: "ss-w-sq-row ss-w-sq-tap", onClick: () => onSelectPlayer(p.playerId), children: [
9988
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-num", children: p.jerseyNumber ?? "" }),
9989
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-name ss-w-sq-name-1", children: p.playerName }),
9990
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: p.appearances }),
9991
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: p.goals }),
9992
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: p.assists }),
9993
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: p.averageRating === null ? "\u2014" : p.averageRating.toFixed(1) })
9994
+ ] }, p.playerId))
9995
+ ] }, `${gi}-${group.positionName ?? "none"}`))
9996
+ ] });
9997
+ }
9998
+
9999
+ // src/components/Squad.tsx
10000
+ import { Fragment as Fragment21, jsx as jsx98, jsxs as jsxs84 } from "react/jsx-runtime";
10001
+ function Squad({ squad, loading, ui, view, onToggleView, stats, statsLoading, onSelectPlayer }) {
10002
+ const toggle = /* @__PURE__ */ jsx98("div", { className: "ss-w-sq-seg", role: "group", children: ["roster", "stats"].map((v) => /* @__PURE__ */ jsx98(
10003
+ "button",
10004
+ {
10005
+ type: "button",
10006
+ className: "ss-w-sq-seg-btn",
10007
+ "aria-pressed": view === v,
10008
+ onClick: () => {
10009
+ if (view !== v) onToggleView();
10010
+ },
10011
+ children: v === "roster" ? ui.squadViewRoster : ui.squadViewStats
10012
+ },
10013
+ v
10014
+ )) });
10015
+ if (view === "stats") {
10016
+ return /* @__PURE__ */ jsxs84(Fragment21, { children: [
10017
+ toggle,
10018
+ /* @__PURE__ */ jsx98(SquadStats, { stats, loading: statsLoading, ui, onSelectPlayer })
10019
+ ] });
10020
+ }
10021
+ if (squad === null && loading) return /* @__PURE__ */ jsxs84(Fragment21, { children: [
10022
+ toggle,
10023
+ /* @__PURE__ */ jsx98("div", { className: "ss-w-mon-list" })
10024
+ ] });
10025
+ if (squad === null || squad.length === 0) return /* @__PURE__ */ jsxs84(Fragment21, { children: [
10026
+ toggle,
10027
+ /* @__PURE__ */ jsx98("div", { className: "ss-w-mon-empty", children: ui.clubSquadEmpty })
10028
+ ] });
10029
+ return /* @__PURE__ */ jsxs84(Fragment21, { children: [
10030
+ toggle,
10031
+ /* @__PURE__ */ jsx98("div", { className: "ss-w-mon-list", children: groupByPosition(squad).map((group, gi) => /* @__PURE__ */ jsxs84("div", { children: [
10032
+ group.positionName && /* @__PURE__ */ jsx98("div", { className: "ss-w-club-eyebrow", children: positionLabel(ui, group.positionName) }),
10033
+ group.items.map((p) => /* @__PURE__ */ jsxs84("button", { type: "button", className: "ss-w-sq-row ss-w-sq-tap", onClick: () => onSelectPlayer(p.playerId), children: [
10034
+ /* @__PURE__ */ jsx98("span", { className: "ss-w-sq-num", children: p.jerseyNumber ?? "" }),
10035
+ /* @__PURE__ */ jsx98("span", { className: "ss-w-sq-name", children: p.playerName })
10036
+ ] }, p.playerId))
10037
+ ] }, `${gi}-${group.positionName ?? "none"}`)) })
10038
+ ] });
10039
+ }
10040
+
10041
+ // src/components/PlayerDetail.tsx
10042
+ import { Fragment as Fragment22, jsx as jsx99, jsxs as jsxs85 } from "react/jsx-runtime";
10043
+ var DASH = "\u2014";
10044
+ function ageFrom(dobMs) {
10045
+ if (dobMs === null) return DASH;
10046
+ const dob = new Date(dobMs);
10047
+ const now = /* @__PURE__ */ new Date();
10048
+ let age = now.getUTCFullYear() - dob.getUTCFullYear();
10049
+ const beforeBirthday = now.getUTCMonth() < dob.getUTCMonth() || now.getUTCMonth() === dob.getUTCMonth() && now.getUTCDate() < dob.getUTCDate();
10050
+ if (beforeBirthday) age--;
10051
+ return String(age);
10052
+ }
10053
+ function Field({ label, value }) {
10054
+ return /* @__PURE__ */ jsxs85("div", { className: "ss-w-pd-field", children: [
10055
+ /* @__PURE__ */ jsx99("span", { className: "ss-w-pd-label", children: label }),
10056
+ /* @__PURE__ */ jsx99("span", { className: "ss-w-pd-value", children: value })
10057
+ ] });
10058
+ }
10059
+ function PlayerDetail({ detail, loading, ui, seasonName, onClose }) {
10060
+ const back = /* @__PURE__ */ jsxs85("button", { type: "button", className: "ss-w-pd-back", onClick: onClose, children: [
10061
+ /* @__PURE__ */ jsx99("span", { "aria-hidden": "true", children: "\u2039" }),
10062
+ " ",
10063
+ ui.clubPlayerBack
10064
+ ] });
10065
+ if (detail === null) {
10066
+ return loading ? /* @__PURE__ */ jsxs85(Fragment22, { children: [
10067
+ /* @__PURE__ */ jsx99("div", { className: "ss-w-pd-bar", children: back }),
10068
+ /* @__PURE__ */ jsx99("div", { className: "ss-w-mon-list" })
10069
+ ] }) : /* @__PURE__ */ jsxs85(Fragment22, { children: [
10070
+ /* @__PURE__ */ jsx99("div", { className: "ss-w-pd-bar", children: back }),
10071
+ /* @__PURE__ */ jsx99("div", { className: "ss-w-mon-empty", children: ui.clubPlayerDetailEmpty })
10072
+ ] });
10073
+ }
10074
+ const s = detail.seasonStats;
10075
+ const opt = (v, digits) => v === null ? DASH : digits === void 0 ? String(v) : v.toFixed(digits);
10076
+ return /* @__PURE__ */ jsxs85(Fragment22, { children: [
10077
+ /* @__PURE__ */ jsx99("div", { className: "ss-w-pd-bar", children: back }),
10078
+ /* @__PURE__ */ jsxs85("div", { className: "ss-w-mon-list", children: [
10079
+ /* @__PURE__ */ jsxs85("div", { children: [
10080
+ /* @__PURE__ */ jsx99("div", { className: "ss-w-pd-name", children: detail.playerName }),
10081
+ /* @__PURE__ */ jsx99("div", { className: "ss-w-pd-sub", children: [detail.jerseyNumber === null ? null : `#${detail.jerseyNumber}`, positionLabel(ui, detail.positionName)].filter(Boolean).join(" \xB7 ") })
10082
+ ] }),
10083
+ /* @__PURE__ */ jsxs85("div", { className: "ss-w-pd-grid ss-w-pd-bio", children: [
10084
+ /* @__PURE__ */ jsx99(Field, { label: ui.detailNationality, value: detail.nationality ?? DASH }),
10085
+ /* @__PURE__ */ jsx99(Field, { label: ui.detailAge, value: ageFrom(detail.dateOfBirthUnixMs) }),
10086
+ /* @__PURE__ */ jsx99(Field, { label: ui.detailHeight, value: detail.heightCm === null ? DASH : `${detail.heightCm} cm` }),
10087
+ /* @__PURE__ */ jsx99(Field, { label: ui.detailFoot, value: footLabel(ui, detail.foot) ?? DASH })
10088
+ ] }),
10089
+ /* @__PURE__ */ jsxs85("div", { children: [
10090
+ seasonName !== null && /* @__PURE__ */ jsx99("div", { className: "ss-w-club-eyebrow", children: ui.detailSeason.replace("{season}", seasonName) }),
10091
+ /* @__PURE__ */ jsxs85("div", { className: "ss-w-pd-grid", children: [
10092
+ /* @__PURE__ */ jsx99(Field, { label: ui.statColApps, value: String(s.appearances) }),
10093
+ /* @__PURE__ */ jsx99(Field, { label: ui.statColMinutes, value: String(s.minutesPlayed) }),
10094
+ /* @__PURE__ */ jsx99(Field, { label: ui.statColGoals, value: String(s.goals) }),
10095
+ /* @__PURE__ */ jsx99(Field, { label: ui.statColAssists, value: String(s.assists) }),
10096
+ /* @__PURE__ */ jsx99(Field, { label: ui.statColYellow, value: String(s.yellowCards) }),
10097
+ /* @__PURE__ */ jsx99(Field, { label: ui.statColRed, value: String(s.redCards) }),
10098
+ /* @__PURE__ */ jsx99(Field, { label: ui.statColRating, value: opt(s.averageRating, 1) }),
10099
+ /* @__PURE__ */ jsx99(Field, { label: ui.statColXg, value: opt(s.expectedGoals, 2) }),
10100
+ /* @__PURE__ */ jsx99(Field, { label: ui.statColShots, value: opt(s.totalShots) })
10101
+ ] })
10102
+ ] })
10103
+ ] })
10104
+ ] });
9770
10105
  }
9771
10106
 
9772
10107
  // src/components/PresetSpeedDial.tsx
9773
10108
  import { useId as useId10 } from "react";
9774
- import { jsx as jsx98, jsxs as jsxs84 } from "react/jsx-runtime";
10109
+ import { jsx as jsx100, jsxs as jsxs86 } from "react/jsx-runtime";
9775
10110
  function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef, buttonRef }) {
9776
10111
  const pillsId = useId10();
9777
10112
  const tabIndex = expanded ? 0 : -1;
9778
- return /* @__PURE__ */ jsxs84("div", { ref: rootRef, className: "ss-w-dial", children: [
9779
- /* @__PURE__ */ jsxs84(
10113
+ return /* @__PURE__ */ jsxs86("div", { ref: rootRef, className: "ss-w-dial", children: [
10114
+ /* @__PURE__ */ jsxs86(
9780
10115
  "button",
9781
10116
  {
9782
10117
  ref: buttonRef,
@@ -9787,36 +10122,36 @@ function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef
9787
10122
  "aria-label": strings.dialName,
9788
10123
  onClick: onToggle,
9789
10124
  children: [
9790
- /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-icon ss-w-dial-icon--open", children: /* @__PURE__ */ jsx98(SlidersIcon, {}) }),
9791
- /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-icon ss-w-dial-icon--close", children: /* @__PURE__ */ jsx98(CloseIcon, {}) }),
9792
- showDot && !expanded ? /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-dot", "aria-hidden": "true" }) : null
10125
+ /* @__PURE__ */ jsx100("span", { className: "ss-w-dial-icon ss-w-dial-icon--open", children: /* @__PURE__ */ jsx100(SlidersIcon, {}) }),
10126
+ /* @__PURE__ */ jsx100("span", { className: "ss-w-dial-icon ss-w-dial-icon--close", children: /* @__PURE__ */ jsx100(CloseIcon, {}) }),
10127
+ showDot && !expanded ? /* @__PURE__ */ jsx100("span", { className: "ss-w-dial-dot", "aria-hidden": "true" }) : null
9793
10128
  ]
9794
10129
  }
9795
10130
  ),
9796
- /* @__PURE__ */ jsxs84("div", { id: pillsId, className: "ss-w-dial-pills", "data-open": expanded ? "" : void 0, children: [
9797
- /* @__PURE__ */ jsxs84("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("numbers"), children: [
9798
- /* @__PURE__ */ jsx98(SlidersIcon, {}),
9799
- /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-pill-label", children: strings.setNumbers })
10131
+ /* @__PURE__ */ jsxs86("div", { id: pillsId, className: "ss-w-dial-pills", "data-open": expanded ? "" : void 0, children: [
10132
+ /* @__PURE__ */ jsxs86("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("numbers"), children: [
10133
+ /* @__PURE__ */ jsx100(SlidersIcon, {}),
10134
+ /* @__PURE__ */ jsx100("span", { className: "ss-w-dial-pill-label", children: strings.setNumbers })
9800
10135
  ] }),
9801
- /* @__PURE__ */ jsxs84("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("combo"), children: [
9802
- /* @__PURE__ */ jsx98(ComboIcon, {}),
9803
- /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-pill-label", children: strings.buildCombo })
10136
+ /* @__PURE__ */ jsxs86("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("combo"), children: [
10137
+ /* @__PURE__ */ jsx100(ComboIcon, {}),
10138
+ /* @__PURE__ */ jsx100("span", { className: "ss-w-dial-pill-label", children: strings.buildCombo })
9804
10139
  ] })
9805
10140
  ] })
9806
10141
  ] });
9807
10142
  }
9808
10143
 
9809
10144
  // src/components/PresetTools.tsx
9810
- import { Fragment as Fragment21, useEffect as useEffect29, useId as useId11, useRef as useRef25, useState as useState48 } from "react";
9811
- import { Fragment as Fragment22, jsx as jsx99, jsxs as jsxs85 } from "react/jsx-runtime";
10145
+ import { Fragment as Fragment23, useEffect as useEffect31, useId as useId11, useRef as useRef28, useState as useState50 } from "react";
10146
+ import { Fragment as Fragment24, jsx as jsx101, jsxs as jsxs87 } from "react/jsx-runtime";
9812
10147
  var FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
9813
10148
  function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
9814
- const dialogRef = useRef25(null);
10149
+ const dialogRef = useRef28(null);
9815
10150
  const titleId = useId11();
9816
- useEffect29(() => {
10151
+ useEffect31(() => {
9817
10152
  dialogRef.current?.focus();
9818
10153
  }, []);
9819
- useEffect29(() => {
10154
+ useEffect31(() => {
9820
10155
  const onKey = (e) => {
9821
10156
  if (e.key !== "Escape") return;
9822
10157
  e.stopPropagation();
@@ -9846,79 +10181,79 @@ function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
9846
10181
  first.focus();
9847
10182
  }
9848
10183
  };
9849
- return /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-backdrop", children: /* @__PURE__ */ jsxs85("div", { ref: dialogRef, className: "ss-w-tool", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, onKeyDown: trapTab, children: [
9850
- /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-head", children: [
9851
- /* @__PURE__ */ jsx99("h2", { id: titleId, className: "ss-w-tool-title", children: title }),
9852
- /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx99(CloseIcon, {}) })
10184
+ return /* @__PURE__ */ jsx101("div", { className: "ss-w-tool-backdrop", children: /* @__PURE__ */ jsxs87("div", { ref: dialogRef, className: "ss-w-tool", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, onKeyDown: trapTab, children: [
10185
+ /* @__PURE__ */ jsxs87("div", { className: "ss-w-tool-head", children: [
10186
+ /* @__PURE__ */ jsx101("h2", { id: titleId, className: "ss-w-tool-title", children: title }),
10187
+ /* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx101(CloseIcon, {}) })
9853
10188
  ] }),
9854
- /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-body", children }),
9855
- footer ? /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-foot", children: footer }) : null
10189
+ /* @__PURE__ */ jsx101("div", { className: "ss-w-tool-body", children }),
10190
+ footer ? /* @__PURE__ */ jsx101("div", { className: "ss-w-tool-foot", children: footer }) : null
9856
10191
  ] }) });
9857
10192
  }
9858
10193
  function fillTemplate(template, slots) {
9859
10194
  return template.split(/(\{[a-z]+\})/).filter((part) => part !== "").map((part, i) => {
9860
10195
  const key = /^\{([a-z]+)\}$/.exec(part)?.[1];
9861
- return /* @__PURE__ */ jsx99(Fragment21, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
10196
+ return /* @__PURE__ */ jsx101(Fragment23, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
9862
10197
  });
9863
10198
  }
9864
10199
  function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
9865
10200
  const selected = Math.max(0, choices2.findIndex((c) => c.text === current));
9866
- return /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-num", children: [
9867
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
9868
- /* @__PURE__ */ jsx99("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(selected), onChange: (e) => {
10201
+ return /* @__PURE__ */ jsxs87("span", { className: "ss-w-tool-num", children: [
10202
+ /* @__PURE__ */ jsx101("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
10203
+ /* @__PURE__ */ jsx101("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(selected), onChange: (e) => {
9869
10204
  const c = choices2[Number(e.target.value)];
9870
10205
  if (c) onChoose(c.value);
9871
- }, children: choices2.map((c, i) => /* @__PURE__ */ jsx99("option", { value: String(i), disabled: lockEmpty && !c.available && i !== selected, children: c.available ? c.text : `${c.text}${notToday}` }, i)) })
10206
+ }, children: choices2.map((c, i) => /* @__PURE__ */ jsx101("option", { value: String(i), disabled: lockEmpty && !c.available && i !== selected, children: c.available ? c.text : `${c.text}${notToday}` }, i)) })
9872
10207
  ] });
9873
10208
  }
9874
10209
  function ChoiceSelect({ currentIdx, sizeLabels, optionLabels, label, onChoose }) {
9875
10210
  const sizeText = sizeLabels[currentIdx] ?? "";
9876
- return /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-num", children: [
9877
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: sizeText }),
9878
- /* @__PURE__ */ jsx99("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(currentIdx), onChange: (e) => onChoose(Number(e.target.value)), children: optionLabels.map((opt, i) => /* @__PURE__ */ jsx99("option", { value: String(i), children: opt }, i)) })
10211
+ return /* @__PURE__ */ jsxs87("span", { className: "ss-w-tool-num", children: [
10212
+ /* @__PURE__ */ jsx101("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: sizeText }),
10213
+ /* @__PURE__ */ jsx101("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(currentIdx), onChange: (e) => onChoose(Number(e.target.value)), children: optionLabels.map((opt, i) => /* @__PURE__ */ jsx101("option", { value: String(i), children: opt }, i)) })
9879
10214
  ] });
9880
10215
  }
9881
10216
  function SendButton({ label, display, disabled, onClick }) {
9882
- return /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
10217
+ return /* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
9883
10218
  }
9884
10219
  function PickList({ picks, formatKickoff }) {
9885
- return /* @__PURE__ */ jsx99("ul", { className: "ss-w-tool-picks", role: "list", children: picks.map((p) => /* @__PURE__ */ jsxs85("li", { className: "ss-w-tool-pick", children: [
9886
- /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-pick-match", children: [
10220
+ return /* @__PURE__ */ jsx101("ul", { className: "ss-w-tool-picks", role: "list", children: picks.map((p) => /* @__PURE__ */ jsxs87("li", { className: "ss-w-tool-pick", children: [
10221
+ /* @__PURE__ */ jsxs87("span", { className: "ss-w-tool-pick-match", children: [
9887
10222
  p.homeTeamName,
9888
10223
  " \u2013 ",
9889
10224
  p.awayTeamName
9890
10225
  ] }),
9891
- /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-pick-sel", children: [
10226
+ /* @__PURE__ */ jsxs87("span", { className: "ss-w-tool-pick-sel", children: [
9892
10227
  p.marketLabel,
9893
10228
  ": ",
9894
10229
  p.selectionLabel,
9895
10230
  p.line ? ` ${p.line}` : ""
9896
10231
  ] }),
9897
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-pick-kick", children: formatKickoff(p.kickoffUtc) }),
9898
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-pick-price", children: p.price.toFixed(2) })
10232
+ /* @__PURE__ */ jsx101("span", { className: "ss-w-tool-pick-kick", children: formatKickoff(p.kickoffUtc) }),
10233
+ /* @__PURE__ */ jsx101("span", { className: "ss-w-tool-pick-price", children: p.price.toFixed(2) })
9899
10234
  ] }, p.matchOddsId)) });
9900
10235
  }
9901
10236
  function ComboPreview({ cell, formatKickoff }) {
9902
- return /* @__PURE__ */ jsxs85(Fragment22, { children: [
9903
- /* @__PURE__ */ jsx99(PickList, { picks: cell.combo.legs, formatKickoff }),
9904
- /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-math", children: cell.combo.multiplication })
10237
+ return /* @__PURE__ */ jsxs87(Fragment24, { children: [
10238
+ /* @__PURE__ */ jsx101(PickList, { picks: cell.combo.legs, formatKickoff }),
10239
+ /* @__PURE__ */ jsx101("div", { className: "ss-w-tool-math", children: cell.combo.multiplication })
9905
10240
  ] });
9906
10241
  }
9907
10242
  function Unavailable({ text }) {
9908
- return /* @__PURE__ */ jsx99("p", { className: "ss-w-tool-unavailable", children: text });
10243
+ return /* @__PURE__ */ jsx101("p", { className: "ss-w-tool-unavailable", children: text });
9909
10244
  }
9910
10245
  function AskRow({ icon, ask, ready, send }) {
9911
- return /* @__PURE__ */ jsxs85("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
9912
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
9913
- /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-main", children: [
9914
- /* @__PURE__ */ jsx99("p", { className: "ss-w-tool-ask", children: ask }),
9915
- ready ? /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-ready", children: ready }) : null
10246
+ return /* @__PURE__ */ jsxs87("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
10247
+ /* @__PURE__ */ jsx101("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
10248
+ /* @__PURE__ */ jsxs87("div", { className: "ss-w-tool-main", children: [
10249
+ /* @__PURE__ */ jsx101("p", { className: "ss-w-tool-ask", children: ask }),
10250
+ ready ? /* @__PURE__ */ jsx101("span", { className: "ss-w-tool-ready", children: ready }) : null
9916
10251
  ] }),
9917
10252
  send
9918
10253
  ] });
9919
10254
  }
9920
10255
  function RoundSend({ label, display, disabled, onClick }) {
9921
- return /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ jsx99(SendIcon, {}) });
10256
+ return /* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ jsx101(SendIcon, {}) });
9922
10257
  }
9923
10258
  var BIG_COMBO = { total: 50, legs: 6 };
9924
10259
  function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
@@ -9927,15 +10262,15 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
9927
10262
  const totals = comboTotals(grid);
9928
10263
  const legChoices = comboLegChoices(grid);
9929
10264
  const count = FIXED_SINGLES_COUNT;
9930
- const [maxPrice, setMaxPrice] = useState48(() => startSingles(grid.singles, limits, START.maxPrice, count));
9931
- const [minPrice, setMinPrice] = useState48(() => startSingles(grid.singlesFrom, floors, START.minPrice, count));
9932
- const [start] = useState48(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
9933
- const [total, setTotal] = useState48(start.total);
9934
- const [legs, setLegs] = useState48(start.legs);
9935
- const [bigStart] = useState48(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
9936
- const [bigTotal, setBigTotal] = useState48(bigStart.total);
9937
- const [bigLegs, setBigLegs] = useState48(bigStart.legs);
9938
- const [announcement, setAnnouncement] = useState48("");
10265
+ const [maxPrice, setMaxPrice] = useState50(() => startSingles(grid.singles, limits, START.maxPrice, count));
10266
+ const [minPrice, setMinPrice] = useState50(() => startSingles(grid.singlesFrom, floors, START.minPrice, count));
10267
+ const [start] = useState50(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
10268
+ const [total, setTotal] = useState50(start.total);
10269
+ const [legs, setLegs] = useState50(start.legs);
10270
+ const [bigStart] = useState50(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
10271
+ const [bigTotal, setBigTotal] = useState50(bigStart.total);
10272
+ const [bigLegs, setBigLegs] = useState50(bigStart.legs);
10273
+ const [announcement, setAnnouncement] = useState50("");
9939
10274
  const maxCell = findSingles(grid.singles, maxPrice, count);
9940
10275
  const minCell = findSingles(grid.singlesFrom, minPrice, count);
9941
10276
  const comboCell = findCombo(grid, total, legs);
@@ -9979,95 +10314,95 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
9979
10314
  const totalChoices = totals.map((v) => ({ value: v, text: v.toFixed(1), available: legChoices.some((n) => !!findCombo(grid, v, n)) }));
9980
10315
  const legChoicesFor = (t) => legChoices.map((n) => ({ value: n, text: String(n), available: !!findCombo(grid, t, n) }));
9981
10316
  const markets = grid.markets ?? [];
9982
- const [marketIdx, setMarketIdx] = useState48(0);
10317
+ const [marketIdx, setMarketIdx] = useState50(0);
9983
10318
  const marketCell = markets[marketIdx] ?? null;
9984
10319
  const marketLabels = markets.map((c) => strings.marketShort(c.marketDeveloperName, c.marketLabel, c.selectionLabel ?? null));
9985
10320
  const singlesReady = (cell) => cell ? strings.readyCount(cell.picks.length) : strings.unavailable;
9986
10321
  const comboReady = (cell) => cell ? strings.readyAt(cell.combo.total) : strings.unavailable;
9987
- return /* @__PURE__ */ jsxs85(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
9988
- /* @__PURE__ */ jsx99(
10322
+ return /* @__PURE__ */ jsxs87(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
10323
+ /* @__PURE__ */ jsx101(
9989
10324
  AskRow,
9990
10325
  {
9991
10326
  icon: "\u{1F3AF}",
9992
10327
  ask: fillTemplate(strings.maxPriceRow, {
9993
10328
  count: String(count),
9994
- price: /* @__PURE__ */ jsx99(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
10329
+ price: /* @__PURE__ */ jsx101(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
9995
10330
  }),
9996
10331
  ready: singlesReady(maxCell),
9997
- send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
10332
+ send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
9998
10333
  if (maxCell) onSend(maxPriceAsk(maxCell, strings));
9999
10334
  } })
10000
10335
  }
10001
10336
  ),
10002
- /* @__PURE__ */ jsx99(
10337
+ /* @__PURE__ */ jsx101(
10003
10338
  AskRow,
10004
10339
  {
10005
10340
  icon: "\u{1F4C8}",
10006
10341
  ask: fillTemplate(strings.minPriceRow, {
10007
10342
  count: String(count),
10008
- price: /* @__PURE__ */ jsx99(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
10343
+ price: /* @__PURE__ */ jsx101(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
10009
10344
  }),
10010
10345
  ready: singlesReady(minCell),
10011
- send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
10346
+ send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
10012
10347
  if (minCell) onSend(minPriceAsk(minCell, strings));
10013
10348
  } })
10014
10349
  }
10015
10350
  ),
10016
- /* @__PURE__ */ jsx99(
10351
+ /* @__PURE__ */ jsx101(
10017
10352
  AskRow,
10018
10353
  {
10019
10354
  icon: "\u2728",
10020
10355
  ask: fillTemplate(strings.comboRow, {
10021
- legs: /* @__PURE__ */ jsx99(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
10022
- total: /* @__PURE__ */ jsx99(NumberSelect, { current: total.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseTotal })
10356
+ legs: /* @__PURE__ */ jsx101(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
10357
+ total: /* @__PURE__ */ jsx101(NumberSelect, { current: total.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseTotal })
10023
10358
  }),
10024
10359
  ready: comboReady(comboCell),
10025
- send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
10360
+ send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
10026
10361
  if (comboCell) onSend(comboAsk(comboCell, strings));
10027
10362
  } })
10028
10363
  }
10029
10364
  ),
10030
- /* @__PURE__ */ jsx99(
10365
+ /* @__PURE__ */ jsx101(
10031
10366
  AskRow,
10032
10367
  {
10033
10368
  icon: "\u{1F3C6}",
10034
10369
  ask: fillTemplate(strings.bigComboRow, {
10035
- legs: /* @__PURE__ */ jsx99(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
10036
- total: /* @__PURE__ */ jsx99(NumberSelect, { current: bigTotal.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseBigTotal })
10370
+ legs: /* @__PURE__ */ jsx101(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
10371
+ total: /* @__PURE__ */ jsx101(NumberSelect, { current: bigTotal.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseBigTotal })
10037
10372
  }),
10038
10373
  ready: comboReady(bigCell),
10039
- send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
10374
+ send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
10040
10375
  if (bigCell) onSend(comboAsk(bigCell, strings));
10041
10376
  } })
10042
10377
  }
10043
10378
  ),
10044
- markets.length > 0 && /* @__PURE__ */ jsx99(
10379
+ markets.length > 0 && /* @__PURE__ */ jsx101(
10045
10380
  AskRow,
10046
10381
  {
10047
10382
  icon: "\u26BD",
10048
10383
  ask: fillTemplate(strings.marketRow, {
10049
- market: /* @__PURE__ */ jsx99(ChoiceSelect, { currentIdx: marketIdx, sizeLabels: marketLabels, optionLabels: marketLabels, label: strings.marketName, onChoose: chooseMarket })
10384
+ market: /* @__PURE__ */ jsx101(ChoiceSelect, { currentIdx: marketIdx, sizeLabels: marketLabels, optionLabels: marketLabels, label: strings.marketName, onChoose: chooseMarket })
10050
10385
  }),
10051
10386
  ready: marketCell ? strings.readyCount(marketCell.count) : null,
10052
- send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: marketCell ? marketDisplay(marketCell, strings) : "", disabled: !marketCell || streaming, onClick: () => {
10387
+ send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: marketCell ? marketDisplay(marketCell, strings) : "", disabled: !marketCell || streaming, onClick: () => {
10053
10388
  if (marketCell) onSend(marketAsk(marketCell, strings));
10054
10389
  } })
10055
10390
  }
10056
10391
  ),
10057
- /* @__PURE__ */ jsx99("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
10392
+ /* @__PURE__ */ jsx101("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
10058
10393
  ] });
10059
10394
  }
10060
10395
  function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal, initialLegs, onSend, onClose }) {
10061
10396
  const totals = comboTotals(grid);
10062
10397
  const legChoices = comboLegChoices(grid);
10063
- const [start] = useState48(() => initialTotal === void 0 ? startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs) : null);
10064
- const [total, setTotal] = useState48(() => initialTotal !== void 0 ? nearest(totals, initialTotal) : start.total);
10065
- const [legs, setLegs] = useState48(() => {
10398
+ const [start] = useState50(() => initialTotal === void 0 ? startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs) : null);
10399
+ const [total, setTotal] = useState50(() => initialTotal !== void 0 ? nearest(totals, initialTotal) : start.total);
10400
+ const [legs, setLegs] = useState50(() => {
10066
10401
  if (initialTotal === void 0) return initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : start.legs;
10067
10402
  const from = initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : startValue(legChoices, START.comboLegs);
10068
10403
  return legsForTotal(grid, nearest(totals, initialTotal), from);
10069
10404
  });
10070
- const [announcement, setAnnouncement] = useState48("");
10405
+ const [announcement, setAnnouncement] = useState50("");
10071
10406
  const cell = findCombo(grid, total, legs);
10072
10407
  const minLegs = legChoices[0] ?? legs;
10073
10408
  const maxLegs = legChoices[legChoices.length - 1] ?? legs;
@@ -10078,29 +10413,29 @@ function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal,
10078
10413
  const d = strings.comboDisplay(nextLegs, nextTotal);
10079
10414
  setAnnouncement(findCombo(grid, nextTotal, nextLegs) ? d : `${d}. ${strings.unavailable}`);
10080
10415
  };
10081
- const footer = /* @__PURE__ */ jsx99(SendButton, { label: strings.send, display, disabled: !cell || streaming, onClick: () => {
10416
+ const footer = /* @__PURE__ */ jsx101(SendButton, { label: strings.send, display, disabled: !cell || streaming, onClick: () => {
10082
10417
  if (cell) onSend(comboAsk(cell, strings));
10083
10418
  } });
10084
- return /* @__PURE__ */ jsxs85(PresetToolModal, { title: strings.buildCombo, closeLabel: strings.close, onClose, footer, children: [
10085
- /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.totalLabel, children: [
10086
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.totalLabel }),
10087
- /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-chips", children: totals.map((t) => /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-chip", "aria-pressed": samePrice(t, total), onClick: () => choose(t, samePrice(t, total) ? legs : legsForTotal(grid, t, legs)), children: t.toFixed(1) }, t)) })
10419
+ return /* @__PURE__ */ jsxs87(PresetToolModal, { title: strings.buildCombo, closeLabel: strings.close, onClose, footer, children: [
10420
+ /* @__PURE__ */ jsxs87("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.totalLabel, children: [
10421
+ /* @__PURE__ */ jsx101("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.totalLabel }),
10422
+ /* @__PURE__ */ jsx101("div", { className: "ss-w-tool-chips", children: totals.map((t) => /* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-chip", "aria-pressed": samePrice(t, total), onClick: () => choose(t, samePrice(t, total) ? legs : legsForTotal(grid, t, legs)), children: t.toFixed(1) }, t)) })
10088
10423
  ] }),
10089
- /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.matchesLabel, children: [
10090
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.matchesLabel }),
10091
- /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-stepper", children: [
10092
- /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.fewerMatches, disabled: legs <= minLegs, onClick: () => choose(total, legs - 1), children: "\u2212" }),
10093
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-count", children: legs }),
10094
- /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.moreMatches, disabled: legs >= maxLegs, onClick: () => choose(total, legs + 1), children: "+" })
10424
+ /* @__PURE__ */ jsxs87("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.matchesLabel, children: [
10425
+ /* @__PURE__ */ jsx101("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.matchesLabel }),
10426
+ /* @__PURE__ */ jsxs87("div", { className: "ss-w-tool-stepper", children: [
10427
+ /* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.fewerMatches, disabled: legs <= minLegs, onClick: () => choose(total, legs - 1), children: "\u2212" }),
10428
+ /* @__PURE__ */ jsx101("span", { className: "ss-w-tool-count", children: legs }),
10429
+ /* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.moreMatches, disabled: legs >= maxLegs, onClick: () => choose(total, legs + 1), children: "+" })
10095
10430
  ] })
10096
10431
  ] }),
10097
- cell ? /* @__PURE__ */ jsx99(ComboPreview, { cell, formatKickoff }) : /* @__PURE__ */ jsx99(Unavailable, { text: strings.unavailable }),
10098
- /* @__PURE__ */ jsx99("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
10432
+ cell ? /* @__PURE__ */ jsx101(ComboPreview, { cell, formatKickoff }) : /* @__PURE__ */ jsx101(Unavailable, { text: strings.unavailable }),
10433
+ /* @__PURE__ */ jsx101("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
10099
10434
  ] });
10100
10435
  }
10101
10436
 
10102
10437
  // src/usePresetDial.ts
10103
- import { useCallback as useCallback19, useEffect as useEffect30, useRef as useRef26, useState as useState49 } from "react";
10438
+ import { useCallback as useCallback21, useEffect as useEffect32, useRef as useRef29, useState as useState51 } from "react";
10104
10439
  function sendInFlight(messages, isStreaming) {
10105
10440
  const last = messages[messages.length - 1];
10106
10441
  return isStreaming && !!last && last.role === "assistant" && !last.done && !last.isGreeting;
@@ -10114,25 +10449,25 @@ function lastUserId(messages) {
10114
10449
  }
10115
10450
  var SCROLL_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "PageUp", "PageDown", "Home", "End", " "]);
10116
10451
  function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming, activeTab }) {
10117
- const [expanded, setExpanded] = useState49(() => !sendInFlight(messages, isStreaming));
10118
- const fold = useCallback19(() => setExpanded(false), []);
10119
- const toggle = useCallback19(() => setExpanded((e) => !e), []);
10452
+ const [expanded, setExpanded] = useState51(() => !sendInFlight(messages, isStreaming));
10453
+ const fold = useCallback21(() => setExpanded(false), []);
10454
+ const toggle = useCallback21(() => setExpanded((e) => !e), []);
10120
10455
  const currentUserId = lastUserId(messages);
10121
- const userIdRef = useRef26(currentUserId);
10122
- useEffect30(() => {
10456
+ const userIdRef = useRef29(currentUserId);
10457
+ useEffect32(() => {
10123
10458
  if (currentUserId === userIdRef.current) return;
10124
10459
  userIdRef.current = currentUserId;
10125
10460
  setExpanded(false);
10126
10461
  }, [currentUserId]);
10127
- const tabRef = useRef26(activeTab);
10128
- useEffect30(() => {
10462
+ const tabRef = useRef29(activeTab);
10463
+ useEffect32(() => {
10129
10464
  if (activeTab === tabRef.current) return;
10130
10465
  tabRef.current = activeTab;
10131
10466
  setExpanded(false);
10132
10467
  }, [activeTab]);
10133
- const expandedRef = useRef26(expanded);
10468
+ const expandedRef = useRef29(expanded);
10134
10469
  expandedRef.current = expanded;
10135
- useEffect30(() => {
10470
+ useEffect32(() => {
10136
10471
  const onEscape = (e) => {
10137
10472
  const dial = dialRef.current;
10138
10473
  if (e.key !== "Escape" || !dial || !e.composedPath().includes(dial)) return;
@@ -10145,7 +10480,7 @@ function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming
10145
10480
  window.addEventListener("keydown", onEscape, true);
10146
10481
  return () => window.removeEventListener("keydown", onEscape, true);
10147
10482
  }, [dialRef, dialButtonRef]);
10148
- useEffect30(() => {
10483
+ useEffect32(() => {
10149
10484
  if (!expanded) return;
10150
10485
  const layer = layerRef.current;
10151
10486
  const inDial = (e) => {
@@ -10197,11 +10532,11 @@ function markToolSeen() {
10197
10532
  }
10198
10533
 
10199
10534
  // src/components/ChatPanel.tsx
10200
- import { Fragment as Fragment23, jsx as jsx100, jsxs as jsxs86 } from "react/jsx-runtime";
10535
+ import { Fragment as Fragment25, jsx as jsx102, jsxs as jsxs88 } from "react/jsx-runtime";
10201
10536
  var FULLSCREEN_QUERY = "(max-width: 639px)";
10202
10537
  function useIsModal() {
10203
- const [modal, setModal] = useState50(false);
10204
- useEffect31(() => {
10538
+ const [modal, setModal] = useState52(false);
10539
+ useEffect33(() => {
10205
10540
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
10206
10541
  const mql = window.matchMedia(FULLSCREEN_QUERY);
10207
10542
  const sync = () => setModal(mql.matches);
@@ -10212,10 +10547,38 @@ function useIsModal() {
10212
10547
  return modal;
10213
10548
  }
10214
10549
  var HIDDEN_LAYER_STYLE = { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" };
10215
- function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, clubFixturesResult, clubStandingsResult, clubSquadResult, loggedIn, conversation, presetGrid }) {
10550
+ var SQUAD_LAYER_STYLE = { display: "flex", flexDirection: "column", flex: 1, minHeight: 0 };
10551
+ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, clubFixturesResult, clubStandingsResult, clubSquadResult, clubSquadStatsResult, clubPlayerDetailResult, loggedIn, conversation, presetGrid }) {
10216
10552
  const { state, close, stop, send, reset } = controller;
10553
+ const [squadView, setSquadView] = useState52("roster");
10554
+ const [selectedPlayerId, setSelectedPlayerId] = useState52(null);
10555
+ const clearPlayerDetail = clubPlayerDetailResult?.clear;
10556
+ const fetchPlayerDetail = clubPlayerDetailResult?.fetch;
10557
+ const squadLayerRef = useRef30(null);
10558
+ const squadScrollRef = useRef30(null);
10559
+ const selectPlayer = (playerId) => {
10560
+ squadScrollRef.current = squadLayerRef.current?.querySelector(".ss-w-mon-list")?.scrollTop ?? null;
10561
+ setSelectedPlayerId(playerId);
10562
+ fetchPlayerDetail?.(playerId);
10563
+ };
10564
+ const closePlayer = () => {
10565
+ setSelectedPlayerId(null);
10566
+ clearPlayerDetail?.();
10567
+ };
10568
+ useLayoutEffect(() => {
10569
+ if (selectedPlayerId !== null || squadScrollRef.current === null) return;
10570
+ const list = squadLayerRef.current?.querySelector(".ss-w-mon-list");
10571
+ if (list) list.scrollTop = squadScrollRef.current;
10572
+ squadScrollRef.current = null;
10573
+ }, [selectedPlayerId]);
10574
+ const activeTab = monitor?.activeTab;
10575
+ useEffect33(() => {
10576
+ if (activeTab === "squad" || selectedPlayerId === null) return;
10577
+ setSelectedPlayerId(null);
10578
+ clearPlayerDetail?.();
10579
+ }, [activeTab, selectedPlayerId, clearPlayerDetail]);
10217
10580
  const isModal = useIsModal();
10218
- useEffect31(() => {
10581
+ useEffect33(() => {
10219
10582
  const onKey = (e) => {
10220
10583
  if (e.key === "Escape") close();
10221
10584
  };
@@ -10231,19 +10594,19 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10231
10594
  monitor?.setActiveTab("chat");
10232
10595
  send(text, { grounding });
10233
10596
  };
10234
- useEffect31(() => {
10597
+ useEffect33(() => {
10235
10598
  if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
10236
10599
  }, [monitor, state.isStreaming, state.messages.length]);
10237
10600
  const onChatTab = !monitor || monitor.activeTab === "chat";
10238
- const layerRef = useRef27(null);
10239
- const dialRef = useRef27(null);
10240
- const dialButtonRef = useRef27(null);
10241
- const inputRef = useRef27(null);
10242
- const limitRef = useRef27(null);
10243
- const typedSendRef = useRef27(false);
10244
- const focusAfterCloseRef = useRef27(null);
10245
- const [tool, setTool] = useState50(null);
10246
- const [toolSeen, setToolSeen] = useState50(readToolSeen);
10601
+ const layerRef = useRef30(null);
10602
+ const dialRef = useRef30(null);
10603
+ const dialButtonRef = useRef30(null);
10604
+ const inputRef = useRef30(null);
10605
+ const limitRef = useRef30(null);
10606
+ const typedSendRef = useRef30(false);
10607
+ const focusAfterCloseRef = useRef30(null);
10608
+ const [tool, setTool] = useState52(null);
10609
+ const [toolSeen, setToolSeen] = useState52(readToolSeen);
10247
10610
  const dial = usePresetDial({
10248
10611
  layerRef,
10249
10612
  dialRef,
@@ -10255,53 +10618,53 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10255
10618
  const { fold } = dial;
10256
10619
  const paused = isPaused(state.limit);
10257
10620
  const showDial = !!presetGrid && onChatTab && !tool && !paused;
10258
- useEffect31(() => {
10621
+ useEffect33(() => {
10259
10622
  if (paused) setTool(null);
10260
10623
  }, [paused]);
10261
- useEffect31(() => {
10624
+ useEffect33(() => {
10262
10625
  if (!paused) return;
10263
10626
  if (typedSendRef.current) limitRef.current?.focus();
10264
10627
  typedSendRef.current = false;
10265
10628
  }, [paused]);
10266
- const openTool = useCallback20((next) => {
10629
+ const openTool = useCallback22((next) => {
10267
10630
  fold();
10268
10631
  markToolSeen();
10269
10632
  setToolSeen(true);
10270
10633
  setTool(next);
10271
10634
  }, [fold]);
10272
- const onPill = useCallback20((kind) => openTool(kind === "numbers" ? { kind: "numbers" } : { kind: "combo" }), [openTool]);
10635
+ const onPill = useCallback22((kind) => openTool(kind === "numbers" ? { kind: "numbers" } : { kind: "combo" }), [openTool]);
10273
10636
  const toolsValue = useMemo5(
10274
10637
  () => presetGrid && !paused ? { openBuilder: (total, legs) => openTool({ kind: "combo", total, legs }), changeLabel: ui.presets.changeCombo } : null,
10275
10638
  [presetGrid, paused, openTool, ui.presets.changeCombo]
10276
10639
  );
10277
- const closeTool = useCallback20(() => {
10640
+ const closeTool = useCallback22(() => {
10278
10641
  focusAfterCloseRef.current = "dial";
10279
10642
  setTool(null);
10280
10643
  }, []);
10281
- const sendAsk = useCallback20((ask) => {
10644
+ const sendAsk = useCallback22((ask) => {
10282
10645
  focusAfterCloseRef.current = "composer";
10283
10646
  setTool(null);
10284
10647
  monitor?.setActiveTab("chat");
10285
10648
  send(ask.message, { displayText: ask.displayText, preset: ask.preset });
10286
10649
  }, [monitor, send]);
10287
- const formatKickoff = useCallback20((kickoffUtc) => {
10650
+ const formatKickoff = useCallback22((kickoffUtc) => {
10288
10651
  const k = ui.bettingKickoff(kickoffUtc);
10289
10652
  return `${k.dayLabel} ${k.time}`;
10290
10653
  }, [ui]);
10291
- useEffect31(() => {
10654
+ useEffect33(() => {
10292
10655
  if (tool) return;
10293
10656
  const target = focusAfterCloseRef.current;
10294
10657
  focusAfterCloseRef.current = null;
10295
10658
  if (target === "dial") dialButtonRef.current?.focus();
10296
10659
  else if (target === "composer") inputRef.current?.focus();
10297
10660
  }, [tool]);
10298
- useEffect31(() => {
10661
+ useEffect33(() => {
10299
10662
  if (!tool || onChatTab && presetGrid) return;
10300
10663
  focusAfterCloseRef.current = "composer";
10301
10664
  setTool(null);
10302
10665
  }, [tool, onChatTab, presetGrid]);
10303
- return /* @__PURE__ */ jsxs86("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
10304
- /* @__PURE__ */ jsx100(
10666
+ return /* @__PURE__ */ jsxs88("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
10667
+ /* @__PURE__ */ jsx102(
10305
10668
  ChatHeader,
10306
10669
  {
10307
10670
  onClose: close,
@@ -10314,7 +10677,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10314
10677
  moreOptionsLabel: ui.moreOptions
10315
10678
  }
10316
10679
  ),
10317
- monitor && /* @__PURE__ */ jsx100(
10680
+ monitor && /* @__PURE__ */ jsx102(
10318
10681
  TabBar,
10319
10682
  {
10320
10683
  monitor,
@@ -10327,9 +10690,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10327
10690
  clubEnabled: clubFixturesResult?.enabled ?? false
10328
10691
  }
10329
10692
  ),
10330
- /* @__PURE__ */ jsxs86("div", { ref: layerRef, className: "ss-w-chat-layer", "data-dial": presetGrid ? "" : void 0, style: onChatTab ? void 0 : HIDDEN_LAYER_STYLE, children: [
10331
- /* @__PURE__ */ jsx100(PresetToolsContext.Provider, { value: toolsValue, children: /* @__PURE__ */ jsx100(MessageList, { controller, ui, slip, onDashboardTap, monitor }) }),
10332
- showDial ? /* @__PURE__ */ jsx100(
10693
+ /* @__PURE__ */ jsxs88("div", { ref: layerRef, className: "ss-w-chat-layer", "data-dial": presetGrid ? "" : void 0, style: onChatTab ? void 0 : HIDDEN_LAYER_STYLE, children: [
10694
+ /* @__PURE__ */ jsx102(PresetToolsContext.Provider, { value: toolsValue, children: /* @__PURE__ */ jsx102(MessageList, { controller, ui, slip, onDashboardTap, monitor }) }),
10695
+ showDial ? /* @__PURE__ */ jsx102(
10333
10696
  PresetSpeedDial,
10334
10697
  {
10335
10698
  expanded: dial.expanded,
@@ -10341,15 +10704,38 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10341
10704
  buttonRef: dialButtonRef
10342
10705
  }
10343
10706
  ) : null,
10344
- tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */ jsx100(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ jsx100(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
10707
+ tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */ jsx102(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ jsx102(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
10345
10708
  ] }),
10346
- monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx100(TodayPanel, { discovery, ui, monitor }),
10347
- monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx100(MatchesPanel, { monitor, ui, slip, onAsk: paused ? void 0 : handleAsk }),
10348
- monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx100(OddsPanel, { monitor, ui, slip }),
10349
- monitor && monitor.activeTab === "fixtures" && /* @__PURE__ */ jsx100(Fixtures, { fixtures: clubFixturesResult?.fixtures ?? [], loading: clubFixturesResult?.loading ?? false, ui }),
10350
- monitor && monitor.activeTab === "standings" && /* @__PURE__ */ jsx100(Standings, { standings: clubStandingsResult?.data ?? null, loading: clubStandingsResult?.loading ?? false, ui }),
10351
- monitor && monitor.activeTab === "squad" && /* @__PURE__ */ jsx100(Squad, { squad: clubSquadResult?.data ?? null, loading: clubSquadResult?.loading ?? false, ui }),
10352
- monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx100(
10709
+ monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx102(TodayPanel, { discovery, ui, monitor }),
10710
+ monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx102(MatchesPanel, { monitor, ui, slip, onAsk: paused ? void 0 : handleAsk }),
10711
+ monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx102(OddsPanel, { monitor, ui, slip }),
10712
+ monitor && monitor.activeTab === "fixtures" && /* @__PURE__ */ jsx102(Fixtures, { fixtures: clubFixturesResult?.fixtures ?? [], loading: clubFixturesResult?.loading ?? false, ui }),
10713
+ monitor && monitor.activeTab === "standings" && /* @__PURE__ */ jsx102(Standings, { standings: clubStandingsResult?.data ?? null, loading: clubStandingsResult?.loading ?? false, ui }),
10714
+ monitor && monitor.activeTab === "squad" && /* @__PURE__ */ jsxs88(Fragment25, { children: [
10715
+ /* @__PURE__ */ jsx102(
10716
+ "div",
10717
+ {
10718
+ ref: squadLayerRef,
10719
+ style: selectedPlayerId === null ? SQUAD_LAYER_STYLE : HIDDEN_LAYER_STYLE,
10720
+ "aria-hidden": selectedPlayerId !== null ? true : void 0,
10721
+ children: /* @__PURE__ */ jsx102(
10722
+ Squad,
10723
+ {
10724
+ squad: clubSquadResult?.data ?? null,
10725
+ loading: clubSquadResult?.loading ?? false,
10726
+ ui,
10727
+ view: squadView,
10728
+ onToggleView: () => setSquadView((v) => v === "roster" ? "stats" : "roster"),
10729
+ stats: clubSquadStatsResult?.data ?? null,
10730
+ statsLoading: clubSquadStatsResult?.loading ?? false,
10731
+ onSelectPlayer: selectPlayer
10732
+ }
10733
+ )
10734
+ }
10735
+ ),
10736
+ selectedPlayerId !== null && /* @__PURE__ */ jsx102(PlayerDetail, { detail: clubPlayerDetailResult?.data ?? null, loading: clubPlayerDetailResult?.loading ?? false, ui, seasonName: clubSquadStatsResult?.seasonName ?? null, onClose: closePlayer })
10737
+ ] }),
10738
+ monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx102(
10353
10739
  GamesPanel,
10354
10740
  {
10355
10741
  loggedIn: !!loggedIn,
@@ -10364,9 +10750,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10364
10750
  }
10365
10751
  }
10366
10752
  ),
10367
- (!monitor || monitor.activeTab !== "games") && /* @__PURE__ */ jsxs86(Fragment23, { children: [
10368
- /* @__PURE__ */ jsx100("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
10369
- paused ? null : /* @__PURE__ */ jsx100(
10753
+ (!monitor || monitor.activeTab !== "games") && /* @__PURE__ */ jsxs88(Fragment25, { children: [
10754
+ /* @__PURE__ */ jsx102("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
10755
+ paused ? null : /* @__PURE__ */ jsx102(
10370
10756
  ChatInput,
10371
10757
  {
10372
10758
  ref: inputRef,
@@ -10385,9 +10771,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10385
10771
  }
10386
10772
 
10387
10773
  // src/components/HostEventsProvider.tsx
10388
- import { jsx as jsx101 } from "react/jsx-runtime";
10774
+ import { jsx as jsx103 } from "react/jsx-runtime";
10389
10775
  function HostEventsProvider({ value, children }) {
10390
- return /* @__PURE__ */ jsx101(SlipStateContext.Provider, { value: value.slipState, children });
10776
+ return /* @__PURE__ */ jsx103(SlipStateContext.Provider, { value: value.slipState, children });
10391
10777
  }
10392
10778
 
10393
10779
  // src/styles/css.generated.ts
@@ -11466,7 +11852,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
11466
11852
  /* live monitor tab bar: underline pattern mirrors .ss-w-ecard-scope; the unread dot uses --ss-w-neg */
11467
11853
  .ss-w-tabs { display: flex; align-items: stretch; gap: 2px; border-bottom: 1px solid var(--ss-w-line); overflow-x: auto; scrollbar-width: none; }
11468
11854
  .ss-w-tabs::-webkit-scrollbar { display: none; }
11469
- .ss-w-tab { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 620; color: var(--ss-w-faint); background: none; border: none; cursor: pointer; padding: 9px 12px; margin-bottom: -1px; border-bottom: 2px solid transparent; flex: none; white-space: nowrap; }
11855
+ .ss-w-tab { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 620; color: var(--ss-w-faint); background: none; border: none; cursor: pointer; padding: 9px 8px; margin-bottom: -1px; border-bottom: 2px solid transparent; flex: none; white-space: nowrap; }
11470
11856
  .ss-w-tab[data-on] { color: var(--ss-w-ink); border-bottom-color: var(--ss-w-accent); }
11471
11857
  .ss-w-tab-count { font-size: 10.5px; font-weight: 700; color: var(--ss-w-faint); background: var(--ss-w-bubble); border-radius: 999px; padding: 1px 6px; }
11472
11858
  .ss-w-tab[data-on] .ss-w-tab-count { color: var(--ss-w-accent); }
@@ -11548,6 +11934,28 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
11548
11934
  .ss-w-sq-row { display: flex; align-items: center; gap: 10px; padding: 7px 2px; border-bottom: 1px solid var(--ss-w-line); }
11549
11935
  .ss-w-sq-num { flex: none; width: 20px; text-align: right; font-size: 12px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--ss-w-faint); }
11550
11936
  .ss-w-sq-name { font-size: 13px; font-weight: 600; color: var(--ss-w-ink); }
11937
+ .ss-w-sq-name { flex: 1; min-width: 0; }
11938
+ .ss-w-sq-name-1 { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
11939
+ .ss-w-sq-seg { display: flex; flex: none; gap: 2px; margin: 10px 14px 0; padding: 2px; border-radius: var(--ss-w-radius); background: var(--ss-w-track); }
11940
+ .ss-w-sq-seg-btn { flex: 1; padding: 5px 8px; border: 0; border-radius: calc(var(--ss-w-radius) - 2px); background: transparent; font: inherit; font-size: 12px; font-weight: 600; color: var(--ss-w-faint); cursor: pointer; }
11941
+ .ss-w-sq-seg-btn[aria-pressed="true"] { background: var(--ss-w-panel); color: var(--ss-w-ink); }
11942
+ .ss-w-sq-seg-btn:focus-visible, .ss-w-sq-tap:focus-visible, .ss-w-pd-back:focus-visible { outline: 2px solid var(--ss-w-accent); outline-offset: 1px; }
11943
+ .ss-w-sq-tap { width: 100%; border: 0; border-bottom: 1px solid var(--ss-w-line); background: transparent; font: inherit; text-align: left; cursor: pointer; }
11944
+ .ss-w-sq-col { flex: none; width: 40px; text-align: center; font-size: 12px; font-weight: 600; font-variant-numeric: tabular-nums; color: var(--ss-w-ink); }
11945
+ .ss-w-sq-head { border-bottom: 0; padding-bottom: 0; }
11946
+ .ss-w-sq-head .ss-w-sq-col { font-size: 10px; font-weight: 700; color: var(--ss-w-faint); }
11947
+ .ss-w-pd-bar { flex: none; padding: 8px 14px 0; }
11948
+ .ss-w-pd-back { padding: 4px 0; border: 0; background: transparent; font: inherit; font-size: 12px; font-weight: 600; color: var(--ss-w-accent); cursor: pointer; }
11949
+ .ss-w-pd-name { font-size: 16px; font-weight: 700; color: var(--ss-w-ink); }
11950
+ .ss-w-pd-sub { margin-top: 2px; font-size: 12px; color: var(--ss-w-faint); }
11951
+ .ss-w-pd-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
11952
+ .ss-w-pd-bio { grid-template-columns: repeat(2, 1fr); }
11953
+ .ss-w-pd-field { display: flex; flex-direction: column; gap: 2px; padding: 8px 10px; border: 1px solid var(--ss-w-line); border-radius: var(--ss-w-radius); }
11954
+ .ss-w-pd-label { font-size: 10px; font-weight: 700; letter-spacing: .04em; color: var(--ss-w-faint); }
11955
+ .ss-w-pd-value { font-size: 14px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--ss-w-ink); }
11956
+ .ss-w-rec-list { margin: 0; padding: 0; list-style: none; }
11957
+ .ss-w-rec-value { flex: none; font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--ss-w-ink); }
11958
+ .ss-w-rec-since { font-size: 12px; color: var(--ss-w-faint); }
11551
11959
  /* Per-pin unavailable state: the pin's context line still rendered above (score, name, unpin), but
11552
11960
  the pin has neither a card nor history (compose-time rescue failed) -- a small inline note beats
11553
11961
  a bare context line with nothing under it. */
@@ -12151,7 +12559,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
12151
12559
  `;
12152
12560
 
12153
12561
  // src/StatsWidget.tsx
12154
- import { jsx as jsx102 } from "react/jsx-runtime";
12562
+ import { jsx as jsx104 } from "react/jsx-runtime";
12155
12563
  function buildClient(props) {
12156
12564
  try {
12157
12565
  if ("client" in props && props.client) {
@@ -12185,14 +12593,14 @@ function StatsWidget(props) {
12185
12593
  [built?.client]
12186
12594
  );
12187
12595
  const ui = useMemo6(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
12188
- const rootRef = useRef28(null);
12189
- const introDoneRef = useRef28(false);
12190
- const markIntroDone = useCallback21(() => {
12596
+ const rootRef = useRef31(null);
12597
+ const introDoneRef = useRef31(false);
12598
+ const markIntroDone = useCallback23(() => {
12191
12599
  introDoneRef.current = true;
12192
12600
  }, []);
12193
12601
  const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
12194
12602
  const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
12195
- const [hasToday, setHasToday] = useState51(false);
12603
+ const [hasToday, setHasToday] = useState53(false);
12196
12604
  const liveCardWatches = useMemo6(() => {
12197
12605
  const seen = /* @__PURE__ */ new Set();
12198
12606
  const out = [];
@@ -12219,15 +12627,15 @@ function StatsWidget(props) {
12219
12627
  });
12220
12628
  const operatorUserId = cfg?.userContext?.operatorUserId;
12221
12629
  const anonymousUserId = cfg?.userContext?.anonymousUserId;
12222
- const getSchedule = useCallback21(
12630
+ const getSchedule = useCallback23(
12223
12631
  (localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes, operatorUserId, anonymousUserId) : Promise.resolve(null),
12224
12632
  [built, operatorUserId, anonymousUserId]
12225
12633
  );
12226
- const postLeagueStar = useCallback21(
12634
+ const postLeagueStar = useCallback23(
12227
12635
  (competitionId, starred) => built ? built.conversation.starLeague(competitionId, starred, operatorUserId, anonymousUserId) : Promise.resolve(null),
12228
12636
  [built, operatorUserId, anonymousUserId]
12229
12637
  );
12230
- const getStates = useCallback21(
12638
+ const getStates = useCallback23(
12231
12639
  (matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
12232
12640
  [built]
12233
12641
  );
@@ -12246,11 +12654,11 @@ function StatsWidget(props) {
12246
12654
  pinnedMatchIds
12247
12655
  });
12248
12656
  const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
12249
- useEffect32(() => {
12657
+ useEffect34(() => {
12250
12658
  setHasToday(todayHasContent);
12251
12659
  }, [todayHasContent]);
12252
- const prevLiveSnapshotRef = useRef28(monitor.snapshot);
12253
- useEffect32(() => {
12660
+ const prevLiveSnapshotRef = useRef31(monitor.snapshot);
12661
+ useEffect34(() => {
12254
12662
  const snap = monitor.snapshot;
12255
12663
  if (!snap || snap === prevLiveSnapshotRef.current) return;
12256
12664
  prevLiveSnapshotRef.current = snap;
@@ -12288,14 +12696,16 @@ function StatsWidget(props) {
12288
12696
  const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
12289
12697
  const clubStandingsResult = useClubStandings(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
12290
12698
  const clubSquadResult = useClubSquad(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
12291
- const getPricePresets = useCallback21(
12699
+ const clubSquadStatsResult = useClubSquadStats(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
12700
+ const clubPlayerDetailResult = useClubPlayerDetail(built?.conversation ?? null);
12701
+ const getPricePresets = useCallback23(
12292
12702
  (locale2) => built ? built.conversation.getPricePresets(locale2, { pool: "open" }) : Promise.resolve(null),
12293
12703
  [built]
12294
12704
  );
12295
12705
  const presetGrid = usePresetGrid({ getPricePresets, isOpen: controller.state.isOpen, locale: ui.presets.lang });
12296
12706
  const markTodayActivity = monitor.markTodayActivity;
12297
- const prevLiveCountRef = useRef28(0);
12298
- useEffect32(() => {
12707
+ const prevLiveCountRef = useRef31(0);
12708
+ useEffect34(() => {
12299
12709
  const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
12300
12710
  prevLiveCountRef.current = discovery.liveCount;
12301
12711
  if (rose) markTodayActivity();
@@ -12345,11 +12755,11 @@ function StatsWidget(props) {
12345
12755
  })
12346
12756
  }));
12347
12757
  const conversationId = controller.state.conversationId ?? void 0;
12348
- useEffect32(() => {
12758
+ useEffect34(() => {
12349
12759
  if (!logger) return;
12350
12760
  logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
12351
12761
  }, [logger, operatorUserId, anonymousUserId, conversationId]);
12352
- useEffect32(() => {
12762
+ useEffect34(() => {
12353
12763
  if (!logger) return;
12354
12764
  logger.resume();
12355
12765
  const onHide = () => {
@@ -12367,14 +12777,14 @@ function StatsWidget(props) {
12367
12777
  logger.dispose();
12368
12778
  };
12369
12779
  }, [logger]);
12370
- useEffect32(() => {
12780
+ useEffect34(() => {
12371
12781
  if (!built || !ui.injectStyles) return;
12372
12782
  const node = rootRef.current?.getRootNode();
12373
12783
  if (node) injectStyles(node);
12374
12784
  }, [built, ui.injectStyles]);
12375
12785
  if (!built) return null;
12376
12786
  const attrs = themeAttrs(ui);
12377
- return /* @__PURE__ */ jsx102(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx102(HostEventsProvider, { value: hostEvents, children: /* @__PURE__ */ jsx102("div", { ref: rootRef, className: "ss-w-root", "data-ss-w-theme": attrs["data-ss-w-theme"], "data-ss-w-pos": attrs["data-ss-w-pos"], style: attrs.style, children: controller.state.isOpen ? /* @__PURE__ */ jsx102(
12787
+ return /* @__PURE__ */ jsx104(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx104(HostEventsProvider, { value: hostEvents, children: /* @__PURE__ */ jsx104("div", { ref: rootRef, className: "ss-w-root", "data-ss-w-theme": attrs["data-ss-w-theme"], "data-ss-w-pos": attrs["data-ss-w-pos"], style: attrs.style, children: controller.state.isOpen ? /* @__PURE__ */ jsx104(
12378
12788
  ChatPanel,
12379
12789
  {
12380
12790
  controller,
@@ -12388,11 +12798,13 @@ function StatsWidget(props) {
12388
12798
  clubFixturesResult,
12389
12799
  clubStandingsResult,
12390
12800
  clubSquadResult,
12801
+ clubSquadStatsResult,
12802
+ clubPlayerDetailResult,
12391
12803
  loggedIn: !!operatorUserId,
12392
12804
  conversation: built?.conversation ?? null,
12393
12805
  presetGrid
12394
12806
  }
12395
- ) : /* @__PURE__ */ jsx102(
12807
+ ) : /* @__PURE__ */ jsx104(
12396
12808
  ChatFab,
12397
12809
  {
12398
12810
  label: ui.launcherLabel,