@sensiblestats/widget-react 0.58.0 → 0.59.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/StatsWidget.tsx
2
- import { useCallback as useCallback9, useEffect as useEffect15, useMemo as useMemo3, useRef as useRef13, useState as useState34 } from "react";
2
+ import { useCallback as useCallback9, useEffect as useEffect15, useMemo as useMemo3, useRef as useRef13, useState as useState35 } from "react";
3
3
  import { StatsWidgetClient } from "@sensiblestats/widget-sdk";
4
4
 
5
5
  // src/kickoff.ts
@@ -1896,7 +1896,7 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
1896
1896
  }
1897
1897
 
1898
1898
  // src/components/ChatPanel.tsx
1899
- import { useEffect as useEffect14, useState as useState33 } from "react";
1899
+ import { useEffect as useEffect14, useState as useState34 } from "react";
1900
1900
 
1901
1901
  // src/components/ChatHeader.tsx
1902
1902
  import { useEffect as useEffect8, useRef as useRef8, useState as useState8 } from "react";
@@ -3999,7 +3999,7 @@ function TodayPanel({ discovery, ui, monitor }) {
3999
3999
  }
4000
4000
 
4001
4001
  // src/components/GamesPanel.tsx
4002
- import { useState as useState31 } from "react";
4002
+ import { useState as useState32 } from "react";
4003
4003
 
4004
4004
  // src/components/GamesLoginWall.tsx
4005
4005
  import { jsx as jsx52 } from "react/jsx-runtime";
@@ -4133,7 +4133,7 @@ function GamesHub({
4133
4133
  }
4134
4134
 
4135
4135
  // src/components/GameScreenHost.tsx
4136
- import { useEffect as useEffect13, useRef as useRef12, useState as useState30 } from "react";
4136
+ import { useEffect as useEffect13, useRef as useRef12, useState as useState31 } from "react";
4137
4137
 
4138
4138
  // src/useGamePlay.ts
4139
4139
  import { useCallback as useCallback8, useRef as useRef11, useState as useState22 } from "react";
@@ -4208,7 +4208,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, refresh }) {
4208
4208
  }
4209
4209
 
4210
4210
  // src/components/games/MysteryTigerGame.tsx
4211
- import { useState as useState23, useId as useId2 } from "react";
4211
+ import { useState as useState24, useId as useId2 } from "react";
4212
4212
 
4213
4213
  // src/components/games/nationFlags.ts
4214
4214
  var FLAGS = {
@@ -4291,8 +4291,29 @@ function nationalityFlag(nationality) {
4291
4291
  return FLAGS[key] ?? nationality.slice(0, 3).toUpperCase();
4292
4292
  }
4293
4293
 
4294
+ // src/components/games/PlayerAvatar.tsx
4295
+ import { useState as useState23 } from "react";
4296
+ import { jsx as jsx55 } from "react/jsx-runtime";
4297
+ function initialsOf(name) {
4298
+ const parts = name.trim().split(/\s+/).filter(Boolean);
4299
+ const first = parts[0];
4300
+ if (!first) return "?";
4301
+ const last = parts[parts.length - 1];
4302
+ if (parts.length === 1 || !last) return first.slice(0, 2).toUpperCase();
4303
+ return ((first[0] ?? "") + (last[0] ?? "")).toUpperCase();
4304
+ }
4305
+ function PlayerAvatar({
4306
+ name,
4307
+ imagePath,
4308
+ className
4309
+ }) {
4310
+ const [failed, setFailed] = useState23(false);
4311
+ const showImage = Boolean(imagePath) && !failed;
4312
+ return /* @__PURE__ */ jsx55("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ jsx55("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ jsx55("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
4313
+ }
4314
+
4294
4315
  // src/components/games/MysteryTigerGame.tsx
4295
- import { Fragment as Fragment9, jsx as jsx55, jsxs as jsxs49 } from "react/jsx-runtime";
4316
+ import { Fragment as Fragment9, jsx as jsx56, jsxs as jsxs49 } from "react/jsx-runtime";
4296
4317
  function parseClientState(json) {
4297
4318
  if (!json) return null;
4298
4319
  try {
@@ -4315,6 +4336,14 @@ var ATTR_KEYS = [
4315
4336
  "shirtNumber",
4316
4337
  "apps"
4317
4338
  ];
4339
+ var PROFILE_ROWS = [
4340
+ { key: "position", label: "Position" },
4341
+ { key: "nationality", label: "Nationality" },
4342
+ { key: "age", label: "Age" },
4343
+ { key: "shirtNumber", label: "Jersey number" },
4344
+ { key: "apps", label: "Match count" }
4345
+ ];
4346
+ var MAX_GUESSES = 6;
4318
4347
  function verdictGlyph(v) {
4319
4348
  if (v.verdict === "exact") return "\u2713";
4320
4349
  if (v.verdict === "miss") return "\u2717";
@@ -4327,9 +4356,49 @@ function directionArrow(v) {
4327
4356
  if (v.direction === "down") return "\u25BC";
4328
4357
  return "";
4329
4358
  }
4359
+ var POSITION_SHORT = {
4360
+ goalkeeper: "GK",
4361
+ keeper: "GK",
4362
+ defender: "DEF",
4363
+ "centre back": "CB",
4364
+ "center back": "CB",
4365
+ "centre-back": "CB",
4366
+ "center-back": "CB",
4367
+ "left back": "LB",
4368
+ "right back": "RB",
4369
+ "left wing-back": "LWB",
4370
+ "right wing-back": "RWB",
4371
+ sweeper: "SW",
4372
+ midfielder: "MID",
4373
+ "defensive midfield": "DM",
4374
+ "central midfield": "CM",
4375
+ "centre midfield": "CM",
4376
+ "attacking midfield": "AM",
4377
+ "left midfield": "LM",
4378
+ "right midfield": "RM",
4379
+ "left wing": "LW",
4380
+ "right wing": "RW",
4381
+ "left winger": "LW",
4382
+ "right winger": "RW",
4383
+ forward: "FWD",
4384
+ attacker: "FWD",
4385
+ striker: "ST",
4386
+ "second striker": "SS",
4387
+ "centre forward": "CF",
4388
+ "center forward": "CF",
4389
+ "centre-forward": "CF"
4390
+ };
4391
+ function shortPosition(value) {
4392
+ const mapped = POSITION_SHORT[value.trim().toLowerCase()];
4393
+ if (mapped) return mapped;
4394
+ if (value.length <= 3) return value.toUpperCase();
4395
+ return value.split(/[\s-]+/).filter(Boolean).map((w) => (w[0] ?? "").toUpperCase()).join("").slice(0, 3);
4396
+ }
4330
4397
  function tileFace(key, v) {
4331
4398
  if (!v.value) return verdictGlyph(v);
4332
- return key === "nationality" ? nationalityFlag(v.value) : v.value;
4399
+ if (key === "nationality") return nationalityFlag(v.value);
4400
+ if (key === "position") return shortPosition(v.value);
4401
+ return v.value;
4333
4402
  }
4334
4403
  function MysteryTigerGame({
4335
4404
  config,
@@ -4337,12 +4406,17 @@ function MysteryTigerGame({
4337
4406
  submitting,
4338
4407
  onSubmit
4339
4408
  }) {
4340
- const [query, setQuery] = useState23("");
4409
+ const [query, setQuery] = useState24("");
4410
+ const [portraitFailed, setPortraitFailed] = useState24(false);
4341
4411
  const inputId = useId2();
4342
4412
  const clientState = parseClientState(result?.clientStateJson);
4343
4413
  const guessResults = clientState?.guessResults ?? [];
4344
4414
  const alreadyGuessedIds = new Set(guessResults.map((g) => g.playerId));
4415
+ const shirtEnabled = config?.shirtTileEnabled ?? clientState?.shirtTileEnabled ?? false;
4345
4416
  const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
4417
+ const guessesUsed = clientState?.guessesUsed ?? guessResults.length;
4418
+ const revealPhoto = isOver && Boolean(clientState?.revealedPlayerImagePath) && !portraitFailed;
4419
+ const revealName = isOver ? clientState?.revealedPlayerName : void 0;
4346
4420
  const filtered = config && !isOver ? config.squadPlayers.filter(
4347
4421
  (p) => !alreadyGuessedIds.has(p.id) && p.name.toLowerCase().includes(query.toLowerCase())
4348
4422
  ) : [];
@@ -4354,12 +4428,12 @@ function MysteryTigerGame({
4354
4428
  onSubmit(JSON.stringify({ guesses: newGuesses }));
4355
4429
  }
4356
4430
  return /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt", "data-testid": "game-screen-mystery-tiger", children: [
4357
- !config && /* @__PURE__ */ jsx55("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
4431
+ !config && /* @__PURE__ */ jsx56("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
4358
4432
  config && /* @__PURE__ */ jsxs49(Fragment9, { children: [
4359
4433
  /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-head", children: [
4360
4434
  /* @__PURE__ */ jsxs49("div", { children: [
4361
- /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-title", children: "Mystery Tiger" }),
4362
- /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-sub", children: "Guess today's squad player" })
4435
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-gt-title", children: "Mystery Tiger" }),
4436
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-gt-sub", children: "Guess today's squad player" })
4363
4437
  ] }),
4364
4438
  clientState && !isOver && /* @__PURE__ */ jsxs49("span", { className: "ss-w-gt-left", children: [
4365
4439
  clientState.guessesRemaining,
@@ -4367,18 +4441,40 @@ function MysteryTigerGame({
4367
4441
  ] })
4368
4442
  ] }),
4369
4443
  /* @__PURE__ */ jsxs49("div", { className: "ss-w-gscroll", children: [
4444
+ /* @__PURE__ */ jsxs49("div", { className: `ss-w-gt-card${isOver ? " ss-w-gt-card--reveal" : ""}`, children: [
4445
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-gt-sil", children: revealPhoto ? /* @__PURE__ */ jsx56(
4446
+ "img",
4447
+ {
4448
+ src: clientState.revealedPlayerImagePath,
4449
+ alt: "",
4450
+ onError: () => setPortraitFailed(true)
4451
+ }
4452
+ ) : isOver && revealName ? /* @__PURE__ */ jsx56("span", { className: "ss-w-av-initials", children: initialsOf(revealName) }) : /* @__PURE__ */ jsxs49("svg", { viewBox: "0 0 96 118", role: "img", "aria-label": "hidden player silhouette", children: [
4453
+ /* @__PURE__ */ jsx56("circle", { cx: "48", cy: "40", r: "21", fill: "var(--ss-w-faint)" }),
4454
+ /* @__PURE__ */ jsx56("path", { d: "M8 118c0-25 18-39 40-39s40 14 40 39z", fill: "var(--ss-w-faint)" })
4455
+ ] }) }),
4456
+ !isOver && /* @__PURE__ */ jsx56("div", { className: "ss-w-gt-attrs", children: PROFILE_ROWS.filter((r) => r.key !== "shirtNumber" || shirtEnabled).map((row) => /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-attr", children: [
4457
+ /* @__PURE__ */ jsx56("span", { className: "ss-w-gt-attr-k", children: row.label }),
4458
+ /* @__PURE__ */ jsx56("span", { className: "ss-w-gt-attr-v", children: "\u2022\u2022\u2022" })
4459
+ ] }, row.key)) })
4460
+ ] }),
4461
+ !isOver && /* @__PURE__ */ jsx56("div", { className: "ss-w-gt-dots", "aria-label": `${guessesUsed} of ${MAX_GUESSES} guesses used`, children: Array.from({ length: MAX_GUESSES }).map((_, i) => /* @__PURE__ */ jsx56("i", { className: i < guessesUsed ? "ss-w-gt-dot ss-w-gt-dot--on" : "ss-w-gt-dot" }, i)) }),
4370
4462
  !isOver && /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-lead", children: [
4371
4463
  guessResults.length === 0 ? "Guess a squad player \u2014 each guess compares it to the mystery player on Pos, Nat, Age, Shirt & Apps: " : "Tiles: ",
4372
4464
  /* @__PURE__ */ jsxs49("span", { className: "ss-w-gt-key", children: [
4373
- /* @__PURE__ */ jsx55("b", { className: "ss-w-gt-key-ok", children: "\u2713" }),
4374
- " match \xB7 ",
4375
- /* @__PURE__ */ jsx55("b", { children: "\u25B2" }),
4465
+ /* @__PURE__ */ jsx56("span", { className: "ss-w-gt-sw ss-w-gt-sw--exact", "aria-hidden": "true" }),
4466
+ " match \xB7",
4467
+ " ",
4468
+ /* @__PURE__ */ jsx56("span", { className: "ss-w-gt-sw ss-w-gt-sw--near", "aria-hidden": "true" }),
4469
+ " close \xB7",
4470
+ " ",
4471
+ /* @__PURE__ */ jsx56("b", { children: "\u25B2" }),
4376
4472
  " higher \xB7 ",
4377
- /* @__PURE__ */ jsx55("b", { children: "\u25BC" }),
4473
+ /* @__PURE__ */ jsx56("b", { children: "\u25BC" }),
4378
4474
  " lower"
4379
4475
  ] })
4380
4476
  ] }),
4381
- guessResults.length > 0 && /* @__PURE__ */ jsx55("div", { className: "ss-w-gtrows", children: guessResults.map((gr, i) => {
4477
+ guessResults.length > 0 && /* @__PURE__ */ jsx56("div", { className: "ss-w-gtrows", children: guessResults.map((gr, i) => {
4382
4478
  const player = config.squadPlayers.find((p) => p.id === gr.playerId);
4383
4479
  return /* @__PURE__ */ jsxs49("div", { className: "ss-w-gtguess", children: [
4384
4480
  /* @__PURE__ */ jsxs49("div", { className: "ss-w-gtguess-nm", children: [
@@ -4386,7 +4482,7 @@ function MysteryTigerGame({
4386
4482
  " \xB7 ",
4387
4483
  player?.name ?? `#${gr.playerId}`
4388
4484
  ] }),
4389
- /* @__PURE__ */ jsx55("div", { className: "ss-w-gtrow", children: ATTR_KEYS.map((key) => {
4485
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-gtrow", children: ATTR_KEYS.map((key) => {
4390
4486
  const v = gr[key];
4391
4487
  const arrow = directionArrow(v);
4392
4488
  return /* @__PURE__ */ jsxs49(
@@ -4397,10 +4493,10 @@ function MysteryTigerGame({
4397
4493
  "data-verdict": v.verdict,
4398
4494
  "aria-label": `${ATTR_LABELS[key]}: ${v.value ?? v.verdict}${v.direction ? ` ${v.direction}` : ""}`,
4399
4495
  children: [
4400
- /* @__PURE__ */ jsx55("span", { className: "ss-w-gtile-lab", children: ATTR_LABELS[key] }),
4496
+ /* @__PURE__ */ jsx56("span", { className: "ss-w-gtile-lab", children: ATTR_LABELS[key] }),
4401
4497
  /* @__PURE__ */ jsxs49("span", { className: "ss-w-gtile-v", "aria-hidden": "true", children: [
4402
4498
  tileFace(key, v),
4403
- arrow && /* @__PURE__ */ jsx55("span", { className: "ss-w-gtile-dir", children: arrow })
4499
+ arrow && /* @__PURE__ */ jsx56("span", { className: "ss-w-gtile-dir", children: arrow })
4404
4500
  ] })
4405
4501
  ]
4406
4502
  },
@@ -4414,8 +4510,8 @@ function MysteryTigerGame({
4414
4510
  clientState.hintLine
4415
4511
  ] }),
4416
4512
  isOver && clientState && /* @__PURE__ */ jsxs49("div", { className: `ss-w-gt-banner ss-w-gt-banner--${clientState.solved ? "solved" : "failed"}`, children: [
4417
- /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-banner-label", children: clientState.solved ? "\u{1F42F} You found them!" : "\u{1F614} Out of guesses" }),
4418
- clientState.revealedPlayerName && /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-banner-name", children: clientState.revealedPlayerName }),
4513
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-gt-banner-label", children: clientState.solved ? "\u{1F42F} You found them!" : "\u{1F614} Out of guesses" }),
4514
+ clientState.revealedPlayerName && /* @__PURE__ */ jsx56("div", { className: "ss-w-gt-banner-name", children: clientState.revealedPlayerName }),
4419
4515
  /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-banner-sub", children: [
4420
4516
  clientState.guessesUsed,
4421
4517
  " guess",
@@ -4425,7 +4521,7 @@ function MysteryTigerGame({
4425
4521
  ] })
4426
4522
  ] }),
4427
4523
  !isOver && /* @__PURE__ */ jsxs49("div", { className: "ss-w-gpin ss-w-gtta", children: [
4428
- /* @__PURE__ */ jsx55(
4524
+ /* @__PURE__ */ jsx56(
4429
4525
  "input",
4430
4526
  {
4431
4527
  id: inputId,
@@ -4441,7 +4537,7 @@ function MysteryTigerGame({
4441
4537
  "aria-autocomplete": "list"
4442
4538
  }
4443
4539
  ),
4444
- query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx55("div", { className: "ss-w-gtta-drop", role: "listbox", children: filtered.map((p) => /* @__PURE__ */ jsx55(
4540
+ query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx56("div", { className: "ss-w-gtta-drop", role: "listbox", children: filtered.map((p) => /* @__PURE__ */ jsx56(
4445
4541
  "div",
4446
4542
  {
4447
4543
  className: "ss-w-gtta-opt",
@@ -4462,7 +4558,7 @@ function MysteryTigerGame({
4462
4558
  }
4463
4559
 
4464
4560
  // src/components/games/HigherOrLowerGame.tsx
4465
- import { Fragment as Fragment10, jsx as jsx56, jsxs as jsxs50 } from "react/jsx-runtime";
4561
+ import { Fragment as Fragment10, jsx as jsx57, jsxs as jsxs50 } from "react/jsx-runtime";
4466
4562
  var POINTS_PER_CORRECT = 10;
4467
4563
  function parseClientState2(json) {
4468
4564
  if (!json) return null;
@@ -4495,11 +4591,11 @@ function HigherOrLowerGame({
4495
4591
  onSubmit(JSON.stringify({ answers: newAnswers }));
4496
4592
  }
4497
4593
  return /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl", "data-testid": "game-screen-higher-or-lower", children: [
4498
- !config && /* @__PURE__ */ jsx56("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
4594
+ !config && /* @__PURE__ */ jsx57("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
4499
4595
  config && /* @__PURE__ */ jsxs50(Fragment10, { children: [
4500
4596
  /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-head", children: [
4501
4597
  /* @__PURE__ */ jsxs50("div", { children: [
4502
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hl-title", children: "Higher or Lower" }),
4598
+ /* @__PURE__ */ jsx57("div", { className: "ss-w-hl-title", children: "Higher or Lower" }),
4503
4599
  /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-sub", children: [
4504
4600
  config.statLabel,
4505
4601
  " \xB7 ",
@@ -4519,13 +4615,20 @@ function HigherOrLowerGame({
4519
4615
  ] }),
4520
4616
  /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpair", children: [
4521
4617
  /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpc", children: [
4522
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-av", "aria-hidden": "true", children: "\u26BD" }),
4523
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-name", children: currentPair.playerAName }),
4524
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-stat", children: config.statLabel }),
4525
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-val", children: currentPair.playerAValue })
4618
+ /* @__PURE__ */ jsx57(
4619
+ PlayerAvatar,
4620
+ {
4621
+ className: "ss-w-hlpc-av",
4622
+ name: currentPair.playerAName,
4623
+ imagePath: currentPair.playerAImagePath
4624
+ }
4625
+ ),
4626
+ /* @__PURE__ */ jsx57("div", { className: "ss-w-hlpc-name", children: currentPair.playerAName }),
4627
+ /* @__PURE__ */ jsx57("div", { className: "ss-w-hlpc-stat", children: config.statLabel }),
4628
+ /* @__PURE__ */ jsx57("div", { className: "ss-w-hlpc-val", children: currentPair.playerAValue })
4526
4629
  ] }),
4527
4630
  /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlbtns", children: [
4528
- /* @__PURE__ */ jsx56(
4631
+ /* @__PURE__ */ jsx57(
4529
4632
  "button",
4530
4633
  {
4531
4634
  type: "button",
@@ -4535,8 +4638,8 @@ function HigherOrLowerGame({
4535
4638
  children: "Higher \u25B2"
4536
4639
  }
4537
4640
  ),
4538
- /* @__PURE__ */ jsx56("span", { className: "ss-w-hl-or", children: "or" }),
4539
- /* @__PURE__ */ jsx56(
4641
+ /* @__PURE__ */ jsx57("span", { className: "ss-w-hl-or", children: "or" }),
4642
+ /* @__PURE__ */ jsx57(
4540
4643
  "button",
4541
4644
  {
4542
4645
  type: "button",
@@ -4548,10 +4651,17 @@ function HigherOrLowerGame({
4548
4651
  )
4549
4652
  ] }),
4550
4653
  /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpc ss-w-hlpc--b", children: [
4551
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-av", "aria-hidden": "true", children: "\u26BD" }),
4552
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-name", children: currentPair.playerBName }),
4553
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-stat", children: config.statLabel }),
4554
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-val ss-w-hlpc-val--hidden", children: "?" })
4654
+ /* @__PURE__ */ jsx57(
4655
+ PlayerAvatar,
4656
+ {
4657
+ className: "ss-w-hlpc-av",
4658
+ name: currentPair.playerBName,
4659
+ imagePath: currentPair.playerBImagePath
4660
+ }
4661
+ ),
4662
+ /* @__PURE__ */ jsx57("div", { className: "ss-w-hlpc-name", children: currentPair.playerBName }),
4663
+ /* @__PURE__ */ jsx57("div", { className: "ss-w-hlpc-stat", children: config.statLabel }),
4664
+ /* @__PURE__ */ jsx57("div", { className: "ss-w-hlpc-val ss-w-hlpc-val--hidden", children: "?" })
4555
4665
  ] })
4556
4666
  ] })
4557
4667
  ] }),
@@ -4567,10 +4677,10 @@ function HigherOrLowerGame({
4567
4677
  ] })
4568
4678
  ] }),
4569
4679
  isOver && /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-over", children: [
4570
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hl-over-title", children: runEndedWrong ? "\u{1F6AB} Run over" : "\u{1F389} Perfect run!" }),
4680
+ /* @__PURE__ */ jsx57("div", { className: "ss-w-hl-over-title", children: runEndedWrong ? "\u{1F6AB} Run over" : "\u{1F389} Perfect run!" }),
4571
4681
  /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-over-score", children: [
4572
4682
  score,
4573
- /* @__PURE__ */ jsx56("span", { className: "ss-w-hl-over-unit", children: " pts" })
4683
+ /* @__PURE__ */ jsx57("span", { className: "ss-w-hl-over-unit", children: " pts" })
4574
4684
  ] }),
4575
4685
  /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-over-sub", children: [
4576
4686
  correctCount,
@@ -4584,8 +4694,8 @@ function HigherOrLowerGame({
4584
4694
  }
4585
4695
 
4586
4696
  // src/components/games/CareerPathGame.tsx
4587
- import { useState as useState24, useId as useId3, Fragment as Fragment11 } from "react";
4588
- import { Fragment as Fragment12, jsx as jsx57, jsxs as jsxs51 } from "react/jsx-runtime";
4697
+ import { useState as useState25, useId as useId3, Fragment as Fragment11 } from "react";
4698
+ import { Fragment as Fragment12, jsx as jsx58, jsxs as jsxs51 } from "react/jsx-runtime";
4589
4699
  function parseClientState3(json) {
4590
4700
  if (!json) return null;
4591
4701
  try {
@@ -4605,12 +4715,12 @@ function spellYears(spell) {
4605
4715
  function ClubSpellCard({ spell }) {
4606
4716
  const years = spellYears(spell);
4607
4717
  return /* @__PURE__ */ jsxs51("div", { className: `ss-w-cpath-club${spell.isLoan ? " ss-w-cpath-club--loan" : ""}`, children: [
4608
- spell.crestUrl ? /* @__PURE__ */ jsx57("img", { src: spell.crestUrl, alt: "", className: "ss-w-cpath-crest", loading: "lazy" }) : /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-crest ss-w-cpath-crest--fallback", "aria-hidden": "true", children: spell.clubName.slice(0, 3).toUpperCase() }),
4718
+ spell.crestUrl ? /* @__PURE__ */ jsx58("img", { src: spell.crestUrl, alt: "", className: "ss-w-cpath-crest", loading: "lazy" }) : /* @__PURE__ */ jsx58("div", { className: "ss-w-cpath-crest ss-w-cpath-crest--fallback", "aria-hidden": "true", children: spell.clubName.slice(0, 3).toUpperCase() }),
4609
4719
  /* @__PURE__ */ jsxs51("span", { className: "ss-w-cpath-club-name", children: [
4610
4720
  spell.clubName,
4611
- spell.isLoan && /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-loan-note", children: " (loan)" })
4721
+ spell.isLoan && /* @__PURE__ */ jsx58("span", { className: "ss-w-cpath-loan-note", children: " (loan)" })
4612
4722
  ] }),
4613
- years && /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-spell-yr", children: years })
4723
+ years && /* @__PURE__ */ jsx58("span", { className: "ss-w-cpath-spell-yr", children: years })
4614
4724
  ] });
4615
4725
  }
4616
4726
  function CareerPathGame({
@@ -4619,7 +4729,7 @@ function CareerPathGame({
4619
4729
  submitting,
4620
4730
  onSubmit
4621
4731
  }) {
4622
- const [query, setQuery] = useState24("");
4732
+ const [query, setQuery] = useState25("");
4623
4733
  const inputId = useId3();
4624
4734
  const clientState = parseClientState3(result?.clientStateJson);
4625
4735
  const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
@@ -4636,12 +4746,12 @@ function CareerPathGame({
4636
4746
  onSubmit(JSON.stringify({ guesses: newGuesses }));
4637
4747
  }
4638
4748
  return /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath", "data-testid": "game-screen-career-path", children: [
4639
- !config && /* @__PURE__ */ jsx57("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
4749
+ !config && /* @__PURE__ */ jsx58("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
4640
4750
  config && /* @__PURE__ */ jsxs51(Fragment12, { children: [
4641
4751
  /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-head", children: [
4642
4752
  /* @__PURE__ */ jsxs51("div", { children: [
4643
- /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-title", children: "Career Path" }),
4644
- /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-sub", children: "Guess the mystery player from the clubs they've played for, oldest first." })
4753
+ /* @__PURE__ */ jsx58("div", { className: "ss-w-cpath-title", children: "Career Path" }),
4754
+ /* @__PURE__ */ jsx58("div", { className: "ss-w-cpath-sub", children: "Guess the mystery player from the clubs they've played for, oldest first." })
4645
4755
  ] }),
4646
4756
  clientState && !isOver && /* @__PURE__ */ jsxs51("span", { className: "ss-w-cpath-left", children: [
4647
4757
  clientState.guessesRemaining,
@@ -4649,17 +4759,17 @@ function CareerPathGame({
4649
4759
  ] })
4650
4760
  ] }),
4651
4761
  /* @__PURE__ */ jsxs51("div", { className: "ss-w-gscroll", children: [
4652
- /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-seq", children: visiblePath.map((spell, i) => /* @__PURE__ */ jsxs51(Fragment11, { children: [
4653
- i > 0 && /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-arrow", "aria-hidden": "true", children: "\u203A" }),
4654
- /* @__PURE__ */ jsx57(ClubSpellCard, { spell })
4762
+ /* @__PURE__ */ jsx58("div", { className: "ss-w-cpath-seq", children: visiblePath.map((spell, i) => /* @__PURE__ */ jsxs51(Fragment11, { children: [
4763
+ i > 0 && /* @__PURE__ */ jsx58("span", { className: "ss-w-cpath-arrow", "aria-hidden": "true", children: "\u203A" }),
4764
+ /* @__PURE__ */ jsx58(ClubSpellCard, { spell })
4655
4765
  ] }, `${spell.clubName}-${i}`)) }),
4656
4766
  clientState?.hintLine && !isOver && /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-hint", children: [
4657
4767
  "\u{1F4A1} ",
4658
4768
  clientState.hintLine
4659
4769
  ] }),
4660
4770
  isOver && clientState && /* @__PURE__ */ jsxs51("div", { className: `ss-w-cpath-banner ss-w-cpath-banner--${clientState.solved ? "solved" : "failed"}`, children: [
4661
- /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-banner-label", children: clientState.solved ? "\u2705 Career traced!" : "\u{1F614} Out of guesses" }),
4662
- clientState.revealedPlayerName && /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-banner-name", children: clientState.revealedPlayerName }),
4771
+ /* @__PURE__ */ jsx58("div", { className: "ss-w-cpath-banner-label", children: clientState.solved ? "\u2705 Career traced!" : "\u{1F614} Out of guesses" }),
4772
+ clientState.revealedPlayerName && /* @__PURE__ */ jsx58("div", { className: "ss-w-cpath-banner-name", children: clientState.revealedPlayerName }),
4663
4773
  /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-banner-sub", children: [
4664
4774
  clientState.guessesUsed,
4665
4775
  " guess",
@@ -4669,7 +4779,7 @@ function CareerPathGame({
4669
4779
  ] })
4670
4780
  ] }),
4671
4781
  !isOver && /* @__PURE__ */ jsxs51("div", { className: "ss-w-gpin ss-w-gtta", children: [
4672
- /* @__PURE__ */ jsx57(
4782
+ /* @__PURE__ */ jsx58(
4673
4783
  "input",
4674
4784
  {
4675
4785
  id: inputId,
@@ -4685,7 +4795,7 @@ function CareerPathGame({
4685
4795
  "aria-autocomplete": "list"
4686
4796
  }
4687
4797
  ),
4688
- query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx57("div", { className: "ss-w-gtta-drop", role: "listbox", children: filtered.map((p) => /* @__PURE__ */ jsx57(
4798
+ query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx58("div", { className: "ss-w-gtta-drop", role: "listbox", children: filtered.map((p) => /* @__PURE__ */ jsx58(
4689
4799
  "div",
4690
4800
  {
4691
4801
  className: "ss-w-gtta-opt",
@@ -4706,8 +4816,8 @@ function CareerPathGame({
4706
4816
  }
4707
4817
 
4708
4818
  // src/components/games/BeatTheGridGame.tsx
4709
- import React, { useState as useState25, useId as useId4 } from "react";
4710
- import { Fragment as Fragment13, jsx as jsx58, jsxs as jsxs52 } from "react/jsx-runtime";
4819
+ import React, { useState as useState26, useId as useId4 } from "react";
4820
+ import { Fragment as Fragment13, jsx as jsx59, jsxs as jsxs52 } from "react/jsx-runtime";
4711
4821
  function parseClientState4(json) {
4712
4822
  if (!json) return null;
4713
4823
  try {
@@ -4738,7 +4848,7 @@ function SearchSheet({
4738
4848
  onPick,
4739
4849
  onDismiss
4740
4850
  }) {
4741
- const [query, setQuery] = useState25("");
4851
+ const [query, setQuery] = useState26("");
4742
4852
  const inputId = useId4();
4743
4853
  const filtered = playerPool.filter(
4744
4854
  (p) => !alreadyFilledIds.has(p.id) && p.name.toLowerCase().includes(query.toLowerCase())
@@ -4746,11 +4856,11 @@ function SearchSheet({
4746
4856
  return /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-sheet", "data-testid": "btg-search-sheet", children: [
4747
4857
  /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-sheet-hdr", children: [
4748
4858
  /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-sheet-ctx", children: [
4749
- /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-sheet-row", children: rowLabel }),
4750
- /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-sheet-sep", children: "\xD7" }),
4751
- /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-sheet-col", children: colLabel })
4859
+ /* @__PURE__ */ jsx59("span", { className: "ss-w-btg-sheet-row", children: rowLabel }),
4860
+ /* @__PURE__ */ jsx59("span", { className: "ss-w-btg-sheet-sep", children: "\xD7" }),
4861
+ /* @__PURE__ */ jsx59("span", { className: "ss-w-btg-sheet-col", children: colLabel })
4752
4862
  ] }),
4753
- /* @__PURE__ */ jsx58(
4863
+ /* @__PURE__ */ jsx59(
4754
4864
  "button",
4755
4865
  {
4756
4866
  type: "button",
@@ -4762,8 +4872,8 @@ function SearchSheet({
4762
4872
  }
4763
4873
  )
4764
4874
  ] }),
4765
- playerPool.length === 0 ? /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-sheet-empty", children: "No players available to search yet." }) : /* @__PURE__ */ jsxs52("div", { className: "ss-w-gtta", children: [
4766
- /* @__PURE__ */ jsx58(
4875
+ playerPool.length === 0 ? /* @__PURE__ */ jsx59("div", { className: "ss-w-btg-sheet-empty", children: "No players available to search yet." }) : /* @__PURE__ */ jsxs52("div", { className: "ss-w-gtta", children: [
4876
+ /* @__PURE__ */ jsx59(
4767
4877
  "input",
4768
4878
  {
4769
4879
  id: inputId,
@@ -4779,7 +4889,7 @@ function SearchSheet({
4779
4889
  autoFocus: true
4780
4890
  }
4781
4891
  ),
4782
- query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx58("div", { className: "ss-w-gtta-drop ss-w-btg-ta-list", role: "listbox", children: filtered.map((p) => /* @__PURE__ */ jsx58(
4892
+ query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ss-w-gtta-drop ss-w-btg-ta-list", role: "listbox", children: filtered.map((p) => /* @__PURE__ */ jsx59(
4783
4893
  "div",
4784
4894
  {
4785
4895
  className: "ss-w-gtta-opt",
@@ -4804,7 +4914,7 @@ function BeatTheGridGame({
4804
4914
  onSubmit,
4805
4915
  playerPool
4806
4916
  }) {
4807
- const [activeCell, setActiveCell] = useState25(null);
4917
+ const [activeCell, setActiveCell] = useState26(null);
4808
4918
  const clientState = parseClientState4(result?.clientStateJson);
4809
4919
  const filledCells = clientState?.cells ?? [];
4810
4920
  const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
@@ -4822,15 +4932,15 @@ function BeatTheGridGame({
4822
4932
  onSubmit(JSON.stringify({ cells: newCells }));
4823
4933
  }
4824
4934
  if (!config) {
4825
- return /* @__PURE__ */ jsx58("div", { className: "ss-w-btg", "data-testid": "game-screen-beat-the-grid", children: /* @__PURE__ */ jsx58("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }) });
4935
+ return /* @__PURE__ */ jsx59("div", { className: "ss-w-btg", "data-testid": "game-screen-beat-the-grid", children: /* @__PURE__ */ jsx59("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }) });
4826
4936
  }
4827
4937
  const rows = config.rows;
4828
4938
  const cols = config.cols;
4829
4939
  return /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg", "data-testid": "game-screen-beat-the-grid", children: [
4830
4940
  /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-head", children: [
4831
4941
  /* @__PURE__ */ jsxs52("div", { children: [
4832
- /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-title", children: "Beat the Grid" }),
4833
- /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-sub", children: "Fill each cell with a player who fits" })
4942
+ /* @__PURE__ */ jsx59("div", { className: "ss-w-btg-title", children: "Beat the Grid" }),
4943
+ /* @__PURE__ */ jsx59("div", { className: "ss-w-btg-sub", children: "Fill each cell with a player who fits" })
4834
4944
  ] }),
4835
4945
  /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-ctx", children: [
4836
4946
  /* @__PURE__ */ jsxs52("span", { className: "ss-w-btg-ctx-score", children: [
@@ -4853,14 +4963,14 @@ function BeatTheGridGame({
4853
4963
  style: { gridTemplateColumns: `auto repeat(${cols.length}, 1fr)` },
4854
4964
  role: "grid",
4855
4965
  children: [
4856
- /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-gc ss-w-btg-gc--corner" }),
4857
- cols.map((col) => /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-gc ss-w-btg-gc--colhdr", children: col }, col)),
4966
+ /* @__PURE__ */ jsx59("div", { className: "ss-w-btg-gc ss-w-btg-gc--corner" }),
4967
+ cols.map((col) => /* @__PURE__ */ jsx59("div", { className: "ss-w-btg-gc ss-w-btg-gc--colhdr", children: col }, col)),
4858
4968
  rows.map((rowLabel, rowIdx) => /* @__PURE__ */ jsxs52(React.Fragment, { children: [
4859
- /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-gc ss-w-btg-gc--rowhdr", children: rowLabel }),
4969
+ /* @__PURE__ */ jsx59("div", { className: "ss-w-btg-gc ss-w-btg-gc--rowhdr", children: rowLabel }),
4860
4970
  cols.map((colLabel, colIdx) => {
4861
4971
  const filled = findCellResult(filledCells, rowIdx, colIdx);
4862
4972
  const isActive = activeCell?.row === rowIdx && activeCell?.col === colIdx;
4863
- return /* @__PURE__ */ jsx58(
4973
+ return /* @__PURE__ */ jsx59(
4864
4974
  "button",
4865
4975
  {
4866
4976
  type: "button",
@@ -4874,12 +4984,12 @@ function BeatTheGridGame({
4874
4984
  disabled: isLocked2 || submitting,
4875
4985
  onClick: () => handleCellClick(rowIdx, colIdx),
4876
4986
  children: filled ? /* @__PURE__ */ jsxs52(Fragment13, { children: [
4877
- /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-cell-nm", children: shortName(playerPool.find((p) => p.id === filled.playerId)?.name) }),
4987
+ /* @__PURE__ */ jsx59("span", { className: "ss-w-btg-cell-nm", children: shortName(playerPool.find((p) => p.id === filled.playerId)?.name) }),
4878
4988
  /* @__PURE__ */ jsxs52("span", { className: "ss-w-btg-cell-score", children: [
4879
4989
  filled.rarityScore,
4880
- filled.isCorrect && /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-cell-check", "aria-hidden": "true", children: " \u2713" })
4990
+ filled.isCorrect && /* @__PURE__ */ jsx59("span", { className: "ss-w-btg-cell-check", "aria-hidden": "true", children: " \u2713" })
4881
4991
  ] })
4882
- ] }) : /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-cell-empty", "aria-hidden": "true", children: "+" })
4992
+ ] }) : /* @__PURE__ */ jsx59("span", { className: "ss-w-btg-cell-empty", "aria-hidden": "true", children: "+" })
4883
4993
  },
4884
4994
  `cell-${rowIdx}-${colIdx}`
4885
4995
  );
@@ -4889,8 +4999,8 @@ function BeatTheGridGame({
4889
4999
  }
4890
5000
  ),
4891
5001
  isLocked2 && /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-done", children: [
4892
- /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-done-label", children: "\u{1F532} Grid complete" }),
4893
- /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-done-score", children: clientState?.totalScore ?? 0 }),
5002
+ /* @__PURE__ */ jsx59("div", { className: "ss-w-btg-done-label", children: "\u{1F532} Grid complete" }),
5003
+ /* @__PURE__ */ jsx59("div", { className: "ss-w-btg-done-score", children: clientState?.totalScore ?? 0 }),
4894
5004
  /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-done-sub", children: [
4895
5005
  filledCells.filter((c) => c.isCorrect).length,
4896
5006
  "/",
@@ -4899,7 +5009,7 @@ function BeatTheGridGame({
4899
5009
  ] })
4900
5010
  ] })
4901
5011
  ] }),
4902
- activeCell !== null && /* @__PURE__ */ jsx58("div", { className: "ss-w-gpin", children: /* @__PURE__ */ jsx58(
5012
+ activeCell !== null && /* @__PURE__ */ jsx59("div", { className: "ss-w-gpin", children: /* @__PURE__ */ jsx59(
4903
5013
  SearchSheet,
4904
5014
  {
4905
5015
  row: activeCell.row,
@@ -4916,9 +5026,9 @@ function BeatTheGridGame({
4916
5026
  }
4917
5027
 
4918
5028
  // src/components/games/GuessTheXiGame.tsx
4919
- import { useState as useState26, useId as useId5 } from "react";
4920
- import { Fragment as Fragment14, jsx as jsx59, jsxs as jsxs53 } from "react/jsx-runtime";
4921
- var MAX_GUESSES = 3;
5029
+ import { useState as useState27, useId as useId5 } from "react";
5030
+ import { Fragment as Fragment14, jsx as jsx60, jsxs as jsxs53 } from "react/jsx-runtime";
5031
+ var MAX_GUESSES2 = 3;
4922
5032
  function parseClientState5(json) {
4923
5033
  if (!json) return null;
4924
5034
  try {
@@ -4984,7 +5094,7 @@ function GuessTheXiGame({
4984
5094
  submitting,
4985
5095
  onSubmit
4986
5096
  }) {
4987
- const [query, setQuery] = useState26("");
5097
+ const [query, setQuery] = useState27("");
4988
5098
  const inputId = useId5();
4989
5099
  const clientState = parseClientState5(result?.clientStateJson);
4990
5100
  const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
@@ -5010,13 +5120,13 @@ function GuessTheXiGame({
5010
5120
  const wrongGuesses = (clientState?.guessHistory ?? []).filter((g) => !g.wasCorrect);
5011
5121
  const revealCount = nameBySlot.size;
5012
5122
  return /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi", "data-testid": "game-screen-guess-the-xi", children: [
5013
- !config && /* @__PURE__ */ jsx59("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
5123
+ !config && /* @__PURE__ */ jsx60("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
5014
5124
  config && /* @__PURE__ */ jsxs53(Fragment14, { children: [
5015
5125
  /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-head", children: [
5016
5126
  /* @__PURE__ */ jsxs53("div", { children: [
5017
5127
  /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-title", children: [
5018
5128
  "Guess the XI",
5019
- formation && /* @__PURE__ */ jsx59("span", { className: "ss-w-gxi-form", "aria-label": `Formation ${formation}`, children: formation })
5129
+ formation && /* @__PURE__ */ jsx60("span", { className: "ss-w-gxi-form", "aria-label": `Formation ${formation}`, children: formation })
5020
5130
  ] }),
5021
5131
  /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-sub", children: [
5022
5132
  "Name the team \xB7 flags are each player's nationality \xB7 ",
@@ -5024,16 +5134,16 @@ function GuessTheXiGame({
5024
5134
  ] })
5025
5135
  ] }),
5026
5136
  clientState && !isOver && /* @__PURE__ */ jsxs53("span", { className: "ss-w-gxi-left", children: [
5027
- Math.max(0, MAX_GUESSES - clientState.guessesUsed),
5137
+ Math.max(0, MAX_GUESSES2 - clientState.guessesUsed),
5028
5138
  " left"
5029
5139
  ] })
5030
5140
  ] }),
5031
5141
  /* @__PURE__ */ jsxs53("div", { className: "ss-w-gscroll", children: [
5032
- rows.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-pitch", children: rows.map((row, r) => /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-prow", children: row.map((pos, c) => {
5142
+ rows.length > 0 && /* @__PURE__ */ jsx60("div", { className: "ss-w-gxi-pitch", children: rows.map((row, r) => /* @__PURE__ */ jsx60("div", { className: "ss-w-gxi-prow", children: row.map((pos, c) => {
5033
5143
  const posLabel = pos.slot ? posBySlot.get(pos.slot) ?? "" : "";
5034
5144
  const name = pos.slot ? nameBySlot.get(pos.slot) : void 0;
5035
5145
  return /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-slot", children: [
5036
- /* @__PURE__ */ jsx59(
5146
+ /* @__PURE__ */ jsx60(
5037
5147
  "div",
5038
5148
  {
5039
5149
  className: `ss-w-gxi-flag${name ? " ss-w-gxi-flag--revealed" : ""}`,
@@ -5042,8 +5152,8 @@ function GuessTheXiGame({
5042
5152
  children: nationalityFlag(pos.nationality)
5043
5153
  }
5044
5154
  ),
5045
- posLabel && /* @__PURE__ */ jsx59("span", { className: "ss-w-gxi-pos", children: posLabel }),
5046
- name && /* @__PURE__ */ jsx59("span", { className: "ss-w-gxi-flag-lab", children: surname(name) })
5155
+ posLabel && /* @__PURE__ */ jsx60("span", { className: "ss-w-gxi-pos", children: posLabel }),
5156
+ name && /* @__PURE__ */ jsx60("span", { className: "ss-w-gxi-flag-lab", children: surname(name) })
5047
5157
  ] }, `${pos.slot}-${c}`);
5048
5158
  }) }, r)) }),
5049
5159
  revealCount > 0 && !isOver && /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-revnote", children: [
@@ -5053,13 +5163,13 @@ function GuessTheXiGame({
5053
5163
  revealCount === 1 ? "" : "s",
5054
5164
  " revealed \u2014 highlighted on the pitch"
5055
5165
  ] }),
5056
- !isOver && wrongGuesses.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-wrong", children: wrongGuesses.map((g) => {
5166
+ !isOver && wrongGuesses.length > 0 && /* @__PURE__ */ jsx60("div", { className: "ss-w-gxi-wrong", children: wrongGuesses.map((g) => {
5057
5167
  const team = config.teamPool.find((t) => t.teamId === g.teamId);
5058
- return /* @__PURE__ */ jsx59("span", { className: "ss-w-gxi-wrong-pill", children: team?.teamName ?? `#${g.teamId}` }, g.teamId);
5168
+ return /* @__PURE__ */ jsx60("span", { className: "ss-w-gxi-wrong-pill", children: team?.teamName ?? `#${g.teamId}` }, g.teamId);
5059
5169
  }) }),
5060
5170
  isOver && clientState && /* @__PURE__ */ jsxs53("div", { className: `ss-w-gxi-banner ss-w-gxi-banner--${solved ? "solved" : "failed"}`, children: [
5061
- /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-banner-label", children: solved ? "\u2705 Solved!" : "\u{1F614} Out of guesses" }),
5062
- /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-banner-score", children: clientState.score }),
5171
+ /* @__PURE__ */ jsx60("div", { className: "ss-w-gxi-banner-label", children: solved ? "\u2705 Solved!" : "\u{1F614} Out of guesses" }),
5172
+ /* @__PURE__ */ jsx60("div", { className: "ss-w-gxi-banner-score", children: clientState.score }),
5063
5173
  /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-banner-sub", children: [
5064
5174
  clientState.guessesUsed,
5065
5175
  " guess",
@@ -5069,7 +5179,7 @@ function GuessTheXiGame({
5069
5179
  ] })
5070
5180
  ] }),
5071
5181
  !isOver && /* @__PURE__ */ jsxs53("div", { className: "ss-w-gpin ss-w-gtta", children: [
5072
- /* @__PURE__ */ jsx59(
5182
+ /* @__PURE__ */ jsx60(
5073
5183
  "input",
5074
5184
  {
5075
5185
  id: inputId,
@@ -5085,7 +5195,7 @@ function GuessTheXiGame({
5085
5195
  "aria-autocomplete": "list"
5086
5196
  }
5087
5197
  ),
5088
- query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ss-w-gtta-drop", role: "listbox", children: filtered.map((t) => /* @__PURE__ */ jsx59(
5198
+ query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx60("div", { className: "ss-w-gtta-drop", role: "listbox", children: filtered.map((t) => /* @__PURE__ */ jsx60(
5089
5199
  "div",
5090
5200
  {
5091
5201
  className: "ss-w-gtta-opt",
@@ -5106,8 +5216,8 @@ function GuessTheXiGame({
5106
5216
  }
5107
5217
 
5108
5218
  // src/components/games/DailyQuizGame.tsx
5109
- import { useState as useState27 } from "react";
5110
- import { Fragment as Fragment15, jsx as jsx60, jsxs as jsxs54 } from "react/jsx-runtime";
5219
+ import { useState as useState28 } from "react";
5220
+ import { Fragment as Fragment15, jsx as jsx61, jsxs as jsxs54 } from "react/jsx-runtime";
5111
5221
  function parseClientState6(json) {
5112
5222
  if (!json) return null;
5113
5223
  try {
@@ -5125,7 +5235,7 @@ function DailyQuizGame({
5125
5235
  submitting,
5126
5236
  onSubmit
5127
5237
  }) {
5128
- const [selections, setSelections] = useState27(/* @__PURE__ */ new Map());
5238
+ const [selections, setSelections] = useState28(/* @__PURE__ */ new Map());
5129
5239
  const clientState = parseClientState6(result?.clientStateJson);
5130
5240
  const isRevealed = (clientState?.results.length ?? 0) > 0 || result?.alreadyPlayed === true;
5131
5241
  const allAnswered = config != null && selections.size === config.questions.length;
@@ -5142,25 +5252,25 @@ function DailyQuizGame({
5142
5252
  onSubmit(JSON.stringify({ answers }));
5143
5253
  }
5144
5254
  return /* @__PURE__ */ jsxs54("div", { className: "ss-w-dq", "data-testid": "game-screen-daily-quiz", children: [
5145
- !config && /* @__PURE__ */ jsx60("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
5255
+ !config && /* @__PURE__ */ jsx61("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
5146
5256
  config && /* @__PURE__ */ jsxs54(Fragment15, { children: [
5147
5257
  isRevealed && result?.score != null && /* @__PURE__ */ jsxs54("div", { className: "ss-w-dq-score", children: [
5148
- /* @__PURE__ */ jsx60("span", { className: "ss-w-dq-score-val", children: result.score }),
5149
- /* @__PURE__ */ jsx60("span", { className: "ss-w-dq-score-label", children: "pts" })
5258
+ /* @__PURE__ */ jsx61("span", { className: "ss-w-dq-score-val", children: result.score }),
5259
+ /* @__PURE__ */ jsx61("span", { className: "ss-w-dq-score-label", children: "pts" })
5150
5260
  ] }),
5151
- !isRevealed && /* @__PURE__ */ jsx60("div", { className: "ss-w-dq-prog", children: /* @__PURE__ */ jsx60(
5261
+ !isRevealed && /* @__PURE__ */ jsx61("div", { className: "ss-w-dq-prog", children: /* @__PURE__ */ jsx61(
5152
5262
  "div",
5153
5263
  {
5154
5264
  className: "ss-w-dq-prog-fill",
5155
5265
  style: { width: `${Math.round(selections.size / config.questions.length * 100)}%` }
5156
5266
  }
5157
5267
  ) }),
5158
- /* @__PURE__ */ jsx60("div", { className: "ss-w-dq-questions", children: config.questions.map((q) => {
5268
+ /* @__PURE__ */ jsx61("div", { className: "ss-w-dq-questions", children: config.questions.map((q) => {
5159
5269
  const qResult = clientState ? findResult(clientState.results, q.index) : void 0;
5160
5270
  const selectedIdx = selections.get(q.index);
5161
5271
  return /* @__PURE__ */ jsxs54("div", { className: "ss-w-dq-q", children: [
5162
- /* @__PURE__ */ jsx60("div", { className: "ss-w-dq-qstem", children: q.stem }),
5163
- /* @__PURE__ */ jsx60("div", { className: "ss-w-dq-opts", children: q.options.map((opt, optIdx) => {
5272
+ /* @__PURE__ */ jsx61("div", { className: "ss-w-dq-qstem", children: q.stem }),
5273
+ /* @__PURE__ */ jsx61("div", { className: "ss-w-dq-opts", children: q.options.map((opt, optIdx) => {
5164
5274
  let optCls = "ss-w-dq-qopt";
5165
5275
  if (qResult) {
5166
5276
  if (optIdx === qResult.correctOptionIndex) {
@@ -5179,17 +5289,17 @@ function DailyQuizGame({
5179
5289
  disabled: isRevealed || submitting,
5180
5290
  onClick: () => handleSelect(q.index, optIdx),
5181
5291
  children: [
5182
- /* @__PURE__ */ jsx60("span", { className: "ss-w-dq-qopt-letter", children: String.fromCharCode(65 + optIdx) }),
5183
- /* @__PURE__ */ jsx60("span", { className: "ss-w-dq-qopt-text", children: opt })
5292
+ /* @__PURE__ */ jsx61("span", { className: "ss-w-dq-qopt-letter", children: String.fromCharCode(65 + optIdx) }),
5293
+ /* @__PURE__ */ jsx61("span", { className: "ss-w-dq-qopt-text", children: opt })
5184
5294
  ]
5185
5295
  },
5186
5296
  optIdx
5187
5297
  );
5188
5298
  }) }),
5189
- qResult?.revealText && /* @__PURE__ */ jsx60("div", { className: `ss-w-dq-qwhy ss-w-dq-qwhy--${qResult.isCorrect ? "correct" : "wrong"}`, children: qResult.revealText })
5299
+ qResult?.revealText && /* @__PURE__ */ jsx61("div", { className: `ss-w-dq-qwhy ss-w-dq-qwhy--${qResult.isCorrect ? "correct" : "wrong"}`, children: qResult.revealText })
5190
5300
  ] }, q.index);
5191
5301
  }) }),
5192
- !isRevealed && /* @__PURE__ */ jsx60(
5302
+ !isRevealed && /* @__PURE__ */ jsx61(
5193
5303
  "button",
5194
5304
  {
5195
5305
  type: "button",
@@ -5205,8 +5315,8 @@ function DailyQuizGame({
5205
5315
  }
5206
5316
 
5207
5317
  // src/components/games/MatchdayPredictorGame.tsx
5208
- import { useState as useState28 } from "react";
5209
- import { jsx as jsx61, jsxs as jsxs55 } from "react/jsx-runtime";
5318
+ import { useState as useState29 } from "react";
5319
+ import { jsx as jsx62, jsxs as jsxs55 } from "react/jsx-runtime";
5210
5320
  function parseClientState7(json) {
5211
5321
  if (!json) return null;
5212
5322
  try {
@@ -5228,9 +5338,9 @@ function MatchdayPredictorGame({
5228
5338
  submitting,
5229
5339
  onSubmit
5230
5340
  }) {
5231
- const [homeScore, setHomeScore] = useState28(0);
5232
- const [awayScore, setAwayScore] = useState28(0);
5233
- const [firstScorerPlayerId, setFirstScorerPlayerId] = useState28(null);
5341
+ const [homeScore, setHomeScore] = useState29(0);
5342
+ const [awayScore, setAwayScore] = useState29(0);
5343
+ const [firstScorerPlayerId, setFirstScorerPlayerId] = useState29(null);
5234
5344
  const clientState = parseClientState7(result?.clientStateJson);
5235
5345
  const alreadyPlayed = result?.alreadyPlayed === true;
5236
5346
  if (alreadyPlayed && clientState) {
@@ -5242,28 +5352,28 @@ function MatchdayPredictorGame({
5242
5352
  " \u2013 ",
5243
5353
  clientState.predictedAwayScore
5244
5354
  ] }),
5245
- /* @__PURE__ */ jsx61("div", { className: "ss-w-mp-live-label", children: "Locked in \u2014 awaiting result" })
5355
+ /* @__PURE__ */ jsx62("div", { className: "ss-w-mp-live-label", children: "Locked in \u2014 awaiting result" })
5246
5356
  ] }),
5247
- /* @__PURE__ */ jsx61("div", { className: "ss-w-mp-fun", children: "For fun \u2014 not in the leaderboard" })
5357
+ /* @__PURE__ */ jsx62("div", { className: "ss-w-mp-fun", children: "For fun \u2014 not in the leaderboard" })
5248
5358
  ] });
5249
5359
  }
5250
5360
  const r = clientState.result;
5251
5361
  const actualScore = `${r.homeScore} \u2013 ${r.awayScore}`;
5252
5362
  return /* @__PURE__ */ jsxs55("div", { className: "ss-w-mp", "data-testid": "game-screen-matchday-predictor", children: [
5253
5363
  /* @__PURE__ */ jsxs55("div", { className: "ss-w-mp-live", children: [
5254
- /* @__PURE__ */ jsx61("div", { className: "ss-w-mp-live-score", children: actualScore }),
5255
- /* @__PURE__ */ jsx61("div", { className: "ss-w-mp-live-label", children: "Full-time result" }),
5364
+ /* @__PURE__ */ jsx62("div", { className: "ss-w-mp-live-score", children: actualScore }),
5365
+ /* @__PURE__ */ jsx62("div", { className: "ss-w-mp-live-label", children: "Full-time result" }),
5256
5366
  /* @__PURE__ */ jsxs55("div", { className: "ss-w-mp-live-outcome", children: [
5257
5367
  /* @__PURE__ */ jsxs55("div", { className: `ss-w-mp-live-row${clientState.exactScoreCorrect ? " ss-w-mp-live-row--correct" : ""}`, children: [
5258
- /* @__PURE__ */ jsx61("span", { className: "ss-w-mp-live-row-key", children: "Exact score" }),
5259
- /* @__PURE__ */ jsx61("span", { className: "ss-w-mp-live-row-val", children: clientState.exactScoreCorrect ? "\u2713" : "\u2717" })
5368
+ /* @__PURE__ */ jsx62("span", { className: "ss-w-mp-live-row-key", children: "Exact score" }),
5369
+ /* @__PURE__ */ jsx62("span", { className: "ss-w-mp-live-row-val", children: clientState.exactScoreCorrect ? "\u2713" : "\u2717" })
5260
5370
  ] }),
5261
5371
  /* @__PURE__ */ jsxs55("div", { className: `ss-w-mp-live-row${clientState.outcomeCorrect ? " ss-w-mp-live-row--correct" : ""}`, children: [
5262
- /* @__PURE__ */ jsx61("span", { className: "ss-w-mp-live-row-key", children: "Result (W/D/L)" }),
5263
- /* @__PURE__ */ jsx61("span", { className: "ss-w-mp-live-row-val", children: clientState.outcomeCorrect ? "\u2713" : "\u2717" })
5372
+ /* @__PURE__ */ jsx62("span", { className: "ss-w-mp-live-row-key", children: "Result (W/D/L)" }),
5373
+ /* @__PURE__ */ jsx62("span", { className: "ss-w-mp-live-row-val", children: clientState.outcomeCorrect ? "\u2713" : "\u2717" })
5264
5374
  ] }),
5265
5375
  !clientState.firstScorerVoid && /* @__PURE__ */ jsxs55("div", { className: `ss-w-mp-live-row${clientState.firstScorerCorrect ? " ss-w-mp-live-row--correct" : ""}`, children: [
5266
- /* @__PURE__ */ jsx61("span", { className: "ss-w-mp-live-row-key", children: "First scorer" }),
5376
+ /* @__PURE__ */ jsx62("span", { className: "ss-w-mp-live-row-key", children: "First scorer" }),
5267
5377
  /* @__PURE__ */ jsxs55("span", { className: "ss-w-mp-live-row-val", children: [
5268
5378
  clientState.firstScorerCorrect ? "\u2713" : "\u2717",
5269
5379
  r.firstScorerName ? ` ${r.firstScorerName}` : ""
@@ -5271,11 +5381,11 @@ function MatchdayPredictorGame({
5271
5381
  ] })
5272
5382
  ] })
5273
5383
  ] }),
5274
- /* @__PURE__ */ jsx61("div", { className: "ss-w-mp-fun", children: "For fun \u2014 not in the leaderboard" })
5384
+ /* @__PURE__ */ jsx62("div", { className: "ss-w-mp-fun", children: "For fun \u2014 not in the leaderboard" })
5275
5385
  ] });
5276
5386
  }
5277
5387
  if (!config) {
5278
- return /* @__PURE__ */ jsx61("div", { className: "ss-w-mp", "data-testid": "game-screen-matchday-predictor", children: /* @__PURE__ */ jsx61("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }) });
5388
+ return /* @__PURE__ */ jsx62("div", { className: "ss-w-mp", "data-testid": "game-screen-matchday-predictor", children: /* @__PURE__ */ jsx62("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }) });
5279
5389
  }
5280
5390
  const locked = isLocked(config.kickoffUtc);
5281
5391
  const disabled = locked || submitting;
@@ -5292,9 +5402,9 @@ function MatchdayPredictorGame({
5292
5402
  return /* @__PURE__ */ jsxs55("div", { className: "ss-w-mp", "data-testid": "game-screen-matchday-predictor", children: [
5293
5403
  /* @__PURE__ */ jsxs55("div", { className: "ss-w-mp-pred-score", children: [
5294
5404
  /* @__PURE__ */ jsxs55("div", { className: "ss-w-mp-team", children: [
5295
- /* @__PURE__ */ jsx61("div", { className: "ss-w-mp-team-name", children: config.homeTeam.name }),
5405
+ /* @__PURE__ */ jsx62("div", { className: "ss-w-mp-team-name", children: config.homeTeam.name }),
5296
5406
  /* @__PURE__ */ jsxs55("div", { className: "ss-w-mp-stepper", children: [
5297
- /* @__PURE__ */ jsx61(
5407
+ /* @__PURE__ */ jsx62(
5298
5408
  "button",
5299
5409
  {
5300
5410
  type: "button",
@@ -5305,8 +5415,8 @@ function MatchdayPredictorGame({
5305
5415
  children: "\u2212"
5306
5416
  }
5307
5417
  ),
5308
- /* @__PURE__ */ jsx61("span", { className: "ss-w-mp-stepper-val", children: homeScore }),
5309
- /* @__PURE__ */ jsx61(
5418
+ /* @__PURE__ */ jsx62("span", { className: "ss-w-mp-stepper-val", children: homeScore }),
5419
+ /* @__PURE__ */ jsx62(
5310
5420
  "button",
5311
5421
  {
5312
5422
  type: "button",
@@ -5319,11 +5429,11 @@ function MatchdayPredictorGame({
5319
5429
  )
5320
5430
  ] })
5321
5431
  ] }),
5322
- /* @__PURE__ */ jsx61("span", { className: "ss-w-mp-sep", children: "\u2013" }),
5432
+ /* @__PURE__ */ jsx62("span", { className: "ss-w-mp-sep", children: "\u2013" }),
5323
5433
  /* @__PURE__ */ jsxs55("div", { className: "ss-w-mp-team", children: [
5324
- /* @__PURE__ */ jsx61("div", { className: "ss-w-mp-team-name", children: config.awayTeam.name }),
5434
+ /* @__PURE__ */ jsx62("div", { className: "ss-w-mp-team-name", children: config.awayTeam.name }),
5325
5435
  /* @__PURE__ */ jsxs55("div", { className: "ss-w-mp-stepper", children: [
5326
- /* @__PURE__ */ jsx61(
5436
+ /* @__PURE__ */ jsx62(
5327
5437
  "button",
5328
5438
  {
5329
5439
  type: "button",
@@ -5334,8 +5444,8 @@ function MatchdayPredictorGame({
5334
5444
  children: "\u2212"
5335
5445
  }
5336
5446
  ),
5337
- /* @__PURE__ */ jsx61("span", { className: "ss-w-mp-stepper-val", children: awayScore }),
5338
- /* @__PURE__ */ jsx61(
5447
+ /* @__PURE__ */ jsx62("span", { className: "ss-w-mp-stepper-val", children: awayScore }),
5448
+ /* @__PURE__ */ jsx62(
5339
5449
  "button",
5340
5450
  {
5341
5451
  type: "button",
@@ -5350,8 +5460,8 @@ function MatchdayPredictorGame({
5350
5460
  ] })
5351
5461
  ] }),
5352
5462
  config.scorerPool.length > 0 && /* @__PURE__ */ jsxs55("div", { className: "ss-w-mp-scorer", children: [
5353
- /* @__PURE__ */ jsx61("div", { className: "ss-w-mp-scorer-label", children: "First scorer (optional)" }),
5354
- /* @__PURE__ */ jsx61("div", { className: "ss-w-mp-scorer-list", children: config.scorerPool.map((p) => /* @__PURE__ */ jsx61(
5463
+ /* @__PURE__ */ jsx62("div", { className: "ss-w-mp-scorer-label", children: "First scorer (optional)" }),
5464
+ /* @__PURE__ */ jsx62("div", { className: "ss-w-mp-scorer-list", children: config.scorerPool.map((p) => /* @__PURE__ */ jsx62(
5355
5465
  "button",
5356
5466
  {
5357
5467
  type: "button",
@@ -5363,8 +5473,8 @@ function MatchdayPredictorGame({
5363
5473
  p.playerId
5364
5474
  )) })
5365
5475
  ] }),
5366
- locked && /* @__PURE__ */ jsx61("div", { className: "ss-w-mp-live-label", children: "Submissions are now closed" }),
5367
- /* @__PURE__ */ jsx61(
5476
+ locked && /* @__PURE__ */ jsx62("div", { className: "ss-w-mp-live-label", children: "Submissions are now closed" }),
5477
+ /* @__PURE__ */ jsx62(
5368
5478
  "button",
5369
5479
  {
5370
5480
  type: "button",
@@ -5375,13 +5485,13 @@ function MatchdayPredictorGame({
5375
5485
  children: submitting ? "Saving\u2026" : "Save prediction"
5376
5486
  }
5377
5487
  ),
5378
- /* @__PURE__ */ jsx61("div", { className: "ss-w-mp-fun", children: "For fun \u2014 not in the leaderboard" })
5488
+ /* @__PURE__ */ jsx62("div", { className: "ss-w-mp-fun", children: "For fun \u2014 not in the leaderboard" })
5379
5489
  ] });
5380
5490
  }
5381
5491
 
5382
5492
  // src/components/games/StartingXiGame.tsx
5383
- import { useState as useState29 } from "react";
5384
- import { jsx as jsx62, jsxs as jsxs56 } from "react/jsx-runtime";
5493
+ import { useState as useState30 } from "react";
5494
+ import { jsx as jsx63, jsxs as jsxs56 } from "react/jsx-runtime";
5385
5495
  function parseClientState8(json) {
5386
5496
  if (!json) return null;
5387
5497
  try {
@@ -5401,23 +5511,23 @@ function StartingXiGame({
5401
5511
  submitting,
5402
5512
  onSubmit
5403
5513
  }) {
5404
- const [picked, setPicked] = useState29([]);
5514
+ const [picked, setPicked] = useState30([]);
5405
5515
  const clientState = parseClientState8(result?.clientStateJson);
5406
5516
  const alreadyPlayed = result?.alreadyPlayed === true;
5407
5517
  if (alreadyPlayed) {
5408
5518
  if (!clientState) {
5409
- return /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi", "data-testid": "game-screen-starting-xi", children: /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi-status", children: /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi-status-label", children: "This game has been voided" }) }) });
5519
+ return /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi", "data-testid": "game-screen-starting-xi", children: /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi-status", children: /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi-status-label", children: "This game has been voided" }) }) });
5410
5520
  }
5411
5521
  if (clientState.status === "pending") {
5412
- return /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi", "data-testid": "game-screen-starting-xi", children: /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi-status", children: /* @__PURE__ */ jsxs56("div", { className: "ss-w-sxi-status-label", children: [
5522
+ return /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi", "data-testid": "game-screen-starting-xi", children: /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi-status", children: /* @__PURE__ */ jsxs56("div", { className: "ss-w-sxi-status-label", children: [
5413
5523
  "Prediction locked in (",
5414
5524
  clientState.predictedCount,
5415
5525
  " players) \u2014 awaiting result"
5416
5526
  ] }) }) });
5417
5527
  }
5418
5528
  if (clientState.status === "graded") {
5419
- return /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi", "data-testid": "game-screen-starting-xi", children: /* @__PURE__ */ jsxs56("div", { className: "ss-w-sxi-status ss-w-sxi-status--graded", children: [
5420
- /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi-status-score", children: clientState.score }),
5529
+ return /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi", "data-testid": "game-screen-starting-xi", children: /* @__PURE__ */ jsxs56("div", { className: "ss-w-sxi-status ss-w-sxi-status--graded", children: [
5530
+ /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi-status-score", children: clientState.score }),
5421
5531
  /* @__PURE__ */ jsxs56("div", { className: "ss-w-sxi-status-label", children: [
5422
5532
  clientState.correctCount,
5423
5533
  " correct starters"
@@ -5426,7 +5536,7 @@ function StartingXiGame({
5426
5536
  }
5427
5537
  }
5428
5538
  if (!config) {
5429
- return /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi", "data-testid": "game-screen-starting-xi", children: /* @__PURE__ */ jsx62("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }) });
5539
+ return /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi", "data-testid": "game-screen-starting-xi", children: /* @__PURE__ */ jsx63("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }) });
5430
5540
  }
5431
5541
  const formationRows = parseFormationRows(config.formation);
5432
5542
  const pickedSet = new Set(picked);
@@ -5452,8 +5562,8 @@ function StartingXiGame({
5452
5562
  return { rowIdx, count, rowSlots };
5453
5563
  });
5454
5564
  return /* @__PURE__ */ jsxs56("div", { className: "ss-w-sxi", "data-testid": "game-screen-starting-xi", children: [
5455
- /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi-formation", children: config.formation }),
5456
- /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi-pitch", children: pitchRows.map(({ rowIdx, count, rowSlots }) => /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi-pitch-row", children: Array.from({ length: count }).map((_, i) => {
5565
+ /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi-formation", children: config.formation }),
5566
+ /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi-pitch", children: pitchRows.map(({ rowIdx, count, rowSlots }) => /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi-pitch-row", children: Array.from({ length: count }).map((_, i) => {
5457
5567
  const playerId = rowSlots[i];
5458
5568
  const player = playerId != null ? config.squadSheet.find((p) => p.playerId === playerId) : void 0;
5459
5569
  return /* @__PURE__ */ jsxs56(
@@ -5470,14 +5580,14 @@ function StartingXiGame({
5470
5580
  role: player ? "button" : void 0,
5471
5581
  "aria-label": player ? `Remove ${player.playerName ?? ""}` : void 0,
5472
5582
  children: [
5473
- /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi-pslot-num", children: player?.jerseyNumber ?? (rowIdx === 0 ? "GK" : "?") }),
5474
- /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi-pslot-name", children: player?.playerName ?? "" })
5583
+ /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi-pslot-num", children: player?.jerseyNumber ?? (rowIdx === 0 ? "GK" : "?") }),
5584
+ /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi-pslot-name", children: player?.playerName ?? "" })
5475
5585
  ]
5476
5586
  },
5477
5587
  i
5478
5588
  );
5479
5589
  }) }, rowIdx)) }),
5480
- /* @__PURE__ */ jsx62("div", { className: "ss-w-sxi-squad", children: config.squadSheet.map((p) => {
5590
+ /* @__PURE__ */ jsx63("div", { className: "ss-w-sxi-squad", children: config.squadSheet.map((p) => {
5481
5591
  const isPicked = pickedSet.has(p.playerId);
5482
5592
  return /* @__PURE__ */ jsxs56(
5483
5593
  "div",
@@ -5491,14 +5601,14 @@ function StartingXiGame({
5491
5601
  role: "button",
5492
5602
  "aria-pressed": isPicked,
5493
5603
  children: [
5494
- /* @__PURE__ */ jsx62("span", { className: "ss-w-sxi-squad-name", children: p.playerName }),
5495
- /* @__PURE__ */ jsx62("span", { className: "ss-w-sxi-squad-pos", children: p.positionName })
5604
+ /* @__PURE__ */ jsx63("span", { className: "ss-w-sxi-squad-name", children: p.playerName }),
5605
+ /* @__PURE__ */ jsx63("span", { className: "ss-w-sxi-squad-pos", children: p.positionName })
5496
5606
  ]
5497
5607
  },
5498
5608
  p.playerId
5499
5609
  );
5500
5610
  }) }),
5501
- /* @__PURE__ */ jsx62(
5611
+ /* @__PURE__ */ jsx63(
5502
5612
  "button",
5503
5613
  {
5504
5614
  type: "button",
@@ -5513,7 +5623,7 @@ function StartingXiGame({
5513
5623
  }
5514
5624
 
5515
5625
  // src/components/games/StatLadderGame.tsx
5516
- import { jsx as jsx63, jsxs as jsxs57 } from "react/jsx-runtime";
5626
+ import { jsx as jsx64, jsxs as jsxs57 } from "react/jsx-runtime";
5517
5627
  function parseClientState9(json) {
5518
5628
  if (!json) return null;
5519
5629
  try {
@@ -5531,12 +5641,12 @@ function StatLadderGame({
5531
5641
  const clientState = parseClientState9(result?.clientStateJson);
5532
5642
  const revealed = clientState != null;
5533
5643
  if (!config) {
5534
- return /* @__PURE__ */ jsx63("div", { className: "ss-w-sl", "data-testid": "game-screen-stat-ladder", children: /* @__PURE__ */ jsx63("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }) });
5644
+ return /* @__PURE__ */ jsx64("div", { className: "ss-w-sl", "data-testid": "game-screen-stat-ladder", children: /* @__PURE__ */ jsx64("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }) });
5535
5645
  }
5536
5646
  const mysteryName = revealed ? clientState.revealedRank2.playerName : null;
5537
5647
  return /* @__PURE__ */ jsxs57("div", { className: "ss-w-sl", "data-testid": "game-screen-stat-ladder", children: [
5538
- /* @__PURE__ */ jsx63("div", { className: "ss-w-sl-title", children: config.statLabel }),
5539
- /* @__PURE__ */ jsx63("div", { className: "ss-w-sl-ladder", children: config.ladder.map((rung) => {
5648
+ /* @__PURE__ */ jsx64("div", { className: "ss-w-sl-title", children: config.statLabel }),
5649
+ /* @__PURE__ */ jsx64("div", { className: "ss-w-sl-ladder", children: config.ladder.map((rung) => {
5540
5650
  const isMystery = rung.rank === 2;
5541
5651
  let rowCls = "ss-w-sl-lrow";
5542
5652
  if (isMystery) rowCls += " ss-w-sl-mystery";
@@ -5550,12 +5660,12 @@ function StatLadderGame({
5550
5660
  "#",
5551
5661
  rung.rank
5552
5662
  ] }),
5553
- /* @__PURE__ */ jsx63("div", { className: "ss-w-sl-lrow-name", children: displayName }),
5554
- /* @__PURE__ */ jsx63("div", { className: "ss-w-sl-lrow-stat", children: rung.statValue })
5663
+ /* @__PURE__ */ jsx64("div", { className: "ss-w-sl-lrow-name", children: displayName }),
5664
+ /* @__PURE__ */ jsx64("div", { className: "ss-w-sl-lrow-stat", children: rung.statValue })
5555
5665
  ] }, rung.rank);
5556
5666
  }) }),
5557
- revealed && /* @__PURE__ */ jsx63("div", { className: `ss-w-sl-reveal ss-w-sl-reveal--${clientState.isCorrect ? "correct" : "wrong"}`, children: clientState.isCorrect ? "Correct!" : `Wrong \u2014 it was ${clientState.revealedRank2.playerName}` }),
5558
- !revealed && /* @__PURE__ */ jsx63("div", { className: "ss-w-sl-picker", children: config.playerPool.map((p) => /* @__PURE__ */ jsx63(
5667
+ revealed && /* @__PURE__ */ jsx64("div", { className: `ss-w-sl-reveal ss-w-sl-reveal--${clientState.isCorrect ? "correct" : "wrong"}`, children: clientState.isCorrect ? "Correct!" : `Wrong \u2014 it was ${clientState.revealedRank2.playerName}` }),
5668
+ !revealed && /* @__PURE__ */ jsx64("div", { className: "ss-w-sl-picker", children: config.playerPool.map((p) => /* @__PURE__ */ jsx64(
5559
5669
  "button",
5560
5670
  {
5561
5671
  type: "button",
@@ -5571,7 +5681,7 @@ function StatLadderGame({
5571
5681
  }
5572
5682
 
5573
5683
  // src/components/games/FanMotmGame.tsx
5574
- import { jsx as jsx64, jsxs as jsxs58 } from "react/jsx-runtime";
5684
+ import { jsx as jsx65, jsxs as jsxs58 } from "react/jsx-runtime";
5575
5685
  function parseClientState10(json) {
5576
5686
  if (!json) return null;
5577
5687
  try {
@@ -5589,7 +5699,7 @@ function FanMotmGame({
5589
5699
  const clientState = parseClientState10(result?.clientStateJson);
5590
5700
  const alreadyVoted = result?.alreadyPlayed === true;
5591
5701
  if (!config) {
5592
- return /* @__PURE__ */ jsx64("div", { className: "ss-w-motm", "data-testid": "game-screen-fan-motm", children: /* @__PURE__ */ jsx64("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }) });
5702
+ return /* @__PURE__ */ jsx65("div", { className: "ss-w-motm", "data-testid": "game-screen-fan-motm", children: /* @__PURE__ */ jsx65("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }) });
5593
5703
  }
5594
5704
  const pickedId = clientState?.pickedPlayerId ?? null;
5595
5705
  function handleVote(candidateId) {
@@ -5597,8 +5707,8 @@ function FanMotmGame({
5597
5707
  onSubmit(JSON.stringify({ pickedPlayerId: candidateId }));
5598
5708
  }
5599
5709
  return /* @__PURE__ */ jsxs58("div", { className: "ss-w-motm", "data-testid": "game-screen-fan-motm", children: [
5600
- /* @__PURE__ */ jsx64("div", { className: "ss-w-motm-title", children: "Man of the Match \u2014 your vote" }),
5601
- /* @__PURE__ */ jsx64("div", { className: "ss-w-motm-votes", children: config.candidates.map((c) => {
5710
+ /* @__PURE__ */ jsx65("div", { className: "ss-w-motm-title", children: "Man of the Match \u2014 your vote" }),
5711
+ /* @__PURE__ */ jsx65("div", { className: "ss-w-motm-votes", children: config.candidates.map((c) => {
5602
5712
  const isVoted = alreadyVoted && pickedId === c.playerId;
5603
5713
  const rowCls = `ss-w-motm-vrow${isVoted ? " ss-w-motm-vrow--voted" : ""}${alreadyVoted ? " ss-w-motm-vrow--result" : ""}`;
5604
5714
  return /* @__PURE__ */ jsxs58(
@@ -5610,19 +5720,19 @@ function FanMotmGame({
5610
5720
  disabled: alreadyVoted || submitting,
5611
5721
  onClick: () => handleVote(c.playerId),
5612
5722
  children: [
5613
- /* @__PURE__ */ jsx64("div", { className: "ss-w-motm-vfill", style: { width: isVoted ? "100%" : "0%" } }),
5614
- /* @__PURE__ */ jsx64("span", { className: "ss-w-motm-vrow-name", children: c.playerName })
5723
+ /* @__PURE__ */ jsx65("div", { className: "ss-w-motm-vfill", style: { width: isVoted ? "100%" : "0%" } }),
5724
+ /* @__PURE__ */ jsx65("span", { className: "ss-w-motm-vrow-name", children: c.playerName })
5615
5725
  ]
5616
5726
  },
5617
5727
  c.playerId
5618
5728
  );
5619
5729
  }) }),
5620
- /* @__PURE__ */ jsx64("div", { className: "ss-w-motm-fun", children: "For fun \u2014 unranked community vote" })
5730
+ /* @__PURE__ */ jsx65("div", { className: "ss-w-motm-fun", children: "For fun \u2014 unranked community vote" })
5621
5731
  ] });
5622
5732
  }
5623
5733
 
5624
5734
  // src/components/GameScreenHost.tsx
5625
- import { jsx as jsx65, jsxs as jsxs59 } from "react/jsx-runtime";
5735
+ import { jsx as jsx66, jsxs as jsxs59 } from "react/jsx-runtime";
5626
5736
  var FIXTURE_GAME_IDS = /* @__PURE__ */ new Set([
5627
5737
  "matchday-predictor",
5628
5738
  "starting-xi",
@@ -5645,7 +5755,7 @@ function GameScreenHost({
5645
5755
  ui
5646
5756
  }) {
5647
5757
  const { gameId, fixtureId, gameDay = "" } = selected;
5648
- const [configJson, setConfigJson] = useState30(null);
5758
+ const [configJson, setConfigJson] = useState31(null);
5649
5759
  useEffect13(() => {
5650
5760
  setConfigJson(null);
5651
5761
  if (!conversation) return;
@@ -5690,7 +5800,7 @@ function GameScreenHost({
5690
5800
  function renderScreen() {
5691
5801
  switch (gameId) {
5692
5802
  case "mystery-tiger":
5693
- return /* @__PURE__ */ jsx65(
5803
+ return /* @__PURE__ */ jsx66(
5694
5804
  MysteryTigerGame,
5695
5805
  {
5696
5806
  ...sharedProps,
@@ -5698,7 +5808,7 @@ function GameScreenHost({
5698
5808
  }
5699
5809
  );
5700
5810
  case "higher-or-lower":
5701
- return /* @__PURE__ */ jsx65(
5811
+ return /* @__PURE__ */ jsx66(
5702
5812
  HigherOrLowerGame,
5703
5813
  {
5704
5814
  ...sharedProps,
@@ -5706,7 +5816,7 @@ function GameScreenHost({
5706
5816
  }
5707
5817
  );
5708
5818
  case "career-path":
5709
- return /* @__PURE__ */ jsx65(
5819
+ return /* @__PURE__ */ jsx66(
5710
5820
  CareerPathGame,
5711
5821
  {
5712
5822
  ...sharedProps,
@@ -5715,7 +5825,7 @@ function GameScreenHost({
5715
5825
  );
5716
5826
  case "beat-the-grid": {
5717
5827
  const btgConfig = safeParseConfig(configJson);
5718
- return /* @__PURE__ */ jsx65(
5828
+ return /* @__PURE__ */ jsx66(
5719
5829
  BeatTheGridGame,
5720
5830
  {
5721
5831
  ...sharedProps,
@@ -5725,7 +5835,7 @@ function GameScreenHost({
5725
5835
  );
5726
5836
  }
5727
5837
  case "guess-the-xi":
5728
- return /* @__PURE__ */ jsx65(
5838
+ return /* @__PURE__ */ jsx66(
5729
5839
  GuessTheXiGame,
5730
5840
  {
5731
5841
  ...sharedProps,
@@ -5733,7 +5843,7 @@ function GameScreenHost({
5733
5843
  }
5734
5844
  );
5735
5845
  case "daily-quiz":
5736
- return /* @__PURE__ */ jsx65(
5846
+ return /* @__PURE__ */ jsx66(
5737
5847
  DailyQuizGame,
5738
5848
  {
5739
5849
  ...sharedProps,
@@ -5741,7 +5851,7 @@ function GameScreenHost({
5741
5851
  }
5742
5852
  );
5743
5853
  case "matchday-predictor":
5744
- return /* @__PURE__ */ jsx65(
5854
+ return /* @__PURE__ */ jsx66(
5745
5855
  MatchdayPredictorGame,
5746
5856
  {
5747
5857
  ...sharedProps,
@@ -5749,7 +5859,7 @@ function GameScreenHost({
5749
5859
  }
5750
5860
  );
5751
5861
  case "starting-xi":
5752
- return /* @__PURE__ */ jsx65(
5862
+ return /* @__PURE__ */ jsx66(
5753
5863
  StartingXiGame,
5754
5864
  {
5755
5865
  ...sharedProps,
@@ -5757,7 +5867,7 @@ function GameScreenHost({
5757
5867
  }
5758
5868
  );
5759
5869
  case "stat-ladder":
5760
- return /* @__PURE__ */ jsx65(
5870
+ return /* @__PURE__ */ jsx66(
5761
5871
  StatLadderGame,
5762
5872
  {
5763
5873
  ...sharedProps,
@@ -5765,7 +5875,7 @@ function GameScreenHost({
5765
5875
  }
5766
5876
  );
5767
5877
  case "fan-motm":
5768
- return /* @__PURE__ */ jsx65(
5878
+ return /* @__PURE__ */ jsx66(
5769
5879
  FanMotmGame,
5770
5880
  {
5771
5881
  ...sharedProps,
@@ -5773,12 +5883,12 @@ function GameScreenHost({
5773
5883
  }
5774
5884
  );
5775
5885
  default:
5776
- return /* @__PURE__ */ jsx65("div", { className: "ss-w-gscreen-body", "data-testid": `game-screen-${gameId}`, children: gameId });
5886
+ return /* @__PURE__ */ jsx66("div", { className: "ss-w-gscreen-body", "data-testid": `game-screen-${gameId}`, children: gameId });
5777
5887
  }
5778
5888
  }
5779
5889
  return /* @__PURE__ */ jsxs59("div", { className: "ss-w-gscreen", children: [
5780
5890
  /* @__PURE__ */ jsxs59("button", { type: "button", className: "ss-w-gscreen-back", onClick: onBack, children: [
5781
- /* @__PURE__ */ jsx65("span", { className: "ss-w-gscreen-back-arrow", "aria-hidden": "true", children: "\u2039" }),
5891
+ /* @__PURE__ */ jsx66("span", { className: "ss-w-gscreen-back-arrow", "aria-hidden": "true", children: "\u2039" }),
5782
5892
  ui.back
5783
5893
  ] }),
5784
5894
  renderScreen()
@@ -5786,17 +5896,17 @@ function GameScreenHost({
5786
5896
  }
5787
5897
 
5788
5898
  // src/components/GamesPanel.tsx
5789
- import { jsx as jsx66 } from "react/jsx-runtime";
5899
+ import { jsx as jsx67 } from "react/jsx-runtime";
5790
5900
  function GamesPanel({
5791
5901
  loggedIn,
5792
5902
  games,
5793
5903
  ui,
5794
5904
  conversation
5795
5905
  }) {
5796
- const [selected, setSelected] = useState31(null);
5797
- if (!loggedIn) return /* @__PURE__ */ jsx66(GamesLoginWall, { ui });
5906
+ const [selected, setSelected] = useState32(null);
5907
+ if (!loggedIn) return /* @__PURE__ */ jsx67(GamesLoginWall, { ui });
5798
5908
  if (selected !== null) {
5799
- return /* @__PURE__ */ jsx66("div", { className: "ss-w-gscreen-wrap", children: /* @__PURE__ */ jsx66(
5909
+ return /* @__PURE__ */ jsx67("div", { className: "ss-w-gscreen-wrap", children: /* @__PURE__ */ jsx67(
5800
5910
  GameScreenHost,
5801
5911
  {
5802
5912
  selected,
@@ -5806,7 +5916,7 @@ function GamesPanel({
5806
5916
  }
5807
5917
  ) });
5808
5918
  }
5809
- return /* @__PURE__ */ jsx66("div", { className: "ss-w-mon-list", "data-testid": "games-hub", children: /* @__PURE__ */ jsx66(
5919
+ return /* @__PURE__ */ jsx67("div", { className: "ss-w-mon-list", "data-testid": "games-hub", children: /* @__PURE__ */ jsx67(
5810
5920
  GamesHub,
5811
5921
  {
5812
5922
  games,
@@ -5817,10 +5927,10 @@ function GamesPanel({
5817
5927
  }
5818
5928
 
5819
5929
  // src/components/Leaderboard.tsx
5820
- import { useState as useState32 } from "react";
5930
+ import { useState as useState33 } from "react";
5821
5931
 
5822
5932
  // src/components/LeaderboardRow.tsx
5823
- import { jsx as jsx67, jsxs as jsxs60 } from "react/jsx-runtime";
5933
+ import { jsx as jsx68, jsxs as jsxs60 } from "react/jsx-runtime";
5824
5934
  function formatPoints(n) {
5825
5935
  return n.toLocaleString("en");
5826
5936
  }
@@ -5834,8 +5944,8 @@ function LeaderboardWeeklyRow({
5834
5944
  "#",
5835
5945
  row.rank
5836
5946
  ] }),
5837
- /* @__PURE__ */ jsx67("span", { className: "ss-w-lb2-handle", children: row.handle }),
5838
- /* @__PURE__ */ jsx67("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
5947
+ /* @__PURE__ */ jsx68("span", { className: "ss-w-lb2-handle", children: row.handle }),
5948
+ /* @__PURE__ */ jsx68("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
5839
5949
  row.currentStreak > 0 && /* @__PURE__ */ jsxs60("span", { className: "ss-w-lb2-streak", children: [
5840
5950
  "\u{1F525} ",
5841
5951
  row.currentStreak
@@ -5852,13 +5962,13 @@ function LeaderboardAllTimeRow({
5852
5962
  "#",
5853
5963
  row.rank
5854
5964
  ] }),
5855
- /* @__PURE__ */ jsx67("span", { className: "ss-w-lb2-handle", children: row.handle }),
5856
- /* @__PURE__ */ jsx67("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
5965
+ /* @__PURE__ */ jsx68("span", { className: "ss-w-lb2-handle", children: row.handle }),
5966
+ /* @__PURE__ */ jsx68("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
5857
5967
  ] });
5858
5968
  }
5859
5969
 
5860
5970
  // src/components/LeaderboardEmpty.tsx
5861
- import { jsx as jsx68, jsxs as jsxs61 } from "react/jsx-runtime";
5971
+ import { jsx as jsx69, jsxs as jsxs61 } from "react/jsx-runtime";
5862
5972
  function LeaderboardEmpty({
5863
5973
  segment,
5864
5974
  lastWeek,
@@ -5868,8 +5978,8 @@ function LeaderboardEmpty({
5868
5978
  }) {
5869
5979
  if (segment === "alltime") {
5870
5980
  return /* @__PURE__ */ jsxs61("div", { className: "ss-w-lb-empty ss-w-lb-empty--alltime", children: [
5871
- /* @__PURE__ */ jsx68("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
5872
- /* @__PURE__ */ jsx68("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
5981
+ /* @__PURE__ */ jsx69("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
5982
+ /* @__PURE__ */ jsx69("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
5873
5983
  ] });
5874
5984
  }
5875
5985
  const fresh = lastWeek != null;
@@ -5877,38 +5987,38 @@ function LeaderboardEmpty({
5877
5987
  const body = fresh ? ui.leaderboardEmptyFreshBody : ui.leaderboardEmptyColdBody;
5878
5988
  return /* @__PURE__ */ jsxs61("div", { className: "ss-w-lb-empty", children: [
5879
5989
  weeklyPrize && /* @__PURE__ */ jsxs61("div", { className: "ss-w-prize", children: [
5880
- /* @__PURE__ */ jsx68("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
5881
- /* @__PURE__ */ jsx68("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ jsx68("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
5990
+ /* @__PURE__ */ jsx69("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
5991
+ /* @__PURE__ */ jsx69("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ jsx69("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
5882
5992
  ] }),
5883
5993
  /* @__PURE__ */ jsxs61("div", { className: "ss-w-lb-empty-hero", children: [
5884
- /* @__PURE__ */ jsx68("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
5885
- /* @__PURE__ */ jsx68("h4", { className: "ss-w-lb-empty-title", children: title }),
5886
- /* @__PURE__ */ jsx68("p", { className: "ss-w-lb-empty-body", children: body }),
5887
- onPlay && /* @__PURE__ */ jsx68("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
5994
+ /* @__PURE__ */ jsx69("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
5995
+ /* @__PURE__ */ jsx69("h4", { className: "ss-w-lb-empty-title", children: title }),
5996
+ /* @__PURE__ */ jsx69("p", { className: "ss-w-lb-empty-body", children: body }),
5997
+ onPlay && /* @__PURE__ */ jsx69("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
5888
5998
  ] }),
5889
5999
  fresh && lastWeek && /* @__PURE__ */ jsxs61("div", { className: "ss-w-lb-last", children: [
5890
- /* @__PURE__ */ jsx68("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
5891
- /* @__PURE__ */ jsx68("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
5892
- /* @__PURE__ */ jsx68("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
5893
- /* @__PURE__ */ jsx68("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
6000
+ /* @__PURE__ */ jsx69("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
6001
+ /* @__PURE__ */ jsx69("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
6002
+ /* @__PURE__ */ jsx69("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
6003
+ /* @__PURE__ */ jsx69("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
5894
6004
  ] })
5895
6005
  ] });
5896
6006
  }
5897
6007
 
5898
6008
  // src/components/Leaderboard.tsx
5899
- import { Fragment as Fragment16, jsx as jsx69, jsxs as jsxs62 } from "react/jsx-runtime";
6009
+ import { Fragment as Fragment16, jsx as jsx70, jsxs as jsxs62 } from "react/jsx-runtime";
5900
6010
  function Leaderboard({
5901
6011
  data,
5902
6012
  ui,
5903
6013
  onPlay
5904
6014
  }) {
5905
- const [segment, setSegment] = useState32("weekly");
6015
+ const [segment, setSegment] = useState33("weekly");
5906
6016
  const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
5907
6017
  const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
5908
6018
  const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
5909
6019
  return /* @__PURE__ */ jsxs62("div", { className: "ss-w-lb2", children: [
5910
6020
  /* @__PURE__ */ jsxs62("div", { className: "ss-w-seg", children: [
5911
- /* @__PURE__ */ jsx69(
6021
+ /* @__PURE__ */ jsx70(
5912
6022
  "button",
5913
6023
  {
5914
6024
  type: "button",
@@ -5918,7 +6028,7 @@ function Leaderboard({
5918
6028
  children: ui.leaderboardThisWeek
5919
6029
  }
5920
6030
  ),
5921
- /* @__PURE__ */ jsx69(
6031
+ /* @__PURE__ */ jsx70(
5922
6032
  "button",
5923
6033
  {
5924
6034
  type: "button",
@@ -5929,7 +6039,7 @@ function Leaderboard({
5929
6039
  }
5930
6040
  )
5931
6041
  ] }),
5932
- isEmpty ? /* @__PURE__ */ jsx69(
6042
+ isEmpty ? /* @__PURE__ */ jsx70(
5933
6043
  LeaderboardEmpty,
5934
6044
  {
5935
6045
  segment,
@@ -5939,14 +6049,14 @@ function Leaderboard({
5939
6049
  ui
5940
6050
  }
5941
6051
  ) : /* @__PURE__ */ jsxs62(Fragment16, { children: [
5942
- /* @__PURE__ */ jsx69("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ jsx69(
6052
+ /* @__PURE__ */ jsx70("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ jsx70(
5943
6053
  LeaderboardWeeklyRow,
5944
6054
  {
5945
6055
  row,
5946
6056
  isMe: row.operatorUserId === data.myWeeklyRow?.operatorUserId
5947
6057
  },
5948
6058
  row.operatorUserId
5949
- )) : data.allTimeTop.map((row) => /* @__PURE__ */ jsx69(
6059
+ )) : data.allTimeTop.map((row) => /* @__PURE__ */ jsx70(
5950
6060
  LeaderboardAllTimeRow,
5951
6061
  {
5952
6062
  row,
@@ -5954,18 +6064,18 @@ function Leaderboard({
5954
6064
  },
5955
6065
  row.operatorUserId
5956
6066
  )) }),
5957
- /* @__PURE__ */ jsx69("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
5958
- myRow != null && (offBoard ? /* @__PURE__ */ jsx69("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ jsxs62("div", { className: "ss-w-lb2-rows", children: [
5959
- segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ jsx69(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
5960
- segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ jsx69(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
6067
+ /* @__PURE__ */ jsx70("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
6068
+ myRow != null && (offBoard ? /* @__PURE__ */ jsx70("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ jsxs62("div", { className: "ss-w-lb2-rows", children: [
6069
+ segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ jsx70(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
6070
+ segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ jsx70(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
5961
6071
  ] })),
5962
- segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ jsx69("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ jsx69("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ jsx69("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
6072
+ segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ jsx70("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ jsx70("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ jsx70("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
5963
6073
  ] })
5964
6074
  ] });
5965
6075
  }
5966
6076
 
5967
6077
  // src/components/LeaderboardPanel.tsx
5968
- import { jsx as jsx70 } from "react/jsx-runtime";
6078
+ import { jsx as jsx71 } from "react/jsx-runtime";
5969
6079
  var EMPTY_PAYLOAD = {
5970
6080
  week: "",
5971
6081
  weeklyTop: [],
@@ -5976,16 +6086,16 @@ var EMPTY_PAYLOAD = {
5976
6086
  lastWeek: null
5977
6087
  };
5978
6088
  function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
5979
- if (!loggedIn) return /* @__PURE__ */ jsx70(GamesLoginWall, { ui });
5980
- if (data === null && loading) return /* @__PURE__ */ jsx70("div", { className: "ss-w-mon-list" });
5981
- return /* @__PURE__ */ jsx70("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx70(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
6089
+ if (!loggedIn) return /* @__PURE__ */ jsx71(GamesLoginWall, { ui });
6090
+ if (data === null && loading) return /* @__PURE__ */ jsx71("div", { className: "ss-w-mon-list" });
6091
+ return /* @__PURE__ */ jsx71("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx71(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
5982
6092
  }
5983
6093
 
5984
6094
  // src/components/ChatPanel.tsx
5985
- import { jsx as jsx71, jsxs as jsxs63 } from "react/jsx-runtime";
6095
+ import { jsx as jsx72, jsxs as jsxs63 } from "react/jsx-runtime";
5986
6096
  var FULLSCREEN_QUERY = "(max-width: 639px)";
5987
6097
  function useIsModal() {
5988
- const [modal, setModal] = useState33(false);
6098
+ const [modal, setModal] = useState34(false);
5989
6099
  useEffect14(() => {
5990
6100
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
5991
6101
  const mql = window.matchMedia(FULLSCREEN_QUERY);
@@ -6014,7 +6124,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
6014
6124
  if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
6015
6125
  }, [monitor, state.isStreaming, state.messages.length]);
6016
6126
  return /* @__PURE__ */ jsxs63("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
6017
- /* @__PURE__ */ jsx71(
6127
+ /* @__PURE__ */ jsx72(
6018
6128
  ChatHeader,
6019
6129
  {
6020
6130
  onClose: close,
@@ -6027,7 +6137,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
6027
6137
  moreOptionsLabel: ui.moreOptions
6028
6138
  }
6029
6139
  ),
6030
- monitor && /* @__PURE__ */ jsx71(
6140
+ monitor && /* @__PURE__ */ jsx72(
6031
6141
  TabBar,
6032
6142
  {
6033
6143
  monitor,
@@ -6039,18 +6149,18 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
6039
6149
  gamesEnabled: gamesResult?.enabled ?? false
6040
6150
  }
6041
6151
  ),
6042
- /* @__PURE__ */ jsx71(
6152
+ /* @__PURE__ */ jsx72(
6043
6153
  "div",
6044
6154
  {
6045
6155
  style: !monitor || monitor.activeTab === "chat" ? { display: "contents" } : { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" },
6046
- children: /* @__PURE__ */ jsx71(MessageList, { controller, ui, slip, onDashboardTap, monitor })
6156
+ children: /* @__PURE__ */ jsx72(MessageList, { controller, ui, slip, onDashboardTap, monitor })
6047
6157
  }
6048
6158
  ),
6049
- monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx71(TodayPanel, { discovery, ui, monitor }),
6050
- monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx71(MatchesPanel, { monitor, ui, slip }),
6051
- monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx71(OddsPanel, { monitor, ui, slip }),
6052
- monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx71(GamesPanel, { loggedIn: !!loggedIn, games: gamesResult.games, ui, conversation }),
6053
- monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */ jsx71(
6159
+ monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx72(TodayPanel, { discovery, ui, monitor }),
6160
+ monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx72(MatchesPanel, { monitor, ui, slip }),
6161
+ monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx72(OddsPanel, { monitor, ui, slip }),
6162
+ monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx72(GamesPanel, { loggedIn: !!loggedIn, games: gamesResult.games, ui, conversation }),
6163
+ monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */ jsx72(
6054
6164
  LeaderboardPanel,
6055
6165
  {
6056
6166
  loggedIn: !!loggedIn,
@@ -6060,7 +6170,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
6060
6170
  ui
6061
6171
  }
6062
6172
  ),
6063
- (!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */ jsx71(ChatInput, { placeholder: ui.placeholder, streaming: state.isStreaming, onSend: handleSend, onStop: stop, stopLabel: ui.stopResponse, sendLabel: ui.sendMessage })
6173
+ (!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */ jsx72(ChatInput, { placeholder: ui.placeholder, streaming: state.isStreaming, onSend: handleSend, onStop: stop, stopLabel: ui.stopResponse, sendLabel: ui.sendMessage })
6064
6174
  ] });
6065
6175
  }
6066
6176
 
@@ -7001,6 +7111,11 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
7001
7111
  .ss-w-gt-key { white-space: nowrap; }
7002
7112
  .ss-w-gt-key b { font-weight: 800; color: var(--ss-w-ink); }
7003
7113
  .ss-w-gt-key-ok { color: var(--ss-w-correct) !important; }
7114
+ /* Legend colour swatches \u2014 green = exact match, amber = close (same broad line / confederation
7115
+ / within tolerance). Mirrors .ss-w-gtile--exact / --near tile fills. */
7116
+ .ss-w-gt-sw { display: inline-block; width: 9px; height: 9px; border-radius: 3px; vertical-align: middle; }
7117
+ .ss-w-gt-sw--exact { background: var(--ss-w-correct); }
7118
+ .ss-w-gt-sw--near { background: var(--ss-w-accent); }
7004
7119
  /* Higher or Lower terminal score unit. */
7005
7120
  .ss-w-hl-over-unit { font-size: 14px; font-weight: 700; color: var(--ss-w-faint); }
7006
7121
  .ss-w-gscreen-back { display: inline-flex; align-items: center; gap: 5px; background: none; border: none; color: var(--ss-w-accent); font: inherit; font-size: 13px; font-weight: 600; cursor: pointer; padding: 6px 0 10px; align-self: flex-start; }
@@ -7067,6 +7182,22 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
7067
7182
  .ss-w-gt-title { font-size: 18px; font-weight: 800; text-transform: uppercase; letter-spacing: .02em; color: var(--ss-w-ink); line-height: 1; }
7068
7183
  .ss-w-gt-sub { font-size: 11px; color: var(--ss-w-faint); margin-top: 4px; }
7069
7184
  .ss-w-gt-left { margin-left: auto; flex: none; font-size: 11px; font-weight: 700; color: var(--ss-w-accent); background: color-mix(in srgb, var(--ss-w-accent) 11%, var(--ss-w-panel)); border: 1px solid color-mix(in srgb, var(--ss-w-accent) 22%, var(--ss-w-line)); border-radius: 999px; padding: 4px 10px; white-space: nowrap; }
7185
+ /* Hero card \u2014 portrait + the masked profile the fan is hunting on. On reveal the silhouette
7186
+ becomes the real photo (or initials) and the profile rows drop away. Fully token-driven. */
7187
+ .ss-w-gt-card { display: grid; grid-template-columns: 96px 1fr; gap: 12px; background: var(--ss-w-bubble); border: 1px solid var(--ss-w-line); border-radius: 14px; padding: 12px; }
7188
+ .ss-w-gt-card--reveal { grid-template-columns: 1fr; justify-items: center; }
7189
+ .ss-w-gt-sil { width: 96px; height: 118px; border-radius: 11px; overflow: hidden; background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); display: grid; place-items: center; }
7190
+ .ss-w-gt-sil svg, .ss-w-gt-sil img { display: block; width: 100%; height: 100%; }
7191
+ .ss-w-gt-sil img { object-fit: cover; }
7192
+ .ss-w-gt-attrs { display: flex; flex-direction: column; justify-content: center; }
7193
+ .ss-w-gt-attr { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 7px 2px; }
7194
+ .ss-w-gt-attr + .ss-w-gt-attr { border-top: 1px solid var(--ss-w-line); }
7195
+ .ss-w-gt-attr-k { color: var(--ss-w-faint); font-size: 12px; font-weight: 600; }
7196
+ .ss-w-gt-attr-v { color: var(--ss-w-faint); font-size: 13px; font-weight: 800; letter-spacing: .12em; }
7197
+ /* Progress dots \u2014 one per guess allowance; used guesses filled with the accent. */
7198
+ .ss-w-gt-dots { display: flex; gap: 7px; justify-content: center; }
7199
+ .ss-w-gt-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ss-w-wrong); }
7200
+ .ss-w-gt-dot--on { background: var(--ss-w-accent); }
7070
7201
  /* Guess rows \u2014 one labelled block per guess */
7071
7202
  .ss-w-gtrows { display: flex; flex-direction: column; gap: 8px; }
7072
7203
  /* First-load legend (empty state) */
@@ -7104,13 +7235,19 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
7104
7235
  /* Pair: player A | Higher/Lower | player B */
7105
7236
  .ss-w-hlpair { display: grid; grid-template-columns: 1fr auto 1fr; gap: 8px; align-items: stretch; }
7106
7237
  .ss-w-hlpc { background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); border-radius: 14px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; padding: 14px 6px; text-align: center; min-width: 0; }
7107
- .ss-w-hlpc-av { width: 42px; height: 42px; border-radius: 50%; background: var(--ss-w-bubble); border: 1px solid var(--ss-w-line); display: grid; place-items: center; font-size: 20px; flex: none; }
7238
+ /* Player photo (was a 42px ball emoji): fixed 60px circle on both cards so they stay identical
7239
+ regardless of name length. Falls back to initials when no photo URL is present. */
7240
+ .ss-w-hlpc-av { width: 60px; height: 60px; border-radius: 50%; overflow: hidden; background: var(--ss-w-bubble); border: 1px solid var(--ss-w-line); display: grid; place-items: center; flex: none; }
7241
+ .ss-w-hlpc-av img { width: 100%; height: 100%; object-fit: cover; display: block; }
7242
+ .ss-w-av-initials { font-size: 18px; font-weight: 800; color: var(--ss-w-faint); text-transform: uppercase; letter-spacing: .02em; }
7108
7243
  .ss-w-hlpc-name { font-size: 12.5px; font-weight: 700; color: var(--ss-w-ink); line-height: 1.15; }
7109
7244
  .ss-w-hlpc-stat { font-size: 8.5px; color: var(--ss-w-faint); text-transform: uppercase; letter-spacing: .04em; }
7110
7245
  .ss-w-hlpc-val { font-size: 30px; font-weight: 800; color: var(--ss-w-accent); font-variant-numeric: tabular-nums; line-height: 1; }
7111
7246
  .ss-w-hlpc-val--hidden { color: var(--ss-w-faint); }
7112
- /* Higher / Lower \u2014 middle column */
7113
- .ss-w-hlbtns { display: flex; flex-direction: column; gap: 6px; justify-content: center; }
7247
+ /* Higher / Lower \u2014 middle column. The pair grid stretches this column to the cards' height, so
7248
+ space-between pins Higher to the top and Lower to the bottom, with "or" centered between the
7249
+ two players. */
7250
+ .ss-w-hlbtns { display: flex; flex-direction: column; gap: 6px; justify-content: space-between; }
7114
7251
  .ss-w-hl-or { text-align: center; font-size: 11px; font-weight: 700; color: var(--ss-w-faint); }
7115
7252
  .ss-w-hlbtn { font: inherit; font-size: 12px; font-weight: 800; text-transform: uppercase; letter-spacing: .03em; border-radius: 9px; padding: 10px 12px; cursor: pointer; border: 1px solid var(--ss-w-line); white-space: nowrap; transition: border-color .1s, background .1s; }
7116
7253
  /* Both options are neutral until picked \u2014 an amber default read as "already selected". */
@@ -7394,7 +7531,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
7394
7531
  `;
7395
7532
 
7396
7533
  // src/StatsWidget.tsx
7397
- import { jsx as jsx72 } from "react/jsx-runtime";
7534
+ import { jsx as jsx73 } from "react/jsx-runtime";
7398
7535
  function buildClient(props) {
7399
7536
  try {
7400
7537
  if ("client" in props && props.client) {
@@ -7435,7 +7572,7 @@ function StatsWidget(props) {
7435
7572
  }, []);
7436
7573
  const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
7437
7574
  const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
7438
- const [hasToday, setHasToday] = useState34(false);
7575
+ const [hasToday, setHasToday] = useState35(false);
7439
7576
  const monitor = useLiveMonitor({
7440
7577
  getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
7441
7578
  getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
@@ -7533,7 +7670,7 @@ function StatsWidget(props) {
7533
7670
  }, [built, ui.injectStyles]);
7534
7671
  if (!built) return null;
7535
7672
  const attrs = themeAttrs(ui);
7536
- return /* @__PURE__ */ jsx72(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx72("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__ */ jsx72(
7673
+ return /* @__PURE__ */ jsx73(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx73("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__ */ jsx73(
7537
7674
  ChatPanel,
7538
7675
  {
7539
7676
  controller,
@@ -7547,7 +7684,7 @@ function StatsWidget(props) {
7547
7684
  loggedIn: !!operatorUserId,
7548
7685
  conversation: built?.conversation ?? null
7549
7686
  }
7550
- ) : /* @__PURE__ */ jsx72(
7687
+ ) : /* @__PURE__ */ jsx73(
7551
7688
  ChatFab,
7552
7689
  {
7553
7690
  label: ui.launcherLabel,