@sensiblestats/widget-react 0.82.0 → 0.83.0

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