@sensiblestats/widget-react 0.84.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,
@@ -3243,8 +3339,83 @@ function useClubSquad(conversation, { activeTab, enabled }) {
3243
3339
  return { data, loading: effectiveLoading, refresh };
3244
3340
  }
3245
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
+
3246
3417
  // src/usePresetGrid.ts
3247
- 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";
3248
3419
 
3249
3420
  // src/presetGrid.ts
3250
3421
  var DEFAULT_SINGLES_LIMITS = [1.3, 1.5, 1.7, 2];
@@ -3387,22 +3558,22 @@ function marketDisplay(cell, s) {
3387
3558
  // src/usePresetGrid.ts
3388
3559
  var GRID_MAX_AGE_MS = 6e5;
3389
3560
  function usePresetGrid({ getPricePresets, isOpen, locale, now = Date.now }) {
3390
- const [grid, setGrid] = useState10(null);
3391
- const keptRef = useRef11(null);
3392
- const localeRef = useRef11(locale);
3393
- const inFlightRef = useRef11(false);
3394
- const mountedRef = useRef11(true);
3395
- 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);
3396
3567
  getRef.current = getPricePresets;
3397
- const nowRef = useRef11(now);
3568
+ const nowRef = useRef13(now);
3398
3569
  nowRef.current = now;
3399
- useEffect11(() => {
3570
+ useEffect12(() => {
3400
3571
  mountedRef.current = true;
3401
3572
  return () => {
3402
3573
  mountedRef.current = false;
3403
3574
  };
3404
3575
  }, []);
3405
- useEffect11(() => {
3576
+ useEffect12(() => {
3406
3577
  if (localeRef.current !== locale) {
3407
3578
  localeRef.current = locale;
3408
3579
  keptRef.current = null;
@@ -3452,11 +3623,11 @@ function useEventLog() {
3452
3623
  }
3453
3624
 
3454
3625
  // src/popupTelemetry.ts
3455
- 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";
3456
3627
  function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
3457
- const shownRef = useRef12(/* @__PURE__ */ new Set());
3458
- const closedTextRef = useRef12(null);
3459
- useEffect12(() => {
3628
+ const shownRef = useRef14(/* @__PURE__ */ new Set());
3629
+ const closedTextRef = useRef14(null);
3630
+ useEffect13(() => {
3460
3631
  if (isOpen) {
3461
3632
  if (closedTextRef.current) log?.log({ name: "popup_opened" });
3462
3633
  closedTextRef.current = null;
@@ -3468,17 +3639,17 @@ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
3468
3639
  log?.log({ name: "popup_shown" });
3469
3640
  }
3470
3641
  }, [log, isOpen, popupText]);
3471
- return useCallback10(() => {
3642
+ return useCallback12(() => {
3472
3643
  log?.log({ name: "popup_dismissed" });
3473
3644
  dismissPopup();
3474
3645
  }, [log, dismissPopup]);
3475
3646
  }
3476
3647
 
3477
3648
  // src/openTelemetry.ts
3478
- import { useEffect as useEffect13, useRef as useRef13 } from "react";
3649
+ import { useEffect as useEffect14, useRef as useRef15 } from "react";
3479
3650
  function useOpenTelemetry(log, isOpen) {
3480
- const openLoggedRef = useRef13(false);
3481
- useEffect13(() => {
3651
+ const openLoggedRef = useRef15(false);
3652
+ useEffect14(() => {
3482
3653
  if (!isOpen) {
3483
3654
  openLoggedRef.current = false;
3484
3655
  return;
@@ -3490,10 +3661,10 @@ function useOpenTelemetry(log, isOpen) {
3490
3661
  }
3491
3662
 
3492
3663
  // src/components/ChatFab.tsx
3493
- 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";
3494
3665
 
3495
3666
  // src/components/BrandMark.tsx
3496
- import { useState as useState11 } from "react";
3667
+ import { useState as useState13 } from "react";
3497
3668
 
3498
3669
  // src/assets/logo.ts
3499
3670
  var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
@@ -3556,7 +3727,7 @@ function DashboardIcon({ name }) {
3556
3727
  // src/components/BrandMark.tsx
3557
3728
  import { jsx as jsx2 } from "react/jsx-runtime";
3558
3729
  function BrandMark({ logoUrl, className }) {
3559
- const [failed, setFailed] = useState11(false);
3730
+ const [failed, setFailed] = useState13(false);
3560
3731
  if (!logoUrl || failed) return /* @__PURE__ */ jsx2(SsMark, { className });
3561
3732
  return /* @__PURE__ */ jsx2("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
3562
3733
  }
@@ -3592,9 +3763,9 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss", ask
3592
3763
  import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
3593
3764
  function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart, asks }) {
3594
3765
  const bubble = popupText ?? greeting;
3595
- const [intro, setIntro] = useState12(false);
3596
- const armedRef = useRef14(introAllowed);
3597
- useEffect14(() => {
3766
+ const [intro, setIntro] = useState14(false);
3767
+ const armedRef = useRef16(introAllowed);
3768
+ useEffect15(() => {
3598
3769
  if (armedRef.current && bubble) {
3599
3770
  armedRef.current = false;
3600
3771
  setIntro(true);
@@ -3608,10 +3779,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
3608
3779
  }
3609
3780
 
3610
3781
  // src/components/ChatPanel.tsx
3611
- 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";
3612
3783
 
3613
3784
  // src/components/ChatHeader.tsx
3614
- 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";
3615
3786
  import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
3616
3787
  function ChatHeader({
3617
3788
  onClose,
@@ -3623,15 +3794,15 @@ function ChatHeader({
3623
3794
  newConversationLabel = "New conversation",
3624
3795
  moreOptionsLabel = "More options"
3625
3796
  }) {
3626
- const [menuOpen, setMenuOpen] = useState13(false);
3627
- const wrapRef = useRef15(null);
3628
- const kebabRef = useRef15(null);
3629
- 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);
3630
3801
  const hasMenu = !!(canReset && onNewConversation);
3631
- useEffect15(() => {
3802
+ useEffect16(() => {
3632
3803
  if (menuOpen) firstItemRef.current?.focus();
3633
3804
  }, [menuOpen]);
3634
- useEffect15(() => {
3805
+ useEffect16(() => {
3635
3806
  if (!menuOpen) return;
3636
3807
  const onPointer = (e) => {
3637
3808
  if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
@@ -3687,7 +3858,7 @@ function ChatHeader({
3687
3858
  }
3688
3859
 
3689
3860
  // src/components/MessageList.tsx
3690
- import { useEffect as useEffect21, useRef as useRef18 } from "react";
3861
+ import { useEffect as useEffect22, useRef as useRef20 } from "react";
3691
3862
 
3692
3863
  // src/components/Markdown.tsx
3693
3864
  import ReactMarkdown from "react-markdown";
@@ -3705,7 +3876,7 @@ function Markdown({ text }) {
3705
3876
  }
3706
3877
 
3707
3878
  // src/components/EntityCardList.tsx
3708
- import { useState as useState14 } from "react";
3879
+ import { useState as useState16 } from "react";
3709
3880
  import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
3710
3881
  var MAX_VISIBLE = 3;
3711
3882
  var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
@@ -3789,7 +3960,7 @@ function ScopeTabs({ scopes, active, onSelect }) {
3789
3960
  )) });
3790
3961
  }
3791
3962
  function EntityCardItem({ c }) {
3792
- const [active, setActive] = useState14(0);
3963
+ const [active, setActive] = useState16(0);
3793
3964
  const hasBody = c.scopes.length > 0;
3794
3965
  if (!hasBody) {
3795
3966
  return /* @__PURE__ */ jsx7("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ jsx7(CardHeader, { c, showScopeCrest: false }) });
@@ -3803,7 +3974,7 @@ function EntityCardItem({ c }) {
3803
3974
  ] });
3804
3975
  }
3805
3976
  function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
3806
- const [expanded, setExpanded] = useState14(false);
3977
+ const [expanded, setExpanded] = useState16(false);
3807
3978
  if (cards.length === 0) return null;
3808
3979
  const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
3809
3980
  const overflow = cards.length - MAX_VISIBLE;
@@ -3814,10 +3985,10 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
3814
3985
  }
3815
3986
 
3816
3987
  // src/components/AddToSlipButton.tsx
3817
- import { useCallback as useCallback12, useState as useState15 } from "react";
3988
+ import { useCallback as useCallback14, useState as useState17 } from "react";
3818
3989
 
3819
3990
  // src/slipAdd.ts
3820
- import { useCallback as useCallback11 } from "react";
3991
+ import { useCallback as useCallback13 } from "react";
3821
3992
  import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
3822
3993
 
3823
3994
  // src/slipStateContext.ts
@@ -3839,7 +4010,7 @@ function useSlipAdd(slip, ui) {
3839
4010
  const slipState = useSlipState();
3840
4011
  const handler = slip.onAddToSlip;
3841
4012
  const rawLabels = !!ui?.rawBettingLabels;
3842
- return useCallback11(async (selection, { marketDeveloperName, selectionLabel, line }) => {
4013
+ return useCallback13(async (selection, { marketDeveloperName, selectionLabel, line }) => {
3843
4014
  if (!handler) return { kind: "failed" };
3844
4015
  const pick = slipPickFields(selection, rawLabels ? selectionLabel : void 0, line);
3845
4016
  if (marketDeveloperName !== void 0) {
@@ -3876,11 +4047,11 @@ function useSlipAdd(slip, ui) {
3876
4047
  }
3877
4048
 
3878
4049
  // src/components/Toast.tsx
3879
- import { useEffect as useEffect16 } from "react";
4050
+ import { useEffect as useEffect17 } from "react";
3880
4051
  import { jsx as jsx8 } from "react/jsx-runtime";
3881
4052
  var DISMISS_MS = 4e3;
3882
4053
  function Toast({ toast, onDismiss }) {
3883
- useEffect16(() => {
4054
+ useEffect17(() => {
3884
4055
  if (!toast) return;
3885
4056
  const timer = setTimeout(onDismiss, DISMISS_MS);
3886
4057
  return () => clearTimeout(timer);
@@ -3892,10 +4063,10 @@ function Toast({ toast, onDismiss }) {
3892
4063
  // src/components/AddToSlipButton.tsx
3893
4064
  import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
3894
4065
  function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui, price, ariaLabel }) {
3895
- const [pending, setPending] = useState15(false);
3896
- const [settledLocal, setSettledLocal] = useState15(false);
3897
- const [toast, setToast] = useState15(null);
3898
- 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), []);
3899
4070
  const add = useSlipAdd(slip, ui);
3900
4071
  const slipState = useSlipState();
3901
4072
  const handler = slip.onAddToSlip;
@@ -3983,14 +4154,14 @@ function OddsMovementBadge({
3983
4154
  }
3984
4155
 
3985
4156
  // src/components/Crest.tsx
3986
- import { useState as useState16 } from "react";
4157
+ import { useState as useState18 } from "react";
3987
4158
  import { jsx as jsx11 } from "react/jsx-runtime";
3988
4159
  function initials2(name) {
3989
4160
  return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
3990
4161
  }
3991
4162
  function Crest2({ url, name, kind }) {
3992
4163
  const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
3993
- const [failed, setFailed] = useState16(false);
4164
+ const [failed, setFailed] = useState18(false);
3994
4165
  if (url && !failed) {
3995
4166
  return /* @__PURE__ */ jsx11("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
3996
4167
  }
@@ -3998,7 +4169,7 @@ function Crest2({ url, name, kind }) {
3998
4169
  }
3999
4170
 
4000
4171
  // src/components/PinToggle.tsx
4001
- import { useCallback as useCallback13, useState as useState17 } from "react";
4172
+ import { useCallback as useCallback15, useState as useState19 } from "react";
4002
4173
  import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
4003
4174
  var PIN_GLYPHS = {
4004
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" },
@@ -4006,8 +4177,8 @@ var PIN_GLYPHS = {
4006
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" }
4007
4178
  };
4008
4179
  function PinToggle({ pin, monitor, ui, market }) {
4009
- const [toast, setToast] = useState17(null);
4010
- const dismiss = useCallback13(() => setToast(null), []);
4180
+ const [toast, setToast] = useState19(null);
4181
+ const dismiss = useCallback15(() => setToast(null), []);
4011
4182
  const log = useEventLog();
4012
4183
  if (!monitor || !monitor.enabled) return null;
4013
4184
  const key = pinKey(pin);
@@ -4064,11 +4235,11 @@ function PinToggle({ pin, monitor, ui, market }) {
4064
4235
  }
4065
4236
 
4066
4237
  // src/components/PriceHistoryButton.tsx
4067
- import { useCallback as useCallback14, useState as useState18 } from "react";
4238
+ import { useCallback as useCallback16, useState as useState20 } from "react";
4068
4239
  import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
4069
4240
  function PriceHistoryButton({ selection, monitor, ui }) {
4070
- const [toast, setToast] = useState18(null);
4071
- const dismiss = useCallback14(() => setToast(null), []);
4241
+ const [toast, setToast] = useState20(null);
4242
+ const dismiss = useCallback16(() => setToast(null), []);
4072
4243
  const log = useEventLog();
4073
4244
  if (!monitor || !monitor.enabled) return null;
4074
4245
  const name = joinSelection(selection.selectionLabel ?? void 0, selection.line ?? void 0);
@@ -4183,15 +4354,15 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
4183
4354
  }
4184
4355
 
4185
4356
  // src/components/AddAllToSlipButton.tsx
4186
- import { useCallback as useCallback15, useState as useState19 } from "react";
4357
+ import { useCallback as useCallback17, useState as useState21 } from "react";
4187
4358
  import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
4188
4359
  function AddAllToSlipButton({ legs, slip, ui }) {
4189
4360
  const add = useSlipAdd(slip, ui);
4190
4361
  const slipState = useSlipState();
4191
- const [pending, setPending] = useState19(false);
4192
- const [settledLocal, setSettledLocal] = useState19({});
4193
- const [toast, setToast] = useState19(null);
4194
- 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), []);
4195
4366
  if (!ui || !slip.onAddToSlip || legs.length < 2) return null;
4196
4367
  const settled = slipState ? slipState.settled : settledLocal;
4197
4368
  const open = legs.filter((leg) => !settled[leg.matchOddsId]);
@@ -4301,7 +4472,7 @@ function ComboCardList({ cards, ui, slip, monitor }) {
4301
4472
  }
4302
4473
 
4303
4474
  // src/components/MarketOddsCardList.tsx
4304
- import { useEffect as useEffect17, useState as useState20 } from "react";
4475
+ import { useEffect as useEffect18, useState as useState22 } from "react";
4305
4476
 
4306
4477
  // src/components/AllMarketsButton.tsx
4307
4478
  import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
@@ -4364,7 +4535,7 @@ function fmtHhMm(iso, locale) {
4364
4535
  return new Date(iso).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", hour12: false });
4365
4536
  }
4366
4537
  function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
4367
- const [open, setOpen] = useState20(false);
4538
+ const [open, setOpen] = useState22(false);
4368
4539
  const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
4369
4540
  const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
4370
4541
  const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
@@ -4374,9 +4545,9 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
4374
4545
  const asOfMs = live ? new Date(live.asOfUtc).getTime() : NaN;
4375
4546
  const isStale = live != null && !isClosed && (vm.awaitingLiveUpdate === true || Date.now() - asOfMs > STALE_AFTER_MS);
4376
4547
  const staleTime = isStale && live ? fmtHhMm(live.asOfUtc, ui?.locale ?? "en") : null;
4377
- const [, setStaleTick] = useState20(0);
4548
+ const [, setStaleTick] = useState22(0);
4378
4549
  const watchStale = live != null && !isClosed && !isStale;
4379
- useEffect17(() => {
4550
+ useEffect18(() => {
4380
4551
  if (!watchStale) return;
4381
4552
  const id = window.setTimeout(() => setStaleTick((n) => n + 1), Math.max(0, asOfMs + STALE_AFTER_MS - Date.now()) + 1);
4382
4553
  return () => window.clearTimeout(id);
@@ -4455,7 +4626,7 @@ function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds, hideHeader, p
4455
4626
  }
4456
4627
 
4457
4628
  // src/components/CompactOddsList.tsx
4458
- 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";
4459
4630
 
4460
4631
  // src/compactList.ts
4461
4632
  var COMPACT_MIN_CARDS = 3;
@@ -4569,11 +4740,11 @@ function Row({ row, columns, ui, slip, monitor, rowRef }) {
4569
4740
  ] });
4570
4741
  }
4571
4742
  function CompactOddsList({ list, ui, slip, monitor }) {
4572
- const [shown, setShown] = useState21(COMPACT_PAGE);
4743
+ const [shown, setShown] = useState23(COMPACT_PAGE);
4573
4744
  const hidden = list.rowCount - shown;
4574
- const [focusIndex, setFocusIndex] = useState21(null);
4575
- const focusRef = useRef16(null);
4576
- useEffect18(() => {
4745
+ const [focusIndex, setFocusIndex] = useState23(null);
4746
+ const focusRef = useRef18(null);
4747
+ useEffect19(() => {
4577
4748
  if (focusIndex !== null) focusRef.current?.focus();
4578
4749
  }, [focusIndex]);
4579
4750
  let left = shown;
@@ -4878,7 +5049,7 @@ function FixtureCard({ card }) {
4878
5049
  }
4879
5050
 
4880
5051
  // src/components/dashboard/CountdownCard.tsx
4881
- 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";
4882
5053
  import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
4883
5054
  var DAY_MS = 864e5;
4884
5055
  function remainingSegments(kickoffUnix, nowMs, withSeconds) {
@@ -4897,12 +5068,12 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
4897
5068
  function CountdownCard({ card }) {
4898
5069
  const { data } = card;
4899
5070
  const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
4900
- const [nowMs, setNowMs] = useState22(() => Date.now());
4901
- const [reduced] = useState22(
5071
+ const [nowMs, setNowMs] = useState24(() => Date.now());
5072
+ const [reduced] = useState24(
4902
5073
  () => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
4903
5074
  );
4904
5075
  const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
4905
- useEffect19(() => {
5076
+ useEffect20(() => {
4906
5077
  if (reduced) return;
4907
5078
  const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
4908
5079
  return () => window.clearInterval(id);
@@ -4921,7 +5092,7 @@ function CountdownCard({ card }) {
4921
5092
  }
4922
5093
 
4923
5094
  // src/components/dashboard/InjuriesCard.tsx
4924
- import { useState as useState23 } from "react";
5095
+ import { useState as useState25 } from "react";
4925
5096
  import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
4926
5097
  var SHOWN = 3;
4927
5098
  function ColHead({ name, crestUrl }) {
@@ -4944,7 +5115,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
4944
5115
  }
4945
5116
  function InjuriesCard({ card, ui }) {
4946
5117
  const { data } = card;
4947
- const [expanded, setExpanded] = useState23(false);
5118
+ const [expanded, setExpanded] = useState25(false);
4948
5119
  const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
4949
5120
  const limit = expanded ? void 0 : SHOWN;
4950
5121
  const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
@@ -5050,7 +5221,7 @@ function LinksCard({ card }) {
5050
5221
  }
5051
5222
 
5052
5223
  // src/components/dashboard/PostMatchResultCard.tsx
5053
- import { useState as useState24 } from "react";
5224
+ import { useState as useState26 } from "react";
5054
5225
  import { jsx as jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
5055
5226
  function initials3(name) {
5056
5227
  return name.trim().slice(0, 3).toUpperCase();
@@ -5060,7 +5231,7 @@ function PostMatchCrest({
5060
5231
  name,
5061
5232
  side
5062
5233
  }) {
5063
- const [failed, setFailed] = useState24(false);
5234
+ const [failed, setFailed] = useState26(false);
5064
5235
  const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
5065
5236
  if (url && !failed) {
5066
5237
  return /* @__PURE__ */ jsx32("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -5259,10 +5430,10 @@ function RestingFormCard({ card }) {
5259
5430
  }
5260
5431
 
5261
5432
  // src/components/dashboard/LiveScoreCard.tsx
5262
- import { useRef as useRef17, useState as useState26 } from "react";
5433
+ import { useRef as useRef19, useState as useState28 } from "react";
5263
5434
 
5264
5435
  // src/useLiveClock.ts
5265
- import { useEffect as useEffect20, useState as useState25 } from "react";
5436
+ import { useEffect as useEffect21, useState as useState27 } from "react";
5266
5437
  var TICK_MS = 6e4;
5267
5438
  var MAX_LIVE_TICK_MINUTES = 15;
5268
5439
  function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
@@ -5271,10 +5442,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
5271
5442
  return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
5272
5443
  }
5273
5444
  function useLiveClock(minute, clockRunning, receivedAtMs) {
5274
- const [displayMinute, setDisplayMinute] = useState25(
5445
+ const [displayMinute, setDisplayMinute] = useState27(
5275
5446
  () => computeDisplayMinute(minute, clockRunning, receivedAtMs)
5276
5447
  );
5277
- useEffect20(() => {
5448
+ useEffect21(() => {
5278
5449
  setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
5279
5450
  if (!clockRunning) return;
5280
5451
  const id = window.setInterval(() => {
@@ -5291,7 +5462,7 @@ function initials5(name) {
5291
5462
  return name.trim().slice(0, 3).toUpperCase();
5292
5463
  }
5293
5464
  function LiveCrest({ url, name, side }) {
5294
- const [failed, setFailed] = useState26(false);
5465
+ const [failed, setFailed] = useState28(false);
5295
5466
  const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
5296
5467
  if (url && !failed) {
5297
5468
  return /* @__PURE__ */ jsx41("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -5310,7 +5481,7 @@ function LiveScoreCard({
5310
5481
  }) {
5311
5482
  const { data } = card;
5312
5483
  const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
5313
- const seedRef = useRef17(null);
5484
+ const seedRef = useRef19(null);
5314
5485
  if (!seedRef.current || seedRef.current.key !== seedKey) {
5315
5486
  seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
5316
5487
  }
@@ -5350,7 +5521,7 @@ function LiveScoreCard({
5350
5521
  }
5351
5522
 
5352
5523
  // src/components/dashboard/LiveTimelineCard.tsx
5353
- import { useState as useState27 } from "react";
5524
+ import { useState as useState29 } from "react";
5354
5525
  import { jsx as jsx42, jsxs as jsxs38 } from "react/jsx-runtime";
5355
5526
  var SHOWN2 = 3;
5356
5527
  function EventIcon({ type }) {
@@ -5392,7 +5563,7 @@ function EventRow({ e }) {
5392
5563
  ] });
5393
5564
  }
5394
5565
  function LiveTimelineCard({ card, ui }) {
5395
- const [expanded, setExpanded] = useState27(false);
5566
+ const [expanded, setExpanded] = useState29(false);
5396
5567
  const events = card.data.events;
5397
5568
  if (!events || events.length === 0) return null;
5398
5569
  const sorted = [...events].sort((a, b) => b.minute - a.minute);
@@ -5634,11 +5805,11 @@ function turnAnchor(messages) {
5634
5805
  }
5635
5806
  function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
5636
5807
  const { state, send } = controller;
5637
- const listRef = useRef18(null);
5638
- const endRef = useRef18(null);
5639
- const pinnedRef = useRef18(true);
5640
- const anchoredTurnRef = useRef18(null);
5641
- useEffect21(() => {
5808
+ const listRef = useRef20(null);
5809
+ const endRef = useRef20(null);
5810
+ const pinnedRef = useRef20(true);
5811
+ const anchoredTurnRef = useRef20(null);
5812
+ useEffect22(() => {
5642
5813
  const anchor = turnAnchor(state.messages);
5643
5814
  const list = listRef.current;
5644
5815
  if (anchor && anchor.turnId !== anchoredTurnRef.current) {
@@ -5695,13 +5866,13 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
5695
5866
  }
5696
5867
 
5697
5868
  // src/components/ChatInput.tsx
5698
- 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";
5699
5870
  import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
5700
5871
  var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message", disabled = false, onType }, ref) {
5701
- const [value, setValue] = useState28("");
5702
- const textareaRef = useRef19(null);
5703
- const stopRef = useRef19(null);
5704
- const textBoxWantsFocusRef = useRef19(false);
5872
+ const [value, setValue] = useState30("");
5873
+ const textareaRef = useRef21(null);
5874
+ const stopRef = useRef21(null);
5875
+ const textBoxWantsFocusRef = useRef21(false);
5705
5876
  const submit = () => {
5706
5877
  if (disabled) return;
5707
5878
  const t = value.trim();
@@ -5727,7 +5898,7 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
5727
5898
  stopRef.current?.focus();
5728
5899
  }
5729
5900
  }), []);
5730
- useEffect22(() => {
5901
+ useEffect23(() => {
5731
5902
  if (streaming || disabled || !textBoxWantsFocusRef.current) return;
5732
5903
  textBoxWantsFocusRef.current = false;
5733
5904
  const box = textareaRef.current;
@@ -5759,6 +5930,7 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
5759
5930
  });
5760
5931
 
5761
5932
  // src/components/TabBar.tsx
5933
+ import { useEffect as useEffect24, useRef as useRef22 } from "react";
5762
5934
  import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
5763
5935
  function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled, clubEnabled }) {
5764
5936
  const tabs = [
@@ -5774,8 +5946,16 @@ function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, game
5774
5946
  ],
5775
5947
  ...gamesEnabled ? [{ tab: "games", label: ui.tabGames, count: 0, dot: false }] : []
5776
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]);
5777
5957
  if (tabs.length < 2) return null;
5778
- 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 }) => {
5779
5959
  const active = monitor.activeTab === tab;
5780
5960
  return /* @__PURE__ */ jsxs45(
5781
5961
  "button",
@@ -5852,10 +6032,10 @@ function MarketAccordion({ match, monitor, ui, slip }) {
5852
6032
  }
5853
6033
 
5854
6034
  // src/components/LiveFactBlock.tsx
5855
- import { useState as useState29 } from "react";
6035
+ import { useState as useState31 } from "react";
5856
6036
  import { jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
5857
6037
  function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
5858
- const [expanded, setExpanded] = useState29(false);
6038
+ const [expanded, setExpanded] = useState31(false);
5859
6039
  const [current, ...earlier] = facts;
5860
6040
  if (!current) return null;
5861
6041
  const m = current.market;
@@ -6121,7 +6301,7 @@ function OddsPanel({ monitor, ui, slip }) {
6121
6301
  }
6122
6302
 
6123
6303
  // src/components/TodayPanel.tsx
6124
- 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";
6125
6305
 
6126
6306
  // src/placement.ts
6127
6307
  function placeLeagues(visible, pinnedMatchIds) {
@@ -6184,11 +6364,11 @@ function matchingFixtures(group, query) {
6184
6364
  }
6185
6365
 
6186
6366
  // src/useStarTap.ts
6187
- 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";
6188
6368
  function useStarTap(starLeague) {
6189
- const [pendingId, setPendingId] = useState30(null);
6190
- const pendingRef = useRef20(null);
6191
- const tap = useCallback16(async (competitionId, next) => {
6369
+ const [pendingId, setPendingId] = useState32(null);
6370
+ const pendingRef = useRef23(null);
6371
+ const tap = useCallback18(async (competitionId, next) => {
6192
6372
  if (pendingRef.current !== null) return false;
6193
6373
  pendingRef.current = competitionId;
6194
6374
  setPendingId(competitionId);
@@ -6247,7 +6427,7 @@ function LeagueTile({ group, starClickable: starClickable2, disambiguate, onOpen
6247
6427
  }
6248
6428
 
6249
6429
  // src/components/LeagueDetail.tsx
6250
- import { useEffect as useEffect23, useState as useState31 } from "react";
6430
+ import { useEffect as useEffect25, useState as useState33 } from "react";
6251
6431
 
6252
6432
  // src/components/FixtureRow.tsx
6253
6433
  import { jsx as jsx56, jsxs as jsxs51 } from "react/jsx-runtime";
@@ -6282,11 +6462,11 @@ function FixtureRow({ match, state, stale, ui, monitor }) {
6282
6462
  import { jsx as jsx57, jsxs as jsxs52 } from "react/jsx-runtime";
6283
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";
6284
6464
  function LeagueDetail({ group, position, states, stale, ui, monitor, starTap, onBack, onPrev, onNext }) {
6285
- const [toast, setToast] = useState31(null);
6286
- useEffect23(() => {
6465
+ const [toast, setToast] = useState33(null);
6466
+ useEffect25(() => {
6287
6467
  setToast(null);
6288
6468
  }, [group.competitionId]);
6289
- useEffect23(() => {
6469
+ useEffect25(() => {
6290
6470
  if (toast === null) return;
6291
6471
  const id = setTimeout(() => setToast(null), 4e3);
6292
6472
  return () => clearTimeout(id);
@@ -6418,7 +6598,7 @@ function LeagueRowGroup({ group, states, stale, cap, starClickable: starClickabl
6418
6598
  }
6419
6599
 
6420
6600
  // src/components/games/ui/SearchField.tsx
6421
- import { useCallback as useCallback17, useRef as useRef21 } from "react";
6601
+ import { useCallback as useCallback19, useRef as useRef24 } from "react";
6422
6602
 
6423
6603
  // src/components/games/ui/icons.tsx
6424
6604
  import { jsx as jsx59 } from "react/jsx-runtime";
@@ -6457,8 +6637,8 @@ var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx59("path", { d:
6457
6637
  // src/components/games/ui/SearchField.tsx
6458
6638
  import { jsx as jsx60, jsxs as jsxs54 } from "react/jsx-runtime";
6459
6639
  function SearchField({ id, label, labelHidden = false, placeholder, value, onChange, disabled, inputRef, onKeyDown, clearLabel }) {
6460
- const localRef = useRef21(null);
6461
- const setInputRef = useCallback17((node) => {
6640
+ const localRef = useRef24(null);
6641
+ const setInputRef = useCallback19((node) => {
6462
6642
  localRef.current = node;
6463
6643
  if (typeof inputRef === "function") inputRef(node);
6464
6644
  else if (inputRef) inputRef.current = node;
@@ -6503,10 +6683,10 @@ import { Fragment as Fragment7, jsx as jsx61, jsxs as jsxs55 } from "react/jsx-r
6503
6683
  function TodayPanel({ discovery, ui, monitor }) {
6504
6684
  const { groups, states, stale, starLeague } = discovery;
6505
6685
  const searchId = useId2();
6506
- const [query, setQuery] = useState32("");
6507
- const [selectedCompetitionId, setSelectedCompetitionId] = useState32(null);
6508
- const [toast, setToast] = useState32(null);
6509
- useEffect24(() => {
6686
+ const [query, setQuery] = useState34("");
6687
+ const [selectedCompetitionId, setSelectedCompetitionId] = useState34(null);
6688
+ const [toast, setToast] = useState34(null);
6689
+ useEffect26(() => {
6510
6690
  if (toast === null) return;
6511
6691
  const id = setTimeout(() => setToast(null), 4e3);
6512
6692
  return () => clearTimeout(id);
@@ -6552,7 +6732,7 @@ function TodayPanel({ discovery, ui, monitor }) {
6552
6732
  }
6553
6733
  const openIndex = selectedCompetitionId === null ? -1 : placement.order.findIndex((g) => g.competitionId === selectedCompetitionId);
6554
6734
  const openGroup = openIndex === -1 ? void 0 : placement.order[openIndex];
6555
- useEffect24(() => {
6735
+ useEffect26(() => {
6556
6736
  if (selectedCompetitionId !== null && openGroup === void 0) setSelectedCompetitionId(null);
6557
6737
  }, [selectedCompetitionId, openGroup]);
6558
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);
@@ -6699,7 +6879,7 @@ function TodayPanel({ discovery, ui, monitor }) {
6699
6879
  }
6700
6880
 
6701
6881
  // src/components/GamesPanel.tsx
6702
- import { useEffect as useEffect28, useState as useState47 } from "react";
6882
+ import { useEffect as useEffect30, useState as useState49 } from "react";
6703
6883
 
6704
6884
  // src/components/GamesLoginWall.tsx
6705
6885
  import { jsx as jsx62 } from "react/jsx-runtime";
@@ -6708,7 +6888,7 @@ function GamesLoginWall({ ui }) {
6708
6888
  }
6709
6889
 
6710
6890
  // src/components/GamesHub.tsx
6711
- import { useEffect as useEffect25, useState as useState33 } from "react";
6891
+ import { useEffect as useEffect27, useState as useState35 } from "react";
6712
6892
 
6713
6893
  // src/components/games/ui/gameMeta.ts
6714
6894
  function prettifyGameId(gameId) {
@@ -6859,8 +7039,8 @@ function pickHeroGame(games) {
6859
7039
  }
6860
7040
  var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
6861
7041
  function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
6862
- const [, setTick] = useState33(0);
6863
- useEffect25(() => {
7042
+ const [, setTick] = useState35(0);
7043
+ useEffect27(() => {
6864
7044
  const id = setInterval(() => setTick((t) => t + 1), 6e4);
6865
7045
  return () => clearInterval(id);
6866
7046
  }, []);
@@ -6920,10 +7100,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
6920
7100
  }
6921
7101
 
6922
7102
  // src/components/GameScreenHost.tsx
6923
- 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";
6924
7104
 
6925
7105
  // src/useGamePlay.ts
6926
- 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";
6927
7107
  function toSubmitResult(payload) {
6928
7108
  return {
6929
7109
  // 'pending' means the play is recorded but awaiting resolution (fixture games)
@@ -6935,17 +7115,17 @@ function toSubmitResult(payload) {
6935
7115
  };
6936
7116
  }
6937
7117
  function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
6938
- const [result, setResult] = useState34(null);
6939
- const [submitting, setSubmitting] = useState34(false);
6940
- const [rawStatus, setRawStatus] = useState34(null);
6941
- const inFlightRef = useRef22(false);
6942
- 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);
6943
7123
  convRef.current = conversation;
6944
- const optsRef = useRef22({ gameId, gameDay, fixtureId, locale, refresh });
7124
+ const optsRef = useRef25({ gameId, gameDay, fixtureId, locale, refresh });
6945
7125
  optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
6946
- const resultRef = useRef22(null);
7126
+ const resultRef = useRef25(null);
6947
7127
  resultRef.current = result;
6948
- const refetch = useCallback18(async () => {
7128
+ const refetch = useCallback20(async () => {
6949
7129
  const conv = convRef.current;
6950
7130
  if (!conv) return;
6951
7131
  const opts = optsRef.current;
@@ -6961,7 +7141,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
6961
7141
  } catch {
6962
7142
  }
6963
7143
  }, []);
6964
- const submit = useCallback18(async (answerJson) => {
7144
+ const submit = useCallback20(async (answerJson) => {
6965
7145
  const conv = convRef.current;
6966
7146
  if (!conv || inFlightRef.current) return;
6967
7147
  inFlightRef.current = true;
@@ -6988,14 +7168,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
6988
7168
  setSubmitting(false);
6989
7169
  }
6990
7170
  }, [refetch]);
6991
- const hydrate = useCallback18(() => {
7171
+ const hydrate = useCallback20(() => {
6992
7172
  void refetch();
6993
7173
  }, [refetch]);
6994
7174
  return { result, submitting, submit, hydrate, rawStatus };
6995
7175
  }
6996
7176
 
6997
7177
  // src/components/games/MysteryTigerGame.tsx
6998
- import { useState as useState36, useId as useId3 } from "react";
7178
+ import { useState as useState38, useId as useId3 } from "react";
6999
7179
 
7000
7180
  // src/components/games/nationFlags.ts
7001
7181
  var FLAGS = {
@@ -7206,7 +7386,7 @@ function isNationCode(flag) {
7206
7386
  }
7207
7387
 
7208
7388
  // src/components/games/PlayerAvatar.tsx
7209
- import { useState as useState35 } from "react";
7389
+ import { useState as useState37 } from "react";
7210
7390
  import { jsx as jsx67 } from "react/jsx-runtime";
7211
7391
  function initialsOf(name) {
7212
7392
  const parts = name.trim().split(/\s+/).filter(Boolean);
@@ -7224,7 +7404,7 @@ function PlayerAvatar({
7224
7404
  imagePath,
7225
7405
  className
7226
7406
  }) {
7227
- const [failed, setFailed] = useState35(false);
7407
+ const [failed, setFailed] = useState37(false);
7228
7408
  const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
7229
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) }) });
7230
7410
  }
@@ -7465,7 +7645,7 @@ function MysteryTigerGame({
7465
7645
  onBack
7466
7646
  }) {
7467
7647
  const t = ui.games.mysteryTiger;
7468
- const [query, setQuery] = useState36("");
7648
+ const [query, setQuery] = useState38("");
7469
7649
  const inputId = useId3();
7470
7650
  const clientState = parseClientState(result?.clientStateJson);
7471
7651
  const guessResults = clientState?.guessResults ?? [];
@@ -7727,13 +7907,13 @@ function HigherOrLowerGame({
7727
7907
  }
7728
7908
 
7729
7909
  // src/components/games/CareerPathGame.tsx
7730
- import { useState as useState38, useId as useId4 } from "react";
7910
+ import { useState as useState40, useId as useId4 } from "react";
7731
7911
 
7732
7912
  // src/components/games/ui/CrestShield.tsx
7733
- import { useState as useState37 } from "react";
7913
+ import { useState as useState39 } from "react";
7734
7914
  import { jsx as jsx78 } from "react/jsx-runtime";
7735
7915
  function CrestShield({ src, name, size = 28 }) {
7736
- const [failed, setFailed] = useState37(false);
7916
+ const [failed, setFailed] = useState39(false);
7737
7917
  if (src && !isPlaceholderImage(src) && !failed) {
7738
7918
  return /* @__PURE__ */ jsx78("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
7739
7919
  }
@@ -7765,7 +7945,7 @@ function CareerPathGame({
7765
7945
  }) {
7766
7946
  const s = ui.games.careerPath;
7767
7947
  const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
7768
- const [query, setQuery] = useState38("");
7948
+ const [query, setQuery] = useState40("");
7769
7949
  const inputId = useId4();
7770
7950
  const clientState = parseClientState3(result?.clientStateJson);
7771
7951
  const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
@@ -7872,7 +8052,7 @@ function CareerPathGame({
7872
8052
  }
7873
8053
 
7874
8054
  // src/components/games/BeatTheGridGame.tsx
7875
- 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";
7876
8056
 
7877
8057
  // src/components/games/ui/OptionList.tsx
7878
8058
  import { jsx as jsx80 } from "react/jsx-runtime";
@@ -7961,10 +8141,10 @@ function SearchSheet({
7961
8141
  ui
7962
8142
  }) {
7963
8143
  const s = ui.games.beatTheGrid;
7964
- const [query, setQuery] = useState39("");
8144
+ const [query, setQuery] = useState41("");
7965
8145
  const inputId = useId5();
7966
- const inputRef = useRef23(null);
7967
- useEffect26(() => {
8146
+ const inputRef = useRef26(null);
8147
+ useEffect28(() => {
7968
8148
  inputRef.current?.focus();
7969
8149
  }, [row, col]);
7970
8150
  const filtered = playerPool.filter(
@@ -8029,7 +8209,7 @@ function BeatTheGridGame({
8029
8209
  }) {
8030
8210
  const s = ui.games.beatTheGrid;
8031
8211
  const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
8032
- const [activeCell, setActiveCell] = useState39(null);
8212
+ const [activeCell, setActiveCell] = useState41(null);
8033
8213
  const clientState = parseClientState4(result?.clientStateJson);
8034
8214
  const filledCells = clientState?.cells ?? [];
8035
8215
  const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
@@ -8184,7 +8364,7 @@ function BeatTheGridGame({
8184
8364
  }
8185
8365
 
8186
8366
  // src/components/games/GuessTheXiGame.tsx
8187
- import { useState as useState40, useId as useId6 } from "react";
8367
+ import { useState as useState42, useId as useId6 } from "react";
8188
8368
 
8189
8369
  // src/components/games/ui/PitchSvg.tsx
8190
8370
  import { Fragment as Fragment16, jsx as jsx82, jsxs as jsxs70 } from "react/jsx-runtime";
@@ -8273,7 +8453,7 @@ function GuessTheXiGame({
8273
8453
  onBack
8274
8454
  }) {
8275
8455
  const t = ui.games.guessTheXi;
8276
- const [query, setQuery] = useState40("");
8456
+ const [query, setQuery] = useState42("");
8277
8457
  const inputId = useId6();
8278
8458
  const clientState = parseClientState5(result?.clientStateJson);
8279
8459
  const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
@@ -8416,7 +8596,7 @@ function GuessTheXiGame({
8416
8596
  }
8417
8597
 
8418
8598
  // src/components/games/DailyQuizGame.tsx
8419
- import { useState as useState41 } from "react";
8599
+ import { useState as useState43 } from "react";
8420
8600
  import { Fragment as Fragment18, jsx as jsx84, jsxs as jsxs72 } from "react/jsx-runtime";
8421
8601
  function parseClientState6(json) {
8422
8602
  if (!json) return null;
@@ -8457,8 +8637,8 @@ function DailyQuizGame({
8457
8637
  }) {
8458
8638
  const s = ui.games.dailyQuiz;
8459
8639
  const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
8460
- const [selections, setSelections] = useState41(/* @__PURE__ */ new Map());
8461
- const [page, setPage] = useState41(0);
8640
+ const [selections, setSelections] = useState43(/* @__PURE__ */ new Map());
8641
+ const [page, setPage] = useState43(0);
8462
8642
  const clientState = parseClientState6(result?.clientStateJson);
8463
8643
  const results = clientState?.results ?? [];
8464
8644
  const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
@@ -8568,7 +8748,7 @@ function DailyQuizGame({
8568
8748
  }
8569
8749
 
8570
8750
  // src/components/games/MatchdayPredictorGame.tsx
8571
- import { useId as useId7, useState as useState42 } from "react";
8751
+ import { useId as useId7, useState as useState44 } from "react";
8572
8752
  import { jsx as jsx85, jsxs as jsxs73 } from "react/jsx-runtime";
8573
8753
  var SCORER_SEARCH_THRESHOLD = 9;
8574
8754
  function parseClientState7(json) {
@@ -8664,11 +8844,11 @@ function MatchdayPredictorGame({
8664
8844
  onBack
8665
8845
  }) {
8666
8846
  const t = ui.games.predictor;
8667
- const [homeScore, setHomeScore] = useState42(0);
8668
- const [awayScore, setAwayScore] = useState42(0);
8669
- const [firstScorerPlayerId, setFirstScorerPlayerId] = useState42(null);
8670
- const [lastEdited, setLastEdited] = useState42("home");
8671
- 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("");
8672
8852
  const searchId = useId7();
8673
8853
  const clientState = parseClientState7(result?.clientStateJson);
8674
8854
  const alreadyPlayed = result?.alreadyPlayed === true;
@@ -8836,7 +9016,7 @@ function MatchdayPredictorGame({
8836
9016
  }
8837
9017
 
8838
9018
  // src/components/games/StartingXiGame.tsx
8839
- import { useId as useId8, useState as useState43 } from "react";
9019
+ import { useId as useId8, useState as useState45 } from "react";
8840
9020
  import { Fragment as Fragment19, jsx as jsx86, jsxs as jsxs74 } from "react/jsx-runtime";
8841
9021
  var POINTS_PER_STARTER = 8;
8842
9022
  var XI_SIZE = 11;
@@ -8880,9 +9060,9 @@ function StartingXiGame({
8880
9060
  lockAtUtc
8881
9061
  }) {
8882
9062
  const t = ui.games.startingXi;
8883
- const [slotPlayers, setSlotPlayers] = useState43(() => Array(XI_SIZE).fill(null));
8884
- const [active, setActive] = useState43(0);
8885
- 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("");
8886
9066
  const searchId = useId8();
8887
9067
  const clientState = parseClientState8(result?.clientStateJson);
8888
9068
  const alreadyPlayed = result?.alreadyPlayed === true;
@@ -9022,7 +9202,7 @@ function StartingXiGame({
9022
9202
  }
9023
9203
 
9024
9204
  // src/components/games/StatLadderGame.tsx
9025
- import { useId as useId9, useState as useState44 } from "react";
9205
+ import { useId as useId9, useState as useState46 } from "react";
9026
9206
  import { jsx as jsx87, jsxs as jsxs75 } from "react/jsx-runtime";
9027
9207
  function ladderClue(ladder) {
9028
9208
  const mystery = ladder.find((r) => r.rank === 2);
@@ -9059,8 +9239,8 @@ function StatLadderGame({
9059
9239
  onBack
9060
9240
  }) {
9061
9241
  const t = ui.games.statLadder;
9062
- const [query, setQuery] = useState44("");
9063
- const [selectedId, setSelectedId] = useState44(null);
9242
+ const [query, setQuery] = useState46("");
9243
+ const [selectedId, setSelectedId] = useState46(null);
9064
9244
  const searchId = useId9();
9065
9245
  const clientState = parseClientState9(result?.clientStateJson);
9066
9246
  const revealed = clientState != null;
@@ -9267,8 +9447,8 @@ function GameScreenHost({
9267
9447
  ui
9268
9448
  }) {
9269
9449
  const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
9270
- const [configJson, setConfigJson] = useState45(null);
9271
- useEffect27(() => {
9450
+ const [configJson, setConfigJson] = useState47(null);
9451
+ useEffect29(() => {
9272
9452
  setConfigJson(null);
9273
9453
  if (!conversation) return;
9274
9454
  let cancelled = false;
@@ -9291,12 +9471,12 @@ function GameScreenHost({
9291
9471
  fixtureId: fixtureId || void 0,
9292
9472
  locale: ui.games.lang
9293
9473
  });
9294
- useEffect27(() => {
9474
+ useEffect29(() => {
9295
9475
  if (conversation) hydrate();
9296
9476
  }, [conversation, gameId]);
9297
- const hydrateRef = useRef24(hydrate);
9477
+ const hydrateRef = useRef27(hydrate);
9298
9478
  hydrateRef.current = hydrate;
9299
- useEffect27(() => {
9479
+ useEffect29(() => {
9300
9480
  if (!FIXTURE_GAME_IDS.has(gameId)) return;
9301
9481
  if (rawStatus !== "pending") return;
9302
9482
  const timerId = setInterval(() => {
@@ -9409,7 +9589,7 @@ function GameScreenHost({
9409
9589
  }
9410
9590
 
9411
9591
  // src/components/Leaderboard.tsx
9412
- import { useState as useState46 } from "react";
9592
+ import { useState as useState48 } from "react";
9413
9593
 
9414
9594
  // src/components/LeaderboardRow.tsx
9415
9595
  import { jsx as jsx90, jsxs as jsxs77 } from "react/jsx-runtime";
@@ -9494,7 +9674,7 @@ function Leaderboard({
9494
9674
  ui,
9495
9675
  onPlay
9496
9676
  }) {
9497
- const [segment, setSegment] = useState46("weekly");
9677
+ const [segment, setSegment] = useState48("weekly");
9498
9678
  const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
9499
9679
  const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
9500
9680
  const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
@@ -9597,9 +9777,9 @@ function GamesPanel({
9597
9777
  leaderboardLoading,
9598
9778
  refreshHub
9599
9779
  }) {
9600
- const [selected, setSelected] = useState47(null);
9601
- const [segment, setSegment] = useState47("play");
9602
- useEffect28(() => {
9780
+ const [selected, setSelected] = useState49(null);
9781
+ const [segment, setSegment] = useState49("play");
9782
+ useEffect30(() => {
9603
9783
  ensureGamesFonts();
9604
9784
  }, []);
9605
9785
  if (!loggedIn) return /* @__PURE__ */ jsx94(GamesLoginWall, { ui });
@@ -9747,8 +9927,7 @@ function Standings({ standings, loading, ui }) {
9747
9927
  ] }, `${gi}-${group.table ?? "none"}`)) });
9748
9928
  }
9749
9929
 
9750
- // src/components/Squad.tsx
9751
- import { jsx as jsx97, jsxs as jsxs83 } from "react/jsx-runtime";
9930
+ // src/components/groupByPosition.ts
9752
9931
  function groupByPosition(players) {
9753
9932
  const groups = [];
9754
9933
  for (const p of players) {
@@ -9758,26 +9937,181 @@ function groupByPosition(players) {
9758
9937
  }
9759
9938
  return groups;
9760
9939
  }
9761
- function Squad({ squad, loading, ui }) {
9762
- if (squad === null && loading) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-list" });
9763
- if (squad === null || squad.length === 0) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-empty", children: ui.clubSquadEmpty });
9764
- return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-list", children: groupByPosition(squad).map((group, gi) => /* @__PURE__ */ jsxs83("div", { children: [
9765
- group.positionName && /* @__PURE__ */ jsx97("div", { className: "ss-w-club-eyebrow", children: group.positionName }),
9766
- group.items.map((p) => /* @__PURE__ */ jsxs83("div", { className: "ss-w-sq-row", children: [
9767
- /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-num", children: p.jerseyNumber ?? "" }),
9768
- /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-name", children: p.playerName })
9769
- ] }, p.playerId))
9770
- ] }, `${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
+ ] });
9771
10105
  }
9772
10106
 
9773
10107
  // src/components/PresetSpeedDial.tsx
9774
10108
  import { useId as useId10 } from "react";
9775
- import { jsx as jsx98, jsxs as jsxs84 } from "react/jsx-runtime";
10109
+ import { jsx as jsx100, jsxs as jsxs86 } from "react/jsx-runtime";
9776
10110
  function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef, buttonRef }) {
9777
10111
  const pillsId = useId10();
9778
10112
  const tabIndex = expanded ? 0 : -1;
9779
- return /* @__PURE__ */ jsxs84("div", { ref: rootRef, className: "ss-w-dial", children: [
9780
- /* @__PURE__ */ jsxs84(
10113
+ return /* @__PURE__ */ jsxs86("div", { ref: rootRef, className: "ss-w-dial", children: [
10114
+ /* @__PURE__ */ jsxs86(
9781
10115
  "button",
9782
10116
  {
9783
10117
  ref: buttonRef,
@@ -9788,36 +10122,36 @@ function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef
9788
10122
  "aria-label": strings.dialName,
9789
10123
  onClick: onToggle,
9790
10124
  children: [
9791
- /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-icon ss-w-dial-icon--open", children: /* @__PURE__ */ jsx98(SlidersIcon, {}) }),
9792
- /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-icon ss-w-dial-icon--close", children: /* @__PURE__ */ jsx98(CloseIcon, {}) }),
9793
- 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
9794
10128
  ]
9795
10129
  }
9796
10130
  ),
9797
- /* @__PURE__ */ jsxs84("div", { id: pillsId, className: "ss-w-dial-pills", "data-open": expanded ? "" : void 0, children: [
9798
- /* @__PURE__ */ jsxs84("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("numbers"), children: [
9799
- /* @__PURE__ */ jsx98(SlidersIcon, {}),
9800
- /* @__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 })
9801
10135
  ] }),
9802
- /* @__PURE__ */ jsxs84("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("combo"), children: [
9803
- /* @__PURE__ */ jsx98(ComboIcon, {}),
9804
- /* @__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 })
9805
10139
  ] })
9806
10140
  ] })
9807
10141
  ] });
9808
10142
  }
9809
10143
 
9810
10144
  // src/components/PresetTools.tsx
9811
- import { Fragment as Fragment21, useEffect as useEffect29, useId as useId11, useRef as useRef25, useState as useState48 } from "react";
9812
- 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";
9813
10147
  var FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
9814
10148
  function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
9815
- const dialogRef = useRef25(null);
10149
+ const dialogRef = useRef28(null);
9816
10150
  const titleId = useId11();
9817
- useEffect29(() => {
10151
+ useEffect31(() => {
9818
10152
  dialogRef.current?.focus();
9819
10153
  }, []);
9820
- useEffect29(() => {
10154
+ useEffect31(() => {
9821
10155
  const onKey = (e) => {
9822
10156
  if (e.key !== "Escape") return;
9823
10157
  e.stopPropagation();
@@ -9847,79 +10181,79 @@ function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
9847
10181
  first.focus();
9848
10182
  }
9849
10183
  };
9850
- 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: [
9851
- /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-head", children: [
9852
- /* @__PURE__ */ jsx99("h2", { id: titleId, className: "ss-w-tool-title", children: title }),
9853
- /* @__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, {}) })
9854
10188
  ] }),
9855
- /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-body", children }),
9856
- 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
9857
10191
  ] }) });
9858
10192
  }
9859
10193
  function fillTemplate(template, slots) {
9860
10194
  return template.split(/(\{[a-z]+\})/).filter((part) => part !== "").map((part, i) => {
9861
10195
  const key = /^\{([a-z]+)\}$/.exec(part)?.[1];
9862
- 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);
9863
10197
  });
9864
10198
  }
9865
10199
  function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
9866
10200
  const selected = Math.max(0, choices2.findIndex((c) => c.text === current));
9867
- return /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-num", children: [
9868
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
9869
- /* @__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) => {
9870
10204
  const c = choices2[Number(e.target.value)];
9871
10205
  if (c) onChoose(c.value);
9872
- }, 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)) })
9873
10207
  ] });
9874
10208
  }
9875
10209
  function ChoiceSelect({ currentIdx, sizeLabels, optionLabels, label, onChoose }) {
9876
10210
  const sizeText = sizeLabels[currentIdx] ?? "";
9877
- return /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-num", children: [
9878
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: sizeText }),
9879
- /* @__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)) })
9880
10214
  ] });
9881
10215
  }
9882
10216
  function SendButton({ label, display, disabled, onClick }) {
9883
- 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 });
9884
10218
  }
9885
10219
  function PickList({ picks, formatKickoff }) {
9886
- return /* @__PURE__ */ jsx99("ul", { className: "ss-w-tool-picks", role: "list", children: picks.map((p) => /* @__PURE__ */ jsxs85("li", { className: "ss-w-tool-pick", children: [
9887
- /* @__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: [
9888
10222
  p.homeTeamName,
9889
10223
  " \u2013 ",
9890
10224
  p.awayTeamName
9891
10225
  ] }),
9892
- /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-pick-sel", children: [
10226
+ /* @__PURE__ */ jsxs87("span", { className: "ss-w-tool-pick-sel", children: [
9893
10227
  p.marketLabel,
9894
10228
  ": ",
9895
10229
  p.selectionLabel,
9896
10230
  p.line ? ` ${p.line}` : ""
9897
10231
  ] }),
9898
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-pick-kick", children: formatKickoff(p.kickoffUtc) }),
9899
- /* @__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) })
9900
10234
  ] }, p.matchOddsId)) });
9901
10235
  }
9902
10236
  function ComboPreview({ cell, formatKickoff }) {
9903
- return /* @__PURE__ */ jsxs85(Fragment22, { children: [
9904
- /* @__PURE__ */ jsx99(PickList, { picks: cell.combo.legs, formatKickoff }),
9905
- /* @__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 })
9906
10240
  ] });
9907
10241
  }
9908
10242
  function Unavailable({ text }) {
9909
- return /* @__PURE__ */ jsx99("p", { className: "ss-w-tool-unavailable", children: text });
10243
+ return /* @__PURE__ */ jsx101("p", { className: "ss-w-tool-unavailable", children: text });
9910
10244
  }
9911
10245
  function AskRow({ icon, ask, ready, send }) {
9912
- return /* @__PURE__ */ jsxs85("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
9913
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
9914
- /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-main", children: [
9915
- /* @__PURE__ */ jsx99("p", { className: "ss-w-tool-ask", children: ask }),
9916
- 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
9917
10251
  ] }),
9918
10252
  send
9919
10253
  ] });
9920
10254
  }
9921
10255
  function RoundSend({ label, display, disabled, onClick }) {
9922
- 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, {}) });
9923
10257
  }
9924
10258
  var BIG_COMBO = { total: 50, legs: 6 };
9925
10259
  function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
@@ -9928,15 +10262,15 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
9928
10262
  const totals = comboTotals(grid);
9929
10263
  const legChoices = comboLegChoices(grid);
9930
10264
  const count = FIXED_SINGLES_COUNT;
9931
- const [maxPrice, setMaxPrice] = useState48(() => startSingles(grid.singles, limits, START.maxPrice, count));
9932
- const [minPrice, setMinPrice] = useState48(() => startSingles(grid.singlesFrom, floors, START.minPrice, count));
9933
- const [start] = useState48(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
9934
- const [total, setTotal] = useState48(start.total);
9935
- const [legs, setLegs] = useState48(start.legs);
9936
- const [bigStart] = useState48(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
9937
- const [bigTotal, setBigTotal] = useState48(bigStart.total);
9938
- const [bigLegs, setBigLegs] = useState48(bigStart.legs);
9939
- 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("");
9940
10274
  const maxCell = findSingles(grid.singles, maxPrice, count);
9941
10275
  const minCell = findSingles(grid.singlesFrom, minPrice, count);
9942
10276
  const comboCell = findCombo(grid, total, legs);
@@ -9980,95 +10314,95 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
9980
10314
  const totalChoices = totals.map((v) => ({ value: v, text: v.toFixed(1), available: legChoices.some((n) => !!findCombo(grid, v, n)) }));
9981
10315
  const legChoicesFor = (t) => legChoices.map((n) => ({ value: n, text: String(n), available: !!findCombo(grid, t, n) }));
9982
10316
  const markets = grid.markets ?? [];
9983
- const [marketIdx, setMarketIdx] = useState48(0);
10317
+ const [marketIdx, setMarketIdx] = useState50(0);
9984
10318
  const marketCell = markets[marketIdx] ?? null;
9985
10319
  const marketLabels = markets.map((c) => strings.marketShort(c.marketDeveloperName, c.marketLabel, c.selectionLabel ?? null));
9986
10320
  const singlesReady = (cell) => cell ? strings.readyCount(cell.picks.length) : strings.unavailable;
9987
10321
  const comboReady = (cell) => cell ? strings.readyAt(cell.combo.total) : strings.unavailable;
9988
- return /* @__PURE__ */ jsxs85(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
9989
- /* @__PURE__ */ jsx99(
10322
+ return /* @__PURE__ */ jsxs87(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
10323
+ /* @__PURE__ */ jsx101(
9990
10324
  AskRow,
9991
10325
  {
9992
10326
  icon: "\u{1F3AF}",
9993
10327
  ask: fillTemplate(strings.maxPriceRow, {
9994
10328
  count: String(count),
9995
- 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 })
9996
10330
  }),
9997
10331
  ready: singlesReady(maxCell),
9998
- 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: () => {
9999
10333
  if (maxCell) onSend(maxPriceAsk(maxCell, strings));
10000
10334
  } })
10001
10335
  }
10002
10336
  ),
10003
- /* @__PURE__ */ jsx99(
10337
+ /* @__PURE__ */ jsx101(
10004
10338
  AskRow,
10005
10339
  {
10006
10340
  icon: "\u{1F4C8}",
10007
10341
  ask: fillTemplate(strings.minPriceRow, {
10008
10342
  count: String(count),
10009
- 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 })
10010
10344
  }),
10011
10345
  ready: singlesReady(minCell),
10012
- 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: () => {
10013
10347
  if (minCell) onSend(minPriceAsk(minCell, strings));
10014
10348
  } })
10015
10349
  }
10016
10350
  ),
10017
- /* @__PURE__ */ jsx99(
10351
+ /* @__PURE__ */ jsx101(
10018
10352
  AskRow,
10019
10353
  {
10020
10354
  icon: "\u2728",
10021
10355
  ask: fillTemplate(strings.comboRow, {
10022
- legs: /* @__PURE__ */ jsx99(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
10023
- 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 })
10024
10358
  }),
10025
10359
  ready: comboReady(comboCell),
10026
- 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: () => {
10027
10361
  if (comboCell) onSend(comboAsk(comboCell, strings));
10028
10362
  } })
10029
10363
  }
10030
10364
  ),
10031
- /* @__PURE__ */ jsx99(
10365
+ /* @__PURE__ */ jsx101(
10032
10366
  AskRow,
10033
10367
  {
10034
10368
  icon: "\u{1F3C6}",
10035
10369
  ask: fillTemplate(strings.bigComboRow, {
10036
- legs: /* @__PURE__ */ jsx99(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
10037
- 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 })
10038
10372
  }),
10039
10373
  ready: comboReady(bigCell),
10040
- 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: () => {
10041
10375
  if (bigCell) onSend(comboAsk(bigCell, strings));
10042
10376
  } })
10043
10377
  }
10044
10378
  ),
10045
- markets.length > 0 && /* @__PURE__ */ jsx99(
10379
+ markets.length > 0 && /* @__PURE__ */ jsx101(
10046
10380
  AskRow,
10047
10381
  {
10048
10382
  icon: "\u26BD",
10049
10383
  ask: fillTemplate(strings.marketRow, {
10050
- 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 })
10051
10385
  }),
10052
10386
  ready: marketCell ? strings.readyCount(marketCell.count) : null,
10053
- 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: () => {
10054
10388
  if (marketCell) onSend(marketAsk(marketCell, strings));
10055
10389
  } })
10056
10390
  }
10057
10391
  ),
10058
- /* @__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 })
10059
10393
  ] });
10060
10394
  }
10061
10395
  function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal, initialLegs, onSend, onClose }) {
10062
10396
  const totals = comboTotals(grid);
10063
10397
  const legChoices = comboLegChoices(grid);
10064
- const [start] = useState48(() => initialTotal === void 0 ? startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs) : null);
10065
- const [total, setTotal] = useState48(() => initialTotal !== void 0 ? nearest(totals, initialTotal) : start.total);
10066
- 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(() => {
10067
10401
  if (initialTotal === void 0) return initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : start.legs;
10068
10402
  const from = initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : startValue(legChoices, START.comboLegs);
10069
10403
  return legsForTotal(grid, nearest(totals, initialTotal), from);
10070
10404
  });
10071
- const [announcement, setAnnouncement] = useState48("");
10405
+ const [announcement, setAnnouncement] = useState50("");
10072
10406
  const cell = findCombo(grid, total, legs);
10073
10407
  const minLegs = legChoices[0] ?? legs;
10074
10408
  const maxLegs = legChoices[legChoices.length - 1] ?? legs;
@@ -10079,29 +10413,29 @@ function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal,
10079
10413
  const d = strings.comboDisplay(nextLegs, nextTotal);
10080
10414
  setAnnouncement(findCombo(grid, nextTotal, nextLegs) ? d : `${d}. ${strings.unavailable}`);
10081
10415
  };
10082
- 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: () => {
10083
10417
  if (cell) onSend(comboAsk(cell, strings));
10084
10418
  } });
10085
- return /* @__PURE__ */ jsxs85(PresetToolModal, { title: strings.buildCombo, closeLabel: strings.close, onClose, footer, children: [
10086
- /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.totalLabel, children: [
10087
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.totalLabel }),
10088
- /* @__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)) })
10089
10423
  ] }),
10090
- /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.matchesLabel, children: [
10091
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.matchesLabel }),
10092
- /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-stepper", children: [
10093
- /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.fewerMatches, disabled: legs <= minLegs, onClick: () => choose(total, legs - 1), children: "\u2212" }),
10094
- /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-count", children: legs }),
10095
- /* @__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: "+" })
10096
10430
  ] })
10097
10431
  ] }),
10098
- cell ? /* @__PURE__ */ jsx99(ComboPreview, { cell, formatKickoff }) : /* @__PURE__ */ jsx99(Unavailable, { text: strings.unavailable }),
10099
- /* @__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 })
10100
10434
  ] });
10101
10435
  }
10102
10436
 
10103
10437
  // src/usePresetDial.ts
10104
- 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";
10105
10439
  function sendInFlight(messages, isStreaming) {
10106
10440
  const last = messages[messages.length - 1];
10107
10441
  return isStreaming && !!last && last.role === "assistant" && !last.done && !last.isGreeting;
@@ -10115,25 +10449,25 @@ function lastUserId(messages) {
10115
10449
  }
10116
10450
  var SCROLL_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "PageUp", "PageDown", "Home", "End", " "]);
10117
10451
  function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming, activeTab }) {
10118
- const [expanded, setExpanded] = useState49(() => !sendInFlight(messages, isStreaming));
10119
- const fold = useCallback19(() => setExpanded(false), []);
10120
- 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), []);
10121
10455
  const currentUserId = lastUserId(messages);
10122
- const userIdRef = useRef26(currentUserId);
10123
- useEffect30(() => {
10456
+ const userIdRef = useRef29(currentUserId);
10457
+ useEffect32(() => {
10124
10458
  if (currentUserId === userIdRef.current) return;
10125
10459
  userIdRef.current = currentUserId;
10126
10460
  setExpanded(false);
10127
10461
  }, [currentUserId]);
10128
- const tabRef = useRef26(activeTab);
10129
- useEffect30(() => {
10462
+ const tabRef = useRef29(activeTab);
10463
+ useEffect32(() => {
10130
10464
  if (activeTab === tabRef.current) return;
10131
10465
  tabRef.current = activeTab;
10132
10466
  setExpanded(false);
10133
10467
  }, [activeTab]);
10134
- const expandedRef = useRef26(expanded);
10468
+ const expandedRef = useRef29(expanded);
10135
10469
  expandedRef.current = expanded;
10136
- useEffect30(() => {
10470
+ useEffect32(() => {
10137
10471
  const onEscape = (e) => {
10138
10472
  const dial = dialRef.current;
10139
10473
  if (e.key !== "Escape" || !dial || !e.composedPath().includes(dial)) return;
@@ -10146,7 +10480,7 @@ function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming
10146
10480
  window.addEventListener("keydown", onEscape, true);
10147
10481
  return () => window.removeEventListener("keydown", onEscape, true);
10148
10482
  }, [dialRef, dialButtonRef]);
10149
- useEffect30(() => {
10483
+ useEffect32(() => {
10150
10484
  if (!expanded) return;
10151
10485
  const layer = layerRef.current;
10152
10486
  const inDial = (e) => {
@@ -10198,11 +10532,11 @@ function markToolSeen() {
10198
10532
  }
10199
10533
 
10200
10534
  // src/components/ChatPanel.tsx
10201
- 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";
10202
10536
  var FULLSCREEN_QUERY = "(max-width: 639px)";
10203
10537
  function useIsModal() {
10204
- const [modal, setModal] = useState50(false);
10205
- useEffect31(() => {
10538
+ const [modal, setModal] = useState52(false);
10539
+ useEffect33(() => {
10206
10540
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
10207
10541
  const mql = window.matchMedia(FULLSCREEN_QUERY);
10208
10542
  const sync = () => setModal(mql.matches);
@@ -10213,10 +10547,38 @@ function useIsModal() {
10213
10547
  return modal;
10214
10548
  }
10215
10549
  var HIDDEN_LAYER_STYLE = { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" };
10216
- 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 }) {
10217
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]);
10218
10580
  const isModal = useIsModal();
10219
- useEffect31(() => {
10581
+ useEffect33(() => {
10220
10582
  const onKey = (e) => {
10221
10583
  if (e.key === "Escape") close();
10222
10584
  };
@@ -10232,19 +10594,19 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10232
10594
  monitor?.setActiveTab("chat");
10233
10595
  send(text, { grounding });
10234
10596
  };
10235
- useEffect31(() => {
10597
+ useEffect33(() => {
10236
10598
  if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
10237
10599
  }, [monitor, state.isStreaming, state.messages.length]);
10238
10600
  const onChatTab = !monitor || monitor.activeTab === "chat";
10239
- const layerRef = useRef27(null);
10240
- const dialRef = useRef27(null);
10241
- const dialButtonRef = useRef27(null);
10242
- const inputRef = useRef27(null);
10243
- const limitRef = useRef27(null);
10244
- const typedSendRef = useRef27(false);
10245
- const focusAfterCloseRef = useRef27(null);
10246
- const [tool, setTool] = useState50(null);
10247
- 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);
10248
10610
  const dial = usePresetDial({
10249
10611
  layerRef,
10250
10612
  dialRef,
@@ -10256,53 +10618,53 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10256
10618
  const { fold } = dial;
10257
10619
  const paused = isPaused(state.limit);
10258
10620
  const showDial = !!presetGrid && onChatTab && !tool && !paused;
10259
- useEffect31(() => {
10621
+ useEffect33(() => {
10260
10622
  if (paused) setTool(null);
10261
10623
  }, [paused]);
10262
- useEffect31(() => {
10624
+ useEffect33(() => {
10263
10625
  if (!paused) return;
10264
10626
  if (typedSendRef.current) limitRef.current?.focus();
10265
10627
  typedSendRef.current = false;
10266
10628
  }, [paused]);
10267
- const openTool = useCallback20((next) => {
10629
+ const openTool = useCallback22((next) => {
10268
10630
  fold();
10269
10631
  markToolSeen();
10270
10632
  setToolSeen(true);
10271
10633
  setTool(next);
10272
10634
  }, [fold]);
10273
- 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]);
10274
10636
  const toolsValue = useMemo5(
10275
10637
  () => presetGrid && !paused ? { openBuilder: (total, legs) => openTool({ kind: "combo", total, legs }), changeLabel: ui.presets.changeCombo } : null,
10276
10638
  [presetGrid, paused, openTool, ui.presets.changeCombo]
10277
10639
  );
10278
- const closeTool = useCallback20(() => {
10640
+ const closeTool = useCallback22(() => {
10279
10641
  focusAfterCloseRef.current = "dial";
10280
10642
  setTool(null);
10281
10643
  }, []);
10282
- const sendAsk = useCallback20((ask) => {
10644
+ const sendAsk = useCallback22((ask) => {
10283
10645
  focusAfterCloseRef.current = "composer";
10284
10646
  setTool(null);
10285
10647
  monitor?.setActiveTab("chat");
10286
10648
  send(ask.message, { displayText: ask.displayText, preset: ask.preset });
10287
10649
  }, [monitor, send]);
10288
- const formatKickoff = useCallback20((kickoffUtc) => {
10650
+ const formatKickoff = useCallback22((kickoffUtc) => {
10289
10651
  const k = ui.bettingKickoff(kickoffUtc);
10290
10652
  return `${k.dayLabel} ${k.time}`;
10291
10653
  }, [ui]);
10292
- useEffect31(() => {
10654
+ useEffect33(() => {
10293
10655
  if (tool) return;
10294
10656
  const target = focusAfterCloseRef.current;
10295
10657
  focusAfterCloseRef.current = null;
10296
10658
  if (target === "dial") dialButtonRef.current?.focus();
10297
10659
  else if (target === "composer") inputRef.current?.focus();
10298
10660
  }, [tool]);
10299
- useEffect31(() => {
10661
+ useEffect33(() => {
10300
10662
  if (!tool || onChatTab && presetGrid) return;
10301
10663
  focusAfterCloseRef.current = "composer";
10302
10664
  setTool(null);
10303
10665
  }, [tool, onChatTab, presetGrid]);
10304
- return /* @__PURE__ */ jsxs86("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
10305
- /* @__PURE__ */ jsx100(
10666
+ return /* @__PURE__ */ jsxs88("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
10667
+ /* @__PURE__ */ jsx102(
10306
10668
  ChatHeader,
10307
10669
  {
10308
10670
  onClose: close,
@@ -10315,7 +10677,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10315
10677
  moreOptionsLabel: ui.moreOptions
10316
10678
  }
10317
10679
  ),
10318
- monitor && /* @__PURE__ */ jsx100(
10680
+ monitor && /* @__PURE__ */ jsx102(
10319
10681
  TabBar,
10320
10682
  {
10321
10683
  monitor,
@@ -10328,9 +10690,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10328
10690
  clubEnabled: clubFixturesResult?.enabled ?? false
10329
10691
  }
10330
10692
  ),
10331
- /* @__PURE__ */ jsxs86("div", { ref: layerRef, className: "ss-w-chat-layer", "data-dial": presetGrid ? "" : void 0, style: onChatTab ? void 0 : HIDDEN_LAYER_STYLE, children: [
10332
- /* @__PURE__ */ jsx100(PresetToolsContext.Provider, { value: toolsValue, children: /* @__PURE__ */ jsx100(MessageList, { controller, ui, slip, onDashboardTap, monitor }) }),
10333
- 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(
10334
10696
  PresetSpeedDial,
10335
10697
  {
10336
10698
  expanded: dial.expanded,
@@ -10342,15 +10704,38 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10342
10704
  buttonRef: dialButtonRef
10343
10705
  }
10344
10706
  ) : null,
10345
- 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
10346
10708
  ] }),
10347
- monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx100(TodayPanel, { discovery, ui, monitor }),
10348
- monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx100(MatchesPanel, { monitor, ui, slip, onAsk: paused ? void 0 : handleAsk }),
10349
- monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx100(OddsPanel, { monitor, ui, slip }),
10350
- monitor && monitor.activeTab === "fixtures" && /* @__PURE__ */ jsx100(Fixtures, { fixtures: clubFixturesResult?.fixtures ?? [], loading: clubFixturesResult?.loading ?? false, ui }),
10351
- monitor && monitor.activeTab === "standings" && /* @__PURE__ */ jsx100(Standings, { standings: clubStandingsResult?.data ?? null, loading: clubStandingsResult?.loading ?? false, ui }),
10352
- monitor && monitor.activeTab === "squad" && /* @__PURE__ */ jsx100(Squad, { squad: clubSquadResult?.data ?? null, loading: clubSquadResult?.loading ?? false, ui }),
10353
- 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(
10354
10739
  GamesPanel,
10355
10740
  {
10356
10741
  loggedIn: !!loggedIn,
@@ -10365,9 +10750,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10365
10750
  }
10366
10751
  }
10367
10752
  ),
10368
- (!monitor || monitor.activeTab !== "games") && /* @__PURE__ */ jsxs86(Fragment23, { children: [
10369
- /* @__PURE__ */ jsx100("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
10370
- 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(
10371
10756
  ChatInput,
10372
10757
  {
10373
10758
  ref: inputRef,
@@ -10386,9 +10771,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10386
10771
  }
10387
10772
 
10388
10773
  // src/components/HostEventsProvider.tsx
10389
- import { jsx as jsx101 } from "react/jsx-runtime";
10774
+ import { jsx as jsx103 } from "react/jsx-runtime";
10390
10775
  function HostEventsProvider({ value, children }) {
10391
- return /* @__PURE__ */ jsx101(SlipStateContext.Provider, { value: value.slipState, children });
10776
+ return /* @__PURE__ */ jsx103(SlipStateContext.Provider, { value: value.slipState, children });
10392
10777
  }
10393
10778
 
10394
10779
  // src/styles/css.generated.ts
@@ -11467,7 +11852,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
11467
11852
  /* live monitor tab bar: underline pattern mirrors .ss-w-ecard-scope; the unread dot uses --ss-w-neg */
11468
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; }
11469
11854
  .ss-w-tabs::-webkit-scrollbar { display: none; }
11470
- .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; }
11471
11856
  .ss-w-tab[data-on] { color: var(--ss-w-ink); border-bottom-color: var(--ss-w-accent); }
11472
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; }
11473
11858
  .ss-w-tab[data-on] .ss-w-tab-count { color: var(--ss-w-accent); }
@@ -11549,6 +11934,28 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
11549
11934
  .ss-w-sq-row { display: flex; align-items: center; gap: 10px; padding: 7px 2px; border-bottom: 1px solid var(--ss-w-line); }
11550
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); }
11551
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); }
11552
11959
  /* Per-pin unavailable state: the pin's context line still rendered above (score, name, unpin), but
11553
11960
  the pin has neither a card nor history (compose-time rescue failed) -- a small inline note beats
11554
11961
  a bare context line with nothing under it. */
@@ -12152,7 +12559,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
12152
12559
  `;
12153
12560
 
12154
12561
  // src/StatsWidget.tsx
12155
- import { jsx as jsx102 } from "react/jsx-runtime";
12562
+ import { jsx as jsx104 } from "react/jsx-runtime";
12156
12563
  function buildClient(props) {
12157
12564
  try {
12158
12565
  if ("client" in props && props.client) {
@@ -12186,14 +12593,14 @@ function StatsWidget(props) {
12186
12593
  [built?.client]
12187
12594
  );
12188
12595
  const ui = useMemo6(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
12189
- const rootRef = useRef28(null);
12190
- const introDoneRef = useRef28(false);
12191
- const markIntroDone = useCallback21(() => {
12596
+ const rootRef = useRef31(null);
12597
+ const introDoneRef = useRef31(false);
12598
+ const markIntroDone = useCallback23(() => {
12192
12599
  introDoneRef.current = true;
12193
12600
  }, []);
12194
12601
  const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
12195
12602
  const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
12196
- const [hasToday, setHasToday] = useState51(false);
12603
+ const [hasToday, setHasToday] = useState53(false);
12197
12604
  const liveCardWatches = useMemo6(() => {
12198
12605
  const seen = /* @__PURE__ */ new Set();
12199
12606
  const out = [];
@@ -12220,15 +12627,15 @@ function StatsWidget(props) {
12220
12627
  });
12221
12628
  const operatorUserId = cfg?.userContext?.operatorUserId;
12222
12629
  const anonymousUserId = cfg?.userContext?.anonymousUserId;
12223
- const getSchedule = useCallback21(
12630
+ const getSchedule = useCallback23(
12224
12631
  (localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes, operatorUserId, anonymousUserId) : Promise.resolve(null),
12225
12632
  [built, operatorUserId, anonymousUserId]
12226
12633
  );
12227
- const postLeagueStar = useCallback21(
12634
+ const postLeagueStar = useCallback23(
12228
12635
  (competitionId, starred) => built ? built.conversation.starLeague(competitionId, starred, operatorUserId, anonymousUserId) : Promise.resolve(null),
12229
12636
  [built, operatorUserId, anonymousUserId]
12230
12637
  );
12231
- const getStates = useCallback21(
12638
+ const getStates = useCallback23(
12232
12639
  (matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
12233
12640
  [built]
12234
12641
  );
@@ -12247,11 +12654,11 @@ function StatsWidget(props) {
12247
12654
  pinnedMatchIds
12248
12655
  });
12249
12656
  const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
12250
- useEffect32(() => {
12657
+ useEffect34(() => {
12251
12658
  setHasToday(todayHasContent);
12252
12659
  }, [todayHasContent]);
12253
- const prevLiveSnapshotRef = useRef28(monitor.snapshot);
12254
- useEffect32(() => {
12660
+ const prevLiveSnapshotRef = useRef31(monitor.snapshot);
12661
+ useEffect34(() => {
12255
12662
  const snap = monitor.snapshot;
12256
12663
  if (!snap || snap === prevLiveSnapshotRef.current) return;
12257
12664
  prevLiveSnapshotRef.current = snap;
@@ -12289,14 +12696,16 @@ function StatsWidget(props) {
12289
12696
  const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
12290
12697
  const clubStandingsResult = useClubStandings(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
12291
12698
  const clubSquadResult = useClubSquad(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
12292
- 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(
12293
12702
  (locale2) => built ? built.conversation.getPricePresets(locale2, { pool: "open" }) : Promise.resolve(null),
12294
12703
  [built]
12295
12704
  );
12296
12705
  const presetGrid = usePresetGrid({ getPricePresets, isOpen: controller.state.isOpen, locale: ui.presets.lang });
12297
12706
  const markTodayActivity = monitor.markTodayActivity;
12298
- const prevLiveCountRef = useRef28(0);
12299
- useEffect32(() => {
12707
+ const prevLiveCountRef = useRef31(0);
12708
+ useEffect34(() => {
12300
12709
  const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
12301
12710
  prevLiveCountRef.current = discovery.liveCount;
12302
12711
  if (rose) markTodayActivity();
@@ -12346,11 +12755,11 @@ function StatsWidget(props) {
12346
12755
  })
12347
12756
  }));
12348
12757
  const conversationId = controller.state.conversationId ?? void 0;
12349
- useEffect32(() => {
12758
+ useEffect34(() => {
12350
12759
  if (!logger) return;
12351
12760
  logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
12352
12761
  }, [logger, operatorUserId, anonymousUserId, conversationId]);
12353
- useEffect32(() => {
12762
+ useEffect34(() => {
12354
12763
  if (!logger) return;
12355
12764
  logger.resume();
12356
12765
  const onHide = () => {
@@ -12368,14 +12777,14 @@ function StatsWidget(props) {
12368
12777
  logger.dispose();
12369
12778
  };
12370
12779
  }, [logger]);
12371
- useEffect32(() => {
12780
+ useEffect34(() => {
12372
12781
  if (!built || !ui.injectStyles) return;
12373
12782
  const node = rootRef.current?.getRootNode();
12374
12783
  if (node) injectStyles(node);
12375
12784
  }, [built, ui.injectStyles]);
12376
12785
  if (!built) return null;
12377
12786
  const attrs = themeAttrs(ui);
12378
- 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(
12379
12788
  ChatPanel,
12380
12789
  {
12381
12790
  controller,
@@ -12389,11 +12798,13 @@ function StatsWidget(props) {
12389
12798
  clubFixturesResult,
12390
12799
  clubStandingsResult,
12391
12800
  clubSquadResult,
12801
+ clubSquadStatsResult,
12802
+ clubPlayerDetailResult,
12392
12803
  loggedIn: !!operatorUserId,
12393
12804
  conversation: built?.conversation ?? null,
12394
12805
  presetGrid
12395
12806
  }
12396
- ) : /* @__PURE__ */ jsx102(
12807
+ ) : /* @__PURE__ */ jsx104(
12397
12808
  ChatFab,
12398
12809
  {
12399
12810
  label: ui.launcherLabel,