@sensiblestats/widget-react 0.98.0 → 0.99.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1099,7 +1099,7 @@ function isEnglishLocale(locale) {
1099
1099
  }
1100
1100
 
1101
1101
  // src/version.generated.ts
1102
- var WIDGET_REACT_VERSION = "0.98.0";
1102
+ var WIDGET_REACT_VERSION = "0.99.0";
1103
1103
 
1104
1104
  // src/config.ts
1105
1105
  function normalizeUi(cfg) {
@@ -2734,7 +2734,9 @@ function seedIdCounter(messages) {
2734
2734
  }
2735
2735
  return max + 1;
2736
2736
  }
2737
- function useChatStream(conversation, starterTexts, greetingMessage, storageKey) {
2737
+ var pageKey = (p) => p ? `${p.sport}|${p.kind ?? "section"}|${p.matchId ?? p.competitionId ?? ""}` : "";
2738
+ var REGREET_DEBOUNCE_MS = 300;
2739
+ function useChatStream(conversation, starterTexts, greetingMessage, storageKey, page) {
2738
2740
  const boot = useMemo2(() => {
2739
2741
  const payload = storageKey ? readConversation(storageKey, Date.now()) : null;
2740
2742
  const restored = payload != null && payload !== "expired" && payload !== "corrupt";
@@ -2752,6 +2754,10 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
2752
2754
  stateRef.current = state;
2753
2755
  const greetedRef = useRef3(boot.restored);
2754
2756
  const hydratedRef = useRef3(false);
2757
+ const pageRef = useRef3(page);
2758
+ pageRef.current = page;
2759
+ const greetedKeyRef = useRef3(null);
2760
+ const greetingCancelledRef = useRef3(false);
2755
2761
  const restoreSeededRef = useRef3(false);
2756
2762
  if (!restoreSeededRef.current) {
2757
2763
  restoreSeededRef.current = true;
@@ -2827,7 +2833,13 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
2827
2833
  handleRef.current?.cancel();
2828
2834
  clearFallbackTimer();
2829
2835
  dispatch({ kind: "GREETING_SENT", assistantId: nextId() });
2830
- const handle = conversation.send({ message, clientCapabilities: [...CLIENT_CAPABILITIES] });
2836
+ greetedKeyRef.current = pageKey(pageRef.current);
2837
+ greetingCancelledRef.current = false;
2838
+ const handle = conversation.send({
2839
+ message,
2840
+ clientCapabilities: [...CLIENT_CAPABILITIES],
2841
+ ...pageRef.current ? { page: pageRef.current } : {}
2842
+ });
2831
2843
  handleRef.current = handle;
2832
2844
  armFallbackTimer(() => dispatch({ kind: "STOP" }));
2833
2845
  consume(handle, () => dispatch({ kind: "STOP" }));
@@ -2840,6 +2852,24 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
2840
2852
  greetedRef.current = true;
2841
2853
  fireGreeting();
2842
2854
  }, [fireGreeting]);
2855
+ const key = pageKey(page);
2856
+ useEffect3(() => {
2857
+ if (greetedKeyRef.current === null) return;
2858
+ if (key === greetedKeyRef.current && !greetingCancelledRef.current) return;
2859
+ if (stateRef.current.messages.some((m) => m.role === "user")) return;
2860
+ if (key !== greetedKeyRef.current && handleRef.current) {
2861
+ handleRef.current.cancel();
2862
+ greetingCancelledRef.current = true;
2863
+ }
2864
+ const timer = setTimeout(() => {
2865
+ if (stateRef.current.messages.some((m) => m.role === "user")) return;
2866
+ idRef.current = 0;
2867
+ conversation.conversationId = void 0;
2868
+ dispatch({ kind: "RESET" });
2869
+ fireGreeting();
2870
+ }, REGREET_DEBOUNCE_MS);
2871
+ return () => clearTimeout(timer);
2872
+ }, [key, conversation, fireGreeting]);
2843
2873
  useEffect3(() => {
2844
2874
  if (!state.limit) return;
2845
2875
  const delay = limitDelayMs(state.limit, Date.now());
@@ -5964,15 +5994,34 @@ function ActionButtons({ actions, loading, disabled, onAct }) {
5964
5994
  }
5965
5995
 
5966
5996
  // src/components/dashboard/DashboardTile.tsx
5967
- import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
5997
+ import { Fragment as Fragment6, jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
5968
5998
  var MAX_CRESTS = 3;
5969
5999
  var ODDS_TAIL = /\s*·\s*@(\d+(?:\.\d+)?)\s*$/;
5970
6000
  function splitOdds(subtitle) {
5971
6001
  const m = ODDS_TAIL.exec(subtitle);
5972
6002
  return m ? { text: subtitle.slice(0, m.index), odds: m[1] } : { text: subtitle };
5973
6003
  }
6004
+ function codesOf(tile) {
6005
+ return (tile.imageCodes ?? []).filter(Boolean);
6006
+ }
6007
+ function Marks({ codes }) {
6008
+ return /* @__PURE__ */ jsx23(Fragment6, { children: codes.map((code, i) => /* @__PURE__ */ jsx23("span", { className: "ss-w-dash__mark", children: code }, `${code}-${i}`)) });
6009
+ }
6010
+ var KEEP_MAX = 16;
6011
+ function DotSeparated({ text }) {
6012
+ const parts = text.split(" \xB7 ");
6013
+ return /* @__PURE__ */ jsx23(Fragment6, { children: parts.map((part, i) => {
6014
+ const piece = i < parts.length - 1 ? `${part} \xB7` : part;
6015
+ return /* @__PURE__ */ jsxs19("span", { children: [
6016
+ i > 0 ? " " : null,
6017
+ part.length <= KEEP_MAX ? /* @__PURE__ */ jsx23("span", { className: "ss-w-dash__keep", children: piece }) : piece
6018
+ ] }, i);
6019
+ }) });
6020
+ }
6021
+ var keepDashWithHome = (title) => title.replace(/ - /g, "\xA0- ");
5974
6022
  function HeroTile({ tile, onTap, oddsLabel }) {
5975
6023
  const crests = (tile.imageUrls ?? []).filter(Boolean).slice(0, 2);
6024
+ const codes = crests.length === 0 ? codesOf(tile).slice(0, 2) : [];
5976
6025
  const sub = tile.subtitle ? splitOdds(tile.subtitle) : null;
5977
6026
  return /* @__PURE__ */ jsxs19("button", { type: "button", className: "ss-w-dash-tile ss-w-dash-tile--full ss-w-dash-hero", onClick: onTap, children: [
5978
6027
  /* @__PURE__ */ jsxs19("span", { className: "ss-w-dash-hero-top", children: [
@@ -5984,36 +6033,40 @@ function HeroTile({ tile, onTap, oddsLabel }) {
5984
6033
  ] }),
5985
6034
  sub.odds
5986
6035
  ] }) : null,
6036
+ !sub?.odds && tile.meta ? /* @__PURE__ */ jsx23("span", { className: "ss-w-dash__meta", children: /* @__PURE__ */ jsx23(DotSeparated, { text: tile.meta }) }) : null,
5987
6037
  /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-hero-chevron", children: /* @__PURE__ */ jsx23(ChevronIcon, {}) })
5988
6038
  ] }),
5989
6039
  /* @__PURE__ */ jsxs19("span", { className: "ss-w-dash-hero-main", children: [
5990
- /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-hero-visual", "aria-hidden": "true", children: crests.length > 0 ? crests.map((url, i) => /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-hero-crest", style: { backgroundImage: `url(${url})` } }, `${url}-${i}`)) : /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-hero-icon", children: /* @__PURE__ */ jsx23(DashboardIcon, { name: tile.icon }) }) }),
6040
+ /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-hero-visual", "aria-hidden": "true", children: crests.length > 0 ? crests.map((url, i) => /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-hero-crest", style: { backgroundImage: `url(${url})` } }, `${url}-${i}`)) : codes.length > 0 ? /* @__PURE__ */ jsx23(Marks, { codes }) : /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-hero-icon", children: /* @__PURE__ */ jsx23(DashboardIcon, { name: tile.icon }) }) }),
5991
6041
  /* @__PURE__ */ jsxs19("span", { className: "ss-w-dash-hero-body", children: [
5992
- /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-hero-title", children: tile.title }),
5993
- sub?.text ? /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-hero-subtitle", children: sub.text }) : null
6042
+ /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-hero-title", children: keepDashWithHome(tile.title) }),
6043
+ sub?.text ? /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-hero-subtitle", children: sub.text.includes(" \xB7 ") ? /* @__PURE__ */ jsx23(DotSeparated, { text: sub.text }) : sub.text }) : null
5994
6044
  ] })
5995
6045
  ] })
5996
6046
  ] });
5997
6047
  }
6048
+ var PRICE_BADGE = /^\d+(?:[.,]\d+)?$/;
5998
6049
  function DashboardTile({ tile, onTap, oddsLabel = "Odds", badgePlacement = "meta" }) {
5999
6050
  if (tile.emphasis === "hero") return /* @__PURE__ */ jsx23(HeroTile, { tile, onTap, oddsLabel });
6000
6051
  const spanClass = tile.span === "full" ? "ss-w-dash-tile--full" : "ss-w-dash-tile--half";
6001
6052
  const crests = (tile.imageUrls ?? []).slice(0, MAX_CRESTS);
6002
- const endBadge = badgePlacement === "end" && tile.badgeText ? tile.badgeText : null;
6053
+ const endBadge = badgePlacement === "end" && tile.badgeText && PRICE_BADGE.test(tile.badgeText.trim()) ? tile.badgeText : null;
6003
6054
  const metaBadge = endBadge ? null : tile.badgeText;
6004
- const hasMeta = Boolean(metaBadge) || crests.length > 0;
6055
+ const codes = crests.length === 0 ? codesOf(tile).slice(0, MAX_CRESTS) : [];
6056
+ const hasMeta = Boolean(metaBadge) || crests.length > 0 || codes.length > 0;
6005
6057
  return /* @__PURE__ */ jsxs19("button", { type: "button", className: `ss-w-dash-tile ${spanClass}`, onClick: onTap, children: [
6006
6058
  /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-tile-icon", children: /* @__PURE__ */ jsx23(DashboardIcon, { name: tile.icon }) }),
6007
6059
  /* @__PURE__ */ jsxs19("span", { className: "ss-w-dash-tile-body", children: [
6008
6060
  /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-tile-title", children: tile.title }),
6009
- tile.subtitle ? /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-tile-subtitle", children: tile.subtitle }) : null,
6061
+ tile.subtitle ? /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-tile-subtitle", children: tile.subtitle.includes(" \xB7 ") ? /* @__PURE__ */ jsx23(DotSeparated, { text: tile.subtitle }) : tile.subtitle }) : null,
6010
6062
  hasMeta ? (
6011
6063
  // Badge + crests sit on their own row, below the title, instead of sharing the
6012
6064
  // icon/chevron row -- at the half-span tile's ~180px width a nowrap badge alone
6013
6065
  // (~70px) left the title column at ~22px and forced character-by-character wrapping.
6014
6066
  /* @__PURE__ */ jsxs19("span", { className: "ss-w-dash-tile-meta", children: [
6015
6067
  metaBadge ? /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-tile-badge", children: metaBadge }) : null,
6016
- crests.length > 0 ? /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-tile-crests", children: crests.map((url, i) => /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-tile-crest", style: { backgroundImage: `url(${url})` }, "aria-hidden": "true" }, `${url}-${i}`)) }) : null
6068
+ crests.length > 0 ? /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-tile-crests", children: crests.map((url, i) => /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-tile-crest", style: { backgroundImage: `url(${url})` }, "aria-hidden": "true" }, `${url}-${i}`)) }) : null,
6069
+ codes.length > 0 ? /* @__PURE__ */ jsx23("span", { className: "ss-w-dash-tile-crests", "aria-hidden": "true", children: /* @__PURE__ */ jsx23(Marks, { codes }) }) : null
6017
6070
  ] })
6018
6071
  ) : null
6019
6072
  ] }),
@@ -6045,7 +6098,7 @@ function GreetingDashboard({ dashboard, onTap, oddsLabel }) {
6045
6098
  }
6046
6099
 
6047
6100
  // src/components/dashboard/FixtureCard.tsx
6048
- import { Fragment as Fragment6, jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
6101
+ import { Fragment as Fragment7, jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
6049
6102
  function teamFormResultClass(result) {
6050
6103
  if (result === "W") return "ss-w-fandash-teamform-cell--win";
6051
6104
  if (result === "L") return "ss-w-fandash-teamform-cell--loss";
@@ -6071,7 +6124,7 @@ function teamFormRows(data) {
6071
6124
  function FixtureCard({ card }) {
6072
6125
  const { data } = card;
6073
6126
  const h2h = data.h2H;
6074
- return /* @__PURE__ */ jsxs21(Fragment6, { children: [
6127
+ return /* @__PURE__ */ jsxs21(Fragment7, { children: [
6075
6128
  /* @__PURE__ */ jsxs21("div", { className: "ss-w-fandash-card ss-w-fandash-fixture", children: [
6076
6129
  /* @__PURE__ */ jsxs21("span", { className: "ss-w-fandash-eyebrow", children: [
6077
6130
  card.title,
@@ -6112,7 +6165,7 @@ function FixtureCard({ card }) {
6112
6165
  /* @__PURE__ */ jsx25("div", { className: "ss-w-fandash-teamform-rows", children: teamFormRows(data) })
6113
6166
  ] }),
6114
6167
  h2h || data.fact ? /* @__PURE__ */ jsxs21("div", { className: "ss-w-fandash-card ss-w-fandash-h2h", children: [
6115
- h2h ? /* @__PURE__ */ jsxs21(Fragment6, { children: [
6168
+ h2h ? /* @__PURE__ */ jsxs21(Fragment7, { children: [
6116
6169
  /* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-eyebrow", children: h2h.label }),
6117
6170
  /* @__PURE__ */ jsxs21("div", { className: "ss-w-fandash-split", children: [
6118
6171
  /* @__PURE__ */ jsxs21("span", { className: "ss-w-fandash-split-cell", children: [
@@ -6135,7 +6188,7 @@ function FixtureCard({ card }) {
6135
6188
  }
6136
6189
 
6137
6190
  // src/components/dashboard/CountdownCard.tsx
6138
- import { Fragment as Fragment7, useEffect as useEffect20, useState as useState25 } from "react";
6191
+ import { Fragment as Fragment8, useEffect as useEffect20, useState as useState25 } from "react";
6139
6192
  import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
6140
6193
  var DAY_MS = 864e5;
6141
6194
  function remainingSegments(kickoffUnix, nowMs, withSeconds) {
@@ -6167,7 +6220,7 @@ function CountdownCard({ card }) {
6167
6220
  const segments = remainingSegments(data.kickoffUnix, nowMs, withinDay && !reduced);
6168
6221
  return /* @__PURE__ */ jsx26("div", { className: "ss-w-fandash-card ss-w-fandash-countdown", children: /* @__PURE__ */ jsxs22("div", { className: "ss-w-fandash-countdown-top", children: [
6169
6222
  /* @__PURE__ */ jsx26("span", { className: "ss-w-fandash-eyebrow", children: card.title ?? "Kick-off in" }),
6170
- segments ? /* @__PURE__ */ jsx26("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ jsxs22(Fragment7, { children: [
6223
+ segments ? /* @__PURE__ */ jsx26("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ jsxs22(Fragment8, { children: [
6171
6224
  i > 0 ? /* @__PURE__ */ jsx26("span", { className: "ss-w-fandash-countdown-colon", children: ":" }) : null,
6172
6225
  /* @__PURE__ */ jsxs22("span", { className: "ss-w-fandash-countdown-seg", children: [
6173
6226
  /* @__PURE__ */ jsx26("span", { className: "ss-w-fandash-countdown-value", children: s.value }),
@@ -6543,7 +6596,7 @@ function useLiveClock(minute, clockRunning, receivedAtMs) {
6543
6596
  }
6544
6597
 
6545
6598
  // src/components/dashboard/LiveScoreCard.tsx
6546
- import { Fragment as Fragment8, jsx as jsx42, jsxs as jsxs38 } from "react/jsx-runtime";
6599
+ import { Fragment as Fragment9, jsx as jsx42, jsxs as jsxs38 } from "react/jsx-runtime";
6547
6600
  function initials5(name) {
6548
6601
  return name.trim().slice(0, 3).toUpperCase();
6549
6602
  }
@@ -6603,11 +6656,11 @@ function LiveScoreCard({
6603
6656
  ] })
6604
6657
  ] }),
6605
6658
  homeScorers || awayScorers ? /* @__PURE__ */ jsxs38("div", { className: "ss-w-fandash-live-scorers-row", children: [
6606
- /* @__PURE__ */ jsx42("div", { className: "ss-w-fandash-live-scorers ss-w-fandash-live-scorers--home", children: homeScorers ? /* @__PURE__ */ jsxs38(Fragment8, { children: [
6659
+ /* @__PURE__ */ jsx42("div", { className: "ss-w-fandash-live-scorers ss-w-fandash-live-scorers--home", children: homeScorers ? /* @__PURE__ */ jsxs38(Fragment9, { children: [
6607
6660
  /* @__PURE__ */ jsx42("span", { className: "ss-w-fandash-live-scorers-icon", "aria-hidden": "true", children: "\u26BD" }),
6608
6661
  homeScorers
6609
6662
  ] }) : null }),
6610
- /* @__PURE__ */ jsx42("div", { className: "ss-w-fandash-live-scorers ss-w-fandash-live-scorers--away", children: awayScorers ? /* @__PURE__ */ jsxs38(Fragment8, { children: [
6663
+ /* @__PURE__ */ jsx42("div", { className: "ss-w-fandash-live-scorers ss-w-fandash-live-scorers--away", children: awayScorers ? /* @__PURE__ */ jsxs38(Fragment9, { children: [
6611
6664
  awayScorers,
6612
6665
  /* @__PURE__ */ jsx42("span", { className: "ss-w-fandash-live-scorers-icon", "aria-hidden": "true", children: "\u26BD" })
6613
6666
  ] }) : null })
@@ -7207,7 +7260,7 @@ function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
7207
7260
 
7208
7261
  // src/components/MonitorFormH2H.tsx
7209
7262
  import { useState as useState33 } from "react";
7210
- import { Fragment as Fragment9, jsx as jsx54, jsxs as jsxs49 } from "react/jsx-runtime";
7263
+ import { Fragment as Fragment10, jsx as jsx54, jsxs as jsxs49 } from "react/jsx-runtime";
7211
7264
  function resultClass2(result) {
7212
7265
  if (result === "W") return "ss-w-h2h-result--win";
7213
7266
  if (result === "L") return "ss-w-h2h-result--loss";
@@ -7225,7 +7278,7 @@ function MonitorFormH2H({ formAndH2H, homeTeamName, awayTeamName, ui }) {
7225
7278
  const [expanded, setExpanded] = useState33(false);
7226
7279
  const { homeForm, awayForm, h2h, homeShortCode, awayShortCode } = formAndH2H;
7227
7280
  if (homeForm.length === 0 && awayForm.length === 0 && !h2h) {
7228
- return /* @__PURE__ */ jsx54(Fragment9, {});
7281
+ return /* @__PURE__ */ jsx54(Fragment10, {});
7229
7282
  }
7230
7283
  const homeLabel = homeShortCode || homeTeamName;
7231
7284
  const awayLabel = awayShortCode || awayTeamName;
@@ -7453,7 +7506,7 @@ function MonitorSkeleton({ pin, monitor, ui }) {
7453
7506
 
7454
7507
  // src/components/NbaPropsSection.tsx
7455
7508
  import { useEffect as useEffect25, useState as useState34 } from "react";
7456
- import { Fragment as Fragment10, jsx as jsx57, jsxs as jsxs52 } from "react/jsx-runtime";
7509
+ import { Fragment as Fragment11, jsx as jsx57, jsxs as jsxs52 } from "react/jsx-runtime";
7457
7510
  var STAT_ORDER = ["points", "rebounds", "assists", "threes"];
7458
7511
  var MAX_TIMER_MS = 2147483647;
7459
7512
  var GAME_VALUE = {
@@ -7570,7 +7623,7 @@ function Roster({ bundle, players, side, ui, slip }) {
7570
7623
  /* @__PURE__ */ jsx57("span", { className: "ss-w-props-name", children: p.name }),
7571
7624
  /* @__PURE__ */ jsx57("span", { className: "ss-w-props-meta", children: meta })
7572
7625
  ] }),
7573
- /* @__PURE__ */ jsx57("span", { className: "ss-w-props-main", children: main?.line != null ? /* @__PURE__ */ jsxs52(Fragment10, { children: [
7626
+ /* @__PURE__ */ jsx57("span", { className: "ss-w-props-main", children: main?.line != null ? /* @__PURE__ */ jsxs52(Fragment11, { children: [
7574
7627
  /* @__PURE__ */ jsx57("span", { className: "ss-w-props-stat", children: ui.nba.propsStatShort(main.stat) }),
7575
7628
  /* @__PURE__ */ jsx57("span", { className: "ss-w-props-line", children: ui.nba.lineText(String(main.line)) })
7576
7629
  ] }) : /* @__PURE__ */ jsx57("span", { className: "ss-w-props-stat", children: ui.nba.propsLadderOnly }) })
@@ -7613,7 +7666,7 @@ function NbaPropsSection({ match, monitor, ui, slip }) {
7613
7666
  }
7614
7667
 
7615
7668
  // src/components/NbaMonitorCard.tsx
7616
- import { Fragment as Fragment11, jsx as jsx58, jsxs as jsxs53 } from "react/jsx-runtime";
7669
+ import { Fragment as Fragment12, jsx as jsx58, jsxs as jsxs53 } from "react/jsx-runtime";
7617
7670
  var REGULATION_PERIODS = 4;
7618
7671
  function periodLabel(period) {
7619
7672
  if (period <= REGULATION_PERIODS) return `Q${period}`;
@@ -7682,7 +7735,7 @@ function NbaMonitorCard({ match, monitor, ui, slip }) {
7682
7735
  return /* @__PURE__ */ jsxs53("div", { className: "ss-w-mon-item", children: [
7683
7736
  /* @__PURE__ */ jsxs53("div", { className: "ss-w-mon", children: [
7684
7737
  /* @__PURE__ */ jsxs53("div", { className: "ss-w-mon-top", children: [
7685
- inPlay && /* @__PURE__ */ jsxs53(Fragment11, { children: [
7738
+ inPlay && /* @__PURE__ */ jsxs53(Fragment12, { children: [
7686
7739
  /* @__PURE__ */ jsxs53("span", { className: "ss-w-fandash-live-pill", children: [
7687
7740
  /* @__PURE__ */ jsx58("span", { className: "ss-w-fandash-live-dot", "aria-hidden": "true" }),
7688
7741
  ui.liveLabel
@@ -7709,7 +7762,7 @@ function NbaMonitorCard({ match, monitor, ui, slip }) {
7709
7762
  ] }) : /* @__PURE__ */ jsx58("span", { className: "ss-w-mon-vs", children: "@" }),
7710
7763
  /* @__PURE__ */ jsx58(Side, { abbreviation: b.homeAbbreviation, nickname: b.homeNickname, teamName: match.homeTeamName })
7711
7764
  ] }),
7712
- scored && /* @__PURE__ */ jsxs53(Fragment11, { children: [
7765
+ scored && /* @__PURE__ */ jsxs53(Fragment12, { children: [
7713
7766
  /* @__PURE__ */ jsxs53("table", { className: "ss-w-nbamon-ls", children: [
7714
7767
  /* @__PURE__ */ jsx58("thead", { children: /* @__PURE__ */ jsxs53("tr", { children: [
7715
7768
  /* @__PURE__ */ jsx58("th", {}),
@@ -7883,7 +7936,7 @@ function seedFor(pin, index, states, stale, now) {
7883
7936
  }
7884
7937
 
7885
7938
  // src/components/MonitorTabs.tsx
7886
- import { Fragment as Fragment12, jsx as jsx60, jsxs as jsxs55 } from "react/jsx-runtime";
7939
+ import { Fragment as Fragment13, jsx as jsx60, jsxs as jsxs55 } from "react/jsx-runtime";
7887
7940
  function OddsLiveStrip({ m, ui }) {
7888
7941
  const showScore = m.phase !== "preMatch" && typeof m.homeScore === "number";
7889
7942
  const stale = m.status === "stale";
@@ -7914,7 +7967,7 @@ function MatchesPanel({ monitor, ui, slip, onAsk, discovery }) {
7914
7967
  if (tiles.length === 0) return /* @__PURE__ */ jsx60("div", { className: "ss-w-mon-empty", children: ui.emptyMatchesTab });
7915
7968
  const selected = tiles.find((t) => t.pin.key === monitor.selectedMatchKey) ?? tiles[0];
7916
7969
  const m = selected.match;
7917
- return /* @__PURE__ */ jsxs55(Fragment12, { children: [
7970
+ return /* @__PURE__ */ jsxs55(Fragment13, { children: [
7918
7971
  tiles.filter((t) => t.match).length >= 2 && /* @__PURE__ */ jsx60(ScoreboardStrip, { tiles, selectedKey: selected.pin.key, onSelect: monitor.selectMatch, ui }),
7919
7972
  /* @__PURE__ */ jsxs55("div", { className: "ss-w-mon-list", children: [
7920
7973
  !m && /* @__PURE__ */ jsx60(MonitorSkeleton, { pin: selected.pin, monitor, ui }),
@@ -8398,7 +8451,7 @@ function SearchField({ id, label, labelHidden = false, placeholder, value, onCha
8398
8451
  }
8399
8452
 
8400
8453
  // src/components/TodayPanel.tsx
8401
- import { Fragment as Fragment13, jsx as jsx67, jsxs as jsxs61 } from "react/jsx-runtime";
8454
+ import { Fragment as Fragment14, jsx as jsx67, jsxs as jsxs61 } from "react/jsx-runtime";
8402
8455
  function TodayPanel({ discovery, ui, monitor }) {
8403
8456
  const { groups, states, stale, starLeague } = discovery;
8404
8457
  const searchId = useId2();
@@ -8455,7 +8508,7 @@ function TodayPanel({ discovery, ui, monitor }) {
8455
8508
  if (selectedCompetitionId !== null && openGroup === void 0) setSelectedCompetitionId(null);
8456
8509
  }, [selectedCompetitionId, openGroup]);
8457
8510
  const liveRows = stale ? [] : visibleGroups.flatMap((group) => group.matches.filter((m) => isTreatedLive(states.get(matchKey7(m.sport, m.matchId)), stale)).map((match) => ({ match, rank: group.rank }))).sort((a, b) => a.rank - b.rank);
8458
- const liveBand = liveRows.length > 0 && /* @__PURE__ */ jsxs61(Fragment13, { children: [
8511
+ const liveBand = liveRows.length > 0 && /* @__PURE__ */ jsxs61(Fragment14, { children: [
8459
8512
  /* @__PURE__ */ jsxs61("div", { className: "ss-w-sec-head", children: [
8460
8513
  /* @__PURE__ */ jsx67("span", { className: "ss-w-sec-dot", "aria-hidden": "true" }),
8461
8514
  ui.sectionLive
@@ -8513,7 +8566,7 @@ function TodayPanel({ discovery, ui, monitor }) {
8513
8566
  clearLabel: ui.clearSearchLabel
8514
8567
  }
8515
8568
  ),
8516
- searching ? searchResults.length === 0 ? /* @__PURE__ */ jsx67("div", { className: "ss-w-today-empty", children: ui.noLeagueResults }) : /* @__PURE__ */ jsx67(Fragment13, { children: searchResults.map((group) => /* @__PURE__ */ jsxs61("div", { className: "ss-w-today-search-block", children: [
8569
+ searching ? searchResults.length === 0 ? /* @__PURE__ */ jsx67("div", { className: "ss-w-today-empty", children: ui.noLeagueResults }) : /* @__PURE__ */ jsx67(Fragment14, { children: searchResults.map((group) => /* @__PURE__ */ jsxs61("div", { className: "ss-w-today-search-block", children: [
8517
8570
  /* @__PURE__ */ jsxs61("div", { className: "ss-w-today-search-group", children: [
8518
8571
  /* @__PURE__ */ jsx67(Crest2, { url: group.competitionImagePath ?? void 0, name: group.competitionName, kind: "comp" }),
8519
8572
  /* @__PURE__ */ jsxs61("span", { className: "ss-w-today-search-group-name", children: [
@@ -8552,7 +8605,7 @@ function TodayPanel({ discovery, ui, monitor }) {
8552
8605
  },
8553
8606
  matchKey7(match.sport, match.matchId)
8554
8607
  ))
8555
- ] }, group.competitionId)) }) : /* @__PURE__ */ jsxs61(Fragment13, { children: [
8608
+ ] }, group.competitionId)) }) : /* @__PURE__ */ jsxs61(Fragment14, { children: [
8556
8609
  /* @__PURE__ */ jsxs61("div", { className: "ss-w-today-sec", children: [
8557
8610
  placement.personal ? ui.yourLeagues : ui.topLeagues,
8558
8611
  !placement.personal && /* @__PURE__ */ jsx67("span", { className: "ss-w-today-sec-sub", children: ui.topLeaguesSub })
@@ -8632,7 +8685,7 @@ function splitName(full) {
8632
8685
  }
8633
8686
 
8634
8687
  // src/components/GameTileArt.tsx
8635
- import { Fragment as Fragment14, jsx as jsx69, jsxs as jsxs62 } from "react/jsx-runtime";
8688
+ import { Fragment as Fragment15, jsx as jsx69, jsxs as jsxs62 } from "react/jsx-runtime";
8636
8689
  function GameTileArt({ gameId }) {
8637
8690
  return /* @__PURE__ */ jsx69("svg", { className: "ss-g-art", viewBox: "0 0 120 74", "aria-hidden": "true", children: ART[gameId] ?? ART.default });
8638
8691
  }
@@ -8641,41 +8694,41 @@ var head = (cx, cy, r, cls = "ss-g-art-fg") => /* @__PURE__ */ jsxs62("g", { cla
8641
8694
  /* @__PURE__ */ jsx69("path", { d: `M${cx - r} ${cy + r}c0-${r * 0.8} ${r * 0.45}-${r * 1.1} ${r}-${r * 1.1}s${r} ${r * 0.3} ${r} ${r * 1.1}z` })
8642
8695
  ] });
8643
8696
  var ART = {
8644
- "mystery-tiger": /* @__PURE__ */ jsxs62(Fragment14, { children: [
8697
+ "mystery-tiger": /* @__PURE__ */ jsxs62(Fragment15, { children: [
8645
8698
  head(60, 38, 26, "ss-g-art-fg"),
8646
8699
  /* @__PURE__ */ jsx69("text", { x: "60", y: "36", className: "ss-g-art-q", textAnchor: "middle", children: "?" })
8647
8700
  ] }),
8648
- "higher-or-lower": /* @__PURE__ */ jsxs62(Fragment14, { children: [
8701
+ "higher-or-lower": /* @__PURE__ */ jsxs62(Fragment15, { children: [
8649
8702
  head(32, 38, 20),
8650
8703
  head(88, 38, 20),
8651
8704
  /* @__PURE__ */ jsx69("circle", { cx: "60", cy: "37", r: "11", className: "ss-g-art-accent" }),
8652
8705
  /* @__PURE__ */ jsx69("path", { d: "M57 33l3-3 3 3M57 41l3 3 3-3", className: "ss-g-art-ink" })
8653
8706
  ] }),
8654
- "guess-the-xi": /* @__PURE__ */ jsxs62(Fragment14, { children: [
8707
+ "guess-the-xi": /* @__PURE__ */ jsxs62(Fragment15, { children: [
8655
8708
  /* @__PURE__ */ jsx69("rect", { x: "8", y: "4", width: "104", height: "66", rx: "6", className: "ss-g-art-pitch" }),
8656
8709
  [[60, 60, "a"], [24, 46], [48, 46], [72, 46], [96, 46], [36, 30], [60, 30], [84, 30], [40, 14], [60, 14], [80, 14]].map(([x, y, a], i) => /* @__PURE__ */ jsx69("circle", { cx: x, cy: y, r: "4", className: a ? "ss-g-art-accent" : "ss-g-art-dot" }, i))
8657
8710
  ] }),
8658
- "daily-quiz": /* @__PURE__ */ jsx69(Fragment14, { children: [[14, 8], [62, 8], [14, 40], [62, 40]].map(([x, y], i) => /* @__PURE__ */ jsx69("rect", { x, y, width: "44", height: "26", rx: "5", className: i === 1 ? "ss-g-art-correct" : "ss-g-art-block" }, i)) }),
8659
- "career-path": /* @__PURE__ */ jsxs62(Fragment14, { children: [
8711
+ "daily-quiz": /* @__PURE__ */ jsx69(Fragment15, { children: [[14, 8], [62, 8], [14, 40], [62, 40]].map(([x, y], i) => /* @__PURE__ */ jsx69("rect", { x, y, width: "44", height: "26", rx: "5", className: i === 1 ? "ss-g-art-correct" : "ss-g-art-block" }, i)) }),
8712
+ "career-path": /* @__PURE__ */ jsxs62(Fragment15, { children: [
8660
8713
  /* @__PURE__ */ jsx69("path", { d: "M18 22h24v10c0 7-5 11-12 13-7-2-12-6-12-13z", className: "ss-g-art-fg" }),
8661
8714
  /* @__PURE__ */ jsx69("path", { d: "M48 37h8M84 37h8", className: "ss-g-art-line" }),
8662
8715
  /* @__PURE__ */ jsx69("path", { d: "M60 22h24v10c0 7-5 11-12 13-7-2-12-6-12-13z", className: "ss-g-art-fg" }),
8663
8716
  /* @__PURE__ */ jsx69("rect", { x: "96", y: "22", width: "18", height: "26", rx: "4", className: "ss-g-art-dash" }),
8664
8717
  /* @__PURE__ */ jsx69("text", { x: "105", y: "40", className: "ss-g-art-q", textAnchor: "middle", children: "?" })
8665
8718
  ] }),
8666
- "beat-the-grid": /* @__PURE__ */ jsx69(Fragment14, { children: [0, 1, 2].flatMap((r) => [0, 1, 2].map((c) => /* @__PURE__ */ jsx69("rect", { x: 33 + c * 19, y: 10 + r * 19, width: "16", height: "16", rx: "3", className: (r + c) % 3 === 0 ? "ss-g-art-accent" : "ss-g-art-block" }, `${r}${c}`))) }),
8667
- "matchday-predictor": /* @__PURE__ */ jsxs62(Fragment14, { children: [
8719
+ "beat-the-grid": /* @__PURE__ */ jsx69(Fragment15, { children: [0, 1, 2].flatMap((r) => [0, 1, 2].map((c) => /* @__PURE__ */ jsx69("rect", { x: 33 + c * 19, y: 10 + r * 19, width: "16", height: "16", rx: "3", className: (r + c) % 3 === 0 ? "ss-g-art-accent" : "ss-g-art-block" }, `${r}${c}`))) }),
8720
+ "matchday-predictor": /* @__PURE__ */ jsxs62(Fragment15, { children: [
8668
8721
  /* @__PURE__ */ jsx69("path", { d: "M10 20h20v9c0 6-4 9-10 11-6-2-10-5-10-11z", className: "ss-g-art-fg" }),
8669
8722
  /* @__PURE__ */ jsx69("rect", { x: "38", y: "22", width: "18", height: "24", rx: "4", className: "ss-g-art-accent-stroke" }),
8670
8723
  /* @__PURE__ */ jsx69("rect", { x: "64", y: "22", width: "18", height: "24", rx: "4", className: "ss-g-art-dash" }),
8671
8724
  /* @__PURE__ */ jsx69("path", { d: "M90 20h20v9c0 6-4 9-10 11-6-2-10-5-10-11z", className: "ss-g-art-fg" })
8672
8725
  ] }),
8673
- "starting-xi": /* @__PURE__ */ jsxs62(Fragment14, { children: [
8726
+ "starting-xi": /* @__PURE__ */ jsxs62(Fragment15, { children: [
8674
8727
  /* @__PURE__ */ jsx69("rect", { x: "8", y: "4", width: "104", height: "66", rx: "6", className: "ss-g-art-pitch" }),
8675
8728
  [[60, 60], [30, 46], [50, 46], [70, 46], [90, 46], [45, 30], [75, 30], [30, 16], [60, 16], [90, 16]].map(([x, y], i) => /* @__PURE__ */ jsx69("circle", { cx: x, cy: y, r: "5", className: i < 7 ? "ss-g-art-accent" : "ss-g-art-dash" }, i))
8676
8729
  ] }),
8677
- "stat-ladder": /* @__PURE__ */ jsx69(Fragment14, { children: [[20, 70], [34, 52], [48, 34]].map(([y, w], i) => /* @__PURE__ */ jsx69("rect", { x: "24", y, width: w, height: "12", rx: "3", className: i === 1 ? "ss-g-art-accent" : "ss-g-art-block" }, i)) }),
8678
- "fan-motm": /* @__PURE__ */ jsxs62(Fragment14, { children: [
8730
+ "stat-ladder": /* @__PURE__ */ jsx69(Fragment15, { children: [[20, 70], [34, 52], [48, 34]].map(([y, w], i) => /* @__PURE__ */ jsx69("rect", { x: "24", y, width: w, height: "12", rx: "3", className: i === 1 ? "ss-g-art-accent" : "ss-g-art-block" }, i)) }),
8731
+ "fan-motm": /* @__PURE__ */ jsxs62(Fragment15, { children: [
8679
8732
  /* @__PURE__ */ jsx69("circle", { cx: "60", cy: "37", r: "26", className: "ss-g-art-accent-stroke" }),
8680
8733
  head(60, 40, 18),
8681
8734
  /* @__PURE__ */ jsx69("path", { d: "M84 8l2.4 5 5.4.6-4 3.7 1.1 5.4-4.9-2.7-4.9 2.7 1.1-5.4-4-3.7 5.4-.6z", className: "ss-g-art-accent" })
@@ -8699,7 +8752,7 @@ function StatStack({ value, label }) {
8699
8752
  }
8700
8753
 
8701
8754
  // src/components/GameTile.tsx
8702
- import { Fragment as Fragment15, jsx as jsx71, jsxs as jsxs64 } from "react/jsx-runtime";
8755
+ import { Fragment as Fragment16, jsx as jsx71, jsxs as jsxs64 } from "react/jsx-runtime";
8703
8756
  function tileStatus(game, ui) {
8704
8757
  switch (game.status) {
8705
8758
  case "locked":
@@ -8723,7 +8776,7 @@ function GameTile({ game, onOpen, ui, variant = "tile" }) {
8723
8776
  const status = tileStatus(game, ui);
8724
8777
  const disabled = DISABLED.has(game.status);
8725
8778
  const title = gameTitle(game, ui.games.titles);
8726
- const body = variant === "hero" ? /* @__PURE__ */ jsxs64(Fragment15, { children: [
8779
+ const body = variant === "hero" ? /* @__PURE__ */ jsxs64(Fragment16, { children: [
8727
8780
  /* @__PURE__ */ jsxs64("span", { className: "ss-g-hero-text", children: [
8728
8781
  /* @__PURE__ */ jsx71("span", { className: "ss-g-hero-eyebrow", children: ui.games.dailyChallenge }),
8729
8782
  status.tone === "new" && /* @__PURE__ */ jsx71(Chip, { variant: "badge", children: ui.games.newToday }),
@@ -8735,7 +8788,7 @@ function GameTile({ game, onOpen, ui, variant = "tile" }) {
8735
8788
  ] })
8736
8789
  ] }),
8737
8790
  /* @__PURE__ */ jsx71("span", { className: "ss-g-hero-art", children: /* @__PURE__ */ jsx71(GameTileArt, { gameId: game.gameId }) })
8738
- ] }) : variant === "wide" ? /* @__PURE__ */ jsxs64(Fragment15, { children: [
8791
+ ] }) : variant === "wide" ? /* @__PURE__ */ jsxs64(Fragment16, { children: [
8739
8792
  /* @__PURE__ */ jsx71("span", { className: "ss-g-wide-art", children: /* @__PURE__ */ jsx71(GameTileArt, { gameId: game.gameId }) }),
8740
8793
  /* @__PURE__ */ jsxs64("span", { className: "ss-g-wide-text", children: [
8741
8794
  /* @__PURE__ */ jsx71("span", { className: "ss-g-tile-title", children: title }),
@@ -8743,7 +8796,7 @@ function GameTile({ game, onOpen, ui, variant = "tile" }) {
8743
8796
  status.tone === "new" && /* @__PURE__ */ jsx71(Chip, { variant: "badge", children: ui.games.newToday })
8744
8797
  ] }),
8745
8798
  /* @__PURE__ */ jsx71("span", { className: "ss-g-wide-chev", children: /* @__PURE__ */ jsx71(IconChevronLeft, { size: 18 }) })
8746
- ] }) : /* @__PURE__ */ jsxs64(Fragment15, { children: [
8799
+ ] }) : /* @__PURE__ */ jsxs64(Fragment16, { children: [
8747
8800
  /* @__PURE__ */ jsx71("span", { className: "ss-g-tile-art", children: /* @__PURE__ */ jsx71(GameTileArt, { gameId: game.gameId }) }),
8748
8801
  /* @__PURE__ */ jsx71("span", { className: "ss-g-tile-title", children: title }),
8749
8802
  /* @__PURE__ */ jsx71("span", { className: "ss-g-tile-status", "data-tone": status.tone, children: status.text })
@@ -8754,7 +8807,7 @@ function GameTile({ game, onOpen, ui, variant = "tile" }) {
8754
8807
  }
8755
8808
 
8756
8809
  // src/components/GamesHub.tsx
8757
- import { Fragment as Fragment16, jsx as jsx72, jsxs as jsxs65 } from "react/jsx-runtime";
8810
+ import { Fragment as Fragment17, jsx as jsx72, jsxs as jsxs65 } from "react/jsx-runtime";
8758
8811
  var PLAYABLE = /* @__PURE__ */ new Set(["available", "in_progress"]);
8759
8812
  var DONE = /* @__PURE__ */ new Set(["played", "graded"]);
8760
8813
  function pickHeroGame(games) {
@@ -8785,7 +8838,7 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
8785
8838
  /* @__PURE__ */ jsxs65("div", { className: "ss-g-stat", children: [
8786
8839
  /* @__PURE__ */ jsx72("span", { className: "ss-g-stat-l", children: ui.games.statStreak }),
8787
8840
  /* @__PURE__ */ jsxs65("span", { className: "ss-g-stat-v", "data-testid": "stat-streak", children: [
8788
- myWeeklyRow ? /* @__PURE__ */ jsxs65(Fragment16, { children: [
8841
+ myWeeklyRow ? /* @__PURE__ */ jsxs65(Fragment17, { children: [
8789
8842
  /* @__PURE__ */ jsx72(IconFlame, {}),
8790
8843
  myWeeklyRow.currentStreak
8791
8844
  ] }) : dash,
@@ -9175,11 +9228,11 @@ function SegmentProgress({ segments, ariaLabel, leftLabel, rightLabel, right })
9175
9228
  }
9176
9229
 
9177
9230
  // src/components/games/ui/AnswerTray.tsx
9178
- import { Fragment as Fragment17, jsx as jsx76, jsxs as jsxs68 } from "react/jsx-runtime";
9231
+ import { Fragment as Fragment18, jsx as jsx76, jsxs as jsxs68 } from "react/jsx-runtime";
9179
9232
  function AnswerTray({ id, label, placeholder, optionsLabel, options, query, onQuery, onPick, disabled, minQuery = 0 }) {
9180
9233
  const needle = query.trim().toLowerCase();
9181
9234
  const shown = needle.length < minQuery ? [] : needle ? options.filter((o) => o.name.toLowerCase().includes(needle)) : options;
9182
- return /* @__PURE__ */ jsxs68(Fragment17, { children: [
9235
+ return /* @__PURE__ */ jsxs68(Fragment18, { children: [
9183
9236
  /* @__PURE__ */ jsx76(
9184
9237
  SearchField,
9185
9238
  {
@@ -9271,7 +9324,7 @@ function PointsLadderRow({ ladder, guessesUsed, ui }) {
9271
9324
  }
9272
9325
 
9273
9326
  // src/components/games/MysteryTigerGame.tsx
9274
- import { Fragment as Fragment18, jsx as jsx82, jsxs as jsxs72 } from "react/jsx-runtime";
9327
+ import { Fragment as Fragment19, jsx as jsx82, jsxs as jsxs72 } from "react/jsx-runtime";
9275
9328
  function parseClientState(json) {
9276
9329
  if (!json) return null;
9277
9330
  try {
@@ -9419,7 +9472,7 @@ function MysteryTigerGame({
9419
9472
  }
9420
9473
  ),
9421
9474
  !config && /* @__PURE__ */ jsx82("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
9422
- config && /* @__PURE__ */ jsxs72(Fragment18, { children: [
9475
+ config && /* @__PURE__ */ jsxs72(Fragment19, { children: [
9423
9476
  /* @__PURE__ */ jsxs72("div", { className: "ss-g-body", children: [
9424
9477
  !isOver && /* @__PURE__ */ jsx82(PointsLadderRow, { ladder: config.pointsLadder, guessesUsed, ui }),
9425
9478
  /* @__PURE__ */ jsxs72("div", { className: `ss-g-mt-card${isOver ? " ss-g-mt-card--reveal" : ""}`, children: [
@@ -9519,7 +9572,7 @@ function MysteryTigerGame({
9519
9572
  }
9520
9573
 
9521
9574
  // src/components/games/HigherOrLowerGame.tsx
9522
- import { Fragment as Fragment19, jsx as jsx83, jsxs as jsxs73 } from "react/jsx-runtime";
9575
+ import { Fragment as Fragment20, jsx as jsx83, jsxs as jsxs73 } from "react/jsx-runtime";
9523
9576
  var POINTS_PER_CORRECT = 10;
9524
9577
  function parseClientState2(json) {
9525
9578
  if (!json) return null;
@@ -9579,7 +9632,7 @@ function HigherOrLowerGame({
9579
9632
  }
9580
9633
  ),
9581
9634
  !config && /* @__PURE__ */ jsx83("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
9582
- config && /* @__PURE__ */ jsxs73(Fragment19, { children: [
9635
+ config && /* @__PURE__ */ jsxs73(Fragment20, { children: [
9583
9636
  /* @__PURE__ */ jsxs73("div", { className: "ss-g-body", children: [
9584
9637
  /* @__PURE__ */ jsxs73("div", { className: "ss-g-hl-prompt", "data-testid": "hol-prompt", children: [
9585
9638
  /* @__PURE__ */ jsx83("span", { className: "ss-g-hl-prompt-q", children: t.whoHadMore }),
@@ -9649,7 +9702,7 @@ function CrestShield({ src, name, size = 28 }) {
9649
9702
  }
9650
9703
 
9651
9704
  // src/components/games/CareerPathGame.tsx
9652
- import { Fragment as Fragment20, jsx as jsx85, jsxs as jsxs74 } from "react/jsx-runtime";
9705
+ import { Fragment as Fragment21, jsx as jsx85, jsxs as jsxs74 } from "react/jsx-runtime";
9653
9706
  function parseClientState3(json) {
9654
9707
  if (!json) return null;
9655
9708
  try {
@@ -9729,7 +9782,7 @@ function CareerPathGame({
9729
9782
  /* @__PURE__ */ jsx85("span", { className: "ss-g-cp-club", children: spell.clubName }),
9730
9783
  /* @__PURE__ */ jsxs74("span", { className: "ss-g-cp-sub", children: [
9731
9784
  /* @__PURE__ */ jsx85("span", { className: "ss-g-cp-years", children: years }),
9732
- spell.isLoan && /* @__PURE__ */ jsxs74(Fragment20, { children: [
9785
+ spell.isLoan && /* @__PURE__ */ jsxs74(Fragment21, { children: [
9733
9786
  years ? " \xB7 " : "",
9734
9787
  /* @__PURE__ */ jsx85("span", { className: "ss-g-cp-loan", children: s.loan })
9735
9788
  ] })
@@ -9789,7 +9842,7 @@ function OptionList({ label, options, onPick }) {
9789
9842
  }
9790
9843
 
9791
9844
  // src/components/games/BeatTheGridGame.tsx
9792
- import { Fragment as Fragment21, jsx as jsx87, jsxs as jsxs75 } from "react/jsx-runtime";
9845
+ import { Fragment as Fragment22, jsx as jsx87, jsxs as jsxs75 } from "react/jsx-runtime";
9793
9846
  function criterionIconKind(label, key) {
9794
9847
  const l = (key ?? label).toLowerCase();
9795
9848
  if (l.includes("app")) return "calendar";
@@ -9832,7 +9885,7 @@ function HeaderVisual({ label, textKey: iKey, meta }) {
9832
9885
  case "country":
9833
9886
  return /* @__PURE__ */ jsx87("span", { className: "ss-g-btg-hdr-flag", "aria-hidden": "true", children: nationalityFlag(meta.country ?? label) });
9834
9887
  case "position":
9835
- return /* @__PURE__ */ jsx87(Fragment21, {});
9888
+ return /* @__PURE__ */ jsx87(Fragment22, {});
9836
9889
  default:
9837
9890
  return /* @__PURE__ */ jsx87(CriterionIcon, { kind: criterionIconKind(label, iKey) });
9838
9891
  }
@@ -9895,7 +9948,7 @@ function SearchSheet({
9895
9948
  }
9896
9949
  )
9897
9950
  ] }),
9898
- playerPool.length === 0 ? /* @__PURE__ */ jsx87("div", { className: "ss-g-btg-sheet-empty", children: s.emptyPool }) : /* @__PURE__ */ jsxs75(Fragment21, { children: [
9951
+ playerPool.length === 0 ? /* @__PURE__ */ jsx87("div", { className: "ss-g-btg-sheet-empty", children: s.emptyPool }) : /* @__PURE__ */ jsxs75(Fragment22, { children: [
9899
9952
  /* @__PURE__ */ jsx87(
9900
9953
  SearchField,
9901
9954
  {
@@ -9914,7 +9967,7 @@ function SearchSheet({
9914
9967
  label: s.searchLabel(rowLabel, colLabel),
9915
9968
  options: filtered.map((p) => ({
9916
9969
  key: p.id,
9917
- content: /* @__PURE__ */ jsxs75(Fragment21, { children: [
9970
+ content: /* @__PURE__ */ jsxs75(Fragment22, { children: [
9918
9971
  /* @__PURE__ */ jsx87(PlayerAvatar, { name: p.name, imagePath: p.imagePath, className: "ss-g-opt-av" }),
9919
9972
  /* @__PURE__ */ jsx87("span", { className: "ss-g-btg-result-name", children: p.name }),
9920
9973
  /* @__PURE__ */ jsx87("span", { className: "ss-g-btg-result-plus", "aria-hidden": "true", children: /* @__PURE__ */ jsx87(IconPlus, { size: 18 }) })
@@ -10004,10 +10057,10 @@ function BeatTheGridGame({
10004
10057
  rows.map((rowLabel, rowIdx) => {
10005
10058
  const rowMeta = config.rowsMeta?.[rowIdx];
10006
10059
  const abbr = rowAbbrev(rowLabel, s.rowAbbrev, config.rowsI18n?.[rowIdx]?.key);
10007
- const rowHeaderContent = rowMeta ? /* @__PURE__ */ jsxs75(Fragment21, { children: [
10060
+ const rowHeaderContent = rowMeta ? /* @__PURE__ */ jsxs75(Fragment22, { children: [
10008
10061
  /* @__PURE__ */ jsx87(HeaderVisual, { label: rowLabel, textKey: config.rowsI18n?.[rowIdx]?.key, meta: rowMeta }),
10009
10062
  /* @__PURE__ */ jsx87("span", { children: rowLabel })
10010
- ] }) : abbr === rowLabel ? /* @__PURE__ */ jsx87("span", { children: rowLabel }) : /* @__PURE__ */ jsxs75(Fragment21, { children: [
10063
+ ] }) : abbr === rowLabel ? /* @__PURE__ */ jsx87("span", { children: rowLabel }) : /* @__PURE__ */ jsxs75(Fragment22, { children: [
10011
10064
  /* @__PURE__ */ jsx87("span", { "aria-hidden": "true", children: abbr }),
10012
10065
  /* @__PURE__ */ jsx87("span", { className: "ss-g-sr", children: rowLabel })
10013
10066
  ] });
@@ -10028,7 +10081,7 @@ function BeatTheGridGame({
10028
10081
  className: "ss-g-btg-cell",
10029
10082
  disabled: isLocked2 || submitting,
10030
10083
  onClick: () => handleCellClick(rowIdx, colIdx),
10031
- children: filled ? /* @__PURE__ */ jsxs75(Fragment21, { children: [
10084
+ children: filled ? /* @__PURE__ */ jsxs75(Fragment22, { children: [
10032
10085
  /* @__PURE__ */ jsx87(
10033
10086
  "span",
10034
10087
  {
@@ -10095,16 +10148,16 @@ function BeatTheGridGame({
10095
10148
  import { useState as useState45, useId as useId6 } from "react";
10096
10149
 
10097
10150
  // src/components/games/ui/PitchSvg.tsx
10098
- import { Fragment as Fragment22, jsx as jsx88, jsxs as jsxs76 } from "react/jsx-runtime";
10151
+ import { Fragment as Fragment23, jsx as jsx88, jsxs as jsxs76 } from "react/jsx-runtime";
10099
10152
  function PitchSvg({ variant }) {
10100
10153
  return /* @__PURE__ */ jsxs76("svg", { className: "ss-g-pitch-svg", viewBox: variant === "full" ? "0 0 100 150" : "0 0 100 100", preserveAspectRatio: "none", "aria-hidden": "true", children: [
10101
10154
  /* @__PURE__ */ jsx88("rect", { x: "4", y: "4", width: "92", height: variant === "full" ? 142 : 92, fill: "none" }),
10102
- variant === "full" ? /* @__PURE__ */ jsxs76(Fragment22, { children: [
10155
+ variant === "full" ? /* @__PURE__ */ jsxs76(Fragment23, { children: [
10103
10156
  /* @__PURE__ */ jsx88("line", { x1: "4", y1: "75", x2: "96", y2: "75" }),
10104
10157
  /* @__PURE__ */ jsx88("circle", { cx: "50", cy: "75", r: "12", fill: "none" }),
10105
10158
  /* @__PURE__ */ jsx88("rect", { x: "26", y: "4", width: "48", height: "20", fill: "none" }),
10106
10159
  /* @__PURE__ */ jsx88("rect", { x: "26", y: "126", width: "48", height: "20", fill: "none" })
10107
- ] }) : /* @__PURE__ */ jsxs76(Fragment22, { children: [
10160
+ ] }) : /* @__PURE__ */ jsxs76(Fragment23, { children: [
10108
10161
  /* @__PURE__ */ jsx88("path", { d: "M38 4a12 12 0 0 0 24 0", fill: "none" }),
10109
10162
  /* @__PURE__ */ jsx88("rect", { x: "26", y: "76", width: "48", height: "20", fill: "none" })
10110
10163
  ] })
@@ -10162,7 +10215,7 @@ function positionsBySlot(formation, rowsAttackFirst) {
10162
10215
  }
10163
10216
 
10164
10217
  // src/components/games/GuessTheXiGame.tsx
10165
- import { Fragment as Fragment23, jsx as jsx89, jsxs as jsxs77 } from "react/jsx-runtime";
10218
+ import { Fragment as Fragment24, jsx as jsx89, jsxs as jsxs77 } from "react/jsx-runtime";
10166
10219
  var MAX_GUESSES2 = 3;
10167
10220
  function parseClientState5(json) {
10168
10221
  if (!json) return null;
@@ -10224,7 +10277,7 @@ function GuessTheXiGame({
10224
10277
  }
10225
10278
  ),
10226
10279
  !config && /* @__PURE__ */ jsx89("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
10227
- config && /* @__PURE__ */ jsxs77(Fragment23, { children: [
10280
+ config && /* @__PURE__ */ jsxs77(Fragment24, { children: [
10228
10281
  /* @__PURE__ */ jsxs77("div", { className: "ss-g-body", children: [
10229
10282
  !isOver && /* @__PURE__ */ jsx89(PointsLadderRow, { ladder: config.pointsLadder, guessesUsed: clientState?.guessHistory.length ?? 0, ui }),
10230
10283
  rows.length > 0 && /* @__PURE__ */ jsxs77("div", { className: "ss-g-gxi-pitch", role: "group", "aria-label": t.pitchLabel, children: [
@@ -10273,7 +10326,7 @@ function GuessTheXiGame({
10273
10326
  ] }, g.teamId);
10274
10327
  })
10275
10328
  ] }),
10276
- isOver && /* @__PURE__ */ jsxs77(Fragment23, { children: [
10329
+ isOver && /* @__PURE__ */ jsxs77(Fragment24, { children: [
10277
10330
  /* @__PURE__ */ jsx89(
10278
10331
  ResultCard,
10279
10332
  {
@@ -10299,7 +10352,7 @@ function GuessTheXiGame({
10299
10352
  label: t.optionsLabel,
10300
10353
  options: filtered.map((tm) => ({
10301
10354
  key: tm.teamId,
10302
- content: /* @__PURE__ */ jsxs77(Fragment23, { children: [
10355
+ content: /* @__PURE__ */ jsxs77(Fragment24, { children: [
10303
10356
  /* @__PURE__ */ jsx89(CrestShield, { src: tm.crestUrl, name: tm.teamName, size: 28 }),
10304
10357
  /* @__PURE__ */ jsx89("span", { children: tm.teamName })
10305
10358
  ] })
@@ -10325,7 +10378,7 @@ function GuessTheXiGame({
10325
10378
 
10326
10379
  // src/components/games/DailyQuizGame.tsx
10327
10380
  import { useState as useState46 } from "react";
10328
- import { Fragment as Fragment24, jsx as jsx90, jsxs as jsxs78 } from "react/jsx-runtime";
10381
+ import { Fragment as Fragment25, jsx as jsx90, jsxs as jsxs78 } from "react/jsx-runtime";
10329
10382
  function parseClientState6(json) {
10330
10383
  if (!json) return null;
10331
10384
  try {
@@ -10444,7 +10497,7 @@ function DailyQuizGame({
10444
10497
  return /* @__PURE__ */ jsxs78("div", { className: "ss-g-screen", "data-game": "daily-quiz", "data-testid": "game-screen-daily-quiz", children: [
10445
10498
  /* @__PURE__ */ jsx90(GameHeader, { title, eyebrow: s.questionOf(page + 1, total), onBack, backLabel: ui.back }),
10446
10499
  /* @__PURE__ */ jsx90(SegmentProgress, { segments, ariaLabel: s.progressAria(page + 1, total) }),
10447
- /* @__PURE__ */ jsx90("div", { className: "ss-g-body", children: current && /* @__PURE__ */ jsxs78(Fragment24, { children: [
10500
+ /* @__PURE__ */ jsx90("div", { className: "ss-g-body", children: current && /* @__PURE__ */ jsxs78(Fragment25, { children: [
10448
10501
  /* @__PURE__ */ jsx90("h3", { className: "ss-g-dq-stem", children: current.stem }),
10449
10502
  /* @__PURE__ */ jsx90("div", { className: "ss-g-dq-opts", children: current.options.map((opt, optIdx) => {
10450
10503
  const selected = optIdx === selectedIdx;
@@ -10745,7 +10798,7 @@ function MatchdayPredictorGame({
10745
10798
 
10746
10799
  // src/components/games/StartingXiGame.tsx
10747
10800
  import { useId as useId8, useState as useState48 } from "react";
10748
- import { Fragment as Fragment25, jsx as jsx92, jsxs as jsxs80 } from "react/jsx-runtime";
10801
+ import { Fragment as Fragment26, jsx as jsx92, jsxs as jsxs80 } from "react/jsx-runtime";
10749
10802
  var POINTS_PER_STARTER = 8;
10750
10803
  var XI_SIZE = 11;
10751
10804
  var DEFAULT_FORMATION = "4-3-3";
@@ -10894,11 +10947,11 @@ function StartingXiGame({
10894
10947
  })
10895
10948
  ] }),
10896
10949
  /* @__PURE__ */ jsxs80("div", { className: "ss-g-xi-picker", children: [
10897
- /* @__PURE__ */ jsx92("div", { className: "ss-g-xi-picker-head", children: activeSlot ? /* @__PURE__ */ jsxs80(Fragment25, { children: [
10950
+ /* @__PURE__ */ jsx92("div", { className: "ss-g-xi-picker-head", children: activeSlot ? /* @__PURE__ */ jsxs80(Fragment26, { children: [
10898
10951
  /* @__PURE__ */ jsx92(Chip, { variant: "badge", children: activeSlot.label }),
10899
10952
  /* @__PURE__ */ jsx92("strong", { children: t.pickFor(activeSlot.label) })
10900
10953
  ] }) : /* @__PURE__ */ jsx92("strong", { children: t.allPicked }) }),
10901
- activeSlot && /* @__PURE__ */ jsxs80(Fragment25, { children: [
10954
+ activeSlot && /* @__PURE__ */ jsxs80(Fragment26, { children: [
10902
10955
  /* @__PURE__ */ jsx92(
10903
10956
  SearchField,
10904
10957
  {
@@ -11396,7 +11449,7 @@ function LeaderboardEmpty({
11396
11449
  }
11397
11450
 
11398
11451
  // src/components/Leaderboard.tsx
11399
- import { Fragment as Fragment26, jsx as jsx98, jsxs as jsxs85 } from "react/jsx-runtime";
11452
+ import { Fragment as Fragment27, jsx as jsx98, jsxs as jsxs85 } from "react/jsx-runtime";
11400
11453
  function Leaderboard({
11401
11454
  data,
11402
11455
  ui,
@@ -11438,7 +11491,7 @@ function Leaderboard({
11438
11491
  onPlay,
11439
11492
  ui
11440
11493
  }
11441
- ) : /* @__PURE__ */ jsxs85(Fragment26, { children: [
11494
+ ) : /* @__PURE__ */ jsxs85(Fragment27, { children: [
11442
11495
  /* @__PURE__ */ jsx98("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ jsx98(
11443
11496
  LeaderboardWeeklyRow,
11444
11497
  {
@@ -11762,7 +11815,7 @@ function SquadStats({ stats, loading, ui, onSelectPlayer }) {
11762
11815
  }
11763
11816
 
11764
11817
  // src/components/Squad.tsx
11765
- import { Fragment as Fragment27, jsx as jsx104, jsxs as jsxs90 } from "react/jsx-runtime";
11818
+ import { Fragment as Fragment28, jsx as jsx104, jsxs as jsxs90 } from "react/jsx-runtime";
11766
11819
  function Squad({ squad, loading, ui, view, onToggleView, stats, statsLoading, seasonName = null, competitionName = null, matchesPlayed = null, onSelectPlayer }) {
11767
11820
  const eyebrow = view === "stats" ? statsEyebrow(ui, seasonName, competitionName, matchesPlayed) : null;
11768
11821
  const toggle = /* @__PURE__ */ jsxs90("div", { className: "ss-w-sq-bar", children: [
@@ -11782,20 +11835,20 @@ function Squad({ squad, loading, ui, view, onToggleView, stats, statsLoading, se
11782
11835
  )) })
11783
11836
  ] });
11784
11837
  if (view === "stats") {
11785
- return /* @__PURE__ */ jsxs90(Fragment27, { children: [
11838
+ return /* @__PURE__ */ jsxs90(Fragment28, { children: [
11786
11839
  toggle,
11787
11840
  /* @__PURE__ */ jsx104(SquadStats, { stats, loading: statsLoading, ui, onSelectPlayer })
11788
11841
  ] });
11789
11842
  }
11790
- if (squad === null && loading) return /* @__PURE__ */ jsxs90(Fragment27, { children: [
11843
+ if (squad === null && loading) return /* @__PURE__ */ jsxs90(Fragment28, { children: [
11791
11844
  toggle,
11792
11845
  /* @__PURE__ */ jsx104("div", { className: "ss-w-mon-list" })
11793
11846
  ] });
11794
- if (squad === null || squad.length === 0) return /* @__PURE__ */ jsxs90(Fragment27, { children: [
11847
+ if (squad === null || squad.length === 0) return /* @__PURE__ */ jsxs90(Fragment28, { children: [
11795
11848
  toggle,
11796
11849
  /* @__PURE__ */ jsx104("div", { className: "ss-w-mon-empty", children: ui.clubSquadEmpty })
11797
11850
  ] });
11798
- return /* @__PURE__ */ jsxs90(Fragment27, { children: [
11851
+ return /* @__PURE__ */ jsxs90(Fragment28, { children: [
11799
11852
  toggle,
11800
11853
  /* @__PURE__ */ jsx104("div", { className: "ss-w-mon-list", children: groupByPosition(squad).map((group, gi) => /* @__PURE__ */ jsxs90("div", { children: [
11801
11854
  group.positionName && /* @__PURE__ */ jsx104("div", { className: "ss-w-club-eyebrow", children: positionLabel(ui, group.positionName) }),
@@ -11925,7 +11978,7 @@ function PerformanceBars({ performance, competitionName, strings }) {
11925
11978
  }
11926
11979
 
11927
11980
  // src/components/PlayerDetail.tsx
11928
- import { Fragment as Fragment28, jsx as jsx108, jsxs as jsxs92 } from "react/jsx-runtime";
11981
+ import { Fragment as Fragment29, jsx as jsx108, jsxs as jsxs92 } from "react/jsx-runtime";
11929
11982
  var DASH = "\u2014";
11930
11983
  function ageFrom(dobMs) {
11931
11984
  if (dobMs === null) return DASH;
@@ -12005,10 +12058,10 @@ function PlayerDetail({ detail, loading, ui, seasonName, onClose }) {
12005
12058
  ui.clubPlayerBack
12006
12059
  ] });
12007
12060
  if (detail === null) {
12008
- return loading ? /* @__PURE__ */ jsxs92(Fragment28, { children: [
12061
+ return loading ? /* @__PURE__ */ jsxs92(Fragment29, { children: [
12009
12062
  /* @__PURE__ */ jsx108("div", { className: "ss-w-pd-bar", children: back }),
12010
12063
  /* @__PURE__ */ jsx108("div", { className: "ss-w-mon-list" })
12011
- ] }) : /* @__PURE__ */ jsxs92(Fragment28, { children: [
12064
+ ] }) : /* @__PURE__ */ jsxs92(Fragment29, { children: [
12012
12065
  /* @__PURE__ */ jsx108("div", { className: "ss-w-pd-bar", children: back }),
12013
12066
  /* @__PURE__ */ jsx108("div", { className: "ss-w-mon-empty", children: ui.clubPlayerDetailEmpty })
12014
12067
  ] });
@@ -12023,7 +12076,7 @@ function PlayerDetail({ detail, loading, ui, seasonName, onClose }) {
12023
12076
  const next = detail.nextFixture ?? null;
12024
12077
  const availability = detail.availability ?? null;
12025
12078
  const log = detail.matchLog ?? [];
12026
- return /* @__PURE__ */ jsxs92(Fragment28, { children: [
12079
+ return /* @__PURE__ */ jsxs92(Fragment29, { children: [
12027
12080
  /* @__PURE__ */ jsx108("div", { className: "ss-w-pd-bar", children: back }),
12028
12081
  /* @__PURE__ */ jsxs92("div", { className: "ss-w-mon-list ss-w-pd-list", children: [
12029
12082
  /* @__PURE__ */ jsxs92("div", { className: "ss-w-pd-card ss-w-pd-profile", children: [
@@ -12101,8 +12154,8 @@ function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef
12101
12154
  }
12102
12155
 
12103
12156
  // src/components/PresetTools.tsx
12104
- import { Fragment as Fragment29, useEffect as useEffect33, useId as useId11, useRef as useRef29, useState as useState55 } from "react";
12105
- import { Fragment as Fragment30, jsx as jsx110, jsxs as jsxs94 } from "react/jsx-runtime";
12157
+ import { Fragment as Fragment30, useEffect as useEffect33, useId as useId11, useRef as useRef29, useState as useState55 } from "react";
12158
+ import { Fragment as Fragment31, jsx as jsx110, jsxs as jsxs94 } from "react/jsx-runtime";
12106
12159
  var FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
12107
12160
  function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
12108
12161
  const dialogRef = useRef29(null);
@@ -12152,7 +12205,7 @@ function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
12152
12205
  function fillTemplate(template, slots) {
12153
12206
  return template.split(/(\{[a-z]+\})/).filter((part) => part !== "").map((part, i) => {
12154
12207
  const key = /^\{([a-z]+)\}$/.exec(part)?.[1];
12155
- return /* @__PURE__ */ jsx110(Fragment29, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
12208
+ return /* @__PURE__ */ jsx110(Fragment30, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
12156
12209
  });
12157
12210
  }
12158
12211
  function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
@@ -12193,7 +12246,7 @@ function PickList({ picks, formatKickoff }) {
12193
12246
  ] }, p.matchOddsId)) });
12194
12247
  }
12195
12248
  function ComboPreview({ cell: cell2, formatKickoff }) {
12196
- return /* @__PURE__ */ jsxs94(Fragment30, { children: [
12249
+ return /* @__PURE__ */ jsxs94(Fragment31, { children: [
12197
12250
  /* @__PURE__ */ jsx110(PickList, { picks: cell2.combo.legs, formatKickoff }),
12198
12251
  /* @__PURE__ */ jsx110("div", { className: "ss-w-tool-math", children: cell2.combo.multiplication })
12199
12252
  ] });
@@ -12491,7 +12544,7 @@ function markToolSeen() {
12491
12544
  }
12492
12545
 
12493
12546
  // src/components/ChatPanel.tsx
12494
- import { Fragment as Fragment31, jsx as jsx111, jsxs as jsxs95 } from "react/jsx-runtime";
12547
+ import { Fragment as Fragment32, jsx as jsx111, jsxs as jsxs95 } from "react/jsx-runtime";
12495
12548
  var FULLSCREEN_QUERY = "(max-width: 639px)";
12496
12549
  function useIsModal() {
12497
12550
  const [modal, setModal] = useState57(false);
@@ -12670,7 +12723,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
12670
12723
  monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx111(OddsPanel, { monitor, ui, slip }),
12671
12724
  monitor && monitor.activeTab === "fixtures" && /* @__PURE__ */ jsx111(Fixtures, { fixtures: clubFixturesResult?.fixtures ?? [], loading: clubFixturesResult?.loading ?? false, ui }),
12672
12725
  monitor && monitor.activeTab === "standings" && /* @__PURE__ */ jsx111(Standings, { standings: clubStandingsResult?.data ?? null, loading: clubStandingsResult?.loading ?? false, ui }),
12673
- monitor && monitor.activeTab === "squad" && /* @__PURE__ */ jsxs95(Fragment31, { children: [
12726
+ monitor && monitor.activeTab === "squad" && /* @__PURE__ */ jsxs95(Fragment32, { children: [
12674
12727
  /* @__PURE__ */ jsx111(
12675
12728
  "div",
12676
12729
  {
@@ -12712,7 +12765,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
12712
12765
  }
12713
12766
  }
12714
12767
  ),
12715
- (!monitor || monitor.activeTab !== "games") && /* @__PURE__ */ jsxs95(Fragment31, { children: [
12768
+ (!monitor || monitor.activeTab !== "games") && /* @__PURE__ */ jsxs95(Fragment32, { children: [
12716
12769
  /* @__PURE__ */ jsx111("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
12717
12770
  paused ? null : /* @__PURE__ */ jsx111(
12718
12771
  ChatInput,
@@ -13475,7 +13528,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
13475
13528
  }
13476
13529
 
13477
13530
  /* greeting dashboard */
13478
- .ss-w-dash { display: flex; flex-direction: column; gap: 12px; padding: 4px 0; }
13531
+ .ss-w-dash { display: flex; flex-direction: column; gap: 12px; padding: 4px 0; container-type: inline-size; }
13479
13532
  .ss-w-dash-head { display: flex; flex-direction: column; }
13480
13533
  .ss-w-dash-title { font-size: 18px; font-weight: 700; line-height: 1.25; color: var(--ss-w-ink); }
13481
13534
  .ss-w-dash-subtitle { font-size: 13px; color: var(--ss-w-faint); margin-top: 4px; }
@@ -13496,8 +13549,8 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
13496
13549
  .ss-w-dash-tile-icon { flex: none; display: grid; place-items: center; width: 28px; height: 28px; font-size: 22px; }
13497
13550
  .ss-w-dash-emoji { line-height: 1; }
13498
13551
  .ss-w-dash-tile-body { min-width: 0; display: flex; flex-direction: column; gap: 2px; flex: 1; }
13499
- .ss-w-dash-tile-title { min-width: 0; font-weight: 600; font-size: 14px; overflow-wrap: anywhere; }
13500
- .ss-w-dash-tile-subtitle { min-width: 0; font-size: 11.5px; color: var(--ss-w-faint); overflow-wrap: anywhere; }
13552
+ .ss-w-dash-tile-title { min-width: 0; font-weight: 600; font-size: 14px; overflow-wrap: break-word; hyphens: manual; }
13553
+ .ss-w-dash-tile-subtitle { min-width: 0; font-size: 11.5px; color: var(--ss-w-faint); overflow-wrap: break-word; hyphens: manual; }
13501
13554
  .ss-w-dash-tile-chevron { flex: none; margin-left: auto; width: 14px; height: 14px; color: var(--ss-w-faint); }
13502
13555
 
13503
13556
  /* Badge + crests share their own row, below the title -- NOT the icon/chevron row. A
@@ -13519,6 +13572,18 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
13519
13572
  families (.ss-w-binsight, .ss-w-mocard, .ss-w-omcard) so a market tile reads as
13520
13573
  part of that visual language rather than a plain unstyled button. */
13521
13574
  .ss-w-dash--market .ss-w-dash-tile { border-left: 3px solid var(--ss-w-accent); }
13575
+ /* Market's two columns need the text column to fit a word: a half tile spends ~91px on border, padding,
13576
+ icon and chevron, and a Turkish word such as "kar\u015F\u0131la\u015Fma" is ~80px at 14px bold. Measured against the
13577
+ dashboard's own width (a container query, not the viewport, since the panel is min(460px, 100vw - 40px)
13578
+ and a host can embed it narrower still). Below 306px the half tiles are a single full-width column;
13579
+ up to 349px the decorative chevron is dropped, as Discovery already does, to give the words ~24px back.
13580
+ Words never break inside a tile (overflow-wrap: break-word), so the column count is what protects them. */
13581
+ @container (max-width: 305px) {
13582
+ .ss-w-dash--market .ss-w-dash-grid { grid-template-columns: minmax(0, 1fr); }
13583
+ }
13584
+ @container (min-width: 306px) and (max-width: 349px) {
13585
+ .ss-w-dash--market .ss-w-dash-tile--half .ss-w-dash-tile-chevron { display: none; }
13586
+ }
13522
13587
 
13523
13588
  /* Goal: one column of compact cards, 60px tall with the badge as a price column on the right.
13524
13589
  The value ink is accent mixed toward ink (as on the hero price): plain light accent on the
@@ -13539,7 +13604,8 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
13539
13604
  /* Discovery: tinted bento cards. Stacked (icon over text) so a two- or three-word title gets
13540
13605
  the tile's full width instead of the ~100px left of a horizontal icon+chevron -- that narrow
13541
13606
  column was wrapping "Most interesting angles" onto three lines. The chevron is dropped (the
13542
- whole card is the tap target) and the badge + crest row is forced onto one line. */
13607
+ whole card is the tap target). The badge + crest row wraps (the base .ss-w-dash-tile-meta rule): an
13608
+ "8 matches" pill plus three crests is wider than a half tile at a 320px viewport. */
13543
13609
  .ss-w-dash--discovery .ss-w-dash-tile { flex-direction: column; align-items: stretch; gap: 8px; }
13544
13610
  .ss-w-dash--discovery .ss-w-dash-tile-icon { align-self: flex-start; width: 32px; height: 32px; font-size: 26px; }
13545
13611
  .ss-w-dash--discovery .ss-w-dash-tile-chevron { display: none; }
@@ -13547,7 +13613,6 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
13547
13613
  (horizontal, centre-aligned) rather than stacking like the narrow half tiles. */
13548
13614
  .ss-w-dash--discovery .ss-w-dash-tile--full { flex-direction: row; align-items: center; }
13549
13615
  .ss-w-dash--discovery .ss-w-dash-tile--full .ss-w-dash-tile-icon { align-self: center; }
13550
- .ss-w-dash--discovery .ss-w-dash-tile-meta { flex-wrap: nowrap; }
13551
13616
  .ss-w-dash--discovery .ss-w-dash-tile-crest { width: 22px; height: 22px; }
13552
13617
  /* Tints mix a hue into the live panel rather than hardcoding a light pastel, so a dark
13553
13618
  operator surface (e.g. --ss-w-panel set from a navy \`surface\` brand color) yields a
@@ -13600,8 +13665,8 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
13600
13665
  background: color-mix(in srgb, var(--ss-w-accent) 14%, var(--ss-w-panel));
13601
13666
  }
13602
13667
  .ss-w-dash-hero-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
13603
- .ss-w-dash-hero-title { font-size: 15.5px; font-weight: 700; line-height: 1.25; color: var(--ss-w-ink); overflow-wrap: anywhere; }
13604
- .ss-w-dash-hero-subtitle { font-size: 12px; color: var(--ss-w-faint); overflow-wrap: anywhere; }
13668
+ .ss-w-dash-hero-title { font-size: 15.5px; font-weight: 700; line-height: 1.25; color: var(--ss-w-ink); overflow-wrap: break-word; hyphens: manual; }
13669
+ .ss-w-dash-hero-subtitle { font-size: 12px; color: var(--ss-w-faint); overflow-wrap: break-word; hyphens: manual; }
13605
13670
  .ss-w-dash-hero-price {
13606
13671
  flex: none; margin-left: auto;
13607
13672
  font-family: ui-monospace, monospace; font-variant-numeric: tabular-nums; font-size: 15px; font-weight: 750; line-height: 1;
@@ -13610,6 +13675,34 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
13610
13675
  border: 1px solid color-mix(in srgb, var(--ss-w-accent) 30%, var(--ss-w-panel));
13611
13676
  }
13612
13677
 
13678
+ /* Page-grounded additions (u591). Both only exist when the server sends \`meta\` / \`imageCodes\`, so an
13679
+ older payload never reaches these rules. */
13680
+ /* Hero meta ("Tip-off 02:30 \xB7 in 6 h", "Ba\u015Flama 02:30 \xB7 40 dk sonra"): takes the price's seat in the top
13681
+ row. It is the one flexible item there -- the badge and chevron keep their width -- and it wraps
13682
+ rather than truncates: at the narrowest panel the Turkish line (27 characters) has ~120px beside
13683
+ the badge, and the minutes-to-tip are the part a cut-off "40..." would lose. The component keeps
13684
+ each short " \xB7 "-separated part whole, so a wrap falls at the dot instead of inside "40 dk sonra". */
13685
+ .ss-w-dash__keep { white-space: nowrap; }
13686
+ .ss-w-dash__meta {
13687
+ flex: 1 1 auto; min-width: 0; text-align: right; overflow-wrap: break-word; hyphens: manual;
13688
+ font-size: 11.5px; font-weight: 600; line-height: 1.2; font-variant-numeric: tabular-nums;
13689
+ color: var(--ss-w-faint);
13690
+ }
13691
+ /* Text marks stand in for crests until the server has images: 22px circle / 7.5px in a tile, 40px /
13692
+ 12px in the hero (u592 D23). Ring and tint follow the crests they replace; unlike crests they do not
13693
+ overlap, because the letters are the content and an overlap would clip the first one. */
13694
+ .ss-w-dash__mark {
13695
+ flex: none; display: grid; place-items: center; box-sizing: border-box;
13696
+ width: 22px; height: 22px; border-radius: 50%; overflow: hidden;
13697
+ font-size: 7.5px; font-weight: 700; line-height: 1; letter-spacing: .02em; white-space: nowrap;
13698
+ color: var(--ss-w-ink);
13699
+ background-color: color-mix(in srgb, var(--ss-w-ink) 6%, var(--ss-w-panel));
13700
+ box-shadow: 0 0 0 2px var(--ss-w-panel), 0 0 0 3px color-mix(in srgb, var(--ss-w-ink) 10%, var(--ss-w-panel));
13701
+ }
13702
+ .ss-w-dash__mark + .ss-w-dash__mark { margin-left: 3px; }
13703
+ .ss-w-dash-hero-visual .ss-w-dash__mark { width: 40px; height: 40px; font-size: 12px; }
13704
+ .ss-w-dash-hero-visual .ss-w-dash__mark + .ss-w-dash__mark { margin-left: 6px; }
13705
+
13613
13706
  /* club fan pre-match dashboard */
13614
13707
  .ss-w-fandash { display: flex; flex-direction: column; gap: 10px; padding: 4px 0; }
13615
13708
  .ss-w-fandash-greeting { font-size: 14px; font-weight: 600; line-height: 1.3; color: var(--ss-w-ink); }
@@ -14881,7 +14974,7 @@ function StatsWidget(props) {
14881
14974
  introDoneRef.current = true;
14882
14975
  }, []);
14883
14976
  const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
14884
- const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
14977
+ const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey, cfg?.page);
14885
14978
  const [hasToday, setHasToday] = useState58(false);
14886
14979
  const liveCardWatches = useMemo7(() => {
14887
14980
  const seen = /* @__PURE__ */ new Set();