@sensiblestats/widget-react 0.82.0 → 0.83.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 useCallback18, useEffect as useEffect29, useMemo as useMemo6, useRef as useRef25, useState as useState48 } from "react";
2
+ import { useCallback as useCallback21, useEffect as useEffect32, useMemo as useMemo6, useRef as useRef28, useState as useState51 } from "react";
3
3
  import { StatsWidgetClient } from "@sensiblestats/widget-sdk";
4
4
 
5
5
  // src/kickoff.ts
@@ -113,6 +113,20 @@ var STRINGS = {
113
113
  accordionRetry: "Couldn't load odds \u2014 tap to retry",
114
114
  accordionSuspended: "Suspended",
115
115
  tabToday: "Today",
116
+ tabFixtures: "Fixtures",
117
+ tabStandings: "Standings",
118
+ tabSquad: "Squad",
119
+ clubFixturesEmpty: "No fixtures yet.",
120
+ clubStandingsEmpty: "Standings are not available yet.",
121
+ clubSquadEmpty: "Squad is not available yet.",
122
+ standingsColClub: "Club",
123
+ standingsColPlayed: "P",
124
+ standingsColWon: "W",
125
+ standingsColDrawn: "D",
126
+ standingsColLost: "L",
127
+ standingsColGoalDiff: "GD",
128
+ standingsColPoints: "Pts",
129
+ gamesPlaySegment: "Play",
116
130
  sectionLive: "Live",
117
131
  yourLeagues: "Your leagues",
118
132
  topLeagues: "Top leagues",
@@ -480,6 +494,20 @@ var STRINGS = {
480
494
  accordionRetry: "Oranlar y\xFCklenemedi \u2014 yeniden dene",
481
495
  accordionSuspended: "Ask\u0131da",
482
496
  tabToday: "Bug\xFCn",
497
+ tabFixtures: "Fikst\xFCr",
498
+ tabStandings: "Puan Durumu",
499
+ tabSquad: "Kadro",
500
+ clubFixturesEmpty: "Hen\xFCz fikst\xFCr yok.",
501
+ clubStandingsEmpty: "Puan durumu hen\xFCz mevcut de\u011Fil.",
502
+ clubSquadEmpty: "Kadro hen\xFCz mevcut de\u011Fil.",
503
+ standingsColClub: "Tak\u0131m",
504
+ standingsColPlayed: "O",
505
+ standingsColWon: "G",
506
+ standingsColDrawn: "B",
507
+ standingsColLost: "M",
508
+ standingsColGoalDiff: "AV",
509
+ standingsColPoints: "P",
510
+ gamesPlaySegment: "Oyna",
483
511
  sectionLive: "Canl\u0131",
484
512
  yourLeagues: "Liglerin",
485
513
  topLeagues: "\xD6ne \xE7\u0131kan ligler",
@@ -844,6 +872,20 @@ function normalizeUi(cfg) {
844
872
  tabFollowing: strings.tabFollowing,
845
873
  tabOdds: strings.tabOdds,
846
874
  tabToday: strings.tabToday,
875
+ tabFixtures: strings.tabFixtures,
876
+ tabStandings: strings.tabStandings,
877
+ tabSquad: strings.tabSquad,
878
+ clubFixturesEmpty: strings.clubFixturesEmpty,
879
+ clubStandingsEmpty: strings.clubStandingsEmpty,
880
+ clubSquadEmpty: strings.clubSquadEmpty,
881
+ standingsColClub: strings.standingsColClub,
882
+ standingsColPlayed: strings.standingsColPlayed,
883
+ standingsColWon: strings.standingsColWon,
884
+ standingsColDrawn: strings.standingsColDrawn,
885
+ standingsColLost: strings.standingsColLost,
886
+ standingsColGoalDiff: strings.standingsColGoalDiff,
887
+ standingsColPoints: strings.standingsColPoints,
888
+ gamesPlaySegment: strings.gamesPlaySegment,
847
889
  sectionLive: strings.sectionLive,
848
890
  yourLeagues: strings.yourLeagues,
849
891
  topLeagues: strings.topLeagues,
@@ -2478,6 +2520,7 @@ function useLiveMonitor(opts) {
2478
2520
  const marketOddsRef = useRef4(marketOdds);
2479
2521
  marketOddsRef.current = marketOdds;
2480
2522
  const hasToday = opts.hasToday ?? false;
2523
+ const clubEnabled = opts.clubEnabled ?? false;
2481
2524
  const marketKey = (matchId, dev) => `${matchId}:${dev}`;
2482
2525
  const getMarketOddsRef = useRef4(opts.getMarketOdds);
2483
2526
  getMarketOddsRef.current = opts.getMarketOdds;
@@ -2654,12 +2697,16 @@ function useLiveMonitor(opts) {
2654
2697
  if (wasEmpty && watchesLength > 0) void tick();
2655
2698
  }, [watchesLength, tick]);
2656
2699
  useEffect4(() => {
2700
+ if (clubEnabled && (activeTab === "today" || activeTab === "following" || activeTab === "odds")) {
2701
+ setActiveTabState("chat");
2702
+ return;
2703
+ }
2657
2704
  const matchPins = pins.filter((p) => p.kind === "match").length;
2658
2705
  const marketPins = pins.length - matchPins;
2659
2706
  if (activeTab === "following" && matchPins === 0) setActiveTabState(hasToday ? "today" : "chat");
2660
2707
  if (activeTab === "odds" && marketPins === 0) setActiveTabState(hasToday ? "today" : "chat");
2661
2708
  if (activeTab === "today" && !hasToday) setActiveTabState("chat");
2662
- }, [pins, activeTab, hasToday]);
2709
+ }, [pins, activeTab, hasToday, clubEnabled]);
2663
2710
  const prevIsOpenRef = useRef4(false);
2664
2711
  useEffect4(() => {
2665
2712
  const wasClosed = !prevIsOpenRef.current;
@@ -3024,7 +3071,7 @@ function useLeaderboard(conversation, { activeTab }) {
3024
3071
  const conversationRef = useRef7(conversation);
3025
3072
  conversationRef.current = conversation;
3026
3073
  useEffect7(() => {
3027
- if (activeTab !== "leaderboard" && activeTab !== "games") return;
3074
+ if (activeTab !== "games") return;
3028
3075
  let active = true;
3029
3076
  const doFetch = async () => {
3030
3077
  const conv = conversationRef.current;
@@ -3052,8 +3099,151 @@ function useLeaderboard(conversation, { activeTab }) {
3052
3099
  return { data, loading, refresh };
3053
3100
  }
3054
3101
 
3102
+ // src/useClubFixtures.ts
3103
+ import { useCallback as useCallback7, useEffect as useEffect8, useRef as useRef8, useState as useState7 } from "react";
3104
+ var CLUB_PROBE_RETRY_MS = 15e3;
3105
+ var CLUB_PROBE_MAX_ATTEMPTS = 3;
3106
+ function useClubFixtures(conversation) {
3107
+ const [enabled, setEnabled] = useState7(false);
3108
+ const [settled, setSettled] = useState7(false);
3109
+ const [fixtures, setFixtures] = useState7([]);
3110
+ const [loading, setLoading] = useState7(false);
3111
+ const [refreshCount, setRefreshCount] = useState7(0);
3112
+ const inFlightRef = useRef8(false);
3113
+ const hardOffRef = useRef8(false);
3114
+ const conversationRef = useRef8(conversation);
3115
+ conversationRef.current = conversation;
3116
+ const ready = conversation != null;
3117
+ useEffect8(() => {
3118
+ if (hardOffRef.current) return;
3119
+ let active = true;
3120
+ let retryTimeoutId;
3121
+ let attempts = 0;
3122
+ const doFetch = async () => {
3123
+ const conv = conversationRef.current;
3124
+ if (!conv || inFlightRef.current || !active) return;
3125
+ inFlightRef.current = true;
3126
+ setLoading(true);
3127
+ try {
3128
+ attempts += 1;
3129
+ const result = await conv.getClubFixtures();
3130
+ if (!active) return;
3131
+ if (result === null) {
3132
+ hardOffRef.current = true;
3133
+ setEnabled(false);
3134
+ setFixtures([]);
3135
+ } else {
3136
+ setFixtures(result.fixtures);
3137
+ setEnabled(true);
3138
+ }
3139
+ setSettled(true);
3140
+ } catch {
3141
+ if (!active) return;
3142
+ if (attempts < CLUB_PROBE_MAX_ATTEMPTS) {
3143
+ retryTimeoutId = window.setTimeout(() => {
3144
+ if (!hardOffRef.current) void doFetch();
3145
+ }, CLUB_PROBE_RETRY_MS);
3146
+ } else {
3147
+ setEnabled(false);
3148
+ setFixtures([]);
3149
+ setSettled(true);
3150
+ }
3151
+ } finally {
3152
+ inFlightRef.current = false;
3153
+ if (active) setLoading(false);
3154
+ }
3155
+ };
3156
+ void doFetch();
3157
+ return () => {
3158
+ active = false;
3159
+ inFlightRef.current = false;
3160
+ if (retryTimeoutId !== void 0) window.clearTimeout(retryTimeoutId);
3161
+ };
3162
+ }, [refreshCount, ready]);
3163
+ const refresh = useCallback7(() => setRefreshCount((c) => c + 1), []);
3164
+ return { enabled, settled, fixtures, loading, refresh };
3165
+ }
3166
+
3167
+ // src/useClubStandings.ts
3168
+ import { useCallback as useCallback8, useEffect as useEffect9, useRef as useRef9, useState as useState8 } from "react";
3169
+ function useClubStandings(conversation, { activeTab, enabled }) {
3170
+ const [data, setData] = useState8(null);
3171
+ const [loading, setLoading] = useState8(false);
3172
+ const [refreshCount, setRefreshCount] = useState8(0);
3173
+ const inFlightRef = useRef9(false);
3174
+ const conversationRef = useRef9(conversation);
3175
+ conversationRef.current = conversation;
3176
+ useEffect9(() => {
3177
+ if (activeTab !== "standings" || !enabled) return;
3178
+ let active = true;
3179
+ const doFetch = async () => {
3180
+ const conv = conversationRef.current;
3181
+ if (!conv || inFlightRef.current) return;
3182
+ inFlightRef.current = true;
3183
+ setLoading(true);
3184
+ try {
3185
+ const result = await conv.getClubStandings();
3186
+ if (active) setData(result?.rows ?? null);
3187
+ } catch {
3188
+ } finally {
3189
+ inFlightRef.current = false;
3190
+ if (active) setLoading(false);
3191
+ }
3192
+ };
3193
+ void doFetch();
3194
+ return () => {
3195
+ active = false;
3196
+ inFlightRef.current = false;
3197
+ };
3198
+ }, [activeTab, enabled, refreshCount]);
3199
+ const refresh = useCallback8(() => {
3200
+ setRefreshCount((c) => c + 1);
3201
+ }, []);
3202
+ const effectiveLoading = loading || activeTab === "standings" && enabled && data === null;
3203
+ return { data, loading: effectiveLoading, refresh };
3204
+ }
3205
+
3206
+ // src/useClubSquad.ts
3207
+ import { useCallback as useCallback9, useEffect as useEffect10, useRef as useRef10, useState as useState9 } from "react";
3208
+ function useClubSquad(conversation, { activeTab, enabled }) {
3209
+ const [data, setData] = useState9(null);
3210
+ const [loading, setLoading] = useState9(false);
3211
+ const [refreshCount, setRefreshCount] = useState9(0);
3212
+ const inFlightRef = useRef10(false);
3213
+ const conversationRef = useRef10(conversation);
3214
+ conversationRef.current = conversation;
3215
+ useEffect10(() => {
3216
+ if (activeTab !== "squad" || !enabled) return;
3217
+ let active = true;
3218
+ const doFetch = async () => {
3219
+ const conv = conversationRef.current;
3220
+ if (!conv || inFlightRef.current) return;
3221
+ inFlightRef.current = true;
3222
+ setLoading(true);
3223
+ try {
3224
+ const result = await conv.getClubSquad();
3225
+ if (active) setData(result?.players ?? null);
3226
+ } catch {
3227
+ } finally {
3228
+ inFlightRef.current = false;
3229
+ if (active) setLoading(false);
3230
+ }
3231
+ };
3232
+ void doFetch();
3233
+ return () => {
3234
+ active = false;
3235
+ inFlightRef.current = false;
3236
+ };
3237
+ }, [activeTab, enabled, refreshCount]);
3238
+ const refresh = useCallback9(() => {
3239
+ setRefreshCount((c) => c + 1);
3240
+ }, []);
3241
+ const effectiveLoading = loading || activeTab === "squad" && enabled && data === null;
3242
+ return { data, loading: effectiveLoading, refresh };
3243
+ }
3244
+
3055
3245
  // src/usePresetGrid.ts
3056
- import { useEffect as useEffect8, useRef as useRef8, useState as useState7 } from "react";
3246
+ import { useEffect as useEffect11, useRef as useRef11, useState as useState10 } from "react";
3057
3247
 
3058
3248
  // src/presetGrid.ts
3059
3249
  var DEFAULT_SINGLES_LIMITS = [1.3, 1.5, 1.7, 2];
@@ -3196,22 +3386,22 @@ function marketDisplay(cell, s) {
3196
3386
  // src/usePresetGrid.ts
3197
3387
  var GRID_MAX_AGE_MS = 6e5;
3198
3388
  function usePresetGrid({ getPricePresets, isOpen, locale, now = Date.now }) {
3199
- const [grid, setGrid] = useState7(null);
3200
- const keptRef = useRef8(null);
3201
- const localeRef = useRef8(locale);
3202
- const inFlightRef = useRef8(false);
3203
- const mountedRef = useRef8(true);
3204
- const getRef = useRef8(getPricePresets);
3389
+ const [grid, setGrid] = useState10(null);
3390
+ const keptRef = useRef11(null);
3391
+ const localeRef = useRef11(locale);
3392
+ const inFlightRef = useRef11(false);
3393
+ const mountedRef = useRef11(true);
3394
+ const getRef = useRef11(getPricePresets);
3205
3395
  getRef.current = getPricePresets;
3206
- const nowRef = useRef8(now);
3396
+ const nowRef = useRef11(now);
3207
3397
  nowRef.current = now;
3208
- useEffect8(() => {
3398
+ useEffect11(() => {
3209
3399
  mountedRef.current = true;
3210
3400
  return () => {
3211
3401
  mountedRef.current = false;
3212
3402
  };
3213
3403
  }, []);
3214
- useEffect8(() => {
3404
+ useEffect11(() => {
3215
3405
  if (localeRef.current !== locale) {
3216
3406
  localeRef.current = locale;
3217
3407
  keptRef.current = null;
@@ -3261,11 +3451,11 @@ function useEventLog() {
3261
3451
  }
3262
3452
 
3263
3453
  // src/popupTelemetry.ts
3264
- import { useCallback as useCallback7, useEffect as useEffect9, useRef as useRef9 } from "react";
3454
+ import { useCallback as useCallback10, useEffect as useEffect12, useRef as useRef12 } from "react";
3265
3455
  function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
3266
- const shownRef = useRef9(/* @__PURE__ */ new Set());
3267
- const closedTextRef = useRef9(null);
3268
- useEffect9(() => {
3456
+ const shownRef = useRef12(/* @__PURE__ */ new Set());
3457
+ const closedTextRef = useRef12(null);
3458
+ useEffect12(() => {
3269
3459
  if (isOpen) {
3270
3460
  if (closedTextRef.current) log?.log({ name: "popup_opened" });
3271
3461
  closedTextRef.current = null;
@@ -3277,17 +3467,17 @@ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
3277
3467
  log?.log({ name: "popup_shown" });
3278
3468
  }
3279
3469
  }, [log, isOpen, popupText]);
3280
- return useCallback7(() => {
3470
+ return useCallback10(() => {
3281
3471
  log?.log({ name: "popup_dismissed" });
3282
3472
  dismissPopup();
3283
3473
  }, [log, dismissPopup]);
3284
3474
  }
3285
3475
 
3286
3476
  // src/openTelemetry.ts
3287
- import { useEffect as useEffect10, useRef as useRef10 } from "react";
3477
+ import { useEffect as useEffect13, useRef as useRef13 } from "react";
3288
3478
  function useOpenTelemetry(log, isOpen) {
3289
- const openLoggedRef = useRef10(false);
3290
- useEffect10(() => {
3479
+ const openLoggedRef = useRef13(false);
3480
+ useEffect13(() => {
3291
3481
  if (!isOpen) {
3292
3482
  openLoggedRef.current = false;
3293
3483
  return;
@@ -3299,10 +3489,10 @@ function useOpenTelemetry(log, isOpen) {
3299
3489
  }
3300
3490
 
3301
3491
  // src/components/ChatFab.tsx
3302
- import { useEffect as useEffect11, useRef as useRef11, useState as useState9 } from "react";
3492
+ import { useEffect as useEffect14, useRef as useRef14, useState as useState12 } from "react";
3303
3493
 
3304
3494
  // src/components/BrandMark.tsx
3305
- import { useState as useState8 } from "react";
3495
+ import { useState as useState11 } from "react";
3306
3496
 
3307
3497
  // src/assets/logo.ts
3308
3498
  var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
@@ -3365,7 +3555,7 @@ function DashboardIcon({ name }) {
3365
3555
  // src/components/BrandMark.tsx
3366
3556
  import { jsx as jsx2 } from "react/jsx-runtime";
3367
3557
  function BrandMark({ logoUrl, className }) {
3368
- const [failed, setFailed] = useState8(false);
3558
+ const [failed, setFailed] = useState11(false);
3369
3559
  if (!logoUrl || failed) return /* @__PURE__ */ jsx2(SsMark, { className });
3370
3560
  return /* @__PURE__ */ jsx2("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
3371
3561
  }
@@ -3401,9 +3591,9 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss", ask
3401
3591
  import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
3402
3592
  function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart, asks }) {
3403
3593
  const bubble = popupText ?? greeting;
3404
- const [intro, setIntro] = useState9(false);
3405
- const armedRef = useRef11(introAllowed);
3406
- useEffect11(() => {
3594
+ const [intro, setIntro] = useState12(false);
3595
+ const armedRef = useRef14(introAllowed);
3596
+ useEffect14(() => {
3407
3597
  if (armedRef.current && bubble) {
3408
3598
  armedRef.current = false;
3409
3599
  setIntro(true);
@@ -3417,10 +3607,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
3417
3607
  }
3418
3608
 
3419
3609
  // src/components/ChatPanel.tsx
3420
- import { useCallback as useCallback17, useEffect as useEffect28, useMemo as useMemo5, useRef as useRef24, useState as useState47 } from "react";
3610
+ import { useCallback as useCallback20, useEffect as useEffect31, useMemo as useMemo5, useRef as useRef27, useState as useState50 } from "react";
3421
3611
 
3422
3612
  // src/components/ChatHeader.tsx
3423
- import { useEffect as useEffect12, useRef as useRef12, useState as useState10 } from "react";
3613
+ import { useEffect as useEffect15, useRef as useRef15, useState as useState13 } from "react";
3424
3614
  import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
3425
3615
  function ChatHeader({
3426
3616
  onClose,
@@ -3432,15 +3622,15 @@ function ChatHeader({
3432
3622
  newConversationLabel = "New conversation",
3433
3623
  moreOptionsLabel = "More options"
3434
3624
  }) {
3435
- const [menuOpen, setMenuOpen] = useState10(false);
3436
- const wrapRef = useRef12(null);
3437
- const kebabRef = useRef12(null);
3438
- const firstItemRef = useRef12(null);
3625
+ const [menuOpen, setMenuOpen] = useState13(false);
3626
+ const wrapRef = useRef15(null);
3627
+ const kebabRef = useRef15(null);
3628
+ const firstItemRef = useRef15(null);
3439
3629
  const hasMenu = !!(canReset && onNewConversation);
3440
- useEffect12(() => {
3630
+ useEffect15(() => {
3441
3631
  if (menuOpen) firstItemRef.current?.focus();
3442
3632
  }, [menuOpen]);
3443
- useEffect12(() => {
3633
+ useEffect15(() => {
3444
3634
  if (!menuOpen) return;
3445
3635
  const onPointer = (e) => {
3446
3636
  if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
@@ -3496,7 +3686,7 @@ function ChatHeader({
3496
3686
  }
3497
3687
 
3498
3688
  // src/components/MessageList.tsx
3499
- import { useEffect as useEffect18, useRef as useRef15 } from "react";
3689
+ import { useEffect as useEffect21, useRef as useRef18 } from "react";
3500
3690
 
3501
3691
  // src/components/Markdown.tsx
3502
3692
  import ReactMarkdown from "react-markdown";
@@ -3514,7 +3704,7 @@ function Markdown({ text }) {
3514
3704
  }
3515
3705
 
3516
3706
  // src/components/EntityCardList.tsx
3517
- import { useState as useState11 } from "react";
3707
+ import { useState as useState14 } from "react";
3518
3708
  import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
3519
3709
  var MAX_VISIBLE = 3;
3520
3710
  var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
@@ -3598,7 +3788,7 @@ function ScopeTabs({ scopes, active, onSelect }) {
3598
3788
  )) });
3599
3789
  }
3600
3790
  function EntityCardItem({ c }) {
3601
- const [active, setActive] = useState11(0);
3791
+ const [active, setActive] = useState14(0);
3602
3792
  const hasBody = c.scopes.length > 0;
3603
3793
  if (!hasBody) {
3604
3794
  return /* @__PURE__ */ jsx7("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ jsx7(CardHeader, { c, showScopeCrest: false }) });
@@ -3612,7 +3802,7 @@ function EntityCardItem({ c }) {
3612
3802
  ] });
3613
3803
  }
3614
3804
  function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
3615
- const [expanded, setExpanded] = useState11(false);
3805
+ const [expanded, setExpanded] = useState14(false);
3616
3806
  if (cards.length === 0) return null;
3617
3807
  const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
3618
3808
  const overflow = cards.length - MAX_VISIBLE;
@@ -3623,10 +3813,10 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
3623
3813
  }
3624
3814
 
3625
3815
  // src/components/AddToSlipButton.tsx
3626
- import { useCallback as useCallback9, useState as useState12 } from "react";
3816
+ import { useCallback as useCallback12, useState as useState15 } from "react";
3627
3817
 
3628
3818
  // src/slipAdd.ts
3629
- import { useCallback as useCallback8 } from "react";
3819
+ import { useCallback as useCallback11 } from "react";
3630
3820
  import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
3631
3821
 
3632
3822
  // src/slipStateContext.ts
@@ -3648,7 +3838,7 @@ function useSlipAdd(slip, ui) {
3648
3838
  const slipState = useSlipState();
3649
3839
  const handler = slip.onAddToSlip;
3650
3840
  const rawLabels = !!ui?.rawBettingLabels;
3651
- return useCallback8(async (selection, { marketDeveloperName, selectionLabel, line }) => {
3841
+ return useCallback11(async (selection, { marketDeveloperName, selectionLabel, line }) => {
3652
3842
  if (!handler) return { kind: "failed" };
3653
3843
  const pick = slipPickFields(selection, rawLabels ? selectionLabel : void 0, line);
3654
3844
  if (marketDeveloperName !== void 0) {
@@ -3685,11 +3875,11 @@ function useSlipAdd(slip, ui) {
3685
3875
  }
3686
3876
 
3687
3877
  // src/components/Toast.tsx
3688
- import { useEffect as useEffect13 } from "react";
3878
+ import { useEffect as useEffect16 } from "react";
3689
3879
  import { jsx as jsx8 } from "react/jsx-runtime";
3690
3880
  var DISMISS_MS = 4e3;
3691
3881
  function Toast({ toast, onDismiss }) {
3692
- useEffect13(() => {
3882
+ useEffect16(() => {
3693
3883
  if (!toast) return;
3694
3884
  const timer = setTimeout(onDismiss, DISMISS_MS);
3695
3885
  return () => clearTimeout(timer);
@@ -3701,10 +3891,10 @@ function Toast({ toast, onDismiss }) {
3701
3891
  // src/components/AddToSlipButton.tsx
3702
3892
  import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
3703
3893
  function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui, price, ariaLabel }) {
3704
- const [pending, setPending] = useState12(false);
3705
- const [settledLocal, setSettledLocal] = useState12(false);
3706
- const [toast, setToast] = useState12(null);
3707
- const dismiss = useCallback9(() => setToast(null), []);
3894
+ const [pending, setPending] = useState15(false);
3895
+ const [settledLocal, setSettledLocal] = useState15(false);
3896
+ const [toast, setToast] = useState15(null);
3897
+ const dismiss = useCallback12(() => setToast(null), []);
3708
3898
  const add = useSlipAdd(slip, ui);
3709
3899
  const slipState = useSlipState();
3710
3900
  const handler = slip.onAddToSlip;
@@ -3792,14 +3982,14 @@ function OddsMovementBadge({
3792
3982
  }
3793
3983
 
3794
3984
  // src/components/Crest.tsx
3795
- import { useState as useState13 } from "react";
3985
+ import { useState as useState16 } from "react";
3796
3986
  import { jsx as jsx11 } from "react/jsx-runtime";
3797
3987
  function initials2(name) {
3798
3988
  return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
3799
3989
  }
3800
3990
  function Crest2({ url, name, kind }) {
3801
3991
  const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
3802
- const [failed, setFailed] = useState13(false);
3992
+ const [failed, setFailed] = useState16(false);
3803
3993
  if (url && !failed) {
3804
3994
  return /* @__PURE__ */ jsx11("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
3805
3995
  }
@@ -3807,7 +3997,7 @@ function Crest2({ url, name, kind }) {
3807
3997
  }
3808
3998
 
3809
3999
  // src/components/PinToggle.tsx
3810
- import { useCallback as useCallback10, useState as useState14 } from "react";
4000
+ import { useCallback as useCallback13, useState as useState17 } from "react";
3811
4001
  import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
3812
4002
  var PIN_GLYPHS = {
3813
4003
  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" },
@@ -3815,8 +4005,8 @@ var PIN_GLYPHS = {
3815
4005
  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" }
3816
4006
  };
3817
4007
  function PinToggle({ pin, monitor, ui, market }) {
3818
- const [toast, setToast] = useState14(null);
3819
- const dismiss = useCallback10(() => setToast(null), []);
4008
+ const [toast, setToast] = useState17(null);
4009
+ const dismiss = useCallback13(() => setToast(null), []);
3820
4010
  const log = useEventLog();
3821
4011
  if (!monitor || !monitor.enabled) return null;
3822
4012
  const key = pinKey(pin);
@@ -3873,11 +4063,11 @@ function PinToggle({ pin, monitor, ui, market }) {
3873
4063
  }
3874
4064
 
3875
4065
  // src/components/PriceHistoryButton.tsx
3876
- import { useCallback as useCallback11, useState as useState15 } from "react";
4066
+ import { useCallback as useCallback14, useState as useState18 } from "react";
3877
4067
  import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
3878
4068
  function PriceHistoryButton({ selection, monitor, ui }) {
3879
- const [toast, setToast] = useState15(null);
3880
- const dismiss = useCallback11(() => setToast(null), []);
4069
+ const [toast, setToast] = useState18(null);
4070
+ const dismiss = useCallback14(() => setToast(null), []);
3881
4071
  const log = useEventLog();
3882
4072
  if (!monitor || !monitor.enabled) return null;
3883
4073
  const name = joinSelection(selection.selectionLabel ?? void 0, selection.line ?? void 0);
@@ -3992,15 +4182,15 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
3992
4182
  }
3993
4183
 
3994
4184
  // src/components/AddAllToSlipButton.tsx
3995
- import { useCallback as useCallback12, useState as useState16 } from "react";
4185
+ import { useCallback as useCallback15, useState as useState19 } from "react";
3996
4186
  import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
3997
4187
  function AddAllToSlipButton({ legs, slip, ui }) {
3998
4188
  const add = useSlipAdd(slip, ui);
3999
4189
  const slipState = useSlipState();
4000
- const [pending, setPending] = useState16(false);
4001
- const [settledLocal, setSettledLocal] = useState16({});
4002
- const [toast, setToast] = useState16(null);
4003
- const dismiss = useCallback12(() => setToast(null), []);
4190
+ const [pending, setPending] = useState19(false);
4191
+ const [settledLocal, setSettledLocal] = useState19({});
4192
+ const [toast, setToast] = useState19(null);
4193
+ const dismiss = useCallback15(() => setToast(null), []);
4004
4194
  if (!ui || !slip.onAddToSlip || legs.length < 2) return null;
4005
4195
  const settled = slipState ? slipState.settled : settledLocal;
4006
4196
  const open = legs.filter((leg) => !settled[leg.matchOddsId]);
@@ -4110,7 +4300,7 @@ function ComboCardList({ cards, ui, slip, monitor }) {
4110
4300
  }
4111
4301
 
4112
4302
  // src/components/MarketOddsCardList.tsx
4113
- import { useEffect as useEffect14, useState as useState17 } from "react";
4303
+ import { useEffect as useEffect17, useState as useState20 } from "react";
4114
4304
 
4115
4305
  // src/components/AllMarketsButton.tsx
4116
4306
  import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
@@ -4173,7 +4363,7 @@ function fmtHhMm(iso, locale) {
4173
4363
  return new Date(iso).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", hour12: false });
4174
4364
  }
4175
4365
  function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
4176
- const [open, setOpen] = useState17(false);
4366
+ const [open, setOpen] = useState20(false);
4177
4367
  const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
4178
4368
  const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
4179
4369
  const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
@@ -4183,9 +4373,9 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
4183
4373
  const asOfMs = live ? new Date(live.asOfUtc).getTime() : NaN;
4184
4374
  const isStale = live != null && !isClosed && (vm.awaitingLiveUpdate === true || Date.now() - asOfMs > STALE_AFTER_MS);
4185
4375
  const staleTime = isStale && live ? fmtHhMm(live.asOfUtc, ui?.locale ?? "en") : null;
4186
- const [, setStaleTick] = useState17(0);
4376
+ const [, setStaleTick] = useState20(0);
4187
4377
  const watchStale = live != null && !isClosed && !isStale;
4188
- useEffect14(() => {
4378
+ useEffect17(() => {
4189
4379
  if (!watchStale) return;
4190
4380
  const id = window.setTimeout(() => setStaleTick((n) => n + 1), Math.max(0, asOfMs + STALE_AFTER_MS - Date.now()) + 1);
4191
4381
  return () => window.clearTimeout(id);
@@ -4264,7 +4454,7 @@ function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds, hideHeader, p
4264
4454
  }
4265
4455
 
4266
4456
  // src/components/CompactOddsList.tsx
4267
- import { useEffect as useEffect15, useRef as useRef13, useState as useState18 } from "react";
4457
+ import { useEffect as useEffect18, useRef as useRef16, useState as useState21 } from "react";
4268
4458
 
4269
4459
  // src/compactList.ts
4270
4460
  var COMPACT_MIN_CARDS = 3;
@@ -4378,11 +4568,11 @@ function Row({ row, columns, ui, slip, monitor, rowRef }) {
4378
4568
  ] });
4379
4569
  }
4380
4570
  function CompactOddsList({ list, ui, slip, monitor }) {
4381
- const [shown, setShown] = useState18(COMPACT_PAGE);
4571
+ const [shown, setShown] = useState21(COMPACT_PAGE);
4382
4572
  const hidden = list.rowCount - shown;
4383
- const [focusIndex, setFocusIndex] = useState18(null);
4384
- const focusRef = useRef13(null);
4385
- useEffect15(() => {
4573
+ const [focusIndex, setFocusIndex] = useState21(null);
4574
+ const focusRef = useRef16(null);
4575
+ useEffect18(() => {
4386
4576
  if (focusIndex !== null) focusRef.current?.focus();
4387
4577
  }, [focusIndex]);
4388
4578
  let left = shown;
@@ -4687,7 +4877,7 @@ function FixtureCard({ card }) {
4687
4877
  }
4688
4878
 
4689
4879
  // src/components/dashboard/CountdownCard.tsx
4690
- import { Fragment as Fragment6, useEffect as useEffect16, useState as useState19 } from "react";
4880
+ import { Fragment as Fragment6, useEffect as useEffect19, useState as useState22 } from "react";
4691
4881
  import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
4692
4882
  var DAY_MS = 864e5;
4693
4883
  function remainingSegments(kickoffUnix, nowMs, withSeconds) {
@@ -4706,12 +4896,12 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
4706
4896
  function CountdownCard({ card }) {
4707
4897
  const { data } = card;
4708
4898
  const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
4709
- const [nowMs, setNowMs] = useState19(() => Date.now());
4710
- const [reduced] = useState19(
4899
+ const [nowMs, setNowMs] = useState22(() => Date.now());
4900
+ const [reduced] = useState22(
4711
4901
  () => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
4712
4902
  );
4713
4903
  const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
4714
- useEffect16(() => {
4904
+ useEffect19(() => {
4715
4905
  if (reduced) return;
4716
4906
  const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
4717
4907
  return () => window.clearInterval(id);
@@ -4730,7 +4920,7 @@ function CountdownCard({ card }) {
4730
4920
  }
4731
4921
 
4732
4922
  // src/components/dashboard/InjuriesCard.tsx
4733
- import { useState as useState20 } from "react";
4923
+ import { useState as useState23 } from "react";
4734
4924
  import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
4735
4925
  var SHOWN = 3;
4736
4926
  function ColHead({ name, crestUrl }) {
@@ -4753,7 +4943,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
4753
4943
  }
4754
4944
  function InjuriesCard({ card, ui }) {
4755
4945
  const { data } = card;
4756
- const [expanded, setExpanded] = useState20(false);
4946
+ const [expanded, setExpanded] = useState23(false);
4757
4947
  const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
4758
4948
  const limit = expanded ? void 0 : SHOWN;
4759
4949
  const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
@@ -4859,7 +5049,7 @@ function LinksCard({ card }) {
4859
5049
  }
4860
5050
 
4861
5051
  // src/components/dashboard/PostMatchResultCard.tsx
4862
- import { useState as useState21 } from "react";
5052
+ import { useState as useState24 } from "react";
4863
5053
  import { jsx as jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
4864
5054
  function initials3(name) {
4865
5055
  return name.trim().slice(0, 3).toUpperCase();
@@ -4869,7 +5059,7 @@ function PostMatchCrest({
4869
5059
  name,
4870
5060
  side
4871
5061
  }) {
4872
- const [failed, setFailed] = useState21(false);
5062
+ const [failed, setFailed] = useState24(false);
4873
5063
  const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
4874
5064
  if (url && !failed) {
4875
5065
  return /* @__PURE__ */ jsx32("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -5068,10 +5258,10 @@ function RestingFormCard({ card }) {
5068
5258
  }
5069
5259
 
5070
5260
  // src/components/dashboard/LiveScoreCard.tsx
5071
- import { useRef as useRef14, useState as useState23 } from "react";
5261
+ import { useRef as useRef17, useState as useState26 } from "react";
5072
5262
 
5073
5263
  // src/useLiveClock.ts
5074
- import { useEffect as useEffect17, useState as useState22 } from "react";
5264
+ import { useEffect as useEffect20, useState as useState25 } from "react";
5075
5265
  var TICK_MS = 6e4;
5076
5266
  var MAX_LIVE_TICK_MINUTES = 15;
5077
5267
  function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
@@ -5080,10 +5270,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
5080
5270
  return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
5081
5271
  }
5082
5272
  function useLiveClock(minute, clockRunning, receivedAtMs) {
5083
- const [displayMinute, setDisplayMinute] = useState22(
5273
+ const [displayMinute, setDisplayMinute] = useState25(
5084
5274
  () => computeDisplayMinute(minute, clockRunning, receivedAtMs)
5085
5275
  );
5086
- useEffect17(() => {
5276
+ useEffect20(() => {
5087
5277
  setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
5088
5278
  if (!clockRunning) return;
5089
5279
  const id = window.setInterval(() => {
@@ -5100,7 +5290,7 @@ function initials5(name) {
5100
5290
  return name.trim().slice(0, 3).toUpperCase();
5101
5291
  }
5102
5292
  function LiveCrest({ url, name, side }) {
5103
- const [failed, setFailed] = useState23(false);
5293
+ const [failed, setFailed] = useState26(false);
5104
5294
  const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
5105
5295
  if (url && !failed) {
5106
5296
  return /* @__PURE__ */ jsx41("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -5119,7 +5309,7 @@ function LiveScoreCard({
5119
5309
  }) {
5120
5310
  const { data } = card;
5121
5311
  const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
5122
- const seedRef = useRef14(null);
5312
+ const seedRef = useRef17(null);
5123
5313
  if (!seedRef.current || seedRef.current.key !== seedKey) {
5124
5314
  seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
5125
5315
  }
@@ -5159,7 +5349,7 @@ function LiveScoreCard({
5159
5349
  }
5160
5350
 
5161
5351
  // src/components/dashboard/LiveTimelineCard.tsx
5162
- import { useState as useState24 } from "react";
5352
+ import { useState as useState27 } from "react";
5163
5353
  import { jsx as jsx42, jsxs as jsxs38 } from "react/jsx-runtime";
5164
5354
  var SHOWN2 = 3;
5165
5355
  function EventIcon({ type }) {
@@ -5201,7 +5391,7 @@ function EventRow({ e }) {
5201
5391
  ] });
5202
5392
  }
5203
5393
  function LiveTimelineCard({ card, ui }) {
5204
- const [expanded, setExpanded] = useState24(false);
5394
+ const [expanded, setExpanded] = useState27(false);
5205
5395
  const events = card.data.events;
5206
5396
  if (!events || events.length === 0) return null;
5207
5397
  const sorted = [...events].sort((a, b) => b.minute - a.minute);
@@ -5443,11 +5633,11 @@ function turnAnchor(messages) {
5443
5633
  }
5444
5634
  function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
5445
5635
  const { state, send } = controller;
5446
- const listRef = useRef15(null);
5447
- const endRef = useRef15(null);
5448
- const pinnedRef = useRef15(true);
5449
- const anchoredTurnRef = useRef15(null);
5450
- useEffect18(() => {
5636
+ const listRef = useRef18(null);
5637
+ const endRef = useRef18(null);
5638
+ const pinnedRef = useRef18(true);
5639
+ const anchoredTurnRef = useRef18(null);
5640
+ useEffect21(() => {
5451
5641
  const anchor = turnAnchor(state.messages);
5452
5642
  const list = listRef.current;
5453
5643
  if (anchor && anchor.turnId !== anchoredTurnRef.current) {
@@ -5504,13 +5694,13 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
5504
5694
  }
5505
5695
 
5506
5696
  // src/components/ChatInput.tsx
5507
- import { forwardRef, useEffect as useEffect19, useImperativeHandle, useRef as useRef16, useState as useState25 } from "react";
5697
+ import { forwardRef, useEffect as useEffect22, useImperativeHandle, useRef as useRef19, useState as useState28 } from "react";
5508
5698
  import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
5509
5699
  var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message", disabled = false, onType }, ref) {
5510
- const [value, setValue] = useState25("");
5511
- const textareaRef = useRef16(null);
5512
- const stopRef = useRef16(null);
5513
- const textBoxWantsFocusRef = useRef16(false);
5700
+ const [value, setValue] = useState28("");
5701
+ const textareaRef = useRef19(null);
5702
+ const stopRef = useRef19(null);
5703
+ const textBoxWantsFocusRef = useRef19(false);
5514
5704
  const submit = () => {
5515
5705
  if (disabled) return;
5516
5706
  const t = value.trim();
@@ -5536,7 +5726,7 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
5536
5726
  stopRef.current?.focus();
5537
5727
  }
5538
5728
  }), []);
5539
- useEffect19(() => {
5729
+ useEffect22(() => {
5540
5730
  if (streaming || disabled || !textBoxWantsFocusRef.current) return;
5541
5731
  textBoxWantsFocusRef.current = false;
5542
5732
  const box = textareaRef.current;
@@ -5569,16 +5759,19 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
5569
5759
 
5570
5760
  // src/components/TabBar.tsx
5571
5761
  import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
5572
- function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled }) {
5762
+ function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled, clubEnabled }) {
5573
5763
  const tabs = [
5574
5764
  { tab: "chat", label: ui.tabChat, count: 0, dot: monitor.chatDot },
5575
- ...hasToday ? [{ tab: "today", label: ui.tabToday, count: todayCount, dot: monitor.todayDot }] : [],
5576
- ...matchCount > 0 ? [{ tab: "following", label: ui.tabFollowing, count: matchCount, dot: monitor.matchesDot }] : [],
5577
- ...oddsCount > 0 ? [{ tab: "odds", label: ui.tabOdds, count: oddsCount, dot: monitor.oddsDot }] : [],
5578
- ...gamesEnabled ? [
5579
- { tab: "games", label: ui.tabGames, count: 0, dot: false },
5580
- { tab: "leaderboard", label: ui.tabLeaderboard, count: 0, dot: false }
5581
- ] : []
5765
+ ...clubEnabled ? [
5766
+ { tab: "fixtures", label: ui.tabFixtures, count: 0, dot: false },
5767
+ { tab: "standings", label: ui.tabStandings, count: 0, dot: false },
5768
+ { tab: "squad", label: ui.tabSquad, count: 0, dot: false }
5769
+ ] : [
5770
+ ...hasToday ? [{ tab: "today", label: ui.tabToday, count: todayCount, dot: monitor.todayDot }] : [],
5771
+ ...matchCount > 0 ? [{ tab: "following", label: ui.tabFollowing, count: matchCount, dot: monitor.matchesDot }] : [],
5772
+ ...oddsCount > 0 ? [{ tab: "odds", label: ui.tabOdds, count: oddsCount, dot: monitor.oddsDot }] : []
5773
+ ],
5774
+ ...gamesEnabled ? [{ tab: "games", label: ui.tabGames, count: 0, dot: false }] : []
5582
5775
  ];
5583
5776
  if (tabs.length < 2) return null;
5584
5777
  return /* @__PURE__ */ jsx50("div", { className: "ss-w-tabs", role: "tablist", children: tabs.map(({ tab, label, count, dot }) => {
@@ -5658,10 +5851,10 @@ function MarketAccordion({ match, monitor, ui, slip }) {
5658
5851
  }
5659
5852
 
5660
5853
  // src/components/LiveFactBlock.tsx
5661
- import { useState as useState26 } from "react";
5854
+ import { useState as useState29 } from "react";
5662
5855
  import { jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
5663
5856
  function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
5664
- const [expanded, setExpanded] = useState26(false);
5857
+ const [expanded, setExpanded] = useState29(false);
5665
5858
  const [current, ...earlier] = facts;
5666
5859
  if (!current) return null;
5667
5860
  const m = current.market;
@@ -5927,7 +6120,7 @@ function OddsPanel({ monitor, ui, slip }) {
5927
6120
  }
5928
6121
 
5929
6122
  // src/components/TodayPanel.tsx
5930
- import { useEffect as useEffect21, useId as useId2, useMemo as useMemo4, useState as useState29 } from "react";
6123
+ import { useEffect as useEffect24, useId as useId2, useMemo as useMemo4, useState as useState32 } from "react";
5931
6124
 
5932
6125
  // src/placement.ts
5933
6126
  function placeLeagues(visible, pinnedMatchIds) {
@@ -5990,11 +6183,11 @@ function matchingFixtures(group, query) {
5990
6183
  }
5991
6184
 
5992
6185
  // src/useStarTap.ts
5993
- import { useCallback as useCallback13, useRef as useRef17, useState as useState27 } from "react";
6186
+ import { useCallback as useCallback16, useRef as useRef20, useState as useState30 } from "react";
5994
6187
  function useStarTap(starLeague) {
5995
- const [pendingId, setPendingId] = useState27(null);
5996
- const pendingRef = useRef17(null);
5997
- const tap = useCallback13(async (competitionId, next) => {
6188
+ const [pendingId, setPendingId] = useState30(null);
6189
+ const pendingRef = useRef20(null);
6190
+ const tap = useCallback16(async (competitionId, next) => {
5998
6191
  if (pendingRef.current !== null) return false;
5999
6192
  pendingRef.current = competitionId;
6000
6193
  setPendingId(competitionId);
@@ -6053,7 +6246,7 @@ function LeagueTile({ group, starClickable: starClickable2, disambiguate, onOpen
6053
6246
  }
6054
6247
 
6055
6248
  // src/components/LeagueDetail.tsx
6056
- import { useEffect as useEffect20, useState as useState28 } from "react";
6249
+ import { useEffect as useEffect23, useState as useState31 } from "react";
6057
6250
 
6058
6251
  // src/components/FixtureRow.tsx
6059
6252
  import { jsx as jsx56, jsxs as jsxs51 } from "react/jsx-runtime";
@@ -6088,11 +6281,11 @@ function FixtureRow({ match, state, stale, ui, monitor }) {
6088
6281
  import { jsx as jsx57, jsxs as jsxs52 } from "react/jsx-runtime";
6089
6282
  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";
6090
6283
  function LeagueDetail({ group, position, states, stale, ui, monitor, starTap, onBack, onPrev, onNext }) {
6091
- const [toast, setToast] = useState28(null);
6092
- useEffect20(() => {
6284
+ const [toast, setToast] = useState31(null);
6285
+ useEffect23(() => {
6093
6286
  setToast(null);
6094
6287
  }, [group.competitionId]);
6095
- useEffect20(() => {
6288
+ useEffect23(() => {
6096
6289
  if (toast === null) return;
6097
6290
  const id = setTimeout(() => setToast(null), 4e3);
6098
6291
  return () => clearTimeout(id);
@@ -6224,7 +6417,7 @@ function LeagueRowGroup({ group, states, stale, cap, starClickable: starClickabl
6224
6417
  }
6225
6418
 
6226
6419
  // src/components/games/ui/SearchField.tsx
6227
- import { useCallback as useCallback14, useRef as useRef18 } from "react";
6420
+ import { useCallback as useCallback17, useRef as useRef21 } from "react";
6228
6421
 
6229
6422
  // src/components/games/ui/icons.tsx
6230
6423
  import { jsx as jsx59 } from "react/jsx-runtime";
@@ -6263,8 +6456,8 @@ var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx59("path", { d:
6263
6456
  // src/components/games/ui/SearchField.tsx
6264
6457
  import { jsx as jsx60, jsxs as jsxs54 } from "react/jsx-runtime";
6265
6458
  function SearchField({ id, label, labelHidden = false, placeholder, value, onChange, disabled, inputRef, onKeyDown, clearLabel }) {
6266
- const localRef = useRef18(null);
6267
- const setInputRef = useCallback14((node) => {
6459
+ const localRef = useRef21(null);
6460
+ const setInputRef = useCallback17((node) => {
6268
6461
  localRef.current = node;
6269
6462
  if (typeof inputRef === "function") inputRef(node);
6270
6463
  else if (inputRef) inputRef.current = node;
@@ -6309,10 +6502,10 @@ import { Fragment as Fragment7, jsx as jsx61, jsxs as jsxs55 } from "react/jsx-r
6309
6502
  function TodayPanel({ discovery, ui, monitor }) {
6310
6503
  const { groups, states, stale, starLeague } = discovery;
6311
6504
  const searchId = useId2();
6312
- const [query, setQuery] = useState29("");
6313
- const [selectedCompetitionId, setSelectedCompetitionId] = useState29(null);
6314
- const [toast, setToast] = useState29(null);
6315
- useEffect21(() => {
6505
+ const [query, setQuery] = useState32("");
6506
+ const [selectedCompetitionId, setSelectedCompetitionId] = useState32(null);
6507
+ const [toast, setToast] = useState32(null);
6508
+ useEffect24(() => {
6316
6509
  if (toast === null) return;
6317
6510
  const id = setTimeout(() => setToast(null), 4e3);
6318
6511
  return () => clearTimeout(id);
@@ -6358,7 +6551,7 @@ function TodayPanel({ discovery, ui, monitor }) {
6358
6551
  }
6359
6552
  const openIndex = selectedCompetitionId === null ? -1 : placement.order.findIndex((g) => g.competitionId === selectedCompetitionId);
6360
6553
  const openGroup = openIndex === -1 ? void 0 : placement.order[openIndex];
6361
- useEffect21(() => {
6554
+ useEffect24(() => {
6362
6555
  if (selectedCompetitionId !== null && openGroup === void 0) setSelectedCompetitionId(null);
6363
6556
  }, [selectedCompetitionId, openGroup]);
6364
6557
  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);
@@ -6505,7 +6698,7 @@ function TodayPanel({ discovery, ui, monitor }) {
6505
6698
  }
6506
6699
 
6507
6700
  // src/components/GamesPanel.tsx
6508
- import { useEffect as useEffect25, useState as useState43 } from "react";
6701
+ import { useEffect as useEffect28, useState as useState47 } from "react";
6509
6702
 
6510
6703
  // src/components/GamesLoginWall.tsx
6511
6704
  import { jsx as jsx62 } from "react/jsx-runtime";
@@ -6514,7 +6707,7 @@ function GamesLoginWall({ ui }) {
6514
6707
  }
6515
6708
 
6516
6709
  // src/components/GamesHub.tsx
6517
- import { useEffect as useEffect22, useState as useState30 } from "react";
6710
+ import { useEffect as useEffect25, useState as useState33 } from "react";
6518
6711
 
6519
6712
  // src/components/games/ui/gameMeta.ts
6520
6713
  function prettifyGameId(gameId) {
@@ -6665,8 +6858,8 @@ function pickHeroGame(games) {
6665
6858
  }
6666
6859
  var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
6667
6860
  function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
6668
- const [, setTick] = useState30(0);
6669
- useEffect22(() => {
6861
+ const [, setTick] = useState33(0);
6862
+ useEffect25(() => {
6670
6863
  const id = setInterval(() => setTick((t) => t + 1), 6e4);
6671
6864
  return () => clearInterval(id);
6672
6865
  }, []);
@@ -6726,10 +6919,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
6726
6919
  }
6727
6920
 
6728
6921
  // src/components/GameScreenHost.tsx
6729
- import { useEffect as useEffect24, useRef as useRef21, useState as useState42 } from "react";
6922
+ import { useEffect as useEffect27, useRef as useRef24, useState as useState45 } from "react";
6730
6923
 
6731
6924
  // src/useGamePlay.ts
6732
- import { useCallback as useCallback15, useRef as useRef19, useState as useState31 } from "react";
6925
+ import { useCallback as useCallback18, useRef as useRef22, useState as useState34 } from "react";
6733
6926
  function toSubmitResult(payload) {
6734
6927
  return {
6735
6928
  // 'pending' means the play is recorded but awaiting resolution (fixture games)
@@ -6741,17 +6934,17 @@ function toSubmitResult(payload) {
6741
6934
  };
6742
6935
  }
6743
6936
  function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
6744
- const [result, setResult] = useState31(null);
6745
- const [submitting, setSubmitting] = useState31(false);
6746
- const [rawStatus, setRawStatus] = useState31(null);
6747
- const inFlightRef = useRef19(false);
6748
- const convRef = useRef19(conversation);
6937
+ const [result, setResult] = useState34(null);
6938
+ const [submitting, setSubmitting] = useState34(false);
6939
+ const [rawStatus, setRawStatus] = useState34(null);
6940
+ const inFlightRef = useRef22(false);
6941
+ const convRef = useRef22(conversation);
6749
6942
  convRef.current = conversation;
6750
- const optsRef = useRef19({ gameId, gameDay, fixtureId, locale, refresh });
6943
+ const optsRef = useRef22({ gameId, gameDay, fixtureId, locale, refresh });
6751
6944
  optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
6752
- const resultRef = useRef19(null);
6945
+ const resultRef = useRef22(null);
6753
6946
  resultRef.current = result;
6754
- const refetch = useCallback15(async () => {
6947
+ const refetch = useCallback18(async () => {
6755
6948
  const conv = convRef.current;
6756
6949
  if (!conv) return;
6757
6950
  const opts = optsRef.current;
@@ -6767,7 +6960,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
6767
6960
  } catch {
6768
6961
  }
6769
6962
  }, []);
6770
- const submit = useCallback15(async (answerJson) => {
6963
+ const submit = useCallback18(async (answerJson) => {
6771
6964
  const conv = convRef.current;
6772
6965
  if (!conv || inFlightRef.current) return;
6773
6966
  inFlightRef.current = true;
@@ -6794,14 +6987,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
6794
6987
  setSubmitting(false);
6795
6988
  }
6796
6989
  }, [refetch]);
6797
- const hydrate = useCallback15(() => {
6990
+ const hydrate = useCallback18(() => {
6798
6991
  void refetch();
6799
6992
  }, [refetch]);
6800
6993
  return { result, submitting, submit, hydrate, rawStatus };
6801
6994
  }
6802
6995
 
6803
6996
  // src/components/games/MysteryTigerGame.tsx
6804
- import { useState as useState33, useId as useId3 } from "react";
6997
+ import { useState as useState36, useId as useId3 } from "react";
6805
6998
 
6806
6999
  // src/components/games/nationFlags.ts
6807
7000
  var FLAGS = {
@@ -7012,7 +7205,7 @@ function isNationCode(flag) {
7012
7205
  }
7013
7206
 
7014
7207
  // src/components/games/PlayerAvatar.tsx
7015
- import { useState as useState32 } from "react";
7208
+ import { useState as useState35 } from "react";
7016
7209
  import { jsx as jsx67 } from "react/jsx-runtime";
7017
7210
  function initialsOf(name) {
7018
7211
  const parts = name.trim().split(/\s+/).filter(Boolean);
@@ -7030,7 +7223,7 @@ function PlayerAvatar({
7030
7223
  imagePath,
7031
7224
  className
7032
7225
  }) {
7033
- const [failed, setFailed] = useState32(false);
7226
+ const [failed, setFailed] = useState35(false);
7034
7227
  const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
7035
7228
  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) }) });
7036
7229
  }
@@ -7271,7 +7464,7 @@ function MysteryTigerGame({
7271
7464
  onBack
7272
7465
  }) {
7273
7466
  const t = ui.games.mysteryTiger;
7274
- const [query, setQuery] = useState33("");
7467
+ const [query, setQuery] = useState36("");
7275
7468
  const inputId = useId3();
7276
7469
  const clientState = parseClientState(result?.clientStateJson);
7277
7470
  const guessResults = clientState?.guessResults ?? [];
@@ -7533,13 +7726,13 @@ function HigherOrLowerGame({
7533
7726
  }
7534
7727
 
7535
7728
  // src/components/games/CareerPathGame.tsx
7536
- import { useState as useState35, useId as useId4 } from "react";
7729
+ import { useState as useState38, useId as useId4 } from "react";
7537
7730
 
7538
7731
  // src/components/games/ui/CrestShield.tsx
7539
- import { useState as useState34 } from "react";
7732
+ import { useState as useState37 } from "react";
7540
7733
  import { jsx as jsx78 } from "react/jsx-runtime";
7541
7734
  function CrestShield({ src, name, size = 28 }) {
7542
- const [failed, setFailed] = useState34(false);
7735
+ const [failed, setFailed] = useState37(false);
7543
7736
  if (src && !isPlaceholderImage(src) && !failed) {
7544
7737
  return /* @__PURE__ */ jsx78("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
7545
7738
  }
@@ -7571,7 +7764,7 @@ function CareerPathGame({
7571
7764
  }) {
7572
7765
  const s = ui.games.careerPath;
7573
7766
  const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
7574
- const [query, setQuery] = useState35("");
7767
+ const [query, setQuery] = useState38("");
7575
7768
  const inputId = useId4();
7576
7769
  const clientState = parseClientState3(result?.clientStateJson);
7577
7770
  const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
@@ -7678,7 +7871,7 @@ function CareerPathGame({
7678
7871
  }
7679
7872
 
7680
7873
  // src/components/games/BeatTheGridGame.tsx
7681
- import React, { useEffect as useEffect23, useId as useId5, useRef as useRef20, useState as useState36 } from "react";
7874
+ import React, { useEffect as useEffect26, useId as useId5, useRef as useRef23, useState as useState39 } from "react";
7682
7875
 
7683
7876
  // src/components/games/ui/OptionList.tsx
7684
7877
  import { jsx as jsx80 } from "react/jsx-runtime";
@@ -7767,10 +7960,10 @@ function SearchSheet({
7767
7960
  ui
7768
7961
  }) {
7769
7962
  const s = ui.games.beatTheGrid;
7770
- const [query, setQuery] = useState36("");
7963
+ const [query, setQuery] = useState39("");
7771
7964
  const inputId = useId5();
7772
- const inputRef = useRef20(null);
7773
- useEffect23(() => {
7965
+ const inputRef = useRef23(null);
7966
+ useEffect26(() => {
7774
7967
  inputRef.current?.focus();
7775
7968
  }, [row, col]);
7776
7969
  const filtered = playerPool.filter(
@@ -7835,7 +8028,7 @@ function BeatTheGridGame({
7835
8028
  }) {
7836
8029
  const s = ui.games.beatTheGrid;
7837
8030
  const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
7838
- const [activeCell, setActiveCell] = useState36(null);
8031
+ const [activeCell, setActiveCell] = useState39(null);
7839
8032
  const clientState = parseClientState4(result?.clientStateJson);
7840
8033
  const filledCells = clientState?.cells ?? [];
7841
8034
  const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
@@ -7990,7 +8183,7 @@ function BeatTheGridGame({
7990
8183
  }
7991
8184
 
7992
8185
  // src/components/games/GuessTheXiGame.tsx
7993
- import { useState as useState37, useId as useId6 } from "react";
8186
+ import { useState as useState40, useId as useId6 } from "react";
7994
8187
 
7995
8188
  // src/components/games/ui/PitchSvg.tsx
7996
8189
  import { Fragment as Fragment16, jsx as jsx82, jsxs as jsxs70 } from "react/jsx-runtime";
@@ -8079,7 +8272,7 @@ function GuessTheXiGame({
8079
8272
  onBack
8080
8273
  }) {
8081
8274
  const t = ui.games.guessTheXi;
8082
- const [query, setQuery] = useState37("");
8275
+ const [query, setQuery] = useState40("");
8083
8276
  const inputId = useId6();
8084
8277
  const clientState = parseClientState5(result?.clientStateJson);
8085
8278
  const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
@@ -8222,7 +8415,7 @@ function GuessTheXiGame({
8222
8415
  }
8223
8416
 
8224
8417
  // src/components/games/DailyQuizGame.tsx
8225
- import { useState as useState38 } from "react";
8418
+ import { useState as useState41 } from "react";
8226
8419
  import { Fragment as Fragment18, jsx as jsx84, jsxs as jsxs72 } from "react/jsx-runtime";
8227
8420
  function parseClientState6(json) {
8228
8421
  if (!json) return null;
@@ -8263,8 +8456,8 @@ function DailyQuizGame({
8263
8456
  }) {
8264
8457
  const s = ui.games.dailyQuiz;
8265
8458
  const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
8266
- const [selections, setSelections] = useState38(/* @__PURE__ */ new Map());
8267
- const [page, setPage] = useState38(0);
8459
+ const [selections, setSelections] = useState41(/* @__PURE__ */ new Map());
8460
+ const [page, setPage] = useState41(0);
8268
8461
  const clientState = parseClientState6(result?.clientStateJson);
8269
8462
  const results = clientState?.results ?? [];
8270
8463
  const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
@@ -8374,7 +8567,7 @@ function DailyQuizGame({
8374
8567
  }
8375
8568
 
8376
8569
  // src/components/games/MatchdayPredictorGame.tsx
8377
- import { useId as useId7, useState as useState39 } from "react";
8570
+ import { useId as useId7, useState as useState42 } from "react";
8378
8571
  import { jsx as jsx85, jsxs as jsxs73 } from "react/jsx-runtime";
8379
8572
  var SCORER_SEARCH_THRESHOLD = 9;
8380
8573
  function parseClientState7(json) {
@@ -8470,11 +8663,11 @@ function MatchdayPredictorGame({
8470
8663
  onBack
8471
8664
  }) {
8472
8665
  const t = ui.games.predictor;
8473
- const [homeScore, setHomeScore] = useState39(0);
8474
- const [awayScore, setAwayScore] = useState39(0);
8475
- const [firstScorerPlayerId, setFirstScorerPlayerId] = useState39(null);
8476
- const [lastEdited, setLastEdited] = useState39("home");
8477
- const [query, setQuery] = useState39("");
8666
+ const [homeScore, setHomeScore] = useState42(0);
8667
+ const [awayScore, setAwayScore] = useState42(0);
8668
+ const [firstScorerPlayerId, setFirstScorerPlayerId] = useState42(null);
8669
+ const [lastEdited, setLastEdited] = useState42("home");
8670
+ const [query, setQuery] = useState42("");
8478
8671
  const searchId = useId7();
8479
8672
  const clientState = parseClientState7(result?.clientStateJson);
8480
8673
  const alreadyPlayed = result?.alreadyPlayed === true;
@@ -8642,7 +8835,7 @@ function MatchdayPredictorGame({
8642
8835
  }
8643
8836
 
8644
8837
  // src/components/games/StartingXiGame.tsx
8645
- import { useId as useId8, useState as useState40 } from "react";
8838
+ import { useId as useId8, useState as useState43 } from "react";
8646
8839
  import { Fragment as Fragment19, jsx as jsx86, jsxs as jsxs74 } from "react/jsx-runtime";
8647
8840
  var POINTS_PER_STARTER = 8;
8648
8841
  var XI_SIZE = 11;
@@ -8686,9 +8879,9 @@ function StartingXiGame({
8686
8879
  lockAtUtc
8687
8880
  }) {
8688
8881
  const t = ui.games.startingXi;
8689
- const [slotPlayers, setSlotPlayers] = useState40(() => Array(XI_SIZE).fill(null));
8690
- const [active, setActive] = useState40(0);
8691
- const [query, setQuery] = useState40("");
8882
+ const [slotPlayers, setSlotPlayers] = useState43(() => Array(XI_SIZE).fill(null));
8883
+ const [active, setActive] = useState43(0);
8884
+ const [query, setQuery] = useState43("");
8692
8885
  const searchId = useId8();
8693
8886
  const clientState = parseClientState8(result?.clientStateJson);
8694
8887
  const alreadyPlayed = result?.alreadyPlayed === true;
@@ -8828,7 +9021,7 @@ function StartingXiGame({
8828
9021
  }
8829
9022
 
8830
9023
  // src/components/games/StatLadderGame.tsx
8831
- import { useId as useId9, useState as useState41 } from "react";
9024
+ import { useId as useId9, useState as useState44 } from "react";
8832
9025
  import { jsx as jsx87, jsxs as jsxs75 } from "react/jsx-runtime";
8833
9026
  function ladderClue(ladder) {
8834
9027
  const mystery = ladder.find((r) => r.rank === 2);
@@ -8865,8 +9058,8 @@ function StatLadderGame({
8865
9058
  onBack
8866
9059
  }) {
8867
9060
  const t = ui.games.statLadder;
8868
- const [query, setQuery] = useState41("");
8869
- const [selectedId, setSelectedId] = useState41(null);
9061
+ const [query, setQuery] = useState44("");
9062
+ const [selectedId, setSelectedId] = useState44(null);
8870
9063
  const searchId = useId9();
8871
9064
  const clientState = parseClientState9(result?.clientStateJson);
8872
9065
  const revealed = clientState != null;
@@ -9073,8 +9266,8 @@ function GameScreenHost({
9073
9266
  ui
9074
9267
  }) {
9075
9268
  const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
9076
- const [configJson, setConfigJson] = useState42(null);
9077
- useEffect24(() => {
9269
+ const [configJson, setConfigJson] = useState45(null);
9270
+ useEffect27(() => {
9078
9271
  setConfigJson(null);
9079
9272
  if (!conversation) return;
9080
9273
  let cancelled = false;
@@ -9097,12 +9290,12 @@ function GameScreenHost({
9097
9290
  fixtureId: fixtureId || void 0,
9098
9291
  locale: ui.games.lang
9099
9292
  });
9100
- useEffect24(() => {
9293
+ useEffect27(() => {
9101
9294
  if (conversation) hydrate();
9102
9295
  }, [conversation, gameId]);
9103
- const hydrateRef = useRef21(hydrate);
9296
+ const hydrateRef = useRef24(hydrate);
9104
9297
  hydrateRef.current = hydrate;
9105
- useEffect24(() => {
9298
+ useEffect27(() => {
9106
9299
  if (!FIXTURE_GAME_IDS.has(gameId)) return;
9107
9300
  if (rawStatus !== "pending") return;
9108
9301
  const timerId = setInterval(() => {
@@ -9214,65 +9407,11 @@ function GameScreenHost({
9214
9407
  return /* @__PURE__ */ jsx89("div", { className: "ss-w-gscreen", "data-testid": "gscreen", "data-lock-at": lockAtUtc ?? void 0, children: renderScreen() });
9215
9408
  }
9216
9409
 
9217
- // src/components/games/ui/fonts.ts
9218
- var FONTS_LINK_ID = "ss-w-games-fonts";
9219
- var FONTS_HREF = "https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Barlow:wght@400;500;600;700&display=swap";
9220
- function ensureGamesFonts(doc = document) {
9221
- if (!doc.head) return;
9222
- if (doc.getElementById(FONTS_LINK_ID)) return;
9223
- const link = doc.createElement("link");
9224
- link.id = FONTS_LINK_ID;
9225
- link.rel = "stylesheet";
9226
- link.href = FONTS_HREF;
9227
- doc.head.appendChild(link);
9228
- }
9229
-
9230
- // src/components/GamesPanel.tsx
9231
- import { jsx as jsx90 } from "react/jsx-runtime";
9232
- function GamesPanel({
9233
- loggedIn,
9234
- games,
9235
- ui,
9236
- conversation,
9237
- leaderboard,
9238
- refreshHub
9239
- }) {
9240
- const [selected, setSelected] = useState43(null);
9241
- useEffect25(() => {
9242
- ensureGamesFonts();
9243
- }, []);
9244
- if (!loggedIn) return /* @__PURE__ */ jsx90(GamesLoginWall, { ui });
9245
- if (selected !== null) {
9246
- return /* @__PURE__ */ jsx90("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ jsx90(
9247
- GameScreenHost,
9248
- {
9249
- selected,
9250
- onBack: () => {
9251
- setSelected(null);
9252
- refreshHub?.();
9253
- },
9254
- onPlayed: refreshHub,
9255
- conversation: conversation ?? null,
9256
- ui
9257
- }
9258
- ) });
9259
- }
9260
- return /* @__PURE__ */ jsx90("div", { className: "ss-g-hub-wrap", "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ jsx90(
9261
- GamesHub,
9262
- {
9263
- games,
9264
- onOpen: (g) => setSelected({ gameId: g.gameId, fixtureId: g.fixtureId, gameDay: g.gameDay, lockAtUtc: g.lockAtUtc ?? null }),
9265
- myWeeklyRow: leaderboard?.myWeeklyRow ?? null,
9266
- ui
9267
- }
9268
- ) });
9269
- }
9270
-
9271
9410
  // src/components/Leaderboard.tsx
9272
- import { useState as useState44 } from "react";
9411
+ import { useState as useState46 } from "react";
9273
9412
 
9274
9413
  // src/components/LeaderboardRow.tsx
9275
- import { jsx as jsx91, jsxs as jsxs77 } from "react/jsx-runtime";
9414
+ import { jsx as jsx90, jsxs as jsxs77 } from "react/jsx-runtime";
9276
9415
  function formatPoints(n) {
9277
9416
  return n.toLocaleString("en");
9278
9417
  }
@@ -9286,8 +9425,8 @@ function LeaderboardWeeklyRow({
9286
9425
  "#",
9287
9426
  row.rank
9288
9427
  ] }),
9289
- /* @__PURE__ */ jsx91("span", { className: "ss-w-lb2-handle", children: row.handle }),
9290
- /* @__PURE__ */ jsx91("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
9428
+ /* @__PURE__ */ jsx90("span", { className: "ss-w-lb2-handle", children: row.handle }),
9429
+ /* @__PURE__ */ jsx90("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
9291
9430
  row.currentStreak > 0 && /* @__PURE__ */ jsxs77("span", { className: "ss-w-lb2-streak", children: [
9292
9431
  "\u{1F525} ",
9293
9432
  row.currentStreak
@@ -9304,13 +9443,13 @@ function LeaderboardAllTimeRow({
9304
9443
  "#",
9305
9444
  row.rank
9306
9445
  ] }),
9307
- /* @__PURE__ */ jsx91("span", { className: "ss-w-lb2-handle", children: row.handle }),
9308
- /* @__PURE__ */ jsx91("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
9446
+ /* @__PURE__ */ jsx90("span", { className: "ss-w-lb2-handle", children: row.handle }),
9447
+ /* @__PURE__ */ jsx90("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
9309
9448
  ] });
9310
9449
  }
9311
9450
 
9312
9451
  // src/components/LeaderboardEmpty.tsx
9313
- import { jsx as jsx92, jsxs as jsxs78 } from "react/jsx-runtime";
9452
+ import { jsx as jsx91, jsxs as jsxs78 } from "react/jsx-runtime";
9314
9453
  function LeaderboardEmpty({
9315
9454
  segment,
9316
9455
  lastWeek,
@@ -9320,8 +9459,8 @@ function LeaderboardEmpty({
9320
9459
  }) {
9321
9460
  if (segment === "alltime") {
9322
9461
  return /* @__PURE__ */ jsxs78("div", { className: "ss-w-lb-empty ss-w-lb-empty--alltime", children: [
9323
- /* @__PURE__ */ jsx92("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
9324
- /* @__PURE__ */ jsx92("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
9462
+ /* @__PURE__ */ jsx91("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
9463
+ /* @__PURE__ */ jsx91("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
9325
9464
  ] });
9326
9465
  }
9327
9466
  const fresh = lastWeek != null;
@@ -9329,38 +9468,38 @@ function LeaderboardEmpty({
9329
9468
  const body = fresh ? ui.leaderboardEmptyFreshBody : ui.leaderboardEmptyColdBody;
9330
9469
  return /* @__PURE__ */ jsxs78("div", { className: "ss-w-lb-empty", children: [
9331
9470
  weeklyPrize && /* @__PURE__ */ jsxs78("div", { className: "ss-w-prize", children: [
9332
- /* @__PURE__ */ jsx92("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
9333
- /* @__PURE__ */ jsx92("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ jsx92("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
9471
+ /* @__PURE__ */ jsx91("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
9472
+ /* @__PURE__ */ jsx91("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ jsx91("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
9334
9473
  ] }),
9335
9474
  /* @__PURE__ */ jsxs78("div", { className: "ss-w-lb-empty-hero", children: [
9336
- /* @__PURE__ */ jsx92("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
9337
- /* @__PURE__ */ jsx92("h4", { className: "ss-w-lb-empty-title", children: title }),
9338
- /* @__PURE__ */ jsx92("p", { className: "ss-w-lb-empty-body", children: body }),
9339
- onPlay && /* @__PURE__ */ jsx92("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
9475
+ /* @__PURE__ */ jsx91("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
9476
+ /* @__PURE__ */ jsx91("h4", { className: "ss-w-lb-empty-title", children: title }),
9477
+ /* @__PURE__ */ jsx91("p", { className: "ss-w-lb-empty-body", children: body }),
9478
+ onPlay && /* @__PURE__ */ jsx91("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
9340
9479
  ] }),
9341
9480
  fresh && lastWeek && /* @__PURE__ */ jsxs78("div", { className: "ss-w-lb-last", children: [
9342
- /* @__PURE__ */ jsx92("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
9343
- /* @__PURE__ */ jsx92("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
9344
- /* @__PURE__ */ jsx92("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
9345
- /* @__PURE__ */ jsx92("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
9481
+ /* @__PURE__ */ jsx91("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
9482
+ /* @__PURE__ */ jsx91("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
9483
+ /* @__PURE__ */ jsx91("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
9484
+ /* @__PURE__ */ jsx91("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
9346
9485
  ] })
9347
9486
  ] });
9348
9487
  }
9349
9488
 
9350
9489
  // src/components/Leaderboard.tsx
9351
- import { Fragment as Fragment20, jsx as jsx93, jsxs as jsxs79 } from "react/jsx-runtime";
9490
+ import { Fragment as Fragment20, jsx as jsx92, jsxs as jsxs79 } from "react/jsx-runtime";
9352
9491
  function Leaderboard({
9353
9492
  data,
9354
9493
  ui,
9355
9494
  onPlay
9356
9495
  }) {
9357
- const [segment, setSegment] = useState44("weekly");
9496
+ const [segment, setSegment] = useState46("weekly");
9358
9497
  const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
9359
9498
  const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
9360
9499
  const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
9361
9500
  return /* @__PURE__ */ jsxs79("div", { className: "ss-w-lb2", children: [
9362
9501
  /* @__PURE__ */ jsxs79("div", { className: "ss-w-seg", children: [
9363
- /* @__PURE__ */ jsx93(
9502
+ /* @__PURE__ */ jsx92(
9364
9503
  "button",
9365
9504
  {
9366
9505
  type: "button",
@@ -9370,7 +9509,7 @@ function Leaderboard({
9370
9509
  children: ui.leaderboardThisWeek
9371
9510
  }
9372
9511
  ),
9373
- /* @__PURE__ */ jsx93(
9512
+ /* @__PURE__ */ jsx92(
9374
9513
  "button",
9375
9514
  {
9376
9515
  type: "button",
@@ -9381,7 +9520,7 @@ function Leaderboard({
9381
9520
  }
9382
9521
  )
9383
9522
  ] }),
9384
- isEmpty ? /* @__PURE__ */ jsx93(
9523
+ isEmpty ? /* @__PURE__ */ jsx92(
9385
9524
  LeaderboardEmpty,
9386
9525
  {
9387
9526
  segment,
@@ -9391,14 +9530,14 @@ function Leaderboard({
9391
9530
  ui
9392
9531
  }
9393
9532
  ) : /* @__PURE__ */ jsxs79(Fragment20, { children: [
9394
- /* @__PURE__ */ jsx93("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ jsx93(
9533
+ /* @__PURE__ */ jsx92("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ jsx92(
9395
9534
  LeaderboardWeeklyRow,
9396
9535
  {
9397
9536
  row,
9398
9537
  isMe: row.operatorUserId === data.myWeeklyRow?.operatorUserId
9399
9538
  },
9400
9539
  row.operatorUserId
9401
- )) : data.allTimeTop.map((row) => /* @__PURE__ */ jsx93(
9540
+ )) : data.allTimeTop.map((row) => /* @__PURE__ */ jsx92(
9402
9541
  LeaderboardAllTimeRow,
9403
9542
  {
9404
9543
  row,
@@ -9406,18 +9545,18 @@ function Leaderboard({
9406
9545
  },
9407
9546
  row.operatorUserId
9408
9547
  )) }),
9409
- /* @__PURE__ */ jsx93("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
9410
- myRow != null && (offBoard ? /* @__PURE__ */ jsx93("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ jsxs79("div", { className: "ss-w-lb2-rows", children: [
9411
- segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ jsx93(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
9412
- segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ jsx93(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
9548
+ /* @__PURE__ */ jsx92("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
9549
+ myRow != null && (offBoard ? /* @__PURE__ */ jsx92("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ jsxs79("div", { className: "ss-w-lb2-rows", children: [
9550
+ segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ jsx92(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
9551
+ segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ jsx92(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
9413
9552
  ] })),
9414
- segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ jsx93("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ jsx93("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ jsx93("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
9553
+ segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ jsx92("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ jsx92("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ jsx92("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
9415
9554
  ] })
9416
9555
  ] });
9417
9556
  }
9418
9557
 
9419
9558
  // src/components/LeaderboardPanel.tsx
9420
- import { jsx as jsx94 } from "react/jsx-runtime";
9559
+ import { jsx as jsx93 } from "react/jsx-runtime";
9421
9560
  var EMPTY_PAYLOAD = {
9422
9561
  week: "",
9423
9562
  weeklyTop: [],
@@ -9428,19 +9567,216 @@ var EMPTY_PAYLOAD = {
9428
9567
  lastWeek: null
9429
9568
  };
9430
9569
  function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
9570
+ if (!loggedIn) return /* @__PURE__ */ jsx93(GamesLoginWall, { ui });
9571
+ if (data === null && loading) return /* @__PURE__ */ jsx93("div", { className: "ss-w-mon-list" });
9572
+ return /* @__PURE__ */ jsx93("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx93(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
9573
+ }
9574
+
9575
+ // src/components/games/ui/fonts.ts
9576
+ var FONTS_LINK_ID = "ss-w-games-fonts";
9577
+ var FONTS_HREF = "https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Barlow:wght@400;500;600;700&display=swap";
9578
+ function ensureGamesFonts(doc = document) {
9579
+ if (!doc.head) return;
9580
+ if (doc.getElementById(FONTS_LINK_ID)) return;
9581
+ const link = doc.createElement("link");
9582
+ link.id = FONTS_LINK_ID;
9583
+ link.rel = "stylesheet";
9584
+ link.href = FONTS_HREF;
9585
+ doc.head.appendChild(link);
9586
+ }
9587
+
9588
+ // src/components/GamesPanel.tsx
9589
+ import { jsx as jsx94, jsxs as jsxs80 } from "react/jsx-runtime";
9590
+ function GamesPanel({
9591
+ loggedIn,
9592
+ games,
9593
+ ui,
9594
+ conversation,
9595
+ leaderboard,
9596
+ leaderboardLoading,
9597
+ refreshHub
9598
+ }) {
9599
+ const [selected, setSelected] = useState47(null);
9600
+ const [segment, setSegment] = useState47("play");
9601
+ useEffect28(() => {
9602
+ ensureGamesFonts();
9603
+ }, []);
9431
9604
  if (!loggedIn) return /* @__PURE__ */ jsx94(GamesLoginWall, { ui });
9432
- if (data === null && loading) return /* @__PURE__ */ jsx94("div", { className: "ss-w-mon-list" });
9433
- return /* @__PURE__ */ jsx94("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx94(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
9605
+ if (selected !== null) {
9606
+ return /* @__PURE__ */ jsx94("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ jsx94(
9607
+ GameScreenHost,
9608
+ {
9609
+ selected,
9610
+ onBack: () => {
9611
+ setSelected(null);
9612
+ refreshHub?.();
9613
+ },
9614
+ onPlayed: refreshHub,
9615
+ conversation: conversation ?? null,
9616
+ ui
9617
+ }
9618
+ ) });
9619
+ }
9620
+ return /* @__PURE__ */ jsxs80("div", { className: "ss-g-hub-wrap", lang: ui.games.lang, children: [
9621
+ /* @__PURE__ */ jsxs80("div", { className: "ss-w-seg", children: [
9622
+ /* @__PURE__ */ jsx94(
9623
+ "button",
9624
+ {
9625
+ type: "button",
9626
+ className: "ss-w-seg-btn",
9627
+ ...segment === "play" ? { "data-on": "" } : {},
9628
+ onClick: () => setSegment("play"),
9629
+ children: ui.gamesPlaySegment
9630
+ }
9631
+ ),
9632
+ /* @__PURE__ */ jsx94(
9633
+ "button",
9634
+ {
9635
+ type: "button",
9636
+ className: "ss-w-seg-btn",
9637
+ ...segment === "leaderboard" ? { "data-on": "" } : {},
9638
+ onClick: () => setSegment("leaderboard"),
9639
+ children: ui.tabLeaderboard
9640
+ }
9641
+ )
9642
+ ] }),
9643
+ segment === "play" ? /* @__PURE__ */ jsx94("div", { "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ jsx94(
9644
+ GamesHub,
9645
+ {
9646
+ games,
9647
+ onOpen: (g) => setSelected({ gameId: g.gameId, fixtureId: g.fixtureId, gameDay: g.gameDay, lockAtUtc: g.lockAtUtc ?? null }),
9648
+ myWeeklyRow: leaderboard?.myWeeklyRow ?? null,
9649
+ ui
9650
+ }
9651
+ ) }) : /* @__PURE__ */ jsx94(
9652
+ LeaderboardPanel,
9653
+ {
9654
+ loggedIn,
9655
+ data: leaderboard ?? null,
9656
+ loading: leaderboardLoading ?? false,
9657
+ onPlay: () => setSegment("play"),
9658
+ ui
9659
+ }
9660
+ )
9661
+ ] });
9662
+ }
9663
+
9664
+ // src/components/Fixtures.tsx
9665
+ import { jsx as jsx95, jsxs as jsxs81 } from "react/jsx-runtime";
9666
+ function groupByRound(fixtures) {
9667
+ const groups = [];
9668
+ for (const fx of fixtures) {
9669
+ const last = groups[groups.length - 1];
9670
+ if (last && last.round === fx.round) last.items.push(fx);
9671
+ else groups.push({ round: fx.round, items: [fx] });
9672
+ }
9673
+ return groups;
9674
+ }
9675
+ function Fixtures({ fixtures, loading, ui }) {
9676
+ if (fixtures.length === 0) {
9677
+ if (loading) return /* @__PURE__ */ jsx95("div", { className: "ss-w-mon-list" });
9678
+ return /* @__PURE__ */ jsx95("div", { className: "ss-w-mon-empty", children: ui.clubFixturesEmpty });
9679
+ }
9680
+ return /* @__PURE__ */ jsx95("div", { className: "ss-w-mon-list", children: groupByRound(fixtures).map((group, gi) => /* @__PURE__ */ jsxs81("div", { children: [
9681
+ group.round && /* @__PURE__ */ jsx95("div", { className: "ss-w-club-eyebrow", children: group.round }),
9682
+ group.items.map((fx) => {
9683
+ const played = fx.homeScore !== null && fx.awayScore !== null;
9684
+ const kickoff = fx.matchDateTime ? ui.bettingKickoff(fx.matchDateTime) : null;
9685
+ return /* @__PURE__ */ jsxs81("div", { className: "ss-w-mon", children: [
9686
+ /* @__PURE__ */ jsxs81("div", { className: "ss-w-mon-top", children: [
9687
+ fx.competitionName && /* @__PURE__ */ jsx95("span", { className: "ss-w-mon-comp", children: fx.competitionName }),
9688
+ !played && kickoff && /* @__PURE__ */ jsxs81("span", { className: "ss-w-mon-pill", children: [
9689
+ kickoff.dayLabel,
9690
+ " \xB7 ",
9691
+ kickoff.time
9692
+ ] })
9693
+ ] }),
9694
+ /* @__PURE__ */ jsxs81("div", { className: "ss-w-mon-main", children: [
9695
+ /* @__PURE__ */ jsx95("span", { className: "ss-w-mon-side", children: /* @__PURE__ */ jsx95("span", { className: "ss-w-mon-name", children: fx.homeTeamName }) }),
9696
+ played ? /* @__PURE__ */ jsxs81("span", { className: "ss-w-mon-score", children: [
9697
+ fx.homeScore,
9698
+ /* @__PURE__ */ jsx95("i", { children: "-" }),
9699
+ fx.awayScore
9700
+ ] }) : /* @__PURE__ */ jsx95("span", { className: "ss-w-mon-vs", children: "vs" }),
9701
+ /* @__PURE__ */ jsx95("span", { className: "ss-w-mon-side ss-w-mon-side--away", children: /* @__PURE__ */ jsx95("span", { className: "ss-w-mon-name", children: fx.awayTeamName }) })
9702
+ ] })
9703
+ ] }, fx.id);
9704
+ })
9705
+ ] }, `${gi}-${group.round ?? "none"}`)) });
9706
+ }
9707
+
9708
+ // src/components/Standings.tsx
9709
+ import { jsx as jsx96, jsxs as jsxs82 } from "react/jsx-runtime";
9710
+ function groupByTable(rows) {
9711
+ const groups = [];
9712
+ for (const row of rows) {
9713
+ const last = groups[groups.length - 1];
9714
+ if (last && last.table === row.table) last.items.push(row);
9715
+ else groups.push({ table: row.table, items: [row] });
9716
+ }
9717
+ return groups;
9718
+ }
9719
+ function Standings({ standings, loading, ui }) {
9720
+ if (standings === null && loading) return /* @__PURE__ */ jsx96("div", { className: "ss-w-mon-list" });
9721
+ if (standings === null || standings.length === 0) return /* @__PURE__ */ jsx96("div", { className: "ss-w-mon-empty", children: ui.clubStandingsEmpty });
9722
+ return /* @__PURE__ */ jsx96("div", { className: "ss-w-mon-list", children: groupByTable(standings).map((group, gi) => /* @__PURE__ */ jsxs82("div", { className: "ss-w-table-wrap", children: [
9723
+ group.table && /* @__PURE__ */ jsx96("div", { className: "ss-w-club-eyebrow", children: group.table }),
9724
+ /* @__PURE__ */ jsxs82("table", { className: "ss-w-md-table", children: [
9725
+ /* @__PURE__ */ jsx96("thead", { children: /* @__PURE__ */ jsxs82("tr", { children: [
9726
+ /* @__PURE__ */ jsx96("th", { children: "#" }),
9727
+ /* @__PURE__ */ jsx96("th", { children: ui.standingsColClub }),
9728
+ /* @__PURE__ */ jsx96("th", { children: ui.standingsColPlayed }),
9729
+ /* @__PURE__ */ jsx96("th", { children: ui.standingsColWon }),
9730
+ /* @__PURE__ */ jsx96("th", { children: ui.standingsColDrawn }),
9731
+ /* @__PURE__ */ jsx96("th", { children: ui.standingsColLost }),
9732
+ /* @__PURE__ */ jsx96("th", { children: ui.standingsColGoalDiff }),
9733
+ /* @__PURE__ */ jsx96("th", { children: ui.standingsColPoints })
9734
+ ] }) }),
9735
+ /* @__PURE__ */ jsx96("tbody", { children: group.items.map((row) => /* @__PURE__ */ jsxs82("tr", { children: [
9736
+ /* @__PURE__ */ jsx96("td", { children: row.position }),
9737
+ /* @__PURE__ */ jsx96("td", { children: row.teamName }),
9738
+ /* @__PURE__ */ jsx96("td", { children: row.playedGames }),
9739
+ /* @__PURE__ */ jsx96("td", { children: row.wins }),
9740
+ /* @__PURE__ */ jsx96("td", { children: row.draws }),
9741
+ /* @__PURE__ */ jsx96("td", { children: row.losses }),
9742
+ /* @__PURE__ */ jsx96("td", { children: row.goalDifference }),
9743
+ /* @__PURE__ */ jsx96("td", { children: row.points })
9744
+ ] }, row.teamId)) })
9745
+ ] })
9746
+ ] }, `${gi}-${group.table ?? "none"}`)) });
9747
+ }
9748
+
9749
+ // src/components/Squad.tsx
9750
+ import { jsx as jsx97, jsxs as jsxs83 } from "react/jsx-runtime";
9751
+ function groupByPosition(players) {
9752
+ const groups = [];
9753
+ for (const p of players) {
9754
+ const last = groups[groups.length - 1];
9755
+ if (last && last.positionName === p.positionName) last.items.push(p);
9756
+ else groups.push({ positionName: p.positionName, items: [p] });
9757
+ }
9758
+ return groups;
9759
+ }
9760
+ function Squad({ squad, loading, ui }) {
9761
+ if (squad === null && loading) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-list" });
9762
+ if (squad === null || squad.length === 0) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-empty", children: ui.clubSquadEmpty });
9763
+ return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-list", children: groupByPosition(squad).map((group, gi) => /* @__PURE__ */ jsxs83("div", { children: [
9764
+ group.positionName && /* @__PURE__ */ jsx97("div", { className: "ss-w-club-eyebrow", children: group.positionName }),
9765
+ group.items.map((p) => /* @__PURE__ */ jsxs83("div", { className: "ss-w-sq-row", children: [
9766
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-num", children: p.jerseyNumber ?? "" }),
9767
+ /* @__PURE__ */ jsx97("span", { className: "ss-w-sq-name", children: p.playerName })
9768
+ ] }, p.playerId))
9769
+ ] }, `${gi}-${group.positionName ?? "none"}`)) });
9434
9770
  }
9435
9771
 
9436
9772
  // src/components/PresetSpeedDial.tsx
9437
9773
  import { useId as useId10 } from "react";
9438
- import { jsx as jsx95, jsxs as jsxs80 } from "react/jsx-runtime";
9774
+ import { jsx as jsx98, jsxs as jsxs84 } from "react/jsx-runtime";
9439
9775
  function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef, buttonRef }) {
9440
9776
  const pillsId = useId10();
9441
9777
  const tabIndex = expanded ? 0 : -1;
9442
- return /* @__PURE__ */ jsxs80("div", { ref: rootRef, className: "ss-w-dial", children: [
9443
- /* @__PURE__ */ jsxs80(
9778
+ return /* @__PURE__ */ jsxs84("div", { ref: rootRef, className: "ss-w-dial", children: [
9779
+ /* @__PURE__ */ jsxs84(
9444
9780
  "button",
9445
9781
  {
9446
9782
  ref: buttonRef,
@@ -9451,36 +9787,36 @@ function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef
9451
9787
  "aria-label": strings.dialName,
9452
9788
  onClick: onToggle,
9453
9789
  children: [
9454
- /* @__PURE__ */ jsx95("span", { className: "ss-w-dial-icon ss-w-dial-icon--open", children: /* @__PURE__ */ jsx95(SlidersIcon, {}) }),
9455
- /* @__PURE__ */ jsx95("span", { className: "ss-w-dial-icon ss-w-dial-icon--close", children: /* @__PURE__ */ jsx95(CloseIcon, {}) }),
9456
- showDot && !expanded ? /* @__PURE__ */ jsx95("span", { className: "ss-w-dial-dot", "aria-hidden": "true" }) : null
9790
+ /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-icon ss-w-dial-icon--open", children: /* @__PURE__ */ jsx98(SlidersIcon, {}) }),
9791
+ /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-icon ss-w-dial-icon--close", children: /* @__PURE__ */ jsx98(CloseIcon, {}) }),
9792
+ showDot && !expanded ? /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-dot", "aria-hidden": "true" }) : null
9457
9793
  ]
9458
9794
  }
9459
9795
  ),
9460
- /* @__PURE__ */ jsxs80("div", { id: pillsId, className: "ss-w-dial-pills", "data-open": expanded ? "" : void 0, children: [
9461
- /* @__PURE__ */ jsxs80("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("numbers"), children: [
9462
- /* @__PURE__ */ jsx95(SlidersIcon, {}),
9463
- /* @__PURE__ */ jsx95("span", { className: "ss-w-dial-pill-label", children: strings.setNumbers })
9796
+ /* @__PURE__ */ jsxs84("div", { id: pillsId, className: "ss-w-dial-pills", "data-open": expanded ? "" : void 0, children: [
9797
+ /* @__PURE__ */ jsxs84("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("numbers"), children: [
9798
+ /* @__PURE__ */ jsx98(SlidersIcon, {}),
9799
+ /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-pill-label", children: strings.setNumbers })
9464
9800
  ] }),
9465
- /* @__PURE__ */ jsxs80("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("combo"), children: [
9466
- /* @__PURE__ */ jsx95(ComboIcon, {}),
9467
- /* @__PURE__ */ jsx95("span", { className: "ss-w-dial-pill-label", children: strings.buildCombo })
9801
+ /* @__PURE__ */ jsxs84("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("combo"), children: [
9802
+ /* @__PURE__ */ jsx98(ComboIcon, {}),
9803
+ /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-pill-label", children: strings.buildCombo })
9468
9804
  ] })
9469
9805
  ] })
9470
9806
  ] });
9471
9807
  }
9472
9808
 
9473
9809
  // src/components/PresetTools.tsx
9474
- import { Fragment as Fragment21, useEffect as useEffect26, useId as useId11, useRef as useRef22, useState as useState45 } from "react";
9475
- import { Fragment as Fragment22, jsx as jsx96, jsxs as jsxs81 } from "react/jsx-runtime";
9810
+ import { Fragment as Fragment21, useEffect as useEffect29, useId as useId11, useRef as useRef25, useState as useState48 } from "react";
9811
+ import { Fragment as Fragment22, jsx as jsx99, jsxs as jsxs85 } from "react/jsx-runtime";
9476
9812
  var FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
9477
9813
  function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
9478
- const dialogRef = useRef22(null);
9814
+ const dialogRef = useRef25(null);
9479
9815
  const titleId = useId11();
9480
- useEffect26(() => {
9816
+ useEffect29(() => {
9481
9817
  dialogRef.current?.focus();
9482
9818
  }, []);
9483
- useEffect26(() => {
9819
+ useEffect29(() => {
9484
9820
  const onKey = (e) => {
9485
9821
  if (e.key !== "Escape") return;
9486
9822
  e.stopPropagation();
@@ -9510,79 +9846,79 @@ function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
9510
9846
  first.focus();
9511
9847
  }
9512
9848
  };
9513
- return /* @__PURE__ */ jsx96("div", { className: "ss-w-tool-backdrop", children: /* @__PURE__ */ jsxs81("div", { ref: dialogRef, className: "ss-w-tool", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, onKeyDown: trapTab, children: [
9514
- /* @__PURE__ */ jsxs81("div", { className: "ss-w-tool-head", children: [
9515
- /* @__PURE__ */ jsx96("h2", { id: titleId, className: "ss-w-tool-title", children: title }),
9516
- /* @__PURE__ */ jsx96("button", { type: "button", className: "ss-w-tool-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx96(CloseIcon, {}) })
9849
+ return /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-backdrop", children: /* @__PURE__ */ jsxs85("div", { ref: dialogRef, className: "ss-w-tool", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, onKeyDown: trapTab, children: [
9850
+ /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-head", children: [
9851
+ /* @__PURE__ */ jsx99("h2", { id: titleId, className: "ss-w-tool-title", children: title }),
9852
+ /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx99(CloseIcon, {}) })
9517
9853
  ] }),
9518
- /* @__PURE__ */ jsx96("div", { className: "ss-w-tool-body", children }),
9519
- footer ? /* @__PURE__ */ jsx96("div", { className: "ss-w-tool-foot", children: footer }) : null
9854
+ /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-body", children }),
9855
+ footer ? /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-foot", children: footer }) : null
9520
9856
  ] }) });
9521
9857
  }
9522
9858
  function fillTemplate(template, slots) {
9523
9859
  return template.split(/(\{[a-z]+\})/).filter((part) => part !== "").map((part, i) => {
9524
9860
  const key = /^\{([a-z]+)\}$/.exec(part)?.[1];
9525
- return /* @__PURE__ */ jsx96(Fragment21, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
9861
+ return /* @__PURE__ */ jsx99(Fragment21, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
9526
9862
  });
9527
9863
  }
9528
9864
  function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
9529
9865
  const selected = Math.max(0, choices2.findIndex((c) => c.text === current));
9530
- return /* @__PURE__ */ jsxs81("span", { className: "ss-w-tool-num", children: [
9531
- /* @__PURE__ */ jsx96("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
9532
- /* @__PURE__ */ jsx96("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(selected), onChange: (e) => {
9866
+ return /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-num", children: [
9867
+ /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
9868
+ /* @__PURE__ */ jsx99("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(selected), onChange: (e) => {
9533
9869
  const c = choices2[Number(e.target.value)];
9534
9870
  if (c) onChoose(c.value);
9535
- }, children: choices2.map((c, i) => /* @__PURE__ */ jsx96("option", { value: String(i), disabled: lockEmpty && !c.available && i !== selected, children: c.available ? c.text : `${c.text}${notToday}` }, i)) })
9871
+ }, children: choices2.map((c, i) => /* @__PURE__ */ jsx99("option", { value: String(i), disabled: lockEmpty && !c.available && i !== selected, children: c.available ? c.text : `${c.text}${notToday}` }, i)) })
9536
9872
  ] });
9537
9873
  }
9538
9874
  function ChoiceSelect({ currentIdx, sizeLabels, optionLabels, label, onChoose }) {
9539
9875
  const sizeText = sizeLabels[currentIdx] ?? "";
9540
- return /* @__PURE__ */ jsxs81("span", { className: "ss-w-tool-num", children: [
9541
- /* @__PURE__ */ jsx96("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: sizeText }),
9542
- /* @__PURE__ */ jsx96("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__ */ jsx96("option", { value: String(i), children: opt }, i)) })
9876
+ return /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-num", children: [
9877
+ /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: sizeText }),
9878
+ /* @__PURE__ */ jsx99("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(currentIdx), onChange: (e) => onChoose(Number(e.target.value)), children: optionLabels.map((opt, i) => /* @__PURE__ */ jsx99("option", { value: String(i), children: opt }, i)) })
9543
9879
  ] });
9544
9880
  }
9545
9881
  function SendButton({ label, display, disabled, onClick }) {
9546
- return /* @__PURE__ */ jsx96("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
9882
+ return /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
9547
9883
  }
9548
9884
  function PickList({ picks, formatKickoff }) {
9549
- return /* @__PURE__ */ jsx96("ul", { className: "ss-w-tool-picks", role: "list", children: picks.map((p) => /* @__PURE__ */ jsxs81("li", { className: "ss-w-tool-pick", children: [
9550
- /* @__PURE__ */ jsxs81("span", { className: "ss-w-tool-pick-match", children: [
9885
+ return /* @__PURE__ */ jsx99("ul", { className: "ss-w-tool-picks", role: "list", children: picks.map((p) => /* @__PURE__ */ jsxs85("li", { className: "ss-w-tool-pick", children: [
9886
+ /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-pick-match", children: [
9551
9887
  p.homeTeamName,
9552
9888
  " \u2013 ",
9553
9889
  p.awayTeamName
9554
9890
  ] }),
9555
- /* @__PURE__ */ jsxs81("span", { className: "ss-w-tool-pick-sel", children: [
9891
+ /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-pick-sel", children: [
9556
9892
  p.marketLabel,
9557
9893
  ": ",
9558
9894
  p.selectionLabel,
9559
9895
  p.line ? ` ${p.line}` : ""
9560
9896
  ] }),
9561
- /* @__PURE__ */ jsx96("span", { className: "ss-w-tool-pick-kick", children: formatKickoff(p.kickoffUtc) }),
9562
- /* @__PURE__ */ jsx96("span", { className: "ss-w-tool-pick-price", children: p.price.toFixed(2) })
9897
+ /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-pick-kick", children: formatKickoff(p.kickoffUtc) }),
9898
+ /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-pick-price", children: p.price.toFixed(2) })
9563
9899
  ] }, p.matchOddsId)) });
9564
9900
  }
9565
9901
  function ComboPreview({ cell, formatKickoff }) {
9566
- return /* @__PURE__ */ jsxs81(Fragment22, { children: [
9567
- /* @__PURE__ */ jsx96(PickList, { picks: cell.combo.legs, formatKickoff }),
9568
- /* @__PURE__ */ jsx96("div", { className: "ss-w-tool-math", children: cell.combo.multiplication })
9902
+ return /* @__PURE__ */ jsxs85(Fragment22, { children: [
9903
+ /* @__PURE__ */ jsx99(PickList, { picks: cell.combo.legs, formatKickoff }),
9904
+ /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-math", children: cell.combo.multiplication })
9569
9905
  ] });
9570
9906
  }
9571
9907
  function Unavailable({ text }) {
9572
- return /* @__PURE__ */ jsx96("p", { className: "ss-w-tool-unavailable", children: text });
9908
+ return /* @__PURE__ */ jsx99("p", { className: "ss-w-tool-unavailable", children: text });
9573
9909
  }
9574
9910
  function AskRow({ icon, ask, ready, send }) {
9575
- return /* @__PURE__ */ jsxs81("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
9576
- /* @__PURE__ */ jsx96("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
9577
- /* @__PURE__ */ jsxs81("div", { className: "ss-w-tool-main", children: [
9578
- /* @__PURE__ */ jsx96("p", { className: "ss-w-tool-ask", children: ask }),
9579
- ready ? /* @__PURE__ */ jsx96("span", { className: "ss-w-tool-ready", children: ready }) : null
9911
+ return /* @__PURE__ */ jsxs85("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
9912
+ /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
9913
+ /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-main", children: [
9914
+ /* @__PURE__ */ jsx99("p", { className: "ss-w-tool-ask", children: ask }),
9915
+ ready ? /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-ready", children: ready }) : null
9580
9916
  ] }),
9581
9917
  send
9582
9918
  ] });
9583
9919
  }
9584
9920
  function RoundSend({ label, display, disabled, onClick }) {
9585
- return /* @__PURE__ */ jsx96("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ jsx96(SendIcon, {}) });
9921
+ return /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ jsx99(SendIcon, {}) });
9586
9922
  }
9587
9923
  var BIG_COMBO = { total: 50, legs: 6 };
9588
9924
  function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
@@ -9591,15 +9927,15 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
9591
9927
  const totals = comboTotals(grid);
9592
9928
  const legChoices = comboLegChoices(grid);
9593
9929
  const count = FIXED_SINGLES_COUNT;
9594
- const [maxPrice, setMaxPrice] = useState45(() => startSingles(grid.singles, limits, START.maxPrice, count));
9595
- const [minPrice, setMinPrice] = useState45(() => startSingles(grid.singlesFrom, floors, START.minPrice, count));
9596
- const [start] = useState45(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
9597
- const [total, setTotal] = useState45(start.total);
9598
- const [legs, setLegs] = useState45(start.legs);
9599
- const [bigStart] = useState45(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
9600
- const [bigTotal, setBigTotal] = useState45(bigStart.total);
9601
- const [bigLegs, setBigLegs] = useState45(bigStart.legs);
9602
- const [announcement, setAnnouncement] = useState45("");
9930
+ const [maxPrice, setMaxPrice] = useState48(() => startSingles(grid.singles, limits, START.maxPrice, count));
9931
+ const [minPrice, setMinPrice] = useState48(() => startSingles(grid.singlesFrom, floors, START.minPrice, count));
9932
+ const [start] = useState48(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
9933
+ const [total, setTotal] = useState48(start.total);
9934
+ const [legs, setLegs] = useState48(start.legs);
9935
+ const [bigStart] = useState48(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
9936
+ const [bigTotal, setBigTotal] = useState48(bigStart.total);
9937
+ const [bigLegs, setBigLegs] = useState48(bigStart.legs);
9938
+ const [announcement, setAnnouncement] = useState48("");
9603
9939
  const maxCell = findSingles(grid.singles, maxPrice, count);
9604
9940
  const minCell = findSingles(grid.singlesFrom, minPrice, count);
9605
9941
  const comboCell = findCombo(grid, total, legs);
@@ -9643,95 +9979,95 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
9643
9979
  const totalChoices = totals.map((v) => ({ value: v, text: v.toFixed(1), available: legChoices.some((n) => !!findCombo(grid, v, n)) }));
9644
9980
  const legChoicesFor = (t) => legChoices.map((n) => ({ value: n, text: String(n), available: !!findCombo(grid, t, n) }));
9645
9981
  const markets = grid.markets ?? [];
9646
- const [marketIdx, setMarketIdx] = useState45(0);
9982
+ const [marketIdx, setMarketIdx] = useState48(0);
9647
9983
  const marketCell = markets[marketIdx] ?? null;
9648
9984
  const marketLabels = markets.map((c) => strings.marketShort(c.marketDeveloperName, c.marketLabel, c.selectionLabel ?? null));
9649
9985
  const singlesReady = (cell) => cell ? strings.readyCount(cell.picks.length) : strings.unavailable;
9650
9986
  const comboReady = (cell) => cell ? strings.readyAt(cell.combo.total) : strings.unavailable;
9651
- return /* @__PURE__ */ jsxs81(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
9652
- /* @__PURE__ */ jsx96(
9987
+ return /* @__PURE__ */ jsxs85(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
9988
+ /* @__PURE__ */ jsx99(
9653
9989
  AskRow,
9654
9990
  {
9655
9991
  icon: "\u{1F3AF}",
9656
9992
  ask: fillTemplate(strings.maxPriceRow, {
9657
9993
  count: String(count),
9658
- price: /* @__PURE__ */ jsx96(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
9994
+ price: /* @__PURE__ */ jsx99(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
9659
9995
  }),
9660
9996
  ready: singlesReady(maxCell),
9661
- send: /* @__PURE__ */ jsx96(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
9997
+ send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
9662
9998
  if (maxCell) onSend(maxPriceAsk(maxCell, strings));
9663
9999
  } })
9664
10000
  }
9665
10001
  ),
9666
- /* @__PURE__ */ jsx96(
10002
+ /* @__PURE__ */ jsx99(
9667
10003
  AskRow,
9668
10004
  {
9669
10005
  icon: "\u{1F4C8}",
9670
10006
  ask: fillTemplate(strings.minPriceRow, {
9671
10007
  count: String(count),
9672
- price: /* @__PURE__ */ jsx96(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
10008
+ price: /* @__PURE__ */ jsx99(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
9673
10009
  }),
9674
10010
  ready: singlesReady(minCell),
9675
- send: /* @__PURE__ */ jsx96(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
10011
+ send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
9676
10012
  if (minCell) onSend(minPriceAsk(minCell, strings));
9677
10013
  } })
9678
10014
  }
9679
10015
  ),
9680
- /* @__PURE__ */ jsx96(
10016
+ /* @__PURE__ */ jsx99(
9681
10017
  AskRow,
9682
10018
  {
9683
10019
  icon: "\u2728",
9684
10020
  ask: fillTemplate(strings.comboRow, {
9685
- legs: /* @__PURE__ */ jsx96(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
9686
- total: /* @__PURE__ */ jsx96(NumberSelect, { current: total.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseTotal })
10021
+ legs: /* @__PURE__ */ jsx99(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
10022
+ total: /* @__PURE__ */ jsx99(NumberSelect, { current: total.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseTotal })
9687
10023
  }),
9688
10024
  ready: comboReady(comboCell),
9689
- send: /* @__PURE__ */ jsx96(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
10025
+ send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
9690
10026
  if (comboCell) onSend(comboAsk(comboCell, strings));
9691
10027
  } })
9692
10028
  }
9693
10029
  ),
9694
- /* @__PURE__ */ jsx96(
10030
+ /* @__PURE__ */ jsx99(
9695
10031
  AskRow,
9696
10032
  {
9697
10033
  icon: "\u{1F3C6}",
9698
10034
  ask: fillTemplate(strings.bigComboRow, {
9699
- legs: /* @__PURE__ */ jsx96(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
9700
- total: /* @__PURE__ */ jsx96(NumberSelect, { current: bigTotal.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseBigTotal })
10035
+ legs: /* @__PURE__ */ jsx99(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
10036
+ total: /* @__PURE__ */ jsx99(NumberSelect, { current: bigTotal.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseBigTotal })
9701
10037
  }),
9702
10038
  ready: comboReady(bigCell),
9703
- send: /* @__PURE__ */ jsx96(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
10039
+ send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
9704
10040
  if (bigCell) onSend(comboAsk(bigCell, strings));
9705
10041
  } })
9706
10042
  }
9707
10043
  ),
9708
- markets.length > 0 && /* @__PURE__ */ jsx96(
10044
+ markets.length > 0 && /* @__PURE__ */ jsx99(
9709
10045
  AskRow,
9710
10046
  {
9711
10047
  icon: "\u26BD",
9712
10048
  ask: fillTemplate(strings.marketRow, {
9713
- market: /* @__PURE__ */ jsx96(ChoiceSelect, { currentIdx: marketIdx, sizeLabels: marketLabels, optionLabels: marketLabels, label: strings.marketName, onChoose: chooseMarket })
10049
+ market: /* @__PURE__ */ jsx99(ChoiceSelect, { currentIdx: marketIdx, sizeLabels: marketLabels, optionLabels: marketLabels, label: strings.marketName, onChoose: chooseMarket })
9714
10050
  }),
9715
10051
  ready: marketCell ? strings.readyCount(marketCell.count) : null,
9716
- send: /* @__PURE__ */ jsx96(RoundSend, { label: strings.send, display: marketCell ? marketDisplay(marketCell, strings) : "", disabled: !marketCell || streaming, onClick: () => {
10052
+ send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: marketCell ? marketDisplay(marketCell, strings) : "", disabled: !marketCell || streaming, onClick: () => {
9717
10053
  if (marketCell) onSend(marketAsk(marketCell, strings));
9718
10054
  } })
9719
10055
  }
9720
10056
  ),
9721
- /* @__PURE__ */ jsx96("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
10057
+ /* @__PURE__ */ jsx99("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
9722
10058
  ] });
9723
10059
  }
9724
10060
  function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal, initialLegs, onSend, onClose }) {
9725
10061
  const totals = comboTotals(grid);
9726
10062
  const legChoices = comboLegChoices(grid);
9727
- const [start] = useState45(() => initialTotal === void 0 ? startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs) : null);
9728
- const [total, setTotal] = useState45(() => initialTotal !== void 0 ? nearest(totals, initialTotal) : start.total);
9729
- const [legs, setLegs] = useState45(() => {
10063
+ const [start] = useState48(() => initialTotal === void 0 ? startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs) : null);
10064
+ const [total, setTotal] = useState48(() => initialTotal !== void 0 ? nearest(totals, initialTotal) : start.total);
10065
+ const [legs, setLegs] = useState48(() => {
9730
10066
  if (initialTotal === void 0) return initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : start.legs;
9731
10067
  const from = initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : startValue(legChoices, START.comboLegs);
9732
10068
  return legsForTotal(grid, nearest(totals, initialTotal), from);
9733
10069
  });
9734
- const [announcement, setAnnouncement] = useState45("");
10070
+ const [announcement, setAnnouncement] = useState48("");
9735
10071
  const cell = findCombo(grid, total, legs);
9736
10072
  const minLegs = legChoices[0] ?? legs;
9737
10073
  const maxLegs = legChoices[legChoices.length - 1] ?? legs;
@@ -9742,29 +10078,29 @@ function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal,
9742
10078
  const d = strings.comboDisplay(nextLegs, nextTotal);
9743
10079
  setAnnouncement(findCombo(grid, nextTotal, nextLegs) ? d : `${d}. ${strings.unavailable}`);
9744
10080
  };
9745
- const footer = /* @__PURE__ */ jsx96(SendButton, { label: strings.send, display, disabled: !cell || streaming, onClick: () => {
10081
+ const footer = /* @__PURE__ */ jsx99(SendButton, { label: strings.send, display, disabled: !cell || streaming, onClick: () => {
9746
10082
  if (cell) onSend(comboAsk(cell, strings));
9747
10083
  } });
9748
- return /* @__PURE__ */ jsxs81(PresetToolModal, { title: strings.buildCombo, closeLabel: strings.close, onClose, footer, children: [
9749
- /* @__PURE__ */ jsxs81("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.totalLabel, children: [
9750
- /* @__PURE__ */ jsx96("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.totalLabel }),
9751
- /* @__PURE__ */ jsx96("div", { className: "ss-w-tool-chips", children: totals.map((t) => /* @__PURE__ */ jsx96("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)) })
10084
+ return /* @__PURE__ */ jsxs85(PresetToolModal, { title: strings.buildCombo, closeLabel: strings.close, onClose, footer, children: [
10085
+ /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.totalLabel, children: [
10086
+ /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.totalLabel }),
10087
+ /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-chips", children: totals.map((t) => /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-chip", "aria-pressed": samePrice(t, total), onClick: () => choose(t, samePrice(t, total) ? legs : legsForTotal(grid, t, legs)), children: t.toFixed(1) }, t)) })
9752
10088
  ] }),
9753
- /* @__PURE__ */ jsxs81("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.matchesLabel, children: [
9754
- /* @__PURE__ */ jsx96("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.matchesLabel }),
9755
- /* @__PURE__ */ jsxs81("div", { className: "ss-w-tool-stepper", children: [
9756
- /* @__PURE__ */ jsx96("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.fewerMatches, disabled: legs <= minLegs, onClick: () => choose(total, legs - 1), children: "\u2212" }),
9757
- /* @__PURE__ */ jsx96("span", { className: "ss-w-tool-count", children: legs }),
9758
- /* @__PURE__ */ jsx96("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.moreMatches, disabled: legs >= maxLegs, onClick: () => choose(total, legs + 1), children: "+" })
10089
+ /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.matchesLabel, children: [
10090
+ /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.matchesLabel }),
10091
+ /* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-stepper", children: [
10092
+ /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.fewerMatches, disabled: legs <= minLegs, onClick: () => choose(total, legs - 1), children: "\u2212" }),
10093
+ /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-count", children: legs }),
10094
+ /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.moreMatches, disabled: legs >= maxLegs, onClick: () => choose(total, legs + 1), children: "+" })
9759
10095
  ] })
9760
10096
  ] }),
9761
- cell ? /* @__PURE__ */ jsx96(ComboPreview, { cell, formatKickoff }) : /* @__PURE__ */ jsx96(Unavailable, { text: strings.unavailable }),
9762
- /* @__PURE__ */ jsx96("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
10097
+ cell ? /* @__PURE__ */ jsx99(ComboPreview, { cell, formatKickoff }) : /* @__PURE__ */ jsx99(Unavailable, { text: strings.unavailable }),
10098
+ /* @__PURE__ */ jsx99("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
9763
10099
  ] });
9764
10100
  }
9765
10101
 
9766
10102
  // src/usePresetDial.ts
9767
- import { useCallback as useCallback16, useEffect as useEffect27, useRef as useRef23, useState as useState46 } from "react";
10103
+ import { useCallback as useCallback19, useEffect as useEffect30, useRef as useRef26, useState as useState49 } from "react";
9768
10104
  function sendInFlight(messages, isStreaming) {
9769
10105
  const last = messages[messages.length - 1];
9770
10106
  return isStreaming && !!last && last.role === "assistant" && !last.done && !last.isGreeting;
@@ -9778,25 +10114,25 @@ function lastUserId(messages) {
9778
10114
  }
9779
10115
  var SCROLL_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "PageUp", "PageDown", "Home", "End", " "]);
9780
10116
  function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming, activeTab }) {
9781
- const [expanded, setExpanded] = useState46(() => !sendInFlight(messages, isStreaming));
9782
- const fold = useCallback16(() => setExpanded(false), []);
9783
- const toggle = useCallback16(() => setExpanded((e) => !e), []);
10117
+ const [expanded, setExpanded] = useState49(() => !sendInFlight(messages, isStreaming));
10118
+ const fold = useCallback19(() => setExpanded(false), []);
10119
+ const toggle = useCallback19(() => setExpanded((e) => !e), []);
9784
10120
  const currentUserId = lastUserId(messages);
9785
- const userIdRef = useRef23(currentUserId);
9786
- useEffect27(() => {
10121
+ const userIdRef = useRef26(currentUserId);
10122
+ useEffect30(() => {
9787
10123
  if (currentUserId === userIdRef.current) return;
9788
10124
  userIdRef.current = currentUserId;
9789
10125
  setExpanded(false);
9790
10126
  }, [currentUserId]);
9791
- const tabRef = useRef23(activeTab);
9792
- useEffect27(() => {
10127
+ const tabRef = useRef26(activeTab);
10128
+ useEffect30(() => {
9793
10129
  if (activeTab === tabRef.current) return;
9794
10130
  tabRef.current = activeTab;
9795
10131
  setExpanded(false);
9796
10132
  }, [activeTab]);
9797
- const expandedRef = useRef23(expanded);
10133
+ const expandedRef = useRef26(expanded);
9798
10134
  expandedRef.current = expanded;
9799
- useEffect27(() => {
10135
+ useEffect30(() => {
9800
10136
  const onEscape = (e) => {
9801
10137
  const dial = dialRef.current;
9802
10138
  if (e.key !== "Escape" || !dial || !e.composedPath().includes(dial)) return;
@@ -9809,7 +10145,7 @@ function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming
9809
10145
  window.addEventListener("keydown", onEscape, true);
9810
10146
  return () => window.removeEventListener("keydown", onEscape, true);
9811
10147
  }, [dialRef, dialButtonRef]);
9812
- useEffect27(() => {
10148
+ useEffect30(() => {
9813
10149
  if (!expanded) return;
9814
10150
  const layer = layerRef.current;
9815
10151
  const inDial = (e) => {
@@ -9861,11 +10197,11 @@ function markToolSeen() {
9861
10197
  }
9862
10198
 
9863
10199
  // src/components/ChatPanel.tsx
9864
- import { Fragment as Fragment23, jsx as jsx97, jsxs as jsxs82 } from "react/jsx-runtime";
10200
+ import { Fragment as Fragment23, jsx as jsx100, jsxs as jsxs86 } from "react/jsx-runtime";
9865
10201
  var FULLSCREEN_QUERY = "(max-width: 639px)";
9866
10202
  function useIsModal() {
9867
- const [modal, setModal] = useState47(false);
9868
- useEffect28(() => {
10203
+ const [modal, setModal] = useState50(false);
10204
+ useEffect31(() => {
9869
10205
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
9870
10206
  const mql = window.matchMedia(FULLSCREEN_QUERY);
9871
10207
  const sync = () => setModal(mql.matches);
@@ -9876,10 +10212,10 @@ function useIsModal() {
9876
10212
  return modal;
9877
10213
  }
9878
10214
  var HIDDEN_LAYER_STYLE = { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" };
9879
- function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, loggedIn, conversation, presetGrid }) {
10215
+ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, clubFixturesResult, clubStandingsResult, clubSquadResult, loggedIn, conversation, presetGrid }) {
9880
10216
  const { state, close, stop, send, reset } = controller;
9881
10217
  const isModal = useIsModal();
9882
- useEffect28(() => {
10218
+ useEffect31(() => {
9883
10219
  const onKey = (e) => {
9884
10220
  if (e.key === "Escape") close();
9885
10221
  };
@@ -9895,19 +10231,19 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
9895
10231
  monitor?.setActiveTab("chat");
9896
10232
  send(text, { grounding });
9897
10233
  };
9898
- useEffect28(() => {
10234
+ useEffect31(() => {
9899
10235
  if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
9900
10236
  }, [monitor, state.isStreaming, state.messages.length]);
9901
10237
  const onChatTab = !monitor || monitor.activeTab === "chat";
9902
- const layerRef = useRef24(null);
9903
- const dialRef = useRef24(null);
9904
- const dialButtonRef = useRef24(null);
9905
- const inputRef = useRef24(null);
9906
- const limitRef = useRef24(null);
9907
- const typedSendRef = useRef24(false);
9908
- const focusAfterCloseRef = useRef24(null);
9909
- const [tool, setTool] = useState47(null);
9910
- const [toolSeen, setToolSeen] = useState47(readToolSeen);
10238
+ const layerRef = useRef27(null);
10239
+ const dialRef = useRef27(null);
10240
+ const dialButtonRef = useRef27(null);
10241
+ const inputRef = useRef27(null);
10242
+ const limitRef = useRef27(null);
10243
+ const typedSendRef = useRef27(false);
10244
+ const focusAfterCloseRef = useRef27(null);
10245
+ const [tool, setTool] = useState50(null);
10246
+ const [toolSeen, setToolSeen] = useState50(readToolSeen);
9911
10247
  const dial = usePresetDial({
9912
10248
  layerRef,
9913
10249
  dialRef,
@@ -9919,53 +10255,53 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
9919
10255
  const { fold } = dial;
9920
10256
  const paused = isPaused(state.limit);
9921
10257
  const showDial = !!presetGrid && onChatTab && !tool && !paused;
9922
- useEffect28(() => {
10258
+ useEffect31(() => {
9923
10259
  if (paused) setTool(null);
9924
10260
  }, [paused]);
9925
- useEffect28(() => {
10261
+ useEffect31(() => {
9926
10262
  if (!paused) return;
9927
10263
  if (typedSendRef.current) limitRef.current?.focus();
9928
10264
  typedSendRef.current = false;
9929
10265
  }, [paused]);
9930
- const openTool = useCallback17((next) => {
10266
+ const openTool = useCallback20((next) => {
9931
10267
  fold();
9932
10268
  markToolSeen();
9933
10269
  setToolSeen(true);
9934
10270
  setTool(next);
9935
10271
  }, [fold]);
9936
- const onPill = useCallback17((kind) => openTool(kind === "numbers" ? { kind: "numbers" } : { kind: "combo" }), [openTool]);
10272
+ const onPill = useCallback20((kind) => openTool(kind === "numbers" ? { kind: "numbers" } : { kind: "combo" }), [openTool]);
9937
10273
  const toolsValue = useMemo5(
9938
10274
  () => presetGrid && !paused ? { openBuilder: (total, legs) => openTool({ kind: "combo", total, legs }), changeLabel: ui.presets.changeCombo } : null,
9939
10275
  [presetGrid, paused, openTool, ui.presets.changeCombo]
9940
10276
  );
9941
- const closeTool = useCallback17(() => {
10277
+ const closeTool = useCallback20(() => {
9942
10278
  focusAfterCloseRef.current = "dial";
9943
10279
  setTool(null);
9944
10280
  }, []);
9945
- const sendAsk = useCallback17((ask) => {
10281
+ const sendAsk = useCallback20((ask) => {
9946
10282
  focusAfterCloseRef.current = "composer";
9947
10283
  setTool(null);
9948
10284
  monitor?.setActiveTab("chat");
9949
10285
  send(ask.message, { displayText: ask.displayText, preset: ask.preset });
9950
10286
  }, [monitor, send]);
9951
- const formatKickoff = useCallback17((kickoffUtc) => {
10287
+ const formatKickoff = useCallback20((kickoffUtc) => {
9952
10288
  const k = ui.bettingKickoff(kickoffUtc);
9953
10289
  return `${k.dayLabel} ${k.time}`;
9954
10290
  }, [ui]);
9955
- useEffect28(() => {
10291
+ useEffect31(() => {
9956
10292
  if (tool) return;
9957
10293
  const target = focusAfterCloseRef.current;
9958
10294
  focusAfterCloseRef.current = null;
9959
10295
  if (target === "dial") dialButtonRef.current?.focus();
9960
10296
  else if (target === "composer") inputRef.current?.focus();
9961
10297
  }, [tool]);
9962
- useEffect28(() => {
10298
+ useEffect31(() => {
9963
10299
  if (!tool || onChatTab && presetGrid) return;
9964
10300
  focusAfterCloseRef.current = "composer";
9965
10301
  setTool(null);
9966
10302
  }, [tool, onChatTab, presetGrid]);
9967
- return /* @__PURE__ */ jsxs82("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
9968
- /* @__PURE__ */ jsx97(
10303
+ return /* @__PURE__ */ jsxs86("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
10304
+ /* @__PURE__ */ jsx100(
9969
10305
  ChatHeader,
9970
10306
  {
9971
10307
  onClose: close,
@@ -9978,7 +10314,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
9978
10314
  moreOptionsLabel: ui.moreOptions
9979
10315
  }
9980
10316
  ),
9981
- monitor && /* @__PURE__ */ jsx97(
10317
+ monitor && /* @__PURE__ */ jsx100(
9982
10318
  TabBar,
9983
10319
  {
9984
10320
  monitor,
@@ -9987,12 +10323,13 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
9987
10323
  oddsCount: monitor.pins.filter((p) => p.kind !== "match").length,
9988
10324
  todayCount: discovery?.liveCount ?? 0,
9989
10325
  hasToday: discovery ? visibleGroupsOf(discovery.groups, discovery.states).length > 0 : false,
9990
- gamesEnabled: gamesResult?.enabled ?? false
10326
+ gamesEnabled: gamesResult?.enabled ?? false,
10327
+ clubEnabled: clubFixturesResult?.enabled ?? false
9991
10328
  }
9992
10329
  ),
9993
- /* @__PURE__ */ jsxs82("div", { ref: layerRef, className: "ss-w-chat-layer", "data-dial": presetGrid ? "" : void 0, style: onChatTab ? void 0 : HIDDEN_LAYER_STYLE, children: [
9994
- /* @__PURE__ */ jsx97(PresetToolsContext.Provider, { value: toolsValue, children: /* @__PURE__ */ jsx97(MessageList, { controller, ui, slip, onDashboardTap, monitor }) }),
9995
- showDial ? /* @__PURE__ */ jsx97(
10330
+ /* @__PURE__ */ jsxs86("div", { ref: layerRef, className: "ss-w-chat-layer", "data-dial": presetGrid ? "" : void 0, style: onChatTab ? void 0 : HIDDEN_LAYER_STYLE, children: [
10331
+ /* @__PURE__ */ jsx100(PresetToolsContext.Provider, { value: toolsValue, children: /* @__PURE__ */ jsx100(MessageList, { controller, ui, slip, onDashboardTap, monitor }) }),
10332
+ showDial ? /* @__PURE__ */ jsx100(
9996
10333
  PresetSpeedDial,
9997
10334
  {
9998
10335
  expanded: dial.expanded,
@@ -10004,12 +10341,15 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10004
10341
  buttonRef: dialButtonRef
10005
10342
  }
10006
10343
  ) : null,
10007
- tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */ jsx97(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ jsx97(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
10344
+ tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */ jsx100(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ jsx100(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
10008
10345
  ] }),
10009
- monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx97(TodayPanel, { discovery, ui, monitor }),
10010
- monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx97(MatchesPanel, { monitor, ui, slip, onAsk: paused ? void 0 : handleAsk }),
10011
- monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx97(OddsPanel, { monitor, ui, slip }),
10012
- monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx97(
10346
+ monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx100(TodayPanel, { discovery, ui, monitor }),
10347
+ monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx100(MatchesPanel, { monitor, ui, slip, onAsk: paused ? void 0 : handleAsk }),
10348
+ monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx100(OddsPanel, { monitor, ui, slip }),
10349
+ monitor && monitor.activeTab === "fixtures" && /* @__PURE__ */ jsx100(Fixtures, { fixtures: clubFixturesResult?.fixtures ?? [], loading: clubFixturesResult?.loading ?? false, ui }),
10350
+ monitor && monitor.activeTab === "standings" && /* @__PURE__ */ jsx100(Standings, { standings: clubStandingsResult?.data ?? null, loading: clubStandingsResult?.loading ?? false, ui }),
10351
+ monitor && monitor.activeTab === "squad" && /* @__PURE__ */ jsx100(Squad, { squad: clubSquadResult?.data ?? null, loading: clubSquadResult?.loading ?? false, ui }),
10352
+ monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx100(
10013
10353
  GamesPanel,
10014
10354
  {
10015
10355
  loggedIn: !!loggedIn,
@@ -10017,25 +10357,16 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10017
10357
  ui,
10018
10358
  conversation,
10019
10359
  leaderboard: leaderboardResult?.data ?? null,
10360
+ leaderboardLoading: leaderboardResult?.loading ?? false,
10020
10361
  refreshHub: () => {
10021
10362
  gamesResult.refresh();
10022
10363
  leaderboardResult?.refresh();
10023
10364
  }
10024
10365
  }
10025
10366
  ),
10026
- monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */ jsx97(
10027
- LeaderboardPanel,
10028
- {
10029
- loggedIn: !!loggedIn,
10030
- data: leaderboardResult.data,
10031
- loading: leaderboardResult.loading,
10032
- onPlay: () => monitor.setActiveTab("games"),
10033
- ui
10034
- }
10035
- ),
10036
- (!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */ jsxs82(Fragment23, { children: [
10037
- /* @__PURE__ */ jsx97("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
10038
- paused ? null : /* @__PURE__ */ jsx97(
10367
+ (!monitor || monitor.activeTab !== "games") && /* @__PURE__ */ jsxs86(Fragment23, { children: [
10368
+ /* @__PURE__ */ jsx100("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
10369
+ paused ? null : /* @__PURE__ */ jsx100(
10039
10370
  ChatInput,
10040
10371
  {
10041
10372
  ref: inputRef,
@@ -10054,9 +10385,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10054
10385
  }
10055
10386
 
10056
10387
  // src/components/HostEventsProvider.tsx
10057
- import { jsx as jsx98 } from "react/jsx-runtime";
10388
+ import { jsx as jsx101 } from "react/jsx-runtime";
10058
10389
  function HostEventsProvider({ value, children }) {
10059
- return /* @__PURE__ */ jsx98(SlipStateContext.Provider, { value: value.slipState, children });
10390
+ return /* @__PURE__ */ jsx101(SlipStateContext.Provider, { value: value.slipState, children });
10060
10391
  }
10061
10392
 
10062
10393
  // src/styles/css.generated.ts
@@ -11212,6 +11543,11 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
11212
11543
  .ss-w-mk-ctx-right { display: flex; align-items: center; gap: 6px; margin-left: auto; flex: none; }
11213
11544
  /* flex:1 keeps the composer pinned to the panel bottom when a tab is empty */
11214
11545
  .ss-w-mon-empty { flex: 1; padding: 24px 16px; text-align: center; font-size: 12.5px; color: var(--ss-w-faint); }
11546
+ /* shared group-header label for Club Fixtures (round) and Squad (position) list groups */
11547
+ .ss-w-club-eyebrow { font-size: 10px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--ss-w-faint); padding: 10px 2px 4px; }
11548
+ .ss-w-sq-row { display: flex; align-items: center; gap: 10px; padding: 7px 2px; border-bottom: 1px solid var(--ss-w-line); }
11549
+ .ss-w-sq-num { flex: none; width: 20px; text-align: right; font-size: 12px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--ss-w-faint); }
11550
+ .ss-w-sq-name { font-size: 13px; font-weight: 600; color: var(--ss-w-ink); }
11215
11551
  /* Per-pin unavailable state: the pin's context line still rendered above (score, name, unpin), but
11216
11552
  the pin has neither a card nor history (compose-time rescue failed) -- a small inline note beats
11217
11553
  a bare context line with nothing under it. */
@@ -11815,7 +12151,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
11815
12151
  `;
11816
12152
 
11817
12153
  // src/StatsWidget.tsx
11818
- import { jsx as jsx99 } from "react/jsx-runtime";
12154
+ import { jsx as jsx102 } from "react/jsx-runtime";
11819
12155
  function buildClient(props) {
11820
12156
  try {
11821
12157
  if ("client" in props && props.client) {
@@ -11849,14 +12185,14 @@ function StatsWidget(props) {
11849
12185
  [built?.client]
11850
12186
  );
11851
12187
  const ui = useMemo6(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
11852
- const rootRef = useRef25(null);
11853
- const introDoneRef = useRef25(false);
11854
- const markIntroDone = useCallback18(() => {
12188
+ const rootRef = useRef28(null);
12189
+ const introDoneRef = useRef28(false);
12190
+ const markIntroDone = useCallback21(() => {
11855
12191
  introDoneRef.current = true;
11856
12192
  }, []);
11857
12193
  const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
11858
12194
  const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
11859
- const [hasToday, setHasToday] = useState48(false);
12195
+ const [hasToday, setHasToday] = useState51(false);
11860
12196
  const liveCardWatches = useMemo6(() => {
11861
12197
  const seen = /* @__PURE__ */ new Set();
11862
12198
  const out = [];
@@ -11871,25 +12207,27 @@ function StatsWidget(props) {
11871
12207
  return out;
11872
12208
  }, [controller.state.messages]);
11873
12209
  const locale = cfg?.locale;
12210
+ const clubFixturesResult = useClubFixtures(built?.conversation ?? null);
11874
12211
  const monitor = useLiveMonitor({
11875
12212
  getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins, locale) : Promise.resolve(null),
11876
12213
  getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
11877
12214
  storageKey: `ss-w-pins:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`,
11878
12215
  isOpen: controller.state.isOpen,
11879
12216
  hasToday,
11880
- watches: liveCardWatches
12217
+ watches: liveCardWatches,
12218
+ clubEnabled: clubFixturesResult.enabled
11881
12219
  });
11882
12220
  const operatorUserId = cfg?.userContext?.operatorUserId;
11883
12221
  const anonymousUserId = cfg?.userContext?.anonymousUserId;
11884
- const getSchedule = useCallback18(
12222
+ const getSchedule = useCallback21(
11885
12223
  (localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes, operatorUserId, anonymousUserId) : Promise.resolve(null),
11886
12224
  [built, operatorUserId, anonymousUserId]
11887
12225
  );
11888
- const postLeagueStar = useCallback18(
12226
+ const postLeagueStar = useCallback21(
11889
12227
  (competitionId, starred) => built ? built.conversation.starLeague(competitionId, starred, operatorUserId, anonymousUserId) : Promise.resolve(null),
11890
12228
  [built, operatorUserId, anonymousUserId]
11891
12229
  );
11892
- const getStates = useCallback18(
12230
+ const getStates = useCallback21(
11893
12231
  (matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
11894
12232
  [built]
11895
12233
  );
@@ -11908,11 +12246,11 @@ function StatsWidget(props) {
11908
12246
  pinnedMatchIds
11909
12247
  });
11910
12248
  const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
11911
- useEffect29(() => {
12249
+ useEffect32(() => {
11912
12250
  setHasToday(todayHasContent);
11913
12251
  }, [todayHasContent]);
11914
- const prevLiveSnapshotRef = useRef25(monitor.snapshot);
11915
- useEffect29(() => {
12252
+ const prevLiveSnapshotRef = useRef28(monitor.snapshot);
12253
+ useEffect32(() => {
11916
12254
  const snap = monitor.snapshot;
11917
12255
  if (!snap || snap === prevLiveSnapshotRef.current) return;
11918
12256
  prevLiveSnapshotRef.current = snap;
@@ -11948,14 +12286,16 @@ function StatsWidget(props) {
11948
12286
  }, [monitor.snapshot]);
11949
12287
  const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
11950
12288
  const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
11951
- const getPricePresets = useCallback18(
12289
+ const clubStandingsResult = useClubStandings(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
12290
+ const clubSquadResult = useClubSquad(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
12291
+ const getPricePresets = useCallback21(
11952
12292
  (locale2) => built ? built.conversation.getPricePresets(locale2, { pool: "open" }) : Promise.resolve(null),
11953
12293
  [built]
11954
12294
  );
11955
12295
  const presetGrid = usePresetGrid({ getPricePresets, isOpen: controller.state.isOpen, locale: ui.presets.lang });
11956
12296
  const markTodayActivity = monitor.markTodayActivity;
11957
- const prevLiveCountRef = useRef25(0);
11958
- useEffect29(() => {
12297
+ const prevLiveCountRef = useRef28(0);
12298
+ useEffect32(() => {
11959
12299
  const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
11960
12300
  prevLiveCountRef.current = discovery.liveCount;
11961
12301
  if (rose) markTodayActivity();
@@ -12005,11 +12345,11 @@ function StatsWidget(props) {
12005
12345
  })
12006
12346
  }));
12007
12347
  const conversationId = controller.state.conversationId ?? void 0;
12008
- useEffect29(() => {
12348
+ useEffect32(() => {
12009
12349
  if (!logger) return;
12010
12350
  logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
12011
12351
  }, [logger, operatorUserId, anonymousUserId, conversationId]);
12012
- useEffect29(() => {
12352
+ useEffect32(() => {
12013
12353
  if (!logger) return;
12014
12354
  logger.resume();
12015
12355
  const onHide = () => {
@@ -12027,14 +12367,14 @@ function StatsWidget(props) {
12027
12367
  logger.dispose();
12028
12368
  };
12029
12369
  }, [logger]);
12030
- useEffect29(() => {
12370
+ useEffect32(() => {
12031
12371
  if (!built || !ui.injectStyles) return;
12032
12372
  const node = rootRef.current?.getRootNode();
12033
12373
  if (node) injectStyles(node);
12034
12374
  }, [built, ui.injectStyles]);
12035
12375
  if (!built) return null;
12036
12376
  const attrs = themeAttrs(ui);
12037
- return /* @__PURE__ */ jsx99(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx99(HostEventsProvider, { value: hostEvents, children: /* @__PURE__ */ jsx99("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__ */ jsx99(
12377
+ return /* @__PURE__ */ jsx102(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx102(HostEventsProvider, { value: hostEvents, children: /* @__PURE__ */ jsx102("div", { ref: rootRef, className: "ss-w-root", "data-ss-w-theme": attrs["data-ss-w-theme"], "data-ss-w-pos": attrs["data-ss-w-pos"], style: attrs.style, children: controller.state.isOpen ? /* @__PURE__ */ jsx102(
12038
12378
  ChatPanel,
12039
12379
  {
12040
12380
  controller,
@@ -12045,11 +12385,14 @@ function StatsWidget(props) {
12045
12385
  discovery,
12046
12386
  gamesResult,
12047
12387
  leaderboardResult,
12388
+ clubFixturesResult,
12389
+ clubStandingsResult,
12390
+ clubSquadResult,
12048
12391
  loggedIn: !!operatorUserId,
12049
12392
  conversation: built?.conversation ?? null,
12050
12393
  presetGrid
12051
12394
  }
12052
- ) : /* @__PURE__ */ jsx99(
12395
+ ) : /* @__PURE__ */ jsx102(
12053
12396
  ChatFab,
12054
12397
  {
12055
12398
  label: ui.launcherLabel,