@sensiblestats/widget-react 0.55.0 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/dist/index.cjs +308 -194
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +308 -194
- package/dist/index.js.map +1 -1
- package/dist/styles.css +35 -5
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1687,18 +1687,19 @@ function computeGameDay(timezone) {
|
|
|
1687
1687
|
return new Intl.DateTimeFormat("en-CA", { timeZone: timezone }).format(/* @__PURE__ */ new Date());
|
|
1688
1688
|
}
|
|
1689
1689
|
function useGames(conversation, { activeTab, operatorTimezone }) {
|
|
1690
|
-
const [enabled, setEnabled] = useState4(
|
|
1690
|
+
const [enabled, setEnabled] = useState4(false);
|
|
1691
1691
|
const [games, setGames] = useState4([]);
|
|
1692
1692
|
const [loading, setLoading] = useState4(false);
|
|
1693
1693
|
const [refreshCount, setRefreshCount] = useState4(0);
|
|
1694
1694
|
const inFlightRef = useRef5(false);
|
|
1695
|
-
const
|
|
1695
|
+
const hardOffRef = useRef5(false);
|
|
1696
1696
|
const conversationRef = useRef5(conversation);
|
|
1697
1697
|
conversationRef.current = conversation;
|
|
1698
1698
|
const tzRef = useRef5(operatorTimezone ?? DEFAULT_TZ);
|
|
1699
1699
|
tzRef.current = operatorTimezone ?? DEFAULT_TZ;
|
|
1700
|
+
const ready = conversation != null;
|
|
1700
1701
|
useEffect5(() => {
|
|
1701
|
-
if (
|
|
1702
|
+
if (hardOffRef.current) return;
|
|
1702
1703
|
let active = true;
|
|
1703
1704
|
const doFetch = async () => {
|
|
1704
1705
|
const conv = conversationRef.current;
|
|
@@ -1710,10 +1711,12 @@ function useGames(conversation, { activeTab, operatorTimezone }) {
|
|
|
1710
1711
|
const result = await conv.getGames(gameDay);
|
|
1711
1712
|
if (!active) return;
|
|
1712
1713
|
if (result === null) {
|
|
1713
|
-
|
|
1714
|
+
hardOffRef.current = true;
|
|
1714
1715
|
setEnabled(false);
|
|
1716
|
+
setGames([]);
|
|
1715
1717
|
} else {
|
|
1716
1718
|
setGames(result.games);
|
|
1719
|
+
setEnabled(result.games.length > 0);
|
|
1717
1720
|
}
|
|
1718
1721
|
} catch {
|
|
1719
1722
|
} finally {
|
|
@@ -1725,7 +1728,7 @@ function useGames(conversation, { activeTab, operatorTimezone }) {
|
|
|
1725
1728
|
let intervalId;
|
|
1726
1729
|
if (activeTab === "games") {
|
|
1727
1730
|
intervalId = window.setInterval(() => {
|
|
1728
|
-
if (
|
|
1731
|
+
if (hardOffRef.current) {
|
|
1729
1732
|
window.clearInterval(intervalId);
|
|
1730
1733
|
return;
|
|
1731
1734
|
}
|
|
@@ -1734,9 +1737,10 @@ function useGames(conversation, { activeTab, operatorTimezone }) {
|
|
|
1734
1737
|
}
|
|
1735
1738
|
return () => {
|
|
1736
1739
|
active = false;
|
|
1740
|
+
inFlightRef.current = false;
|
|
1737
1741
|
if (intervalId !== void 0) window.clearInterval(intervalId);
|
|
1738
1742
|
};
|
|
1739
|
-
}, [activeTab, refreshCount]);
|
|
1743
|
+
}, [activeTab, refreshCount, ready]);
|
|
1740
1744
|
const refresh = useCallback4(() => {
|
|
1741
1745
|
setRefreshCount((c) => c + 1);
|
|
1742
1746
|
}, []);
|
|
@@ -4362,43 +4366,65 @@ function MysteryTigerGame({
|
|
|
4362
4366
|
" left"
|
|
4363
4367
|
] })
|
|
4364
4368
|
] }),
|
|
4365
|
-
|
|
4366
|
-
|
|
4367
|
-
|
|
4368
|
-
|
|
4369
|
-
|
|
4370
|
-
|
|
4371
|
-
" \
|
|
4372
|
-
|
|
4373
|
-
|
|
4374
|
-
|
|
4375
|
-
|
|
4376
|
-
|
|
4377
|
-
|
|
4378
|
-
|
|
4379
|
-
|
|
4380
|
-
|
|
4381
|
-
|
|
4382
|
-
|
|
4383
|
-
|
|
4384
|
-
|
|
4385
|
-
|
|
4386
|
-
|
|
4387
|
-
|
|
4388
|
-
|
|
4389
|
-
|
|
4390
|
-
|
|
4391
|
-
|
|
4392
|
-
|
|
4393
|
-
|
|
4394
|
-
|
|
4395
|
-
|
|
4396
|
-
|
|
4397
|
-
|
|
4398
|
-
|
|
4399
|
-
|
|
4369
|
+
/* @__PURE__ */ jsxs49("div", { className: "ss-w-gscroll", children: [
|
|
4370
|
+
!isOver && /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-lead", children: [
|
|
4371
|
+
guessResults.length === 0 ? "Guess a squad player \u2014 each guess compares it to the mystery player on Pos, Nat, Age, Shirt & Apps: " : "Tiles: ",
|
|
4372
|
+
/* @__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" }),
|
|
4376
|
+
" higher \xB7 ",
|
|
4377
|
+
/* @__PURE__ */ jsx55("b", { children: "\u25BC" }),
|
|
4378
|
+
" lower"
|
|
4379
|
+
] })
|
|
4380
|
+
] }),
|
|
4381
|
+
guessResults.length > 0 && /* @__PURE__ */ jsx55("div", { className: "ss-w-gtrows", children: guessResults.map((gr, i) => {
|
|
4382
|
+
const player = config.squadPlayers.find((p) => p.id === gr.playerId);
|
|
4383
|
+
return /* @__PURE__ */ jsxs49("div", { className: "ss-w-gtguess", children: [
|
|
4384
|
+
/* @__PURE__ */ jsxs49("div", { className: "ss-w-gtguess-nm", children: [
|
|
4385
|
+
i + 1,
|
|
4386
|
+
" \xB7 ",
|
|
4387
|
+
player?.name ?? `#${gr.playerId}`
|
|
4388
|
+
] }),
|
|
4389
|
+
/* @__PURE__ */ jsx55("div", { className: "ss-w-gtrow", children: ATTR_KEYS.map((key) => {
|
|
4390
|
+
const v = gr[key];
|
|
4391
|
+
const arrow = directionArrow(v);
|
|
4392
|
+
return /* @__PURE__ */ jsxs49(
|
|
4393
|
+
"div",
|
|
4394
|
+
{
|
|
4395
|
+
className: `ss-w-gtile ss-w-gtile--${v.verdict}`,
|
|
4396
|
+
"data-testid": `verdict-${key}-${i}`,
|
|
4397
|
+
"data-verdict": v.verdict,
|
|
4398
|
+
"aria-label": `${ATTR_LABELS[key]}: ${v.value ?? v.verdict}${v.direction ? ` ${v.direction}` : ""}`,
|
|
4399
|
+
children: [
|
|
4400
|
+
/* @__PURE__ */ jsx55("span", { className: "ss-w-gtile-lab", children: ATTR_LABELS[key] }),
|
|
4401
|
+
/* @__PURE__ */ jsxs49("span", { className: "ss-w-gtile-v", "aria-hidden": "true", children: [
|
|
4402
|
+
tileFace(key, v),
|
|
4403
|
+
arrow && /* @__PURE__ */ jsx55("span", { className: "ss-w-gtile-dir", children: arrow })
|
|
4404
|
+
] })
|
|
4405
|
+
]
|
|
4406
|
+
},
|
|
4407
|
+
key
|
|
4408
|
+
);
|
|
4409
|
+
}) })
|
|
4410
|
+
] }, gr.playerId);
|
|
4411
|
+
}) }),
|
|
4412
|
+
clientState?.hintLine && !isOver && /* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-hint", children: [
|
|
4413
|
+
"\u{1F4A1} ",
|
|
4414
|
+
clientState.hintLine
|
|
4415
|
+
] }),
|
|
4416
|
+
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 }),
|
|
4419
|
+
/* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-banner-sub", children: [
|
|
4420
|
+
clientState.guessesUsed,
|
|
4421
|
+
" guess",
|
|
4422
|
+
clientState.guessesUsed === 1 ? "" : "es",
|
|
4423
|
+
" \xB7 come back tomorrow"
|
|
4424
|
+
] })
|
|
4425
|
+
] })
|
|
4400
4426
|
] }),
|
|
4401
|
-
!isOver && /* @__PURE__ */ jsxs49("div", { className: "ss-w-gtta", children: [
|
|
4427
|
+
!isOver && /* @__PURE__ */ jsxs49("div", { className: "ss-w-gpin ss-w-gtta", children: [
|
|
4402
4428
|
/* @__PURE__ */ jsx55(
|
|
4403
4429
|
"input",
|
|
4404
4430
|
{
|
|
@@ -4430,16 +4456,6 @@ function MysteryTigerGame({
|
|
|
4430
4456
|
},
|
|
4431
4457
|
p.id
|
|
4432
4458
|
)) })
|
|
4433
|
-
] }),
|
|
4434
|
-
isOver && clientState && /* @__PURE__ */ jsxs49("div", { className: `ss-w-gt-banner ss-w-gt-banner--${clientState.solved ? "solved" : "failed"}`, children: [
|
|
4435
|
-
/* @__PURE__ */ jsx55("div", { className: "ss-w-gt-banner-label", children: clientState.solved ? "\u{1F42F} You found them!" : "\u{1F614} Out of guesses" }),
|
|
4436
|
-
clientState.revealedPlayerName && /* @__PURE__ */ jsx55("div", { className: "ss-w-gt-banner-name", children: clientState.revealedPlayerName }),
|
|
4437
|
-
/* @__PURE__ */ jsxs49("div", { className: "ss-w-gt-banner-sub", children: [
|
|
4438
|
-
clientState.guessesUsed,
|
|
4439
|
-
" guess",
|
|
4440
|
-
clientState.guessesUsed === 1 ? "" : "es",
|
|
4441
|
-
" \xB7 come back tomorrow"
|
|
4442
|
-
] })
|
|
4443
4459
|
] })
|
|
4444
4460
|
] })
|
|
4445
4461
|
] });
|
|
@@ -4551,11 +4567,16 @@ function HigherOrLowerGame({
|
|
|
4551
4567
|
] })
|
|
4552
4568
|
] }),
|
|
4553
4569
|
isOver && /* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-over", children: [
|
|
4554
|
-
/* @__PURE__ */ jsx56("div", { className: "ss-w-hl-over-title", children: runEndedWrong ? "Run over" : "
|
|
4555
|
-
/* @__PURE__ */
|
|
4570
|
+
/* @__PURE__ */ jsx56("div", { className: "ss-w-hl-over-title", children: runEndedWrong ? "\u{1F6AB} Run over" : "\u{1F389} Perfect run!" }),
|
|
4571
|
+
/* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-over-score", children: [
|
|
4572
|
+
score,
|
|
4573
|
+
/* @__PURE__ */ jsx56("span", { className: "ss-w-hl-over-unit", children: " pts" })
|
|
4574
|
+
] }),
|
|
4556
4575
|
/* @__PURE__ */ jsxs50("div", { className: "ss-w-hl-over-sub", children: [
|
|
4557
4576
|
correctCount,
|
|
4558
|
-
" correct
|
|
4577
|
+
" correct in a row",
|
|
4578
|
+
runEndedWrong ? " before a wrong pick" : "",
|
|
4579
|
+
" \xB7 come back tomorrow for a new run"
|
|
4559
4580
|
] })
|
|
4560
4581
|
] })
|
|
4561
4582
|
] })
|
|
@@ -4620,22 +4641,34 @@ function CareerPathGame({
|
|
|
4620
4641
|
/* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-head", children: [
|
|
4621
4642
|
/* @__PURE__ */ jsxs51("div", { children: [
|
|
4622
4643
|
/* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-title", children: "Career Path" }),
|
|
4623
|
-
/* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-sub", children: "
|
|
4644
|
+
/* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-sub", children: "Guess the mystery player from the clubs they've played for, oldest first." })
|
|
4624
4645
|
] }),
|
|
4625
4646
|
clientState && !isOver && /* @__PURE__ */ jsxs51("span", { className: "ss-w-cpath-left", children: [
|
|
4626
4647
|
clientState.guessesRemaining,
|
|
4627
4648
|
" left"
|
|
4628
4649
|
] })
|
|
4629
4650
|
] }),
|
|
4630
|
-
/* @__PURE__ */
|
|
4631
|
-
|
|
4632
|
-
|
|
4633
|
-
|
|
4634
|
-
|
|
4635
|
-
"
|
|
4636
|
-
|
|
4651
|
+
/* @__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 })
|
|
4655
|
+
] }, `${spell.clubName}-${i}`)) }),
|
|
4656
|
+
clientState?.hintLine && !isOver && /* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-hint", children: [
|
|
4657
|
+
"\u{1F4A1} ",
|
|
4658
|
+
clientState.hintLine
|
|
4659
|
+
] }),
|
|
4660
|
+
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 }),
|
|
4663
|
+
/* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-banner-sub", children: [
|
|
4664
|
+
clientState.guessesUsed,
|
|
4665
|
+
" guess",
|
|
4666
|
+
clientState.guessesUsed === 1 ? "" : "es",
|
|
4667
|
+
" \xB7 come back tomorrow"
|
|
4668
|
+
] })
|
|
4669
|
+
] })
|
|
4637
4670
|
] }),
|
|
4638
|
-
!isOver && /* @__PURE__ */ jsxs51("div", { className: "ss-w-gtta", children: [
|
|
4671
|
+
!isOver && /* @__PURE__ */ jsxs51("div", { className: "ss-w-gpin ss-w-gtta", children: [
|
|
4639
4672
|
/* @__PURE__ */ jsx57(
|
|
4640
4673
|
"input",
|
|
4641
4674
|
{
|
|
@@ -4667,16 +4700,6 @@ function CareerPathGame({
|
|
|
4667
4700
|
},
|
|
4668
4701
|
p.id
|
|
4669
4702
|
)) })
|
|
4670
|
-
] }),
|
|
4671
|
-
isOver && clientState && /* @__PURE__ */ jsxs51("div", { className: `ss-w-cpath-banner ss-w-cpath-banner--${clientState.solved ? "solved" : "failed"}`, children: [
|
|
4672
|
-
/* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-banner-label", children: clientState.solved ? "\u2705 Career traced!" : "\u{1F614} Out of guesses" }),
|
|
4673
|
-
clientState.revealedPlayerName && /* @__PURE__ */ jsx57("div", { className: "ss-w-cpath-banner-name", children: clientState.revealedPlayerName }),
|
|
4674
|
-
/* @__PURE__ */ jsxs51("div", { className: "ss-w-cpath-banner-sub", children: [
|
|
4675
|
-
clientState.guessesUsed,
|
|
4676
|
-
" guess",
|
|
4677
|
-
clientState.guessesUsed === 1 ? "" : "es",
|
|
4678
|
-
" \xB7 come back tomorrow"
|
|
4679
|
-
] })
|
|
4680
4703
|
] })
|
|
4681
4704
|
] })
|
|
4682
4705
|
] });
|
|
@@ -4822,59 +4845,61 @@ function BeatTheGridGame({
|
|
|
4822
4845
|
] })
|
|
4823
4846
|
] })
|
|
4824
4847
|
] }),
|
|
4825
|
-
/* @__PURE__ */ jsxs52(
|
|
4826
|
-
|
|
4827
|
-
|
|
4828
|
-
|
|
4829
|
-
|
|
4830
|
-
|
|
4831
|
-
|
|
4832
|
-
|
|
4833
|
-
|
|
4834
|
-
|
|
4835
|
-
/* @__PURE__ */
|
|
4836
|
-
|
|
4837
|
-
|
|
4838
|
-
|
|
4839
|
-
|
|
4840
|
-
|
|
4841
|
-
|
|
4842
|
-
|
|
4843
|
-
|
|
4844
|
-
|
|
4845
|
-
|
|
4846
|
-
|
|
4847
|
-
|
|
4848
|
-
|
|
4849
|
-
|
|
4850
|
-
|
|
4851
|
-
|
|
4852
|
-
|
|
4853
|
-
/* @__PURE__ */
|
|
4854
|
-
|
|
4855
|
-
|
|
4856
|
-
|
|
4857
|
-
|
|
4858
|
-
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
|
|
4863
|
-
|
|
4864
|
-
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
/* @__PURE__ */
|
|
4869
|
-
|
|
4870
|
-
|
|
4871
|
-
|
|
4872
|
-
|
|
4873
|
-
|
|
4874
|
-
|
|
4848
|
+
/* @__PURE__ */ jsxs52("div", { className: "ss-w-gscroll", children: [
|
|
4849
|
+
/* @__PURE__ */ jsxs52(
|
|
4850
|
+
"div",
|
|
4851
|
+
{
|
|
4852
|
+
className: "ss-w-btg-grid",
|
|
4853
|
+
style: { gridTemplateColumns: `auto repeat(${cols.length}, 1fr)` },
|
|
4854
|
+
role: "grid",
|
|
4855
|
+
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)),
|
|
4858
|
+
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 }),
|
|
4860
|
+
cols.map((colLabel, colIdx) => {
|
|
4861
|
+
const filled = findCellResult(filledCells, rowIdx, colIdx);
|
|
4862
|
+
const isActive = activeCell?.row === rowIdx && activeCell?.col === colIdx;
|
|
4863
|
+
return /* @__PURE__ */ jsx58(
|
|
4864
|
+
"button",
|
|
4865
|
+
{
|
|
4866
|
+
type: "button",
|
|
4867
|
+
"data-testid": `btg-cell-${rowIdx}-${colIdx}`,
|
|
4868
|
+
"aria-label": `${rowLabel} ${colLabel}`,
|
|
4869
|
+
className: [
|
|
4870
|
+
"ss-w-btg-gc ss-w-btg-cell",
|
|
4871
|
+
filled ? filled.isCorrect ? "ss-w-btg-cell--correct" : "ss-w-btg-cell--wrong" : "",
|
|
4872
|
+
isActive ? "ss-w-btg-cell--active" : ""
|
|
4873
|
+
].filter(Boolean).join(" "),
|
|
4874
|
+
disabled: isLocked2 || submitting,
|
|
4875
|
+
onClick: () => handleCellClick(rowIdx, colIdx),
|
|
4876
|
+
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) }),
|
|
4878
|
+
/* @__PURE__ */ jsxs52("span", { className: "ss-w-btg-cell-score", children: [
|
|
4879
|
+
filled.rarityScore,
|
|
4880
|
+
filled.isCorrect && /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-cell-check", "aria-hidden": "true", children: " \u2713" })
|
|
4881
|
+
] })
|
|
4882
|
+
] }) : /* @__PURE__ */ jsx58("span", { className: "ss-w-btg-cell-empty", "aria-hidden": "true", children: "+" })
|
|
4883
|
+
},
|
|
4884
|
+
`cell-${rowIdx}-${colIdx}`
|
|
4885
|
+
);
|
|
4886
|
+
})
|
|
4887
|
+
] }, rowIdx))
|
|
4888
|
+
]
|
|
4889
|
+
}
|
|
4890
|
+
),
|
|
4891
|
+
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 }),
|
|
4894
|
+
/* @__PURE__ */ jsxs52("div", { className: "ss-w-btg-done-sub", children: [
|
|
4895
|
+
filledCells.filter((c) => c.isCorrect).length,
|
|
4896
|
+
"/",
|
|
4897
|
+
filledCells.length,
|
|
4898
|
+
" correct \xB7 come back tomorrow"
|
|
4899
|
+
] })
|
|
4875
4900
|
] })
|
|
4876
4901
|
] }),
|
|
4877
|
-
activeCell !== null && /* @__PURE__ */ jsx58(
|
|
4902
|
+
activeCell !== null && /* @__PURE__ */ jsx58("div", { className: "ss-w-gpin", children: /* @__PURE__ */ jsx58(
|
|
4878
4903
|
SearchSheet,
|
|
4879
4904
|
{
|
|
4880
4905
|
row: activeCell.row,
|
|
@@ -4886,7 +4911,7 @@ function BeatTheGridGame({
|
|
|
4886
4911
|
onPick: handlePick,
|
|
4887
4912
|
onDismiss: () => setActiveCell(null)
|
|
4888
4913
|
}
|
|
4889
|
-
)
|
|
4914
|
+
) })
|
|
4890
4915
|
] });
|
|
4891
4916
|
}
|
|
4892
4917
|
|
|
@@ -4910,13 +4935,48 @@ function toRows(positions) {
|
|
|
4910
4935
|
bucket.push(p);
|
|
4911
4936
|
byRow.set(rowKey, bucket);
|
|
4912
4937
|
});
|
|
4913
|
-
return [...byRow.keys()].sort((a, b) =>
|
|
4938
|
+
return [...byRow.keys()].sort((a, b) => b - a).map((k) => byRow.get(k));
|
|
4939
|
+
}
|
|
4940
|
+
function formationLabel(rows) {
|
|
4941
|
+
if (rows.length < 2) return "";
|
|
4942
|
+
const gkFirst = [...rows].reverse();
|
|
4943
|
+
return gkFirst.slice(1).map((r) => r.length).join("-");
|
|
4944
|
+
}
|
|
4945
|
+
var FORMATION_POSITIONS = {
|
|
4946
|
+
"4-4-2": [["GK"], ["LB", "CB", "CB", "RB"], ["LM", "CM", "CM", "RM"], ["ST", "ST"]],
|
|
4947
|
+
"4-3-3": [["GK"], ["LB", "CB", "CB", "RB"], ["CM", "CM", "CM"], ["LW", "ST", "RW"]],
|
|
4948
|
+
"4-2-3-1": [["GK"], ["LB", "CB", "CB", "RB"], ["CDM", "CDM"], ["LW", "CAM", "RW"], ["ST"]],
|
|
4949
|
+
"4-1-4-1": [["GK"], ["LB", "CB", "CB", "RB"], ["CDM"], ["LM", "CM", "CM", "RM"], ["ST"]],
|
|
4950
|
+
"4-5-1": [["GK"], ["LB", "CB", "CB", "RB"], ["LM", "CM", "CM", "CM", "RM"], ["ST"]],
|
|
4951
|
+
"4-4-1-1": [["GK"], ["LB", "CB", "CB", "RB"], ["LM", "CM", "CM", "RM"], ["CAM"], ["ST"]],
|
|
4952
|
+
"4-1-2-1-2": [["GK"], ["LB", "CB", "CB", "RB"], ["CDM"], ["LM", "RM"], ["CAM"], ["ST", "ST"]],
|
|
4953
|
+
"3-5-2": [["GK"], ["CB", "CB", "CB"], ["LWB", "CM", "CM", "CM", "RWB"], ["ST", "ST"]],
|
|
4954
|
+
"3-4-3": [["GK"], ["CB", "CB", "CB"], ["LM", "CM", "CM", "RM"], ["LW", "ST", "RW"]],
|
|
4955
|
+
"5-3-2": [["GK"], ["LWB", "CB", "CB", "CB", "RWB"], ["CM", "CM", "CM"], ["ST", "ST"]],
|
|
4956
|
+
"5-4-1": [["GK"], ["LWB", "CB", "CB", "CB", "RWB"], ["LM", "CM", "CM", "RM"], ["ST"]]
|
|
4957
|
+
};
|
|
4958
|
+
function lineFallback(lineIdx, totalLines) {
|
|
4959
|
+
if (lineIdx === 0) return "GK";
|
|
4960
|
+
if (lineIdx === totalLines - 1) return "FWD";
|
|
4961
|
+
if (lineIdx === 1) return "DEF";
|
|
4962
|
+
return "MID";
|
|
4963
|
+
}
|
|
4964
|
+
function positionsBySlot(formation, rowsAttackFirst) {
|
|
4965
|
+
const gkFirst = [...rowsAttackFirst].reverse();
|
|
4966
|
+
const template = FORMATION_POSITIONS[formation];
|
|
4967
|
+
const map = /* @__PURE__ */ new Map();
|
|
4968
|
+
gkFirst.forEach((line, li) => {
|
|
4969
|
+
line.forEach((entry, ci) => {
|
|
4970
|
+
if (!entry.slot) return;
|
|
4971
|
+
const label = template?.[li]?.[ci] ?? lineFallback(li, gkFirst.length);
|
|
4972
|
+
map.set(entry.slot, label);
|
|
4973
|
+
});
|
|
4974
|
+
});
|
|
4975
|
+
return map;
|
|
4914
4976
|
}
|
|
4915
|
-
function
|
|
4916
|
-
|
|
4917
|
-
|
|
4918
|
-
/* @__PURE__ */ jsx59("span", { className: "ss-w-gxi-reveal-val", children: reveal.value })
|
|
4919
|
-
] });
|
|
4977
|
+
function surname(name) {
|
|
4978
|
+
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
4979
|
+
return parts.length ? parts[parts.length - 1] : name;
|
|
4920
4980
|
}
|
|
4921
4981
|
function GuessTheXiGame({
|
|
4922
4982
|
config,
|
|
@@ -4931,6 +4991,12 @@ function GuessTheXiGame({
|
|
|
4931
4991
|
const solved = clientState?.status === "solved";
|
|
4932
4992
|
const guessedTeamIds = new Set(clientState?.guessHistory.map((g) => g.teamId) ?? []);
|
|
4933
4993
|
const rows = config ? toRows(config.positions) : [];
|
|
4994
|
+
const formation = config?.hasRealFormation ? formationLabel(rows) : "";
|
|
4995
|
+
const posBySlot = config?.hasRealFormation ? positionsBySlot(formation, rows) : /* @__PURE__ */ new Map();
|
|
4996
|
+
const nameBySlot = /* @__PURE__ */ new Map();
|
|
4997
|
+
(clientState?.earnedReveals ?? []).forEach((r) => {
|
|
4998
|
+
if (r.slot && r.type !== "position") nameBySlot.set(r.slot, r.value);
|
|
4999
|
+
});
|
|
4934
5000
|
const filtered = config && !isOver ? config.teamPool.filter(
|
|
4935
5001
|
(t) => !guessedTeamIds.has(t.teamId) && t.teamName.toLowerCase().includes(query.toLowerCase())
|
|
4936
5002
|
) : [];
|
|
@@ -4942,14 +5008,18 @@ function GuessTheXiGame({
|
|
|
4942
5008
|
onSubmit(JSON.stringify({ guesses: newGuesses }));
|
|
4943
5009
|
}
|
|
4944
5010
|
const wrongGuesses = (clientState?.guessHistory ?? []).filter((g) => !g.wasCorrect);
|
|
5011
|
+
const revealCount = nameBySlot.size;
|
|
4945
5012
|
return /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi", "data-testid": "game-screen-guess-the-xi", children: [
|
|
4946
5013
|
!config && /* @__PURE__ */ jsx59("div", { className: "ss-w-gscreen-body", children: "Loading\u2026" }),
|
|
4947
5014
|
config && /* @__PURE__ */ jsxs53(Fragment14, { children: [
|
|
4948
5015
|
/* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-head", children: [
|
|
4949
5016
|
/* @__PURE__ */ jsxs53("div", { children: [
|
|
4950
|
-
/* @__PURE__ */
|
|
5017
|
+
/* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-title", children: [
|
|
5018
|
+
"Guess the XI",
|
|
5019
|
+
formation && /* @__PURE__ */ jsx59("span", { className: "ss-w-gxi-form", "aria-label": `Formation ${formation}`, children: formation })
|
|
5020
|
+
] }),
|
|
4951
5021
|
/* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-sub", children: [
|
|
4952
|
-
"
|
|
5022
|
+
"Name the team \xB7 flags are each player's nationality \xB7 ",
|
|
4953
5023
|
config.poolLabel
|
|
4954
5024
|
] })
|
|
4955
5025
|
] }),
|
|
@@ -4958,64 +5028,78 @@ function GuessTheXiGame({
|
|
|
4958
5028
|
" left"
|
|
4959
5029
|
] })
|
|
4960
5030
|
] }),
|
|
4961
|
-
|
|
4962
|
-
"div",
|
|
4963
|
-
|
|
4964
|
-
|
|
4965
|
-
|
|
4966
|
-
|
|
4967
|
-
|
|
4968
|
-
|
|
4969
|
-
|
|
4970
|
-
|
|
4971
|
-
|
|
4972
|
-
|
|
4973
|
-
|
|
5031
|
+
/* @__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) => {
|
|
5033
|
+
const posLabel = pos.slot ? posBySlot.get(pos.slot) ?? "" : "";
|
|
5034
|
+
const name = pos.slot ? nameBySlot.get(pos.slot) : void 0;
|
|
5035
|
+
return /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-slot", children: [
|
|
5036
|
+
/* @__PURE__ */ jsx59(
|
|
5037
|
+
"div",
|
|
5038
|
+
{
|
|
5039
|
+
className: `ss-w-gxi-flag${name ? " ss-w-gxi-flag--revealed" : ""}`,
|
|
5040
|
+
title: pos.nationality,
|
|
5041
|
+
"aria-label": `${posLabel ? posLabel + " \u2014 " : ""}${pos.nationality}${name ? " \u2014 " + name : ""}`,
|
|
5042
|
+
children: nationalityFlag(pos.nationality)
|
|
5043
|
+
}
|
|
5044
|
+
),
|
|
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) })
|
|
5047
|
+
] }, `${pos.slot}-${c}`);
|
|
5048
|
+
}) }, r)) }),
|
|
5049
|
+
revealCount > 0 && !isOver && /* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-revnote", children: [
|
|
5050
|
+
"\u{1F50E} ",
|
|
5051
|
+
revealCount,
|
|
5052
|
+
" player",
|
|
5053
|
+
revealCount === 1 ? "" : "s",
|
|
5054
|
+
" revealed \u2014 highlighted on the pitch"
|
|
5055
|
+
] }),
|
|
5056
|
+
!isOver && wrongGuesses.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-wrong", children: wrongGuesses.map((g) => {
|
|
4974
5057
|
const team = config.teamPool.find((t) => t.teamId === g.teamId);
|
|
4975
5058
|
return /* @__PURE__ */ jsx59("span", { className: "ss-w-gxi-wrong-pill", children: team?.teamName ?? `#${g.teamId}` }, g.teamId);
|
|
4976
5059
|
}) }),
|
|
4977
|
-
/* @__PURE__ */ jsxs53("div", { className:
|
|
4978
|
-
/* @__PURE__ */ jsx59(
|
|
4979
|
-
|
|
4980
|
-
|
|
4981
|
-
|
|
4982
|
-
|
|
4983
|
-
|
|
4984
|
-
|
|
4985
|
-
|
|
4986
|
-
value: query,
|
|
4987
|
-
disabled: submitting || isOver,
|
|
4988
|
-
onChange: (e) => setQuery(e.target.value),
|
|
4989
|
-
autoComplete: "off",
|
|
4990
|
-
"aria-label": "Name the team",
|
|
4991
|
-
"aria-autocomplete": "list"
|
|
4992
|
-
}
|
|
4993
|
-
),
|
|
4994
|
-
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ss-w-gtta-drop", role: "listbox", children: filtered.map((t) => /* @__PURE__ */ jsx59(
|
|
4995
|
-
"div",
|
|
4996
|
-
{
|
|
4997
|
-
className: "ss-w-gtta-opt",
|
|
4998
|
-
role: "option",
|
|
4999
|
-
"aria-selected": false,
|
|
5000
|
-
onClick: () => handlePick(t.teamId),
|
|
5001
|
-
onKeyDown: (e) => {
|
|
5002
|
-
if (e.key === "Enter") handlePick(t.teamId);
|
|
5003
|
-
},
|
|
5004
|
-
tabIndex: 0,
|
|
5005
|
-
children: t.teamName
|
|
5006
|
-
},
|
|
5007
|
-
t.teamId
|
|
5008
|
-
)) })
|
|
5009
|
-
] })
|
|
5010
|
-
] }) : clientState && /* @__PURE__ */ jsxs53("div", { className: `ss-w-gxi-banner ss-w-gxi-banner--${solved ? "solved" : "failed"}`, children: [
|
|
5011
|
-
/* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-banner-label", children: solved ? "\u2705 Solved!" : "\u{1F614} Out of guesses" }),
|
|
5012
|
-
/* @__PURE__ */ jsx59("div", { className: "ss-w-gxi-banner-score", children: clientState.score }),
|
|
5013
|
-
/* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-banner-sub", children: [
|
|
5014
|
-
clientState.guessesUsed,
|
|
5015
|
-
" guess",
|
|
5016
|
-
clientState.guessesUsed === 1 ? "" : "es",
|
|
5017
|
-
" \xB7 come back tomorrow"
|
|
5060
|
+
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 }),
|
|
5063
|
+
/* @__PURE__ */ jsxs53("div", { className: "ss-w-gxi-banner-sub", children: [
|
|
5064
|
+
clientState.guessesUsed,
|
|
5065
|
+
" guess",
|
|
5066
|
+
clientState.guessesUsed === 1 ? "" : "es",
|
|
5067
|
+
" \xB7 come back tomorrow"
|
|
5068
|
+
] })
|
|
5018
5069
|
] })
|
|
5070
|
+
] }),
|
|
5071
|
+
!isOver && /* @__PURE__ */ jsxs53("div", { className: "ss-w-gpin ss-w-gtta", children: [
|
|
5072
|
+
/* @__PURE__ */ jsx59(
|
|
5073
|
+
"input",
|
|
5074
|
+
{
|
|
5075
|
+
id: inputId,
|
|
5076
|
+
type: "text",
|
|
5077
|
+
role: "textbox",
|
|
5078
|
+
className: "ss-w-gtta-i",
|
|
5079
|
+
placeholder: "Name the team\u2026",
|
|
5080
|
+
value: query,
|
|
5081
|
+
disabled: submitting || isOver,
|
|
5082
|
+
onChange: (e) => setQuery(e.target.value),
|
|
5083
|
+
autoComplete: "off",
|
|
5084
|
+
"aria-label": "Name the team",
|
|
5085
|
+
"aria-autocomplete": "list"
|
|
5086
|
+
}
|
|
5087
|
+
),
|
|
5088
|
+
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx59("div", { className: "ss-w-gtta-drop", role: "listbox", children: filtered.map((t) => /* @__PURE__ */ jsx59(
|
|
5089
|
+
"div",
|
|
5090
|
+
{
|
|
5091
|
+
className: "ss-w-gtta-opt",
|
|
5092
|
+
role: "option",
|
|
5093
|
+
"aria-selected": false,
|
|
5094
|
+
onClick: () => handlePick(t.teamId),
|
|
5095
|
+
onKeyDown: (e) => {
|
|
5096
|
+
if (e.key === "Enter") handlePick(t.teamId);
|
|
5097
|
+
},
|
|
5098
|
+
tabIndex: 0,
|
|
5099
|
+
children: t.teamName
|
|
5100
|
+
},
|
|
5101
|
+
t.teamId
|
|
5102
|
+
)) })
|
|
5019
5103
|
] })
|
|
5020
5104
|
] })
|
|
5021
5105
|
] });
|
|
@@ -5712,7 +5796,7 @@ function GamesPanel({
|
|
|
5712
5796
|
const [selected, setSelected] = useState31(null);
|
|
5713
5797
|
if (!loggedIn) return /* @__PURE__ */ jsx66(GamesLoginWall, { ui });
|
|
5714
5798
|
if (selected !== null) {
|
|
5715
|
-
return /* @__PURE__ */ jsx66("div", { className: "ss-w-
|
|
5799
|
+
return /* @__PURE__ */ jsx66("div", { className: "ss-w-gscreen-wrap", children: /* @__PURE__ */ jsx66(
|
|
5716
5800
|
GameScreenHost,
|
|
5717
5801
|
{
|
|
5718
5802
|
selected,
|
|
@@ -6897,7 +6981,24 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
6897
6981
|
.ss-w-tile-chip--fun { color: var(--ss-w-faint); background: var(--ss-w-bubble); border: 1px solid var(--ss-w-line); }
|
|
6898
6982
|
|
|
6899
6983
|
/* Game screen host: back-row + placeholder body */
|
|
6900
|
-
|
|
6984
|
+
/* Game screen fills the panel; the board scrolls internally and the search/input bar stays
|
|
6985
|
+
pinned at the bottom so the fan never has to scroll to reach it. */
|
|
6986
|
+
.ss-w-gscreen-wrap { flex: 1; min-height: 0; display: flex; flex-direction: column; padding: 14px; overflow: hidden; }
|
|
6987
|
+
.ss-w-gscreen { flex: 1; min-height: 0; display: flex; flex-direction: column; gap: 0; }
|
|
6988
|
+
.ss-w-gscreen > .ss-w-gxi, .ss-w-gscreen > .ss-w-gt, .ss-w-gscreen > .ss-w-cpath,
|
|
6989
|
+
.ss-w-gscreen > .ss-w-btg, .ss-w-gscreen > .ss-w-hl { flex: 1; min-height: 0; }
|
|
6990
|
+
/* Scrollable board + guess-history region. */
|
|
6991
|
+
.ss-w-gscroll { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; display: flex; flex-direction: column; gap: 10px; padding-bottom: 2px; }
|
|
6992
|
+
/* Bottom-pinned bar (search input / action). */
|
|
6993
|
+
.ss-w-gpin { flex-shrink: 0; padding-top: 10px; }
|
|
6994
|
+
/* Heads stay put above the scroll region. */
|
|
6995
|
+
.ss-w-gxi-head, .ss-w-gt-head, .ss-w-cpath-head, .ss-w-btg-head { flex-shrink: 0; }
|
|
6996
|
+
/* Mystery Tiger explainer key (\u2713 / \u25B2 / \u25BC). */
|
|
6997
|
+
.ss-w-gt-key { white-space: nowrap; }
|
|
6998
|
+
.ss-w-gt-key b { font-weight: 800; color: var(--ss-w-ink); }
|
|
6999
|
+
.ss-w-gt-key-ok { color: var(--ss-w-correct) !important; }
|
|
7000
|
+
/* Higher or Lower terminal score unit. */
|
|
7001
|
+
.ss-w-hl-over-unit { font-size: 14px; font-weight: 700; color: var(--ss-w-faint); }
|
|
6901
7002
|
.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; }
|
|
6902
7003
|
.ss-w-gscreen-back-arrow { font-size: 11px; font-weight: 700; }
|
|
6903
7004
|
.ss-w-gscreen-body { flex: 1; display: flex; align-items: center; justify-content: center; padding: 40px 16px; color: var(--ss-w-faint); font-size: 13px; text-align: center; }
|
|
@@ -6951,7 +7052,9 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
6951
7052
|
.ss-w-gtta-i { width: 100%; box-sizing: border-box; padding: 9px 12px; 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; outline: none; transition: border-color .12s; }
|
|
6952
7053
|
.ss-w-gtta-i:focus { border-color: var(--ss-w-accent); }
|
|
6953
7054
|
.ss-w-gtta-i:disabled { opacity: .5; cursor: not-allowed; }
|
|
6954
|
-
|
|
7055
|
+
/* Opens UPWARD (bottom-anchored) because the input is pinned to the panel's bottom edge \u2014 a
|
|
7056
|
+
downward menu would be clipped off-screen. */
|
|
7057
|
+
.ss-w-gtta-drop { position: absolute; left: 0; right: 0; bottom: calc(100% + 4px); top: auto; z-index: 10; background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); border-radius: 10px; max-height: 200px; overflow-y: auto; box-shadow: 0 -4px 16px rgba(0,0,0,.16); }
|
|
6955
7058
|
.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); }
|
|
6956
7059
|
.ss-w-gtta-opt:last-child { border-bottom: none; }
|
|
6957
7060
|
.ss-w-gtta-opt:hover { background: var(--ss-w-bubble); }
|
|
@@ -7101,7 +7204,9 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
7101
7204
|
.ss-w-gxi { display: flex; flex-direction: column; gap: 12px; }
|
|
7102
7205
|
/* Header */
|
|
7103
7206
|
.ss-w-gxi-head { display: flex; align-items: flex-start; gap: 8px; }
|
|
7104
|
-
.ss-w-gxi-title { font-size: 18px; font-weight: 800; text-transform: uppercase; letter-spacing: .02em; color: var(--ss-w-ink); line-height: 1; }
|
|
7207
|
+
.ss-w-gxi-title { font-size: 18px; font-weight: 800; text-transform: uppercase; letter-spacing: .02em; color: var(--ss-w-ink); line-height: 1; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
|
|
7208
|
+
/* Formation pill next to the title, e.g. "4-2-3-1". */
|
|
7209
|
+
.ss-w-gxi-form { font-size: 12px; font-weight: 800; letter-spacing: .06em; color: var(--ss-w-accent); background: color-mix(in srgb, var(--ss-w-accent) 12%, var(--ss-w-panel)); border: 1px solid color-mix(in srgb, var(--ss-w-accent) 26%, var(--ss-w-line)); border-radius: 999px; padding: 2px 9px; font-variant-numeric: tabular-nums; }
|
|
7105
7210
|
.ss-w-gxi-sub { font-size: 11px; color: var(--ss-w-faint); margin-top: 4px; }
|
|
7106
7211
|
.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; }
|
|
7107
7212
|
/* Pitch: a flag per slot laid out in formation rows on a green field. A real min-height plus
|
|
@@ -7110,13 +7215,22 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
7110
7215
|
/* A football pitch is grass-green regardless of the operator accent, so the field uses fixed
|
|
7111
7216
|
green values (not --ss-w-correct, which is a muted per-operator token that vanished on dark
|
|
7112
7217
|
themes) plus visible horizontal yard-lines and a brighter halfway line. */
|
|
7113
|
-
.ss-w-gxi-pitch { position: relative; display: flex; flex-direction: column; justify-content: space-between; gap:
|
|
7218
|
+
.ss-w-gxi-pitch { position: relative; display: flex; flex-direction: column; justify-content: space-between; gap: 6px; min-height: 210px; padding: 14px 10px; border-radius: 14px; border: 1px solid rgba(46, 160, 86, .38);
|
|
7114
7219
|
background:
|
|
7115
7220
|
linear-gradient(180deg, rgba(46, 160, 86, .015) 0, rgba(46, 160, 86, .015) 49.5%, rgba(255,255,255,.14) 49.5%, rgba(255,255,255,.14) 50.5%, rgba(46, 160, 86, .015) 50.5%),
|
|
7116
7221
|
repeating-linear-gradient(180deg, transparent 0 31px, rgba(255,255,255,.045) 31px 32px),
|
|
7117
7222
|
linear-gradient(180deg, rgba(46, 160, 86, .28), rgba(38, 132, 71, .16)); }
|
|
7118
|
-
.ss-w-gxi-prow { display: flex; justify-content: center; align-items:
|
|
7223
|
+
.ss-w-gxi-prow { display: flex; justify-content: center; align-items: flex-start; gap: 12px; }
|
|
7224
|
+
.ss-w-gxi-slot { display: flex; flex-direction: column; align-items: center; gap: 2px; width: 46px; }
|
|
7119
7225
|
.ss-w-gxi-flag { width: 32px; height: 32px; flex: none; border-radius: 50%; display: grid; place-items: center; font-size: 17px; line-height: 1; background: rgba(9, 12, 10, .55); border: 1px solid rgba(255,255,255,.16); box-shadow: 0 1px 3px rgba(0,0,0,.3); overflow: hidden; }
|
|
7226
|
+
/* A slot whose player has been revealed by a wrong guess. */
|
|
7227
|
+
.ss-w-gxi-flag--revealed { border-color: var(--ss-w-accent); box-shadow: 0 0 0 2px color-mix(in srgb, var(--ss-w-accent) 45%, transparent); }
|
|
7228
|
+
/* Position label shown under every flag (GK, CB, CM, ST\u2026) \u2014 reads the formation and marks the
|
|
7229
|
+
keeper's end. Muted so it sits behind the flag, not competing with it. */
|
|
7230
|
+
.ss-w-gxi-pos { font-size: 8.5px; line-height: 1.05; font-weight: 800; letter-spacing: .04em; text-align: center; color: rgba(255,255,255,.82); text-shadow: 0 1px 2px rgba(0,0,0,.5); }
|
|
7231
|
+
/* Player surname, shown under the position once a wrong guess reveals it \u2014 in the accent colour. */
|
|
7232
|
+
.ss-w-gxi-flag-lab { font-size: 8px; line-height: 1.05; font-weight: 700; text-align: center; color: var(--ss-w-accent); max-width: 46px; word-break: break-word; }
|
|
7233
|
+
.ss-w-gxi-revnote { font-size: 11px; color: var(--ss-w-faint); }
|
|
7120
7234
|
/* Wrong-guess trail */
|
|
7121
7235
|
.ss-w-gxi-wrong { display: flex; flex-wrap: wrap; gap: 6px; }
|
|
7122
7236
|
.ss-w-gxi-wrong-pill { font-size: 11px; font-weight: 600; padding: 3px 9px; border-radius: 999px; background: color-mix(in srgb, var(--ss-w-wrong) 10%, var(--ss-w-panel)); border: 1px solid var(--ss-w-line); color: var(--ss-w-faint); text-decoration: line-through; }
|