@sensiblestats/widget-react 0.53.0 → 0.54.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 CHANGED
@@ -1,5 +1,16 @@
1
1
  # @sensiblestats/widget-react
2
2
 
3
+ ## 0.54.0
4
+
5
+ ### Minor Changes
6
+
7
+ - c013151: Rebuild the daily game screens to match the design artifact:
8
+
9
+ - Guess the XI now renders a real formation on the pitch (GK line at the back → forwards forward), so each flag's position is legible instead of a scatter; cut to 3 guesses.
10
+ - Career Path wraps the club-crest sequence instead of scrolling/truncating with "+N more"; loans read as "(loan)" and years are compact.
11
+ - Higher or Lower drops the answered-history list for the artifact's clean pair + footer chips.
12
+ - Mystery Tiger's first load shows the five-attribute legend instead of a bare search box.
13
+
3
14
  ## 0.53.0
4
15
 
5
16
  ### Minor Changes
package/dist/index.cjs CHANGED
@@ -4386,6 +4386,13 @@ function MysteryTigerGame({
4386
4386
  " left"
4387
4387
  ] })
4388
4388
  ] }),
4389
+ guessResults.length === 0 && !isOver && /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "ss-w-gt-legend", children: [
4390
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "ss-w-gt-legend-lead", children: "Guess any squad player \u2014 each guess reveals how close you are:" }),
4391
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "ss-w-gtrow", children: ATTR_KEYS.map((key) => /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "ss-w-gtile ss-w-gtile--legend", children: [
4392
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "ss-w-gtile-lab", children: ATTR_LABELS[key] }),
4393
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "ss-w-gtile-v", "aria-hidden": "true", children: "\xB7" })
4394
+ ] }, key)) })
4395
+ ] }),
4389
4396
  guessResults.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "ss-w-gtrows", children: guessResults.map((gr, i) => {
4390
4397
  const player = config.squadPlayers.find((p) => p.id === gr.playerId);
4391
4398
  return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "ss-w-gtguess", children: [
@@ -4470,6 +4477,7 @@ function MysteryTigerGame({
4470
4477
 
4471
4478
  // src/components/games/HigherOrLowerGame.tsx
4472
4479
  var import_jsx_runtime56 = require("react/jsx-runtime");
4480
+ var POINTS_PER_CORRECT = 10;
4473
4481
  function parseClientState2(json) {
4474
4482
  if (!json) return null;
4475
4483
  try {
@@ -4561,39 +4569,25 @@ function HigherOrLowerGame({
4561
4569
  ] })
4562
4570
  ] })
4563
4571
  ] }),
4572
+ !isOver && /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "ss-w-hl-foot", children: [
4573
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("span", { className: "ss-w-hl-chip", children: [
4574
+ score,
4575
+ " pts"
4576
+ ] }),
4577
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("span", { className: "ss-w-hl-chip ss-w-hl-chip--green", children: [
4578
+ "+",
4579
+ POINTS_PER_CORRECT,
4580
+ " / correct"
4581
+ ] })
4582
+ ] }),
4564
4583
  isOver && /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "ss-w-hl-over", children: [
4565
4584
  /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("div", { className: "ss-w-hl-over-title", children: runEndedWrong ? "Run over" : "Nice run!" }),
4566
4585
  /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("div", { className: "ss-w-hl-over-score", children: score }),
4567
4586
  /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "ss-w-hl-over-sub", children: [
4568
4587
  correctCount,
4569
- " correct",
4570
- correctCount === 1 ? "" : "",
4571
- " \xB7 come back tomorrow for a new run"
4588
+ " correct \xB7 come back tomorrow for a new run"
4572
4589
  ] })
4573
- ] }),
4574
- answeredPairs.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("div", { className: "ss-w-hlresults", children: answeredPairs.map((answered) => {
4575
- const pair = config.pairs.find((p) => p.pairIndex === answered.pairIndex);
4576
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
4577
- "div",
4578
- {
4579
- className: `ss-w-hlrrow ss-w-hlrrow--${answered.wasCorrect ? "correct" : "wrong"}`,
4580
- children: [
4581
- /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("span", { className: "ss-w-hlrrow-names", children: [
4582
- pair?.playerAName ?? "?",
4583
- " ",
4584
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("b", { className: "ss-w-hlrrow-val", children: pair?.playerAValue }),
4585
- " vs ",
4586
- pair?.playerBName ?? "?",
4587
- " ",
4588
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("b", { className: "ss-w-hlrrow-val", children: answered.playerBValue })
4589
- ] }),
4590
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "ss-w-hlrrow-pick", children: answered.pick }),
4591
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "ss-w-hlrrow-icon", children: answered.wasCorrect ? "\u2713" : "\u2717" })
4592
- ]
4593
- },
4594
- answered.pairIndex
4595
- );
4596
- }) })
4590
+ ] })
4597
4591
  ] })
4598
4592
  ] });
4599
4593
  }
@@ -4610,18 +4604,22 @@ function parseClientState3(json) {
4610
4604
  }
4611
4605
  }
4612
4606
  function spellYears(spell) {
4613
- const parts = [];
4614
- if (spell.startYear) parts.push(String(spell.startYear));
4615
- if (spell.endYear) parts.push(String(spell.endYear));
4616
- return parts.join("\u2013");
4607
+ if (!spell.startYear) return "";
4608
+ const yy = (y) => `'${String(y % 100).padStart(2, "0")}`;
4609
+ if (spell.endYear && spell.endYear !== spell.startYear) {
4610
+ return `${yy(spell.startYear)}\u2013${String(spell.endYear % 100).padStart(2, "0")}`;
4611
+ }
4612
+ return yy(spell.startYear);
4617
4613
  }
4618
4614
  function ClubSpellCard({ spell }) {
4619
4615
  const years = spellYears(spell);
4620
4616
  return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: `ss-w-cpath-club${spell.isLoan ? " ss-w-cpath-club--loan" : ""}`, children: [
4621
4617
  spell.crestUrl ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("img", { src: spell.crestUrl, alt: "", className: "ss-w-cpath-crest", loading: "lazy" }) : /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "ss-w-cpath-crest ss-w-cpath-crest--fallback", "aria-hidden": "true", children: spell.clubName.slice(0, 3).toUpperCase() }),
4622
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-w-cpath-club-name", children: spell.clubName }),
4623
- years && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-w-cpath-spell-yr", children: years }),
4624
- spell.isLoan && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-w-cpath-loan-badge", children: "Loan" })
4618
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "ss-w-cpath-club-name", children: [
4619
+ spell.clubName,
4620
+ spell.isLoan && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-w-cpath-loan-note", children: " (loan)" })
4621
+ ] }),
4622
+ years && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-w-cpath-spell-yr", children: years })
4625
4623
  ] });
4626
4624
  }
4627
4625
  function CareerPathGame({
@@ -4636,8 +4634,6 @@ function CareerPathGame({
4636
4634
  const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
4637
4635
  const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
4638
4636
  const visiblePath = clientState?.visiblePath ?? config?.initialPath ?? [];
4639
- const totalClubs = clientState?.totalClubs ?? config?.totalClubs ?? visiblePath.length;
4640
- const hiddenCount = Math.max(0, totalClubs - visiblePath.length);
4641
4637
  const filtered = config && !isOver ? config.typeaheadPool.filter(
4642
4638
  (p) => !alreadyGuessedIds.has(p.id) && p.name.toLowerCase().includes(query.toLowerCase())
4643
4639
  ) : [];
@@ -4661,20 +4657,10 @@ function CareerPathGame({
4661
4657
  " left"
4662
4658
  ] })
4663
4659
  ] }),
4664
- /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "ss-w-cpath-seq", children: [
4665
- visiblePath.map((spell, i) => /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react30.Fragment, { children: [
4666
- i > 0 && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-w-cpath-arrow", "aria-hidden": "true", children: "\u2192" }),
4667
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(ClubSpellCard, { spell })
4668
- ] }, `${spell.clubName}-${i}`)),
4669
- hiddenCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_jsx_runtime57.Fragment, { children: [
4670
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-w-cpath-arrow", "aria-hidden": "true", children: "\u2192" }),
4671
- /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "ss-w-cpath-hidden", children: [
4672
- "+",
4673
- hiddenCount,
4674
- " more"
4675
- ] })
4676
- ] })
4677
- ] }),
4660
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "ss-w-cpath-seq", children: visiblePath.map((spell, i) => /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_react30.Fragment, { children: [
4661
+ i > 0 && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-w-cpath-arrow", "aria-hidden": "true", children: "\u203A" }),
4662
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(ClubSpellCard, { spell })
4663
+ ] }, `${spell.clubName}-${i}`)) }),
4678
4664
  clientState?.hintLine && !isOver && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "ss-w-cpath-hint", children: [
4679
4665
  "\u{1F4A1} ",
4680
4666
  clientState.hintLine
@@ -4925,6 +4911,7 @@ function BeatTheGridGame({
4925
4911
  // src/components/games/GuessTheXiGame.tsx
4926
4912
  var import_react32 = require("react");
4927
4913
  var import_jsx_runtime59 = require("react/jsx-runtime");
4914
+ var MAX_GUESSES = 3;
4928
4915
  function parseClientState5(json) {
4929
4916
  if (!json) return null;
4930
4917
  try {
@@ -4980,12 +4967,12 @@ function GuessTheXiGame({
4980
4967
  /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { children: [
4981
4968
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: "ss-w-gxi-title", children: "Guess the XI" }),
4982
4969
  /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { className: "ss-w-gxi-sub", children: [
4983
- "Which team? \xB7 ",
4970
+ "Which team? \xB7 flags only \xB7 ",
4984
4971
  config.poolLabel
4985
4972
  ] })
4986
4973
  ] }),
4987
4974
  clientState && !isOver && /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("span", { className: "ss-w-gxi-left", children: [
4988
- Math.max(0, 6 - clientState.guessesUsed),
4975
+ Math.max(0, MAX_GUESSES - clientState.guessesUsed),
4989
4976
  " left"
4990
4977
  ] })
4991
4978
  ] }),
@@ -6993,6 +6980,11 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
6993
6980
  .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; }
6994
6981
  /* Guess rows \u2014 one labelled block per guess */
6995
6982
  .ss-w-gtrows { display: flex; flex-direction: column; gap: 8px; }
6983
+ /* First-load legend (empty state) */
6984
+ .ss-w-gt-legend { display: flex; flex-direction: column; gap: 8px; }
6985
+ .ss-w-gt-legend-lead { font-size: 11.5px; color: var(--ss-w-faint); line-height: 1.35; }
6986
+ .ss-w-gtile--legend { background: var(--ss-w-bubble); border: 1px dashed var(--ss-w-line); color: var(--ss-w-faint); }
6987
+ .ss-w-gtile--legend .ss-w-gtile-lab { opacity: .9; }
6996
6988
  .ss-w-gtguess { display: flex; flex-direction: column; gap: 4px; }
6997
6989
  .ss-w-gtguess-nm { font-size: 11px; font-weight: 600; color: var(--ss-w-faint); }
6998
6990
  .ss-w-gtrow { display: grid; grid-template-columns: repeat(5, 1fr); gap: 5px; }
@@ -7045,16 +7037,10 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
7045
7037
  .ss-w-hl-over-score { font-size: 34px; font-weight: 800; color: var(--ss-w-accent); line-height: 1; font-variant-numeric: tabular-nums; }
7046
7038
  .ss-w-hl-over-sub { font-size: 11px; color: var(--ss-w-faint); }
7047
7039
  /* Answered history \u2014 clean single-line rows with the revealed value */
7048
- .ss-w-hlresults { display: flex; flex-direction: column; gap: 5px; }
7049
- .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); }
7050
- .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)); }
7051
- .ss-w-hlrrow--wrong { background: color-mix(in srgb, var(--ss-w-cta) 8%, var(--ss-w-panel)); }
7052
- .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; }
7053
- .ss-w-hlrrow-val { font-weight: 800; color: var(--ss-w-accent); font-variant-numeric: tabular-nums; }
7054
- .ss-w-hlrrow-pick { font-size: 10px; font-weight: 700; text-transform: uppercase; color: var(--ss-w-faint); flex: none; }
7055
- .ss-w-hlrrow-icon { font-size: 14px; flex: none; }
7056
- .ss-w-hlrrow--correct .ss-w-hlrrow-icon { color: var(--ss-w-correct); }
7057
- .ss-w-hlrrow--wrong .ss-w-hlrrow-icon { color: var(--ss-w-cta); }
7040
+ /* In-progress footer chips (artifact) */
7041
+ .ss-w-hl-foot { display: flex; align-items: center; gap: 8px; }
7042
+ .ss-w-hl-chip { font-size: 11px; font-weight: 600; color: var(--ss-w-faint); background: var(--ss-w-bubble); border: 1px solid var(--ss-w-line); border-radius: 999px; padding: 4px 10px; }
7043
+ .ss-w-hl-chip--green { margin-left: auto; color: var(--ss-w-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) 26%, var(--ss-w-line)); }
7058
7044
 
7059
7045
  /* ---- Career Path game screen (D3) \u2014 artifact cpath/club/cto layout ---- */
7060
7046
  .ss-w-cpath { display: flex; flex-direction: column; gap: 12px; }
@@ -7064,18 +7050,16 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
7064
7050
  .ss-w-cpath-sub { font-size: 11px; color: var(--ss-w-faint); margin-top: 4px; }
7065
7051
  .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; }
7066
7052
  /* Career sequence \u2014 horizontal crests with arrows */
7067
- .ss-w-cpath-seq { display: flex; flex-wrap: nowrap; align-items: flex-start; gap: 4px; background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); border-radius: 14px; padding: 13px 11px; overflow-x: auto; overscroll-behavior-x: contain; }
7068
- .ss-w-cpath-arrow { align-self: center; flex: none; color: var(--ss-w-faint); font-size: 13px; padding-top: 10px; }
7053
+ .ss-w-cpath-seq { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 6px 4px; background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); border-radius: 14px; padding: 13px 11px; }
7054
+ .ss-w-cpath-arrow { align-self: flex-start; flex: none; color: var(--ss-w-faint); font-size: 13px; padding-top: 9px; }
7069
7055
  /* Single club \u2014 small vertical card */
7070
7056
  .ss-w-cpath-club { display: flex; flex-direction: column; align-items: center; gap: 3px; width: 56px; flex: none; }
7071
7057
  .ss-w-cpath-crest { width: 34px; height: 34px; object-fit: contain; flex: none; border-radius: 8px; }
7072
7058
  .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); }
7073
- .ss-w-cpath-club-name { font-size: 9px; font-weight: 600; color: var(--ss-w-ink); text-align: center; line-height: 1.15; max-width: 56px; display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
7059
+ .ss-w-cpath-club-name { font-size: 9px; font-weight: 600; color: var(--ss-w-ink); text-align: center; line-height: 1.15; max-width: 56px; overflow-wrap: anywhere; }
7074
7060
  .ss-w-cpath-spell-yr { font-size: 8px; color: var(--ss-w-faint); font-weight: 500; white-space: nowrap; }
7075
- .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)); }
7061
+ .ss-w-cpath-loan-note { display: block; color: var(--ss-w-faint); font-weight: 500; }
7076
7062
  .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)); }
7077
- /* Hidden clubs chip */
7078
- .ss-w-cpath-hidden { align-self: center; flex: none; white-space: nowrap; 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; }
7079
7063
  /* Hint line */
7080
7064
  .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)); }
7081
7065
  /* Terminal outcome */
@@ -7139,10 +7123,15 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
7139
7123
  .ss-w-gxi-title { font-size: 18px; font-weight: 800; text-transform: uppercase; letter-spacing: .02em; color: var(--ss-w-ink); line-height: 1; }
7140
7124
  .ss-w-gxi-sub { font-size: 11px; color: var(--ss-w-faint); margin-top: 4px; }
7141
7125
  .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; }
7142
- /* Pitch: a flag per slot laid out in formation rows on a green field */
7143
- .ss-w-gxi-pitch { display: flex; flex-direction: column; justify-content: space-between; gap: 10px; padding: 16px 10px; border-radius: 14px; border: 1px solid color-mix(in srgb, var(--ss-w-correct) 22%, var(--ss-w-line)); background: linear-gradient(180deg, color-mix(in srgb, var(--ss-w-correct) 10%, var(--ss-w-panel)), color-mix(in srgb, var(--ss-w-correct) 4%, var(--ss-w-panel))); }
7144
- .ss-w-gxi-prow { display: flex; justify-content: space-around; align-items: center; gap: 8px; }
7145
- .ss-w-gxi-flag { width: 34px; height: 34px; flex: none; border-radius: 50%; display: grid; place-items: center; font-size: 19px; line-height: 1; background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); box-shadow: 0 1px 3px rgba(0,0,0,.14); overflow: hidden; }
7126
+ /* Pitch: a flag per slot laid out in formation rows on a green field. A real min-height plus
7127
+ space-between distributes the formation lines top\u2192bottom like a pitch (GK at the back, forwards
7128
+ forward); yard-line stripes reinforce the read. Without a height the lines collapse together. */
7129
+ .ss-w-gxi-pitch { display: flex; flex-direction: column; justify-content: space-between; gap: 8px; min-height: 300px; padding: 18px 10px; border-radius: 14px; border: 1px solid color-mix(in srgb, var(--ss-w-correct) 22%, var(--ss-w-line));
7130
+ background:
7131
+ linear-gradient(180deg, color-mix(in srgb, var(--ss-w-correct) 12%, var(--ss-w-panel)), color-mix(in srgb, var(--ss-w-correct) 4%, var(--ss-w-panel))),
7132
+ repeating-linear-gradient(180deg, transparent 0 40px, color-mix(in srgb, var(--ss-w-ink) 4%, transparent) 40px 80px); }
7133
+ .ss-w-gxi-prow { display: flex; justify-content: center; align-items: center; gap: 14px; }
7134
+ .ss-w-gxi-flag { width: 36px; height: 36px; flex: none; border-radius: 50%; display: grid; place-items: center; font-size: 20px; line-height: 1; background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); box-shadow: 0 1px 3px rgba(0,0,0,.14); overflow: hidden; }
7146
7135
  /* Wrong-guess trail */
7147
7136
  .ss-w-gxi-wrong { display: flex; flex-wrap: wrap; gap: 6px; }
7148
7137
  .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; }