@sensiblestats/widget-react 0.82.0 → 0.84.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -37,7 +37,7 @@ __export(index_exports, {
37
37
  module.exports = __toCommonJS(index_exports);
38
38
 
39
39
  // src/StatsWidget.tsx
40
- var import_react61 = require("react");
40
+ var import_react64 = require("react");
41
41
  var import_widget_sdk6 = require("@sensiblestats/widget-sdk");
42
42
 
43
43
  // src/kickoff.ts
@@ -151,6 +151,20 @@ var STRINGS = {
151
151
  accordionRetry: "Couldn't load odds \u2014 tap to retry",
152
152
  accordionSuspended: "Suspended",
153
153
  tabToday: "Today",
154
+ tabFixtures: "Fixtures",
155
+ tabStandings: "Standings",
156
+ tabSquad: "Squad",
157
+ clubFixturesEmpty: "No fixtures yet.",
158
+ clubStandingsEmpty: "Standings are not available yet.",
159
+ clubSquadEmpty: "Squad is not available yet.",
160
+ standingsColClub: "Club",
161
+ standingsColPlayed: "P",
162
+ standingsColWon: "W",
163
+ standingsColDrawn: "D",
164
+ standingsColLost: "L",
165
+ standingsColGoalDiff: "GD",
166
+ standingsColPoints: "Pts",
167
+ gamesPlaySegment: "Play",
154
168
  sectionLive: "Live",
155
169
  yourLeagues: "Your leagues",
156
170
  topLeagues: "Top leagues",
@@ -518,6 +532,20 @@ var STRINGS = {
518
532
  accordionRetry: "Oranlar y\xFCklenemedi \u2014 yeniden dene",
519
533
  accordionSuspended: "Ask\u0131da",
520
534
  tabToday: "Bug\xFCn",
535
+ tabFixtures: "Fikst\xFCr",
536
+ tabStandings: "Puan Durumu",
537
+ tabSquad: "Kadro",
538
+ clubFixturesEmpty: "Hen\xFCz fikst\xFCr yok.",
539
+ clubStandingsEmpty: "Puan durumu hen\xFCz mevcut de\u011Fil.",
540
+ clubSquadEmpty: "Kadro hen\xFCz mevcut de\u011Fil.",
541
+ standingsColClub: "Tak\u0131m",
542
+ standingsColPlayed: "O",
543
+ standingsColWon: "G",
544
+ standingsColDrawn: "B",
545
+ standingsColLost: "M",
546
+ standingsColGoalDiff: "AV",
547
+ standingsColPoints: "P",
548
+ gamesPlaySegment: "Oyna",
521
549
  sectionLive: "Canl\u0131",
522
550
  yourLeagues: "Liglerin",
523
551
  topLeagues: "\xD6ne \xE7\u0131kan ligler",
@@ -882,6 +910,20 @@ function normalizeUi(cfg) {
882
910
  tabFollowing: strings.tabFollowing,
883
911
  tabOdds: strings.tabOdds,
884
912
  tabToday: strings.tabToday,
913
+ tabFixtures: strings.tabFixtures,
914
+ tabStandings: strings.tabStandings,
915
+ tabSquad: strings.tabSquad,
916
+ clubFixturesEmpty: strings.clubFixturesEmpty,
917
+ clubStandingsEmpty: strings.clubStandingsEmpty,
918
+ clubSquadEmpty: strings.clubSquadEmpty,
919
+ standingsColClub: strings.standingsColClub,
920
+ standingsColPlayed: strings.standingsColPlayed,
921
+ standingsColWon: strings.standingsColWon,
922
+ standingsColDrawn: strings.standingsColDrawn,
923
+ standingsColLost: strings.standingsColLost,
924
+ standingsColGoalDiff: strings.standingsColGoalDiff,
925
+ standingsColPoints: strings.standingsColPoints,
926
+ gamesPlaySegment: strings.gamesPlaySegment,
885
927
  sectionLive: strings.sectionLive,
886
928
  yourLeagues: strings.yourLeagues,
887
929
  topLeagues: strings.topLeagues,
@@ -1173,6 +1215,7 @@ function toMarketOddsVM(card) {
1173
1215
  mainLine: str(card.mainLine),
1174
1216
  pinEnabled: card.pinEnabled === true,
1175
1217
  statText: card.insight && typeof card.insight === "object" ? str(card.insight.text) : void 0,
1218
+ statTexts: Array.isArray(card.insights) ? card.insights.map((i) => str(i?.text)).filter((t) => !!t) : void 0,
1176
1219
  tag: card.tag === "your_market" ? "your_market" : void 0,
1177
1220
  live: card.live ?? null,
1178
1221
  marketCount: typeof card.marketCount === "number" && Number.isFinite(card.marketCount) ? card.marketCount : void 0
@@ -2516,6 +2559,7 @@ function useLiveMonitor(opts) {
2516
2559
  const marketOddsRef = (0, import_react5.useRef)(marketOdds);
2517
2560
  marketOddsRef.current = marketOdds;
2518
2561
  const hasToday = opts.hasToday ?? false;
2562
+ const clubEnabled = opts.clubEnabled ?? false;
2519
2563
  const marketKey = (matchId, dev) => `${matchId}:${dev}`;
2520
2564
  const getMarketOddsRef = (0, import_react5.useRef)(opts.getMarketOdds);
2521
2565
  getMarketOddsRef.current = opts.getMarketOdds;
@@ -2692,12 +2736,16 @@ function useLiveMonitor(opts) {
2692
2736
  if (wasEmpty && watchesLength > 0) void tick();
2693
2737
  }, [watchesLength, tick]);
2694
2738
  (0, import_react5.useEffect)(() => {
2739
+ if (clubEnabled && (activeTab === "today" || activeTab === "following" || activeTab === "odds")) {
2740
+ setActiveTabState("chat");
2741
+ return;
2742
+ }
2695
2743
  const matchPins = pins.filter((p) => p.kind === "match").length;
2696
2744
  const marketPins = pins.length - matchPins;
2697
2745
  if (activeTab === "following" && matchPins === 0) setActiveTabState(hasToday ? "today" : "chat");
2698
2746
  if (activeTab === "odds" && marketPins === 0) setActiveTabState(hasToday ? "today" : "chat");
2699
2747
  if (activeTab === "today" && !hasToday) setActiveTabState("chat");
2700
- }, [pins, activeTab, hasToday]);
2748
+ }, [pins, activeTab, hasToday, clubEnabled]);
2701
2749
  const prevIsOpenRef = (0, import_react5.useRef)(false);
2702
2750
  (0, import_react5.useEffect)(() => {
2703
2751
  const wasClosed = !prevIsOpenRef.current;
@@ -3062,7 +3110,7 @@ function useLeaderboard(conversation, { activeTab }) {
3062
3110
  const conversationRef = (0, import_react8.useRef)(conversation);
3063
3111
  conversationRef.current = conversation;
3064
3112
  (0, import_react8.useEffect)(() => {
3065
- if (activeTab !== "leaderboard" && activeTab !== "games") return;
3113
+ if (activeTab !== "games") return;
3066
3114
  let active = true;
3067
3115
  const doFetch = async () => {
3068
3116
  const conv = conversationRef.current;
@@ -3090,8 +3138,151 @@ function useLeaderboard(conversation, { activeTab }) {
3090
3138
  return { data, loading, refresh };
3091
3139
  }
3092
3140
 
3093
- // src/usePresetGrid.ts
3141
+ // src/useClubFixtures.ts
3094
3142
  var import_react9 = require("react");
3143
+ var CLUB_PROBE_RETRY_MS = 15e3;
3144
+ var CLUB_PROBE_MAX_ATTEMPTS = 3;
3145
+ function useClubFixtures(conversation) {
3146
+ const [enabled, setEnabled] = (0, import_react9.useState)(false);
3147
+ const [settled, setSettled] = (0, import_react9.useState)(false);
3148
+ const [fixtures, setFixtures] = (0, import_react9.useState)([]);
3149
+ const [loading, setLoading] = (0, import_react9.useState)(false);
3150
+ const [refreshCount, setRefreshCount] = (0, import_react9.useState)(0);
3151
+ const inFlightRef = (0, import_react9.useRef)(false);
3152
+ const hardOffRef = (0, import_react9.useRef)(false);
3153
+ const conversationRef = (0, import_react9.useRef)(conversation);
3154
+ conversationRef.current = conversation;
3155
+ const ready = conversation != null;
3156
+ (0, import_react9.useEffect)(() => {
3157
+ if (hardOffRef.current) return;
3158
+ let active = true;
3159
+ let retryTimeoutId;
3160
+ let attempts = 0;
3161
+ const doFetch = async () => {
3162
+ const conv = conversationRef.current;
3163
+ if (!conv || inFlightRef.current || !active) return;
3164
+ inFlightRef.current = true;
3165
+ setLoading(true);
3166
+ try {
3167
+ attempts += 1;
3168
+ const result = await conv.getClubFixtures();
3169
+ if (!active) return;
3170
+ if (result === null) {
3171
+ hardOffRef.current = true;
3172
+ setEnabled(false);
3173
+ setFixtures([]);
3174
+ } else {
3175
+ setFixtures(result.fixtures);
3176
+ setEnabled(true);
3177
+ }
3178
+ setSettled(true);
3179
+ } catch {
3180
+ if (!active) return;
3181
+ if (attempts < CLUB_PROBE_MAX_ATTEMPTS) {
3182
+ retryTimeoutId = window.setTimeout(() => {
3183
+ if (!hardOffRef.current) void doFetch();
3184
+ }, CLUB_PROBE_RETRY_MS);
3185
+ } else {
3186
+ setEnabled(false);
3187
+ setFixtures([]);
3188
+ setSettled(true);
3189
+ }
3190
+ } finally {
3191
+ inFlightRef.current = false;
3192
+ if (active) setLoading(false);
3193
+ }
3194
+ };
3195
+ void doFetch();
3196
+ return () => {
3197
+ active = false;
3198
+ inFlightRef.current = false;
3199
+ if (retryTimeoutId !== void 0) window.clearTimeout(retryTimeoutId);
3200
+ };
3201
+ }, [refreshCount, ready]);
3202
+ const refresh = (0, import_react9.useCallback)(() => setRefreshCount((c) => c + 1), []);
3203
+ return { enabled, settled, fixtures, loading, refresh };
3204
+ }
3205
+
3206
+ // src/useClubStandings.ts
3207
+ var import_react10 = require("react");
3208
+ function useClubStandings(conversation, { activeTab, enabled }) {
3209
+ const [data, setData] = (0, import_react10.useState)(null);
3210
+ const [loading, setLoading] = (0, import_react10.useState)(false);
3211
+ const [refreshCount, setRefreshCount] = (0, import_react10.useState)(0);
3212
+ const inFlightRef = (0, import_react10.useRef)(false);
3213
+ const conversationRef = (0, import_react10.useRef)(conversation);
3214
+ conversationRef.current = conversation;
3215
+ (0, import_react10.useEffect)(() => {
3216
+ if (activeTab !== "standings" || !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.getClubStandings();
3225
+ if (active) setData(result?.rows ?? 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 = (0, import_react10.useCallback)(() => {
3239
+ setRefreshCount((c) => c + 1);
3240
+ }, []);
3241
+ const effectiveLoading = loading || activeTab === "standings" && enabled && data === null;
3242
+ return { data, loading: effectiveLoading, refresh };
3243
+ }
3244
+
3245
+ // src/useClubSquad.ts
3246
+ var import_react11 = require("react");
3247
+ function useClubSquad(conversation, { activeTab, enabled }) {
3248
+ const [data, setData] = (0, import_react11.useState)(null);
3249
+ const [loading, setLoading] = (0, import_react11.useState)(false);
3250
+ const [refreshCount, setRefreshCount] = (0, import_react11.useState)(0);
3251
+ const inFlightRef = (0, import_react11.useRef)(false);
3252
+ const conversationRef = (0, import_react11.useRef)(conversation);
3253
+ conversationRef.current = conversation;
3254
+ (0, import_react11.useEffect)(() => {
3255
+ if (activeTab !== "squad" || !enabled) return;
3256
+ let active = true;
3257
+ const doFetch = async () => {
3258
+ const conv = conversationRef.current;
3259
+ if (!conv || inFlightRef.current) return;
3260
+ inFlightRef.current = true;
3261
+ setLoading(true);
3262
+ try {
3263
+ const result = await conv.getClubSquad();
3264
+ if (active) setData(result?.players ?? null);
3265
+ } catch {
3266
+ } finally {
3267
+ inFlightRef.current = false;
3268
+ if (active) setLoading(false);
3269
+ }
3270
+ };
3271
+ void doFetch();
3272
+ return () => {
3273
+ active = false;
3274
+ inFlightRef.current = false;
3275
+ };
3276
+ }, [activeTab, enabled, refreshCount]);
3277
+ const refresh = (0, import_react11.useCallback)(() => {
3278
+ setRefreshCount((c) => c + 1);
3279
+ }, []);
3280
+ const effectiveLoading = loading || activeTab === "squad" && enabled && data === null;
3281
+ return { data, loading: effectiveLoading, refresh };
3282
+ }
3283
+
3284
+ // src/usePresetGrid.ts
3285
+ var import_react12 = require("react");
3095
3286
 
3096
3287
  // src/presetGrid.ts
3097
3288
  var DEFAULT_SINGLES_LIMITS = [1.3, 1.5, 1.7, 2];
@@ -3234,22 +3425,22 @@ function marketDisplay(cell, s) {
3234
3425
  // src/usePresetGrid.ts
3235
3426
  var GRID_MAX_AGE_MS = 6e5;
3236
3427
  function usePresetGrid({ getPricePresets, isOpen, locale, now = Date.now }) {
3237
- const [grid, setGrid] = (0, import_react9.useState)(null);
3238
- const keptRef = (0, import_react9.useRef)(null);
3239
- const localeRef = (0, import_react9.useRef)(locale);
3240
- const inFlightRef = (0, import_react9.useRef)(false);
3241
- const mountedRef = (0, import_react9.useRef)(true);
3242
- const getRef = (0, import_react9.useRef)(getPricePresets);
3428
+ const [grid, setGrid] = (0, import_react12.useState)(null);
3429
+ const keptRef = (0, import_react12.useRef)(null);
3430
+ const localeRef = (0, import_react12.useRef)(locale);
3431
+ const inFlightRef = (0, import_react12.useRef)(false);
3432
+ const mountedRef = (0, import_react12.useRef)(true);
3433
+ const getRef = (0, import_react12.useRef)(getPricePresets);
3243
3434
  getRef.current = getPricePresets;
3244
- const nowRef = (0, import_react9.useRef)(now);
3435
+ const nowRef = (0, import_react12.useRef)(now);
3245
3436
  nowRef.current = now;
3246
- (0, import_react9.useEffect)(() => {
3437
+ (0, import_react12.useEffect)(() => {
3247
3438
  mountedRef.current = true;
3248
3439
  return () => {
3249
3440
  mountedRef.current = false;
3250
3441
  };
3251
3442
  }, []);
3252
- (0, import_react9.useEffect)(() => {
3443
+ (0, import_react12.useEffect)(() => {
3253
3444
  if (localeRef.current !== locale) {
3254
3445
  localeRef.current = locale;
3255
3446
  keptRef.current = null;
@@ -3292,18 +3483,18 @@ function visibleGroupsOf(groups, states) {
3292
3483
  }
3293
3484
 
3294
3485
  // src/eventLogContext.ts
3295
- var import_react10 = require("react");
3296
- var EventLogContext = (0, import_react10.createContext)(null);
3486
+ var import_react13 = require("react");
3487
+ var EventLogContext = (0, import_react13.createContext)(null);
3297
3488
  function useEventLog() {
3298
- return (0, import_react10.useContext)(EventLogContext);
3489
+ return (0, import_react13.useContext)(EventLogContext);
3299
3490
  }
3300
3491
 
3301
3492
  // src/popupTelemetry.ts
3302
- var import_react11 = require("react");
3493
+ var import_react14 = require("react");
3303
3494
  function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
3304
- const shownRef = (0, import_react11.useRef)(/* @__PURE__ */ new Set());
3305
- const closedTextRef = (0, import_react11.useRef)(null);
3306
- (0, import_react11.useEffect)(() => {
3495
+ const shownRef = (0, import_react14.useRef)(/* @__PURE__ */ new Set());
3496
+ const closedTextRef = (0, import_react14.useRef)(null);
3497
+ (0, import_react14.useEffect)(() => {
3307
3498
  if (isOpen) {
3308
3499
  if (closedTextRef.current) log?.log({ name: "popup_opened" });
3309
3500
  closedTextRef.current = null;
@@ -3315,17 +3506,17 @@ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
3315
3506
  log?.log({ name: "popup_shown" });
3316
3507
  }
3317
3508
  }, [log, isOpen, popupText]);
3318
- return (0, import_react11.useCallback)(() => {
3509
+ return (0, import_react14.useCallback)(() => {
3319
3510
  log?.log({ name: "popup_dismissed" });
3320
3511
  dismissPopup();
3321
3512
  }, [log, dismissPopup]);
3322
3513
  }
3323
3514
 
3324
3515
  // src/openTelemetry.ts
3325
- var import_react12 = require("react");
3516
+ var import_react15 = require("react");
3326
3517
  function useOpenTelemetry(log, isOpen) {
3327
- const openLoggedRef = (0, import_react12.useRef)(false);
3328
- (0, import_react12.useEffect)(() => {
3518
+ const openLoggedRef = (0, import_react15.useRef)(false);
3519
+ (0, import_react15.useEffect)(() => {
3329
3520
  if (!isOpen) {
3330
3521
  openLoggedRef.current = false;
3331
3522
  return;
@@ -3337,10 +3528,10 @@ function useOpenTelemetry(log, isOpen) {
3337
3528
  }
3338
3529
 
3339
3530
  // src/components/ChatFab.tsx
3340
- var import_react14 = require("react");
3531
+ var import_react17 = require("react");
3341
3532
 
3342
3533
  // src/components/BrandMark.tsx
3343
- var import_react13 = require("react");
3534
+ var import_react16 = require("react");
3344
3535
 
3345
3536
  // src/assets/logo.ts
3346
3537
  var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
@@ -3403,7 +3594,7 @@ function DashboardIcon({ name }) {
3403
3594
  // src/components/BrandMark.tsx
3404
3595
  var import_jsx_runtime2 = require("react/jsx-runtime");
3405
3596
  function BrandMark({ logoUrl, className }) {
3406
- const [failed, setFailed] = (0, import_react13.useState)(false);
3597
+ const [failed, setFailed] = (0, import_react16.useState)(false);
3407
3598
  if (!logoUrl || failed) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SsMark, { className });
3408
3599
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
3409
3600
  }
@@ -3439,9 +3630,9 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss", ask
3439
3630
  var import_jsx_runtime4 = require("react/jsx-runtime");
3440
3631
  function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart, asks }) {
3441
3632
  const bubble = popupText ?? greeting;
3442
- const [intro, setIntro] = (0, import_react14.useState)(false);
3443
- const armedRef = (0, import_react14.useRef)(introAllowed);
3444
- (0, import_react14.useEffect)(() => {
3633
+ const [intro, setIntro] = (0, import_react17.useState)(false);
3634
+ const armedRef = (0, import_react17.useRef)(introAllowed);
3635
+ (0, import_react17.useEffect)(() => {
3445
3636
  if (armedRef.current && bubble) {
3446
3637
  armedRef.current = false;
3447
3638
  setIntro(true);
@@ -3455,10 +3646,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
3455
3646
  }
3456
3647
 
3457
3648
  // src/components/ChatPanel.tsx
3458
- var import_react60 = require("react");
3649
+ var import_react63 = require("react");
3459
3650
 
3460
3651
  // src/components/ChatHeader.tsx
3461
- var import_react15 = require("react");
3652
+ var import_react18 = require("react");
3462
3653
  var import_jsx_runtime5 = require("react/jsx-runtime");
3463
3654
  function ChatHeader({
3464
3655
  onClose,
@@ -3470,15 +3661,15 @@ function ChatHeader({
3470
3661
  newConversationLabel = "New conversation",
3471
3662
  moreOptionsLabel = "More options"
3472
3663
  }) {
3473
- const [menuOpen, setMenuOpen] = (0, import_react15.useState)(false);
3474
- const wrapRef = (0, import_react15.useRef)(null);
3475
- const kebabRef = (0, import_react15.useRef)(null);
3476
- const firstItemRef = (0, import_react15.useRef)(null);
3664
+ const [menuOpen, setMenuOpen] = (0, import_react18.useState)(false);
3665
+ const wrapRef = (0, import_react18.useRef)(null);
3666
+ const kebabRef = (0, import_react18.useRef)(null);
3667
+ const firstItemRef = (0, import_react18.useRef)(null);
3477
3668
  const hasMenu = !!(canReset && onNewConversation);
3478
- (0, import_react15.useEffect)(() => {
3669
+ (0, import_react18.useEffect)(() => {
3479
3670
  if (menuOpen) firstItemRef.current?.focus();
3480
3671
  }, [menuOpen]);
3481
- (0, import_react15.useEffect)(() => {
3672
+ (0, import_react18.useEffect)(() => {
3482
3673
  if (!menuOpen) return;
3483
3674
  const onPointer = (e) => {
3484
3675
  if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
@@ -3534,7 +3725,7 @@ function ChatHeader({
3534
3725
  }
3535
3726
 
3536
3727
  // src/components/MessageList.tsx
3537
- var import_react35 = require("react");
3728
+ var import_react38 = require("react");
3538
3729
 
3539
3730
  // src/components/Markdown.tsx
3540
3731
  var import_react_markdown = __toESM(require("react-markdown"), 1);
@@ -3552,7 +3743,7 @@ function Markdown({ text }) {
3552
3743
  }
3553
3744
 
3554
3745
  // src/components/EntityCardList.tsx
3555
- var import_react16 = require("react");
3746
+ var import_react19 = require("react");
3556
3747
  var import_jsx_runtime7 = require("react/jsx-runtime");
3557
3748
  var MAX_VISIBLE = 3;
3558
3749
  var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
@@ -3636,7 +3827,7 @@ function ScopeTabs({ scopes, active, onSelect }) {
3636
3827
  )) });
3637
3828
  }
3638
3829
  function EntityCardItem({ c }) {
3639
- const [active, setActive] = (0, import_react16.useState)(0);
3830
+ const [active, setActive] = (0, import_react19.useState)(0);
3640
3831
  const hasBody = c.scopes.length > 0;
3641
3832
  if (!hasBody) {
3642
3833
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { c, showScopeCrest: false }) });
@@ -3650,7 +3841,7 @@ function EntityCardItem({ c }) {
3650
3841
  ] });
3651
3842
  }
3652
3843
  function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
3653
- const [expanded, setExpanded] = (0, import_react16.useState)(false);
3844
+ const [expanded, setExpanded] = (0, import_react19.useState)(false);
3654
3845
  if (cards.length === 0) return null;
3655
3846
  const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
3656
3847
  const overflow = cards.length - MAX_VISIBLE;
@@ -3661,17 +3852,17 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
3661
3852
  }
3662
3853
 
3663
3854
  // src/components/AddToSlipButton.tsx
3664
- var import_react20 = require("react");
3855
+ var import_react23 = require("react");
3665
3856
 
3666
3857
  // src/slipAdd.ts
3667
- var import_react18 = require("react");
3858
+ var import_react21 = require("react");
3668
3859
  var import_widget_sdk5 = require("@sensiblestats/widget-sdk");
3669
3860
 
3670
3861
  // src/slipStateContext.ts
3671
- var import_react17 = require("react");
3672
- var SlipStateContext = (0, import_react17.createContext)(null);
3862
+ var import_react20 = require("react");
3863
+ var SlipStateContext = (0, import_react20.createContext)(null);
3673
3864
  function useSlipState() {
3674
- return (0, import_react17.useContext)(SlipStateContext);
3865
+ return (0, import_react20.useContext)(SlipStateContext);
3675
3866
  }
3676
3867
 
3677
3868
  // src/slipAdd.ts
@@ -3686,7 +3877,7 @@ function useSlipAdd(slip, ui) {
3686
3877
  const slipState = useSlipState();
3687
3878
  const handler = slip.onAddToSlip;
3688
3879
  const rawLabels = !!ui?.rawBettingLabels;
3689
- return (0, import_react18.useCallback)(async (selection, { marketDeveloperName, selectionLabel, line }) => {
3880
+ return (0, import_react21.useCallback)(async (selection, { marketDeveloperName, selectionLabel, line }) => {
3690
3881
  if (!handler) return { kind: "failed" };
3691
3882
  const pick = slipPickFields(selection, rawLabels ? selectionLabel : void 0, line);
3692
3883
  if (marketDeveloperName !== void 0) {
@@ -3723,11 +3914,11 @@ function useSlipAdd(slip, ui) {
3723
3914
  }
3724
3915
 
3725
3916
  // src/components/Toast.tsx
3726
- var import_react19 = require("react");
3917
+ var import_react22 = require("react");
3727
3918
  var import_jsx_runtime8 = require("react/jsx-runtime");
3728
3919
  var DISMISS_MS = 4e3;
3729
3920
  function Toast({ toast, onDismiss }) {
3730
- (0, import_react19.useEffect)(() => {
3921
+ (0, import_react22.useEffect)(() => {
3731
3922
  if (!toast) return;
3732
3923
  const timer = setTimeout(onDismiss, DISMISS_MS);
3733
3924
  return () => clearTimeout(timer);
@@ -3739,10 +3930,10 @@ function Toast({ toast, onDismiss }) {
3739
3930
  // src/components/AddToSlipButton.tsx
3740
3931
  var import_jsx_runtime9 = require("react/jsx-runtime");
3741
3932
  function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui, price, ariaLabel }) {
3742
- const [pending, setPending] = (0, import_react20.useState)(false);
3743
- const [settledLocal, setSettledLocal] = (0, import_react20.useState)(false);
3744
- const [toast, setToast] = (0, import_react20.useState)(null);
3745
- const dismiss = (0, import_react20.useCallback)(() => setToast(null), []);
3933
+ const [pending, setPending] = (0, import_react23.useState)(false);
3934
+ const [settledLocal, setSettledLocal] = (0, import_react23.useState)(false);
3935
+ const [toast, setToast] = (0, import_react23.useState)(null);
3936
+ const dismiss = (0, import_react23.useCallback)(() => setToast(null), []);
3746
3937
  const add = useSlipAdd(slip, ui);
3747
3938
  const slipState = useSlipState();
3748
3939
  const handler = slip.onAddToSlip;
@@ -3830,14 +4021,14 @@ function OddsMovementBadge({
3830
4021
  }
3831
4022
 
3832
4023
  // src/components/Crest.tsx
3833
- var import_react21 = require("react");
4024
+ var import_react24 = require("react");
3834
4025
  var import_jsx_runtime11 = require("react/jsx-runtime");
3835
4026
  function initials2(name) {
3836
4027
  return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
3837
4028
  }
3838
4029
  function Crest2({ url, name, kind }) {
3839
4030
  const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
3840
- const [failed, setFailed] = (0, import_react21.useState)(false);
4031
+ const [failed, setFailed] = (0, import_react24.useState)(false);
3841
4032
  if (url && !failed) {
3842
4033
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
3843
4034
  }
@@ -3845,7 +4036,7 @@ function Crest2({ url, name, kind }) {
3845
4036
  }
3846
4037
 
3847
4038
  // src/components/PinToggle.tsx
3848
- var import_react22 = require("react");
4039
+ var import_react25 = require("react");
3849
4040
  var import_jsx_runtime12 = require("react/jsx-runtime");
3850
4041
  var PIN_GLYPHS = {
3851
4042
  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" },
@@ -3853,8 +4044,8 @@ var PIN_GLYPHS = {
3853
4044
  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" }
3854
4045
  };
3855
4046
  function PinToggle({ pin, monitor, ui, market }) {
3856
- const [toast, setToast] = (0, import_react22.useState)(null);
3857
- const dismiss = (0, import_react22.useCallback)(() => setToast(null), []);
4047
+ const [toast, setToast] = (0, import_react25.useState)(null);
4048
+ const dismiss = (0, import_react25.useCallback)(() => setToast(null), []);
3858
4049
  const log = useEventLog();
3859
4050
  if (!monitor || !monitor.enabled) return null;
3860
4051
  const key = pinKey(pin);
@@ -3911,11 +4102,11 @@ function PinToggle({ pin, monitor, ui, market }) {
3911
4102
  }
3912
4103
 
3913
4104
  // src/components/PriceHistoryButton.tsx
3914
- var import_react23 = require("react");
4105
+ var import_react26 = require("react");
3915
4106
  var import_jsx_runtime13 = require("react/jsx-runtime");
3916
4107
  function PriceHistoryButton({ selection, monitor, ui }) {
3917
- const [toast, setToast] = (0, import_react23.useState)(null);
3918
- const dismiss = (0, import_react23.useCallback)(() => setToast(null), []);
4108
+ const [toast, setToast] = (0, import_react26.useState)(null);
4109
+ const dismiss = (0, import_react26.useCallback)(() => setToast(null), []);
3919
4110
  const log = useEventLog();
3920
4111
  if (!monitor || !monitor.enabled) return null;
3921
4112
  const name = joinSelection(selection.selectionLabel ?? void 0, selection.line ?? void 0);
@@ -4030,15 +4221,15 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
4030
4221
  }
4031
4222
 
4032
4223
  // src/components/AddAllToSlipButton.tsx
4033
- var import_react24 = require("react");
4224
+ var import_react27 = require("react");
4034
4225
  var import_jsx_runtime15 = require("react/jsx-runtime");
4035
4226
  function AddAllToSlipButton({ legs, slip, ui }) {
4036
4227
  const add = useSlipAdd(slip, ui);
4037
4228
  const slipState = useSlipState();
4038
- const [pending, setPending] = (0, import_react24.useState)(false);
4039
- const [settledLocal, setSettledLocal] = (0, import_react24.useState)({});
4040
- const [toast, setToast] = (0, import_react24.useState)(null);
4041
- const dismiss = (0, import_react24.useCallback)(() => setToast(null), []);
4229
+ const [pending, setPending] = (0, import_react27.useState)(false);
4230
+ const [settledLocal, setSettledLocal] = (0, import_react27.useState)({});
4231
+ const [toast, setToast] = (0, import_react27.useState)(null);
4232
+ const dismiss = (0, import_react27.useCallback)(() => setToast(null), []);
4042
4233
  if (!ui || !slip.onAddToSlip || legs.length < 2) return null;
4043
4234
  const settled = slipState ? slipState.settled : settledLocal;
4044
4235
  const open = legs.filter((leg) => !settled[leg.matchOddsId]);
@@ -4080,10 +4271,10 @@ function AddAllToSlipButton({ legs, slip, ui }) {
4080
4271
  }
4081
4272
 
4082
4273
  // src/presetToolsContext.ts
4083
- var import_react25 = require("react");
4084
- var PresetToolsContext = (0, import_react25.createContext)(null);
4274
+ var import_react28 = require("react");
4275
+ var PresetToolsContext = (0, import_react28.createContext)(null);
4085
4276
  function usePresetTools() {
4086
- return (0, import_react25.useContext)(PresetToolsContext);
4277
+ return (0, import_react28.useContext)(PresetToolsContext);
4087
4278
  }
4088
4279
 
4089
4280
  // src/components/ComboCardList.tsx
@@ -4148,7 +4339,7 @@ function ComboCardList({ cards, ui, slip, monitor }) {
4148
4339
  }
4149
4340
 
4150
4341
  // src/components/MarketOddsCardList.tsx
4151
- var import_react26 = require("react");
4342
+ var import_react29 = require("react");
4152
4343
 
4153
4344
  // src/components/AllMarketsButton.tsx
4154
4345
  var import_jsx_runtime17 = require("react/jsx-runtime");
@@ -4211,7 +4402,7 @@ function fmtHhMm(iso, locale) {
4211
4402
  return new Date(iso).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", hour12: false });
4212
4403
  }
4213
4404
  function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
4214
- const [open, setOpen] = (0, import_react26.useState)(false);
4405
+ const [open, setOpen] = (0, import_react29.useState)(false);
4215
4406
  const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
4216
4407
  const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
4217
4408
  const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
@@ -4221,9 +4412,9 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
4221
4412
  const asOfMs = live ? new Date(live.asOfUtc).getTime() : NaN;
4222
4413
  const isStale = live != null && !isClosed && (vm.awaitingLiveUpdate === true || Date.now() - asOfMs > STALE_AFTER_MS);
4223
4414
  const staleTime = isStale && live ? fmtHhMm(live.asOfUtc, ui?.locale ?? "en") : null;
4224
- const [, setStaleTick] = (0, import_react26.useState)(0);
4415
+ const [, setStaleTick] = (0, import_react29.useState)(0);
4225
4416
  const watchStale = live != null && !isClosed && !isStale;
4226
- (0, import_react26.useEffect)(() => {
4417
+ (0, import_react29.useEffect)(() => {
4227
4418
  if (!watchStale) return;
4228
4419
  const id = window.setTimeout(() => setStaleTick((n) => n + 1), Math.max(0, asOfMs + STALE_AFTER_MS - Date.now()) + 1);
4229
4420
  return () => window.clearTimeout(id);
@@ -4277,7 +4468,7 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
4277
4468
  ] }) : null
4278
4469
  ] }) : null
4279
4470
  ] }),
4280
- vm.statText && !hideHeader && !pinRef ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "ss-w-mo-stat", children: vm.statText }) : null,
4471
+ !hideHeader && !pinRef ? (vm.statTexts && vm.statTexts.length > 0 ? vm.statTexts : vm.statText ? [vm.statText] : []).map((text, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "ss-w-mo-stat", children: text }, i)) : null,
4281
4472
  isClosed ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "ss-w-mo-closed", children: closedReason === "suspended" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: ui?.liveCard.suspended ?? "Market suspended" }) : closedReason === "no_live_price" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: ui?.liveCard.noPrice ?? "No live price available" }) : closedReason === "full_time" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: ui?.liveCard.fullTime ?? "Full time" }) : null }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
4282
4473
  /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "ss-w-mo-rows", children: [
4283
4474
  vm.mainRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(OddsRow, { vm, row, ui, slip, inSlipIds, history, suppressSlip: isStale }, row.key)),
@@ -4302,7 +4493,7 @@ function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds, hideHeader, p
4302
4493
  }
4303
4494
 
4304
4495
  // src/components/CompactOddsList.tsx
4305
- var import_react27 = require("react");
4496
+ var import_react30 = require("react");
4306
4497
 
4307
4498
  // src/compactList.ts
4308
4499
  var COMPACT_MIN_CARDS = 3;
@@ -4416,11 +4607,11 @@ function Row({ row, columns, ui, slip, monitor, rowRef }) {
4416
4607
  ] });
4417
4608
  }
4418
4609
  function CompactOddsList({ list, ui, slip, monitor }) {
4419
- const [shown, setShown] = (0, import_react27.useState)(COMPACT_PAGE);
4610
+ const [shown, setShown] = (0, import_react30.useState)(COMPACT_PAGE);
4420
4611
  const hidden = list.rowCount - shown;
4421
- const [focusIndex, setFocusIndex] = (0, import_react27.useState)(null);
4422
- const focusRef = (0, import_react27.useRef)(null);
4423
- (0, import_react27.useEffect)(() => {
4612
+ const [focusIndex, setFocusIndex] = (0, import_react30.useState)(null);
4613
+ const focusRef = (0, import_react30.useRef)(null);
4614
+ (0, import_react30.useEffect)(() => {
4424
4615
  if (focusIndex !== null) focusRef.current?.focus();
4425
4616
  }, [focusIndex]);
4426
4617
  let left = shown;
@@ -4725,7 +4916,7 @@ function FixtureCard({ card }) {
4725
4916
  }
4726
4917
 
4727
4918
  // src/components/dashboard/CountdownCard.tsx
4728
- var import_react28 = require("react");
4919
+ var import_react31 = require("react");
4729
4920
  var import_jsx_runtime25 = require("react/jsx-runtime");
4730
4921
  var DAY_MS = 864e5;
4731
4922
  function remainingSegments(kickoffUnix, nowMs, withSeconds) {
@@ -4744,12 +4935,12 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
4744
4935
  function CountdownCard({ card }) {
4745
4936
  const { data } = card;
4746
4937
  const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
4747
- const [nowMs, setNowMs] = (0, import_react28.useState)(() => Date.now());
4748
- const [reduced] = (0, import_react28.useState)(
4938
+ const [nowMs, setNowMs] = (0, import_react31.useState)(() => Date.now());
4939
+ const [reduced] = (0, import_react31.useState)(
4749
4940
  () => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
4750
4941
  );
4751
4942
  const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
4752
- (0, import_react28.useEffect)(() => {
4943
+ (0, import_react31.useEffect)(() => {
4753
4944
  if (reduced) return;
4754
4945
  const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
4755
4946
  return () => window.clearInterval(id);
@@ -4757,7 +4948,7 @@ function CountdownCard({ card }) {
4757
4948
  const segments = remainingSegments(data.kickoffUnix, nowMs, withinDay && !reduced);
4758
4949
  return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "ss-w-fandash-card ss-w-fandash-countdown", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "ss-w-fandash-countdown-top", children: [
4759
4950
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title ?? "Kick-off in" }),
4760
- segments ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_react28.Fragment, { children: [
4951
+ segments ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_react31.Fragment, { children: [
4761
4952
  i > 0 ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-countdown-colon", children: ":" }) : null,
4762
4953
  /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("span", { className: "ss-w-fandash-countdown-seg", children: [
4763
4954
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-countdown-value", children: s.value }),
@@ -4768,7 +4959,7 @@ function CountdownCard({ card }) {
4768
4959
  }
4769
4960
 
4770
4961
  // src/components/dashboard/InjuriesCard.tsx
4771
- var import_react29 = require("react");
4962
+ var import_react32 = require("react");
4772
4963
  var import_jsx_runtime26 = require("react/jsx-runtime");
4773
4964
  var SHOWN = 3;
4774
4965
  function ColHead({ name, crestUrl }) {
@@ -4791,7 +4982,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
4791
4982
  }
4792
4983
  function InjuriesCard({ card, ui }) {
4793
4984
  const { data } = card;
4794
- const [expanded, setExpanded] = (0, import_react29.useState)(false);
4985
+ const [expanded, setExpanded] = (0, import_react32.useState)(false);
4795
4986
  const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
4796
4987
  const limit = expanded ? void 0 : SHOWN;
4797
4988
  const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
@@ -4897,7 +5088,7 @@ function LinksCard({ card }) {
4897
5088
  }
4898
5089
 
4899
5090
  // src/components/dashboard/PostMatchResultCard.tsx
4900
- var import_react30 = require("react");
5091
+ var import_react33 = require("react");
4901
5092
  var import_jsx_runtime32 = require("react/jsx-runtime");
4902
5093
  function initials3(name) {
4903
5094
  return name.trim().slice(0, 3).toUpperCase();
@@ -4907,7 +5098,7 @@ function PostMatchCrest({
4907
5098
  name,
4908
5099
  side
4909
5100
  }) {
4910
- const [failed, setFailed] = (0, import_react30.useState)(false);
5101
+ const [failed, setFailed] = (0, import_react33.useState)(false);
4911
5102
  const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
4912
5103
  if (url && !failed) {
4913
5104
  return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -5106,10 +5297,10 @@ function RestingFormCard({ card }) {
5106
5297
  }
5107
5298
 
5108
5299
  // src/components/dashboard/LiveScoreCard.tsx
5109
- var import_react32 = require("react");
5300
+ var import_react35 = require("react");
5110
5301
 
5111
5302
  // src/useLiveClock.ts
5112
- var import_react31 = require("react");
5303
+ var import_react34 = require("react");
5113
5304
  var TICK_MS = 6e4;
5114
5305
  var MAX_LIVE_TICK_MINUTES = 15;
5115
5306
  function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
@@ -5118,10 +5309,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
5118
5309
  return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
5119
5310
  }
5120
5311
  function useLiveClock(minute, clockRunning, receivedAtMs) {
5121
- const [displayMinute, setDisplayMinute] = (0, import_react31.useState)(
5312
+ const [displayMinute, setDisplayMinute] = (0, import_react34.useState)(
5122
5313
  () => computeDisplayMinute(minute, clockRunning, receivedAtMs)
5123
5314
  );
5124
- (0, import_react31.useEffect)(() => {
5315
+ (0, import_react34.useEffect)(() => {
5125
5316
  setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
5126
5317
  if (!clockRunning) return;
5127
5318
  const id = window.setInterval(() => {
@@ -5138,7 +5329,7 @@ function initials5(name) {
5138
5329
  return name.trim().slice(0, 3).toUpperCase();
5139
5330
  }
5140
5331
  function LiveCrest({ url, name, side }) {
5141
- const [failed, setFailed] = (0, import_react32.useState)(false);
5332
+ const [failed, setFailed] = (0, import_react35.useState)(false);
5142
5333
  const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
5143
5334
  if (url && !failed) {
5144
5335
  return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
@@ -5157,7 +5348,7 @@ function LiveScoreCard({
5157
5348
  }) {
5158
5349
  const { data } = card;
5159
5350
  const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
5160
- const seedRef = (0, import_react32.useRef)(null);
5351
+ const seedRef = (0, import_react35.useRef)(null);
5161
5352
  if (!seedRef.current || seedRef.current.key !== seedKey) {
5162
5353
  seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
5163
5354
  }
@@ -5197,7 +5388,7 @@ function LiveScoreCard({
5197
5388
  }
5198
5389
 
5199
5390
  // src/components/dashboard/LiveTimelineCard.tsx
5200
- var import_react33 = require("react");
5391
+ var import_react36 = require("react");
5201
5392
  var import_jsx_runtime42 = require("react/jsx-runtime");
5202
5393
  var SHOWN2 = 3;
5203
5394
  function EventIcon({ type }) {
@@ -5239,7 +5430,7 @@ function EventRow({ e }) {
5239
5430
  ] });
5240
5431
  }
5241
5432
  function LiveTimelineCard({ card, ui }) {
5242
- const [expanded, setExpanded] = (0, import_react33.useState)(false);
5433
+ const [expanded, setExpanded] = (0, import_react36.useState)(false);
5243
5434
  const events = card.data.events;
5244
5435
  if (!events || events.length === 0) return null;
5245
5436
  const sorted = [...events].sort((a, b) => b.minute - a.minute);
@@ -5264,7 +5455,7 @@ function LiveTimelineCard({ card, ui }) {
5264
5455
  }
5265
5456
 
5266
5457
  // src/components/dashboard/MomentumWave.tsx
5267
- var import_react34 = require("react");
5458
+ var import_react37 = require("react");
5268
5459
  var import_jsx_runtime43 = require("react/jsx-runtime");
5269
5460
  var WIDTH = 270;
5270
5461
  var HEIGHT = 56;
@@ -5288,7 +5479,7 @@ function MomentumWave({
5288
5479
  }) {
5289
5480
  if (points.length === 0) return null;
5290
5481
  const { area, line, lastLeftPct, lastTopPx } = buildPaths(points);
5291
- const clipId = (0, import_react34.useId)();
5482
+ const clipId = (0, import_react37.useId)();
5292
5483
  const topClipId = `${clipId}-top`;
5293
5484
  const bottomClipId = `${clipId}-bottom`;
5294
5485
  const topClass = clubIsHome ? "ss-w-fandash-live-mom-home" : "ss-w-fandash-live-mom-away";
@@ -5481,11 +5672,11 @@ function turnAnchor(messages) {
5481
5672
  }
5482
5673
  function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
5483
5674
  const { state, send } = controller;
5484
- const listRef = (0, import_react35.useRef)(null);
5485
- const endRef = (0, import_react35.useRef)(null);
5486
- const pinnedRef = (0, import_react35.useRef)(true);
5487
- const anchoredTurnRef = (0, import_react35.useRef)(null);
5488
- (0, import_react35.useEffect)(() => {
5675
+ const listRef = (0, import_react38.useRef)(null);
5676
+ const endRef = (0, import_react38.useRef)(null);
5677
+ const pinnedRef = (0, import_react38.useRef)(true);
5678
+ const anchoredTurnRef = (0, import_react38.useRef)(null);
5679
+ (0, import_react38.useEffect)(() => {
5489
5680
  const anchor = turnAnchor(state.messages);
5490
5681
  const list = listRef.current;
5491
5682
  if (anchor && anchor.turnId !== anchoredTurnRef.current) {
@@ -5542,13 +5733,13 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
5542
5733
  }
5543
5734
 
5544
5735
  // src/components/ChatInput.tsx
5545
- var import_react36 = require("react");
5736
+ var import_react39 = require("react");
5546
5737
  var import_jsx_runtime49 = require("react/jsx-runtime");
5547
- var ChatInput = (0, import_react36.forwardRef)(function ChatInput2({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message", disabled = false, onType }, ref) {
5548
- const [value, setValue] = (0, import_react36.useState)("");
5549
- const textareaRef = (0, import_react36.useRef)(null);
5550
- const stopRef = (0, import_react36.useRef)(null);
5551
- const textBoxWantsFocusRef = (0, import_react36.useRef)(false);
5738
+ var ChatInput = (0, import_react39.forwardRef)(function ChatInput2({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message", disabled = false, onType }, ref) {
5739
+ const [value, setValue] = (0, import_react39.useState)("");
5740
+ const textareaRef = (0, import_react39.useRef)(null);
5741
+ const stopRef = (0, import_react39.useRef)(null);
5742
+ const textBoxWantsFocusRef = (0, import_react39.useRef)(false);
5552
5743
  const submit = () => {
5553
5744
  if (disabled) return;
5554
5745
  const t = value.trim();
@@ -5562,7 +5753,7 @@ var ChatInput = (0, import_react36.forwardRef)(function ChatInput2({ placeholder
5562
5753
  submit();
5563
5754
  }
5564
5755
  };
5565
- (0, import_react36.useImperativeHandle)(ref, () => ({
5756
+ (0, import_react39.useImperativeHandle)(ref, () => ({
5566
5757
  focus() {
5567
5758
  const box = textareaRef.current;
5568
5759
  if (box && !box.disabled) {
@@ -5574,7 +5765,7 @@ var ChatInput = (0, import_react36.forwardRef)(function ChatInput2({ placeholder
5574
5765
  stopRef.current?.focus();
5575
5766
  }
5576
5767
  }), []);
5577
- (0, import_react36.useEffect)(() => {
5768
+ (0, import_react39.useEffect)(() => {
5578
5769
  if (streaming || disabled || !textBoxWantsFocusRef.current) return;
5579
5770
  textBoxWantsFocusRef.current = false;
5580
5771
  const box = textareaRef.current;
@@ -5607,16 +5798,19 @@ var ChatInput = (0, import_react36.forwardRef)(function ChatInput2({ placeholder
5607
5798
 
5608
5799
  // src/components/TabBar.tsx
5609
5800
  var import_jsx_runtime50 = require("react/jsx-runtime");
5610
- function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled }) {
5801
+ function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled, clubEnabled }) {
5611
5802
  const tabs = [
5612
5803
  { tab: "chat", label: ui.tabChat, count: 0, dot: monitor.chatDot },
5613
- ...hasToday ? [{ tab: "today", label: ui.tabToday, count: todayCount, dot: monitor.todayDot }] : [],
5614
- ...matchCount > 0 ? [{ tab: "following", label: ui.tabFollowing, count: matchCount, dot: monitor.matchesDot }] : [],
5615
- ...oddsCount > 0 ? [{ tab: "odds", label: ui.tabOdds, count: oddsCount, dot: monitor.oddsDot }] : [],
5616
- ...gamesEnabled ? [
5617
- { tab: "games", label: ui.tabGames, count: 0, dot: false },
5618
- { tab: "leaderboard", label: ui.tabLeaderboard, count: 0, dot: false }
5619
- ] : []
5804
+ ...clubEnabled ? [
5805
+ { tab: "fixtures", label: ui.tabFixtures, count: 0, dot: false },
5806
+ { tab: "standings", label: ui.tabStandings, count: 0, dot: false },
5807
+ { tab: "squad", label: ui.tabSquad, count: 0, dot: false }
5808
+ ] : [
5809
+ ...hasToday ? [{ tab: "today", label: ui.tabToday, count: todayCount, dot: monitor.todayDot }] : [],
5810
+ ...matchCount > 0 ? [{ tab: "following", label: ui.tabFollowing, count: matchCount, dot: monitor.matchesDot }] : [],
5811
+ ...oddsCount > 0 ? [{ tab: "odds", label: ui.tabOdds, count: oddsCount, dot: monitor.oddsDot }] : []
5812
+ ],
5813
+ ...gamesEnabled ? [{ tab: "games", label: ui.tabGames, count: 0, dot: false }] : []
5620
5814
  ];
5621
5815
  if (tabs.length < 2) return null;
5622
5816
  return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "ss-w-tabs", role: "tablist", children: tabs.map(({ tab, label, count, dot }) => {
@@ -5696,10 +5890,10 @@ function MarketAccordion({ match, monitor, ui, slip }) {
5696
5890
  }
5697
5891
 
5698
5892
  // src/components/LiveFactBlock.tsx
5699
- var import_react37 = require("react");
5893
+ var import_react40 = require("react");
5700
5894
  var import_jsx_runtime52 = require("react/jsx-runtime");
5701
5895
  function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
5702
- const [expanded, setExpanded] = (0, import_react37.useState)(false);
5896
+ const [expanded, setExpanded] = (0, import_react40.useState)(false);
5703
5897
  const [current, ...earlier] = facts;
5704
5898
  if (!current) return null;
5705
5899
  const m = current.market;
@@ -5965,7 +6159,7 @@ function OddsPanel({ monitor, ui, slip }) {
5965
6159
  }
5966
6160
 
5967
6161
  // src/components/TodayPanel.tsx
5968
- var import_react41 = require("react");
6162
+ var import_react44 = require("react");
5969
6163
 
5970
6164
  // src/placement.ts
5971
6165
  function placeLeagues(visible, pinnedMatchIds) {
@@ -6028,11 +6222,11 @@ function matchingFixtures(group, query) {
6028
6222
  }
6029
6223
 
6030
6224
  // src/useStarTap.ts
6031
- var import_react38 = require("react");
6225
+ var import_react41 = require("react");
6032
6226
  function useStarTap(starLeague) {
6033
- const [pendingId, setPendingId] = (0, import_react38.useState)(null);
6034
- const pendingRef = (0, import_react38.useRef)(null);
6035
- const tap = (0, import_react38.useCallback)(async (competitionId, next) => {
6227
+ const [pendingId, setPendingId] = (0, import_react41.useState)(null);
6228
+ const pendingRef = (0, import_react41.useRef)(null);
6229
+ const tap = (0, import_react41.useCallback)(async (competitionId, next) => {
6036
6230
  if (pendingRef.current !== null) return false;
6037
6231
  pendingRef.current = competitionId;
6038
6232
  setPendingId(competitionId);
@@ -6091,7 +6285,7 @@ function LeagueTile({ group, starClickable: starClickable2, disambiguate, onOpen
6091
6285
  }
6092
6286
 
6093
6287
  // src/components/LeagueDetail.tsx
6094
- var import_react39 = require("react");
6288
+ var import_react42 = require("react");
6095
6289
 
6096
6290
  // src/components/FixtureRow.tsx
6097
6291
  var import_jsx_runtime56 = require("react/jsx-runtime");
@@ -6126,11 +6320,11 @@ function FixtureRow({ match, state, stale, ui, monitor }) {
6126
6320
  var import_jsx_runtime57 = require("react/jsx-runtime");
6127
6321
  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";
6128
6322
  function LeagueDetail({ group, position, states, stale, ui, monitor, starTap, onBack, onPrev, onNext }) {
6129
- const [toast, setToast] = (0, import_react39.useState)(null);
6130
- (0, import_react39.useEffect)(() => {
6323
+ const [toast, setToast] = (0, import_react42.useState)(null);
6324
+ (0, import_react42.useEffect)(() => {
6131
6325
  setToast(null);
6132
6326
  }, [group.competitionId]);
6133
- (0, import_react39.useEffect)(() => {
6327
+ (0, import_react42.useEffect)(() => {
6134
6328
  if (toast === null) return;
6135
6329
  const id = setTimeout(() => setToast(null), 4e3);
6136
6330
  return () => clearTimeout(id);
@@ -6262,7 +6456,7 @@ function LeagueRowGroup({ group, states, stale, cap, starClickable: starClickabl
6262
6456
  }
6263
6457
 
6264
6458
  // src/components/games/ui/SearchField.tsx
6265
- var import_react40 = require("react");
6459
+ var import_react43 = require("react");
6266
6460
 
6267
6461
  // src/components/games/ui/icons.tsx
6268
6462
  var import_jsx_runtime59 = require("react/jsx-runtime");
@@ -6301,8 +6495,8 @@ var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runt
6301
6495
  // src/components/games/ui/SearchField.tsx
6302
6496
  var import_jsx_runtime60 = require("react/jsx-runtime");
6303
6497
  function SearchField({ id, label, labelHidden = false, placeholder, value, onChange, disabled, inputRef, onKeyDown, clearLabel }) {
6304
- const localRef = (0, import_react40.useRef)(null);
6305
- const setInputRef = (0, import_react40.useCallback)((node) => {
6498
+ const localRef = (0, import_react43.useRef)(null);
6499
+ const setInputRef = (0, import_react43.useCallback)((node) => {
6306
6500
  localRef.current = node;
6307
6501
  if (typeof inputRef === "function") inputRef(node);
6308
6502
  else if (inputRef) inputRef.current = node;
@@ -6346,23 +6540,23 @@ function SearchField({ id, label, labelHidden = false, placeholder, value, onCha
6346
6540
  var import_jsx_runtime61 = require("react/jsx-runtime");
6347
6541
  function TodayPanel({ discovery, ui, monitor }) {
6348
6542
  const { groups, states, stale, starLeague } = discovery;
6349
- const searchId = (0, import_react41.useId)();
6350
- const [query, setQuery] = (0, import_react41.useState)("");
6351
- const [selectedCompetitionId, setSelectedCompetitionId] = (0, import_react41.useState)(null);
6352
- const [toast, setToast] = (0, import_react41.useState)(null);
6353
- (0, import_react41.useEffect)(() => {
6543
+ const searchId = (0, import_react44.useId)();
6544
+ const [query, setQuery] = (0, import_react44.useState)("");
6545
+ const [selectedCompetitionId, setSelectedCompetitionId] = (0, import_react44.useState)(null);
6546
+ const [toast, setToast] = (0, import_react44.useState)(null);
6547
+ (0, import_react44.useEffect)(() => {
6354
6548
  if (toast === null) return;
6355
6549
  const id = setTimeout(() => setToast(null), 4e3);
6356
6550
  return () => clearTimeout(id);
6357
6551
  }, [toast]);
6358
6552
  const visibleGroups = visibleGroupsOf(groups, states);
6359
- const pinnedMatchIds = (0, import_react41.useMemo)(
6553
+ const pinnedMatchIds = (0, import_react44.useMemo)(
6360
6554
  () => monitor.pins.filter((p) => p.kind === "match").map((p) => p.matchId),
6361
6555
  [monitor.pins]
6362
6556
  );
6363
- const placement = (0, import_react41.useMemo)(() => placeLeagues(visibleGroups, pinnedMatchIds), [visibleGroups, pinnedMatchIds]);
6557
+ const placement = (0, import_react44.useMemo)(() => placeLeagues(visibleGroups, pinnedMatchIds), [visibleGroups, pinnedMatchIds]);
6364
6558
  const starTap = useStarTap(starLeague);
6365
- const gridStarTap = (0, import_react41.useMemo)(() => ({
6559
+ const gridStarTap = (0, import_react44.useMemo)(() => ({
6366
6560
  pendingId: starTap.pendingId,
6367
6561
  tap: async (competitionId, next) => {
6368
6562
  const ok = await starTap.tap(competitionId, next);
@@ -6396,7 +6590,7 @@ function TodayPanel({ discovery, ui, monitor }) {
6396
6590
  }
6397
6591
  const openIndex = selectedCompetitionId === null ? -1 : placement.order.findIndex((g) => g.competitionId === selectedCompetitionId);
6398
6592
  const openGroup = openIndex === -1 ? void 0 : placement.order[openIndex];
6399
- (0, import_react41.useEffect)(() => {
6593
+ (0, import_react44.useEffect)(() => {
6400
6594
  if (selectedCompetitionId !== null && openGroup === void 0) setSelectedCompetitionId(null);
6401
6595
  }, [selectedCompetitionId, openGroup]);
6402
6596
  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);
@@ -6543,7 +6737,7 @@ function TodayPanel({ discovery, ui, monitor }) {
6543
6737
  }
6544
6738
 
6545
6739
  // src/components/GamesPanel.tsx
6546
- var import_react55 = require("react");
6740
+ var import_react59 = require("react");
6547
6741
 
6548
6742
  // src/components/GamesLoginWall.tsx
6549
6743
  var import_jsx_runtime62 = require("react/jsx-runtime");
@@ -6552,7 +6746,7 @@ function GamesLoginWall({ ui }) {
6552
6746
  }
6553
6747
 
6554
6748
  // src/components/GamesHub.tsx
6555
- var import_react42 = require("react");
6749
+ var import_react45 = require("react");
6556
6750
 
6557
6751
  // src/components/games/ui/gameMeta.ts
6558
6752
  function prettifyGameId(gameId) {
@@ -6703,8 +6897,8 @@ function pickHeroGame(games) {
6703
6897
  }
6704
6898
  var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
6705
6899
  function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
6706
- const [, setTick] = (0, import_react42.useState)(0);
6707
- (0, import_react42.useEffect)(() => {
6900
+ const [, setTick] = (0, import_react45.useState)(0);
6901
+ (0, import_react45.useEffect)(() => {
6708
6902
  const id = setInterval(() => setTick((t) => t + 1), 6e4);
6709
6903
  return () => clearInterval(id);
6710
6904
  }, []);
@@ -6764,10 +6958,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
6764
6958
  }
6765
6959
 
6766
6960
  // src/components/GameScreenHost.tsx
6767
- var import_react54 = require("react");
6961
+ var import_react57 = require("react");
6768
6962
 
6769
6963
  // src/useGamePlay.ts
6770
- var import_react43 = require("react");
6964
+ var import_react46 = require("react");
6771
6965
  function toSubmitResult(payload) {
6772
6966
  return {
6773
6967
  // 'pending' means the play is recorded but awaiting resolution (fixture games)
@@ -6779,17 +6973,17 @@ function toSubmitResult(payload) {
6779
6973
  };
6780
6974
  }
6781
6975
  function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
6782
- const [result, setResult] = (0, import_react43.useState)(null);
6783
- const [submitting, setSubmitting] = (0, import_react43.useState)(false);
6784
- const [rawStatus, setRawStatus] = (0, import_react43.useState)(null);
6785
- const inFlightRef = (0, import_react43.useRef)(false);
6786
- const convRef = (0, import_react43.useRef)(conversation);
6976
+ const [result, setResult] = (0, import_react46.useState)(null);
6977
+ const [submitting, setSubmitting] = (0, import_react46.useState)(false);
6978
+ const [rawStatus, setRawStatus] = (0, import_react46.useState)(null);
6979
+ const inFlightRef = (0, import_react46.useRef)(false);
6980
+ const convRef = (0, import_react46.useRef)(conversation);
6787
6981
  convRef.current = conversation;
6788
- const optsRef = (0, import_react43.useRef)({ gameId, gameDay, fixtureId, locale, refresh });
6982
+ const optsRef = (0, import_react46.useRef)({ gameId, gameDay, fixtureId, locale, refresh });
6789
6983
  optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
6790
- const resultRef = (0, import_react43.useRef)(null);
6984
+ const resultRef = (0, import_react46.useRef)(null);
6791
6985
  resultRef.current = result;
6792
- const refetch = (0, import_react43.useCallback)(async () => {
6986
+ const refetch = (0, import_react46.useCallback)(async () => {
6793
6987
  const conv = convRef.current;
6794
6988
  if (!conv) return;
6795
6989
  const opts = optsRef.current;
@@ -6805,7 +6999,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
6805
6999
  } catch {
6806
7000
  }
6807
7001
  }, []);
6808
- const submit = (0, import_react43.useCallback)(async (answerJson) => {
7002
+ const submit = (0, import_react46.useCallback)(async (answerJson) => {
6809
7003
  const conv = convRef.current;
6810
7004
  if (!conv || inFlightRef.current) return;
6811
7005
  inFlightRef.current = true;
@@ -6832,14 +7026,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
6832
7026
  setSubmitting(false);
6833
7027
  }
6834
7028
  }, [refetch]);
6835
- const hydrate = (0, import_react43.useCallback)(() => {
7029
+ const hydrate = (0, import_react46.useCallback)(() => {
6836
7030
  void refetch();
6837
7031
  }, [refetch]);
6838
7032
  return { result, submitting, submit, hydrate, rawStatus };
6839
7033
  }
6840
7034
 
6841
7035
  // src/components/games/MysteryTigerGame.tsx
6842
- var import_react45 = require("react");
7036
+ var import_react48 = require("react");
6843
7037
 
6844
7038
  // src/components/games/nationFlags.ts
6845
7039
  var FLAGS = {
@@ -7050,7 +7244,7 @@ function isNationCode(flag) {
7050
7244
  }
7051
7245
 
7052
7246
  // src/components/games/PlayerAvatar.tsx
7053
- var import_react44 = require("react");
7247
+ var import_react47 = require("react");
7054
7248
  var import_jsx_runtime67 = require("react/jsx-runtime");
7055
7249
  function initialsOf(name) {
7056
7250
  const parts = name.trim().split(/\s+/).filter(Boolean);
@@ -7068,7 +7262,7 @@ function PlayerAvatar({
7068
7262
  imagePath,
7069
7263
  className
7070
7264
  }) {
7071
- const [failed, setFailed] = (0, import_react44.useState)(false);
7265
+ const [failed, setFailed] = (0, import_react47.useState)(false);
7072
7266
  const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
7073
7267
  return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
7074
7268
  }
@@ -7309,8 +7503,8 @@ function MysteryTigerGame({
7309
7503
  onBack
7310
7504
  }) {
7311
7505
  const t = ui.games.mysteryTiger;
7312
- const [query, setQuery] = (0, import_react45.useState)("");
7313
- const inputId = (0, import_react45.useId)();
7506
+ const [query, setQuery] = (0, import_react48.useState)("");
7507
+ const inputId = (0, import_react48.useId)();
7314
7508
  const clientState = parseClientState(result?.clientStateJson);
7315
7509
  const guessResults = clientState?.guessResults ?? [];
7316
7510
  const alreadyGuessedIds = new Set(guessResults.map((g) => g.playerId));
@@ -7571,13 +7765,13 @@ function HigherOrLowerGame({
7571
7765
  }
7572
7766
 
7573
7767
  // src/components/games/CareerPathGame.tsx
7574
- var import_react47 = require("react");
7768
+ var import_react50 = require("react");
7575
7769
 
7576
7770
  // src/components/games/ui/CrestShield.tsx
7577
- var import_react46 = require("react");
7771
+ var import_react49 = require("react");
7578
7772
  var import_jsx_runtime78 = require("react/jsx-runtime");
7579
7773
  function CrestShield({ src, name, size = 28 }) {
7580
- const [failed, setFailed] = (0, import_react46.useState)(false);
7774
+ const [failed, setFailed] = (0, import_react49.useState)(false);
7581
7775
  if (src && !isPlaceholderImage(src) && !failed) {
7582
7776
  return /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
7583
7777
  }
@@ -7609,8 +7803,8 @@ function CareerPathGame({
7609
7803
  }) {
7610
7804
  const s = ui.games.careerPath;
7611
7805
  const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
7612
- const [query, setQuery] = (0, import_react47.useState)("");
7613
- const inputId = (0, import_react47.useId)();
7806
+ const [query, setQuery] = (0, import_react50.useState)("");
7807
+ const inputId = (0, import_react50.useId)();
7614
7808
  const clientState = parseClientState3(result?.clientStateJson);
7615
7809
  const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
7616
7810
  const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
@@ -7716,7 +7910,7 @@ function CareerPathGame({
7716
7910
  }
7717
7911
 
7718
7912
  // src/components/games/BeatTheGridGame.tsx
7719
- var import_react48 = __toESM(require("react"), 1);
7913
+ var import_react51 = __toESM(require("react"), 1);
7720
7914
 
7721
7915
  // src/components/games/ui/OptionList.tsx
7722
7916
  var import_jsx_runtime80 = require("react/jsx-runtime");
@@ -7805,10 +7999,10 @@ function SearchSheet({
7805
7999
  ui
7806
8000
  }) {
7807
8001
  const s = ui.games.beatTheGrid;
7808
- const [query, setQuery] = (0, import_react48.useState)("");
7809
- const inputId = (0, import_react48.useId)();
7810
- const inputRef = (0, import_react48.useRef)(null);
7811
- (0, import_react48.useEffect)(() => {
8002
+ const [query, setQuery] = (0, import_react51.useState)("");
8003
+ const inputId = (0, import_react51.useId)();
8004
+ const inputRef = (0, import_react51.useRef)(null);
8005
+ (0, import_react51.useEffect)(() => {
7812
8006
  inputRef.current?.focus();
7813
8007
  }, [row, col]);
7814
8008
  const filtered = playerPool.filter(
@@ -7873,7 +8067,7 @@ function BeatTheGridGame({
7873
8067
  }) {
7874
8068
  const s = ui.games.beatTheGrid;
7875
8069
  const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
7876
- const [activeCell, setActiveCell] = (0, import_react48.useState)(null);
8070
+ const [activeCell, setActiveCell] = (0, import_react51.useState)(null);
7877
8071
  const clientState = parseClientState4(result?.clientStateJson);
7878
8072
  const filledCells = clientState?.cells ?? [];
7879
8073
  const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
@@ -7947,7 +8141,7 @@ function BeatTheGridGame({
7947
8141
  /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("span", { "aria-hidden": "true", children: abbr }),
7948
8142
  /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("span", { className: "ss-g-sr", children: rowLabel })
7949
8143
  ] });
7950
- return /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(import_react48.default.Fragment, { children: [
8144
+ return /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(import_react51.default.Fragment, { children: [
7951
8145
  /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("div", { className: "ss-g-btg-rowhdr", "data-meta": rowMeta ? "true" : void 0, children: rowHeaderContent }),
7952
8146
  cols.map((colLabel, colIdx) => {
7953
8147
  const filled = findCellResult(filledCells, rowIdx, colIdx);
@@ -8028,7 +8222,7 @@ function BeatTheGridGame({
8028
8222
  }
8029
8223
 
8030
8224
  // src/components/games/GuessTheXiGame.tsx
8031
- var import_react49 = require("react");
8225
+ var import_react52 = require("react");
8032
8226
 
8033
8227
  // src/components/games/ui/PitchSvg.tsx
8034
8228
  var import_jsx_runtime82 = require("react/jsx-runtime");
@@ -8117,8 +8311,8 @@ function GuessTheXiGame({
8117
8311
  onBack
8118
8312
  }) {
8119
8313
  const t = ui.games.guessTheXi;
8120
- const [query, setQuery] = (0, import_react49.useState)("");
8121
- const inputId = (0, import_react49.useId)();
8314
+ const [query, setQuery] = (0, import_react52.useState)("");
8315
+ const inputId = (0, import_react52.useId)();
8122
8316
  const clientState = parseClientState5(result?.clientStateJson);
8123
8317
  const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
8124
8318
  const solved = clientState?.status === "solved";
@@ -8260,7 +8454,7 @@ function GuessTheXiGame({
8260
8454
  }
8261
8455
 
8262
8456
  // src/components/games/DailyQuizGame.tsx
8263
- var import_react50 = require("react");
8457
+ var import_react53 = require("react");
8264
8458
  var import_jsx_runtime84 = require("react/jsx-runtime");
8265
8459
  function parseClientState6(json) {
8266
8460
  if (!json) return null;
@@ -8301,8 +8495,8 @@ function DailyQuizGame({
8301
8495
  }) {
8302
8496
  const s = ui.games.dailyQuiz;
8303
8497
  const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
8304
- const [selections, setSelections] = (0, import_react50.useState)(/* @__PURE__ */ new Map());
8305
- const [page, setPage] = (0, import_react50.useState)(0);
8498
+ const [selections, setSelections] = (0, import_react53.useState)(/* @__PURE__ */ new Map());
8499
+ const [page, setPage] = (0, import_react53.useState)(0);
8306
8500
  const clientState = parseClientState6(result?.clientStateJson);
8307
8501
  const results = clientState?.results ?? [];
8308
8502
  const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
@@ -8412,7 +8606,7 @@ function DailyQuizGame({
8412
8606
  }
8413
8607
 
8414
8608
  // src/components/games/MatchdayPredictorGame.tsx
8415
- var import_react51 = require("react");
8609
+ var import_react54 = require("react");
8416
8610
  var import_jsx_runtime85 = require("react/jsx-runtime");
8417
8611
  var SCORER_SEARCH_THRESHOLD = 9;
8418
8612
  function parseClientState7(json) {
@@ -8508,12 +8702,12 @@ function MatchdayPredictorGame({
8508
8702
  onBack
8509
8703
  }) {
8510
8704
  const t = ui.games.predictor;
8511
- const [homeScore, setHomeScore] = (0, import_react51.useState)(0);
8512
- const [awayScore, setAwayScore] = (0, import_react51.useState)(0);
8513
- const [firstScorerPlayerId, setFirstScorerPlayerId] = (0, import_react51.useState)(null);
8514
- const [lastEdited, setLastEdited] = (0, import_react51.useState)("home");
8515
- const [query, setQuery] = (0, import_react51.useState)("");
8516
- const searchId = (0, import_react51.useId)();
8705
+ const [homeScore, setHomeScore] = (0, import_react54.useState)(0);
8706
+ const [awayScore, setAwayScore] = (0, import_react54.useState)(0);
8707
+ const [firstScorerPlayerId, setFirstScorerPlayerId] = (0, import_react54.useState)(null);
8708
+ const [lastEdited, setLastEdited] = (0, import_react54.useState)("home");
8709
+ const [query, setQuery] = (0, import_react54.useState)("");
8710
+ const searchId = (0, import_react54.useId)();
8517
8711
  const clientState = parseClientState7(result?.clientStateJson);
8518
8712
  const alreadyPlayed = result?.alreadyPlayed === true;
8519
8713
  const header = /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(
@@ -8680,7 +8874,7 @@ function MatchdayPredictorGame({
8680
8874
  }
8681
8875
 
8682
8876
  // src/components/games/StartingXiGame.tsx
8683
- var import_react52 = require("react");
8877
+ var import_react55 = require("react");
8684
8878
  var import_jsx_runtime86 = require("react/jsx-runtime");
8685
8879
  var POINTS_PER_STARTER = 8;
8686
8880
  var XI_SIZE = 11;
@@ -8724,10 +8918,10 @@ function StartingXiGame({
8724
8918
  lockAtUtc
8725
8919
  }) {
8726
8920
  const t = ui.games.startingXi;
8727
- const [slotPlayers, setSlotPlayers] = (0, import_react52.useState)(() => Array(XI_SIZE).fill(null));
8728
- const [active, setActive] = (0, import_react52.useState)(0);
8729
- const [query, setQuery] = (0, import_react52.useState)("");
8730
- const searchId = (0, import_react52.useId)();
8921
+ const [slotPlayers, setSlotPlayers] = (0, import_react55.useState)(() => Array(XI_SIZE).fill(null));
8922
+ const [active, setActive] = (0, import_react55.useState)(0);
8923
+ const [query, setQuery] = (0, import_react55.useState)("");
8924
+ const searchId = (0, import_react55.useId)();
8731
8925
  const clientState = parseClientState8(result?.clientStateJson);
8732
8926
  const alreadyPlayed = result?.alreadyPlayed === true;
8733
8927
  const header = /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
@@ -8866,7 +9060,7 @@ function StartingXiGame({
8866
9060
  }
8867
9061
 
8868
9062
  // src/components/games/StatLadderGame.tsx
8869
- var import_react53 = require("react");
9063
+ var import_react56 = require("react");
8870
9064
  var import_jsx_runtime87 = require("react/jsx-runtime");
8871
9065
  function ladderClue(ladder) {
8872
9066
  const mystery = ladder.find((r) => r.rank === 2);
@@ -8903,9 +9097,9 @@ function StatLadderGame({
8903
9097
  onBack
8904
9098
  }) {
8905
9099
  const t = ui.games.statLadder;
8906
- const [query, setQuery] = (0, import_react53.useState)("");
8907
- const [selectedId, setSelectedId] = (0, import_react53.useState)(null);
8908
- const searchId = (0, import_react53.useId)();
9100
+ const [query, setQuery] = (0, import_react56.useState)("");
9101
+ const [selectedId, setSelectedId] = (0, import_react56.useState)(null);
9102
+ const searchId = (0, import_react56.useId)();
8909
9103
  const clientState = parseClientState9(result?.clientStateJson);
8910
9104
  const revealed = clientState != null;
8911
9105
  const header = /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(GameHeader, { title: gameTitle({ gameId: "stat-ladder" }, ui.games.titles), eyebrow: t.eyebrow, onBack, backLabel: ui.back });
@@ -9111,8 +9305,8 @@ function GameScreenHost({
9111
9305
  ui
9112
9306
  }) {
9113
9307
  const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
9114
- const [configJson, setConfigJson] = (0, import_react54.useState)(null);
9115
- (0, import_react54.useEffect)(() => {
9308
+ const [configJson, setConfigJson] = (0, import_react57.useState)(null);
9309
+ (0, import_react57.useEffect)(() => {
9116
9310
  setConfigJson(null);
9117
9311
  if (!conversation) return;
9118
9312
  let cancelled = false;
@@ -9135,12 +9329,12 @@ function GameScreenHost({
9135
9329
  fixtureId: fixtureId || void 0,
9136
9330
  locale: ui.games.lang
9137
9331
  });
9138
- (0, import_react54.useEffect)(() => {
9332
+ (0, import_react57.useEffect)(() => {
9139
9333
  if (conversation) hydrate();
9140
9334
  }, [conversation, gameId]);
9141
- const hydrateRef = (0, import_react54.useRef)(hydrate);
9335
+ const hydrateRef = (0, import_react57.useRef)(hydrate);
9142
9336
  hydrateRef.current = hydrate;
9143
- (0, import_react54.useEffect)(() => {
9337
+ (0, import_react57.useEffect)(() => {
9144
9338
  if (!FIXTURE_GAME_IDS.has(gameId)) return;
9145
9339
  if (rawStatus !== "pending") return;
9146
9340
  const timerId = setInterval(() => {
@@ -9252,65 +9446,11 @@ function GameScreenHost({
9252
9446
  return /* @__PURE__ */ (0, import_jsx_runtime89.jsx)("div", { className: "ss-w-gscreen", "data-testid": "gscreen", "data-lock-at": lockAtUtc ?? void 0, children: renderScreen() });
9253
9447
  }
9254
9448
 
9255
- // src/components/games/ui/fonts.ts
9256
- var FONTS_LINK_ID = "ss-w-games-fonts";
9257
- var FONTS_HREF = "https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Barlow:wght@400;500;600;700&display=swap";
9258
- function ensureGamesFonts(doc = document) {
9259
- if (!doc.head) return;
9260
- if (doc.getElementById(FONTS_LINK_ID)) return;
9261
- const link = doc.createElement("link");
9262
- link.id = FONTS_LINK_ID;
9263
- link.rel = "stylesheet";
9264
- link.href = FONTS_HREF;
9265
- doc.head.appendChild(link);
9266
- }
9267
-
9268
- // src/components/GamesPanel.tsx
9269
- var import_jsx_runtime90 = require("react/jsx-runtime");
9270
- function GamesPanel({
9271
- loggedIn,
9272
- games,
9273
- ui,
9274
- conversation,
9275
- leaderboard,
9276
- refreshHub
9277
- }) {
9278
- const [selected, setSelected] = (0, import_react55.useState)(null);
9279
- (0, import_react55.useEffect)(() => {
9280
- ensureGamesFonts();
9281
- }, []);
9282
- if (!loggedIn) return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(GamesLoginWall, { ui });
9283
- if (selected !== null) {
9284
- return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
9285
- GameScreenHost,
9286
- {
9287
- selected,
9288
- onBack: () => {
9289
- setSelected(null);
9290
- refreshHub?.();
9291
- },
9292
- onPlayed: refreshHub,
9293
- conversation: conversation ?? null,
9294
- ui
9295
- }
9296
- ) });
9297
- }
9298
- return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("div", { className: "ss-g-hub-wrap", "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
9299
- GamesHub,
9300
- {
9301
- games,
9302
- onOpen: (g) => setSelected({ gameId: g.gameId, fixtureId: g.fixtureId, gameDay: g.gameDay, lockAtUtc: g.lockAtUtc ?? null }),
9303
- myWeeklyRow: leaderboard?.myWeeklyRow ?? null,
9304
- ui
9305
- }
9306
- ) });
9307
- }
9308
-
9309
9449
  // src/components/Leaderboard.tsx
9310
- var import_react56 = require("react");
9450
+ var import_react58 = require("react");
9311
9451
 
9312
9452
  // src/components/LeaderboardRow.tsx
9313
- var import_jsx_runtime91 = require("react/jsx-runtime");
9453
+ var import_jsx_runtime90 = require("react/jsx-runtime");
9314
9454
  function formatPoints(n) {
9315
9455
  return n.toLocaleString("en");
9316
9456
  }
@@ -9319,14 +9459,14 @@ function LeaderboardWeeklyRow({
9319
9459
  isMe
9320
9460
  }) {
9321
9461
  const rankClass = `ss-w-lb2-rank${row.rank <= 3 ? " ss-w-lb2-rank--top3" : ""}`;
9322
- return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
9323
- /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("span", { className: rankClass, children: [
9462
+ return /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
9463
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("span", { className: rankClass, children: [
9324
9464
  "#",
9325
9465
  row.rank
9326
9466
  ] }),
9327
- /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb2-handle", children: row.handle }),
9328
- /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
9329
- row.currentStreak > 0 && /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("span", { className: "ss-w-lb2-streak", children: [
9467
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { className: "ss-w-lb2-handle", children: row.handle }),
9468
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
9469
+ row.currentStreak > 0 && /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("span", { className: "ss-w-lb2-streak", children: [
9330
9470
  "\u{1F525} ",
9331
9471
  row.currentStreak
9332
9472
  ] })
@@ -9337,18 +9477,18 @@ function LeaderboardAllTimeRow({
9337
9477
  isMe
9338
9478
  }) {
9339
9479
  const rankClass = `ss-w-lb2-rank${row.rank <= 3 ? " ss-w-lb2-rank--top3" : ""}`;
9340
- return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
9341
- /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("span", { className: rankClass, children: [
9480
+ return /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
9481
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("span", { className: rankClass, children: [
9342
9482
  "#",
9343
9483
  row.rank
9344
9484
  ] }),
9345
- /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb2-handle", children: row.handle }),
9346
- /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
9485
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { className: "ss-w-lb2-handle", children: row.handle }),
9486
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
9347
9487
  ] });
9348
9488
  }
9349
9489
 
9350
9490
  // src/components/LeaderboardEmpty.tsx
9351
- var import_jsx_runtime92 = require("react/jsx-runtime");
9491
+ var import_jsx_runtime91 = require("react/jsx-runtime");
9352
9492
  function LeaderboardEmpty({
9353
9493
  segment,
9354
9494
  lastWeek,
@@ -9357,48 +9497,48 @@ function LeaderboardEmpty({
9357
9497
  ui
9358
9498
  }) {
9359
9499
  if (segment === "alltime") {
9360
- return /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { className: "ss-w-lb-empty ss-w-lb-empty--alltime", children: [
9361
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
9362
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
9500
+ return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: "ss-w-lb-empty ss-w-lb-empty--alltime", children: [
9501
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
9502
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
9363
9503
  ] });
9364
9504
  }
9365
9505
  const fresh = lastWeek != null;
9366
9506
  const title = fresh ? ui.leaderboardEmptyFreshTitle : ui.leaderboardEmptyColdTitle;
9367
9507
  const body = fresh ? ui.leaderboardEmptyFreshBody : ui.leaderboardEmptyColdBody;
9368
- return /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { className: "ss-w-lb-empty", children: [
9369
- weeklyPrize && /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { className: "ss-w-prize", children: [
9370
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
9371
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
9508
+ return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: "ss-w-lb-empty", children: [
9509
+ weeklyPrize && /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: "ss-w-prize", children: [
9510
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
9511
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
9372
9512
  ] }),
9373
- /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { className: "ss-w-lb-empty-hero", children: [
9374
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
9375
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("h4", { className: "ss-w-lb-empty-title", children: title }),
9376
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("p", { className: "ss-w-lb-empty-body", children: body }),
9377
- onPlay && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
9513
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: "ss-w-lb-empty-hero", children: [
9514
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
9515
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("h4", { className: "ss-w-lb-empty-title", children: title }),
9516
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("p", { className: "ss-w-lb-empty-body", children: body }),
9517
+ onPlay && /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
9378
9518
  ] }),
9379
- fresh && lastWeek && /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { className: "ss-w-lb-last", children: [
9380
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
9381
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
9382
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
9383
- /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
9519
+ fresh && lastWeek && /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: "ss-w-lb-last", children: [
9520
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
9521
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
9522
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
9523
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
9384
9524
  ] })
9385
9525
  ] });
9386
9526
  }
9387
9527
 
9388
9528
  // src/components/Leaderboard.tsx
9389
- var import_jsx_runtime93 = require("react/jsx-runtime");
9529
+ var import_jsx_runtime92 = require("react/jsx-runtime");
9390
9530
  function Leaderboard({
9391
9531
  data,
9392
9532
  ui,
9393
9533
  onPlay
9394
9534
  }) {
9395
- const [segment, setSegment] = (0, import_react56.useState)("weekly");
9535
+ const [segment, setSegment] = (0, import_react58.useState)("weekly");
9396
9536
  const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
9397
9537
  const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
9398
9538
  const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
9399
- return /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)("div", { className: "ss-w-lb2", children: [
9400
- /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)("div", { className: "ss-w-seg", children: [
9401
- /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
9539
+ return /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { className: "ss-w-lb2", children: [
9540
+ /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { className: "ss-w-seg", children: [
9541
+ /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
9402
9542
  "button",
9403
9543
  {
9404
9544
  type: "button",
@@ -9408,7 +9548,7 @@ function Leaderboard({
9408
9548
  children: ui.leaderboardThisWeek
9409
9549
  }
9410
9550
  ),
9411
- /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
9551
+ /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
9412
9552
  "button",
9413
9553
  {
9414
9554
  type: "button",
@@ -9419,7 +9559,7 @@ function Leaderboard({
9419
9559
  }
9420
9560
  )
9421
9561
  ] }),
9422
- isEmpty ? /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
9562
+ isEmpty ? /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
9423
9563
  LeaderboardEmpty,
9424
9564
  {
9425
9565
  segment,
@@ -9428,15 +9568,15 @@ function Leaderboard({
9428
9568
  onPlay,
9429
9569
  ui
9430
9570
  }
9431
- ) : /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(import_jsx_runtime93.Fragment, { children: [
9432
- /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
9571
+ ) : /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)(import_jsx_runtime92.Fragment, { children: [
9572
+ /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
9433
9573
  LeaderboardWeeklyRow,
9434
9574
  {
9435
9575
  row,
9436
9576
  isMe: row.operatorUserId === data.myWeeklyRow?.operatorUserId
9437
9577
  },
9438
9578
  row.operatorUserId
9439
- )) : data.allTimeTop.map((row) => /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
9579
+ )) : data.allTimeTop.map((row) => /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
9440
9580
  LeaderboardAllTimeRow,
9441
9581
  {
9442
9582
  row,
@@ -9444,18 +9584,18 @@ function Leaderboard({
9444
9584
  },
9445
9585
  row.operatorUserId
9446
9586
  )) }),
9447
- /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
9448
- myRow != null && (offBoard ? /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)("div", { className: "ss-w-lb2-rows", children: [
9449
- segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
9450
- segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
9587
+ /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
9588
+ myRow != null && (offBoard ? /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { className: "ss-w-lb2-rows", children: [
9589
+ segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
9590
+ segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
9451
9591
  ] })),
9452
- segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
9592
+ segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
9453
9593
  ] })
9454
9594
  ] });
9455
9595
  }
9456
9596
 
9457
9597
  // src/components/LeaderboardPanel.tsx
9458
- var import_jsx_runtime94 = require("react/jsx-runtime");
9598
+ var import_jsx_runtime93 = require("react/jsx-runtime");
9459
9599
  var EMPTY_PAYLOAD = {
9460
9600
  week: "",
9461
9601
  weeklyTop: [],
@@ -9466,19 +9606,216 @@ var EMPTY_PAYLOAD = {
9466
9606
  lastWeek: null
9467
9607
  };
9468
9608
  function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
9609
+ if (!loggedIn) return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(GamesLoginWall, { ui });
9610
+ if (data === null && loading) return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("div", { className: "ss-w-mon-list" });
9611
+ return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
9612
+ }
9613
+
9614
+ // src/components/games/ui/fonts.ts
9615
+ var FONTS_LINK_ID = "ss-w-games-fonts";
9616
+ var FONTS_HREF = "https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Barlow:wght@400;500;600;700&display=swap";
9617
+ function ensureGamesFonts(doc = document) {
9618
+ if (!doc.head) return;
9619
+ if (doc.getElementById(FONTS_LINK_ID)) return;
9620
+ const link = doc.createElement("link");
9621
+ link.id = FONTS_LINK_ID;
9622
+ link.rel = "stylesheet";
9623
+ link.href = FONTS_HREF;
9624
+ doc.head.appendChild(link);
9625
+ }
9626
+
9627
+ // src/components/GamesPanel.tsx
9628
+ var import_jsx_runtime94 = require("react/jsx-runtime");
9629
+ function GamesPanel({
9630
+ loggedIn,
9631
+ games,
9632
+ ui,
9633
+ conversation,
9634
+ leaderboard,
9635
+ leaderboardLoading,
9636
+ refreshHub
9637
+ }) {
9638
+ const [selected, setSelected] = (0, import_react59.useState)(null);
9639
+ const [segment, setSegment] = (0, import_react59.useState)("play");
9640
+ (0, import_react59.useEffect)(() => {
9641
+ ensureGamesFonts();
9642
+ }, []);
9469
9643
  if (!loggedIn) return /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(GamesLoginWall, { ui });
9470
- if (data === null && loading) return /* @__PURE__ */ (0, import_jsx_runtime94.jsx)("div", { className: "ss-w-mon-list" });
9471
- return /* @__PURE__ */ (0, import_jsx_runtime94.jsx)("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
9644
+ if (selected !== null) {
9645
+ return /* @__PURE__ */ (0, import_jsx_runtime94.jsx)("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
9646
+ GameScreenHost,
9647
+ {
9648
+ selected,
9649
+ onBack: () => {
9650
+ setSelected(null);
9651
+ refreshHub?.();
9652
+ },
9653
+ onPlayed: refreshHub,
9654
+ conversation: conversation ?? null,
9655
+ ui
9656
+ }
9657
+ ) });
9658
+ }
9659
+ return /* @__PURE__ */ (0, import_jsx_runtime94.jsxs)("div", { className: "ss-g-hub-wrap", lang: ui.games.lang, children: [
9660
+ /* @__PURE__ */ (0, import_jsx_runtime94.jsxs)("div", { className: "ss-w-seg", children: [
9661
+ /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
9662
+ "button",
9663
+ {
9664
+ type: "button",
9665
+ className: "ss-w-seg-btn",
9666
+ ...segment === "play" ? { "data-on": "" } : {},
9667
+ onClick: () => setSegment("play"),
9668
+ children: ui.gamesPlaySegment
9669
+ }
9670
+ ),
9671
+ /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
9672
+ "button",
9673
+ {
9674
+ type: "button",
9675
+ className: "ss-w-seg-btn",
9676
+ ...segment === "leaderboard" ? { "data-on": "" } : {},
9677
+ onClick: () => setSegment("leaderboard"),
9678
+ children: ui.tabLeaderboard
9679
+ }
9680
+ )
9681
+ ] }),
9682
+ segment === "play" ? /* @__PURE__ */ (0, import_jsx_runtime94.jsx)("div", { "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
9683
+ GamesHub,
9684
+ {
9685
+ games,
9686
+ onOpen: (g) => setSelected({ gameId: g.gameId, fixtureId: g.fixtureId, gameDay: g.gameDay, lockAtUtc: g.lockAtUtc ?? null }),
9687
+ myWeeklyRow: leaderboard?.myWeeklyRow ?? null,
9688
+ ui
9689
+ }
9690
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
9691
+ LeaderboardPanel,
9692
+ {
9693
+ loggedIn,
9694
+ data: leaderboard ?? null,
9695
+ loading: leaderboardLoading ?? false,
9696
+ onPlay: () => setSegment("play"),
9697
+ ui
9698
+ }
9699
+ )
9700
+ ] });
9472
9701
  }
9473
9702
 
9474
- // src/components/PresetSpeedDial.tsx
9475
- var import_react57 = require("react");
9703
+ // src/components/Fixtures.tsx
9476
9704
  var import_jsx_runtime95 = require("react/jsx-runtime");
9705
+ function groupByRound(fixtures) {
9706
+ const groups = [];
9707
+ for (const fx of fixtures) {
9708
+ const last = groups[groups.length - 1];
9709
+ if (last && last.round === fx.round) last.items.push(fx);
9710
+ else groups.push({ round: fx.round, items: [fx] });
9711
+ }
9712
+ return groups;
9713
+ }
9714
+ function Fixtures({ fixtures, loading, ui }) {
9715
+ if (fixtures.length === 0) {
9716
+ if (loading) return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("div", { className: "ss-w-mon-list" });
9717
+ return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("div", { className: "ss-w-mon-empty", children: ui.clubFixturesEmpty });
9718
+ }
9719
+ return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("div", { className: "ss-w-mon-list", children: groupByRound(fixtures).map((group, gi) => /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("div", { children: [
9720
+ group.round && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("div", { className: "ss-w-club-eyebrow", children: group.round }),
9721
+ group.items.map((fx) => {
9722
+ const played = fx.homeScore !== null && fx.awayScore !== null;
9723
+ const kickoff = fx.matchDateTime ? ui.bettingKickoff(fx.matchDateTime) : null;
9724
+ return /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("div", { className: "ss-w-mon", children: [
9725
+ /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("div", { className: "ss-w-mon-top", children: [
9726
+ fx.competitionName && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-comp", children: fx.competitionName }),
9727
+ !played && kickoff && /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("span", { className: "ss-w-mon-pill", children: [
9728
+ kickoff.dayLabel,
9729
+ " \xB7 ",
9730
+ kickoff.time
9731
+ ] })
9732
+ ] }),
9733
+ /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("div", { className: "ss-w-mon-main", children: [
9734
+ /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-side", children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-name", children: fx.homeTeamName }) }),
9735
+ played ? /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("span", { className: "ss-w-mon-score", children: [
9736
+ fx.homeScore,
9737
+ /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("i", { children: "-" }),
9738
+ fx.awayScore
9739
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-vs", children: "vs" }),
9740
+ /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-side ss-w-mon-side--away", children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-name", children: fx.awayTeamName }) })
9741
+ ] })
9742
+ ] }, fx.id);
9743
+ })
9744
+ ] }, `${gi}-${group.round ?? "none"}`)) });
9745
+ }
9746
+
9747
+ // src/components/Standings.tsx
9748
+ var import_jsx_runtime96 = require("react/jsx-runtime");
9749
+ function groupByTable(rows) {
9750
+ const groups = [];
9751
+ for (const row of rows) {
9752
+ const last = groups[groups.length - 1];
9753
+ if (last && last.table === row.table) last.items.push(row);
9754
+ else groups.push({ table: row.table, items: [row] });
9755
+ }
9756
+ return groups;
9757
+ }
9758
+ function Standings({ standings, loading, ui }) {
9759
+ if (standings === null && loading) return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-mon-list" });
9760
+ if (standings === null || standings.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-mon-empty", children: ui.clubStandingsEmpty });
9761
+ return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-mon-list", children: groupByTable(standings).map((group, gi) => /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("div", { className: "ss-w-table-wrap", children: [
9762
+ group.table && /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-club-eyebrow", children: group.table }),
9763
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("table", { className: "ss-w-md-table", children: [
9764
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("tr", { children: [
9765
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: "#" }),
9766
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColClub }),
9767
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColPlayed }),
9768
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColWon }),
9769
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColDrawn }),
9770
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColLost }),
9771
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColGoalDiff }),
9772
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColPoints })
9773
+ ] }) }),
9774
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("tbody", { children: group.items.map((row) => /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("tr", { children: [
9775
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.position }),
9776
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.teamName }),
9777
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.playedGames }),
9778
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.wins }),
9779
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.draws }),
9780
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.losses }),
9781
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.goalDifference }),
9782
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.points })
9783
+ ] }, row.teamId)) })
9784
+ ] })
9785
+ ] }, `${gi}-${group.table ?? "none"}`)) });
9786
+ }
9787
+
9788
+ // src/components/Squad.tsx
9789
+ var import_jsx_runtime97 = require("react/jsx-runtime");
9790
+ function groupByPosition(players) {
9791
+ const groups = [];
9792
+ for (const p of players) {
9793
+ const last = groups[groups.length - 1];
9794
+ if (last && last.positionName === p.positionName) last.items.push(p);
9795
+ else groups.push({ positionName: p.positionName, items: [p] });
9796
+ }
9797
+ return groups;
9798
+ }
9799
+ function Squad({ squad, loading, ui }) {
9800
+ if (squad === null && loading) return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)("div", { className: "ss-w-mon-list" });
9801
+ if (squad === null || squad.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)("div", { className: "ss-w-mon-empty", children: ui.clubSquadEmpty });
9802
+ return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)("div", { className: "ss-w-mon-list", children: groupByPosition(squad).map((group, gi) => /* @__PURE__ */ (0, import_jsx_runtime97.jsxs)("div", { children: [
9803
+ group.positionName && /* @__PURE__ */ (0, import_jsx_runtime97.jsx)("div", { className: "ss-w-club-eyebrow", children: group.positionName }),
9804
+ group.items.map((p) => /* @__PURE__ */ (0, import_jsx_runtime97.jsxs)("div", { className: "ss-w-sq-row", children: [
9805
+ /* @__PURE__ */ (0, import_jsx_runtime97.jsx)("span", { className: "ss-w-sq-num", children: p.jerseyNumber ?? "" }),
9806
+ /* @__PURE__ */ (0, import_jsx_runtime97.jsx)("span", { className: "ss-w-sq-name", children: p.playerName })
9807
+ ] }, p.playerId))
9808
+ ] }, `${gi}-${group.positionName ?? "none"}`)) });
9809
+ }
9810
+
9811
+ // src/components/PresetSpeedDial.tsx
9812
+ var import_react60 = require("react");
9813
+ var import_jsx_runtime98 = require("react/jsx-runtime");
9477
9814
  function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef, buttonRef }) {
9478
- const pillsId = (0, import_react57.useId)();
9815
+ const pillsId = (0, import_react60.useId)();
9479
9816
  const tabIndex = expanded ? 0 : -1;
9480
- return /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("div", { ref: rootRef, className: "ss-w-dial", children: [
9481
- /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)(
9817
+ return /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)("div", { ref: rootRef, className: "ss-w-dial", children: [
9818
+ /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)(
9482
9819
  "button",
9483
9820
  {
9484
9821
  ref: buttonRef,
@@ -9489,36 +9826,36 @@ function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef
9489
9826
  "aria-label": strings.dialName,
9490
9827
  onClick: onToggle,
9491
9828
  children: [
9492
- /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-dial-icon ss-w-dial-icon--open", children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(SlidersIcon, {}) }),
9493
- /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-dial-icon ss-w-dial-icon--close", children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(CloseIcon, {}) }),
9494
- showDot && !expanded ? /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-dial-dot", "aria-hidden": "true" }) : null
9829
+ /* @__PURE__ */ (0, import_jsx_runtime98.jsx)("span", { className: "ss-w-dial-icon ss-w-dial-icon--open", children: /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(SlidersIcon, {}) }),
9830
+ /* @__PURE__ */ (0, import_jsx_runtime98.jsx)("span", { className: "ss-w-dial-icon ss-w-dial-icon--close", children: /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(CloseIcon, {}) }),
9831
+ showDot && !expanded ? /* @__PURE__ */ (0, import_jsx_runtime98.jsx)("span", { className: "ss-w-dial-dot", "aria-hidden": "true" }) : null
9495
9832
  ]
9496
9833
  }
9497
9834
  ),
9498
- /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("div", { id: pillsId, className: "ss-w-dial-pills", "data-open": expanded ? "" : void 0, children: [
9499
- /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("numbers"), children: [
9500
- /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(SlidersIcon, {}),
9501
- /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-dial-pill-label", children: strings.setNumbers })
9835
+ /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)("div", { id: pillsId, className: "ss-w-dial-pills", "data-open": expanded ? "" : void 0, children: [
9836
+ /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("numbers"), children: [
9837
+ /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(SlidersIcon, {}),
9838
+ /* @__PURE__ */ (0, import_jsx_runtime98.jsx)("span", { className: "ss-w-dial-pill-label", children: strings.setNumbers })
9502
9839
  ] }),
9503
- /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("combo"), children: [
9504
- /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(ComboIcon, {}),
9505
- /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-dial-pill-label", children: strings.buildCombo })
9840
+ /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("combo"), children: [
9841
+ /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(ComboIcon, {}),
9842
+ /* @__PURE__ */ (0, import_jsx_runtime98.jsx)("span", { className: "ss-w-dial-pill-label", children: strings.buildCombo })
9506
9843
  ] })
9507
9844
  ] })
9508
9845
  ] });
9509
9846
  }
9510
9847
 
9511
9848
  // src/components/PresetTools.tsx
9512
- var import_react58 = require("react");
9513
- var import_jsx_runtime96 = require("react/jsx-runtime");
9849
+ var import_react61 = require("react");
9850
+ var import_jsx_runtime99 = require("react/jsx-runtime");
9514
9851
  var FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
9515
9852
  function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
9516
- const dialogRef = (0, import_react58.useRef)(null);
9517
- const titleId = (0, import_react58.useId)();
9518
- (0, import_react58.useEffect)(() => {
9853
+ const dialogRef = (0, import_react61.useRef)(null);
9854
+ const titleId = (0, import_react61.useId)();
9855
+ (0, import_react61.useEffect)(() => {
9519
9856
  dialogRef.current?.focus();
9520
9857
  }, []);
9521
- (0, import_react58.useEffect)(() => {
9858
+ (0, import_react61.useEffect)(() => {
9522
9859
  const onKey = (e) => {
9523
9860
  if (e.key !== "Escape") return;
9524
9861
  e.stopPropagation();
@@ -9548,79 +9885,79 @@ function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
9548
9885
  first.focus();
9549
9886
  }
9550
9887
  };
9551
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-tool-backdrop", children: /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("div", { ref: dialogRef, className: "ss-w-tool", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, onKeyDown: trapTab, children: [
9552
- /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("div", { className: "ss-w-tool-head", children: [
9553
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("h2", { id: titleId, className: "ss-w-tool-title", children: title }),
9554
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("button", { type: "button", className: "ss-w-tool-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(CloseIcon, {}) })
9888
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("div", { className: "ss-w-tool-backdrop", children: /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { ref: dialogRef, className: "ss-w-tool", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, onKeyDown: trapTab, children: [
9889
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { className: "ss-w-tool-head", children: [
9890
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("h2", { id: titleId, className: "ss-w-tool-title", children: title }),
9891
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("button", { type: "button", className: "ss-w-tool-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(CloseIcon, {}) })
9555
9892
  ] }),
9556
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-tool-body", children }),
9557
- footer ? /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-tool-foot", children: footer }) : null
9893
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("div", { className: "ss-w-tool-body", children }),
9894
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("div", { className: "ss-w-tool-foot", children: footer }) : null
9558
9895
  ] }) });
9559
9896
  }
9560
9897
  function fillTemplate(template, slots) {
9561
9898
  return template.split(/(\{[a-z]+\})/).filter((part) => part !== "").map((part, i) => {
9562
9899
  const key = /^\{([a-z]+)\}$/.exec(part)?.[1];
9563
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(import_react58.Fragment, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
9900
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(import_react61.Fragment, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
9564
9901
  });
9565
9902
  }
9566
9903
  function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
9567
9904
  const selected = Math.max(0, choices2.findIndex((c) => c.text === current));
9568
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("span", { className: "ss-w-tool-num", children: [
9569
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
9570
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(selected), onChange: (e) => {
9905
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("span", { className: "ss-w-tool-num", children: [
9906
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
9907
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(selected), onChange: (e) => {
9571
9908
  const c = choices2[Number(e.target.value)];
9572
9909
  if (c) onChoose(c.value);
9573
- }, children: choices2.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("option", { value: String(i), disabled: lockEmpty && !c.available && i !== selected, children: c.available ? c.text : `${c.text}${notToday}` }, i)) })
9910
+ }, children: choices2.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("option", { value: String(i), disabled: lockEmpty && !c.available && i !== selected, children: c.available ? c.text : `${c.text}${notToday}` }, i)) })
9574
9911
  ] });
9575
9912
  }
9576
9913
  function ChoiceSelect({ currentIdx, sizeLabels, optionLabels, label, onChoose }) {
9577
9914
  const sizeText = sizeLabels[currentIdx] ?? "";
9578
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("span", { className: "ss-w-tool-num", children: [
9579
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: sizeText }),
9580
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("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__ */ (0, import_jsx_runtime96.jsx)("option", { value: String(i), children: opt }, i)) })
9915
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("span", { className: "ss-w-tool-num", children: [
9916
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: sizeText }),
9917
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("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__ */ (0, import_jsx_runtime99.jsx)("option", { value: String(i), children: opt }, i)) })
9581
9918
  ] });
9582
9919
  }
9583
9920
  function SendButton({ label, display, disabled, onClick }) {
9584
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
9921
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
9585
9922
  }
9586
9923
  function PickList({ picks, formatKickoff }) {
9587
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("ul", { className: "ss-w-tool-picks", role: "list", children: picks.map((p) => /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("li", { className: "ss-w-tool-pick", children: [
9588
- /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("span", { className: "ss-w-tool-pick-match", children: [
9924
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("ul", { className: "ss-w-tool-picks", role: "list", children: picks.map((p) => /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("li", { className: "ss-w-tool-pick", children: [
9925
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("span", { className: "ss-w-tool-pick-match", children: [
9589
9926
  p.homeTeamName,
9590
9927
  " \u2013 ",
9591
9928
  p.awayTeamName
9592
9929
  ] }),
9593
- /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("span", { className: "ss-w-tool-pick-sel", children: [
9930
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("span", { className: "ss-w-tool-pick-sel", children: [
9594
9931
  p.marketLabel,
9595
9932
  ": ",
9596
9933
  p.selectionLabel,
9597
9934
  p.line ? ` ${p.line}` : ""
9598
9935
  ] }),
9599
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("span", { className: "ss-w-tool-pick-kick", children: formatKickoff(p.kickoffUtc) }),
9600
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("span", { className: "ss-w-tool-pick-price", children: p.price.toFixed(2) })
9936
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-pick-kick", children: formatKickoff(p.kickoffUtc) }),
9937
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-pick-price", children: p.price.toFixed(2) })
9601
9938
  ] }, p.matchOddsId)) });
9602
9939
  }
9603
9940
  function ComboPreview({ cell, formatKickoff }) {
9604
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(import_jsx_runtime96.Fragment, { children: [
9605
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(PickList, { picks: cell.combo.legs, formatKickoff }),
9606
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-tool-math", children: cell.combo.multiplication })
9941
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)(import_jsx_runtime99.Fragment, { children: [
9942
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(PickList, { picks: cell.combo.legs, formatKickoff }),
9943
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("div", { className: "ss-w-tool-math", children: cell.combo.multiplication })
9607
9944
  ] });
9608
9945
  }
9609
9946
  function Unavailable({ text }) {
9610
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("p", { className: "ss-w-tool-unavailable", children: text });
9947
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("p", { className: "ss-w-tool-unavailable", children: text });
9611
9948
  }
9612
9949
  function AskRow({ icon, ask, ready, send }) {
9613
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
9614
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
9615
- /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("div", { className: "ss-w-tool-main", children: [
9616
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("p", { className: "ss-w-tool-ask", children: ask }),
9617
- ready ? /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("span", { className: "ss-w-tool-ready", children: ready }) : null
9950
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
9951
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
9952
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { className: "ss-w-tool-main", children: [
9953
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("p", { className: "ss-w-tool-ask", children: ask }),
9954
+ ready ? /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-ready", children: ready }) : null
9618
9955
  ] }),
9619
9956
  send
9620
9957
  ] });
9621
9958
  }
9622
9959
  function RoundSend({ label, display, disabled, onClick }) {
9623
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(SendIcon, {}) });
9960
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(SendIcon, {}) });
9624
9961
  }
9625
9962
  var BIG_COMBO = { total: 50, legs: 6 };
9626
9963
  function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
@@ -9629,15 +9966,15 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
9629
9966
  const totals = comboTotals(grid);
9630
9967
  const legChoices = comboLegChoices(grid);
9631
9968
  const count = FIXED_SINGLES_COUNT;
9632
- const [maxPrice, setMaxPrice] = (0, import_react58.useState)(() => startSingles(grid.singles, limits, START.maxPrice, count));
9633
- const [minPrice, setMinPrice] = (0, import_react58.useState)(() => startSingles(grid.singlesFrom, floors, START.minPrice, count));
9634
- const [start] = (0, import_react58.useState)(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
9635
- const [total, setTotal] = (0, import_react58.useState)(start.total);
9636
- const [legs, setLegs] = (0, import_react58.useState)(start.legs);
9637
- const [bigStart] = (0, import_react58.useState)(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
9638
- const [bigTotal, setBigTotal] = (0, import_react58.useState)(bigStart.total);
9639
- const [bigLegs, setBigLegs] = (0, import_react58.useState)(bigStart.legs);
9640
- const [announcement, setAnnouncement] = (0, import_react58.useState)("");
9969
+ const [maxPrice, setMaxPrice] = (0, import_react61.useState)(() => startSingles(grid.singles, limits, START.maxPrice, count));
9970
+ const [minPrice, setMinPrice] = (0, import_react61.useState)(() => startSingles(grid.singlesFrom, floors, START.minPrice, count));
9971
+ const [start] = (0, import_react61.useState)(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
9972
+ const [total, setTotal] = (0, import_react61.useState)(start.total);
9973
+ const [legs, setLegs] = (0, import_react61.useState)(start.legs);
9974
+ const [bigStart] = (0, import_react61.useState)(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
9975
+ const [bigTotal, setBigTotal] = (0, import_react61.useState)(bigStart.total);
9976
+ const [bigLegs, setBigLegs] = (0, import_react61.useState)(bigStart.legs);
9977
+ const [announcement, setAnnouncement] = (0, import_react61.useState)("");
9641
9978
  const maxCell = findSingles(grid.singles, maxPrice, count);
9642
9979
  const minCell = findSingles(grid.singlesFrom, minPrice, count);
9643
9980
  const comboCell = findCombo(grid, total, legs);
@@ -9681,95 +10018,95 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
9681
10018
  const totalChoices = totals.map((v) => ({ value: v, text: v.toFixed(1), available: legChoices.some((n) => !!findCombo(grid, v, n)) }));
9682
10019
  const legChoicesFor = (t) => legChoices.map((n) => ({ value: n, text: String(n), available: !!findCombo(grid, t, n) }));
9683
10020
  const markets = grid.markets ?? [];
9684
- const [marketIdx, setMarketIdx] = (0, import_react58.useState)(0);
10021
+ const [marketIdx, setMarketIdx] = (0, import_react61.useState)(0);
9685
10022
  const marketCell = markets[marketIdx] ?? null;
9686
10023
  const marketLabels = markets.map((c) => strings.marketShort(c.marketDeveloperName, c.marketLabel, c.selectionLabel ?? null));
9687
10024
  const singlesReady = (cell) => cell ? strings.readyCount(cell.picks.length) : strings.unavailable;
9688
10025
  const comboReady = (cell) => cell ? strings.readyAt(cell.combo.total) : strings.unavailable;
9689
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
9690
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
10026
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
10027
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
9691
10028
  AskRow,
9692
10029
  {
9693
10030
  icon: "\u{1F3AF}",
9694
10031
  ask: fillTemplate(strings.maxPriceRow, {
9695
10032
  count: String(count),
9696
- price: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
10033
+ price: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
9697
10034
  }),
9698
10035
  ready: singlesReady(maxCell),
9699
- send: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
10036
+ send: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
9700
10037
  if (maxCell) onSend(maxPriceAsk(maxCell, strings));
9701
10038
  } })
9702
10039
  }
9703
10040
  ),
9704
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
10041
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
9705
10042
  AskRow,
9706
10043
  {
9707
10044
  icon: "\u{1F4C8}",
9708
10045
  ask: fillTemplate(strings.minPriceRow, {
9709
10046
  count: String(count),
9710
- price: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
10047
+ price: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
9711
10048
  }),
9712
10049
  ready: singlesReady(minCell),
9713
- send: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
10050
+ send: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
9714
10051
  if (minCell) onSend(minPriceAsk(minCell, strings));
9715
10052
  } })
9716
10053
  }
9717
10054
  ),
9718
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
10055
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
9719
10056
  AskRow,
9720
10057
  {
9721
10058
  icon: "\u2728",
9722
10059
  ask: fillTemplate(strings.comboRow, {
9723
- legs: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
9724
- total: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(NumberSelect, { current: total.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseTotal })
10060
+ legs: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
10061
+ total: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: total.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseTotal })
9725
10062
  }),
9726
10063
  ready: comboReady(comboCell),
9727
- send: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
10064
+ send: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
9728
10065
  if (comboCell) onSend(comboAsk(comboCell, strings));
9729
10066
  } })
9730
10067
  }
9731
10068
  ),
9732
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
10069
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
9733
10070
  AskRow,
9734
10071
  {
9735
10072
  icon: "\u{1F3C6}",
9736
10073
  ask: fillTemplate(strings.bigComboRow, {
9737
- legs: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
9738
- total: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(NumberSelect, { current: bigTotal.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseBigTotal })
10074
+ legs: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
10075
+ total: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: bigTotal.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseBigTotal })
9739
10076
  }),
9740
10077
  ready: comboReady(bigCell),
9741
- send: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
10078
+ send: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
9742
10079
  if (bigCell) onSend(comboAsk(bigCell, strings));
9743
10080
  } })
9744
10081
  }
9745
10082
  ),
9746
- markets.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
10083
+ markets.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
9747
10084
  AskRow,
9748
10085
  {
9749
10086
  icon: "\u26BD",
9750
10087
  ask: fillTemplate(strings.marketRow, {
9751
- market: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(ChoiceSelect, { currentIdx: marketIdx, sizeLabels: marketLabels, optionLabels: marketLabels, label: strings.marketName, onChoose: chooseMarket })
10088
+ market: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(ChoiceSelect, { currentIdx: marketIdx, sizeLabels: marketLabels, optionLabels: marketLabels, label: strings.marketName, onChoose: chooseMarket })
9752
10089
  }),
9753
10090
  ready: marketCell ? strings.readyCount(marketCell.count) : null,
9754
- send: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(RoundSend, { label: strings.send, display: marketCell ? marketDisplay(marketCell, strings) : "", disabled: !marketCell || streaming, onClick: () => {
10091
+ send: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(RoundSend, { label: strings.send, display: marketCell ? marketDisplay(marketCell, strings) : "", disabled: !marketCell || streaming, onClick: () => {
9755
10092
  if (marketCell) onSend(marketAsk(marketCell, strings));
9756
10093
  } })
9757
10094
  }
9758
10095
  ),
9759
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
10096
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
9760
10097
  ] });
9761
10098
  }
9762
10099
  function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal, initialLegs, onSend, onClose }) {
9763
10100
  const totals = comboTotals(grid);
9764
10101
  const legChoices = comboLegChoices(grid);
9765
- const [start] = (0, import_react58.useState)(() => initialTotal === void 0 ? startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs) : null);
9766
- const [total, setTotal] = (0, import_react58.useState)(() => initialTotal !== void 0 ? nearest(totals, initialTotal) : start.total);
9767
- const [legs, setLegs] = (0, import_react58.useState)(() => {
10102
+ const [start] = (0, import_react61.useState)(() => initialTotal === void 0 ? startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs) : null);
10103
+ const [total, setTotal] = (0, import_react61.useState)(() => initialTotal !== void 0 ? nearest(totals, initialTotal) : start.total);
10104
+ const [legs, setLegs] = (0, import_react61.useState)(() => {
9768
10105
  if (initialTotal === void 0) return initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : start.legs;
9769
10106
  const from = initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : startValue(legChoices, START.comboLegs);
9770
10107
  return legsForTotal(grid, nearest(totals, initialTotal), from);
9771
10108
  });
9772
- const [announcement, setAnnouncement] = (0, import_react58.useState)("");
10109
+ const [announcement, setAnnouncement] = (0, import_react61.useState)("");
9773
10110
  const cell = findCombo(grid, total, legs);
9774
10111
  const minLegs = legChoices[0] ?? legs;
9775
10112
  const maxLegs = legChoices[legChoices.length - 1] ?? legs;
@@ -9780,29 +10117,29 @@ function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal,
9780
10117
  const d = strings.comboDisplay(nextLegs, nextTotal);
9781
10118
  setAnnouncement(findCombo(grid, nextTotal, nextLegs) ? d : `${d}. ${strings.unavailable}`);
9782
10119
  };
9783
- const footer = /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(SendButton, { label: strings.send, display, disabled: !cell || streaming, onClick: () => {
10120
+ const footer = /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(SendButton, { label: strings.send, display, disabled: !cell || streaming, onClick: () => {
9784
10121
  if (cell) onSend(comboAsk(cell, strings));
9785
10122
  } });
9786
- return /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(PresetToolModal, { title: strings.buildCombo, closeLabel: strings.close, onClose, footer, children: [
9787
- /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.totalLabel, children: [
9788
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.totalLabel }),
9789
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-tool-chips", children: totals.map((t) => /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("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)) })
10123
+ return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)(PresetToolModal, { title: strings.buildCombo, closeLabel: strings.close, onClose, footer, children: [
10124
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.totalLabel, children: [
10125
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.totalLabel }),
10126
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("div", { className: "ss-w-tool-chips", children: totals.map((t) => /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("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)) })
9790
10127
  ] }),
9791
- /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.matchesLabel, children: [
9792
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.matchesLabel }),
9793
- /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("div", { className: "ss-w-tool-stepper", children: [
9794
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.fewerMatches, disabled: legs <= minLegs, onClick: () => choose(total, legs - 1), children: "\u2212" }),
9795
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("span", { className: "ss-w-tool-count", children: legs }),
9796
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.moreMatches, disabled: legs >= maxLegs, onClick: () => choose(total, legs + 1), children: "+" })
10128
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.matchesLabel, children: [
10129
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.matchesLabel }),
10130
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { className: "ss-w-tool-stepper", children: [
10131
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.fewerMatches, disabled: legs <= minLegs, onClick: () => choose(total, legs - 1), children: "\u2212" }),
10132
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-count", children: legs }),
10133
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.moreMatches, disabled: legs >= maxLegs, onClick: () => choose(total, legs + 1), children: "+" })
9797
10134
  ] })
9798
10135
  ] }),
9799
- cell ? /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(ComboPreview, { cell, formatKickoff }) : /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Unavailable, { text: strings.unavailable }),
9800
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
10136
+ cell ? /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(ComboPreview, { cell, formatKickoff }) : /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(Unavailable, { text: strings.unavailable }),
10137
+ /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
9801
10138
  ] });
9802
10139
  }
9803
10140
 
9804
10141
  // src/usePresetDial.ts
9805
- var import_react59 = require("react");
10142
+ var import_react62 = require("react");
9806
10143
  function sendInFlight(messages, isStreaming) {
9807
10144
  const last = messages[messages.length - 1];
9808
10145
  return isStreaming && !!last && last.role === "assistant" && !last.done && !last.isGreeting;
@@ -9816,25 +10153,25 @@ function lastUserId(messages) {
9816
10153
  }
9817
10154
  var SCROLL_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "PageUp", "PageDown", "Home", "End", " "]);
9818
10155
  function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming, activeTab }) {
9819
- const [expanded, setExpanded] = (0, import_react59.useState)(() => !sendInFlight(messages, isStreaming));
9820
- const fold = (0, import_react59.useCallback)(() => setExpanded(false), []);
9821
- const toggle = (0, import_react59.useCallback)(() => setExpanded((e) => !e), []);
10156
+ const [expanded, setExpanded] = (0, import_react62.useState)(() => !sendInFlight(messages, isStreaming));
10157
+ const fold = (0, import_react62.useCallback)(() => setExpanded(false), []);
10158
+ const toggle = (0, import_react62.useCallback)(() => setExpanded((e) => !e), []);
9822
10159
  const currentUserId = lastUserId(messages);
9823
- const userIdRef = (0, import_react59.useRef)(currentUserId);
9824
- (0, import_react59.useEffect)(() => {
10160
+ const userIdRef = (0, import_react62.useRef)(currentUserId);
10161
+ (0, import_react62.useEffect)(() => {
9825
10162
  if (currentUserId === userIdRef.current) return;
9826
10163
  userIdRef.current = currentUserId;
9827
10164
  setExpanded(false);
9828
10165
  }, [currentUserId]);
9829
- const tabRef = (0, import_react59.useRef)(activeTab);
9830
- (0, import_react59.useEffect)(() => {
10166
+ const tabRef = (0, import_react62.useRef)(activeTab);
10167
+ (0, import_react62.useEffect)(() => {
9831
10168
  if (activeTab === tabRef.current) return;
9832
10169
  tabRef.current = activeTab;
9833
10170
  setExpanded(false);
9834
10171
  }, [activeTab]);
9835
- const expandedRef = (0, import_react59.useRef)(expanded);
10172
+ const expandedRef = (0, import_react62.useRef)(expanded);
9836
10173
  expandedRef.current = expanded;
9837
- (0, import_react59.useEffect)(() => {
10174
+ (0, import_react62.useEffect)(() => {
9838
10175
  const onEscape = (e) => {
9839
10176
  const dial = dialRef.current;
9840
10177
  if (e.key !== "Escape" || !dial || !e.composedPath().includes(dial)) return;
@@ -9847,7 +10184,7 @@ function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming
9847
10184
  window.addEventListener("keydown", onEscape, true);
9848
10185
  return () => window.removeEventListener("keydown", onEscape, true);
9849
10186
  }, [dialRef, dialButtonRef]);
9850
- (0, import_react59.useEffect)(() => {
10187
+ (0, import_react62.useEffect)(() => {
9851
10188
  if (!expanded) return;
9852
10189
  const layer = layerRef.current;
9853
10190
  const inDial = (e) => {
@@ -9899,11 +10236,11 @@ function markToolSeen() {
9899
10236
  }
9900
10237
 
9901
10238
  // src/components/ChatPanel.tsx
9902
- var import_jsx_runtime97 = require("react/jsx-runtime");
10239
+ var import_jsx_runtime100 = require("react/jsx-runtime");
9903
10240
  var FULLSCREEN_QUERY = "(max-width: 639px)";
9904
10241
  function useIsModal() {
9905
- const [modal, setModal] = (0, import_react60.useState)(false);
9906
- (0, import_react60.useEffect)(() => {
10242
+ const [modal, setModal] = (0, import_react63.useState)(false);
10243
+ (0, import_react63.useEffect)(() => {
9907
10244
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
9908
10245
  const mql = window.matchMedia(FULLSCREEN_QUERY);
9909
10246
  const sync = () => setModal(mql.matches);
@@ -9914,10 +10251,10 @@ function useIsModal() {
9914
10251
  return modal;
9915
10252
  }
9916
10253
  var HIDDEN_LAYER_STYLE = { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" };
9917
- function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, loggedIn, conversation, presetGrid }) {
10254
+ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, clubFixturesResult, clubStandingsResult, clubSquadResult, loggedIn, conversation, presetGrid }) {
9918
10255
  const { state, close, stop, send, reset } = controller;
9919
10256
  const isModal = useIsModal();
9920
- (0, import_react60.useEffect)(() => {
10257
+ (0, import_react63.useEffect)(() => {
9921
10258
  const onKey = (e) => {
9922
10259
  if (e.key === "Escape") close();
9923
10260
  };
@@ -9933,19 +10270,19 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
9933
10270
  monitor?.setActiveTab("chat");
9934
10271
  send(text, { grounding });
9935
10272
  };
9936
- (0, import_react60.useEffect)(() => {
10273
+ (0, import_react63.useEffect)(() => {
9937
10274
  if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
9938
10275
  }, [monitor, state.isStreaming, state.messages.length]);
9939
10276
  const onChatTab = !monitor || monitor.activeTab === "chat";
9940
- const layerRef = (0, import_react60.useRef)(null);
9941
- const dialRef = (0, import_react60.useRef)(null);
9942
- const dialButtonRef = (0, import_react60.useRef)(null);
9943
- const inputRef = (0, import_react60.useRef)(null);
9944
- const limitRef = (0, import_react60.useRef)(null);
9945
- const typedSendRef = (0, import_react60.useRef)(false);
9946
- const focusAfterCloseRef = (0, import_react60.useRef)(null);
9947
- const [tool, setTool] = (0, import_react60.useState)(null);
9948
- const [toolSeen, setToolSeen] = (0, import_react60.useState)(readToolSeen);
10277
+ const layerRef = (0, import_react63.useRef)(null);
10278
+ const dialRef = (0, import_react63.useRef)(null);
10279
+ const dialButtonRef = (0, import_react63.useRef)(null);
10280
+ const inputRef = (0, import_react63.useRef)(null);
10281
+ const limitRef = (0, import_react63.useRef)(null);
10282
+ const typedSendRef = (0, import_react63.useRef)(false);
10283
+ const focusAfterCloseRef = (0, import_react63.useRef)(null);
10284
+ const [tool, setTool] = (0, import_react63.useState)(null);
10285
+ const [toolSeen, setToolSeen] = (0, import_react63.useState)(readToolSeen);
9949
10286
  const dial = usePresetDial({
9950
10287
  layerRef,
9951
10288
  dialRef,
@@ -9957,53 +10294,53 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
9957
10294
  const { fold } = dial;
9958
10295
  const paused = isPaused(state.limit);
9959
10296
  const showDial = !!presetGrid && onChatTab && !tool && !paused;
9960
- (0, import_react60.useEffect)(() => {
10297
+ (0, import_react63.useEffect)(() => {
9961
10298
  if (paused) setTool(null);
9962
10299
  }, [paused]);
9963
- (0, import_react60.useEffect)(() => {
10300
+ (0, import_react63.useEffect)(() => {
9964
10301
  if (!paused) return;
9965
10302
  if (typedSendRef.current) limitRef.current?.focus();
9966
10303
  typedSendRef.current = false;
9967
10304
  }, [paused]);
9968
- const openTool = (0, import_react60.useCallback)((next) => {
10305
+ const openTool = (0, import_react63.useCallback)((next) => {
9969
10306
  fold();
9970
10307
  markToolSeen();
9971
10308
  setToolSeen(true);
9972
10309
  setTool(next);
9973
10310
  }, [fold]);
9974
- const onPill = (0, import_react60.useCallback)((kind) => openTool(kind === "numbers" ? { kind: "numbers" } : { kind: "combo" }), [openTool]);
9975
- const toolsValue = (0, import_react60.useMemo)(
10311
+ const onPill = (0, import_react63.useCallback)((kind) => openTool(kind === "numbers" ? { kind: "numbers" } : { kind: "combo" }), [openTool]);
10312
+ const toolsValue = (0, import_react63.useMemo)(
9976
10313
  () => presetGrid && !paused ? { openBuilder: (total, legs) => openTool({ kind: "combo", total, legs }), changeLabel: ui.presets.changeCombo } : null,
9977
10314
  [presetGrid, paused, openTool, ui.presets.changeCombo]
9978
10315
  );
9979
- const closeTool = (0, import_react60.useCallback)(() => {
10316
+ const closeTool = (0, import_react63.useCallback)(() => {
9980
10317
  focusAfterCloseRef.current = "dial";
9981
10318
  setTool(null);
9982
10319
  }, []);
9983
- const sendAsk = (0, import_react60.useCallback)((ask) => {
10320
+ const sendAsk = (0, import_react63.useCallback)((ask) => {
9984
10321
  focusAfterCloseRef.current = "composer";
9985
10322
  setTool(null);
9986
10323
  monitor?.setActiveTab("chat");
9987
10324
  send(ask.message, { displayText: ask.displayText, preset: ask.preset });
9988
10325
  }, [monitor, send]);
9989
- const formatKickoff = (0, import_react60.useCallback)((kickoffUtc) => {
10326
+ const formatKickoff = (0, import_react63.useCallback)((kickoffUtc) => {
9990
10327
  const k = ui.bettingKickoff(kickoffUtc);
9991
10328
  return `${k.dayLabel} ${k.time}`;
9992
10329
  }, [ui]);
9993
- (0, import_react60.useEffect)(() => {
10330
+ (0, import_react63.useEffect)(() => {
9994
10331
  if (tool) return;
9995
10332
  const target = focusAfterCloseRef.current;
9996
10333
  focusAfterCloseRef.current = null;
9997
10334
  if (target === "dial") dialButtonRef.current?.focus();
9998
10335
  else if (target === "composer") inputRef.current?.focus();
9999
10336
  }, [tool]);
10000
- (0, import_react60.useEffect)(() => {
10337
+ (0, import_react63.useEffect)(() => {
10001
10338
  if (!tool || onChatTab && presetGrid) return;
10002
10339
  focusAfterCloseRef.current = "composer";
10003
10340
  setTool(null);
10004
10341
  }, [tool, onChatTab, presetGrid]);
10005
- return /* @__PURE__ */ (0, import_jsx_runtime97.jsxs)("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
10006
- /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
10342
+ return /* @__PURE__ */ (0, import_jsx_runtime100.jsxs)("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
10343
+ /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
10007
10344
  ChatHeader,
10008
10345
  {
10009
10346
  onClose: close,
@@ -10016,7 +10353,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10016
10353
  moreOptionsLabel: ui.moreOptions
10017
10354
  }
10018
10355
  ),
10019
- monitor && /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
10356
+ monitor && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
10020
10357
  TabBar,
10021
10358
  {
10022
10359
  monitor,
@@ -10025,12 +10362,13 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10025
10362
  oddsCount: monitor.pins.filter((p) => p.kind !== "match").length,
10026
10363
  todayCount: discovery?.liveCount ?? 0,
10027
10364
  hasToday: discovery ? visibleGroupsOf(discovery.groups, discovery.states).length > 0 : false,
10028
- gamesEnabled: gamesResult?.enabled ?? false
10365
+ gamesEnabled: gamesResult?.enabled ?? false,
10366
+ clubEnabled: clubFixturesResult?.enabled ?? false
10029
10367
  }
10030
10368
  ),
10031
- /* @__PURE__ */ (0, import_jsx_runtime97.jsxs)("div", { ref: layerRef, className: "ss-w-chat-layer", "data-dial": presetGrid ? "" : void 0, style: onChatTab ? void 0 : HIDDEN_LAYER_STYLE, children: [
10032
- /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(PresetToolsContext.Provider, { value: toolsValue, children: /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(MessageList, { controller, ui, slip, onDashboardTap, monitor }) }),
10033
- showDial ? /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
10369
+ /* @__PURE__ */ (0, import_jsx_runtime100.jsxs)("div", { ref: layerRef, className: "ss-w-chat-layer", "data-dial": presetGrid ? "" : void 0, style: onChatTab ? void 0 : HIDDEN_LAYER_STYLE, children: [
10370
+ /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(PresetToolsContext.Provider, { value: toolsValue, children: /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(MessageList, { controller, ui, slip, onDashboardTap, monitor }) }),
10371
+ showDial ? /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
10034
10372
  PresetSpeedDial,
10035
10373
  {
10036
10374
  expanded: dial.expanded,
@@ -10042,12 +10380,15 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10042
10380
  buttonRef: dialButtonRef
10043
10381
  }
10044
10382
  ) : null,
10045
- tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
10383
+ tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
10046
10384
  ] }),
10047
- monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(TodayPanel, { discovery, ui, monitor }),
10048
- monitor && monitor.activeTab === "following" && /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(MatchesPanel, { monitor, ui, slip, onAsk: paused ? void 0 : handleAsk }),
10049
- monitor && monitor.activeTab === "odds" && /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(OddsPanel, { monitor, ui, slip }),
10050
- monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
10385
+ monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(TodayPanel, { discovery, ui, monitor }),
10386
+ monitor && monitor.activeTab === "following" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(MatchesPanel, { monitor, ui, slip, onAsk: paused ? void 0 : handleAsk }),
10387
+ monitor && monitor.activeTab === "odds" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(OddsPanel, { monitor, ui, slip }),
10388
+ monitor && monitor.activeTab === "fixtures" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(Fixtures, { fixtures: clubFixturesResult?.fixtures ?? [], loading: clubFixturesResult?.loading ?? false, ui }),
10389
+ monitor && monitor.activeTab === "standings" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(Standings, { standings: clubStandingsResult?.data ?? null, loading: clubStandingsResult?.loading ?? false, ui }),
10390
+ monitor && monitor.activeTab === "squad" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(Squad, { squad: clubSquadResult?.data ?? null, loading: clubSquadResult?.loading ?? false, ui }),
10391
+ monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
10051
10392
  GamesPanel,
10052
10393
  {
10053
10394
  loggedIn: !!loggedIn,
@@ -10055,25 +10396,16 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10055
10396
  ui,
10056
10397
  conversation,
10057
10398
  leaderboard: leaderboardResult?.data ?? null,
10399
+ leaderboardLoading: leaderboardResult?.loading ?? false,
10058
10400
  refreshHub: () => {
10059
10401
  gamesResult.refresh();
10060
10402
  leaderboardResult?.refresh();
10061
10403
  }
10062
10404
  }
10063
10405
  ),
10064
- monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
10065
- LeaderboardPanel,
10066
- {
10067
- loggedIn: !!loggedIn,
10068
- data: leaderboardResult.data,
10069
- loading: leaderboardResult.loading,
10070
- onPlay: () => monitor.setActiveTab("games"),
10071
- ui
10072
- }
10073
- ),
10074
- (!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */ (0, import_jsx_runtime97.jsxs)(import_jsx_runtime97.Fragment, { children: [
10075
- /* @__PURE__ */ (0, import_jsx_runtime97.jsx)("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
10076
- paused ? null : /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
10406
+ (!monitor || monitor.activeTab !== "games") && /* @__PURE__ */ (0, import_jsx_runtime100.jsxs)(import_jsx_runtime100.Fragment, { children: [
10407
+ /* @__PURE__ */ (0, import_jsx_runtime100.jsx)("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
10408
+ paused ? null : /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
10077
10409
  ChatInput,
10078
10410
  {
10079
10411
  ref: inputRef,
@@ -10092,9 +10424,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
10092
10424
  }
10093
10425
 
10094
10426
  // src/components/HostEventsProvider.tsx
10095
- var import_jsx_runtime98 = require("react/jsx-runtime");
10427
+ var import_jsx_runtime101 = require("react/jsx-runtime");
10096
10428
  function HostEventsProvider({ value, children }) {
10097
- return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(SlipStateContext.Provider, { value: value.slipState, children });
10429
+ return /* @__PURE__ */ (0, import_jsx_runtime101.jsx)(SlipStateContext.Provider, { value: value.slipState, children });
10098
10430
  }
10099
10431
 
10100
10432
  // src/styles/css.generated.ts
@@ -11250,6 +11582,11 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
11250
11582
  .ss-w-mk-ctx-right { display: flex; align-items: center; gap: 6px; margin-left: auto; flex: none; }
11251
11583
  /* flex:1 keeps the composer pinned to the panel bottom when a tab is empty */
11252
11584
  .ss-w-mon-empty { flex: 1; padding: 24px 16px; text-align: center; font-size: 12.5px; color: var(--ss-w-faint); }
11585
+ /* shared group-header label for Club Fixtures (round) and Squad (position) list groups */
11586
+ .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; }
11587
+ .ss-w-sq-row { display: flex; align-items: center; gap: 10px; padding: 7px 2px; border-bottom: 1px solid var(--ss-w-line); }
11588
+ .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); }
11589
+ .ss-w-sq-name { font-size: 13px; font-weight: 600; color: var(--ss-w-ink); }
11253
11590
  /* Per-pin unavailable state: the pin's context line still rendered above (score, name, unpin), but
11254
11591
  the pin has neither a card nor history (compose-time rescue failed) -- a small inline note beats
11255
11592
  a bare context line with nothing under it. */
@@ -11853,7 +12190,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
11853
12190
  `;
11854
12191
 
11855
12192
  // src/StatsWidget.tsx
11856
- var import_jsx_runtime99 = require("react/jsx-runtime");
12193
+ var import_jsx_runtime102 = require("react/jsx-runtime");
11857
12194
  function buildClient(props) {
11858
12195
  try {
11859
12196
  if ("client" in props && props.client) {
@@ -11878,24 +12215,24 @@ function injectStyles(root) {
11878
12215
  function StatsWidget(props) {
11879
12216
  const injectedClient = "client" in props ? props.client : void 0;
11880
12217
  const cfg = props.config;
11881
- const built = (0, import_react61.useMemo)(() => buildClient(props), [injectedClient, cfg?.operatorId, cfg?.publicKey, cfg?.baseUrl]);
11882
- const logger = (0, import_react61.useMemo)(
12218
+ const built = (0, import_react64.useMemo)(() => buildClient(props), [injectedClient, cfg?.operatorId, cfg?.publicKey, cfg?.baseUrl]);
12219
+ const logger = (0, import_react64.useMemo)(
11883
12220
  () => built ? built.client.createEventLogger({
11884
12221
  operatorUserId: cfg?.userContext?.operatorUserId,
11885
12222
  anonymousUserId: cfg?.userContext?.anonymousUserId
11886
12223
  }) : null,
11887
12224
  [built?.client]
11888
12225
  );
11889
- const ui = (0, import_react61.useMemo)(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
11890
- const rootRef = (0, import_react61.useRef)(null);
11891
- const introDoneRef = (0, import_react61.useRef)(false);
11892
- const markIntroDone = (0, import_react61.useCallback)(() => {
12226
+ const ui = (0, import_react64.useMemo)(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
12227
+ const rootRef = (0, import_react64.useRef)(null);
12228
+ const introDoneRef = (0, import_react64.useRef)(false);
12229
+ const markIntroDone = (0, import_react64.useCallback)(() => {
11893
12230
  introDoneRef.current = true;
11894
12231
  }, []);
11895
12232
  const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
11896
12233
  const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
11897
- const [hasToday, setHasToday] = (0, import_react61.useState)(false);
11898
- const liveCardWatches = (0, import_react61.useMemo)(() => {
12234
+ const [hasToday, setHasToday] = (0, import_react64.useState)(false);
12235
+ const liveCardWatches = (0, import_react64.useMemo)(() => {
11899
12236
  const seen = /* @__PURE__ */ new Set();
11900
12237
  const out = [];
11901
12238
  for (const msg of controller.state.messages) {
@@ -11909,29 +12246,31 @@ function StatsWidget(props) {
11909
12246
  return out;
11910
12247
  }, [controller.state.messages]);
11911
12248
  const locale = cfg?.locale;
12249
+ const clubFixturesResult = useClubFixtures(built?.conversation ?? null);
11912
12250
  const monitor = useLiveMonitor({
11913
12251
  getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins, locale) : Promise.resolve(null),
11914
12252
  getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
11915
12253
  storageKey: `ss-w-pins:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`,
11916
12254
  isOpen: controller.state.isOpen,
11917
12255
  hasToday,
11918
- watches: liveCardWatches
12256
+ watches: liveCardWatches,
12257
+ clubEnabled: clubFixturesResult.enabled
11919
12258
  });
11920
12259
  const operatorUserId = cfg?.userContext?.operatorUserId;
11921
12260
  const anonymousUserId = cfg?.userContext?.anonymousUserId;
11922
- const getSchedule = (0, import_react61.useCallback)(
12261
+ const getSchedule = (0, import_react64.useCallback)(
11923
12262
  (localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes, operatorUserId, anonymousUserId) : Promise.resolve(null),
11924
12263
  [built, operatorUserId, anonymousUserId]
11925
12264
  );
11926
- const postLeagueStar = (0, import_react61.useCallback)(
12265
+ const postLeagueStar = (0, import_react64.useCallback)(
11927
12266
  (competitionId, starred) => built ? built.conversation.starLeague(competitionId, starred, operatorUserId, anonymousUserId) : Promise.resolve(null),
11928
12267
  [built, operatorUserId, anonymousUserId]
11929
12268
  );
11930
- const getStates = (0, import_react61.useCallback)(
12269
+ const getStates = (0, import_react64.useCallback)(
11931
12270
  (matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
11932
12271
  [built]
11933
12272
  );
11934
- const pinnedMatchIds = (0, import_react61.useMemo)(
12273
+ const pinnedMatchIds = (0, import_react64.useMemo)(
11935
12274
  () => monitor.pins.filter((p) => p.kind === "match").map((p) => p.matchId),
11936
12275
  [monitor.pins]
11937
12276
  );
@@ -11946,11 +12285,11 @@ function StatsWidget(props) {
11946
12285
  pinnedMatchIds
11947
12286
  });
11948
12287
  const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
11949
- (0, import_react61.useEffect)(() => {
12288
+ (0, import_react64.useEffect)(() => {
11950
12289
  setHasToday(todayHasContent);
11951
12290
  }, [todayHasContent]);
11952
- const prevLiveSnapshotRef = (0, import_react61.useRef)(monitor.snapshot);
11953
- (0, import_react61.useEffect)(() => {
12291
+ const prevLiveSnapshotRef = (0, import_react64.useRef)(monitor.snapshot);
12292
+ (0, import_react64.useEffect)(() => {
11954
12293
  const snap = monitor.snapshot;
11955
12294
  if (!snap || snap === prevLiveSnapshotRef.current) return;
11956
12295
  prevLiveSnapshotRef.current = snap;
@@ -11986,14 +12325,16 @@ function StatsWidget(props) {
11986
12325
  }, [monitor.snapshot]);
11987
12326
  const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
11988
12327
  const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
11989
- const getPricePresets = (0, import_react61.useCallback)(
12328
+ const clubStandingsResult = useClubStandings(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
12329
+ const clubSquadResult = useClubSquad(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
12330
+ const getPricePresets = (0, import_react64.useCallback)(
11990
12331
  (locale2) => built ? built.conversation.getPricePresets(locale2, { pool: "open" }) : Promise.resolve(null),
11991
12332
  [built]
11992
12333
  );
11993
12334
  const presetGrid = usePresetGrid({ getPricePresets, isOpen: controller.state.isOpen, locale: ui.presets.lang });
11994
12335
  const markTodayActivity = monitor.markTodayActivity;
11995
- const prevLiveCountRef = (0, import_react61.useRef)(0);
11996
- (0, import_react61.useEffect)(() => {
12336
+ const prevLiveCountRef = (0, import_react64.useRef)(0);
12337
+ (0, import_react64.useEffect)(() => {
11997
12338
  const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
11998
12339
  prevLiveCountRef.current = discovery.liveCount;
11999
12340
  if (rose) markTodayActivity();
@@ -12007,7 +12348,7 @@ function StatsWidget(props) {
12007
12348
  closePanel: controller.close
12008
12349
  });
12009
12350
  const markAdded = hostEvents.markAdded;
12010
- const slip = (0, import_react61.useMemo)(
12351
+ const slip = (0, import_react64.useMemo)(
12011
12352
  () => {
12012
12353
  const handler = props.config?.onAddToSlip;
12013
12354
  return {
@@ -12026,7 +12367,7 @@ function StatsWidget(props) {
12026
12367
  },
12027
12368
  [props.config?.onAddToSlip, controller.state.conversationId, markAdded]
12028
12369
  );
12029
- const onDashboardTap = (0, import_react61.useMemo)(
12370
+ const onDashboardTap = (0, import_react64.useMemo)(
12030
12371
  () => built ? createDashboardTapSignal((input) => built.conversation.sendSignal(input), logger) : void 0,
12031
12372
  [built, logger]
12032
12373
  );
@@ -12043,11 +12384,11 @@ function StatsWidget(props) {
12043
12384
  })
12044
12385
  }));
12045
12386
  const conversationId = controller.state.conversationId ?? void 0;
12046
- (0, import_react61.useEffect)(() => {
12387
+ (0, import_react64.useEffect)(() => {
12047
12388
  if (!logger) return;
12048
12389
  logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
12049
12390
  }, [logger, operatorUserId, anonymousUserId, conversationId]);
12050
- (0, import_react61.useEffect)(() => {
12391
+ (0, import_react64.useEffect)(() => {
12051
12392
  if (!logger) return;
12052
12393
  logger.resume();
12053
12394
  const onHide = () => {
@@ -12065,14 +12406,14 @@ function StatsWidget(props) {
12065
12406
  logger.dispose();
12066
12407
  };
12067
12408
  }, [logger]);
12068
- (0, import_react61.useEffect)(() => {
12409
+ (0, import_react64.useEffect)(() => {
12069
12410
  if (!built || !ui.injectStyles) return;
12070
12411
  const node = rootRef.current?.getRootNode();
12071
12412
  if (node) injectStyles(node);
12072
12413
  }, [built, ui.injectStyles]);
12073
12414
  if (!built) return null;
12074
12415
  const attrs = themeAttrs(ui);
12075
- return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(HostEventsProvider, { value: hostEvents, children: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("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__ */ (0, import_jsx_runtime99.jsx)(
12416
+ return /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(HostEventsProvider, { value: hostEvents, children: /* @__PURE__ */ (0, import_jsx_runtime102.jsx)("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__ */ (0, import_jsx_runtime102.jsx)(
12076
12417
  ChatPanel,
12077
12418
  {
12078
12419
  controller,
@@ -12083,11 +12424,14 @@ function StatsWidget(props) {
12083
12424
  discovery,
12084
12425
  gamesResult,
12085
12426
  leaderboardResult,
12427
+ clubFixturesResult,
12428
+ clubStandingsResult,
12429
+ clubSquadResult,
12086
12430
  loggedIn: !!operatorUserId,
12087
12431
  conversation: built?.conversation ?? null,
12088
12432
  presetGrid
12089
12433
  }
12090
- ) : /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
12434
+ ) : /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(
12091
12435
  ChatFab,
12092
12436
  {
12093
12437
  label: ui.launcherLabel,