@sensiblestats/widget-react 0.50.0 → 0.50.2

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
@@ -4172,6 +4172,13 @@ var ATTR_KEYS = [
4172
4172
  "shirtNumber",
4173
4173
  "apps"
4174
4174
  ];
4175
+ function verdictGlyph(v) {
4176
+ if (v.verdict === "exact") return "\u2713";
4177
+ if (v.verdict === "miss") return "\u2717";
4178
+ if (v.direction === "up") return "\u2191";
4179
+ if (v.direction === "down") return "\u2193";
4180
+ return "\u2248";
4181
+ }
4175
4182
  function MysteryTigerGame({
4176
4183
  config,
4177
4184
  result,
@@ -4181,16 +4188,15 @@ function MysteryTigerGame({
4181
4188
  const [query, setQuery] = useState23("");
4182
4189
  const inputId = useId2();
4183
4190
  const clientState = parseClientState(result?.clientStateJson);
4184
- const alreadyGuessedIds = new Set(
4185
- clientState?.guessResults.map((g) => g.playerId) ?? []
4186
- );
4191
+ const guessResults = clientState?.guessResults ?? [];
4192
+ const alreadyGuessedIds = new Set(guessResults.map((g) => g.playerId));
4187
4193
  const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
4188
4194
  const filtered = config && !isOver ? config.squadPlayers.filter(
4189
4195
  (p) => !alreadyGuessedIds.has(p.id) && p.name.toLowerCase().includes(query.toLowerCase())
4190
4196
  ) : [];
4191
4197
  function handleSelect(playerId) {
4192
4198
  if (!config || isOver || submitting) return;
4193
- const prevGuesses = clientState?.guessResults.map((g) => g.playerId) ?? [];
4199
+ const prevGuesses = guessResults.map((g) => g.playerId);
4194
4200
  const newGuesses = [...prevGuesses, playerId];
4195
4201
  setQuery("");
4196
4202
  onSubmit(JSON.stringify({ guesses: newGuesses }));
@@ -4198,9 +4204,46 @@ function MysteryTigerGame({
4198
4204
  return /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt", "data-testid": "game-screen-mystery-tiger", children: [
4199
4205
  !config && /* @__PURE__ */ jsx55("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
4200
4206
  config && /* @__PURE__ */ jsxs49(Fragment9, { children: [
4201
- isOver && clientState && /* @__PURE__ */ jsxs49("div", { className: `ss-w-gt-banner ss-w-gt-banner--${clientState.solved ? "solved" : "failed"}`, children: [
4202
- /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-banner-label", children: clientState.solved ? "\u{1F42F} You found them!" : "\u{1F614} Better luck tomorrow" }),
4203
- clientState.revealedPlayerName && /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-banner-name", children: clientState.revealedPlayerName })
4207
+ /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-head", children: [
4208
+ /* @__PURE__ */ jsxs49("div", { children: [
4209
+ /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-title", children: "Mystery Tiger" }),
4210
+ /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-sub", children: "Guess today's squad player" })
4211
+ ] }),
4212
+ clientState && !isOver && /* @__PURE__ */ jsxs49("span", { className: "ss-w-gt-left", children: [
4213
+ clientState.guessesRemaining,
4214
+ " left"
4215
+ ] })
4216
+ ] }),
4217
+ guessResults.length > 0 && /* @__PURE__ */ jsx55("div", { className: "ss-w-gtrows", children: guessResults.map((gr, i) => {
4218
+ const player = config.squadPlayers.find((p) => p.id === gr.playerId);
4219
+ return /* @__PURE__ */ jsxs49("div", { className: "ss-w-gtguess", children: [
4220
+ /* @__PURE__ */ jsxs49("div", { className: "ss-w-gtguess-nm", children: [
4221
+ i + 1,
4222
+ " \xB7 ",
4223
+ player?.name ?? `#${gr.playerId}`
4224
+ ] }),
4225
+ /* @__PURE__ */ jsx55("div", { className: "ss-w-gtrow", children: ATTR_KEYS.map((key) => {
4226
+ const v = gr[key];
4227
+ return /* @__PURE__ */ jsxs49(
4228
+ "div",
4229
+ {
4230
+ className: `ss-w-gtile ss-w-gtile--${v.verdict}`,
4231
+ "data-testid": `verdict-${key}-${i}`,
4232
+ "data-verdict": v.verdict,
4233
+ "aria-label": `${ATTR_LABELS[key]}: ${v.verdict}${v.direction ? ` ${v.direction}` : ""}`,
4234
+ children: [
4235
+ /* @__PURE__ */ jsx55("span", { className: "ss-w-gtile-lab", children: ATTR_LABELS[key] }),
4236
+ /* @__PURE__ */ jsx55("span", { className: "ss-w-gtile-v", "aria-hidden": "true", children: verdictGlyph(v) })
4237
+ ]
4238
+ },
4239
+ key
4240
+ );
4241
+ }) })
4242
+ ] }, gr.playerId);
4243
+ }) }),
4244
+ clientState?.hintLine && !isOver && /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-hint", children: [
4245
+ "\u{1F4A1} ",
4246
+ clientState.hintLine
4204
4247
  ] }),
4205
4248
  !isOver && /* @__PURE__ */ jsxs49("div", { className: "ss-w-gtta", children: [
4206
4249
  /* @__PURE__ */ jsx55(
@@ -4235,38 +4278,15 @@ function MysteryTigerGame({
4235
4278
  p.id
4236
4279
  )) })
4237
4280
  ] }),
4238
- clientState && clientState.guessResults.length > 0 && /* @__PURE__ */ jsxs49("div", { children: [
4239
- /* @__PURE__ */ jsxs49("div", { className: "ss-w-gthdr", children: [
4240
- /* @__PURE__ */ jsx55("div", { className: "ss-w-gthdr-c ss-w-gthdr-c--name", children: "Player" }),
4241
- ATTR_KEYS.map((key) => /* @__PURE__ */ jsx55("div", { className: "ss-w-gthdr-c", children: ATTR_LABELS[key] }, key))
4242
- ] }),
4243
- /* @__PURE__ */ jsx55("div", { className: "ss-w-gtrows", children: clientState.guessResults.map((gr, i) => {
4244
- const player = config.squadPlayers.find((p) => p.id === gr.playerId);
4245
- return /* @__PURE__ */ jsxs49("div", { className: "ss-w-gtrow", children: [
4246
- /* @__PURE__ */ jsx55("div", { className: "ss-w-gtrow-nm", children: player?.name ?? `#${gr.playerId}` }),
4247
- ATTR_KEYS.map((key) => {
4248
- const v = gr[key];
4249
- return /* @__PURE__ */ jsx55(
4250
- "div",
4251
- {
4252
- className: `ss-w-gtile ss-w-gtile--${v.verdict}`,
4253
- "data-testid": `verdict-${key}-${i}`,
4254
- "data-verdict": v.verdict,
4255
- "aria-label": `${ATTR_LABELS[key]}: ${v.verdict}${v.direction ? ` ${v.direction}` : ""}`,
4256
- children: v.direction && /* @__PURE__ */ jsx55("span", { className: "ss-w-gtile-dir", "aria-hidden": "true", children: v.direction === "up" ? "\u2191" : "\u2193" })
4257
- },
4258
- key
4259
- );
4260
- })
4261
- ] }, gr.playerId);
4262
- }) })
4263
- ] }),
4264
- clientState?.hintLine && !isOver && /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-hint", children: clientState.hintLine }),
4265
- !isOver && clientState && /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-hint", children: [
4266
- clientState.guessesRemaining,
4267
- " guess",
4268
- clientState.guessesRemaining !== 1 ? "es" : "",
4269
- " remaining"
4281
+ isOver && clientState && /* @__PURE__ */ jsxs49("div", { className: `ss-w-gt-banner ss-w-gt-banner--${clientState.solved ? "solved" : "failed"}`, children: [
4282
+ /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-banner-label", children: clientState.solved ? "\u{1F42F} You found them!" : "\u{1F614} Out of guesses" }),
4283
+ clientState.revealedPlayerName && /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-banner-name", children: clientState.revealedPlayerName }),
4284
+ /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-banner-sub", children: [
4285
+ clientState.guessesUsed,
4286
+ " guess",
4287
+ clientState.guessesUsed === 1 ? "" : "es",
4288
+ " \xB7 come back tomorrow"
4289
+ ] })
4270
4290
  ] })
4271
4291
  ] })
4272
4292
  ] });
@@ -4282,22 +4302,6 @@ function parseClientState2(json) {
4282
4302
  return null;
4283
4303
  }
4284
4304
  }
4285
- function AnsweredRow({
4286
- answered,
4287
- pair
4288
- }) {
4289
- const cls = `ss-w-hlrrow ss-w-hlrrow--${answered.wasCorrect ? "correct" : "wrong"}`;
4290
- const icon = answered.wasCorrect ? "\u2713" : "\u2717";
4291
- return /* @__PURE__ */ jsxs50("div", { className: cls, children: [
4292
- /* @__PURE__ */ jsxs50("span", { className: "ss-w-hlrrow-names", children: [
4293
- pair?.playerAName ?? "?",
4294
- " vs ",
4295
- pair?.playerBName ?? "?"
4296
- ] }),
4297
- /* @__PURE__ */ jsx56("span", { className: "ss-w-hlrrow-pick", children: answered.pick }),
4298
- /* @__PURE__ */ jsx56("span", { className: "ss-w-hlrrow-icon", children: icon })
4299
- ] });
4300
- }
4301
4305
  function HigherOrLowerGame({
4302
4306
  config,
4303
4307
  result,
@@ -4305,82 +4309,122 @@ function HigherOrLowerGame({
4305
4309
  onSubmit
4306
4310
  }) {
4307
4311
  const clientState = parseClientState2(result?.clientStateJson);
4308
- const answeredCount = clientState?.answeredPairs.length ?? 0;
4309
- const runEndedWrong = clientState?.answeredPairs.some((p) => !p.wasCorrect) ?? false;
4312
+ const answeredPairs = clientState?.answeredPairs ?? [];
4313
+ const answeredCount = answeredPairs.length;
4314
+ const runEndedWrong = answeredPairs.some((p) => !p.wasCorrect);
4310
4315
  const allPairsAnswered = config != null && answeredCount >= config.pairs.length;
4311
4316
  const isOver = result?.alreadyPlayed === true || runEndedWrong || allPairsAnswered;
4312
4317
  const currentPair = config && !isOver ? config.pairs[answeredCount] ?? null : null;
4318
+ const correctCount = answeredPairs.filter((p) => p.wasCorrect).length;
4319
+ const score = clientState?.score ?? correctCount;
4320
+ const runLength = clientState?.runLength ?? 0;
4313
4321
  function handlePick(pick) {
4314
4322
  if (!config || isOver || submitting || !currentPair) return;
4315
- const prevAnswers = clientState?.answeredPairs.map((p) => ({ pairIndex: p.pairIndex, pick: p.pick })) ?? [];
4323
+ const prevAnswers = answeredPairs.map((p) => ({ pairIndex: p.pairIndex, pick: p.pick }));
4316
4324
  const newAnswers = [...prevAnswers, { pairIndex: currentPair.pairIndex, pick }];
4317
4325
  onSubmit(JSON.stringify({ answers: newAnswers }));
4318
4326
  }
4319
4327
  return /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl", "data-testid": "game-screen-higher-or-lower", children: [
4320
4328
  !config && /* @__PURE__ */ jsx56("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
4321
4329
  config && /* @__PURE__ */ jsxs50(Fragment10, { children: [
4322
- /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlctx", children: [
4323
- /* @__PURE__ */ jsx56("span", { className: "ss-w-hlctx-fam", children: config.statLabel }),
4324
- /* @__PURE__ */ jsx56("span", { className: "ss-w-hlctx-szn", children: config.seasonLabel })
4330
+ /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-head", children: [
4331
+ /* @__PURE__ */ jsxs50("div", { children: [
4332
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-hl-title", children: "Higher or Lower" }),
4333
+ /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-sub", children: [
4334
+ config.statLabel,
4335
+ " \xB7 ",
4336
+ config.seasonLabel
4337
+ ] })
4338
+ ] }),
4339
+ runLength > 0 && !isOver && /* @__PURE__ */ jsxs50("span", { className: "ss-w-hl-streak", children: [
4340
+ "\u{1F525} ",
4341
+ runLength
4342
+ ] })
4325
4343
  ] }),
4326
- currentPair && /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpair", children: [
4327
- /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpc", children: [
4328
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-name", children: currentPair.playerAName }),
4329
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-val", children: currentPair.playerAValue })
4344
+ currentPair && /* @__PURE__ */ jsxs50(Fragment10, { children: [
4345
+ /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-q", children: [
4346
+ "Who has more ",
4347
+ config.statLabel.toLowerCase(),
4348
+ "?"
4330
4349
  ] }),
4331
- /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpc ss-w-hlpc--b", children: [
4332
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-name", children: currentPair.playerBName }),
4333
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-val ss-w-hlpc-val--hidden", children: "?" })
4350
+ /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpair", children: [
4351
+ /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpc", children: [
4352
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-av", "aria-hidden": "true", children: "\u26BD" }),
4353
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-name", children: currentPair.playerAName }),
4354
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-stat", children: config.statLabel }),
4355
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-val", children: currentPair.playerAValue })
4356
+ ] }),
4357
+ /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlbtns", children: [
4358
+ /* @__PURE__ */ jsx56(
4359
+ "button",
4360
+ {
4361
+ type: "button",
4362
+ className: "ss-w-hlbtn ss-w-hlbtn--up",
4363
+ disabled: submitting,
4364
+ onClick: () => handlePick("higher"),
4365
+ children: "Higher \u25B2"
4366
+ }
4367
+ ),
4368
+ /* @__PURE__ */ jsx56("span", { className: "ss-w-hl-or", children: "or" }),
4369
+ /* @__PURE__ */ jsx56(
4370
+ "button",
4371
+ {
4372
+ type: "button",
4373
+ className: "ss-w-hlbtn ss-w-hlbtn--dn",
4374
+ disabled: submitting,
4375
+ onClick: () => handlePick("lower"),
4376
+ children: "Lower \u25BC"
4377
+ }
4378
+ )
4379
+ ] }),
4380
+ /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpc ss-w-hlpc--b", children: [
4381
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-av", "aria-hidden": "true", children: "\u26BD" }),
4382
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-name", children: currentPair.playerBName }),
4383
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-stat", children: config.statLabel }),
4384
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-val ss-w-hlpc-val--hidden", children: "?" })
4385
+ ] })
4334
4386
  ] })
4335
4387
  ] }),
4336
- !isOver && currentPair && /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlbtns", children: [
4337
- /* @__PURE__ */ jsx56(
4338
- "button",
4339
- {
4340
- type: "button",
4341
- className: "ss-w-hlbtn",
4342
- disabled: submitting,
4343
- onClick: () => handlePick("higher"),
4344
- children: "Higher"
4345
- }
4346
- ),
4347
- /* @__PURE__ */ jsx56(
4348
- "button",
4349
- {
4350
- type: "button",
4351
- className: "ss-w-hlbtn",
4352
- disabled: submitting,
4353
- onClick: () => handlePick("lower"),
4354
- children: "Lower"
4355
- }
4356
- )
4388
+ isOver && /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-over", children: [
4389
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-hl-over-title", children: runEndedWrong ? "Run over" : "Nice run!" }),
4390
+ /* @__PURE__ */ jsx56("div", { className: "ss-w-hl-over-score", children: score }),
4391
+ /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-over-sub", children: [
4392
+ correctCount,
4393
+ " correct",
4394
+ correctCount === 1 ? "" : "",
4395
+ " \xB7 come back tomorrow for a new run"
4396
+ ] })
4357
4397
  ] }),
4358
- clientState && clientState.answeredPairs.length > 0 && /* @__PURE__ */ jsx56("div", { className: "ss-w-hlresults", children: clientState.answeredPairs.map((answered) => {
4398
+ answeredPairs.length > 0 && /* @__PURE__ */ jsx56("div", { className: "ss-w-hlresults", children: answeredPairs.map((answered) => {
4359
4399
  const pair = config.pairs.find((p) => p.pairIndex === answered.pairIndex);
4360
- const vCls = `ss-w-hlpc-val ss-w-hlpc-val--${answered.wasCorrect ? "correct" : "wrong"}`;
4361
- const badgeCls = `ss-w-hlpc-badge ss-w-hlpc-badge--${answered.wasCorrect ? "correct" : "wrong"}`;
4362
- return /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlrrow", children: [
4363
- /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpair", children: [
4364
- /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpc", children: [
4365
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-name", children: pair?.playerAName ?? "?" }),
4366
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-val", children: pair?.playerAValue })
4367
- ] }),
4368
- /* @__PURE__ */ jsxs50("div", { className: "ss-w-hlpc ss-w-hlpc--b", children: [
4369
- /* @__PURE__ */ jsx56("div", { className: "ss-w-hlpc-name", children: pair?.playerBName ?? "?" }),
4370
- /* @__PURE__ */ jsx56("div", { className: vCls, children: answered.playerBValue }),
4371
- /* @__PURE__ */ jsx56("div", { className: badgeCls, children: answered.wasCorrect ? "\u2713" : "\u2717" })
4372
- ] })
4373
- ] }),
4374
- /* @__PURE__ */ jsx56(AnsweredRow, { answered, pair })
4375
- ] }, answered.pairIndex);
4400
+ return /* @__PURE__ */ jsxs50(
4401
+ "div",
4402
+ {
4403
+ className: `ss-w-hlrrow ss-w-hlrrow--${answered.wasCorrect ? "correct" : "wrong"}`,
4404
+ children: [
4405
+ /* @__PURE__ */ jsxs50("span", { className: "ss-w-hlrrow-names", children: [
4406
+ pair?.playerAName ?? "?",
4407
+ " ",
4408
+ /* @__PURE__ */ jsx56("b", { className: "ss-w-hlrrow-val", children: pair?.playerAValue }),
4409
+ " vs ",
4410
+ pair?.playerBName ?? "?",
4411
+ " ",
4412
+ /* @__PURE__ */ jsx56("b", { className: "ss-w-hlrrow-val", children: answered.playerBValue })
4413
+ ] }),
4414
+ /* @__PURE__ */ jsx56("span", { className: "ss-w-hlrrow-pick", children: answered.pick }),
4415
+ /* @__PURE__ */ jsx56("span", { className: "ss-w-hlrrow-icon", children: answered.wasCorrect ? "\u2713" : "\u2717" })
4416
+ ]
4417
+ },
4418
+ answered.pairIndex
4419
+ );
4376
4420
  }) })
4377
4421
  ] })
4378
4422
  ] });
4379
4423
  }
4380
4424
 
4381
4425
  // src/components/games/CareerPathGame.tsx
4382
- import { useState as useState24, useId as useId3 } from "react";
4383
- import { Fragment as Fragment11, jsx as jsx57, jsxs as jsxs51 } from "react/jsx-runtime";
4426
+ import { useState as useState24, useId as useId3, Fragment as Fragment11 } from "react";
4427
+ import { Fragment as Fragment12, jsx as jsx57, jsxs as jsxs51 } from "react/jsx-runtime";
4384
4428
  function parseClientState3(json) {
4385
4429
  if (!json) return null;
4386
4430
  try {
@@ -4389,29 +4433,19 @@ function parseClientState3(json) {
4389
4433
  return null;
4390
4434
  }
4391
4435
  }
4392
- function SpellYear({ spell }) {
4436
+ function spellYears(spell) {
4393
4437
  const parts = [];
4394
4438
  if (spell.startYear) parts.push(String(spell.startYear));
4395
4439
  if (spell.endYear) parts.push(String(spell.endYear));
4396
- if (parts.length === 0) return null;
4397
- return /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-spell-yr", children: parts.join(" \u2013 ") });
4440
+ return parts.join("\u2013");
4398
4441
  }
4399
4442
  function ClubSpellCard({ spell }) {
4443
+ const years = spellYears(spell);
4400
4444
  return /* @__PURE__ */ jsxs51("div", { className: `ss-w-cpath-club${spell.isLoan ? " ss-w-cpath-club--loan" : ""}`, children: [
4401
- spell.crestUrl ? /* @__PURE__ */ jsx57(
4402
- "img",
4403
- {
4404
- src: spell.crestUrl,
4405
- alt: spell.clubName,
4406
- className: "ss-w-cpath-crest",
4407
- loading: "lazy"
4408
- }
4409
- ) : /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-crest ss-w-cpath-crest--fallback", "aria-hidden": "true" }),
4410
- /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-club-info", children: [
4411
- /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-club-name", children: spell.clubName }),
4412
- /* @__PURE__ */ jsx57(SpellYear, { spell }),
4413
- spell.isLoan && /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-loan-badge", children: "Loan" })
4414
- ] })
4445
+ 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() }),
4446
+ /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-club-name", children: spell.clubName }),
4447
+ years && /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-spell-yr", children: years }),
4448
+ spell.isLoan && /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-loan-badge", children: "Loan" })
4415
4449
  ] });
4416
4450
  }
4417
4451
  function CareerPathGame({
@@ -4423,11 +4457,11 @@ function CareerPathGame({
4423
4457
  const [query, setQuery] = useState24("");
4424
4458
  const inputId = useId3();
4425
4459
  const clientState = parseClientState3(result?.clientStateJson);
4426
- const alreadyGuessedIds = new Set(
4427
- clientState?.guessResults.map((g) => g.playerId) ?? []
4428
- );
4460
+ const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
4429
4461
  const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
4430
4462
  const visiblePath = clientState?.visiblePath ?? config?.initialPath ?? [];
4463
+ const totalClubs = clientState?.totalClubs ?? config?.totalClubs ?? visiblePath.length;
4464
+ const hiddenCount = Math.max(0, totalClubs - visiblePath.length);
4431
4465
  const filtered = config && !isOver ? config.typeaheadPool.filter(
4432
4466
  (p) => !alreadyGuessedIds.has(p.id) && p.name.toLowerCase().includes(query.toLowerCase())
4433
4467
  ) : [];
@@ -4440,25 +4474,34 @@ function CareerPathGame({
4440
4474
  }
4441
4475
  return /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath", "data-testid": "game-screen-career-path", children: [
4442
4476
  !config && /* @__PURE__ */ jsx57("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
4443
- config && /* @__PURE__ */ jsxs51(Fragment11, { children: [
4444
- /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-ctx", children: [
4445
- /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-ctx-label", children: "Career clubs" }),
4446
- /* @__PURE__ */ jsxs51("span", { className: "ss-w-cpath-ctx-count", children: [
4447
- config.totalClubs,
4448
- " clubs total"
4477
+ config && /* @__PURE__ */ jsxs51(Fragment12, { children: [
4478
+ /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-head", children: [
4479
+ /* @__PURE__ */ jsxs51("div", { children: [
4480
+ /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-title", children: "Career Path" }),
4481
+ /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-sub", children: "Which player had this career?" })
4482
+ ] }),
4483
+ clientState && !isOver && /* @__PURE__ */ jsxs51("span", { className: "ss-w-cpath-left", children: [
4484
+ clientState.guessesRemaining,
4485
+ " left"
4449
4486
  ] })
4450
4487
  ] }),
4451
- /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-path", children: [
4452
- visiblePath.map((spell, i) => /* @__PURE__ */ jsx57(ClubSpellCard, { spell }, `${spell.clubName}-${i}`)),
4453
- (clientState?.totalClubs ?? config.totalClubs) > visiblePath.length && /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-hidden", children: [
4454
- "+",
4455
- (clientState?.totalClubs ?? config.totalClubs) - visiblePath.length,
4456
- " more clubs hidden"
4488
+ /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-seq", children: [
4489
+ visiblePath.map((spell, i) => /* @__PURE__ */ jsxs51(Fragment11, { children: [
4490
+ i > 0 && /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-arrow", "aria-hidden": "true", children: "\u2192" }),
4491
+ /* @__PURE__ */ jsx57(ClubSpellCard, { spell })
4492
+ ] }, `${spell.clubName}-${i}`)),
4493
+ hiddenCount > 0 && /* @__PURE__ */ jsxs51(Fragment12, { children: [
4494
+ /* @__PURE__ */ jsx57("span", { className: "ss-w-cpath-arrow", "aria-hidden": "true", children: "\u2192" }),
4495
+ /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-hidden", children: [
4496
+ "+",
4497
+ hiddenCount,
4498
+ " more"
4499
+ ] })
4457
4500
  ] })
4458
4501
  ] }),
4459
- isOver && clientState && /* @__PURE__ */ jsxs51("div", { className: `ss-w-cpath-banner ss-w-cpath-banner--${clientState.solved ? "solved" : "failed"}`, children: [
4460
- /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-banner-label", children: clientState.solved ? "Career traced!" : "Better luck tomorrow" }),
4461
- clientState.revealedPlayerName && /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-banner-name", children: clientState.revealedPlayerName })
4502
+ clientState?.hintLine && !isOver && /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-hint", children: [
4503
+ "\u{1F4A1} ",
4504
+ clientState.hintLine
4462
4505
  ] }),
4463
4506
  !isOver && /* @__PURE__ */ jsxs51("div", { className: "ss-w-gtta", children: [
4464
4507
  /* @__PURE__ */ jsx57(
@@ -4468,7 +4511,7 @@ function CareerPathGame({
4468
4511
  type: "text",
4469
4512
  role: "textbox",
4470
4513
  className: "ss-w-gtta-i",
4471
- placeholder: "Search players\u2026",
4514
+ placeholder: "Name the player\u2026",
4472
4515
  value: query,
4473
4516
  disabled: submitting || isOver,
4474
4517
  onChange: (e) => setQuery(e.target.value),
@@ -4493,12 +4536,15 @@ function CareerPathGame({
4493
4536
  p.id
4494
4537
  )) })
4495
4538
  ] }),
4496
- clientState?.hintLine && !isOver && /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-hint", children: clientState.hintLine }),
4497
- !isOver && clientState && /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-hint", children: [
4498
- clientState.guessesRemaining,
4499
- " guess",
4500
- clientState.guessesRemaining !== 1 ? "es" : "",
4501
- " remaining"
4539
+ isOver && clientState && /* @__PURE__ */ jsxs51("div", { className: `ss-w-cpath-banner ss-w-cpath-banner--${clientState.solved ? "solved" : "failed"}`, children: [
4540
+ /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-banner-label", children: clientState.solved ? "\u2705 Career traced!" : "\u{1F614} Out of guesses" }),
4541
+ clientState.revealedPlayerName && /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-banner-name", children: clientState.revealedPlayerName }),
4542
+ /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-banner-sub", children: [
4543
+ clientState.guessesUsed,
4544
+ " guess",
4545
+ clientState.guessesUsed === 1 ? "" : "es",
4546
+ " \xB7 come back tomorrow"
4547
+ ] })
4502
4548
  ] })
4503
4549
  ] })
4504
4550
  ] });
@@ -4506,7 +4552,7 @@ function CareerPathGame({
4506
4552
 
4507
4553
  // src/components/games/BeatTheGridGame.tsx
4508
4554
  import React, { useState as useState25, useId as useId4 } from "react";
4509
- import { Fragment as Fragment12, jsx as jsx58, jsxs as jsxs52 } from "react/jsx-runtime";
4555
+ import { Fragment as Fragment13, jsx as jsx58, jsxs as jsxs52 } from "react/jsx-runtime";
4510
4556
  function parseClientState4(json) {
4511
4557
  if (!json) return null;
4512
4558
  try {
@@ -4552,7 +4598,7 @@ function SearchSheet({
4552
4598
  }
4553
4599
  )
4554
4600
  ] }),
4555
- /* @__PURE__ */ jsxs52("div", { className: "ss-w-gtta", children: [
4601
+ 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: [
4556
4602
  /* @__PURE__ */ jsx58(
4557
4603
  "input",
4558
4604
  {
@@ -4617,18 +4663,23 @@ function BeatTheGridGame({
4617
4663
  const rows = config.rows;
4618
4664
  const cols = config.cols;
4619
4665
  return /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg", "data-testid": "game-screen-beat-the-grid", children: [
4620
- /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-ctx", children: [
4621
- /* @__PURE__ */ jsxs52("span", { className: "ss-w-btg-ctx-score", children: [
4622
- "Score: ",
4623
- clientState?.totalScore ?? 0
4666
+ /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-head", children: [
4667
+ /* @__PURE__ */ jsxs52("div", { children: [
4668
+ /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-title", children: "Beat the Grid" }),
4669
+ /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-sub", children: "Fill each cell with a player who fits" })
4624
4670
  ] }),
4625
- !isLocked2 && /* @__PURE__ */ jsxs52("span", { className: "ss-w-btg-ctx-left", children: [
4626
- config.maxGuesses - filledCells.length,
4627
- " cell",
4628
- config.maxGuesses - filledCells.length !== 1 ? "s" : "",
4629
- " left"
4630
- ] }),
4631
- isLocked2 && /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-ctx-done", children: "Complete" })
4671
+ /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-ctx", children: [
4672
+ /* @__PURE__ */ jsxs52("span", { className: "ss-w-btg-ctx-score", children: [
4673
+ clientState?.totalScore ?? 0,
4674
+ " pts"
4675
+ ] }),
4676
+ !isLocked2 && /* @__PURE__ */ jsxs52("span", { className: "ss-w-btg-ctx-left", children: [
4677
+ config.maxGuesses - filledCells.length,
4678
+ " cell",
4679
+ config.maxGuesses - filledCells.length !== 1 ? "s" : "",
4680
+ " left"
4681
+ ] })
4682
+ ] })
4632
4683
  ] }),
4633
4684
  /* @__PURE__ */ jsxs52(
4634
4685
  "div",
@@ -4657,7 +4708,7 @@ function BeatTheGridGame({
4657
4708
  ].filter(Boolean).join(" "),
4658
4709
  disabled: isLocked2 || submitting,
4659
4710
  onClick: () => handleCellClick(rowIdx, colIdx),
4660
- children: filled ? /* @__PURE__ */ jsxs52(Fragment12, { children: [
4711
+ children: filled ? /* @__PURE__ */ jsxs52(Fragment13, { children: [
4661
4712
  /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-cell-score", children: filled.rarityScore }),
4662
4713
  filled.isCorrect && /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-cell-check", "aria-hidden": "true", children: "\u2713" })
4663
4714
  ] }) : /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-cell-empty", "aria-hidden": "true", children: "+" })
@@ -4669,6 +4720,16 @@ function BeatTheGridGame({
4669
4720
  ]
4670
4721
  }
4671
4722
  ),
4723
+ isLocked2 && /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-done", children: [
4724
+ /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-done-label", children: "\u{1F532} Grid complete" }),
4725
+ /* @__PURE__ */ jsx58("div", { className: "ss-w-btg-done-score", children: clientState?.totalScore ?? 0 }),
4726
+ /* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-done-sub", children: [
4727
+ filledCells.filter((c) => c.isCorrect).length,
4728
+ "/",
4729
+ filledCells.length,
4730
+ " correct \xB7 come back tomorrow"
4731
+ ] })
4732
+ ] }),
4672
4733
  activeCell !== null && /* @__PURE__ */ jsx58(
4673
4734
  SearchSheet,
4674
4735
  {
@@ -4686,7 +4747,7 @@ function BeatTheGridGame({
4686
4747
  }
4687
4748
 
4688
4749
  // src/components/games/GuessTheXiGame.tsx
4689
- import { Fragment as Fragment13, jsx as jsx59, jsxs as jsxs53 } from "react/jsx-runtime";
4750
+ import { Fragment as Fragment14, jsx as jsx59, jsxs as jsxs53 } from "react/jsx-runtime";
4690
4751
  function parseClientState5(json) {
4691
4752
  if (!json) return null;
4692
4753
  try {
@@ -4709,6 +4770,7 @@ function GuessTheXiGame({
4709
4770
  }) {
4710
4771
  const clientState = parseClientState5(result?.clientStateJson);
4711
4772
  const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
4773
+ const solved = clientState?.status === "solved";
4712
4774
  function handlePick(teamId) {
4713
4775
  if (!config || isOver || submitting) return;
4714
4776
  const prevGuesses = clientState?.guessHistory.map((g) => ({ teamId: g.teamId })) ?? [];
@@ -4717,15 +4779,24 @@ function GuessTheXiGame({
4717
4779
  }
4718
4780
  return /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi", "data-testid": "game-screen-guess-the-xi", children: [
4719
4781
  !config && /* @__PURE__ */ jsx59("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
4720
- config && /* @__PURE__ */ jsxs53(Fragment13, { children: [
4721
- /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-ctx", children: /* @__PURE__ */ jsx59("span", { className: "ss-w-gxi-ctx-label", children: config.poolLabel }) }),
4722
- config.positions.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-pitch", children: config.positions.map((pos) => /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-pslot", children: [
4782
+ config && /* @__PURE__ */ jsxs53(Fragment14, { children: [
4783
+ /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-head", children: [
4784
+ /* @__PURE__ */ jsxs53("div", { children: [
4785
+ /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-title", children: "Guess the XI" }),
4786
+ /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-sub", children: config.poolLabel })
4787
+ ] }),
4788
+ clientState && !isOver && /* @__PURE__ */ jsxs53("span", { className: "ss-w-gxi-left", children: [
4789
+ "Guess ",
4790
+ clientState.guessesUsed + 1,
4791
+ "/6"
4792
+ ] })
4793
+ ] }),
4794
+ config.positions.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-pitch", children: config.positions.map((pos, i) => /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-pslot", children: [
4723
4795
  /* @__PURE__ */ jsx59("span", { className: "ss-w-gxi-pslot-pos", children: pos.slot }),
4724
4796
  /* @__PURE__ */ jsx59("span", { className: "ss-w-gxi-pslot-nat", children: pos.nationality })
4725
- ] }, pos.slot)) }),
4797
+ ] }, `${pos.slot}-${i}`)) }),
4726
4798
  clientState && clientState.earnedReveals.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-reveals", children: clientState.earnedReveals.map((r, i) => /* @__PURE__ */ jsx59(RevealCard, { reveal: r }, i)) }),
4727
- isOver && clientState && /* @__PURE__ */ jsx59("div", { className: `ss-w-gxi-banner ss-w-gxi-banner--${clientState.status}`, children: /* @__PURE__ */ jsx59("span", { className: "ss-w-gxi-banner-label", children: clientState.status === "solved" ? `Solved! ${clientState.score} pts` : "Better luck tomorrow" }) }),
4728
- /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-pool", children: config.teamPool.map((team) => {
4799
+ !isOver ? /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-pool", children: config.teamPool.map((team) => {
4729
4800
  const guessRecord = clientState?.guessHistory.find((g) => g.teamId === team.teamId);
4730
4801
  return /* @__PURE__ */ jsx59(
4731
4802
  "button",
@@ -4735,17 +4806,21 @@ function GuessTheXiGame({
4735
4806
  "ss-w-gxi-team-btn",
4736
4807
  guessRecord ? guessRecord.wasCorrect ? "ss-w-gxi-team-btn--correct" : "ss-w-gxi-team-btn--wrong" : ""
4737
4808
  ].filter(Boolean).join(" "),
4738
- disabled: isOver || submitting,
4809
+ disabled: submitting,
4739
4810
  onClick: () => handlePick(team.teamId),
4740
4811
  children: team.teamName
4741
4812
  },
4742
4813
  team.teamId
4743
4814
  );
4744
- }) }),
4745
- !isOver && clientState && /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-hint", children: [
4746
- "Guess ",
4747
- clientState.guessesUsed + 1,
4748
- " of 6"
4815
+ }) }) : clientState && /* @__PURE__ */ jsxs53("div", { className: `ss-w-gxi-banner ss-w-gxi-banner--${solved ? "solved" : "failed"}`, children: [
4816
+ /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-banner-label", children: solved ? "\u2705 Solved!" : "\u{1F614} Out of guesses" }),
4817
+ /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-banner-score", children: clientState.score }),
4818
+ /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-banner-sub", children: [
4819
+ clientState.guessesUsed,
4820
+ " guess",
4821
+ clientState.guessesUsed === 1 ? "" : "es",
4822
+ " \xB7 come back tomorrow"
4823
+ ] })
4749
4824
  ] })
4750
4825
  ] })
4751
4826
  ] });
@@ -4753,7 +4828,7 @@ function GuessTheXiGame({
4753
4828
 
4754
4829
  // src/components/games/DailyQuizGame.tsx
4755
4830
  import { useState as useState26 } from "react";
4756
- import { Fragment as Fragment14, jsx as jsx60, jsxs as jsxs54 } from "react/jsx-runtime";
4831
+ import { Fragment as Fragment15, jsx as jsx60, jsxs as jsxs54 } from "react/jsx-runtime";
4757
4832
  function parseClientState6(json) {
4758
4833
  if (!json) return null;
4759
4834
  try {
@@ -4789,7 +4864,7 @@ function DailyQuizGame({
4789
4864
  }
4790
4865
  return /* @__PURE__ */ jsxs54("div", { className: "ss-w-dq", "data-testid": "game-screen-daily-quiz", children: [
4791
4866
  !config && /* @__PURE__ */ jsx60("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
4792
- config && /* @__PURE__ */ jsxs54(Fragment14, { children: [
4867
+ config && /* @__PURE__ */ jsxs54(Fragment15, { children: [
4793
4868
  isRevealed && result?.score != null && /* @__PURE__ */ jsxs54("div", { className: "ss-w-dq-score", children: [
4794
4869
  /* @__PURE__ */ jsx60("span", { className: "ss-w-dq-score-val", children: result.score }),
4795
4870
  /* @__PURE__ */ jsx60("span", { className: "ss-w-dq-score-label", children: "pts" })
@@ -6600,101 +6675,121 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
6600
6675
  .ss-w-gtta-opt { padding: 9px 12px; font-size: 13px; cursor: pointer; color: var(--ss-w-ink); border-bottom: 1px solid var(--ss-w-line); }
6601
6676
  .ss-w-gtta-opt:last-child { border-bottom: none; }
6602
6677
  .ss-w-gtta-opt:hover { background: var(--ss-w-bubble); }
6603
- /* Column header labels: one cell per attribute */
6604
- .ss-w-gthdr { display: grid; grid-template-columns: 1fr repeat(5, 36px); gap: 4px; padding: 0 2px; }
6605
- .ss-w-gthdr-c { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--ss-w-faint); text-align: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
6606
- .ss-w-gthdr-c--name { text-align: left; }
6607
- /* Guess rows */
6608
- .ss-w-gtrows { display: flex; flex-direction: column; gap: 4px; }
6609
- .ss-w-gtrow { display: grid; grid-template-columns: 1fr repeat(5, 36px); gap: 4px; align-items: center; }
6610
- .ss-w-gtrow-nm { font-size: 12px; font-weight: 600; color: var(--ss-w-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding-right: 4px; }
6611
- /* Verdict tiles */
6612
- .ss-w-gtile { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 36px; border-radius: 8px; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; gap: 1px; transition: transform .1s; }
6613
- .ss-w-gtile--exact { background: var(--ss-w-correct); color: #fff; }
6614
- .ss-w-gtile--near { background: var(--ss-w-cta); color: var(--ss-w-cta-ink, #fff); }
6678
+ /* Header: title + sub + remaining chip */
6679
+ .ss-w-gt-head { display: flex; align-items: flex-start; gap: 8px; }
6680
+ .ss-w-gt-title { font-size: 18px; font-weight: 800; text-transform: uppercase; letter-spacing: .02em; color: var(--ss-w-ink); line-height: 1; }
6681
+ .ss-w-gt-sub { font-size: 11px; color: var(--ss-w-faint); margin-top: 4px; }
6682
+ .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; }
6683
+ /* Guess rows \u2014 one labelled block per guess */
6684
+ .ss-w-gtrows { display: flex; flex-direction: column; gap: 8px; }
6685
+ .ss-w-gtguess { display: flex; flex-direction: column; gap: 4px; }
6686
+ .ss-w-gtguess-nm { font-size: 11px; font-weight: 600; color: var(--ss-w-faint); }
6687
+ .ss-w-gtrow { display: grid; grid-template-columns: repeat(5, 1fr); gap: 5px; }
6688
+ /* Verdict tiles: label on top, verdict glyph below */
6689
+ .ss-w-gtile { display: flex; flex-direction: column; align-items: center; justify-content: center; aspect-ratio: 1; border-radius: 8px; gap: 2px; min-width: 0; }
6690
+ .ss-w-gtile-lab { font-size: 8px; font-weight: 700; text-transform: uppercase; letter-spacing: .03em; opacity: .75; }
6691
+ .ss-w-gtile-v { font-size: 15px; font-weight: 800; line-height: 1; }
6692
+ .ss-w-gtile--exact { background: var(--ss-w-correct); color: #062611; }
6693
+ .ss-w-gtile--near { background: var(--ss-w-accent); color: #241700; }
6615
6694
  .ss-w-gtile--miss { background: var(--ss-w-bubble); color: var(--ss-w-faint); border: 1px solid var(--ss-w-line); }
6616
- .ss-w-gtile-dir { font-size: 11px; line-height: 1; }
6617
6695
  /* Hint line */
6618
- .ss-w-gt-hint { font-size: 11.5px; color: var(--ss-w-faint); text-align: center; padding: 2px 0; font-style: italic; }
6619
- /* Outcome banner: shown when solved or failed */
6620
- .ss-w-gt-banner { display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 14px 12px; border-radius: 12px; text-align: center; }
6696
+ .ss-w-gt-hint { font-size: 11.5px; color: var(--ss-w-faint); text-align: center; padding: 6px 10px; border-radius: 10px; background: color-mix(in srgb, var(--ss-w-accent) 8%, var(--ss-w-panel)); border: 1px dashed color-mix(in srgb, var(--ss-w-accent) 30%, var(--ss-w-line)); }
6697
+ /* Terminal outcome banner */
6698
+ .ss-w-gt-banner { display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 16px 12px; border-radius: 14px; text-align: center; }
6621
6699
  .ss-w-gt-banner--solved { background: color-mix(in srgb, var(--ss-w-correct) 12%, var(--ss-w-panel)); border: 1px solid color-mix(in srgb, var(--ss-w-correct) 28%, var(--ss-w-line)); }
6622
- .ss-w-gt-banner--failed { background: color-mix(in srgb, var(--ss-w-wrong) 8%, var(--ss-w-panel)); border: 1px solid var(--ss-w-line); }
6623
- .ss-w-gt-banner-name { font-size: 16px; font-weight: 750; color: var(--ss-w-ink); }
6624
- .ss-w-gt-banner-label { font-size: 12px; color: var(--ss-w-faint); }
6700
+ .ss-w-gt-banner--failed { background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); }
6701
+ .ss-w-gt-banner-name { font-size: 20px; font-weight: 800; text-transform: uppercase; letter-spacing: .01em; color: var(--ss-w-accent); }
6702
+ .ss-w-gt-banner-label { font-size: 13px; font-weight: 700; color: var(--ss-w-ink); }
6703
+ .ss-w-gt-banner-sub { font-size: 11px; color: var(--ss-w-faint); }
6625
6704
 
6626
- /* ---- Higher or Lower game screen (D3) ---- */
6705
+ /* ---- Higher or Lower game screen (D3) \u2014 artifact hl-pair/pcard/hlb layout ---- */
6627
6706
  .ss-w-hl { display: flex; flex-direction: column; gap: 12px; }
6628
- /* Stat context header: family name + season */
6629
- .ss-w-hlctx { display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap; }
6630
- .ss-w-hlctx-fam { font-size: 14px; font-weight: 750; color: var(--ss-w-ink); }
6631
- .ss-w-hlctx-szn { font-size: 11.5px; color: var(--ss-w-faint); font-weight: 500; }
6632
- /* Score chip */
6633
- .ss-w-hl-score { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; 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: 3px 10px; }
6634
- /* Pair card: two player cards + divider */
6635
- .ss-w-hlpair { display: flex; align-items: stretch; gap: 0; border-radius: 14px; border: 1.5px solid var(--ss-w-line); overflow: hidden; background: var(--ss-w-panel); }
6636
- /* Player card */
6637
- .ss-w-hlpc { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 14px 10px; text-align: center; }
6638
- .ss-w-hlpc--b { border-left: 1px solid var(--ss-w-line); }
6639
- .ss-w-hlpc-name { font-size: 12.5px; font-weight: 650; color: var(--ss-w-ink); line-height: 1.25; word-break: break-word; min-width: 0; }
6640
- .ss-w-hlpc-val { font-size: 22px; font-weight: 800; color: var(--ss-w-accent); font-variant-numeric: tabular-nums; line-height: 1; }
6641
- .ss-w-hlpc-val--hidden { color: var(--ss-w-faint); font-size: 26px; }
6642
- .ss-w-hlpc-val--correct { color: var(--ss-w-correct); }
6643
- .ss-w-hlpc-val--wrong { color: var(--ss-w-cta); }
6644
- .ss-w-hlpc-badge { font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; border-radius: 999px; padding: 2px 8px; }
6645
- .ss-w-hlpc-badge--correct { color: #fff; background: var(--ss-w-correct); }
6646
- .ss-w-hlpc-badge--wrong { color: var(--ss-w-cta-ink, #fff); background: var(--ss-w-cta); }
6647
- /* Higher / Lower buttons */
6648
- .ss-w-hlbtns { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
6649
- .ss-w-hlbtn { padding: 11px; border-radius: 10px; border: 1.5px solid var(--ss-w-line); background: var(--ss-w-panel); color: var(--ss-w-ink); font: inherit; font-size: 13px; font-weight: 700; cursor: pointer; transition: background .1s, border-color .1s, color .1s; }
6650
- .ss-w-hlbtn:hover:not(:disabled) { background: var(--ss-w-bubble); border-color: var(--ss-w-accent); color: var(--ss-w-accent); }
6707
+ /* Header: title + sub + streak chip */
6708
+ .ss-w-hl-head { display: flex; align-items: flex-start; gap: 8px; }
6709
+ .ss-w-hl-title { font-size: 18px; font-weight: 800; text-transform: uppercase; letter-spacing: .02em; color: var(--ss-w-ink); line-height: 1; }
6710
+ .ss-w-hl-sub { font-size: 11px; color: var(--ss-w-faint); margin-top: 4px; }
6711
+ .ss-w-hl-streak { margin-left: auto; flex: none; font-size: 12px; 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; }
6712
+ /* Question line */
6713
+ .ss-w-hl-q { text-align: center; font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: .02em; color: var(--ss-w-faint); }
6714
+ /* Pair: player A | Higher/Lower | player B */
6715
+ .ss-w-hlpair { display: grid; grid-template-columns: 1fr auto 1fr; gap: 8px; align-items: stretch; }
6716
+ .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; }
6717
+ .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; }
6718
+ .ss-w-hlpc-name { font-size: 12.5px; font-weight: 700; color: var(--ss-w-ink); line-height: 1.15; }
6719
+ .ss-w-hlpc-stat { font-size: 8.5px; color: var(--ss-w-faint); text-transform: uppercase; letter-spacing: .04em; }
6720
+ .ss-w-hlpc-val { font-size: 30px; font-weight: 800; color: var(--ss-w-accent); font-variant-numeric: tabular-nums; line-height: 1; }
6721
+ .ss-w-hlpc-val--hidden { color: var(--ss-w-faint); }
6722
+ /* Higher / Lower \u2014 middle column */
6723
+ .ss-w-hlbtns { display: flex; flex-direction: column; gap: 6px; justify-content: center; }
6724
+ .ss-w-hl-or { text-align: center; font-size: 11px; font-weight: 700; color: var(--ss-w-faint); }
6725
+ .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; }
6726
+ .ss-w-hlbtn--up { background: color-mix(in srgb, var(--ss-w-accent) 12%, var(--ss-w-panel)); color: var(--ss-w-accent); border-color: color-mix(in srgb, var(--ss-w-accent) 40%, var(--ss-w-line)); }
6727
+ .ss-w-hlbtn--dn { background: var(--ss-w-panel); color: var(--ss-w-ink); }
6728
+ .ss-w-hlbtn:hover:not(:disabled) { border-color: var(--ss-w-accent); }
6651
6729
  .ss-w-hlbtn:disabled { opacity: .5; cursor: not-allowed; }
6652
- /* Answered pair result rows */
6653
- .ss-w-hlresults { display: flex; flex-direction: column; gap: 4px; }
6654
- .ss-w-hlrrow { display: flex; align-items: center; gap: 8px; padding: 7px 10px; border-radius: 8px; font-size: 12px; background: var(--ss-w-bubble); }
6655
- .ss-w-hlrrow--correct { background: color-mix(in srgb, var(--ss-w-correct) 8%, var(--ss-w-panel)); }
6730
+ /* Run-over terminal panel */
6731
+ .ss-w-hl-over { background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); border-radius: 14px; padding: 16px; text-align: center; display: flex; flex-direction: column; gap: 5px; }
6732
+ .ss-w-hl-over-title { font-size: 16px; font-weight: 800; text-transform: uppercase; letter-spacing: .02em; color: var(--ss-w-ink); }
6733
+ .ss-w-hl-over-score { font-size: 34px; font-weight: 800; color: var(--ss-w-accent); line-height: 1; font-variant-numeric: tabular-nums; }
6734
+ .ss-w-hl-over-sub { font-size: 11px; color: var(--ss-w-faint); }
6735
+ /* Answered history \u2014 clean single-line rows with the revealed value */
6736
+ .ss-w-hlresults { display: flex; flex-direction: column; gap: 5px; }
6737
+ .ss-w-hlrrow { display: flex; align-items: center; gap: 8px; padding: 8px 11px; border-radius: 10px; font-size: 12px; background: var(--ss-w-bubble); border: 1px solid var(--ss-w-line); }
6738
+ .ss-w-hlrrow--correct { background: color-mix(in srgb, var(--ss-w-correct) 10%, var(--ss-w-panel)); border-color: color-mix(in srgb, var(--ss-w-correct) 30%, var(--ss-w-line)); }
6656
6739
  .ss-w-hlrrow--wrong { background: color-mix(in srgb, var(--ss-w-cta) 8%, var(--ss-w-panel)); }
6657
6740
  .ss-w-hlrrow-names { flex: 1; min-width: 0; font-weight: 600; color: var(--ss-w-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
6658
- .ss-w-hlrrow-pick { font-size: 11px; font-weight: 700; text-transform: uppercase; color: var(--ss-w-faint); }
6741
+ .ss-w-hlrrow-val { font-weight: 800; color: var(--ss-w-accent); font-variant-numeric: tabular-nums; }
6742
+ .ss-w-hlrrow-pick { font-size: 10px; font-weight: 700; text-transform: uppercase; color: var(--ss-w-faint); flex: none; }
6659
6743
  .ss-w-hlrrow-icon { font-size: 14px; flex: none; }
6744
+ .ss-w-hlrrow--correct .ss-w-hlrrow-icon { color: var(--ss-w-correct); }
6745
+ .ss-w-hlrrow--wrong .ss-w-hlrrow-icon { color: var(--ss-w-cta); }
6660
6746
 
6661
- /* ---- Career Path game screen (D3) ---- */
6747
+ /* ---- Career Path game screen (D3) \u2014 artifact cpath/club/cto layout ---- */
6662
6748
  .ss-w-cpath { display: flex; flex-direction: column; gap: 12px; }
6663
- /* Context header */
6664
- .ss-w-cpath-ctx { display: flex; align-items: baseline; justify-content: space-between; flex-wrap: wrap; gap: 4px; }
6665
- .ss-w-cpath-ctx-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--ss-w-faint); }
6666
- .ss-w-cpath-ctx-count { font-size: 12px; font-weight: 600; color: var(--ss-w-accent); }
6667
- /* Career path: vertical timeline of club spells */
6668
- .ss-w-cpath-path { display: flex; flex-direction: column; gap: 4px; }
6669
- /* Single club card */
6670
- .ss-w-cpath-club { display: flex; align-items: center; gap: 10px; padding: 9px 12px; border-radius: 10px; background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); }
6671
- .ss-w-cpath-club--loan { border-style: dashed; }
6672
- /* Crest image / fallback */
6673
- .ss-w-cpath-crest { width: 30px; height: 30px; object-fit: contain; flex: none; border-radius: 4px; }
6674
- .ss-w-cpath-crest--fallback { background: var(--ss-w-bubble); border: 1px solid var(--ss-w-line); border-radius: 4px; }
6675
- /* Club info: name + years */
6676
- .ss-w-cpath-club-info { display: flex; flex: 1; min-width: 0; align-items: center; gap: 6px; flex-wrap: wrap; }
6677
- .ss-w-cpath-club-name { font-size: 13px; font-weight: 650; color: var(--ss-w-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
6678
- .ss-w-cpath-spell-yr { font-size: 11px; color: var(--ss-w-faint); font-weight: 500; white-space: nowrap; }
6679
- .ss-w-cpath-loan-badge { font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; padding: 1px 7px; border-radius: 999px; background: color-mix(in srgb, var(--ss-w-cta) 15%, var(--ss-w-panel)); color: var(--ss-w-cta-ink, #1b1300); border: 1px solid color-mix(in srgb, var(--ss-w-cta) 30%, var(--ss-w-line)); flex: none; }
6680
- /* Hidden clubs indicator */
6681
- .ss-w-cpath-hidden { font-size: 11.5px; color: var(--ss-w-faint); font-style: italic; text-align: center; padding: 6px 0 2px; }
6749
+ /* Header */
6750
+ .ss-w-cpath-head { display: flex; align-items: flex-start; gap: 8px; }
6751
+ .ss-w-cpath-title { font-size: 18px; font-weight: 800; text-transform: uppercase; letter-spacing: .02em; color: var(--ss-w-ink); line-height: 1; }
6752
+ .ss-w-cpath-sub { font-size: 11px; color: var(--ss-w-faint); margin-top: 4px; }
6753
+ .ss-w-cpath-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; }
6754
+ /* Career sequence \u2014 horizontal crests with arrows */
6755
+ .ss-w-cpath-seq { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 6px; background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); border-radius: 14px; padding: 13px 11px; }
6756
+ .ss-w-cpath-arrow { align-self: center; color: var(--ss-w-faint); font-size: 13px; padding-top: 10px; }
6757
+ /* Single club \u2014 small vertical card */
6758
+ .ss-w-cpath-club { display: flex; flex-direction: column; align-items: center; gap: 3px; width: 58px; }
6759
+ .ss-w-cpath-crest { width: 34px; height: 34px; object-fit: contain; flex: none; border-radius: 8px; }
6760
+ .ss-w-cpath-crest--fallback { background: var(--ss-w-bubble); border: 1px solid var(--ss-w-line); display: grid; place-items: center; font-size: 9px; font-weight: 800; letter-spacing: .02em; color: var(--ss-w-faint); }
6761
+ .ss-w-cpath-club-name { font-size: 9px; font-weight: 600; color: var(--ss-w-ink); text-align: center; line-height: 1.1; overflow-wrap: anywhere; }
6762
+ .ss-w-cpath-spell-yr { font-size: 8px; color: var(--ss-w-faint); font-weight: 500; white-space: nowrap; }
6763
+ .ss-w-cpath-loan-badge { font-size: 7.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; padding: 0 5px; border-radius: 999px; background: color-mix(in srgb, var(--ss-w-accent) 15%, var(--ss-w-panel)); color: var(--ss-w-accent); border: 1px solid color-mix(in srgb, var(--ss-w-accent) 30%, var(--ss-w-line)); }
6764
+ .ss-w-cpath-club--loan .ss-w-cpath-crest { border: 1px dashed color-mix(in srgb, var(--ss-w-accent) 40%, var(--ss-w-line)); }
6765
+ /* Hidden clubs chip */
6766
+ .ss-w-cpath-hidden { align-self: center; font-size: 9px; font-weight: 700; color: var(--ss-w-faint); background: var(--ss-w-bubble); border: 1px dashed var(--ss-w-line); border-radius: 8px; padding: 6px 8px; }
6682
6767
  /* Hint line */
6683
- .ss-w-cpath-hint { font-size: 11.5px; color: var(--ss-w-faint); text-align: center; padding: 2px 0; font-style: italic; }
6684
- /* Outcome banner */
6685
- .ss-w-cpath-banner { display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 14px 12px; border-radius: 12px; text-align: center; }
6768
+ .ss-w-cpath-hint { font-size: 11.5px; color: var(--ss-w-faint); text-align: center; padding: 6px 10px; border-radius: 10px; background: color-mix(in srgb, var(--ss-w-accent) 8%, var(--ss-w-panel)); border: 1px dashed color-mix(in srgb, var(--ss-w-accent) 30%, var(--ss-w-line)); }
6769
+ /* Terminal outcome */
6770
+ .ss-w-cpath-banner { display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 16px 12px; border-radius: 14px; text-align: center; }
6686
6771
  .ss-w-cpath-banner--solved { background: color-mix(in srgb, var(--ss-w-correct) 12%, var(--ss-w-panel)); border: 1px solid color-mix(in srgb, var(--ss-w-correct) 28%, var(--ss-w-line)); }
6687
- .ss-w-cpath-banner--failed { background: color-mix(in srgb, var(--ss-w-wrong) 8%, var(--ss-w-panel)); border: 1px solid var(--ss-w-line); }
6688
- .ss-w-cpath-banner-name { font-size: 16px; font-weight: 750; color: var(--ss-w-ink); }
6689
- .ss-w-cpath-banner-label { font-size: 12px; color: var(--ss-w-faint); }
6772
+ .ss-w-cpath-banner--failed { background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); }
6773
+ .ss-w-cpath-banner-name { font-size: 20px; font-weight: 800; text-transform: uppercase; letter-spacing: .01em; color: var(--ss-w-accent); }
6774
+ .ss-w-cpath-banner-label { font-size: 13px; font-weight: 700; color: var(--ss-w-ink); }
6775
+ .ss-w-cpath-banner-sub { font-size: 11px; color: var(--ss-w-faint); }
6690
6776
 
6691
- /* ---- Beat the Grid game screen (D3) ---- */
6777
+ /* ---- Beat the Grid game screen (D3) \u2014 artifact grid/gc layout ---- */
6692
6778
  .ss-w-btg { display: flex; flex-direction: column; gap: 10px; }
6693
- /* Score/context row */
6694
- .ss-w-btg-ctx { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
6695
- .ss-w-btg-ctx-score { font-size: 13px; font-weight: 700; color: var(--ss-w-ink); }
6696
- .ss-w-btg-ctx-left { font-size: 12px; color: var(--ss-w-faint); font-weight: 500; }
6697
- .ss-w-btg-ctx-done { font-size: 12px; font-weight: 700; color: var(--ss-w-correct); }
6779
+ /* Header */
6780
+ .ss-w-btg-head { display: flex; align-items: flex-start; gap: 8px; }
6781
+ .ss-w-btg-title { font-size: 18px; font-weight: 800; text-transform: uppercase; letter-spacing: .02em; color: var(--ss-w-ink); line-height: 1; }
6782
+ .ss-w-btg-sub { font-size: 11px; color: var(--ss-w-faint); margin-top: 4px; }
6783
+ .ss-w-btg-ctx { margin-left: auto; display: flex; flex-direction: column; align-items: flex-end; gap: 2px; }
6784
+ .ss-w-btg-ctx-score { font-size: 13px; font-weight: 800; color: var(--ss-w-accent); font-variant-numeric: tabular-nums; }
6785
+ .ss-w-btg-ctx-left { font-size: 11px; color: var(--ss-w-faint); font-weight: 500; white-space: nowrap; }
6786
+ /* Terminal summary */
6787
+ .ss-w-btg-done { display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 16px 12px; border-radius: 14px; text-align: center; background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); }
6788
+ .ss-w-btg-done-label { font-size: 13px; font-weight: 700; color: var(--ss-w-ink); }
6789
+ .ss-w-btg-done-score { font-size: 34px; font-weight: 800; color: var(--ss-w-accent); line-height: 1; font-variant-numeric: tabular-nums; }
6790
+ .ss-w-btg-done-sub { font-size: 11px; color: var(--ss-w-faint); }
6791
+ /* Empty search pool note */
6792
+ .ss-w-btg-sheet-empty { font-size: 12px; color: var(--ss-w-faint); text-align: center; padding: 14px 8px; }
6698
6793
  /* Grid layout \u2014 col count driven inline via style */
6699
6794
  .ss-w-btg-grid { display: grid; gap: 4px; width: 100%; }
6700
6795
  /* Generic grid cell */
@@ -6727,9 +6822,11 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
6727
6822
 
6728
6823
  /* ---- Guess the XI game screen (D3) ---- */
6729
6824
  .ss-w-gxi { display: flex; flex-direction: column; gap: 12px; }
6730
- /* Context label (pool label) */
6731
- .ss-w-gxi-ctx { display: flex; align-items: center; }
6732
- .ss-w-gxi-ctx-label { font-size: 12px; font-weight: 700; color: var(--ss-w-faint); text-transform: uppercase; letter-spacing: .05em; }
6825
+ /* Header */
6826
+ .ss-w-gxi-head { display: flex; align-items: flex-start; gap: 8px; }
6827
+ .ss-w-gxi-title { font-size: 18px; font-weight: 800; text-transform: uppercase; letter-spacing: .02em; color: var(--ss-w-ink); line-height: 1; }
6828
+ .ss-w-gxi-sub { font-size: 11px; color: var(--ss-w-faint); margin-top: 4px; }
6829
+ .ss-w-gxi-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; }
6733
6830
  /* Positions pitch: compact slot grid */
6734
6831
  .ss-w-gxi-pitch { display: flex; flex-wrap: wrap; gap: 5px; }
6735
6832
  .ss-w-gxi-pslot { display: flex; flex-direction: column; align-items: center; gap: 2px; background: var(--ss-w-bubble); border: 1px solid var(--ss-w-line); border-radius: 8px; padding: 6px 10px; min-width: 52px; }
@@ -6747,11 +6844,13 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
6747
6844
  .ss-w-gxi-team-btn:disabled { opacity: .5; cursor: not-allowed; }
6748
6845
  .ss-w-gxi-team-btn--correct { background: color-mix(in srgb, var(--ss-w-correct) 14%, var(--ss-w-panel)); border-color: color-mix(in srgb, var(--ss-w-correct) 35%, var(--ss-w-line)); color: var(--ss-w-correct); }
6749
6846
  .ss-w-gxi-team-btn--wrong { background: color-mix(in srgb, var(--ss-w-wrong) 8%, var(--ss-w-panel)); text-decoration: line-through; opacity: .65; }
6750
- /* Outcome banner */
6751
- .ss-w-gxi-banner { display: flex; align-items: center; justify-content: center; padding: 10px 12px; border-radius: 10px; }
6847
+ /* Terminal outcome banner */
6848
+ .ss-w-gxi-banner { display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 16px 12px; border-radius: 14px; text-align: center; }
6752
6849
  .ss-w-gxi-banner--solved { background: color-mix(in srgb, var(--ss-w-correct) 12%, var(--ss-w-panel)); border: 1px solid color-mix(in srgb, var(--ss-w-correct) 28%, var(--ss-w-line)); }
6753
- .ss-w-gxi-banner--failed { background: color-mix(in srgb, var(--ss-w-wrong) 8%, var(--ss-w-panel)); border: 1px solid var(--ss-w-line); }
6850
+ .ss-w-gxi-banner--failed { background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); }
6754
6851
  .ss-w-gxi-banner-label { font-size: 13px; font-weight: 700; color: var(--ss-w-ink); }
6852
+ .ss-w-gxi-banner-score { font-size: 34px; font-weight: 800; color: var(--ss-w-accent); line-height: 1; font-variant-numeric: tabular-nums; }
6853
+ .ss-w-gxi-banner-sub { font-size: 11px; color: var(--ss-w-faint); }
6755
6854
  /* Hint line */
6756
6855
  .ss-w-gxi-hint { font-size: 11.5px; color: var(--ss-w-faint); text-align: center; font-style: italic; }
6757
6856
 
@@ -7046,7 +7145,8 @@ function StatsWidget(props) {
7046
7145
  discovery,
7047
7146
  gamesResult,
7048
7147
  leaderboardResult,
7049
- loggedIn: !!operatorUserId
7148
+ loggedIn: !!operatorUserId,
7149
+ conversation: built?.conversation ?? null
7050
7150
  }
7051
7151
  ) : /* @__PURE__ */ jsx71(
7052
7152
  ChatFab,