@sensiblestats/widget-react 0.62.0 → 0.63.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 +11 -0
- package/dist/index.cjs +923 -820
- 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 +881 -778
- package/dist/index.js.map +1 -1
- package/dist/styles.css +15 -0
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -36,7 +36,7 @@ __export(index_exports, {
|
|
|
36
36
|
module.exports = __toCommonJS(index_exports);
|
|
37
37
|
|
|
38
38
|
// src/StatsWidget.tsx
|
|
39
|
-
var
|
|
39
|
+
var import_react46 = require("react");
|
|
40
40
|
var import_widget_sdk5 = require("@sensiblestats/widget-sdk");
|
|
41
41
|
|
|
42
42
|
// src/kickoff.ts
|
|
@@ -126,6 +126,10 @@ var STRINGS = {
|
|
|
126
126
|
inSlipLabel: "In slip",
|
|
127
127
|
oddsUnavailable: "Odds unavailable right now",
|
|
128
128
|
momentumLabel: "Momentum",
|
|
129
|
+
liveFactLabel: "Live fact",
|
|
130
|
+
liveFactAsk: "Ask about this",
|
|
131
|
+
liveFactEarlier: (n) => `Earlier facts (${n})`,
|
|
132
|
+
liveFactHideEarlier: "Hide earlier facts",
|
|
129
133
|
accordionValueLabel: "Value",
|
|
130
134
|
accordionRetry: "Couldn't load odds \u2014 tap to retry",
|
|
131
135
|
accordionSuspended: "Suspended",
|
|
@@ -422,6 +426,10 @@ var STRINGS = {
|
|
|
422
426
|
inSlipLabel: "Kuponda",
|
|
423
427
|
oddsUnavailable: "Oranlar \u015Fu anda kullan\u0131lam\u0131yor",
|
|
424
428
|
momentumLabel: "Momentum",
|
|
429
|
+
liveFactLabel: "Canl\u0131 bilgi",
|
|
430
|
+
liveFactAsk: "Bunu sor",
|
|
431
|
+
liveFactEarlier: (n) => `\xD6nceki bilgiler (${n})`,
|
|
432
|
+
liveFactHideEarlier: "\xD6nceki bilgileri gizle",
|
|
425
433
|
accordionValueLabel: "De\u011Fer",
|
|
426
434
|
accordionRetry: "Oranlar y\xFCklenemedi \u2014 yeniden dene",
|
|
427
435
|
accordionSuspended: "Ask\u0131da",
|
|
@@ -746,6 +754,10 @@ function normalizeUi(cfg) {
|
|
|
746
754
|
inSlipLabel: strings.inSlipLabel,
|
|
747
755
|
oddsUnavailable: strings.oddsUnavailable,
|
|
748
756
|
momentumLabel: strings.momentumLabel,
|
|
757
|
+
liveFactLabel: strings.liveFactLabel,
|
|
758
|
+
liveFactAsk: strings.liveFactAsk,
|
|
759
|
+
liveFactEarlier: strings.liveFactEarlier,
|
|
760
|
+
liveFactHideEarlier: strings.liveFactHideEarlier,
|
|
749
761
|
accordionValueLabel: strings.accordionValueLabel,
|
|
750
762
|
accordionRetry: strings.accordionRetry,
|
|
751
763
|
accordionSuspended: strings.accordionSuspended,
|
|
@@ -792,6 +804,12 @@ function slipPickFields(selection, label, line) {
|
|
|
792
804
|
if (Number.isFinite(odds) && odds > 1 && odds <= MAX_ODDS) fields.odds = odds;
|
|
793
805
|
return fields;
|
|
794
806
|
}
|
|
807
|
+
function chipSelection(market, matchId, conversationId) {
|
|
808
|
+
if (!market || !market.addToSlipEnabled || typeof market.matchOddsId !== "number" || typeof market.price !== "number") return null;
|
|
809
|
+
const selection = { matchOddsId: market.matchOddsId, matchId, oddsDecimal: market.price };
|
|
810
|
+
if (conversationId !== void 0) selection.conversationId = conversationId;
|
|
811
|
+
return selection;
|
|
812
|
+
}
|
|
795
813
|
function wasAdded(result) {
|
|
796
814
|
if (!result) return true;
|
|
797
815
|
if (result.status === "price_changed") return result.accepted;
|
|
@@ -1510,7 +1528,7 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
|
|
|
1510
1528
|
const send = (0, import_react2.useCallback)((text, opts) => {
|
|
1511
1529
|
const trimmed = text.trim();
|
|
1512
1530
|
if (!trimmed) return;
|
|
1513
|
-
run({ message: trimmed, actionId: opts?.actionId, actionRef: opts?.actionRef }, opts?.displayText);
|
|
1531
|
+
run({ message: trimmed, actionId: opts?.actionId, actionRef: opts?.actionRef, grounding: opts?.grounding }, opts?.displayText);
|
|
1514
1532
|
}, [run]);
|
|
1515
1533
|
const retry = (0, import_react2.useCallback)(() => {
|
|
1516
1534
|
const last = stateRef.current.lastUserInput;
|
|
@@ -2384,7 +2402,7 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
|
|
|
2384
2402
|
}
|
|
2385
2403
|
|
|
2386
2404
|
// src/components/ChatPanel.tsx
|
|
2387
|
-
var
|
|
2405
|
+
var import_react45 = require("react");
|
|
2388
2406
|
|
|
2389
2407
|
// src/components/ChatHeader.tsx
|
|
2390
2408
|
var import_react12 = require("react");
|
|
@@ -4213,15 +4231,79 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
4213
4231
|
}) });
|
|
4214
4232
|
}
|
|
4215
4233
|
|
|
4216
|
-
// src/components/
|
|
4234
|
+
// src/components/LiveFactBlock.tsx
|
|
4235
|
+
var import_react29 = require("react");
|
|
4217
4236
|
var import_jsx_runtime47 = require("react/jsx-runtime");
|
|
4218
|
-
function
|
|
4219
|
-
const
|
|
4220
|
-
|
|
4221
|
-
|
|
4222
|
-
|
|
4223
|
-
return
|
|
4237
|
+
function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
|
|
4238
|
+
const [expanded, setExpanded] = (0, import_react29.useState)(false);
|
|
4239
|
+
const [current, ...earlier] = facts;
|
|
4240
|
+
if (!current) return null;
|
|
4241
|
+
const m = current.market;
|
|
4242
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("section", { className: "ss-w-fact", "aria-label": ui.liveFactLabel, children: [
|
|
4243
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "ss-w-fact-k", children: [
|
|
4244
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { children: ui.liveFactLabel }),
|
|
4245
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("span", { className: "ss-w-fact-min", children: [
|
|
4246
|
+
"\xB7 ",
|
|
4247
|
+
current.minuteLabel
|
|
4248
|
+
] }),
|
|
4249
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "ss-w-fact-subj", children: current.subjectLabel })
|
|
4250
|
+
] }),
|
|
4251
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)("p", { className: "ss-w-fact-text", children: current.text }),
|
|
4252
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "ss-w-fact-basis", children: current.basis }),
|
|
4253
|
+
m && !m.isSuspended && /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "ss-w-fact-mkt", children: [
|
|
4254
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("span", { children: [
|
|
4255
|
+
m.marketLabel,
|
|
4256
|
+
" \xB7 ",
|
|
4257
|
+
m.selectionLabel
|
|
4258
|
+
] }),
|
|
4259
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("span", { className: "ss-w-mon-stat-mkt-right", children: [
|
|
4260
|
+
typeof m.price === "number" && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "ss-w-mon-price", children: m.price.toFixed(2) }),
|
|
4261
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
4262
|
+
SlipButton,
|
|
4263
|
+
{
|
|
4264
|
+
selection: chipSelection(m, matchId, slip.conversationId),
|
|
4265
|
+
shownOdds: typeof m.price === "number" ? m.price.toFixed(2) : "",
|
|
4266
|
+
marketDeveloperName: m.marketDeveloperName,
|
|
4267
|
+
selectionLabel: m.selectionLabel,
|
|
4268
|
+
slip,
|
|
4269
|
+
ui
|
|
4270
|
+
}
|
|
4271
|
+
)
|
|
4272
|
+
] })
|
|
4273
|
+
] }),
|
|
4274
|
+
expanded && earlier.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("ul", { className: "ss-w-fact-hist", children: earlier.map((f) => /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("li", { children: [
|
|
4275
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "ss-w-fact-hmin", children: f.minuteLabel }),
|
|
4276
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { children: [
|
|
4277
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)("p", { className: "ss-w-fact-htext", children: f.text }),
|
|
4278
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "ss-w-fact-basis", children: f.basis })
|
|
4279
|
+
] })
|
|
4280
|
+
] }, f.id)) }),
|
|
4281
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "ss-w-fact-foot", children: [
|
|
4282
|
+
onAsk && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
4283
|
+
"button",
|
|
4284
|
+
{
|
|
4285
|
+
type: "button",
|
|
4286
|
+
className: "ss-w-fact-link",
|
|
4287
|
+
onClick: () => onAsk(current.text, { kind: "liveFact", matchId, subject: current.text.slice(0, 400) }),
|
|
4288
|
+
children: ui.liveFactAsk
|
|
4289
|
+
}
|
|
4290
|
+
),
|
|
4291
|
+
earlier.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
4292
|
+
"button",
|
|
4293
|
+
{
|
|
4294
|
+
type: "button",
|
|
4295
|
+
className: "ss-w-fact-link ss-w-fact-link--muted",
|
|
4296
|
+
"aria-expanded": expanded,
|
|
4297
|
+
onClick: () => setExpanded((v) => !v),
|
|
4298
|
+
children: expanded ? ui.liveFactHideEarlier : ui.liveFactEarlier(earlier.length)
|
|
4299
|
+
}
|
|
4300
|
+
)
|
|
4301
|
+
] })
|
|
4302
|
+
] });
|
|
4224
4303
|
}
|
|
4304
|
+
|
|
4305
|
+
// src/components/MonitorMatchCard.tsx
|
|
4306
|
+
var import_jsx_runtime48 = require("react/jsx-runtime");
|
|
4225
4307
|
function isPromoted(row, promotedPins) {
|
|
4226
4308
|
const chip = row.market;
|
|
4227
4309
|
if (!chip) return false;
|
|
@@ -4247,7 +4329,7 @@ function groupScorers(goals, ownGoalLabel) {
|
|
|
4247
4329
|
return { player: name, label: name ? `${name} ${minutes}` : minutes };
|
|
4248
4330
|
});
|
|
4249
4331
|
}
|
|
4250
|
-
function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
4332
|
+
function MonitorMatchCard({ match, promotedPins, monitor, ui, slip, onAsk }) {
|
|
4251
4333
|
const live = match.phase === "live";
|
|
4252
4334
|
const goals = match.events.filter((e) => e.type === "goal");
|
|
4253
4335
|
const homeScorers = groupScorers(goals.filter((e) => e.side === "home"), ui.ownGoalLabel);
|
|
@@ -4256,67 +4338,68 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
4256
4338
|
const otherRows = match.statRows.filter((row) => !isPromoted(row, promotedPins));
|
|
4257
4339
|
const orderedRows = [...promotedRows, ...otherRows];
|
|
4258
4340
|
const kickoff = match.phase === "preMatch" && match.kickoffUtc ? ui.bettingKickoff(match.kickoffUtc) : void 0;
|
|
4259
|
-
return /* @__PURE__ */ (0,
|
|
4260
|
-
/* @__PURE__ */ (0,
|
|
4261
|
-
live && /* @__PURE__ */ (0,
|
|
4262
|
-
/* @__PURE__ */ (0,
|
|
4341
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "ss-w-mon", children: [
|
|
4342
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "ss-w-mon-top", children: [
|
|
4343
|
+
live && /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "ss-w-fandash-live-pill", children: [
|
|
4344
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-fandash-live-dot", "aria-hidden": "true" }),
|
|
4263
4345
|
ui.liveLabel
|
|
4264
4346
|
] }),
|
|
4265
|
-
match.phase === "fullTime" && /* @__PURE__ */ (0,
|
|
4266
|
-
kickoff && /* @__PURE__ */ (0,
|
|
4347
|
+
match.phase === "fullTime" && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
|
|
4348
|
+
kickoff && /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "ss-w-mon-pill", children: [
|
|
4267
4349
|
kickoff.dayLabel,
|
|
4268
4350
|
" \xB7 ",
|
|
4269
4351
|
kickoff.time
|
|
4270
4352
|
] }),
|
|
4271
|
-
live && match.minuteLabel && /* @__PURE__ */ (0,
|
|
4272
|
-
match.competitionName && /* @__PURE__ */ (0,
|
|
4273
|
-
/* @__PURE__ */ (0,
|
|
4353
|
+
live && match.minuteLabel && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-min", children: match.minuteLabel }),
|
|
4354
|
+
match.competitionName && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-comp", children: match.competitionName }),
|
|
4355
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(PinToggle, { ui, monitor, pin: { kind: "match", matchId: match.matchId } })
|
|
4274
4356
|
] }),
|
|
4275
|
-
/* @__PURE__ */ (0,
|
|
4276
|
-
/* @__PURE__ */ (0,
|
|
4277
|
-
/* @__PURE__ */ (0,
|
|
4278
|
-
/* @__PURE__ */ (0,
|
|
4357
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "ss-w-mon-main", children: [
|
|
4358
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "ss-w-mon-side", children: [
|
|
4359
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(Crest2, { kind: "team", url: match.homeCrestUrl ?? void 0, name: match.homeTeamName ?? void 0 }),
|
|
4360
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-name", children: match.homeTeamName })
|
|
4279
4361
|
] }),
|
|
4280
|
-
match.phase === "preMatch" ? /* @__PURE__ */ (0,
|
|
4362
|
+
match.phase === "preMatch" ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-vs", children: "vs" }) : /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "ss-w-mon-score", children: [
|
|
4281
4363
|
match.homeScore,
|
|
4282
|
-
/* @__PURE__ */ (0,
|
|
4364
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("i", { children: "\u2013" }),
|
|
4283
4365
|
match.awayScore
|
|
4284
4366
|
] }),
|
|
4285
|
-
/* @__PURE__ */ (0,
|
|
4286
|
-
/* @__PURE__ */ (0,
|
|
4287
|
-
/* @__PURE__ */ (0,
|
|
4367
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "ss-w-mon-side ss-w-mon-side--away", children: [
|
|
4368
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(Crest2, { kind: "team", url: match.awayCrestUrl ?? void 0, name: match.awayTeamName ?? void 0 }),
|
|
4369
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-name", children: match.awayTeamName })
|
|
4288
4370
|
] })
|
|
4289
4371
|
] }),
|
|
4290
|
-
(homeScorers.length > 0 || awayScorers.length > 0) && /* @__PURE__ */ (0,
|
|
4291
|
-
/* @__PURE__ */ (0,
|
|
4292
|
-
/* @__PURE__ */ (0,
|
|
4293
|
-
/* @__PURE__ */ (0,
|
|
4372
|
+
(homeScorers.length > 0 || awayScorers.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "ss-w-mon-scorers", children: [
|
|
4373
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("ul", { className: "ss-w-mon-scorers-col ss-w-mon-scorers-home", children: homeScorers.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("li", { children: s.label }, `${s.player}-${i}`)) }),
|
|
4374
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-scorers-ball", "aria-hidden": "true", children: "\u26BD" }),
|
|
4375
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("ul", { className: "ss-w-mon-scorers-col ss-w-mon-scorers-away", children: awayScorers.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("li", { children: s.label }, `${s.player}-${i}`)) })
|
|
4294
4376
|
] }),
|
|
4295
|
-
/* @__PURE__ */ (0,
|
|
4377
|
+
live && match.facts && match.facts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(LiveFactBlock, { facts: match.facts, matchId: match.matchId, ui, slip, onAsk }),
|
|
4378
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "ss-w-mon-stats", children: orderedRows.map((row) => {
|
|
4296
4379
|
const total = row.homeNum + row.awayNum;
|
|
4297
4380
|
const homePct = total > 0 ? row.homeNum / total * 75 : 0;
|
|
4298
4381
|
const awayPct = total > 0 ? row.awayNum / total * 75 : 0;
|
|
4299
4382
|
const promoted = isPromoted(row, promotedPins);
|
|
4300
|
-
const selection = chipSelection(row, match.matchId, slip.conversationId);
|
|
4301
|
-
return /* @__PURE__ */ (0,
|
|
4302
|
-
/* @__PURE__ */ (0,
|
|
4303
|
-
/* @__PURE__ */ (0,
|
|
4304
|
-
/* @__PURE__ */ (0,
|
|
4305
|
-
/* @__PURE__ */ (0,
|
|
4383
|
+
const selection = chipSelection(row.market, match.matchId, slip.conversationId);
|
|
4384
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: promoted ? "ss-w-mon-stat ss-w-mon-pstrip" : "ss-w-mon-stat", children: [
|
|
4385
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "ss-w-mon-stat-row", children: [
|
|
4386
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--home", children: row.homeValue }),
|
|
4387
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-stat-l", children: row.label }),
|
|
4388
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--away", children: row.awayValue })
|
|
4306
4389
|
] }),
|
|
4307
|
-
/* @__PURE__ */ (0,
|
|
4308
|
-
/* @__PURE__ */ (0,
|
|
4309
|
-
/* @__PURE__ */ (0,
|
|
4390
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "ss-w-mon-bar", children: [
|
|
4391
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("b", { className: "ss-w-mon-bar-home", style: { width: `${homePct}%` } }),
|
|
4392
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("i", { className: "ss-w-mon-bar-away", style: { width: `${awayPct}%` } })
|
|
4310
4393
|
] }),
|
|
4311
|
-
row.market && !row.market.isSuspended && /* @__PURE__ */ (0,
|
|
4312
|
-
/* @__PURE__ */ (0,
|
|
4394
|
+
row.market && !row.market.isSuspended && /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: promoted ? "ss-w-mon-stat-mkt ss-w-mon-mkt" : "ss-w-mon-stat-mkt", children: [
|
|
4395
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { children: [
|
|
4313
4396
|
row.market.marketLabel,
|
|
4314
4397
|
" \xB7 ",
|
|
4315
4398
|
row.market.selectionLabel
|
|
4316
4399
|
] }),
|
|
4317
|
-
/* @__PURE__ */ (0,
|
|
4318
|
-
typeof row.market.price === "number" && /* @__PURE__ */ (0,
|
|
4319
|
-
/* @__PURE__ */ (0,
|
|
4400
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "ss-w-mon-stat-mkt-right", children: [
|
|
4401
|
+
typeof row.market.price === "number" && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-price", children: row.market.price.toFixed(2) }),
|
|
4402
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
4320
4403
|
SlipButton,
|
|
4321
4404
|
{
|
|
4322
4405
|
selection,
|
|
@@ -4331,23 +4414,23 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
4331
4414
|
] })
|
|
4332
4415
|
] }, row.label);
|
|
4333
4416
|
}) }),
|
|
4334
|
-
match.status === "stale" && /* @__PURE__ */ (0,
|
|
4335
|
-
match.momentum.length > 0 && /* @__PURE__ */ (0,
|
|
4336
|
-
/* @__PURE__ */ (0,
|
|
4337
|
-
/* @__PURE__ */ (0,
|
|
4417
|
+
match.status === "stale" && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-asof", children: ui.asOf(formatTime(match.asOfUtc)) }),
|
|
4418
|
+
match.momentum.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "ss-w-mon-mom", children: [
|
|
4419
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "ss-w-mon-stat-l", children: ui.momentumLabel }),
|
|
4420
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(MomentumWave, { points: match.momentum, clubIsHome: true })
|
|
4338
4421
|
] }),
|
|
4339
|
-
match.phase === "fullTime" && /* @__PURE__ */ (0,
|
|
4422
|
+
match.phase === "fullTime" && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "ss-w-mon-grace", children: ui.graceNote })
|
|
4340
4423
|
] });
|
|
4341
4424
|
}
|
|
4342
4425
|
|
|
4343
4426
|
// src/components/MonitorTabs.tsx
|
|
4344
|
-
var
|
|
4427
|
+
var import_jsx_runtime49 = require("react/jsx-runtime");
|
|
4345
4428
|
function OddsLiveStrip({ m, ui }) {
|
|
4346
4429
|
const showScore = m.phase !== "preMatch" && typeof m.homeScore === "number";
|
|
4347
4430
|
const stale = m.status === "stale";
|
|
4348
4431
|
if (!showScore && !m.minuteLabel && !(m.isSuspended && !m.isSettled) && !m.isSettled && !stale) return null;
|
|
4349
|
-
return /* @__PURE__ */ (0,
|
|
4350
|
-
showScore && /* @__PURE__ */ (0,
|
|
4432
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "ss-w-mk-live", children: [
|
|
4433
|
+
showScore && /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("b", { className: "ss-w-mk-live-score", children: [
|
|
4351
4434
|
m.homeTeamName,
|
|
4352
4435
|
" ",
|
|
4353
4436
|
m.homeScore,
|
|
@@ -4356,27 +4439,28 @@ function OddsLiveStrip({ m, ui }) {
|
|
|
4356
4439
|
" ",
|
|
4357
4440
|
m.awayTeamName
|
|
4358
4441
|
] }),
|
|
4359
|
-
m.minuteLabel && /* @__PURE__ */ (0,
|
|
4360
|
-
m.isSuspended && !m.isSettled && /* @__PURE__ */ (0,
|
|
4361
|
-
m.isSettled && /* @__PURE__ */ (0,
|
|
4362
|
-
stale && /* @__PURE__ */ (0,
|
|
4442
|
+
m.minuteLabel && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "ss-w-mon-min", children: m.minuteLabel }),
|
|
4443
|
+
m.isSuspended && !m.isSettled && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "ss-w-mon-susp", children: ui.suspendedLabel }),
|
|
4444
|
+
m.isSettled && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
|
|
4445
|
+
stale && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "ss-w-mon-asof", children: ui.asOf(new Date(m.asOfUtc).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" })) })
|
|
4363
4446
|
] });
|
|
4364
4447
|
}
|
|
4365
|
-
function MatchesPanel({ monitor, ui, slip }) {
|
|
4448
|
+
function MatchesPanel({ monitor, ui, slip, onAsk }) {
|
|
4366
4449
|
const matches = (monitor.snapshot?.matches ?? []).filter((m) => monitor.pins.some((p) => p.kind === "match" && p.matchId === m.matchId));
|
|
4367
|
-
if (matches.length === 0) return /* @__PURE__ */ (0,
|
|
4368
|
-
return /* @__PURE__ */ (0,
|
|
4369
|
-
/* @__PURE__ */ (0,
|
|
4450
|
+
if (matches.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "ss-w-mon-empty", children: ui.emptyMatchesTab });
|
|
4451
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "ss-w-mon-list", children: matches.map((m) => /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "ss-w-mon-item", children: [
|
|
4452
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
4370
4453
|
MonitorMatchCard,
|
|
4371
4454
|
{
|
|
4372
4455
|
match: m,
|
|
4373
4456
|
promotedPins: monitor.pins.filter((p) => p.kind !== "match" && p.matchId === m.matchId),
|
|
4374
4457
|
monitor,
|
|
4375
4458
|
ui,
|
|
4376
|
-
slip
|
|
4459
|
+
slip,
|
|
4460
|
+
onAsk
|
|
4377
4461
|
}
|
|
4378
4462
|
),
|
|
4379
|
-
/* @__PURE__ */ (0,
|
|
4463
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(MarketAccordion, { match: m, monitor, ui, slip })
|
|
4380
4464
|
] }, m.matchId)) });
|
|
4381
4465
|
}
|
|
4382
4466
|
function withSinceViewMovement(vm, prev) {
|
|
@@ -4391,12 +4475,12 @@ function withSinceViewMovement(vm, prev) {
|
|
|
4391
4475
|
}
|
|
4392
4476
|
function OddsPanel({ monitor, ui, slip }) {
|
|
4393
4477
|
const markets = (monitor.snapshot?.markets ?? []).filter((m) => monitor.pins.some((p) => p.key === m.key));
|
|
4394
|
-
if (markets.length === 0) return /* @__PURE__ */ (0,
|
|
4395
|
-
return /* @__PURE__ */ (0,
|
|
4478
|
+
if (markets.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "ss-w-mon-empty", children: ui.emptyOddsTab });
|
|
4479
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "ss-w-mon-list", children: markets.map((m) => {
|
|
4396
4480
|
const pin = monitor.pins.find((p) => p.key === m.key);
|
|
4397
|
-
return /* @__PURE__ */ (0,
|
|
4398
|
-
/* @__PURE__ */ (0,
|
|
4399
|
-
m.card && /* @__PURE__ */ (0,
|
|
4481
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "ss-w-mon-oddspin", "data-settled": m.isSettled || void 0, children: [
|
|
4482
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(OddsLiveStrip, { m, ui }),
|
|
4483
|
+
m.card && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
4400
4484
|
MarketOddsCardList,
|
|
4401
4485
|
{
|
|
4402
4486
|
cards: [withSinceViewMovement(toMarketOddsVM(m.card), monitor.lastViewedPrices[m.key])],
|
|
@@ -4407,22 +4491,22 @@ function OddsPanel({ monitor, ui, slip }) {
|
|
|
4407
4491
|
inSlipIds: monitor.inSlip
|
|
4408
4492
|
}
|
|
4409
4493
|
),
|
|
4410
|
-
m.history && /* @__PURE__ */ (0,
|
|
4411
|
-
!m.card && !m.history && /* @__PURE__ */ (0,
|
|
4494
|
+
m.history && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(OddsMovementCardList, { cards: [toOddsMovementVM(m.history)], ui }),
|
|
4495
|
+
!m.card && !m.history && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "ss-w-mon-empty-card", children: ui.oddsUnavailable })
|
|
4412
4496
|
] }, m.key);
|
|
4413
4497
|
}) });
|
|
4414
4498
|
}
|
|
4415
4499
|
|
|
4416
4500
|
// src/components/FixtureRow.tsx
|
|
4417
|
-
var
|
|
4501
|
+
var import_jsx_runtime50 = require("react/jsx-runtime");
|
|
4418
4502
|
function kickoffLabel(kickoffUnix) {
|
|
4419
4503
|
const d = new Date(kickoffUnix * 1e3);
|
|
4420
4504
|
return `${`${d.getHours()}`.padStart(2, "0")}:${`${d.getMinutes()}`.padStart(2, "0")}`;
|
|
4421
4505
|
}
|
|
4422
4506
|
function Side({ name, crest, away = false }) {
|
|
4423
|
-
return /* @__PURE__ */ (0,
|
|
4424
|
-
crest ? /* @__PURE__ */ (0,
|
|
4425
|
-
/* @__PURE__ */ (0,
|
|
4507
|
+
return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("span", { className: away ? "ss-w-drow-side ss-w-drow-side--away" : "ss-w-drow-side", children: [
|
|
4508
|
+
crest ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("img", { className: "ss-w-drow-crest", src: crest, alt: "" }) : null,
|
|
4509
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { className: "ss-w-drow-nm", children: name })
|
|
4426
4510
|
] });
|
|
4427
4511
|
}
|
|
4428
4512
|
function FixtureRow({ match, state, stale, ui, monitor }) {
|
|
@@ -4430,45 +4514,45 @@ function FixtureRow({ match, state, stale, ui, monitor }) {
|
|
|
4430
4514
|
const hasScore = (state?.phase === "live" || state?.phase === "fullTime") && typeof state.homeScore === "number" && typeof state.awayScore === "number";
|
|
4431
4515
|
const ticked = state?.phase === "live" ? state.minuteLabel ?? null : null;
|
|
4432
4516
|
const when = state?.isHalfTime && !stale ? ui.halfTime : isLive ? ticked ?? "\u2014" : state?.phase === "live" ? "\u2014" : kickoffLabel(match.kickoffUnix);
|
|
4433
|
-
return /* @__PURE__ */ (0,
|
|
4434
|
-
/* @__PURE__ */ (0,
|
|
4435
|
-
/* @__PURE__ */ (0,
|
|
4436
|
-
/* @__PURE__ */ (0,
|
|
4437
|
-
/* @__PURE__ */ (0,
|
|
4438
|
-
/* @__PURE__ */ (0,
|
|
4517
|
+
return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("div", { className: isLive || state?.isHalfTime ? "ss-w-drow ss-w-drow--live" : "ss-w-drow", children: [
|
|
4518
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { className: isLive || state?.isHalfTime ? "ss-w-drow-when ss-w-drow-when--live" : "ss-w-drow-when", children: when }),
|
|
4519
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("span", { className: "ss-w-drow-fx", children: [
|
|
4520
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Side, { name: match.homeTeamName, crest: match.homeTeamImagePath }),
|
|
4521
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { className: hasScore ? "ss-w-drow-sc" : "ss-w-drow-sc ss-w-drow-sc--idle", children: hasScore ? `${state.homeScore}\u2013${state.awayScore}` : "\u2013" }),
|
|
4522
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Side, { name: match.awayTeamName, crest: match.awayTeamImagePath, away: true })
|
|
4439
4523
|
] }),
|
|
4440
|
-
/* @__PURE__ */ (0,
|
|
4524
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)(PinToggle, { ui, monitor, pin: { kind: "match", matchId: match.matchId } })
|
|
4441
4525
|
] });
|
|
4442
4526
|
}
|
|
4443
4527
|
|
|
4444
4528
|
// src/components/CompetitionGroup.tsx
|
|
4445
|
-
var
|
|
4529
|
+
var import_jsx_runtime51 = require("react/jsx-runtime");
|
|
4446
4530
|
function CompetitionGroup({ group, open, onToggle, states, stale, ui, monitor, disambiguate = false }) {
|
|
4447
4531
|
const own = group.matches.filter((m) => !isTreatedLive(states[m.matchId], stale));
|
|
4448
4532
|
const hasLive = own.length !== group.matches.length;
|
|
4449
4533
|
if (own.length === 0) {
|
|
4450
4534
|
return null;
|
|
4451
4535
|
}
|
|
4452
|
-
return /* @__PURE__ */ (0,
|
|
4453
|
-
/* @__PURE__ */ (0,
|
|
4454
|
-
/* @__PURE__ */ (0,
|
|
4455
|
-
hasLive && /* @__PURE__ */ (0,
|
|
4456
|
-
/* @__PURE__ */ (0,
|
|
4536
|
+
return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "ss-w-grp", children: [
|
|
4537
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("button", { type: "button", className: "ss-w-grp-head", "aria-expanded": open, onClick: onToggle, children: [
|
|
4538
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)("span", { className: "ss-w-grp-chev", children: open ? "\u25BE" : "\u25B8" }),
|
|
4539
|
+
hasLive && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("span", { className: "ss-w-sec-dot", "aria-hidden": "true" }),
|
|
4540
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("span", { className: "ss-w-grp-name", children: [
|
|
4457
4541
|
group.competitionName,
|
|
4458
|
-
disambiguate && group.competitionCountry ? /* @__PURE__ */ (0,
|
|
4542
|
+
disambiguate && group.competitionCountry ? /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("span", { className: "ss-w-grp-country", children: [
|
|
4459
4543
|
" (",
|
|
4460
4544
|
group.competitionCountry,
|
|
4461
4545
|
")"
|
|
4462
4546
|
] }) : null
|
|
4463
4547
|
] }),
|
|
4464
|
-
/* @__PURE__ */ (0,
|
|
4548
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)("span", { className: "ss-w-grp-count", children: own.length })
|
|
4465
4549
|
] }),
|
|
4466
|
-
open && /* @__PURE__ */ (0,
|
|
4550
|
+
open && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "ss-w-grp-body", children: own.map((m) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(FixtureRow, { match: m, state: states[m.matchId], stale, ui, monitor }, m.matchId)) })
|
|
4467
4551
|
] });
|
|
4468
4552
|
}
|
|
4469
4553
|
|
|
4470
4554
|
// src/components/TodayPanel.tsx
|
|
4471
|
-
var
|
|
4555
|
+
var import_jsx_runtime52 = require("react/jsx-runtime");
|
|
4472
4556
|
function TodayPanel({ discovery, ui, monitor }) {
|
|
4473
4557
|
const { groups, states, stale, expanded, toggleGroup } = discovery;
|
|
4474
4558
|
const visibleGroups = visibleGroupsOf(groups, states);
|
|
@@ -4477,14 +4561,14 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
4477
4561
|
acc[g.competitionName] = (acc[g.competitionName] ?? 0) + 1;
|
|
4478
4562
|
return acc;
|
|
4479
4563
|
}, {});
|
|
4480
|
-
return /* @__PURE__ */ (0,
|
|
4481
|
-
stale && /* @__PURE__ */ (0,
|
|
4482
|
-
liveRows.length > 0 && /* @__PURE__ */ (0,
|
|
4483
|
-
/* @__PURE__ */ (0,
|
|
4484
|
-
/* @__PURE__ */ (0,
|
|
4564
|
+
return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { className: "ss-w-mon-list", children: [
|
|
4565
|
+
stale && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "ss-w-stale", children: ui.staleStates }),
|
|
4566
|
+
liveRows.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_jsx_runtime52.Fragment, { children: [
|
|
4567
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { className: "ss-w-sec-head", children: [
|
|
4568
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)("span", { className: "ss-w-sec-dot", "aria-hidden": "true" }),
|
|
4485
4569
|
ui.sectionLive
|
|
4486
4570
|
] }),
|
|
4487
|
-
/* @__PURE__ */ (0,
|
|
4571
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "ss-w-today-live", children: liveRows.map(({ match }) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
4488
4572
|
FixtureRow,
|
|
4489
4573
|
{
|
|
4490
4574
|
match,
|
|
@@ -4496,7 +4580,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
4496
4580
|
match.matchId
|
|
4497
4581
|
)) })
|
|
4498
4582
|
] }),
|
|
4499
|
-
visibleGroups.map((group) => /* @__PURE__ */ (0,
|
|
4583
|
+
visibleGroups.map((group) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
4500
4584
|
CompetitionGroup,
|
|
4501
4585
|
{
|
|
4502
4586
|
group,
|
|
@@ -4514,16 +4598,16 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
4514
4598
|
}
|
|
4515
4599
|
|
|
4516
4600
|
// src/components/GamesPanel.tsx
|
|
4517
|
-
var
|
|
4601
|
+
var import_react43 = require("react");
|
|
4518
4602
|
|
|
4519
4603
|
// src/components/GamesLoginWall.tsx
|
|
4520
|
-
var
|
|
4604
|
+
var import_jsx_runtime53 = require("react/jsx-runtime");
|
|
4521
4605
|
function GamesLoginWall({ ui }) {
|
|
4522
|
-
return /* @__PURE__ */ (0,
|
|
4606
|
+
return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { className: "ss-w-games-wall", children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("p", { children: ui.gamesLoginRequired }) }) });
|
|
4523
4607
|
}
|
|
4524
4608
|
|
|
4525
4609
|
// src/components/GamesHub.tsx
|
|
4526
|
-
var
|
|
4610
|
+
var import_react30 = require("react");
|
|
4527
4611
|
|
|
4528
4612
|
// src/components/games/ui/gameMeta.ts
|
|
4529
4613
|
function prettifyGameId(gameId) {
|
|
@@ -4539,75 +4623,75 @@ function splitName(full) {
|
|
|
4539
4623
|
}
|
|
4540
4624
|
|
|
4541
4625
|
// src/components/GameTileArt.tsx
|
|
4542
|
-
var
|
|
4626
|
+
var import_jsx_runtime54 = require("react/jsx-runtime");
|
|
4543
4627
|
function GameTileArt({ gameId }) {
|
|
4544
|
-
return /* @__PURE__ */ (0,
|
|
4628
|
+
return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("svg", { className: "ss-g-art", viewBox: "0 0 120 74", "aria-hidden": "true", children: ART[gameId] ?? ART.default });
|
|
4545
4629
|
}
|
|
4546
|
-
var head = (cx, cy, r, cls = "ss-g-art-fg") => /* @__PURE__ */ (0,
|
|
4547
|
-
/* @__PURE__ */ (0,
|
|
4548
|
-
/* @__PURE__ */ (0,
|
|
4630
|
+
var head = (cx, cy, r, cls = "ss-g-art-fg") => /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("g", { className: cls, children: [
|
|
4631
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("circle", { cx, cy: cy - r * 0.3, r: r * 0.45 }),
|
|
4632
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { d: `M${cx - r} ${cy + r}c0-${r * 0.8} ${r * 0.45}-${r * 1.1} ${r}-${r * 1.1}s${r} ${r * 0.3} ${r} ${r * 1.1}z` })
|
|
4549
4633
|
] });
|
|
4550
4634
|
var ART = {
|
|
4551
|
-
"mystery-tiger": /* @__PURE__ */ (0,
|
|
4635
|
+
"mystery-tiger": /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_jsx_runtime54.Fragment, { children: [
|
|
4552
4636
|
head(60, 38, 26, "ss-g-art-fg"),
|
|
4553
|
-
/* @__PURE__ */ (0,
|
|
4637
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("text", { x: "60", y: "36", className: "ss-g-art-q", textAnchor: "middle", children: "?" })
|
|
4554
4638
|
] }),
|
|
4555
|
-
"higher-or-lower": /* @__PURE__ */ (0,
|
|
4639
|
+
"higher-or-lower": /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_jsx_runtime54.Fragment, { children: [
|
|
4556
4640
|
head(32, 38, 20),
|
|
4557
4641
|
head(88, 38, 20),
|
|
4558
|
-
/* @__PURE__ */ (0,
|
|
4559
|
-
/* @__PURE__ */ (0,
|
|
4642
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("circle", { cx: "60", cy: "37", r: "11", className: "ss-g-art-accent" }),
|
|
4643
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { d: "M57 33l3-3 3 3M57 41l3 3 3-3", className: "ss-g-art-ink" })
|
|
4560
4644
|
] }),
|
|
4561
|
-
"guess-the-xi": /* @__PURE__ */ (0,
|
|
4562
|
-
/* @__PURE__ */ (0,
|
|
4563
|
-
[[60, 60, "a"], [24, 46], [48, 46], [72, 46], [96, 46], [36, 30], [60, 30], [84, 30], [40, 14], [60, 14], [80, 14]].map(([x, y, a], i) => /* @__PURE__ */ (0,
|
|
4645
|
+
"guess-the-xi": /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_jsx_runtime54.Fragment, { children: [
|
|
4646
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("rect", { x: "8", y: "4", width: "104", height: "66", rx: "6", className: "ss-g-art-pitch" }),
|
|
4647
|
+
[[60, 60, "a"], [24, 46], [48, 46], [72, 46], [96, 46], [36, 30], [60, 30], [84, 30], [40, 14], [60, 14], [80, 14]].map(([x, y, a], i) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("circle", { cx: x, cy: y, r: "4", className: a ? "ss-g-art-accent" : "ss-g-art-dot" }, i))
|
|
4564
4648
|
] }),
|
|
4565
|
-
"daily-quiz": /* @__PURE__ */ (0,
|
|
4566
|
-
"career-path": /* @__PURE__ */ (0,
|
|
4567
|
-
/* @__PURE__ */ (0,
|
|
4568
|
-
/* @__PURE__ */ (0,
|
|
4569
|
-
/* @__PURE__ */ (0,
|
|
4570
|
-
/* @__PURE__ */ (0,
|
|
4571
|
-
/* @__PURE__ */ (0,
|
|
4649
|
+
"daily-quiz": /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_jsx_runtime54.Fragment, { children: [[14, 8], [62, 8], [14, 40], [62, 40]].map(([x, y], i) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("rect", { x, y, width: "44", height: "26", rx: "5", className: i === 1 ? "ss-g-art-correct" : "ss-g-art-block" }, i)) }),
|
|
4650
|
+
"career-path": /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_jsx_runtime54.Fragment, { children: [
|
|
4651
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { d: "M18 22h24v10c0 7-5 11-12 13-7-2-12-6-12-13z", className: "ss-g-art-fg" }),
|
|
4652
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { d: "M48 37h8M84 37h8", className: "ss-g-art-line" }),
|
|
4653
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { d: "M60 22h24v10c0 7-5 11-12 13-7-2-12-6-12-13z", className: "ss-g-art-fg" }),
|
|
4654
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("rect", { x: "96", y: "22", width: "18", height: "26", rx: "4", className: "ss-g-art-dash" }),
|
|
4655
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("text", { x: "105", y: "40", className: "ss-g-art-q", textAnchor: "middle", children: "?" })
|
|
4572
4656
|
] }),
|
|
4573
|
-
"beat-the-grid": /* @__PURE__ */ (0,
|
|
4574
|
-
"matchday-predictor": /* @__PURE__ */ (0,
|
|
4575
|
-
/* @__PURE__ */ (0,
|
|
4576
|
-
/* @__PURE__ */ (0,
|
|
4577
|
-
/* @__PURE__ */ (0,
|
|
4578
|
-
/* @__PURE__ */ (0,
|
|
4657
|
+
"beat-the-grid": /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_jsx_runtime54.Fragment, { children: [0, 1, 2].flatMap((r) => [0, 1, 2].map((c) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("rect", { x: 33 + c * 19, y: 10 + r * 19, width: "16", height: "16", rx: "3", className: (r + c) % 3 === 0 ? "ss-g-art-accent" : "ss-g-art-block" }, `${r}${c}`))) }),
|
|
4658
|
+
"matchday-predictor": /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_jsx_runtime54.Fragment, { children: [
|
|
4659
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { d: "M10 20h20v9c0 6-4 9-10 11-6-2-10-5-10-11z", className: "ss-g-art-fg" }),
|
|
4660
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("rect", { x: "38", y: "22", width: "18", height: "24", rx: "4", className: "ss-g-art-accent-stroke" }),
|
|
4661
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("rect", { x: "64", y: "22", width: "18", height: "24", rx: "4", className: "ss-g-art-dash" }),
|
|
4662
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { d: "M90 20h20v9c0 6-4 9-10 11-6-2-10-5-10-11z", className: "ss-g-art-fg" })
|
|
4579
4663
|
] }),
|
|
4580
|
-
"starting-xi": /* @__PURE__ */ (0,
|
|
4581
|
-
/* @__PURE__ */ (0,
|
|
4582
|
-
[[60, 60], [30, 46], [50, 46], [70, 46], [90, 46], [45, 30], [75, 30], [30, 16], [60, 16], [90, 16]].map(([x, y], i) => /* @__PURE__ */ (0,
|
|
4664
|
+
"starting-xi": /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_jsx_runtime54.Fragment, { children: [
|
|
4665
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("rect", { x: "8", y: "4", width: "104", height: "66", rx: "6", className: "ss-g-art-pitch" }),
|
|
4666
|
+
[[60, 60], [30, 46], [50, 46], [70, 46], [90, 46], [45, 30], [75, 30], [30, 16], [60, 16], [90, 16]].map(([x, y], i) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("circle", { cx: x, cy: y, r: "5", className: i < 7 ? "ss-g-art-accent" : "ss-g-art-dash" }, i))
|
|
4583
4667
|
] }),
|
|
4584
|
-
"stat-ladder": /* @__PURE__ */ (0,
|
|
4585
|
-
"fan-motm": /* @__PURE__ */ (0,
|
|
4586
|
-
/* @__PURE__ */ (0,
|
|
4668
|
+
"stat-ladder": /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_jsx_runtime54.Fragment, { children: [[20, 70], [34, 52], [48, 34]].map(([y, w], i) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("rect", { x: "24", y, width: w, height: "12", rx: "3", className: i === 1 ? "ss-g-art-accent" : "ss-g-art-block" }, i)) }),
|
|
4669
|
+
"fan-motm": /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_jsx_runtime54.Fragment, { children: [
|
|
4670
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("circle", { cx: "60", cy: "37", r: "26", className: "ss-g-art-accent-stroke" }),
|
|
4587
4671
|
head(60, 40, 18),
|
|
4588
|
-
/* @__PURE__ */ (0,
|
|
4672
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { d: "M84 8l2.4 5 5.4.6-4 3.7 1.1 5.4-4.9-2.7-4.9 2.7 1.1-5.4-4-3.7 5.4-.6z", className: "ss-g-art-accent" })
|
|
4589
4673
|
] }),
|
|
4590
|
-
default: /* @__PURE__ */ (0,
|
|
4674
|
+
default: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("circle", { cx: "60", cy: "37", r: "22", className: "ss-g-art-fg" })
|
|
4591
4675
|
};
|
|
4592
4676
|
|
|
4593
4677
|
// src/components/games/ui/Chip.tsx
|
|
4594
|
-
var
|
|
4678
|
+
var import_jsx_runtime55 = require("react/jsx-runtime");
|
|
4595
4679
|
function Chip({ variant = "neutral", icon, children, className }) {
|
|
4596
|
-
return /* @__PURE__ */ (0,
|
|
4680
|
+
return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("span", { className: `ss-g-chip ss-g-chip--${variant}${className ? ` ${className}` : ""}`, children: [
|
|
4597
4681
|
icon,
|
|
4598
4682
|
children
|
|
4599
4683
|
] });
|
|
4600
4684
|
}
|
|
4601
4685
|
function StatStack({ value, label }) {
|
|
4602
|
-
return /* @__PURE__ */ (0,
|
|
4603
|
-
/* @__PURE__ */ (0,
|
|
4604
|
-
/* @__PURE__ */ (0,
|
|
4686
|
+
return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("span", { className: "ss-g-statstack", children: [
|
|
4687
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "ss-g-statstack-v", children: value }),
|
|
4688
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "ss-g-statstack-l", children: label })
|
|
4605
4689
|
] });
|
|
4606
4690
|
}
|
|
4607
4691
|
|
|
4608
4692
|
// src/components/games/ui/icons.tsx
|
|
4609
|
-
var
|
|
4610
|
-
var svg = (size, children, fill = false) => /* @__PURE__ */ (0,
|
|
4693
|
+
var import_jsx_runtime56 = require("react/jsx-runtime");
|
|
4694
|
+
var svg = (size, children, fill = false) => /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
|
|
4611
4695
|
"svg",
|
|
4612
4696
|
{
|
|
4613
4697
|
width: size,
|
|
@@ -4622,25 +4706,25 @@ var svg = (size, children, fill = false) => /* @__PURE__ */ (0, import_jsx_runti
|
|
|
4622
4706
|
children
|
|
4623
4707
|
}
|
|
4624
4708
|
);
|
|
4625
|
-
var IconChevronLeft = ({ size = 20 }) => svg(size, /* @__PURE__ */ (0,
|
|
4626
|
-
var IconLock = ({ size = 14 }) => svg(size, [/* @__PURE__ */ (0,
|
|
4627
|
-
var IconCheck = ({ size = 14 }) => svg(size, /* @__PURE__ */ (0,
|
|
4628
|
-
var IconClose = ({ size = 16 }) => svg(size, /* @__PURE__ */ (0,
|
|
4629
|
-
var IconSearch = ({ size = 18 }) => svg(size, [/* @__PURE__ */ (0,
|
|
4630
|
-
var IconPlus = ({ size = 20 }) => svg(size, /* @__PURE__ */ (0,
|
|
4631
|
-
var IconBulb = ({ size = 16 }) => svg(size, [/* @__PURE__ */ (0,
|
|
4632
|
-
var IconArrowUp = ({ size = 12 }) => svg(size, /* @__PURE__ */ (0,
|
|
4633
|
-
var IconArrowDown = ({ size = 12 }) => svg(size, /* @__PURE__ */ (0,
|
|
4634
|
-
var IconCalendar = ({ size = 18 }) => svg(size, [/* @__PURE__ */ (0,
|
|
4635
|
-
var IconShield = ({ size = 18 }) => svg(size, /* @__PURE__ */ (0,
|
|
4636
|
-
var IconFlag = ({ size = 18 }) => svg(size, /* @__PURE__ */ (0,
|
|
4637
|
-
var IconBall = ({ size = 18 }) => svg(size, [/* @__PURE__ */ (0,
|
|
4638
|
-
var IconBoot = ({ size = 18 }) => svg(size, /* @__PURE__ */ (0,
|
|
4639
|
-
var IconGloves = ({ size = 18 }) => svg(size, /* @__PURE__ */ (0,
|
|
4640
|
-
var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ (0,
|
|
4709
|
+
var IconChevronLeft = ({ size = 20 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M15 18l-6-6 6-6" }));
|
|
4710
|
+
var IconLock = ({ size = 14 }) => svg(size, [/* @__PURE__ */ (0, import_jsx_runtime56.jsx)("rect", { x: "5", y: "11", width: "14", height: "10", rx: "2" }, "a"), /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M8 11V7a4 4 0 0 1 8 0v4" }, "b")]);
|
|
4711
|
+
var IconCheck = ({ size = 14 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M5 12l5 5 9-10" }));
|
|
4712
|
+
var IconClose = ({ size = 16 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M6 6l12 12M18 6L6 18" }));
|
|
4713
|
+
var IconSearch = ({ size = 18 }) => svg(size, [/* @__PURE__ */ (0, import_jsx_runtime56.jsx)("circle", { cx: "11", cy: "11", r: "7" }, "a"), /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M20 20l-3.5-3.5" }, "b")]);
|
|
4714
|
+
var IconPlus = ({ size = 20 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M12 5v14M5 12h14" }));
|
|
4715
|
+
var IconBulb = ({ size = 16 }) => svg(size, [/* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M9 18h6M10 21h4" }, "a"), /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M12 3a6 6 0 0 0-3.5 10.9V16h7v-2.1A6 6 0 0 0 12 3z" }, "b")]);
|
|
4716
|
+
var IconArrowUp = ({ size = 12 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M12 19V5M5 12l7-7 7 7" }));
|
|
4717
|
+
var IconArrowDown = ({ size = 12 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M12 5v14M19 12l-7 7-7-7" }));
|
|
4718
|
+
var IconCalendar = ({ size = 18 }) => svg(size, [/* @__PURE__ */ (0, import_jsx_runtime56.jsx)("rect", { x: "4", y: "5", width: "16", height: "15", rx: "2" }, "a"), /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M4 10h16M9 3v4M15 3v4" }, "b")]);
|
|
4719
|
+
var IconShield = ({ size = 18 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M12 3l7 3v6c0 5-3 8-7 9-4-1-7-4-7-9V6z" }));
|
|
4720
|
+
var IconFlag = ({ size = 18 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M5 21V4M5 4h12l-2 4 2 4H5" }));
|
|
4721
|
+
var IconBall = ({ size = 18 }) => svg(size, [/* @__PURE__ */ (0, import_jsx_runtime56.jsx)("circle", { cx: "12", cy: "12", r: "9" }, "a"), /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M12 7l4 3-1.5 4.5h-5L8 10z" }, "b")]);
|
|
4722
|
+
var IconBoot = ({ size = 18 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M4 6h6l1 6 8 3v3H4z" }));
|
|
4723
|
+
var IconGloves = ({ size = 18 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M7 21v-8l-2-3V6a1.5 1.5 0 0 1 3 0v3V4a1.5 1.5 0 0 1 3 0v5V3.5a1.5 1.5 0 0 1 3 0V9V5a1.5 1.5 0 0 1 3 0v9l-2 3v4z" }));
|
|
4724
|
+
var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("path", { d: "M12 3c1 4 5 5 5 10a5 5 0 0 1-10 0c0-3 2-4 2-7 1.5 1 2 2 2 3 1-2 1-4 1-6z" }), true);
|
|
4641
4725
|
|
|
4642
4726
|
// src/components/GameTile.tsx
|
|
4643
|
-
var
|
|
4727
|
+
var import_jsx_runtime57 = require("react/jsx-runtime");
|
|
4644
4728
|
function tileStatus(game, ui) {
|
|
4645
4729
|
switch (game.status) {
|
|
4646
4730
|
case "locked":
|
|
@@ -4664,38 +4748,38 @@ function GameTile({ game, onOpen, ui, variant = "tile" }) {
|
|
|
4664
4748
|
const status = tileStatus(game, ui);
|
|
4665
4749
|
const disabled = DISABLED.has(game.status);
|
|
4666
4750
|
const title = gameTitle(game, ui.games.titles);
|
|
4667
|
-
const body = variant === "hero" ? /* @__PURE__ */ (0,
|
|
4668
|
-
/* @__PURE__ */ (0,
|
|
4669
|
-
/* @__PURE__ */ (0,
|
|
4670
|
-
status.tone === "new" && /* @__PURE__ */ (0,
|
|
4671
|
-
/* @__PURE__ */ (0,
|
|
4672
|
-
/* @__PURE__ */ (0,
|
|
4673
|
-
status.tone === "success" ? /* @__PURE__ */ (0,
|
|
4751
|
+
const body = variant === "hero" ? /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_jsx_runtime57.Fragment, { children: [
|
|
4752
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "ss-g-hero-text", children: [
|
|
4753
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-hero-eyebrow", children: ui.games.dailyChallenge }),
|
|
4754
|
+
status.tone === "new" && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(Chip, { variant: "badge", children: ui.games.newToday }),
|
|
4755
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-hero-title", children: title }),
|
|
4756
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-hero-sub", children: ui.games.taglines[game.gameId] ?? "" }),
|
|
4757
|
+
status.tone === "success" ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-tile-status", "data-tone": "success", children: status.text }) : /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "ss-g-hero-cta", children: [
|
|
4674
4758
|
status.tone === "accent" ? ui.games.resume : ui.games.playNow,
|
|
4675
4759
|
" \u2192"
|
|
4676
4760
|
] })
|
|
4677
4761
|
] }),
|
|
4678
|
-
/* @__PURE__ */ (0,
|
|
4679
|
-
] }) : variant === "wide" ? /* @__PURE__ */ (0,
|
|
4680
|
-
/* @__PURE__ */ (0,
|
|
4681
|
-
/* @__PURE__ */ (0,
|
|
4682
|
-
/* @__PURE__ */ (0,
|
|
4683
|
-
/* @__PURE__ */ (0,
|
|
4684
|
-
status.tone === "new" && /* @__PURE__ */ (0,
|
|
4762
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-hero-art", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(GameTileArt, { gameId: game.gameId }) })
|
|
4763
|
+
] }) : variant === "wide" ? /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_jsx_runtime57.Fragment, { children: [
|
|
4764
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-wide-art", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(GameTileArt, { gameId: game.gameId }) }),
|
|
4765
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "ss-g-wide-text", children: [
|
|
4766
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-tile-title", children: title }),
|
|
4767
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-tile-status", "data-tone": status.tone, children: status.text }),
|
|
4768
|
+
status.tone === "new" && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(Chip, { variant: "badge", children: ui.games.newToday })
|
|
4685
4769
|
] }),
|
|
4686
|
-
/* @__PURE__ */ (0,
|
|
4687
|
-
] }) : /* @__PURE__ */ (0,
|
|
4688
|
-
/* @__PURE__ */ (0,
|
|
4689
|
-
/* @__PURE__ */ (0,
|
|
4690
|
-
/* @__PURE__ */ (0,
|
|
4770
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-wide-chev", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(IconChevronLeft, { size: 18 }) })
|
|
4771
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_jsx_runtime57.Fragment, { children: [
|
|
4772
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-tile-art", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(GameTileArt, { gameId: game.gameId }) }),
|
|
4773
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-tile-title", children: title }),
|
|
4774
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-g-tile-status", "data-tone": status.tone, children: status.text })
|
|
4691
4775
|
] });
|
|
4692
4776
|
const cls = `ss-g-tile ss-g-tile--${variant}`;
|
|
4693
|
-
if (disabled) return /* @__PURE__ */ (0,
|
|
4694
|
-
return /* @__PURE__ */ (0,
|
|
4777
|
+
if (disabled) return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: cls, "data-disabled": true, "aria-disabled": "true", children: body });
|
|
4778
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("button", { type: "button", className: cls, "aria-label": `${title} \u2014 ${status.text}`, onClick: () => onOpen(game), children: body });
|
|
4695
4779
|
}
|
|
4696
4780
|
|
|
4697
4781
|
// src/components/GamesHub.tsx
|
|
4698
|
-
var
|
|
4782
|
+
var import_jsx_runtime58 = require("react/jsx-runtime");
|
|
4699
4783
|
var PLAYABLE = /* @__PURE__ */ new Set(["available", "in_progress"]);
|
|
4700
4784
|
var DONE = /* @__PURE__ */ new Set(["played", "graded"]);
|
|
4701
4785
|
function pickHeroGame(games) {
|
|
@@ -4708,8 +4792,8 @@ function pickHeroGame(games) {
|
|
|
4708
4792
|
}
|
|
4709
4793
|
var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
|
|
4710
4794
|
function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
4711
|
-
const [, setTick] = (0,
|
|
4712
|
-
(0,
|
|
4795
|
+
const [, setTick] = (0, import_react30.useState)(0);
|
|
4796
|
+
(0, import_react30.useEffect)(() => {
|
|
4713
4797
|
const id = setInterval(() => setTick((t) => t + 1), 6e4);
|
|
4714
4798
|
return () => clearInterval(id);
|
|
4715
4799
|
}, []);
|
|
@@ -4721,58 +4805,58 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
|
4721
4805
|
const kickoffs = fixtures.map((g) => g.kickoffUtc).filter((k) => !!k).sort();
|
|
4722
4806
|
const todayPts = games.filter((g) => DONE.has(g.status)).reduce((s, g) => s + (g.score ?? 0), 0);
|
|
4723
4807
|
const dash = "\u2014";
|
|
4724
|
-
return /* @__PURE__ */ (0,
|
|
4725
|
-
/* @__PURE__ */ (0,
|
|
4726
|
-
/* @__PURE__ */ (0,
|
|
4727
|
-
/* @__PURE__ */ (0,
|
|
4728
|
-
/* @__PURE__ */ (0,
|
|
4729
|
-
myWeeklyRow ? /* @__PURE__ */ (0,
|
|
4730
|
-
/* @__PURE__ */ (0,
|
|
4808
|
+
return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "ss-g-hub", children: [
|
|
4809
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "ss-g-stats", children: [
|
|
4810
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "ss-g-stat", children: [
|
|
4811
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { className: "ss-g-stat-l", children: ui.games.statStreak }),
|
|
4812
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("span", { className: "ss-g-stat-v", "data-testid": "stat-streak", children: [
|
|
4813
|
+
myWeeklyRow ? /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_jsx_runtime58.Fragment, { children: [
|
|
4814
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(IconFlame, {}),
|
|
4731
4815
|
myWeeklyRow.currentStreak
|
|
4732
4816
|
] }) : dash,
|
|
4733
|
-
myWeeklyRow && /* @__PURE__ */ (0,
|
|
4817
|
+
myWeeklyRow && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("small", { children: ui.games.unitDays })
|
|
4734
4818
|
] })
|
|
4735
4819
|
] }),
|
|
4736
|
-
/* @__PURE__ */ (0,
|
|
4737
|
-
/* @__PURE__ */ (0,
|
|
4738
|
-
/* @__PURE__ */ (0,
|
|
4820
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "ss-g-stat", children: [
|
|
4821
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { className: "ss-g-stat-l", children: ui.games.statToday }),
|
|
4822
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("span", { className: "ss-g-stat-v ss-g-stat-v--accent", "data-testid": "stat-today", children: [
|
|
4739
4823
|
ui.games.formatPts(todayPts),
|
|
4740
|
-
/* @__PURE__ */ (0,
|
|
4824
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("small", { children: ui.games.unitPts })
|
|
4741
4825
|
] })
|
|
4742
4826
|
] }),
|
|
4743
|
-
/* @__PURE__ */ (0,
|
|
4744
|
-
/* @__PURE__ */ (0,
|
|
4745
|
-
/* @__PURE__ */ (0,
|
|
4827
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "ss-g-stat", children: [
|
|
4828
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { className: "ss-g-stat-l", children: ui.games.statRank }),
|
|
4829
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("span", { className: "ss-g-stat-v", "data-testid": "stat-rank", children: [
|
|
4746
4830
|
myWeeklyRow ? `#${myWeeklyRow.rank}` : dash,
|
|
4747
|
-
myWeeklyRow && /* @__PURE__ */ (0,
|
|
4831
|
+
myWeeklyRow && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("small", { children: ui.games.thisWeek })
|
|
4748
4832
|
] })
|
|
4749
4833
|
] })
|
|
4750
4834
|
] }),
|
|
4751
|
-
weeklyPrize && /* @__PURE__ */ (0,
|
|
4752
|
-
hero && /* @__PURE__ */ (0,
|
|
4753
|
-
(grid.length > 0 || wide) && /* @__PURE__ */ (0,
|
|
4754
|
-
/* @__PURE__ */ (0,
|
|
4755
|
-
/* @__PURE__ */ (0,
|
|
4756
|
-
/* @__PURE__ */ (0,
|
|
4835
|
+
weeklyPrize && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Chip, { variant: "accent", className: "ss-g-prize", children: weeklyPrize }),
|
|
4836
|
+
hero && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(GameTile, { game: hero, onOpen, ui, variant: "hero" }),
|
|
4837
|
+
(grid.length > 0 || wide) && /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("section", { className: "ss-g-sec", children: [
|
|
4838
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "ss-g-sec-head", children: [
|
|
4839
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("h3", { children: ui.games.dailyGames }),
|
|
4840
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { children: ui.games.newSetAtMidnight })
|
|
4757
4841
|
] }),
|
|
4758
|
-
grid.length > 0 && /* @__PURE__ */ (0,
|
|
4759
|
-
wide && /* @__PURE__ */ (0,
|
|
4842
|
+
grid.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "ss-g-grid", children: grid.map((g) => /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(GameTile, { game: g, onOpen, ui }, tileKey(g))) }),
|
|
4843
|
+
wide && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(GameTile, { game: wide, onOpen, ui, variant: "wide" })
|
|
4760
4844
|
] }),
|
|
4761
|
-
fixtures.length > 0 && /* @__PURE__ */ (0,
|
|
4762
|
-
/* @__PURE__ */ (0,
|
|
4763
|
-
/* @__PURE__ */ (0,
|
|
4764
|
-
kickoffs[0] && /* @__PURE__ */ (0,
|
|
4845
|
+
fixtures.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("section", { className: "ss-g-sec", children: [
|
|
4846
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "ss-g-sec-head", children: [
|
|
4847
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("h3", { children: ui.games.matchdayGames }),
|
|
4848
|
+
kickoffs[0] && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { children: ui.games.kickoffAt(ui.games.formatDayTime(kickoffs[0])) })
|
|
4765
4849
|
] }),
|
|
4766
|
-
/* @__PURE__ */ (0,
|
|
4850
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "ss-g-grid", children: fixtures.map((g) => /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(GameTile, { game: g, onOpen, ui }, tileKey(g))) })
|
|
4767
4851
|
] })
|
|
4768
4852
|
] });
|
|
4769
4853
|
}
|
|
4770
4854
|
|
|
4771
4855
|
// src/components/GameScreenHost.tsx
|
|
4772
|
-
var
|
|
4856
|
+
var import_react42 = require("react");
|
|
4773
4857
|
|
|
4774
4858
|
// src/useGamePlay.ts
|
|
4775
|
-
var
|
|
4859
|
+
var import_react31 = require("react");
|
|
4776
4860
|
function toSubmitResult(payload) {
|
|
4777
4861
|
return {
|
|
4778
4862
|
// 'pending' means the play is recorded but awaiting resolution (fixture games)
|
|
@@ -4784,17 +4868,17 @@ function toSubmitResult(payload) {
|
|
|
4784
4868
|
};
|
|
4785
4869
|
}
|
|
4786
4870
|
function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
|
|
4787
|
-
const [result, setResult] = (0,
|
|
4788
|
-
const [submitting, setSubmitting] = (0,
|
|
4789
|
-
const [rawStatus, setRawStatus] = (0,
|
|
4790
|
-
const inFlightRef = (0,
|
|
4791
|
-
const convRef = (0,
|
|
4871
|
+
const [result, setResult] = (0, import_react31.useState)(null);
|
|
4872
|
+
const [submitting, setSubmitting] = (0, import_react31.useState)(false);
|
|
4873
|
+
const [rawStatus, setRawStatus] = (0, import_react31.useState)(null);
|
|
4874
|
+
const inFlightRef = (0, import_react31.useRef)(false);
|
|
4875
|
+
const convRef = (0, import_react31.useRef)(conversation);
|
|
4792
4876
|
convRef.current = conversation;
|
|
4793
|
-
const optsRef = (0,
|
|
4877
|
+
const optsRef = (0, import_react31.useRef)({ gameId, gameDay, fixtureId, locale, refresh });
|
|
4794
4878
|
optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
|
|
4795
|
-
const resultRef = (0,
|
|
4879
|
+
const resultRef = (0, import_react31.useRef)(null);
|
|
4796
4880
|
resultRef.current = result;
|
|
4797
|
-
const refetch = (0,
|
|
4881
|
+
const refetch = (0, import_react31.useCallback)(async () => {
|
|
4798
4882
|
const conv = convRef.current;
|
|
4799
4883
|
if (!conv) return;
|
|
4800
4884
|
const opts = optsRef.current;
|
|
@@ -4810,7 +4894,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
4810
4894
|
} catch {
|
|
4811
4895
|
}
|
|
4812
4896
|
}, []);
|
|
4813
|
-
const submit = (0,
|
|
4897
|
+
const submit = (0, import_react31.useCallback)(async (answerJson) => {
|
|
4814
4898
|
const conv = convRef.current;
|
|
4815
4899
|
if (!conv || inFlightRef.current) return;
|
|
4816
4900
|
inFlightRef.current = true;
|
|
@@ -4837,14 +4921,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
4837
4921
|
setSubmitting(false);
|
|
4838
4922
|
}
|
|
4839
4923
|
}, [refetch]);
|
|
4840
|
-
const hydrate = (0,
|
|
4924
|
+
const hydrate = (0, import_react31.useCallback)(() => {
|
|
4841
4925
|
void refetch();
|
|
4842
4926
|
}, [refetch]);
|
|
4843
4927
|
return { result, submitting, submit, hydrate, rawStatus };
|
|
4844
4928
|
}
|
|
4845
4929
|
|
|
4846
4930
|
// src/components/games/MysteryTigerGame.tsx
|
|
4847
|
-
var
|
|
4931
|
+
var import_react33 = require("react");
|
|
4848
4932
|
|
|
4849
4933
|
// src/components/games/nationFlags.ts
|
|
4850
4934
|
var FLAGS = {
|
|
@@ -5055,8 +5139,8 @@ function isNationCode(flag) {
|
|
|
5055
5139
|
}
|
|
5056
5140
|
|
|
5057
5141
|
// src/components/games/PlayerAvatar.tsx
|
|
5058
|
-
var
|
|
5059
|
-
var
|
|
5142
|
+
var import_react32 = require("react");
|
|
5143
|
+
var import_jsx_runtime59 = require("react/jsx-runtime");
|
|
5060
5144
|
function initialsOf(name) {
|
|
5061
5145
|
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
5062
5146
|
const first = parts[0];
|
|
@@ -5073,41 +5157,41 @@ function PlayerAvatar({
|
|
|
5073
5157
|
imagePath,
|
|
5074
5158
|
className
|
|
5075
5159
|
}) {
|
|
5076
|
-
const [failed, setFailed] = (0,
|
|
5160
|
+
const [failed, setFailed] = (0, import_react32.useState)(false);
|
|
5077
5161
|
const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
|
|
5078
|
-
return /* @__PURE__ */ (0,
|
|
5162
|
+
return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
|
|
5079
5163
|
}
|
|
5080
5164
|
|
|
5081
5165
|
// src/components/games/ui/GameHeader.tsx
|
|
5082
|
-
var
|
|
5166
|
+
var import_jsx_runtime60 = require("react/jsx-runtime");
|
|
5083
5167
|
function GameHeader({ title, eyebrow, right, onBack, backLabel }) {
|
|
5084
|
-
return /* @__PURE__ */ (0,
|
|
5085
|
-
onBack && /* @__PURE__ */ (0,
|
|
5086
|
-
/* @__PURE__ */ (0,
|
|
5087
|
-
eyebrow && /* @__PURE__ */ (0,
|
|
5088
|
-
/* @__PURE__ */ (0,
|
|
5168
|
+
return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { className: "ss-g-head", children: [
|
|
5169
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("button", { type: "button", className: "ss-g-back", "aria-label": backLabel, onClick: onBack, children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(IconChevronLeft, {}) }),
|
|
5170
|
+
/* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { className: "ss-g-head-text", children: [
|
|
5171
|
+
eyebrow && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("span", { className: "ss-g-eyebrow", children: eyebrow }),
|
|
5172
|
+
/* @__PURE__ */ (0, import_jsx_runtime60.jsx)("h2", { className: "ss-g-title", children: title })
|
|
5089
5173
|
] }),
|
|
5090
|
-
right && /* @__PURE__ */ (0,
|
|
5174
|
+
right && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: "ss-g-head-right", children: right })
|
|
5091
5175
|
] });
|
|
5092
5176
|
}
|
|
5093
5177
|
|
|
5094
5178
|
// src/components/games/ui/SegmentProgress.tsx
|
|
5095
|
-
var
|
|
5179
|
+
var import_jsx_runtime61 = require("react/jsx-runtime");
|
|
5096
5180
|
function SegmentProgress({ segments, ariaLabel, leftLabel, rightLabel, right }) {
|
|
5097
|
-
return /* @__PURE__ */ (0,
|
|
5098
|
-
/* @__PURE__ */ (0,
|
|
5099
|
-
(leftLabel || rightLabel) && /* @__PURE__ */ (0,
|
|
5100
|
-
/* @__PURE__ */ (0,
|
|
5101
|
-
/* @__PURE__ */ (0,
|
|
5181
|
+
return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)("div", { className: "ss-g-progress", children: [
|
|
5182
|
+
/* @__PURE__ */ (0, import_jsx_runtime61.jsxs)("div", { className: "ss-g-progress-main", children: [
|
|
5183
|
+
(leftLabel || rightLabel) && /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)("div", { className: "ss-g-progress-labels", children: [
|
|
5184
|
+
/* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", { children: leftLabel }),
|
|
5185
|
+
/* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", { className: "ss-g-progress-rl", children: rightLabel })
|
|
5102
5186
|
] }),
|
|
5103
|
-
/* @__PURE__ */ (0,
|
|
5187
|
+
/* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
|
|
5104
5188
|
"div",
|
|
5105
5189
|
{
|
|
5106
5190
|
className: "ss-g-segs",
|
|
5107
5191
|
role: "img",
|
|
5108
5192
|
"aria-label": ariaLabel,
|
|
5109
5193
|
style: { gridTemplateColumns: `repeat(${segments.length}, minmax(0, 1fr))` },
|
|
5110
|
-
children: segments.map((s, i) => /* @__PURE__ */ (0,
|
|
5194
|
+
children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", { className: "ss-g-seg", "data-state": s }, i))
|
|
5111
5195
|
}
|
|
5112
5196
|
)
|
|
5113
5197
|
] }),
|
|
@@ -5116,13 +5200,13 @@ function SegmentProgress({ segments, ariaLabel, leftLabel, rightLabel, right })
|
|
|
5116
5200
|
}
|
|
5117
5201
|
|
|
5118
5202
|
// src/components/games/ui/SearchField.tsx
|
|
5119
|
-
var
|
|
5203
|
+
var import_jsx_runtime62 = require("react/jsx-runtime");
|
|
5120
5204
|
function SearchField({ id, label, labelHidden = false, placeholder, value, onChange, disabled, inputRef, onKeyDown }) {
|
|
5121
|
-
return /* @__PURE__ */ (0,
|
|
5122
|
-
/* @__PURE__ */ (0,
|
|
5123
|
-
/* @__PURE__ */ (0,
|
|
5124
|
-
/* @__PURE__ */ (0,
|
|
5125
|
-
/* @__PURE__ */ (0,
|
|
5205
|
+
return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "ss-g-search", children: [
|
|
5206
|
+
/* @__PURE__ */ (0, import_jsx_runtime62.jsx)("label", { htmlFor: id, className: labelHidden ? "ss-g-sr" : "ss-g-search-label", children: label }),
|
|
5207
|
+
/* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "ss-g-search-box", children: [
|
|
5208
|
+
/* @__PURE__ */ (0, import_jsx_runtime62.jsx)(IconSearch, {}),
|
|
5209
|
+
/* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
|
|
5126
5210
|
"input",
|
|
5127
5211
|
{
|
|
5128
5212
|
id,
|
|
@@ -5141,52 +5225,52 @@ function SearchField({ id, label, labelHidden = false, placeholder, value, onCha
|
|
|
5141
5225
|
}
|
|
5142
5226
|
|
|
5143
5227
|
// src/components/games/ui/FooterBar.tsx
|
|
5144
|
-
var
|
|
5228
|
+
var import_jsx_runtime63 = require("react/jsx-runtime");
|
|
5145
5229
|
function FooterBar({ children }) {
|
|
5146
|
-
return /* @__PURE__ */ (0,
|
|
5230
|
+
return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "ss-g-footer", children });
|
|
5147
5231
|
}
|
|
5148
5232
|
|
|
5149
5233
|
// src/components/games/ui/Silhouette.tsx
|
|
5150
|
-
var
|
|
5234
|
+
var import_jsx_runtime64 = require("react/jsx-runtime");
|
|
5151
5235
|
function Silhouette({ size, variant = "default" }) {
|
|
5152
|
-
return /* @__PURE__ */ (0,
|
|
5153
|
-
/* @__PURE__ */ (0,
|
|
5154
|
-
/* @__PURE__ */ (0,
|
|
5155
|
-
/* @__PURE__ */ (0,
|
|
5236
|
+
return /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)("span", { className: `ss-g-sil ss-g-sil--${variant}`, style: { width: size, height: size }, "aria-hidden": "true", children: [
|
|
5237
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsxs)("svg", { width: size * 0.86, height: size * 0.86, viewBox: "0 0 100 100", children: [
|
|
5238
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsx)("circle", { cx: "50", cy: "40", r: "19", fill: "currentColor" }),
|
|
5239
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsx)("path", { d: "M12 100c0-23 17-38 38-38s38 15 38 38z", fill: "currentColor" })
|
|
5156
5240
|
] }),
|
|
5157
|
-
variant === "mystery" && /* @__PURE__ */ (0,
|
|
5241
|
+
variant === "mystery" && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("span", { className: "ss-g-sil-q", children: "?" })
|
|
5158
5242
|
] });
|
|
5159
5243
|
}
|
|
5160
5244
|
|
|
5161
5245
|
// src/components/games/ui/GameButton.tsx
|
|
5162
|
-
var
|
|
5246
|
+
var import_jsx_runtime65 = require("react/jsx-runtime");
|
|
5163
5247
|
function GameButton({ variant = "primary", block = false, className, type = "button", ...rest }) {
|
|
5164
5248
|
const cls = `ss-g-btn ss-g-btn--${variant}${block ? " ss-g-btn--block" : ""}${className ? ` ${className}` : ""}`;
|
|
5165
|
-
return /* @__PURE__ */ (0,
|
|
5249
|
+
return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("button", { type, className: cls, ...rest });
|
|
5166
5250
|
}
|
|
5167
5251
|
|
|
5168
5252
|
// src/components/games/ui/ResultCard.tsx
|
|
5169
|
-
var
|
|
5253
|
+
var import_jsx_runtime66 = require("react/jsx-runtime");
|
|
5170
5254
|
function ResultCard({ tone, title, score, detail, onBack, ui }) {
|
|
5171
|
-
return /* @__PURE__ */ (0,
|
|
5172
|
-
/* @__PURE__ */ (0,
|
|
5173
|
-
score !== void 0 && /* @__PURE__ */ (0,
|
|
5174
|
-
/* @__PURE__ */ (0,
|
|
5255
|
+
return /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: "ss-g-result", "data-tone": tone, role: "status", children: [
|
|
5256
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)("span", { className: "ss-g-result-title", children: title }),
|
|
5257
|
+
score !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("span", { className: "ss-g-result-score", children: [
|
|
5258
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)("span", { className: "ss-g-result-num", children: score }),
|
|
5175
5259
|
ui.games.unitPts
|
|
5176
5260
|
] }),
|
|
5177
|
-
detail && /* @__PURE__ */ (0,
|
|
5178
|
-
onBack && /* @__PURE__ */ (0,
|
|
5261
|
+
detail && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("span", { className: "ss-g-result-detail", children: detail }),
|
|
5262
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(GameButton, { variant: "outline", onClick: onBack, children: ui.games.backToGames })
|
|
5179
5263
|
] });
|
|
5180
5264
|
}
|
|
5181
5265
|
|
|
5182
5266
|
// src/components/games/ui/OptionList.tsx
|
|
5183
|
-
var
|
|
5267
|
+
var import_jsx_runtime67 = require("react/jsx-runtime");
|
|
5184
5268
|
function OptionList({ label, options, onPick }) {
|
|
5185
|
-
return /* @__PURE__ */ (0,
|
|
5269
|
+
return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className: "ss-g-opts", role: "listbox", "aria-label": label, children: options.map((o) => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("button", { type: "button", role: "option", "aria-selected": false, className: "ss-g-opt", onClick: () => onPick(o.key), children: o.content }, o.key)) });
|
|
5186
5270
|
}
|
|
5187
5271
|
|
|
5188
5272
|
// src/components/games/MysteryTigerGame.tsx
|
|
5189
|
-
var
|
|
5273
|
+
var import_jsx_runtime68 = require("react/jsx-runtime");
|
|
5190
5274
|
function parseClientState(json) {
|
|
5191
5275
|
if (!json) return null;
|
|
5192
5276
|
try {
|
|
@@ -5288,8 +5372,8 @@ function MysteryTigerGame({
|
|
|
5288
5372
|
onBack
|
|
5289
5373
|
}) {
|
|
5290
5374
|
const t = ui.games.mysteryTiger;
|
|
5291
|
-
const [query, setQuery] = (0,
|
|
5292
|
-
const inputId = (0,
|
|
5375
|
+
const [query, setQuery] = (0, import_react33.useState)("");
|
|
5376
|
+
const inputId = (0, import_react33.useId)();
|
|
5293
5377
|
const clientState = parseClientState(result?.clientStateJson);
|
|
5294
5378
|
const guessResults = clientState?.guessResults ?? [];
|
|
5295
5379
|
const alreadyGuessedIds = new Set(guessResults.map((g) => g.playerId));
|
|
@@ -5310,22 +5394,22 @@ function MysteryTigerGame({
|
|
|
5310
5394
|
setQuery("");
|
|
5311
5395
|
onSubmit(JSON.stringify({ guesses: newGuesses }));
|
|
5312
5396
|
}
|
|
5313
|
-
const headerRight = !config ? void 0 : isOver ? /* @__PURE__ */ (0,
|
|
5397
|
+
const headerRight = !config ? void 0 : isOver ? /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(Chip, { variant: "accent", children: [
|
|
5314
5398
|
score,
|
|
5315
5399
|
" ",
|
|
5316
5400
|
ui.games.unitPts
|
|
5317
|
-
] }) : /* @__PURE__ */ (0,
|
|
5401
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { "data-testid": "mt-chip", children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(Chip, { children: [
|
|
5318
5402
|
ui.games.guess,
|
|
5319
5403
|
" ",
|
|
5320
|
-
/* @__PURE__ */ (0,
|
|
5404
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "ss-g-num", children: guessesUsed + 1 }),
|
|
5321
5405
|
" / ",
|
|
5322
5406
|
totalGuesses
|
|
5323
5407
|
] }) });
|
|
5324
5408
|
const segments = Array.from({ length: totalGuesses }, (_, i) => i < guessesUsed ? "done" : i === guessesUsed ? "current" : "todo");
|
|
5325
5409
|
const cols = { gridTemplateColumns: `minmax(0, 1fr) repeat(${keys.length}, 42px)` };
|
|
5326
5410
|
const known = deriveKnownAttributes(guessResults, keys);
|
|
5327
|
-
return /* @__PURE__ */ (0,
|
|
5328
|
-
/* @__PURE__ */ (0,
|
|
5411
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "ss-g-screen ss-g-mt", "data-testid": "game-screen-mystery-tiger", children: [
|
|
5412
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
5329
5413
|
GameHeader,
|
|
5330
5414
|
{
|
|
5331
5415
|
title: gameTitle({ gameId: "mystery-tiger" }, ui.games.titles),
|
|
@@ -5335,40 +5419,40 @@ function MysteryTigerGame({
|
|
|
5335
5419
|
backLabel: ui.back
|
|
5336
5420
|
}
|
|
5337
5421
|
),
|
|
5338
|
-
!config && /* @__PURE__ */ (0,
|
|
5339
|
-
config && /* @__PURE__ */ (0,
|
|
5340
|
-
/* @__PURE__ */ (0,
|
|
5341
|
-
/* @__PURE__ */ (0,
|
|
5342
|
-
/* @__PURE__ */ (0,
|
|
5343
|
-
revealName ? /* @__PURE__ */ (0,
|
|
5344
|
-
revealName && /* @__PURE__ */ (0,
|
|
5422
|
+
!config && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
|
|
5423
|
+
config && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
|
|
5424
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "ss-g-body", children: [
|
|
5425
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: `ss-g-mt-card${isOver ? " ss-g-mt-card--reveal" : ""}`, children: [
|
|
5426
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "ss-g-mt-portrait", children: [
|
|
5427
|
+
revealName ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(PlayerAvatar, { className: "ss-g-mt-photo", name: revealName, imagePath: clientState?.revealedPlayerImagePath }) : /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(Silhouette, { size: 150, variant: "mystery" }),
|
|
5428
|
+
revealName && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "ss-g-mt-reveal-name", children: revealName })
|
|
5345
5429
|
] }),
|
|
5346
|
-
/* @__PURE__ */ (0,
|
|
5347
|
-
/* @__PURE__ */ (0,
|
|
5348
|
-
/* @__PURE__ */ (0,
|
|
5430
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "ss-g-mt-known", style: { gridTemplateColumns: `repeat(${keys.length}, minmax(0, 1fr))` }, children: known.map((k) => /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "ss-g-mt-known-cell", children: [
|
|
5431
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "ss-g-mt-lab", children: t.labels[k.key] }),
|
|
5432
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "ss-g-mt-known-v", "data-state": k.state, "data-testid": `known-${k.key}`, children: k.text })
|
|
5349
5433
|
] }, k.key)) })
|
|
5350
5434
|
] }),
|
|
5351
|
-
!isOver && /* @__PURE__ */ (0,
|
|
5352
|
-
guessResults.length > 0 && /* @__PURE__ */ (0,
|
|
5353
|
-
/* @__PURE__ */ (0,
|
|
5354
|
-
/* @__PURE__ */ (0,
|
|
5355
|
-
keys.map((k) => /* @__PURE__ */ (0,
|
|
5435
|
+
!isOver && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(SegmentProgress, { segments, ariaLabel: t.progress(guessesUsed, totalGuesses) }),
|
|
5436
|
+
guessResults.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "ss-g-mt-table", children: [
|
|
5437
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "ss-g-mt-thead", style: cols, children: [
|
|
5438
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { children: t.yourGuesses }),
|
|
5439
|
+
keys.map((k) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { children: t.labels[k] }, k))
|
|
5356
5440
|
] }),
|
|
5357
5441
|
guessResults.map((gr, i) => {
|
|
5358
5442
|
const name = config.squadPlayers.find((p) => p.id === gr.playerId)?.name ?? `#${gr.playerId}`;
|
|
5359
5443
|
const { first, last } = splitName(name);
|
|
5360
|
-
return /* @__PURE__ */ (0,
|
|
5361
|
-
/* @__PURE__ */ (0,
|
|
5362
|
-
/* @__PURE__ */ (0,
|
|
5363
|
-
/* @__PURE__ */ (0,
|
|
5364
|
-
first && /* @__PURE__ */ (0,
|
|
5365
|
-
/* @__PURE__ */ (0,
|
|
5444
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "ss-g-mt-row", style: cols, children: [
|
|
5445
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "ss-g-mt-who", children: [
|
|
5446
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(PlayerAvatar, { className: "ss-g-mt-av", name }),
|
|
5447
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("span", { className: "ss-g-mt-names", children: [
|
|
5448
|
+
first && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "ss-g-mt-first", children: first }),
|
|
5449
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "ss-g-mt-last", children: last })
|
|
5366
5450
|
] })
|
|
5367
5451
|
] }),
|
|
5368
5452
|
keys.map((key) => {
|
|
5369
5453
|
const v = gr[key];
|
|
5370
5454
|
const arrow = directionArrow(v);
|
|
5371
|
-
return /* @__PURE__ */ (0,
|
|
5455
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
5372
5456
|
"div",
|
|
5373
5457
|
{
|
|
5374
5458
|
className: "ss-g-mt-cell",
|
|
@@ -5376,8 +5460,8 @@ function MysteryTigerGame({
|
|
|
5376
5460
|
"data-verdict": v.verdict,
|
|
5377
5461
|
"aria-label": `${t.labels[key]}: ${v.value ?? v.verdict}${v.direction ? ` ${v.direction}` : ""}`,
|
|
5378
5462
|
children: [
|
|
5379
|
-
/* @__PURE__ */ (0,
|
|
5380
|
-
arrow && /* @__PURE__ */ (0,
|
|
5463
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "ss-g-mt-cell-v", "aria-hidden": "true", children: tileFace(key, v) }),
|
|
5464
|
+
arrow && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "ss-g-mt-cell-dir", "aria-hidden": "true", children: arrow })
|
|
5381
5465
|
]
|
|
5382
5466
|
},
|
|
5383
5467
|
key
|
|
@@ -5386,25 +5470,25 @@ function MysteryTigerGame({
|
|
|
5386
5470
|
] }, gr.playerId);
|
|
5387
5471
|
})
|
|
5388
5472
|
] }),
|
|
5389
|
-
!isOver && /* @__PURE__ */ (0,
|
|
5390
|
-
/* @__PURE__ */ (0,
|
|
5391
|
-
/* @__PURE__ */ (0,
|
|
5473
|
+
!isOver && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "ss-g-mt-legend", children: [
|
|
5474
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("span", { children: [
|
|
5475
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("i", { className: "ss-g-mt-sw", "data-verdict": "exact" }),
|
|
5392
5476
|
t.legendMatch
|
|
5393
5477
|
] }),
|
|
5394
|
-
/* @__PURE__ */ (0,
|
|
5395
|
-
/* @__PURE__ */ (0,
|
|
5478
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("span", { children: [
|
|
5479
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("i", { className: "ss-g-mt-sw", "data-verdict": "near" }),
|
|
5396
5480
|
t.legendClose
|
|
5397
5481
|
] }),
|
|
5398
|
-
/* @__PURE__ */ (0,
|
|
5482
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("span", { children: [
|
|
5399
5483
|
"\u25B2 ",
|
|
5400
5484
|
t.legendHigher
|
|
5401
5485
|
] })
|
|
5402
5486
|
] }),
|
|
5403
|
-
clientState?.hintLine && !isOver && /* @__PURE__ */ (0,
|
|
5404
|
-
/* @__PURE__ */ (0,
|
|
5405
|
-
/* @__PURE__ */ (0,
|
|
5487
|
+
clientState?.hintLine && !isOver && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "ss-g-mt-hint", children: [
|
|
5488
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(IconBulb, {}),
|
|
5489
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { children: clientState.hintLine })
|
|
5406
5490
|
] }),
|
|
5407
|
-
isOver && /* @__PURE__ */ (0,
|
|
5491
|
+
isOver && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
5408
5492
|
ResultCard,
|
|
5409
5493
|
{
|
|
5410
5494
|
tone: clientState?.solved ? "win" : clientState?.failed ? "lose" : "neutral",
|
|
@@ -5416,22 +5500,22 @@ function MysteryTigerGame({
|
|
|
5416
5500
|
}
|
|
5417
5501
|
)
|
|
5418
5502
|
] }),
|
|
5419
|
-
!isOver && /* @__PURE__ */ (0,
|
|
5420
|
-
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ (0,
|
|
5503
|
+
!isOver && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(FooterBar, { children: [
|
|
5504
|
+
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
5421
5505
|
OptionList,
|
|
5422
5506
|
{
|
|
5423
5507
|
label: t.optionsLabel,
|
|
5424
5508
|
options: filtered.map((p) => ({
|
|
5425
5509
|
key: p.id,
|
|
5426
|
-
content: /* @__PURE__ */ (0,
|
|
5427
|
-
/* @__PURE__ */ (0,
|
|
5428
|
-
/* @__PURE__ */ (0,
|
|
5510
|
+
content: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
|
|
5511
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(PlayerAvatar, { className: "ss-g-opt-av", name: p.name }),
|
|
5512
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { children: p.name })
|
|
5429
5513
|
] })
|
|
5430
5514
|
})),
|
|
5431
5515
|
onPick: (k) => handleSelect(Number(k))
|
|
5432
5516
|
}
|
|
5433
5517
|
),
|
|
5434
|
-
/* @__PURE__ */ (0,
|
|
5518
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
5435
5519
|
SearchField,
|
|
5436
5520
|
{
|
|
5437
5521
|
id: inputId,
|
|
@@ -5448,7 +5532,7 @@ function MysteryTigerGame({
|
|
|
5448
5532
|
}
|
|
5449
5533
|
|
|
5450
5534
|
// src/components/games/HigherOrLowerGame.tsx
|
|
5451
|
-
var
|
|
5535
|
+
var import_jsx_runtime69 = require("react/jsx-runtime");
|
|
5452
5536
|
var POINTS_PER_CORRECT = 10;
|
|
5453
5537
|
function parseClientState2(json) {
|
|
5454
5538
|
if (!json) return null;
|
|
@@ -5460,11 +5544,11 @@ function parseClientState2(json) {
|
|
|
5460
5544
|
}
|
|
5461
5545
|
function PlayerCard({ name, imagePath, highlight, children }) {
|
|
5462
5546
|
const { first, last } = splitName(name);
|
|
5463
|
-
return /* @__PURE__ */ (0,
|
|
5464
|
-
/* @__PURE__ */ (0,
|
|
5465
|
-
/* @__PURE__ */ (0,
|
|
5466
|
-
first && /* @__PURE__ */ (0,
|
|
5467
|
-
/* @__PURE__ */ (0,
|
|
5547
|
+
return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: `ss-g-hl-card${highlight ? " ss-g-hl-card--b" : ""}`, children: [
|
|
5548
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "ss-g-hl-photo-wrap", children: imagePath ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(PlayerAvatar, { className: "ss-g-hl-photo", name, imagePath }) : /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Silhouette, { size: 150 }) }),
|
|
5549
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ss-g-hl-info", children: [
|
|
5550
|
+
first && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ss-g-hl-first", children: first }),
|
|
5551
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ss-g-hl-surname", children: last }),
|
|
5468
5552
|
children
|
|
5469
5553
|
] })
|
|
5470
5554
|
] });
|
|
@@ -5496,47 +5580,47 @@ function HigherOrLowerGame({
|
|
|
5496
5580
|
const newAnswers = [...prevAnswers, { pairIndex: currentPair.pairIndex, pick }];
|
|
5497
5581
|
onSubmit(JSON.stringify({ answers: newAnswers }));
|
|
5498
5582
|
}
|
|
5499
|
-
return /* @__PURE__ */ (0,
|
|
5500
|
-
/* @__PURE__ */ (0,
|
|
5583
|
+
return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ss-g-screen ss-g-hl", "data-testid": "game-screen-higher-or-lower", children: [
|
|
5584
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
5501
5585
|
GameHeader,
|
|
5502
5586
|
{
|
|
5503
5587
|
title: gameTitle({ gameId: "higher-or-lower" }, ui.games.titles),
|
|
5504
5588
|
eyebrow: t.eyebrow(POINTS_PER_CORRECT),
|
|
5505
|
-
right: config ? /* @__PURE__ */ (0,
|
|
5589
|
+
right: config ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(StatStack, { value: runLength, label: t.streak }) : void 0,
|
|
5506
5590
|
onBack,
|
|
5507
5591
|
backLabel: ui.back
|
|
5508
5592
|
}
|
|
5509
5593
|
),
|
|
5510
|
-
!config && /* @__PURE__ */ (0,
|
|
5511
|
-
config && /* @__PURE__ */ (0,
|
|
5512
|
-
/* @__PURE__ */ (0,
|
|
5513
|
-
/* @__PURE__ */ (0,
|
|
5514
|
-
/* @__PURE__ */ (0,
|
|
5515
|
-
/* @__PURE__ */ (0,
|
|
5516
|
-
/* @__PURE__ */ (0,
|
|
5594
|
+
!config && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
|
|
5595
|
+
config && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_jsx_runtime69.Fragment, { children: [
|
|
5596
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ss-g-body", children: [
|
|
5597
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ss-g-hl-prompt", "data-testid": "hol-prompt", children: [
|
|
5598
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ss-g-hl-prompt-q", children: t.whoHadMore }),
|
|
5599
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ss-g-hl-prompt-stat", children: config.statLabel }),
|
|
5600
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ss-g-hl-prompt-season", children: t.season(config.seasonLabel) })
|
|
5517
5601
|
] }),
|
|
5518
|
-
currentPair && /* @__PURE__ */ (0,
|
|
5519
|
-
/* @__PURE__ */ (0,
|
|
5520
|
-
/* @__PURE__ */ (0,
|
|
5521
|
-
/* @__PURE__ */ (0,
|
|
5602
|
+
currentPair && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ss-g-hl-pair", children: [
|
|
5603
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(PlayerCard, { name: currentPair.playerAName, imagePath: currentPair.playerAImagePath, children: [
|
|
5604
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ss-g-hl-value", children: currentPair.playerAValue }),
|
|
5605
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ss-g-hl-stat", children: config.statLabel })
|
|
5522
5606
|
] }),
|
|
5523
|
-
/* @__PURE__ */ (0,
|
|
5524
|
-
/* @__PURE__ */ (0,
|
|
5525
|
-
/* @__PURE__ */ (0,
|
|
5526
|
-
/* @__PURE__ */ (0,
|
|
5607
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ss-g-hl-vs", "aria-hidden": "true", children: t.vs }),
|
|
5608
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(PlayerCard, { name: currentPair.playerBName, imagePath: currentPair.playerBImagePath, highlight: true, children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ss-g-hl-btns", children: [
|
|
5609
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(GameButton, { variant: "primary", disabled: submitting, onClick: () => handlePick("higher"), children: [
|
|
5610
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(IconArrowUp, { size: 16 }),
|
|
5527
5611
|
t.higher
|
|
5528
5612
|
] }),
|
|
5529
|
-
/* @__PURE__ */ (0,
|
|
5530
|
-
/* @__PURE__ */ (0,
|
|
5613
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(GameButton, { variant: "outline", disabled: submitting, onClick: () => handlePick("lower"), children: [
|
|
5614
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(IconArrowDown, { size: 16 }),
|
|
5531
5615
|
t.lower
|
|
5532
5616
|
] })
|
|
5533
5617
|
] }) })
|
|
5534
5618
|
] }),
|
|
5535
|
-
lastAnswer && lastAnswerPair && /* @__PURE__ */ (0,
|
|
5536
|
-
lastAnswer.wasCorrect ? /* @__PURE__ */ (0,
|
|
5619
|
+
lastAnswer && lastAnswerPair && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("p", { className: "ss-g-hl-feedback", "data-testid": "hol-last", "data-correct": lastAnswer.wasCorrect ? "true" : "false", children: [
|
|
5620
|
+
lastAnswer.wasCorrect ? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(IconCheck, {}) : /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(IconClose, {}),
|
|
5537
5621
|
t.lastAnswer(splitName(lastAnswerPair.playerBName).last, lastAnswer.playerBValue)
|
|
5538
5622
|
] }),
|
|
5539
|
-
isOver && /* @__PURE__ */ (0,
|
|
5623
|
+
isOver && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
5540
5624
|
ResultCard,
|
|
5541
5625
|
{
|
|
5542
5626
|
tone: runEndedWrong ? "lose" : allPairsAnswered ? "win" : "neutral",
|
|
@@ -5548,15 +5632,15 @@ function HigherOrLowerGame({
|
|
|
5548
5632
|
}
|
|
5549
5633
|
)
|
|
5550
5634
|
] }),
|
|
5551
|
-
!isOver && /* @__PURE__ */ (0,
|
|
5552
|
-
/* @__PURE__ */ (0,
|
|
5635
|
+
!isOver && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(FooterBar, { children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ss-g-hl-foot", children: [
|
|
5636
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "ss-g-hl-dots", role: "img", "aria-label": t.answersSoFar(answeredCount, config.pairs.length), children: config.pairs.map((p, i) => {
|
|
5553
5637
|
const a = answeredPairs[i];
|
|
5554
|
-
return /* @__PURE__ */ (0,
|
|
5638
|
+
return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ss-g-hl-dot", "data-state": a ? a.wasCorrect ? "correct" : "wrong" : "todo" }, p.pairIndex);
|
|
5555
5639
|
}) }),
|
|
5556
|
-
/* @__PURE__ */ (0,
|
|
5557
|
-
/* @__PURE__ */ (0,
|
|
5640
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("span", { className: "ss-g-hl-pts", children: [
|
|
5641
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { "data-testid": "hol-score", children: score }),
|
|
5558
5642
|
" ",
|
|
5559
|
-
/* @__PURE__ */ (0,
|
|
5643
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ss-g-hl-pts-unit", children: ui.games.unitPts })
|
|
5560
5644
|
] })
|
|
5561
5645
|
] }) })
|
|
5562
5646
|
] })
|
|
@@ -5564,21 +5648,21 @@ function HigherOrLowerGame({
|
|
|
5564
5648
|
}
|
|
5565
5649
|
|
|
5566
5650
|
// src/components/games/CareerPathGame.tsx
|
|
5567
|
-
var
|
|
5651
|
+
var import_react35 = require("react");
|
|
5568
5652
|
|
|
5569
5653
|
// src/components/games/ui/CrestShield.tsx
|
|
5570
|
-
var
|
|
5571
|
-
var
|
|
5654
|
+
var import_react34 = require("react");
|
|
5655
|
+
var import_jsx_runtime70 = require("react/jsx-runtime");
|
|
5572
5656
|
function CrestShield({ src, name, size = 28 }) {
|
|
5573
|
-
const [failed, setFailed] = (0,
|
|
5657
|
+
const [failed, setFailed] = (0, import_react34.useState)(false);
|
|
5574
5658
|
if (src && !isPlaceholderImage(src) && !failed) {
|
|
5575
|
-
return /* @__PURE__ */ (0,
|
|
5659
|
+
return /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
|
|
5576
5660
|
}
|
|
5577
|
-
return /* @__PURE__ */ (0,
|
|
5661
|
+
return /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("svg", { className: "ss-g-crest ss-g-crest--ph", width: size, height: size * 32 / 28, viewBox: "0 0 28 32", role: "img", "aria-label": name, children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("path", { d: "M2 3h24v12c0 9-6 14-12 17C8 29 2 24 2 15z", fill: "currentColor" }) });
|
|
5578
5662
|
}
|
|
5579
5663
|
|
|
5580
5664
|
// src/components/games/CareerPathGame.tsx
|
|
5581
|
-
var
|
|
5665
|
+
var import_jsx_runtime71 = require("react/jsx-runtime");
|
|
5582
5666
|
function parseClientState3(json) {
|
|
5583
5667
|
if (!json) return null;
|
|
5584
5668
|
try {
|
|
@@ -5602,15 +5686,15 @@ function CareerPathGame({
|
|
|
5602
5686
|
}) {
|
|
5603
5687
|
const s = ui.games.careerPath;
|
|
5604
5688
|
const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
|
|
5605
|
-
const [query, setQuery] = (0,
|
|
5606
|
-
const inputId = (0,
|
|
5689
|
+
const [query, setQuery] = (0, import_react35.useState)("");
|
|
5690
|
+
const inputId = (0, import_react35.useId)();
|
|
5607
5691
|
const clientState = parseClientState3(result?.clientStateJson);
|
|
5608
5692
|
const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
|
|
5609
5693
|
const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
|
|
5610
5694
|
if (!config) {
|
|
5611
|
-
return /* @__PURE__ */ (0,
|
|
5612
|
-
/* @__PURE__ */ (0,
|
|
5613
|
-
/* @__PURE__ */ (0,
|
|
5695
|
+
return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-career-path", children: [
|
|
5696
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
|
|
5697
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
5614
5698
|
] });
|
|
5615
5699
|
}
|
|
5616
5700
|
const visiblePath = clientState?.visiblePath ?? config.initialPath;
|
|
@@ -5626,60 +5710,60 @@ function CareerPathGame({
|
|
|
5626
5710
|
setQuery("");
|
|
5627
5711
|
onSubmit(JSON.stringify({ guesses: newGuesses }));
|
|
5628
5712
|
}
|
|
5629
|
-
const right = !isOver && clientState ? /* @__PURE__ */ (0,
|
|
5713
|
+
const right = !isOver && clientState ? /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { "data-testid": "cp-guess-chip", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(Chip, { variant: "neutral", children: [
|
|
5630
5714
|
ui.games.guess,
|
|
5631
5715
|
" ",
|
|
5632
|
-
/* @__PURE__ */ (0,
|
|
5716
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-num", children: clientState.guessesUsed + 1 }),
|
|
5633
5717
|
" / ",
|
|
5634
5718
|
clientState.guessesUsed + clientState.guessesRemaining
|
|
5635
5719
|
] }) }) : void 0;
|
|
5636
5720
|
const outcome = clientState?.solved ? s.solved : clientState?.failed ? s.failed : ui.games.done;
|
|
5637
|
-
return /* @__PURE__ */ (0,
|
|
5638
|
-
/* @__PURE__ */ (0,
|
|
5639
|
-
/* @__PURE__ */ (0,
|
|
5640
|
-
/* @__PURE__ */ (0,
|
|
5641
|
-
isOver && clientState?.revealedPlayerName ? /* @__PURE__ */ (0,
|
|
5642
|
-
/* @__PURE__ */ (0,
|
|
5643
|
-
/* @__PURE__ */ (0,
|
|
5644
|
-
clientState?.hintLine ? /* @__PURE__ */ (0,
|
|
5645
|
-
/* @__PURE__ */ (0,
|
|
5646
|
-
/* @__PURE__ */ (0,
|
|
5721
|
+
return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-career-path", children: [
|
|
5722
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)(GameHeader, { title, eyebrow: s.eyebrow, right, onBack, backLabel: ui.back }),
|
|
5723
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: "ss-g-body", children: [
|
|
5724
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: "ss-g-cp-card", children: [
|
|
5725
|
+
isOver && clientState?.revealedPlayerName ? /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(PlayerAvatar, { className: "ss-g-cp-photo", name: clientState.revealedPlayerName, imagePath: clientState.revealedPlayerImagePath }) : /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(Silhouette, { size: 64, variant: isOver ? "default" : "mystery" }),
|
|
5726
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: "ss-g-cp-card-text", children: [
|
|
5727
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-card-title", children: isOver && clientState?.revealedPlayerName ? clientState.revealedPlayerName : s.mysteryPlayer }),
|
|
5728
|
+
clientState?.hintLine ? /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-hint", children: clientState.hintLine }) : !isOver ? /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("span", { className: "ss-g-cp-locks", children: [
|
|
5729
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)(Chip, { variant: "lock", icon: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(IconLock, { size: 11 }), children: s.lockPosition }),
|
|
5730
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)(Chip, { variant: "lock", icon: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(IconLock, { size: 11 }), children: s.lockNationality })
|
|
5647
5731
|
] }) : null
|
|
5648
5732
|
] })
|
|
5649
5733
|
] }),
|
|
5650
|
-
/* @__PURE__ */ (0,
|
|
5734
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("ol", { className: "ss-g-cp-line", children: [
|
|
5651
5735
|
visiblePath.map((spell, i) => {
|
|
5652
5736
|
const years = i === 0 ? s.firstClub : spellYears(spell);
|
|
5653
|
-
return /* @__PURE__ */ (0,
|
|
5654
|
-
/* @__PURE__ */ (0,
|
|
5655
|
-
/* @__PURE__ */ (0,
|
|
5656
|
-
/* @__PURE__ */ (0,
|
|
5737
|
+
return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("li", { className: "ss-g-cp-step", children: [
|
|
5738
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("span", { className: "ss-g-cp-rail", children: [
|
|
5739
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-tile", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(CrestShield, { src: spell.crestUrl, name: spell.clubName, size: 30 }) }),
|
|
5740
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-conn", "aria-hidden": "true" })
|
|
5657
5741
|
] }),
|
|
5658
|
-
/* @__PURE__ */ (0,
|
|
5659
|
-
/* @__PURE__ */ (0,
|
|
5660
|
-
/* @__PURE__ */ (0,
|
|
5661
|
-
/* @__PURE__ */ (0,
|
|
5662
|
-
spell.isLoan && /* @__PURE__ */ (0,
|
|
5742
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("span", { className: "ss-g-cp-step-text", children: [
|
|
5743
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-club", children: spell.clubName }),
|
|
5744
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("span", { className: "ss-g-cp-sub", children: [
|
|
5745
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-years", children: years }),
|
|
5746
|
+
spell.isLoan && /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_jsx_runtime71.Fragment, { children: [
|
|
5663
5747
|
years ? " \xB7 " : "",
|
|
5664
|
-
/* @__PURE__ */ (0,
|
|
5748
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-loan", children: s.loan })
|
|
5665
5749
|
] })
|
|
5666
5750
|
] })
|
|
5667
5751
|
] })
|
|
5668
5752
|
] }, `${spell.clubName}-${i}`);
|
|
5669
5753
|
}),
|
|
5670
|
-
hidden > 0 && /* @__PURE__ */ (0,
|
|
5671
|
-
/* @__PURE__ */ (0,
|
|
5672
|
-
/* @__PURE__ */ (0,
|
|
5673
|
-
hidden > 1 && /* @__PURE__ */ (0,
|
|
5754
|
+
hidden > 0 && /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("li", { className: "ss-g-cp-step ss-g-cp-step--hidden", children: [
|
|
5755
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("span", { className: "ss-g-cp-rail", children: [
|
|
5756
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-tile ss-g-cp-tile--locked", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(IconLock, { size: 18 }) }),
|
|
5757
|
+
hidden > 1 && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-conn ss-g-cp-conn--faint", "aria-hidden": "true" })
|
|
5674
5758
|
] }),
|
|
5675
|
-
/* @__PURE__ */ (0,
|
|
5759
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-step-text", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-sub", children: s.nextClubHidden }) })
|
|
5676
5760
|
] }),
|
|
5677
|
-
hidden > 1 && /* @__PURE__ */ (0,
|
|
5678
|
-
/* @__PURE__ */ (0,
|
|
5679
|
-
/* @__PURE__ */ (0,
|
|
5761
|
+
hidden > 1 && /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("li", { className: "ss-g-cp-step ss-g-cp-step--more", children: [
|
|
5762
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-rail", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-tile ss-g-cp-tile--faint", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(IconLock, { size: 18 }) }) }),
|
|
5763
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-step-text", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-cp-sub", children: s.moreClubs(hidden - 1) }) })
|
|
5680
5764
|
] })
|
|
5681
5765
|
] }),
|
|
5682
|
-
isOver && /* @__PURE__ */ (0,
|
|
5766
|
+
isOver && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
|
|
5683
5767
|
ResultCard,
|
|
5684
5768
|
{
|
|
5685
5769
|
tone: clientState?.solved ? "win" : clientState?.failed ? "lose" : "neutral",
|
|
@@ -5691,22 +5775,22 @@ function CareerPathGame({
|
|
|
5691
5775
|
}
|
|
5692
5776
|
)
|
|
5693
5777
|
] }),
|
|
5694
|
-
!isOver && /* @__PURE__ */ (0,
|
|
5695
|
-
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ (0,
|
|
5778
|
+
!isOver && /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(FooterBar, { children: [
|
|
5779
|
+
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
|
|
5696
5780
|
OptionList,
|
|
5697
5781
|
{
|
|
5698
5782
|
label: s.searchLabel,
|
|
5699
5783
|
options: filtered.map((p) => ({
|
|
5700
5784
|
key: p.id,
|
|
5701
|
-
content: /* @__PURE__ */ (0,
|
|
5702
|
-
/* @__PURE__ */ (0,
|
|
5703
|
-
/* @__PURE__ */ (0,
|
|
5785
|
+
content: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_jsx_runtime71.Fragment, { children: [
|
|
5786
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)(PlayerAvatar, { className: "ss-g-opt-av", name: p.name }),
|
|
5787
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { children: p.name })
|
|
5704
5788
|
] })
|
|
5705
5789
|
})),
|
|
5706
5790
|
onPick: (k) => handleSelect(Number(k))
|
|
5707
5791
|
}
|
|
5708
5792
|
),
|
|
5709
|
-
/* @__PURE__ */ (0,
|
|
5793
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
|
|
5710
5794
|
SearchField,
|
|
5711
5795
|
{
|
|
5712
5796
|
id: inputId,
|
|
@@ -5722,8 +5806,8 @@ function CareerPathGame({
|
|
|
5722
5806
|
}
|
|
5723
5807
|
|
|
5724
5808
|
// src/components/games/BeatTheGridGame.tsx
|
|
5725
|
-
var
|
|
5726
|
-
var
|
|
5809
|
+
var import_react36 = __toESM(require("react"), 1);
|
|
5810
|
+
var import_jsx_runtime72 = require("react/jsx-runtime");
|
|
5727
5811
|
function criterionIconKind(label, key) {
|
|
5728
5812
|
const l = (key ?? label).toLowerCase();
|
|
5729
5813
|
if (l.includes("app")) return "calendar";
|
|
@@ -5741,34 +5825,34 @@ function rowAbbrev(label, map, key) {
|
|
|
5741
5825
|
function CriterionIcon({ kind }) {
|
|
5742
5826
|
switch (kind) {
|
|
5743
5827
|
case "calendar":
|
|
5744
|
-
return /* @__PURE__ */ (0,
|
|
5828
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconCalendar, {});
|
|
5745
5829
|
case "ball":
|
|
5746
|
-
return /* @__PURE__ */ (0,
|
|
5830
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconBall, {});
|
|
5747
5831
|
case "boot":
|
|
5748
|
-
return /* @__PURE__ */ (0,
|
|
5832
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconBoot, {});
|
|
5749
5833
|
case "gloves":
|
|
5750
|
-
return /* @__PURE__ */ (0,
|
|
5834
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconGloves, {});
|
|
5751
5835
|
case "shield":
|
|
5752
|
-
return /* @__PURE__ */ (0,
|
|
5836
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconShield, {});
|
|
5753
5837
|
default:
|
|
5754
|
-
return /* @__PURE__ */ (0,
|
|
5838
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconFlag, {});
|
|
5755
5839
|
}
|
|
5756
5840
|
}
|
|
5757
5841
|
function HeaderVisual({ label, textKey: iKey, meta }) {
|
|
5758
5842
|
if (!meta) {
|
|
5759
|
-
return /* @__PURE__ */ (0,
|
|
5843
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(CriterionIcon, { kind: criterionIconKind(label, iKey) });
|
|
5760
5844
|
}
|
|
5761
5845
|
switch (meta.kind) {
|
|
5762
5846
|
case "club":
|
|
5763
|
-
return /* @__PURE__ */ (0,
|
|
5847
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(CrestShield, { src: meta.imageUrl, name: label, size: 24 });
|
|
5764
5848
|
case "coach":
|
|
5765
|
-
return /* @__PURE__ */ (0,
|
|
5849
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(PlayerAvatar, { name: label, imagePath: meta.imageUrl, className: "ss-g-btg-coach-av" });
|
|
5766
5850
|
case "country":
|
|
5767
|
-
return /* @__PURE__ */ (0,
|
|
5851
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { className: "ss-g-btg-hdr-flag", "aria-hidden": "true", children: nationalityFlag(meta.country ?? label) });
|
|
5768
5852
|
case "position":
|
|
5769
|
-
return /* @__PURE__ */ (0,
|
|
5853
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_jsx_runtime72.Fragment, {});
|
|
5770
5854
|
default:
|
|
5771
|
-
return /* @__PURE__ */ (0,
|
|
5855
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(CriterionIcon, { kind: criterionIconKind(label, iKey) });
|
|
5772
5856
|
}
|
|
5773
5857
|
}
|
|
5774
5858
|
function parseClientState4(json) {
|
|
@@ -5803,21 +5887,21 @@ function SearchSheet({
|
|
|
5803
5887
|
ui
|
|
5804
5888
|
}) {
|
|
5805
5889
|
const s = ui.games.beatTheGrid;
|
|
5806
|
-
const [query, setQuery] = (0,
|
|
5807
|
-
const inputId = (0,
|
|
5808
|
-
const inputRef = (0,
|
|
5809
|
-
(0,
|
|
5890
|
+
const [query, setQuery] = (0, import_react36.useState)("");
|
|
5891
|
+
const inputId = (0, import_react36.useId)();
|
|
5892
|
+
const inputRef = (0, import_react36.useRef)(null);
|
|
5893
|
+
(0, import_react36.useEffect)(() => {
|
|
5810
5894
|
inputRef.current?.focus();
|
|
5811
5895
|
}, [row, col]);
|
|
5812
5896
|
const filtered = playerPool.filter(
|
|
5813
5897
|
(p) => !alreadyFilledIds.has(p.id) && p.name.toLowerCase().includes(query.toLowerCase())
|
|
5814
5898
|
);
|
|
5815
|
-
return /* @__PURE__ */ (0,
|
|
5816
|
-
/* @__PURE__ */ (0,
|
|
5817
|
-
/* @__PURE__ */ (0,
|
|
5818
|
-
/* @__PURE__ */ (0,
|
|
5819
|
-
/* @__PURE__ */ (0,
|
|
5820
|
-
/* @__PURE__ */ (0,
|
|
5899
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "ss-g-btg-sheet", "data-testid": "btg-search-sheet", children: [
|
|
5900
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "ss-g-btg-sheet-hdr", children: [
|
|
5901
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(Chip, { variant: "neutral", children: rowLabel }),
|
|
5902
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { className: "ss-g-btg-sheet-x", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconClose, { size: 12 }) }),
|
|
5903
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(Chip, { variant: "accent", children: colLabel }),
|
|
5904
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
5821
5905
|
"button",
|
|
5822
5906
|
{
|
|
5823
5907
|
type: "button",
|
|
@@ -5825,12 +5909,12 @@ function SearchSheet({
|
|
|
5825
5909
|
"data-testid": "btg-sheet-dismiss",
|
|
5826
5910
|
"aria-label": s.closeSearch,
|
|
5827
5911
|
onClick: onDismiss,
|
|
5828
|
-
children: /* @__PURE__ */ (0,
|
|
5912
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconClose, {})
|
|
5829
5913
|
}
|
|
5830
5914
|
)
|
|
5831
5915
|
] }),
|
|
5832
|
-
playerPool.length === 0 ? /* @__PURE__ */ (0,
|
|
5833
|
-
/* @__PURE__ */ (0,
|
|
5916
|
+
playerPool.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "ss-g-btg-sheet-empty", children: s.emptyPool }) : /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(import_jsx_runtime72.Fragment, { children: [
|
|
5917
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
5834
5918
|
SearchField,
|
|
5835
5919
|
{
|
|
5836
5920
|
id: inputId,
|
|
@@ -5842,16 +5926,16 @@ function SearchSheet({
|
|
|
5842
5926
|
inputRef
|
|
5843
5927
|
}
|
|
5844
5928
|
),
|
|
5845
|
-
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ (0,
|
|
5929
|
+
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
5846
5930
|
OptionList,
|
|
5847
5931
|
{
|
|
5848
5932
|
label: s.searchLabel(rowLabel, colLabel),
|
|
5849
5933
|
options: filtered.map((p) => ({
|
|
5850
5934
|
key: p.id,
|
|
5851
|
-
content: /* @__PURE__ */ (0,
|
|
5852
|
-
/* @__PURE__ */ (0,
|
|
5853
|
-
/* @__PURE__ */ (0,
|
|
5854
|
-
/* @__PURE__ */ (0,
|
|
5935
|
+
content: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(import_jsx_runtime72.Fragment, { children: [
|
|
5936
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(PlayerAvatar, { name: p.name, imagePath: p.imagePath, className: "ss-g-opt-av" }),
|
|
5937
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { className: "ss-g-btg-result-name", children: p.name }),
|
|
5938
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { className: "ss-g-btg-result-plus", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconPlus, { size: 18 }) })
|
|
5855
5939
|
] })
|
|
5856
5940
|
})),
|
|
5857
5941
|
onPick: (k) => onPick(row, col, Number(k))
|
|
@@ -5871,7 +5955,7 @@ function BeatTheGridGame({
|
|
|
5871
5955
|
}) {
|
|
5872
5956
|
const s = ui.games.beatTheGrid;
|
|
5873
5957
|
const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
|
|
5874
|
-
const [activeCell, setActiveCell] = (0,
|
|
5958
|
+
const [activeCell, setActiveCell] = (0, import_react36.useState)(null);
|
|
5875
5959
|
const clientState = parseClientState4(result?.clientStateJson);
|
|
5876
5960
|
const filledCells = clientState?.cells ?? [];
|
|
5877
5961
|
const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
|
|
@@ -5889,9 +5973,9 @@ function BeatTheGridGame({
|
|
|
5889
5973
|
onSubmit(JSON.stringify({ cells: newCells }));
|
|
5890
5974
|
}
|
|
5891
5975
|
if (!config) {
|
|
5892
|
-
return /* @__PURE__ */ (0,
|
|
5893
|
-
/* @__PURE__ */ (0,
|
|
5894
|
-
/* @__PURE__ */ (0,
|
|
5976
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-beat-the-grid", children: [
|
|
5977
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
|
|
5978
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
5895
5979
|
] });
|
|
5896
5980
|
}
|
|
5897
5981
|
const rows = config.rows;
|
|
@@ -5904,20 +5988,20 @@ function BeatTheGridGame({
|
|
|
5904
5988
|
(_, i) => i < correctCount ? "correct" : i < correctCount + wrongCount ? "wrong" : "todo"
|
|
5905
5989
|
);
|
|
5906
5990
|
const totalScore = clientState?.totalScore ?? result?.score ?? 0;
|
|
5907
|
-
return /* @__PURE__ */ (0,
|
|
5908
|
-
/* @__PURE__ */ (0,
|
|
5909
|
-
/* @__PURE__ */ (0,
|
|
5991
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-beat-the-grid", children: [
|
|
5992
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
|
|
5993
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
5910
5994
|
SegmentProgress,
|
|
5911
5995
|
{
|
|
5912
5996
|
segments,
|
|
5913
5997
|
ariaLabel: s.progressAria(filledCells.length, total),
|
|
5914
5998
|
leftLabel: s.filled(filledCells.length, total),
|
|
5915
5999
|
rightLabel: s.toGo(Math.max(0, total - filledCells.length)),
|
|
5916
|
-
right: /* @__PURE__ */ (0,
|
|
6000
|
+
right: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(Chip, { variant: "accent", children: `${totalScore} ${ui.games.unitPts}` })
|
|
5917
6001
|
}
|
|
5918
6002
|
),
|
|
5919
|
-
/* @__PURE__ */ (0,
|
|
5920
|
-
/* @__PURE__ */ (0,
|
|
6003
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "ss-g-body", children: [
|
|
6004
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(
|
|
5921
6005
|
"div",
|
|
5922
6006
|
{
|
|
5923
6007
|
className: activeCell !== null ? "ss-g-btg-grid ss-g-btg-grid--fit" : "ss-g-btg-grid",
|
|
@@ -5927,31 +6011,31 @@ function BeatTheGridGame({
|
|
|
5927
6011
|
},
|
|
5928
6012
|
role: "grid",
|
|
5929
6013
|
children: [
|
|
5930
|
-
/* @__PURE__ */ (0,
|
|
6014
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "ss-g-btg-corner" }),
|
|
5931
6015
|
cols.map((col, colIdx) => {
|
|
5932
6016
|
const colMeta = config.colsMeta?.[colIdx];
|
|
5933
|
-
return /* @__PURE__ */ (0,
|
|
5934
|
-
/* @__PURE__ */ (0,
|
|
5935
|
-
/* @__PURE__ */ (0,
|
|
6017
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "ss-g-btg-colhdr", "data-meta": colMeta ? "true" : void 0, children: [
|
|
6018
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(HeaderVisual, { label: col, textKey: config.colsI18n?.[colIdx]?.key, meta: colMeta }),
|
|
6019
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { children: col })
|
|
5936
6020
|
] }, col);
|
|
5937
6021
|
}),
|
|
5938
6022
|
rows.map((rowLabel, rowIdx) => {
|
|
5939
6023
|
const rowMeta = config.rowsMeta?.[rowIdx];
|
|
5940
6024
|
const abbr = rowAbbrev(rowLabel, s.rowAbbrev, config.rowsI18n?.[rowIdx]?.key);
|
|
5941
|
-
const rowHeaderContent = rowMeta ? /* @__PURE__ */ (0,
|
|
5942
|
-
/* @__PURE__ */ (0,
|
|
5943
|
-
/* @__PURE__ */ (0,
|
|
5944
|
-
] }) : abbr === rowLabel ? /* @__PURE__ */ (0,
|
|
5945
|
-
/* @__PURE__ */ (0,
|
|
5946
|
-
/* @__PURE__ */ (0,
|
|
6025
|
+
const rowHeaderContent = rowMeta ? /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(import_jsx_runtime72.Fragment, { children: [
|
|
6026
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(HeaderVisual, { label: rowLabel, textKey: config.rowsI18n?.[rowIdx]?.key, meta: rowMeta }),
|
|
6027
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { children: rowLabel })
|
|
6028
|
+
] }) : abbr === rowLabel ? /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { children: rowLabel }) : /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(import_jsx_runtime72.Fragment, { children: [
|
|
6029
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { "aria-hidden": "true", children: abbr }),
|
|
6030
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { className: "ss-g-sr", children: rowLabel })
|
|
5947
6031
|
] });
|
|
5948
|
-
return /* @__PURE__ */ (0,
|
|
5949
|
-
/* @__PURE__ */ (0,
|
|
6032
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(import_react36.default.Fragment, { children: [
|
|
6033
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "ss-g-btg-rowhdr", "data-meta": rowMeta ? "true" : void 0, children: rowHeaderContent }),
|
|
5950
6034
|
cols.map((colLabel, colIdx) => {
|
|
5951
6035
|
const filled = findCellResult(filledCells, rowIdx, colIdx);
|
|
5952
6036
|
const isActive = activeCell?.row === rowIdx && activeCell?.col === colIdx;
|
|
5953
6037
|
const state = filled ? filled.isCorrect ? "correct" : "wrong" : isActive ? "active" : "empty";
|
|
5954
|
-
return /* @__PURE__ */ (0,
|
|
6038
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
5955
6039
|
"button",
|
|
5956
6040
|
{
|
|
5957
6041
|
type: "button",
|
|
@@ -5962,20 +6046,20 @@ function BeatTheGridGame({
|
|
|
5962
6046
|
className: "ss-g-btg-cell",
|
|
5963
6047
|
disabled: isLocked2 || submitting,
|
|
5964
6048
|
onClick: () => handleCellClick(rowIdx, colIdx),
|
|
5965
|
-
children: filled ? /* @__PURE__ */ (0,
|
|
5966
|
-
/* @__PURE__ */ (0,
|
|
6049
|
+
children: filled ? /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(import_jsx_runtime72.Fragment, { children: [
|
|
6050
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
5967
6051
|
"span",
|
|
5968
6052
|
{
|
|
5969
6053
|
className: `ss-g-btg-badge ss-g-btg-badge--${filled.isCorrect ? "correct" : "wrong"}`,
|
|
5970
6054
|
role: "img",
|
|
5971
6055
|
"aria-label": filled.isCorrect ? s.correct : s.wrong,
|
|
5972
|
-
children: filled.isCorrect ? /* @__PURE__ */ (0,
|
|
6056
|
+
children: filled.isCorrect ? /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconCheck, { size: 11 }) : /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconClose, { size: 11 })
|
|
5973
6057
|
}
|
|
5974
6058
|
),
|
|
5975
|
-
/* @__PURE__ */ (0,
|
|
6059
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { className: "ss-g-btg-rarity", children: filled.rarityScore }),
|
|
5976
6060
|
(() => {
|
|
5977
6061
|
const entry = playerPool.find((p) => p.id === filled.playerId);
|
|
5978
|
-
return /* @__PURE__ */ (0,
|
|
6062
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
5979
6063
|
PlayerAvatar,
|
|
5980
6064
|
{
|
|
5981
6065
|
name: entry?.name ?? "",
|
|
@@ -5984,8 +6068,8 @@ function BeatTheGridGame({
|
|
|
5984
6068
|
}
|
|
5985
6069
|
);
|
|
5986
6070
|
})(),
|
|
5987
|
-
/* @__PURE__ */ (0,
|
|
5988
|
-
] }) : /* @__PURE__ */ (0,
|
|
6071
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { className: "ss-g-btg-name", children: shortName(playerPool.find((p) => p.id === filled.playerId)?.name) })
|
|
6072
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { className: "ss-g-btg-plus", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(IconPlus, { size: 22 }) })
|
|
5989
6073
|
},
|
|
5990
6074
|
`cell-${rowIdx}-${colIdx}`
|
|
5991
6075
|
);
|
|
@@ -5995,7 +6079,7 @@ function BeatTheGridGame({
|
|
|
5995
6079
|
]
|
|
5996
6080
|
}
|
|
5997
6081
|
),
|
|
5998
|
-
isLocked2 && /* @__PURE__ */ (0,
|
|
6082
|
+
isLocked2 && /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
5999
6083
|
ResultCard,
|
|
6000
6084
|
{
|
|
6001
6085
|
tone: "neutral",
|
|
@@ -6007,7 +6091,7 @@ function BeatTheGridGame({
|
|
|
6007
6091
|
}
|
|
6008
6092
|
)
|
|
6009
6093
|
] }),
|
|
6010
|
-
activeCell !== null && /* @__PURE__ */ (0,
|
|
6094
|
+
activeCell !== null && /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "ss-g-btg-pin", children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
6011
6095
|
SearchSheet,
|
|
6012
6096
|
{
|
|
6013
6097
|
row: activeCell.row,
|
|
@@ -6026,21 +6110,21 @@ function BeatTheGridGame({
|
|
|
6026
6110
|
}
|
|
6027
6111
|
|
|
6028
6112
|
// src/components/games/GuessTheXiGame.tsx
|
|
6029
|
-
var
|
|
6113
|
+
var import_react37 = require("react");
|
|
6030
6114
|
|
|
6031
6115
|
// src/components/games/ui/PitchSvg.tsx
|
|
6032
|
-
var
|
|
6116
|
+
var import_jsx_runtime73 = require("react/jsx-runtime");
|
|
6033
6117
|
function PitchSvg({ variant }) {
|
|
6034
|
-
return /* @__PURE__ */ (0,
|
|
6035
|
-
/* @__PURE__ */ (0,
|
|
6036
|
-
variant === "full" ? /* @__PURE__ */ (0,
|
|
6037
|
-
/* @__PURE__ */ (0,
|
|
6038
|
-
/* @__PURE__ */ (0,
|
|
6039
|
-
/* @__PURE__ */ (0,
|
|
6040
|
-
/* @__PURE__ */ (0,
|
|
6041
|
-
] }) : /* @__PURE__ */ (0,
|
|
6042
|
-
/* @__PURE__ */ (0,
|
|
6043
|
-
/* @__PURE__ */ (0,
|
|
6118
|
+
return /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("svg", { className: "ss-g-pitch-svg", viewBox: variant === "full" ? "0 0 100 150" : "0 0 100 100", preserveAspectRatio: "none", "aria-hidden": "true", children: [
|
|
6119
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)("rect", { x: "4", y: "4", width: "92", height: variant === "full" ? 142 : 92, fill: "none" }),
|
|
6120
|
+
variant === "full" ? /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(import_jsx_runtime73.Fragment, { children: [
|
|
6121
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)("line", { x1: "4", y1: "75", x2: "96", y2: "75" }),
|
|
6122
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)("circle", { cx: "50", cy: "75", r: "12", fill: "none" }),
|
|
6123
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)("rect", { x: "26", y: "4", width: "48", height: "20", fill: "none" }),
|
|
6124
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)("rect", { x: "26", y: "126", width: "48", height: "20", fill: "none" })
|
|
6125
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(import_jsx_runtime73.Fragment, { children: [
|
|
6126
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)("path", { d: "M38 4a12 12 0 0 0 24 0", fill: "none" }),
|
|
6127
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)("rect", { x: "26", y: "76", width: "48", height: "20", fill: "none" })
|
|
6044
6128
|
] })
|
|
6045
6129
|
] });
|
|
6046
6130
|
}
|
|
@@ -6096,7 +6180,7 @@ function positionsBySlot(formation, rowsAttackFirst) {
|
|
|
6096
6180
|
}
|
|
6097
6181
|
|
|
6098
6182
|
// src/components/games/GuessTheXiGame.tsx
|
|
6099
|
-
var
|
|
6183
|
+
var import_jsx_runtime74 = require("react/jsx-runtime");
|
|
6100
6184
|
var MAX_GUESSES2 = 3;
|
|
6101
6185
|
function parseClientState5(json) {
|
|
6102
6186
|
if (!json) return null;
|
|
@@ -6115,8 +6199,8 @@ function GuessTheXiGame({
|
|
|
6115
6199
|
onBack
|
|
6116
6200
|
}) {
|
|
6117
6201
|
const t = ui.games.guessTheXi;
|
|
6118
|
-
const [query, setQuery] = (0,
|
|
6119
|
-
const inputId = (0,
|
|
6202
|
+
const [query, setQuery] = (0, import_react37.useState)("");
|
|
6203
|
+
const inputId = (0, import_react37.useId)();
|
|
6120
6204
|
const clientState = parseClientState5(result?.clientStateJson);
|
|
6121
6205
|
const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
|
|
6122
6206
|
const solved = clientState?.status === "solved";
|
|
@@ -6146,30 +6230,30 @@ function GuessTheXiGame({
|
|
|
6146
6230
|
const wrongGuesses = (clientState?.guessHistory ?? []).filter((g) => !g.wasCorrect);
|
|
6147
6231
|
const guessesLeft = Math.max(0, MAX_GUESSES2 - (clientState?.guessesUsed ?? 0));
|
|
6148
6232
|
const teamName = (id) => config?.teamPool.find((tm) => tm.teamId === id)?.teamName ?? `#${id}`;
|
|
6149
|
-
return /* @__PURE__ */ (0,
|
|
6150
|
-
/* @__PURE__ */ (0,
|
|
6233
|
+
return /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "ss-g-screen ss-g-gxi", "data-testid": "game-screen-guess-the-xi", children: [
|
|
6234
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
|
|
6151
6235
|
GameHeader,
|
|
6152
6236
|
{
|
|
6153
6237
|
title: gameTitle({ gameId: "guess-the-xi" }, ui.games.titles),
|
|
6154
6238
|
eyebrow: config?.poolLabel,
|
|
6155
|
-
right: formation ? /* @__PURE__ */ (0,
|
|
6239
|
+
right: formation ? /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(Chip, { variant: "accent", children: formation }) : void 0,
|
|
6156
6240
|
onBack,
|
|
6157
6241
|
backLabel: ui.back
|
|
6158
6242
|
}
|
|
6159
6243
|
),
|
|
6160
|
-
!config && /* @__PURE__ */ (0,
|
|
6161
|
-
config && /* @__PURE__ */ (0,
|
|
6162
|
-
/* @__PURE__ */ (0,
|
|
6163
|
-
rows.length > 0 && /* @__PURE__ */ (0,
|
|
6164
|
-
/* @__PURE__ */ (0,
|
|
6165
|
-
/* @__PURE__ */ (0,
|
|
6244
|
+
!config && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
|
|
6245
|
+
config && /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)(import_jsx_runtime74.Fragment, { children: [
|
|
6246
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "ss-g-body", children: [
|
|
6247
|
+
rows.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "ss-g-gxi-pitch", role: "group", "aria-label": t.pitchLabel, children: [
|
|
6248
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(PitchSvg, { variant: "full" }),
|
|
6249
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)("div", { className: "ss-g-gxi-rows", children: rows.map((row, r) => /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("div", { className: "ss-g-gxi-row", children: row.map((pos, c) => {
|
|
6166
6250
|
const posLabel = pos.slot ? posBySlot.get(pos.slot) ?? "" : "";
|
|
6167
6251
|
const name = pos.slot ? nameBySlot.get(pos.slot) : void 0;
|
|
6168
6252
|
const lineupEntry = pos.slot ? lineupBySlot.get(pos.slot) : void 0;
|
|
6169
6253
|
const flag = nationalityFlag(pos.nationality);
|
|
6170
6254
|
if (lineupEntry) {
|
|
6171
|
-
return /* @__PURE__ */ (0,
|
|
6172
|
-
/* @__PURE__ */ (0,
|
|
6255
|
+
return /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "ss-g-gxi-node", "data-revealed": "true", children: [
|
|
6256
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
|
|
6173
6257
|
PlayerAvatar,
|
|
6174
6258
|
{
|
|
6175
6259
|
name: lineupEntry.name,
|
|
@@ -6177,11 +6261,11 @@ function GuessTheXiGame({
|
|
|
6177
6261
|
className: "ss-g-gxi-disc ss-g-gxi-disc--photo"
|
|
6178
6262
|
}
|
|
6179
6263
|
),
|
|
6180
|
-
/* @__PURE__ */ (0,
|
|
6264
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)("span", { className: "ss-g-gxi-pos ss-g-gxi-pos--name", children: splitName(lineupEntry.name).last })
|
|
6181
6265
|
] }, `${pos.slot}-${c}`);
|
|
6182
6266
|
}
|
|
6183
|
-
return /* @__PURE__ */ (0,
|
|
6184
|
-
/* @__PURE__ */ (0,
|
|
6267
|
+
return /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "ss-g-gxi-node", "data-revealed": name ? "true" : void 0, children: [
|
|
6268
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
|
|
6185
6269
|
"span",
|
|
6186
6270
|
{
|
|
6187
6271
|
className: "ss-g-gxi-disc",
|
|
@@ -6192,22 +6276,22 @@ function GuessTheXiGame({
|
|
|
6192
6276
|
children: flag
|
|
6193
6277
|
}
|
|
6194
6278
|
),
|
|
6195
|
-
name ? /* @__PURE__ */ (0,
|
|
6279
|
+
name ? /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("span", { className: "ss-g-gxi-pos ss-g-gxi-pos--name", children: splitName(name).last }) : posLabel && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)("span", { className: "ss-g-gxi-pos", children: posLabel })
|
|
6196
6280
|
] }, `${pos.slot}-${c}`);
|
|
6197
6281
|
}) }, r)) })
|
|
6198
6282
|
] }),
|
|
6199
|
-
!isOver && wrongGuesses.length > 0 && /* @__PURE__ */ (0,
|
|
6200
|
-
/* @__PURE__ */ (0,
|
|
6283
|
+
!isOver && wrongGuesses.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "ss-g-gxi-wrong", children: [
|
|
6284
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)("span", { className: "ss-g-gxi-wrong-l", children: t.notThem }),
|
|
6201
6285
|
wrongGuesses.map((g) => {
|
|
6202
6286
|
const crestUrl = config?.teamPool.find((tm) => tm.teamId === g.teamId)?.crestUrl;
|
|
6203
|
-
return /* @__PURE__ */ (0,
|
|
6204
|
-
/* @__PURE__ */ (0,
|
|
6205
|
-
/* @__PURE__ */ (0,
|
|
6287
|
+
return /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("span", { className: "ss-g-gxi-wrong-chip", children: [
|
|
6288
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(CrestShield, { src: crestUrl, name: teamName(g.teamId), size: 18 }),
|
|
6289
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)("s", { children: teamName(g.teamId) })
|
|
6206
6290
|
] }, g.teamId);
|
|
6207
6291
|
})
|
|
6208
6292
|
] }),
|
|
6209
|
-
isOver && /* @__PURE__ */ (0,
|
|
6210
|
-
/* @__PURE__ */ (0,
|
|
6293
|
+
isOver && /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)(import_jsx_runtime74.Fragment, { children: [
|
|
6294
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
|
|
6211
6295
|
ResultCard,
|
|
6212
6296
|
{
|
|
6213
6297
|
tone: solved ? "win" : failed ? "lose" : "neutral",
|
|
@@ -6218,29 +6302,29 @@ function GuessTheXiGame({
|
|
|
6218
6302
|
ui
|
|
6219
6303
|
}
|
|
6220
6304
|
),
|
|
6221
|
-
(solved || failed) && clientState?.answer && /* @__PURE__ */ (0,
|
|
6222
|
-
/* @__PURE__ */ (0,
|
|
6223
|
-
/* @__PURE__ */ (0,
|
|
6224
|
-
/* @__PURE__ */ (0,
|
|
6305
|
+
(solved || failed) && clientState?.answer && /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "ss-g-gxi-answer", "data-testid": "gxi-answer-reveal", children: [
|
|
6306
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)("span", { className: "ss-g-gxi-answer-label", children: t.theAnswer }),
|
|
6307
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(CrestShield, { src: clientState.answer.crestUrl, name: clientState.answer.teamName, size: 32 }),
|
|
6308
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)("span", { className: "ss-g-gxi-answer-name", children: clientState.answer.teamName })
|
|
6225
6309
|
] })
|
|
6226
6310
|
] })
|
|
6227
6311
|
] }),
|
|
6228
|
-
!isOver && /* @__PURE__ */ (0,
|
|
6229
|
-
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ (0,
|
|
6312
|
+
!isOver && /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)(FooterBar, { children: [
|
|
6313
|
+
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
|
|
6230
6314
|
OptionList,
|
|
6231
6315
|
{
|
|
6232
6316
|
label: t.optionsLabel,
|
|
6233
6317
|
options: filtered.map((tm) => ({
|
|
6234
6318
|
key: tm.teamId,
|
|
6235
|
-
content: /* @__PURE__ */ (0,
|
|
6236
|
-
/* @__PURE__ */ (0,
|
|
6237
|
-
/* @__PURE__ */ (0,
|
|
6319
|
+
content: /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)(import_jsx_runtime74.Fragment, { children: [
|
|
6320
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(CrestShield, { src: tm.crestUrl, name: tm.teamName, size: 28 }),
|
|
6321
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)("span", { children: tm.teamName })
|
|
6238
6322
|
] })
|
|
6239
6323
|
})),
|
|
6240
6324
|
onPick: (k) => handlePick(Number(k))
|
|
6241
6325
|
}
|
|
6242
6326
|
),
|
|
6243
|
-
/* @__PURE__ */ (0,
|
|
6327
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
|
|
6244
6328
|
SearchField,
|
|
6245
6329
|
{
|
|
6246
6330
|
id: inputId,
|
|
@@ -6257,8 +6341,8 @@ function GuessTheXiGame({
|
|
|
6257
6341
|
}
|
|
6258
6342
|
|
|
6259
6343
|
// src/components/games/DailyQuizGame.tsx
|
|
6260
|
-
var
|
|
6261
|
-
var
|
|
6344
|
+
var import_react38 = require("react");
|
|
6345
|
+
var import_jsx_runtime75 = require("react/jsx-runtime");
|
|
6262
6346
|
function parseClientState6(json) {
|
|
6263
6347
|
if (!json) return null;
|
|
6264
6348
|
try {
|
|
@@ -6279,13 +6363,13 @@ function OptionName({ text }) {
|
|
|
6279
6363
|
const tokens = base.split(/\s+/).filter(Boolean);
|
|
6280
6364
|
const isPlainName = tokens.length >= 1 && tokens.length <= 4 && tokens.every((t) => NAME_TOKEN.test(t));
|
|
6281
6365
|
if (!isPlainName || base === "") {
|
|
6282
|
-
return /* @__PURE__ */ (0,
|
|
6366
|
+
return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { className: "ss-g-dq-opt-name", children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { className: "ss-g-dq-opt-full", children: text }) });
|
|
6283
6367
|
}
|
|
6284
6368
|
const { first, last } = splitName(base);
|
|
6285
|
-
return /* @__PURE__ */ (0,
|
|
6286
|
-
first && /* @__PURE__ */ (0,
|
|
6287
|
-
/* @__PURE__ */ (0,
|
|
6288
|
-
suffix && /* @__PURE__ */ (0,
|
|
6369
|
+
return /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("span", { className: "ss-g-dq-opt-name", children: [
|
|
6370
|
+
first && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { className: "ss-g-dq-opt-first", children: first }),
|
|
6371
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { className: "ss-g-dq-opt-last", children: last }),
|
|
6372
|
+
suffix && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { className: "ss-g-dq-opt-suffix", children: suffix })
|
|
6289
6373
|
] });
|
|
6290
6374
|
}
|
|
6291
6375
|
function DailyQuizGame({
|
|
@@ -6298,15 +6382,15 @@ function DailyQuizGame({
|
|
|
6298
6382
|
}) {
|
|
6299
6383
|
const s = ui.games.dailyQuiz;
|
|
6300
6384
|
const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
|
|
6301
|
-
const [selections, setSelections] = (0,
|
|
6302
|
-
const [page, setPage] = (0,
|
|
6385
|
+
const [selections, setSelections] = (0, import_react38.useState)(/* @__PURE__ */ new Map());
|
|
6386
|
+
const [page, setPage] = (0, import_react38.useState)(0);
|
|
6303
6387
|
const clientState = parseClientState6(result?.clientStateJson);
|
|
6304
6388
|
const results = clientState?.results ?? [];
|
|
6305
6389
|
const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
|
|
6306
6390
|
if (!config) {
|
|
6307
|
-
return /* @__PURE__ */ (0,
|
|
6308
|
-
/* @__PURE__ */ (0,
|
|
6309
|
-
/* @__PURE__ */ (0,
|
|
6391
|
+
return /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
|
|
6392
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(GameHeader, { title, onBack, backLabel: ui.back }),
|
|
6393
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
6310
6394
|
] });
|
|
6311
6395
|
}
|
|
6312
6396
|
const questions = config.questions;
|
|
@@ -6341,11 +6425,11 @@ function DailyQuizGame({
|
|
|
6341
6425
|
return r.isCorrect ? "correct" : "wrong";
|
|
6342
6426
|
});
|
|
6343
6427
|
const correctCount = results.filter((r) => r.isCorrect).length;
|
|
6344
|
-
return /* @__PURE__ */ (0,
|
|
6345
|
-
/* @__PURE__ */ (0,
|
|
6346
|
-
/* @__PURE__ */ (0,
|
|
6347
|
-
/* @__PURE__ */ (0,
|
|
6348
|
-
/* @__PURE__ */ (0,
|
|
6428
|
+
return /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
|
|
6429
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(GameHeader, { title, eyebrow: s.results, onBack, backLabel: ui.back }),
|
|
6430
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(SegmentProgress, { segments: segments2, ariaLabel: s.results }),
|
|
6431
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "ss-g-body", children: [
|
|
6432
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
|
|
6349
6433
|
ResultCard,
|
|
6350
6434
|
{
|
|
6351
6435
|
tone: "neutral",
|
|
@@ -6358,15 +6442,15 @@ function DailyQuizGame({
|
|
|
6358
6442
|
questions.map((q) => {
|
|
6359
6443
|
const r = findResult(results, q.index);
|
|
6360
6444
|
const picked = selections.get(q.index);
|
|
6361
|
-
return /* @__PURE__ */ (0,
|
|
6362
|
-
/* @__PURE__ */ (0,
|
|
6363
|
-
r && /* @__PURE__ */ (0,
|
|
6445
|
+
return /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "ss-g-dq-rq", children: [
|
|
6446
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { className: "ss-g-dq-rq-stem", children: q.stem }),
|
|
6447
|
+
r && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { className: "ss-g-dq-rq-opts", children: q.options.map((opt, optIdx) => {
|
|
6364
6448
|
let cls = "ss-g-dq-rq-opt";
|
|
6365
6449
|
if (optIdx === r.correctOptionIndex) cls += " ss-g-dq-rq-opt--correct";
|
|
6366
6450
|
else if (optIdx === picked && !r.isCorrect) cls += " ss-g-dq-rq-opt--wrong";
|
|
6367
|
-
return /* @__PURE__ */ (0,
|
|
6451
|
+
return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { className: cls, children: opt }, optIdx);
|
|
6368
6452
|
}) }),
|
|
6369
|
-
r?.revealText && /* @__PURE__ */ (0,
|
|
6453
|
+
r?.revealText && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { className: "ss-g-dq-why", children: r.revealText })
|
|
6370
6454
|
] }, q.index);
|
|
6371
6455
|
})
|
|
6372
6456
|
] })
|
|
@@ -6374,16 +6458,16 @@ function DailyQuizGame({
|
|
|
6374
6458
|
}
|
|
6375
6459
|
const segments = questions.map((_, i) => i < page ? "done" : i === page ? "current" : "todo");
|
|
6376
6460
|
const selectedIdx = current ? selections.get(current.index) : void 0;
|
|
6377
|
-
return /* @__PURE__ */ (0,
|
|
6378
|
-
/* @__PURE__ */ (0,
|
|
6379
|
-
/* @__PURE__ */ (0,
|
|
6380
|
-
/* @__PURE__ */ (0,
|
|
6381
|
-
/* @__PURE__ */ (0,
|
|
6382
|
-
/* @__PURE__ */ (0,
|
|
6461
|
+
return /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
|
|
6462
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(GameHeader, { title, eyebrow: s.questionOf(page + 1, total), onBack, backLabel: ui.back }),
|
|
6463
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(SegmentProgress, { segments, ariaLabel: s.progressAria(page + 1, total) }),
|
|
6464
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { className: "ss-g-body", children: current && /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(import_jsx_runtime75.Fragment, { children: [
|
|
6465
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("h3", { className: "ss-g-dq-stem", children: current.stem }),
|
|
6466
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { className: "ss-g-dq-opts", children: current.options.map((opt, optIdx) => {
|
|
6383
6467
|
const selected = optIdx === selectedIdx;
|
|
6384
6468
|
const imagePath = current.optionImagePaths?.[optIdx] ?? void 0;
|
|
6385
6469
|
const playerName = opt;
|
|
6386
|
-
return /* @__PURE__ */ (0,
|
|
6470
|
+
return /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(
|
|
6387
6471
|
"button",
|
|
6388
6472
|
{
|
|
6389
6473
|
type: "button",
|
|
@@ -6392,25 +6476,25 @@ function DailyQuizGame({
|
|
|
6392
6476
|
disabled: submitting,
|
|
6393
6477
|
onClick: () => handleSelect(current.index, optIdx),
|
|
6394
6478
|
children: [
|
|
6395
|
-
current.optionImagePaths && /* @__PURE__ */ (0,
|
|
6396
|
-
/* @__PURE__ */ (0,
|
|
6397
|
-
/* @__PURE__ */ (0,
|
|
6479
|
+
current.optionImagePaths && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(PlayerAvatar, { name: playerName, imagePath, className: "ss-g-dq-opt-av" }),
|
|
6480
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { className: "ss-g-dq-badge", "aria-hidden": "true", children: selected ? /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(IconCheck, {}) : String.fromCharCode(65 + optIdx) }),
|
|
6481
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(OptionName, { text: opt })
|
|
6398
6482
|
]
|
|
6399
6483
|
},
|
|
6400
6484
|
optIdx
|
|
6401
6485
|
);
|
|
6402
6486
|
}) })
|
|
6403
6487
|
] }) }),
|
|
6404
|
-
/* @__PURE__ */ (0,
|
|
6405
|
-
page > 0 && /* @__PURE__ */ (0,
|
|
6406
|
-
isLast ? /* @__PURE__ */ (0,
|
|
6488
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(FooterBar, { children: /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "ss-g-dq-nav", children: [
|
|
6489
|
+
page > 0 && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(GameButton, { variant: "outline", onClick: goPrev, disabled: submitting, children: s.previous }),
|
|
6490
|
+
isLast ? /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(GameButton, { variant: "primary", block: true, onClick: handleSubmit, disabled: !currentAnswered || !allAnswered || submitting, children: submitting ? s.submitting : s.submit }) : /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(GameButton, { variant: "primary", block: true, onClick: goNext, disabled: !currentAnswered || submitting, children: s.next })
|
|
6407
6491
|
] }) })
|
|
6408
6492
|
] });
|
|
6409
6493
|
}
|
|
6410
6494
|
|
|
6411
6495
|
// src/components/games/MatchdayPredictorGame.tsx
|
|
6412
|
-
var
|
|
6413
|
-
var
|
|
6496
|
+
var import_react39 = require("react");
|
|
6497
|
+
var import_jsx_runtime76 = require("react/jsx-runtime");
|
|
6414
6498
|
var SCORER_SEARCH_THRESHOLD = 9;
|
|
6415
6499
|
function parseClientState7(json) {
|
|
6416
6500
|
if (!json) return null;
|
|
@@ -6428,7 +6512,7 @@ function isLocked(kickoffUtc) {
|
|
|
6428
6512
|
}
|
|
6429
6513
|
}
|
|
6430
6514
|
function IconMinus() {
|
|
6431
|
-
return /* @__PURE__ */ (0,
|
|
6515
|
+
return /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
6432
6516
|
"svg",
|
|
6433
6517
|
{
|
|
6434
6518
|
width: 18,
|
|
@@ -6439,20 +6523,20 @@ function IconMinus() {
|
|
|
6439
6523
|
strokeWidth: 2.2,
|
|
6440
6524
|
strokeLinecap: "round",
|
|
6441
6525
|
"aria-hidden": "true",
|
|
6442
|
-
children: /* @__PURE__ */ (0,
|
|
6526
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("path", { d: "M5 12h14" })
|
|
6443
6527
|
}
|
|
6444
6528
|
);
|
|
6445
6529
|
}
|
|
6446
6530
|
function TeamBadge({ team, label }) {
|
|
6447
|
-
return /* @__PURE__ */ (0,
|
|
6448
|
-
/* @__PURE__ */ (0,
|
|
6449
|
-
/* @__PURE__ */ (0,
|
|
6450
|
-
/* @__PURE__ */ (0,
|
|
6531
|
+
return /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-mp-team", children: [
|
|
6532
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(CrestShield, { name: team.name, size: 44 }),
|
|
6533
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "ss-g-mp-team-name", children: team.name }),
|
|
6534
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "ss-g-mp-team-side", children: label })
|
|
6451
6535
|
] });
|
|
6452
6536
|
}
|
|
6453
6537
|
function ScoreCard({ home, away, h, a, t, edit }) {
|
|
6454
|
-
const col = (side, team, value) => /* @__PURE__ */ (0,
|
|
6455
|
-
edit && /* @__PURE__ */ (0,
|
|
6538
|
+
const col = (side, team, value) => /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-mp-col", children: [
|
|
6539
|
+
edit && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
6456
6540
|
"button",
|
|
6457
6541
|
{
|
|
6458
6542
|
type: "button",
|
|
@@ -6460,11 +6544,11 @@ function ScoreCard({ home, away, h, a, t, edit }) {
|
|
|
6460
6544
|
"aria-label": t.goalsUp(team.name),
|
|
6461
6545
|
disabled: edit.disabled,
|
|
6462
6546
|
onClick: () => edit.onStep(side, 1),
|
|
6463
|
-
children: /* @__PURE__ */ (0,
|
|
6547
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(IconPlus, { size: 18 })
|
|
6464
6548
|
}
|
|
6465
6549
|
),
|
|
6466
|
-
/* @__PURE__ */ (0,
|
|
6467
|
-
edit && /* @__PURE__ */ (0,
|
|
6550
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "ss-g-mp-digit", "data-testid": "mp-digit", "data-active": edit ? String(edit.active === side) : "false", children: value }),
|
|
6551
|
+
edit && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
6468
6552
|
"button",
|
|
6469
6553
|
{
|
|
6470
6554
|
type: "button",
|
|
@@ -6472,27 +6556,27 @@ function ScoreCard({ home, away, h, a, t, edit }) {
|
|
|
6472
6556
|
"aria-label": t.goalsDown(team.name),
|
|
6473
6557
|
disabled: edit.disabled || value <= 0,
|
|
6474
6558
|
onClick: () => edit.onStep(side, -1),
|
|
6475
|
-
children: /* @__PURE__ */ (0,
|
|
6559
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(IconMinus, {})
|
|
6476
6560
|
}
|
|
6477
6561
|
)
|
|
6478
6562
|
] });
|
|
6479
|
-
return /* @__PURE__ */ (0,
|
|
6480
|
-
/* @__PURE__ */ (0,
|
|
6481
|
-
/* @__PURE__ */ (0,
|
|
6563
|
+
return /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-mp-card", children: [
|
|
6564
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(TeamBadge, { team: home, label: t.home }),
|
|
6565
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-mp-scores", children: [
|
|
6482
6566
|
col("home", home, h),
|
|
6483
|
-
/* @__PURE__ */ (0,
|
|
6567
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "ss-g-mp-dash", "aria-hidden": "true", children: "\u2013" }),
|
|
6484
6568
|
col("away", away, a)
|
|
6485
6569
|
] }),
|
|
6486
|
-
/* @__PURE__ */ (0,
|
|
6570
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(TeamBadge, { team: away, label: t.away })
|
|
6487
6571
|
] });
|
|
6488
6572
|
}
|
|
6489
6573
|
function OutcomeRow({ label, ok, detail, t }) {
|
|
6490
|
-
return /* @__PURE__ */ (0,
|
|
6491
|
-
/* @__PURE__ */ (0,
|
|
6492
|
-
/* @__PURE__ */ (0,
|
|
6493
|
-
ok ? /* @__PURE__ */ (0,
|
|
6494
|
-
/* @__PURE__ */ (0,
|
|
6495
|
-
detail ? /* @__PURE__ */ (0,
|
|
6574
|
+
return /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("li", { className: "ss-g-mp-row", "data-testid": "mp-row", "data-ok": String(ok), children: [
|
|
6575
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "ss-g-mp-row-k", children: label }),
|
|
6576
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("span", { className: "ss-g-mp-row-v", children: [
|
|
6577
|
+
ok ? /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(IconCheck, {}) : /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(IconClose, { size: 14 }),
|
|
6578
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "ss-g-sr", children: ok ? t.correct : t.incorrect }),
|
|
6579
|
+
detail ? /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "ss-g-mp-row-d", children: detail }) : null
|
|
6496
6580
|
] })
|
|
6497
6581
|
] });
|
|
6498
6582
|
}
|
|
@@ -6505,20 +6589,20 @@ function MatchdayPredictorGame({
|
|
|
6505
6589
|
onBack
|
|
6506
6590
|
}) {
|
|
6507
6591
|
const t = ui.games.predictor;
|
|
6508
|
-
const [homeScore, setHomeScore] = (0,
|
|
6509
|
-
const [awayScore, setAwayScore] = (0,
|
|
6510
|
-
const [firstScorerPlayerId, setFirstScorerPlayerId] = (0,
|
|
6511
|
-
const [lastEdited, setLastEdited] = (0,
|
|
6512
|
-
const [query, setQuery] = (0,
|
|
6513
|
-
const searchId = (0,
|
|
6592
|
+
const [homeScore, setHomeScore] = (0, import_react39.useState)(0);
|
|
6593
|
+
const [awayScore, setAwayScore] = (0, import_react39.useState)(0);
|
|
6594
|
+
const [firstScorerPlayerId, setFirstScorerPlayerId] = (0, import_react39.useState)(null);
|
|
6595
|
+
const [lastEdited, setLastEdited] = (0, import_react39.useState)("home");
|
|
6596
|
+
const [query, setQuery] = (0, import_react39.useState)("");
|
|
6597
|
+
const searchId = (0, import_react39.useId)();
|
|
6514
6598
|
const clientState = parseClientState7(result?.clientStateJson);
|
|
6515
6599
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
6516
|
-
const header = /* @__PURE__ */ (0,
|
|
6600
|
+
const header = /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
6517
6601
|
GameHeader,
|
|
6518
6602
|
{
|
|
6519
6603
|
title: gameTitle({ gameId: "matchday-predictor" }, ui.games.titles),
|
|
6520
6604
|
eyebrow: config ? t.eyebrow(config.homeTeam.name, config.awayTeam.name) : void 0,
|
|
6521
|
-
right: config ? /* @__PURE__ */ (0,
|
|
6605
|
+
right: config ? /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(Chip, { icon: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(IconLock, {}), children: ui.games.formatDayTime(config.kickoffUtc) }) : void 0,
|
|
6522
6606
|
onBack,
|
|
6523
6607
|
backLabel: ui.back
|
|
6524
6608
|
}
|
|
@@ -6526,10 +6610,10 @@ function MatchdayPredictorGame({
|
|
|
6526
6610
|
if (alreadyPlayed && clientState) {
|
|
6527
6611
|
if (!clientState.graded) {
|
|
6528
6612
|
const scorer = config?.scorerPool.find((p) => p.playerId === clientState.predictedFirstScorerPlayerId) ?? null;
|
|
6529
|
-
return /* @__PURE__ */ (0,
|
|
6613
|
+
return /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
|
|
6530
6614
|
header,
|
|
6531
|
-
/* @__PURE__ */ (0,
|
|
6532
|
-
config && /* @__PURE__ */ (0,
|
|
6615
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-body", children: [
|
|
6616
|
+
config && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
6533
6617
|
ScoreCard,
|
|
6534
6618
|
{
|
|
6535
6619
|
home: config.homeTeam,
|
|
@@ -6539,7 +6623,7 @@ function MatchdayPredictorGame({
|
|
|
6539
6623
|
t
|
|
6540
6624
|
}
|
|
6541
6625
|
),
|
|
6542
|
-
/* @__PURE__ */ (0,
|
|
6626
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
6543
6627
|
ResultCard,
|
|
6544
6628
|
{
|
|
6545
6629
|
tone: "neutral",
|
|
@@ -6556,28 +6640,28 @@ function MatchdayPredictorGame({
|
|
|
6556
6640
|
}
|
|
6557
6641
|
)
|
|
6558
6642
|
] }),
|
|
6559
|
-
/* @__PURE__ */ (0,
|
|
6643
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(FooterBar, { children: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("p", { className: "ss-g-mp-fun", children: t.forFun }) })
|
|
6560
6644
|
] });
|
|
6561
6645
|
}
|
|
6562
6646
|
const r = clientState.result;
|
|
6563
|
-
return /* @__PURE__ */ (0,
|
|
6647
|
+
return /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
|
|
6564
6648
|
header,
|
|
6565
|
-
/* @__PURE__ */ (0,
|
|
6566
|
-
config && /* @__PURE__ */ (0,
|
|
6567
|
-
/* @__PURE__ */ (0,
|
|
6568
|
-
/* @__PURE__ */ (0,
|
|
6569
|
-
/* @__PURE__ */ (0,
|
|
6570
|
-
/* @__PURE__ */ (0,
|
|
6571
|
-
!clientState.firstScorerVoid && /* @__PURE__ */ (0,
|
|
6649
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-body", children: [
|
|
6650
|
+
config && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(ScoreCard, { home: config.homeTeam, away: config.awayTeam, h: r.homeScore, a: r.awayScore, t }),
|
|
6651
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(ResultCard, { tone: "neutral", title: t.fullTime(r.homeScore, r.awayScore), onBack, ui }),
|
|
6652
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("ul", { className: "ss-g-mp-rows", children: [
|
|
6653
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(OutcomeRow, { label: t.exactScore, ok: clientState.exactScoreCorrect, t }),
|
|
6654
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(OutcomeRow, { label: t.outcome, ok: clientState.outcomeCorrect, t }),
|
|
6655
|
+
!clientState.firstScorerVoid && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(OutcomeRow, { label: t.firstScorerRow, ok: clientState.firstScorerCorrect, detail: r.firstScorerName, t })
|
|
6572
6656
|
] })
|
|
6573
6657
|
] }),
|
|
6574
|
-
/* @__PURE__ */ (0,
|
|
6658
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(FooterBar, { children: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("p", { className: "ss-g-mp-fun", children: t.forFun }) })
|
|
6575
6659
|
] });
|
|
6576
6660
|
}
|
|
6577
6661
|
if (!config) {
|
|
6578
|
-
return /* @__PURE__ */ (0,
|
|
6662
|
+
return /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
|
|
6579
6663
|
header,
|
|
6580
|
-
/* @__PURE__ */ (0,
|
|
6664
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
6581
6665
|
] });
|
|
6582
6666
|
}
|
|
6583
6667
|
const locked = isLocked(config.kickoffUtc);
|
|
@@ -6601,10 +6685,10 @@ function MatchdayPredictorGame({
|
|
|
6601
6685
|
const showSearch = pool.length > SCORER_SEARCH_THRESHOLD;
|
|
6602
6686
|
const q = query.trim().toLowerCase();
|
|
6603
6687
|
const visible = showSearch && q ? pool.filter((p) => p.playerName.toLowerCase().includes(q)) : pool;
|
|
6604
|
-
return /* @__PURE__ */ (0,
|
|
6688
|
+
return /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
|
|
6605
6689
|
header,
|
|
6606
|
-
/* @__PURE__ */ (0,
|
|
6607
|
-
/* @__PURE__ */ (0,
|
|
6690
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-body", children: [
|
|
6691
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
6608
6692
|
ScoreCard,
|
|
6609
6693
|
{
|
|
6610
6694
|
home: config.homeTeam,
|
|
@@ -6615,12 +6699,12 @@ function MatchdayPredictorGame({
|
|
|
6615
6699
|
edit: { disabled, active: lastEdited, onStep: step }
|
|
6616
6700
|
}
|
|
6617
6701
|
),
|
|
6618
|
-
pool.length > 0 && /* @__PURE__ */ (0,
|
|
6619
|
-
/* @__PURE__ */ (0,
|
|
6620
|
-
/* @__PURE__ */ (0,
|
|
6621
|
-
/* @__PURE__ */ (0,
|
|
6702
|
+
pool.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("section", { className: "ss-g-mp-scorer", children: [
|
|
6703
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "ss-g-mp-sec-head", children: [
|
|
6704
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("h3", { children: t.firstScorer }),
|
|
6705
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { children: t.optional })
|
|
6622
6706
|
] }),
|
|
6623
|
-
showSearch && /* @__PURE__ */ (0,
|
|
6707
|
+
showSearch && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
6624
6708
|
SearchField,
|
|
6625
6709
|
{
|
|
6626
6710
|
id: searchId,
|
|
@@ -6632,9 +6716,9 @@ function MatchdayPredictorGame({
|
|
|
6632
6716
|
disabled
|
|
6633
6717
|
}
|
|
6634
6718
|
),
|
|
6635
|
-
/* @__PURE__ */ (0,
|
|
6719
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("div", { className: "ss-g-mp-grid", children: visible.map((p) => {
|
|
6636
6720
|
const selected = firstScorerPlayerId === p.playerId;
|
|
6637
|
-
return /* @__PURE__ */ (0,
|
|
6721
|
+
return /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)(
|
|
6638
6722
|
"button",
|
|
6639
6723
|
{
|
|
6640
6724
|
type: "button",
|
|
@@ -6644,15 +6728,15 @@ function MatchdayPredictorGame({
|
|
|
6644
6728
|
disabled,
|
|
6645
6729
|
onClick: () => setFirstScorerPlayerId((id) => id === p.playerId ? null : p.playerId),
|
|
6646
6730
|
children: [
|
|
6647
|
-
selected && /* @__PURE__ */ (0,
|
|
6648
|
-
/* @__PURE__ */ (0,
|
|
6649
|
-
/* @__PURE__ */ (0,
|
|
6731
|
+
selected && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "ss-g-mp-pcheck", children: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(IconCheck, { size: 12 }) }),
|
|
6732
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(Silhouette, { size: 52, variant: selected ? "selected" : "default" }),
|
|
6733
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "ss-g-mp-pname", children: splitName(p.playerName).last })
|
|
6650
6734
|
]
|
|
6651
6735
|
},
|
|
6652
6736
|
p.playerId
|
|
6653
6737
|
);
|
|
6654
6738
|
}) }),
|
|
6655
|
-
/* @__PURE__ */ (0,
|
|
6739
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsxs)(
|
|
6656
6740
|
"button",
|
|
6657
6741
|
{
|
|
6658
6742
|
type: "button",
|
|
@@ -6661,24 +6745,24 @@ function MatchdayPredictorGame({
|
|
|
6661
6745
|
disabled,
|
|
6662
6746
|
onClick: () => setFirstScorerPlayerId(null),
|
|
6663
6747
|
children: [
|
|
6664
|
-
/* @__PURE__ */ (0,
|
|
6748
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "ss-g-mp-radio", "aria-hidden": "true" }),
|
|
6665
6749
|
t.noScorer
|
|
6666
6750
|
]
|
|
6667
6751
|
}
|
|
6668
6752
|
)
|
|
6669
6753
|
] }),
|
|
6670
|
-
locked && /* @__PURE__ */ (0,
|
|
6754
|
+
locked && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("p", { className: "ss-g-mp-closed", children: t.closed })
|
|
6671
6755
|
] }),
|
|
6672
|
-
/* @__PURE__ */ (0,
|
|
6673
|
-
/* @__PURE__ */ (0,
|
|
6674
|
-
/* @__PURE__ */ (0,
|
|
6756
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsxs)(FooterBar, { children: [
|
|
6757
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(GameButton, { variant: "primary", block: true, disabled, onClick: handleSubmit, children: submitting ? t.saving : t.save }),
|
|
6758
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("p", { className: "ss-g-mp-fun", children: t.forFun })
|
|
6675
6759
|
] })
|
|
6676
6760
|
] });
|
|
6677
6761
|
}
|
|
6678
6762
|
|
|
6679
6763
|
// src/components/games/StartingXiGame.tsx
|
|
6680
|
-
var
|
|
6681
|
-
var
|
|
6764
|
+
var import_react40 = require("react");
|
|
6765
|
+
var import_jsx_runtime77 = require("react/jsx-runtime");
|
|
6682
6766
|
var POINTS_PER_STARTER = 8;
|
|
6683
6767
|
var XI_SIZE = 11;
|
|
6684
6768
|
var DEFAULT_FORMATION = "4-3-3";
|
|
@@ -6721,26 +6805,26 @@ function StartingXiGame({
|
|
|
6721
6805
|
lockAtUtc
|
|
6722
6806
|
}) {
|
|
6723
6807
|
const t = ui.games.startingXi;
|
|
6724
|
-
const [slotPlayers, setSlotPlayers] = (0,
|
|
6725
|
-
const [active, setActive] = (0,
|
|
6726
|
-
const [query, setQuery] = (0,
|
|
6727
|
-
const searchId = (0,
|
|
6808
|
+
const [slotPlayers, setSlotPlayers] = (0, import_react40.useState)(() => Array(XI_SIZE).fill(null));
|
|
6809
|
+
const [active, setActive] = (0, import_react40.useState)(0);
|
|
6810
|
+
const [query, setQuery] = (0, import_react40.useState)("");
|
|
6811
|
+
const searchId = (0, import_react40.useId)();
|
|
6728
6812
|
const clientState = parseClientState8(result?.clientStateJson);
|
|
6729
6813
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
6730
|
-
const header = /* @__PURE__ */ (0,
|
|
6814
|
+
const header = /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
6731
6815
|
GameHeader,
|
|
6732
6816
|
{
|
|
6733
6817
|
title: gameTitle({ gameId: "starting-xi" }, ui.games.titles),
|
|
6734
6818
|
eyebrow: t.eyebrow,
|
|
6735
|
-
right: /* @__PURE__ */ (0,
|
|
6819
|
+
right: /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Chip, { variant: "accent", children: t.perStarter(POINTS_PER_STARTER) }),
|
|
6736
6820
|
onBack,
|
|
6737
6821
|
backLabel: ui.back
|
|
6738
6822
|
}
|
|
6739
6823
|
);
|
|
6740
6824
|
function statusScreen(title, score) {
|
|
6741
|
-
return /* @__PURE__ */ (0,
|
|
6825
|
+
return /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
|
|
6742
6826
|
header,
|
|
6743
|
-
/* @__PURE__ */ (0,
|
|
6827
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("div", { className: "ss-g-body", children: /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(ResultCard, { tone: "neutral", title, score, onBack, ui }) })
|
|
6744
6828
|
] });
|
|
6745
6829
|
}
|
|
6746
6830
|
if (alreadyPlayed) {
|
|
@@ -6749,9 +6833,9 @@ function StartingXiGame({
|
|
|
6749
6833
|
if (clientState.status === "graded") return statusScreen(t.gradedLine(clientState.correctCount), clientState.score);
|
|
6750
6834
|
}
|
|
6751
6835
|
if (!config) {
|
|
6752
|
-
return /* @__PURE__ */ (0,
|
|
6836
|
+
return /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
|
|
6753
6837
|
header,
|
|
6754
|
-
/* @__PURE__ */ (0,
|
|
6838
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
6755
6839
|
] });
|
|
6756
6840
|
}
|
|
6757
6841
|
const { formation, slots } = formationSlots(config.formation);
|
|
@@ -6786,27 +6870,27 @@ function StartingXiGame({
|
|
|
6786
6870
|
onSubmit(JSON.stringify({ predictedPlayerIds: slotPlayers }));
|
|
6787
6871
|
}
|
|
6788
6872
|
const segments = slotPlayers.map((p) => p !== null ? "current" : "todo");
|
|
6789
|
-
return /* @__PURE__ */ (0,
|
|
6873
|
+
return /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
|
|
6790
6874
|
header,
|
|
6791
|
-
/* @__PURE__ */ (0,
|
|
6875
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
6792
6876
|
SegmentProgress,
|
|
6793
6877
|
{
|
|
6794
6878
|
segments,
|
|
6795
6879
|
ariaLabel: t.picked(pickedCount),
|
|
6796
6880
|
leftLabel: t.picked(pickedCount),
|
|
6797
6881
|
rightLabel: t.toGo(XI_SIZE - pickedCount),
|
|
6798
|
-
right: /* @__PURE__ */ (0,
|
|
6882
|
+
right: /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Chip, { children: formation })
|
|
6799
6883
|
}
|
|
6800
6884
|
),
|
|
6801
|
-
/* @__PURE__ */ (0,
|
|
6802
|
-
/* @__PURE__ */ (0,
|
|
6803
|
-
/* @__PURE__ */ (0,
|
|
6885
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "ss-g-body", children: [
|
|
6886
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "ss-g-xi-pitch", children: [
|
|
6887
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(PitchSvg, { variant: "half" }),
|
|
6804
6888
|
slots.map((s) => {
|
|
6805
6889
|
const playerId = slotPlayers[s.index] ?? null;
|
|
6806
6890
|
const player = playerId !== null ? byId.get(playerId) ?? null : null;
|
|
6807
6891
|
const name = player?.playerName ?? "";
|
|
6808
6892
|
const state = player ? "filled" : active === s.index ? "active" : "empty";
|
|
6809
|
-
return /* @__PURE__ */ (0,
|
|
6893
|
+
return /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)(
|
|
6810
6894
|
"button",
|
|
6811
6895
|
{
|
|
6812
6896
|
type: "button",
|
|
@@ -6818,21 +6902,21 @@ function StartingXiGame({
|
|
|
6818
6902
|
disabled: submitting,
|
|
6819
6903
|
onClick: () => tapSlot(s.index),
|
|
6820
6904
|
children: [
|
|
6821
|
-
/* @__PURE__ */ (0,
|
|
6822
|
-
/* @__PURE__ */ (0,
|
|
6905
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("span", { className: "ss-g-xi-ring", "aria-hidden": "true", children: player ? player.jerseyNumber ?? "" : /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(IconPlus, { size: 18 }) }),
|
|
6906
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("span", { className: "ss-g-xi-tag", "aria-hidden": "true", children: player ? splitName(name).last : s.label })
|
|
6823
6907
|
]
|
|
6824
6908
|
},
|
|
6825
6909
|
s.index
|
|
6826
6910
|
);
|
|
6827
6911
|
})
|
|
6828
6912
|
] }),
|
|
6829
|
-
/* @__PURE__ */ (0,
|
|
6830
|
-
/* @__PURE__ */ (0,
|
|
6831
|
-
/* @__PURE__ */ (0,
|
|
6832
|
-
/* @__PURE__ */ (0,
|
|
6833
|
-
] }) : /* @__PURE__ */ (0,
|
|
6834
|
-
activeSlot && /* @__PURE__ */ (0,
|
|
6835
|
-
/* @__PURE__ */ (0,
|
|
6913
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "ss-g-xi-picker", children: [
|
|
6914
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("div", { className: "ss-g-xi-picker-head", children: activeSlot ? /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)(import_jsx_runtime77.Fragment, { children: [
|
|
6915
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Chip, { variant: "badge", children: activeSlot.label }),
|
|
6916
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("strong", { children: t.pickFor(activeSlot.label) })
|
|
6917
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime77.jsx)("strong", { children: t.allPicked }) }),
|
|
6918
|
+
activeSlot && /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)(import_jsx_runtime77.Fragment, { children: [
|
|
6919
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
6836
6920
|
SearchField,
|
|
6837
6921
|
{
|
|
6838
6922
|
id: searchId,
|
|
@@ -6844,18 +6928,18 @@ function StartingXiGame({
|
|
|
6844
6928
|
disabled: submitting
|
|
6845
6929
|
}
|
|
6846
6930
|
),
|
|
6847
|
-
/* @__PURE__ */ (0,
|
|
6848
|
-
/* @__PURE__ */ (0,
|
|
6849
|
-
/* @__PURE__ */ (0,
|
|
6850
|
-
/* @__PURE__ */ (0,
|
|
6931
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("ul", { className: "ss-g-xi-list", children: available.map((p) => /* @__PURE__ */ (0, import_jsx_runtime77.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("button", { type: "button", className: "ss-g-xi-opt", disabled: submitting, onClick: () => pick(p.playerId), children: [
|
|
6932
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("span", { className: "ss-g-xi-opt-no", "aria-hidden": "true", children: p.jerseyNumber ?? "" }),
|
|
6933
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("span", { className: "ss-g-xi-opt-name", children: p.playerName }),
|
|
6934
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("span", { className: "ss-g-xi-opt-pos", children: p.positionName })
|
|
6851
6935
|
] }) }, p.playerId)) })
|
|
6852
6936
|
] })
|
|
6853
6937
|
] })
|
|
6854
6938
|
] }),
|
|
6855
|
-
/* @__PURE__ */ (0,
|
|
6856
|
-
/* @__PURE__ */ (0,
|
|
6857
|
-
/* @__PURE__ */ (0,
|
|
6858
|
-
/* @__PURE__ */ (0,
|
|
6939
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)(FooterBar, { children: [
|
|
6940
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(GameButton, { variant: "primary", block: true, disabled: !canSubmit, onClick: handleSubmit, children: submitting ? t.submitting : t.submit }),
|
|
6941
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("p", { className: "ss-g-xi-lock", children: [
|
|
6942
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(IconLock, {}),
|
|
6859
6943
|
lockAtUtc ? t.locksAt(ui.games.formatDayTime(lockAtUtc)) : t.locksSoon
|
|
6860
6944
|
] })
|
|
6861
6945
|
] })
|
|
@@ -6863,8 +6947,8 @@ function StartingXiGame({
|
|
|
6863
6947
|
}
|
|
6864
6948
|
|
|
6865
6949
|
// src/components/games/StatLadderGame.tsx
|
|
6866
|
-
var
|
|
6867
|
-
var
|
|
6950
|
+
var import_react41 = require("react");
|
|
6951
|
+
var import_jsx_runtime78 = require("react/jsx-runtime");
|
|
6868
6952
|
function ladderClue(ladder) {
|
|
6869
6953
|
const mystery = ladder.find((r) => r.rank === 2);
|
|
6870
6954
|
if (!mystery) return null;
|
|
@@ -6886,9 +6970,9 @@ function parseClientState9(json) {
|
|
|
6886
6970
|
}
|
|
6887
6971
|
function NameStack({ name }) {
|
|
6888
6972
|
const { first, last } = splitName(name);
|
|
6889
|
-
return /* @__PURE__ */ (0,
|
|
6890
|
-
first && /* @__PURE__ */ (0,
|
|
6891
|
-
/* @__PURE__ */ (0,
|
|
6973
|
+
return /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("span", { className: "ss-g-sl-name", children: [
|
|
6974
|
+
first && /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("small", { children: `${first[0]}.` }),
|
|
6975
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("b", { children: last })
|
|
6892
6976
|
] });
|
|
6893
6977
|
}
|
|
6894
6978
|
function StatLadderGame({
|
|
@@ -6900,16 +6984,16 @@ function StatLadderGame({
|
|
|
6900
6984
|
onBack
|
|
6901
6985
|
}) {
|
|
6902
6986
|
const t = ui.games.statLadder;
|
|
6903
|
-
const [query, setQuery] = (0,
|
|
6904
|
-
const [selectedId, setSelectedId] = (0,
|
|
6905
|
-
const searchId = (0,
|
|
6987
|
+
const [query, setQuery] = (0, import_react41.useState)("");
|
|
6988
|
+
const [selectedId, setSelectedId] = (0, import_react41.useState)(null);
|
|
6989
|
+
const searchId = (0, import_react41.useId)();
|
|
6906
6990
|
const clientState = parseClientState9(result?.clientStateJson);
|
|
6907
6991
|
const revealed = clientState != null;
|
|
6908
|
-
const header = /* @__PURE__ */ (0,
|
|
6992
|
+
const header = /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(GameHeader, { title: gameTitle({ gameId: "stat-ladder" }, ui.games.titles), eyebrow: t.eyebrow, onBack, backLabel: ui.back });
|
|
6909
6993
|
if (!config) {
|
|
6910
|
-
return /* @__PURE__ */ (0,
|
|
6994
|
+
return /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-stat-ladder", children: [
|
|
6911
6995
|
header,
|
|
6912
|
-
/* @__PURE__ */ (0,
|
|
6996
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
6913
6997
|
] });
|
|
6914
6998
|
}
|
|
6915
6999
|
const question = t.question(config.statLabel);
|
|
@@ -6921,44 +7005,44 @@ function StatLadderGame({
|
|
|
6921
7005
|
if (selectedId === null || submitting || revealed) return;
|
|
6922
7006
|
onSubmit(JSON.stringify({ guessedPlayerId: selectedId }));
|
|
6923
7007
|
}
|
|
6924
|
-
return /* @__PURE__ */ (0,
|
|
7008
|
+
return /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-stat-ladder", children: [
|
|
6925
7009
|
header,
|
|
6926
|
-
/* @__PURE__ */ (0,
|
|
6927
|
-
/* @__PURE__ */ (0,
|
|
6928
|
-
/* @__PURE__ */ (0,
|
|
6929
|
-
/* @__PURE__ */ (0,
|
|
7010
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "ss-g-body", children: [
|
|
7011
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "ss-g-sl-prompt", children: [
|
|
7012
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(Chip, { variant: "accent", icon: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(IconShield, { size: 14 }), className: "ss-g-sl-stat", children: config.statLabel }),
|
|
7013
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("h3", { className: "ss-g-sl-q", children: [
|
|
6930
7014
|
question.pre,
|
|
6931
|
-
/* @__PURE__ */ (0,
|
|
7015
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("em", { children: question.emph }),
|
|
6932
7016
|
question.post
|
|
6933
7017
|
] })
|
|
6934
7018
|
] }),
|
|
6935
|
-
/* @__PURE__ */ (0,
|
|
6936
|
-
(rung) => rung.rank === 2 ? /* @__PURE__ */ (0,
|
|
7019
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("ol", { className: "ss-g-sl-rungs", children: rungs.map(
|
|
7020
|
+
(rung) => rung.rank === 2 ? /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)(
|
|
6937
7021
|
"li",
|
|
6938
7022
|
{
|
|
6939
7023
|
className: "ss-g-sl-rung ss-g-sl-rung--mystery",
|
|
6940
7024
|
"data-testid": "sl-mystery-rung",
|
|
6941
7025
|
"data-result": revealed ? clientState.isCorrect ? "correct" : "wrong" : void 0,
|
|
6942
7026
|
children: [
|
|
6943
|
-
/* @__PURE__ */ (0,
|
|
6944
|
-
revealed ? /* @__PURE__ */ (0,
|
|
6945
|
-
revealed ? /* @__PURE__ */ (0,
|
|
6946
|
-
/* @__PURE__ */ (0,
|
|
7027
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "ss-g-sl-rank", children: "2" }),
|
|
7028
|
+
revealed ? /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(PlayerAvatar, { name: clientState.revealedRank2.playerName, className: "ss-g-sl-av" }) : /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(Silhouette, { size: 52, variant: "mystery" }),
|
|
7029
|
+
revealed ? /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(NameStack, { name: clientState.revealedRank2.playerName }) : /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "ss-g-sl-who", children: t.whoSecond }),
|
|
7030
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "ss-g-sl-val ss-g-sl-val--mystery", children: rung.statValue })
|
|
6947
7031
|
]
|
|
6948
7032
|
},
|
|
6949
7033
|
rung.rank
|
|
6950
|
-
) : /* @__PURE__ */ (0,
|
|
6951
|
-
/* @__PURE__ */ (0,
|
|
6952
|
-
/* @__PURE__ */ (0,
|
|
6953
|
-
/* @__PURE__ */ (0,
|
|
6954
|
-
/* @__PURE__ */ (0,
|
|
7034
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("li", { className: "ss-g-sl-rung", children: [
|
|
7035
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "ss-g-sl-rank", children: rung.rank }),
|
|
7036
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(PlayerAvatar, { name: rung.playerName ?? "?", className: "ss-g-sl-av" }),
|
|
7037
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(NameStack, { name: rung.playerName ?? "?" }),
|
|
7038
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "ss-g-sl-val", children: rung.statValue })
|
|
6955
7039
|
] }, rung.rank)
|
|
6956
7040
|
) }),
|
|
6957
|
-
clue && /* @__PURE__ */ (0,
|
|
6958
|
-
/* @__PURE__ */ (0,
|
|
6959
|
-
/* @__PURE__ */ (0,
|
|
7041
|
+
clue && /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("p", { className: "ss-g-sl-clue", children: [
|
|
7042
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(IconBulb, {}),
|
|
7043
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { children: t.clue(clue, config.statLabel) })
|
|
6960
7044
|
] }),
|
|
6961
|
-
!revealed && /* @__PURE__ */ (0,
|
|
7045
|
+
!revealed && /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("ul", { className: "ss-g-sl-pool", children: pool.map((p) => /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)(
|
|
6962
7046
|
"button",
|
|
6963
7047
|
{
|
|
6964
7048
|
type: "button",
|
|
@@ -6971,13 +7055,13 @@ function StatLadderGame({
|
|
|
6971
7055
|
setQuery(p.playerName);
|
|
6972
7056
|
},
|
|
6973
7057
|
children: [
|
|
6974
|
-
/* @__PURE__ */ (0,
|
|
6975
|
-
/* @__PURE__ */ (0,
|
|
6976
|
-
selectedId === p.playerId && /* @__PURE__ */ (0,
|
|
7058
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(PlayerAvatar, { name: p.playerName, className: "ss-g-sl-opt-av" }),
|
|
7059
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "ss-g-sl-opt-name", children: p.playerName }),
|
|
7060
|
+
selectedId === p.playerId && /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(IconCheck, {})
|
|
6977
7061
|
]
|
|
6978
7062
|
}
|
|
6979
7063
|
) }, p.playerId)) }),
|
|
6980
|
-
revealed && /* @__PURE__ */ (0,
|
|
7064
|
+
revealed && /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
|
|
6981
7065
|
ResultCard,
|
|
6982
7066
|
{
|
|
6983
7067
|
tone: clientState.isCorrect ? "win" : "lose",
|
|
@@ -6988,8 +7072,8 @@ function StatLadderGame({
|
|
|
6988
7072
|
}
|
|
6989
7073
|
)
|
|
6990
7074
|
] }),
|
|
6991
|
-
!revealed && /* @__PURE__ */ (0,
|
|
6992
|
-
/* @__PURE__ */ (0,
|
|
7075
|
+
!revealed && /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(FooterBar, { children: /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "ss-g-sl-guess", children: [
|
|
7076
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
|
|
6993
7077
|
SearchField,
|
|
6994
7078
|
{
|
|
6995
7079
|
id: searchId,
|
|
@@ -7004,13 +7088,13 @@ function StatLadderGame({
|
|
|
7004
7088
|
disabled: submitting
|
|
7005
7089
|
}
|
|
7006
7090
|
),
|
|
7007
|
-
/* @__PURE__ */ (0,
|
|
7091
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(GameButton, { variant: "primary", disabled: selectedId === null || submitting, onClick: guess, children: t.guess })
|
|
7008
7092
|
] }) })
|
|
7009
7093
|
] });
|
|
7010
7094
|
}
|
|
7011
7095
|
|
|
7012
7096
|
// src/components/games/FanMotmGame.tsx
|
|
7013
|
-
var
|
|
7097
|
+
var import_jsx_runtime79 = require("react/jsx-runtime");
|
|
7014
7098
|
function parseClientState10(json) {
|
|
7015
7099
|
if (!json) return null;
|
|
7016
7100
|
try {
|
|
@@ -7031,20 +7115,20 @@ function FanMotmGame({
|
|
|
7031
7115
|
const clientState = parseClientState10(result?.clientStateJson);
|
|
7032
7116
|
const alreadyVoted = result?.alreadyPlayed === true;
|
|
7033
7117
|
const pickedId = clientState?.pickedPlayerId ?? null;
|
|
7034
|
-
const header = /* @__PURE__ */ (0,
|
|
7118
|
+
const header = /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
|
|
7035
7119
|
GameHeader,
|
|
7036
7120
|
{
|
|
7037
7121
|
title: t.title,
|
|
7038
7122
|
eyebrow: t.eyebrow,
|
|
7039
|
-
right: alreadyVoted ? /* @__PURE__ */ (0,
|
|
7123
|
+
right: alreadyVoted ? /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Chip, { variant: "success", icon: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(IconCheck, {}), children: t.voted }) : void 0,
|
|
7040
7124
|
onBack,
|
|
7041
7125
|
backLabel: ui.back
|
|
7042
7126
|
}
|
|
7043
7127
|
);
|
|
7044
7128
|
if (!config) {
|
|
7045
|
-
return /* @__PURE__ */ (0,
|
|
7129
|
+
return /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-fan-motm", children: [
|
|
7046
7130
|
header,
|
|
7047
|
-
/* @__PURE__ */ (0,
|
|
7131
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
7048
7132
|
] });
|
|
7049
7133
|
}
|
|
7050
7134
|
const picked = config.candidates.find((c) => c.playerId === pickedId) ?? null;
|
|
@@ -7052,12 +7136,12 @@ function FanMotmGame({
|
|
|
7052
7136
|
if (alreadyVoted || submitting) return;
|
|
7053
7137
|
onSubmit(JSON.stringify({ pickedPlayerId: candidateId }));
|
|
7054
7138
|
}
|
|
7055
|
-
return /* @__PURE__ */ (0,
|
|
7139
|
+
return /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)("div", { className: "ss-g-screen", "data-testid": "game-screen-fan-motm", children: [
|
|
7056
7140
|
header,
|
|
7057
|
-
/* @__PURE__ */ (0,
|
|
7058
|
-
/* @__PURE__ */ (0,
|
|
7141
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsxs)("div", { className: "ss-g-body", children: [
|
|
7142
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)("ul", { className: "ss-g-motm-list", children: config.candidates.map((c) => {
|
|
7059
7143
|
const isVoted = alreadyVoted && pickedId === c.playerId;
|
|
7060
|
-
return /* @__PURE__ */ (0,
|
|
7144
|
+
return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(
|
|
7061
7145
|
"button",
|
|
7062
7146
|
{
|
|
7063
7147
|
type: "button",
|
|
@@ -7066,24 +7150,24 @@ function FanMotmGame({
|
|
|
7066
7150
|
disabled: alreadyVoted || submitting,
|
|
7067
7151
|
onClick: () => handleVote(c.playerId),
|
|
7068
7152
|
children: [
|
|
7069
|
-
/* @__PURE__ */ (0,
|
|
7070
|
-
/* @__PURE__ */ (0,
|
|
7071
|
-
isVoted && /* @__PURE__ */ (0,
|
|
7153
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)(PlayerAvatar, { name: c.playerName, className: "ss-g-motm-av" }),
|
|
7154
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)("span", { className: "ss-g-motm-name", children: c.playerName }),
|
|
7155
|
+
isVoted && /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(Chip, { variant: "accent", className: "ss-g-motm-pill", children: t.yourVote })
|
|
7072
7156
|
]
|
|
7073
7157
|
}
|
|
7074
7158
|
) }, c.playerId);
|
|
7075
7159
|
}) }),
|
|
7076
|
-
alreadyVoted && picked && /* @__PURE__ */ (0,
|
|
7160
|
+
alreadyVoted && picked && /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(ResultCard, { tone: "neutral", title: t.youVoted(picked.playerName), detail: t.thanks, onBack, ui })
|
|
7077
7161
|
] }),
|
|
7078
|
-
/* @__PURE__ */ (0,
|
|
7079
|
-
!alreadyVoted && /* @__PURE__ */ (0,
|
|
7080
|
-
/* @__PURE__ */ (0,
|
|
7162
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(FooterBar, { children: [
|
|
7163
|
+
!alreadyVoted && /* @__PURE__ */ (0, import_jsx_runtime79.jsx)("p", { className: "ss-g-motm-foot", children: t.tapToVote }),
|
|
7164
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)("p", { className: "ss-g-motm-fun", children: t.forFun })
|
|
7081
7165
|
] })
|
|
7082
7166
|
] });
|
|
7083
7167
|
}
|
|
7084
7168
|
|
|
7085
7169
|
// src/components/GameScreenHost.tsx
|
|
7086
|
-
var
|
|
7170
|
+
var import_jsx_runtime80 = require("react/jsx-runtime");
|
|
7087
7171
|
var FIXTURE_GAME_IDS = /* @__PURE__ */ new Set([
|
|
7088
7172
|
"matchday-predictor",
|
|
7089
7173
|
"starting-xi",
|
|
@@ -7107,8 +7191,8 @@ function GameScreenHost({
|
|
|
7107
7191
|
ui
|
|
7108
7192
|
}) {
|
|
7109
7193
|
const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
|
|
7110
|
-
const [configJson, setConfigJson] = (0,
|
|
7111
|
-
(0,
|
|
7194
|
+
const [configJson, setConfigJson] = (0, import_react42.useState)(null);
|
|
7195
|
+
(0, import_react42.useEffect)(() => {
|
|
7112
7196
|
setConfigJson(null);
|
|
7113
7197
|
if (!conversation) return;
|
|
7114
7198
|
let cancelled = false;
|
|
@@ -7131,12 +7215,12 @@ function GameScreenHost({
|
|
|
7131
7215
|
fixtureId: fixtureId || void 0,
|
|
7132
7216
|
locale: ui.games.lang
|
|
7133
7217
|
});
|
|
7134
|
-
(0,
|
|
7218
|
+
(0, import_react42.useEffect)(() => {
|
|
7135
7219
|
if (conversation) hydrate();
|
|
7136
7220
|
}, [conversation, gameId]);
|
|
7137
|
-
const hydrateRef = (0,
|
|
7221
|
+
const hydrateRef = (0, import_react42.useRef)(hydrate);
|
|
7138
7222
|
hydrateRef.current = hydrate;
|
|
7139
|
-
(0,
|
|
7223
|
+
(0, import_react42.useEffect)(() => {
|
|
7140
7224
|
if (!FIXTURE_GAME_IDS.has(gameId)) return;
|
|
7141
7225
|
if (rawStatus !== "pending") return;
|
|
7142
7226
|
const timerId = setInterval(() => {
|
|
@@ -7159,7 +7243,7 @@ function GameScreenHost({
|
|
|
7159
7243
|
function renderScreen() {
|
|
7160
7244
|
switch (gameId) {
|
|
7161
7245
|
case "mystery-tiger":
|
|
7162
|
-
return /* @__PURE__ */ (0,
|
|
7246
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
7163
7247
|
MysteryTigerGame,
|
|
7164
7248
|
{
|
|
7165
7249
|
...sharedProps,
|
|
@@ -7167,7 +7251,7 @@ function GameScreenHost({
|
|
|
7167
7251
|
}
|
|
7168
7252
|
);
|
|
7169
7253
|
case "higher-or-lower":
|
|
7170
|
-
return /* @__PURE__ */ (0,
|
|
7254
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
7171
7255
|
HigherOrLowerGame,
|
|
7172
7256
|
{
|
|
7173
7257
|
...sharedProps,
|
|
@@ -7175,7 +7259,7 @@ function GameScreenHost({
|
|
|
7175
7259
|
}
|
|
7176
7260
|
);
|
|
7177
7261
|
case "career-path":
|
|
7178
|
-
return /* @__PURE__ */ (0,
|
|
7262
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
7179
7263
|
CareerPathGame,
|
|
7180
7264
|
{
|
|
7181
7265
|
...sharedProps,
|
|
@@ -7184,7 +7268,7 @@ function GameScreenHost({
|
|
|
7184
7268
|
);
|
|
7185
7269
|
case "beat-the-grid": {
|
|
7186
7270
|
const btgConfig = safeParseConfig(configJson);
|
|
7187
|
-
return /* @__PURE__ */ (0,
|
|
7271
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
7188
7272
|
BeatTheGridGame,
|
|
7189
7273
|
{
|
|
7190
7274
|
...sharedProps,
|
|
@@ -7194,7 +7278,7 @@ function GameScreenHost({
|
|
|
7194
7278
|
);
|
|
7195
7279
|
}
|
|
7196
7280
|
case "guess-the-xi":
|
|
7197
|
-
return /* @__PURE__ */ (0,
|
|
7281
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
7198
7282
|
GuessTheXiGame,
|
|
7199
7283
|
{
|
|
7200
7284
|
...sharedProps,
|
|
@@ -7202,7 +7286,7 @@ function GameScreenHost({
|
|
|
7202
7286
|
}
|
|
7203
7287
|
);
|
|
7204
7288
|
case "daily-quiz":
|
|
7205
|
-
return /* @__PURE__ */ (0,
|
|
7289
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
7206
7290
|
DailyQuizGame,
|
|
7207
7291
|
{
|
|
7208
7292
|
...sharedProps,
|
|
@@ -7210,7 +7294,7 @@ function GameScreenHost({
|
|
|
7210
7294
|
}
|
|
7211
7295
|
);
|
|
7212
7296
|
case "matchday-predictor":
|
|
7213
|
-
return /* @__PURE__ */ (0,
|
|
7297
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
7214
7298
|
MatchdayPredictorGame,
|
|
7215
7299
|
{
|
|
7216
7300
|
...sharedProps,
|
|
@@ -7218,7 +7302,7 @@ function GameScreenHost({
|
|
|
7218
7302
|
}
|
|
7219
7303
|
);
|
|
7220
7304
|
case "starting-xi":
|
|
7221
|
-
return /* @__PURE__ */ (0,
|
|
7305
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
7222
7306
|
StartingXiGame,
|
|
7223
7307
|
{
|
|
7224
7308
|
...sharedProps,
|
|
@@ -7226,7 +7310,7 @@ function GameScreenHost({
|
|
|
7226
7310
|
}
|
|
7227
7311
|
);
|
|
7228
7312
|
case "stat-ladder":
|
|
7229
|
-
return /* @__PURE__ */ (0,
|
|
7313
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
7230
7314
|
StatLadderGame,
|
|
7231
7315
|
{
|
|
7232
7316
|
...sharedProps,
|
|
@@ -7234,7 +7318,7 @@ function GameScreenHost({
|
|
|
7234
7318
|
}
|
|
7235
7319
|
);
|
|
7236
7320
|
case "fan-motm":
|
|
7237
|
-
return /* @__PURE__ */ (0,
|
|
7321
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
7238
7322
|
FanMotmGame,
|
|
7239
7323
|
{
|
|
7240
7324
|
...sharedProps,
|
|
@@ -7242,10 +7326,10 @@ function GameScreenHost({
|
|
|
7242
7326
|
}
|
|
7243
7327
|
);
|
|
7244
7328
|
default:
|
|
7245
|
-
return /* @__PURE__ */ (0,
|
|
7329
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "ss-g-screen", "data-testid": `game-screen-${gameId}`, children: /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(GameHeader, { title: gameTitle({ gameId }, ui.games.titles), onBack, backLabel: ui.back }) });
|
|
7246
7330
|
}
|
|
7247
7331
|
}
|
|
7248
|
-
return /* @__PURE__ */ (0,
|
|
7332
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "ss-w-gscreen", "data-testid": "gscreen", "data-lock-at": lockAtUtc ?? void 0, children: renderScreen() });
|
|
7249
7333
|
}
|
|
7250
7334
|
|
|
7251
7335
|
// src/components/games/ui/fonts.ts
|
|
@@ -7262,7 +7346,7 @@ function ensureGamesFonts(doc = document) {
|
|
|
7262
7346
|
}
|
|
7263
7347
|
|
|
7264
7348
|
// src/components/GamesPanel.tsx
|
|
7265
|
-
var
|
|
7349
|
+
var import_jsx_runtime81 = require("react/jsx-runtime");
|
|
7266
7350
|
function GamesPanel({
|
|
7267
7351
|
loggedIn,
|
|
7268
7352
|
games,
|
|
@@ -7271,13 +7355,13 @@ function GamesPanel({
|
|
|
7271
7355
|
leaderboard,
|
|
7272
7356
|
refreshHub
|
|
7273
7357
|
}) {
|
|
7274
|
-
const [selected, setSelected] = (0,
|
|
7275
|
-
(0,
|
|
7358
|
+
const [selected, setSelected] = (0, import_react43.useState)(null);
|
|
7359
|
+
(0, import_react43.useEffect)(() => {
|
|
7276
7360
|
ensureGamesFonts();
|
|
7277
7361
|
}, []);
|
|
7278
|
-
if (!loggedIn) return /* @__PURE__ */ (0,
|
|
7362
|
+
if (!loggedIn) return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(GamesLoginWall, { ui });
|
|
7279
7363
|
if (selected !== null) {
|
|
7280
|
-
return /* @__PURE__ */ (0,
|
|
7364
|
+
return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
7281
7365
|
GameScreenHost,
|
|
7282
7366
|
{
|
|
7283
7367
|
selected,
|
|
@@ -7291,7 +7375,7 @@ function GamesPanel({
|
|
|
7291
7375
|
}
|
|
7292
7376
|
) });
|
|
7293
7377
|
}
|
|
7294
|
-
return /* @__PURE__ */ (0,
|
|
7378
|
+
return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("div", { className: "ss-g-hub-wrap", "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
7295
7379
|
GamesHub,
|
|
7296
7380
|
{
|
|
7297
7381
|
games,
|
|
@@ -7303,10 +7387,10 @@ function GamesPanel({
|
|
|
7303
7387
|
}
|
|
7304
7388
|
|
|
7305
7389
|
// src/components/Leaderboard.tsx
|
|
7306
|
-
var
|
|
7390
|
+
var import_react44 = require("react");
|
|
7307
7391
|
|
|
7308
7392
|
// src/components/LeaderboardRow.tsx
|
|
7309
|
-
var
|
|
7393
|
+
var import_jsx_runtime82 = require("react/jsx-runtime");
|
|
7310
7394
|
function formatPoints(n) {
|
|
7311
7395
|
return n.toLocaleString("en");
|
|
7312
7396
|
}
|
|
@@ -7315,14 +7399,14 @@ function LeaderboardWeeklyRow({
|
|
|
7315
7399
|
isMe
|
|
7316
7400
|
}) {
|
|
7317
7401
|
const rankClass = `ss-w-lb2-rank${row.rank <= 3 ? " ss-w-lb2-rank--top3" : ""}`;
|
|
7318
|
-
return /* @__PURE__ */ (0,
|
|
7319
|
-
/* @__PURE__ */ (0,
|
|
7402
|
+
return /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
|
|
7403
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsxs)("span", { className: rankClass, children: [
|
|
7320
7404
|
"#",
|
|
7321
7405
|
row.rank
|
|
7322
7406
|
] }),
|
|
7323
|
-
/* @__PURE__ */ (0,
|
|
7324
|
-
/* @__PURE__ */ (0,
|
|
7325
|
-
row.currentStreak > 0 && /* @__PURE__ */ (0,
|
|
7407
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "ss-w-lb2-handle", children: row.handle }),
|
|
7408
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
|
|
7409
|
+
row.currentStreak > 0 && /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)("span", { className: "ss-w-lb2-streak", children: [
|
|
7326
7410
|
"\u{1F525} ",
|
|
7327
7411
|
row.currentStreak
|
|
7328
7412
|
] })
|
|
@@ -7333,18 +7417,18 @@ function LeaderboardAllTimeRow({
|
|
|
7333
7417
|
isMe
|
|
7334
7418
|
}) {
|
|
7335
7419
|
const rankClass = `ss-w-lb2-rank${row.rank <= 3 ? " ss-w-lb2-rank--top3" : ""}`;
|
|
7336
|
-
return /* @__PURE__ */ (0,
|
|
7337
|
-
/* @__PURE__ */ (0,
|
|
7420
|
+
return /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
|
|
7421
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsxs)("span", { className: rankClass, children: [
|
|
7338
7422
|
"#",
|
|
7339
7423
|
row.rank
|
|
7340
7424
|
] }),
|
|
7341
|
-
/* @__PURE__ */ (0,
|
|
7342
|
-
/* @__PURE__ */ (0,
|
|
7425
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "ss-w-lb2-handle", children: row.handle }),
|
|
7426
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
|
|
7343
7427
|
] });
|
|
7344
7428
|
}
|
|
7345
7429
|
|
|
7346
7430
|
// src/components/LeaderboardEmpty.tsx
|
|
7347
|
-
var
|
|
7431
|
+
var import_jsx_runtime83 = require("react/jsx-runtime");
|
|
7348
7432
|
function LeaderboardEmpty({
|
|
7349
7433
|
segment,
|
|
7350
7434
|
lastWeek,
|
|
@@ -7353,48 +7437,48 @@ function LeaderboardEmpty({
|
|
|
7353
7437
|
ui
|
|
7354
7438
|
}) {
|
|
7355
7439
|
if (segment === "alltime") {
|
|
7356
|
-
return /* @__PURE__ */ (0,
|
|
7357
|
-
/* @__PURE__ */ (0,
|
|
7358
|
-
/* @__PURE__ */ (0,
|
|
7440
|
+
return /* @__PURE__ */ (0, import_jsx_runtime83.jsxs)("div", { className: "ss-w-lb-empty ss-w-lb-empty--alltime", children: [
|
|
7441
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsx)("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
|
|
7442
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsx)("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
|
|
7359
7443
|
] });
|
|
7360
7444
|
}
|
|
7361
7445
|
const fresh = lastWeek != null;
|
|
7362
7446
|
const title = fresh ? ui.leaderboardEmptyFreshTitle : ui.leaderboardEmptyColdTitle;
|
|
7363
7447
|
const body = fresh ? ui.leaderboardEmptyFreshBody : ui.leaderboardEmptyColdBody;
|
|
7364
|
-
return /* @__PURE__ */ (0,
|
|
7365
|
-
weeklyPrize && /* @__PURE__ */ (0,
|
|
7366
|
-
/* @__PURE__ */ (0,
|
|
7367
|
-
/* @__PURE__ */ (0,
|
|
7448
|
+
return /* @__PURE__ */ (0, import_jsx_runtime83.jsxs)("div", { className: "ss-w-lb-empty", children: [
|
|
7449
|
+
weeklyPrize && /* @__PURE__ */ (0, import_jsx_runtime83.jsxs)("div", { className: "ss-w-prize", children: [
|
|
7450
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsx)("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
|
|
7451
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsx)("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ (0, import_jsx_runtime83.jsx)("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
|
|
7368
7452
|
] }),
|
|
7369
|
-
/* @__PURE__ */ (0,
|
|
7370
|
-
/* @__PURE__ */ (0,
|
|
7371
|
-
/* @__PURE__ */ (0,
|
|
7372
|
-
/* @__PURE__ */ (0,
|
|
7373
|
-
onPlay && /* @__PURE__ */ (0,
|
|
7453
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsxs)("div", { className: "ss-w-lb-empty-hero", children: [
|
|
7454
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsx)("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
|
|
7455
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsx)("h4", { className: "ss-w-lb-empty-title", children: title }),
|
|
7456
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsx)("p", { className: "ss-w-lb-empty-body", children: body }),
|
|
7457
|
+
onPlay && /* @__PURE__ */ (0, import_jsx_runtime83.jsx)("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
|
|
7374
7458
|
] }),
|
|
7375
|
-
fresh && lastWeek && /* @__PURE__ */ (0,
|
|
7376
|
-
/* @__PURE__ */ (0,
|
|
7377
|
-
/* @__PURE__ */ (0,
|
|
7378
|
-
/* @__PURE__ */ (0,
|
|
7379
|
-
/* @__PURE__ */ (0,
|
|
7459
|
+
fresh && lastWeek && /* @__PURE__ */ (0, import_jsx_runtime83.jsxs)("div", { className: "ss-w-lb-last", children: [
|
|
7460
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsx)("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
|
|
7461
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsx)("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
|
|
7462
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsx)("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
|
|
7463
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsx)("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
|
|
7380
7464
|
] })
|
|
7381
7465
|
] });
|
|
7382
7466
|
}
|
|
7383
7467
|
|
|
7384
7468
|
// src/components/Leaderboard.tsx
|
|
7385
|
-
var
|
|
7469
|
+
var import_jsx_runtime84 = require("react/jsx-runtime");
|
|
7386
7470
|
function Leaderboard({
|
|
7387
7471
|
data,
|
|
7388
7472
|
ui,
|
|
7389
7473
|
onPlay
|
|
7390
7474
|
}) {
|
|
7391
|
-
const [segment, setSegment] = (0,
|
|
7475
|
+
const [segment, setSegment] = (0, import_react44.useState)("weekly");
|
|
7392
7476
|
const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
|
|
7393
7477
|
const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
|
|
7394
7478
|
const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
|
|
7395
|
-
return /* @__PURE__ */ (0,
|
|
7396
|
-
/* @__PURE__ */ (0,
|
|
7397
|
-
/* @__PURE__ */ (0,
|
|
7479
|
+
return /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)("div", { className: "ss-w-lb2", children: [
|
|
7480
|
+
/* @__PURE__ */ (0, import_jsx_runtime84.jsxs)("div", { className: "ss-w-seg", children: [
|
|
7481
|
+
/* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
|
|
7398
7482
|
"button",
|
|
7399
7483
|
{
|
|
7400
7484
|
type: "button",
|
|
@@ -7404,7 +7488,7 @@ function Leaderboard({
|
|
|
7404
7488
|
children: ui.leaderboardThisWeek
|
|
7405
7489
|
}
|
|
7406
7490
|
),
|
|
7407
|
-
/* @__PURE__ */ (0,
|
|
7491
|
+
/* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
|
|
7408
7492
|
"button",
|
|
7409
7493
|
{
|
|
7410
7494
|
type: "button",
|
|
@@ -7415,7 +7499,7 @@ function Leaderboard({
|
|
|
7415
7499
|
}
|
|
7416
7500
|
)
|
|
7417
7501
|
] }),
|
|
7418
|
-
isEmpty ? /* @__PURE__ */ (0,
|
|
7502
|
+
isEmpty ? /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
|
|
7419
7503
|
LeaderboardEmpty,
|
|
7420
7504
|
{
|
|
7421
7505
|
segment,
|
|
@@ -7424,15 +7508,15 @@ function Leaderboard({
|
|
|
7424
7508
|
onPlay,
|
|
7425
7509
|
ui
|
|
7426
7510
|
}
|
|
7427
|
-
) : /* @__PURE__ */ (0,
|
|
7428
|
-
/* @__PURE__ */ (0,
|
|
7511
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)(import_jsx_runtime84.Fragment, { children: [
|
|
7512
|
+
/* @__PURE__ */ (0, import_jsx_runtime84.jsx)("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
|
|
7429
7513
|
LeaderboardWeeklyRow,
|
|
7430
7514
|
{
|
|
7431
7515
|
row,
|
|
7432
7516
|
isMe: row.operatorUserId === data.myWeeklyRow?.operatorUserId
|
|
7433
7517
|
},
|
|
7434
7518
|
row.operatorUserId
|
|
7435
|
-
)) : data.allTimeTop.map((row) => /* @__PURE__ */ (0,
|
|
7519
|
+
)) : data.allTimeTop.map((row) => /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
|
|
7436
7520
|
LeaderboardAllTimeRow,
|
|
7437
7521
|
{
|
|
7438
7522
|
row,
|
|
@@ -7440,18 +7524,18 @@ function Leaderboard({
|
|
|
7440
7524
|
},
|
|
7441
7525
|
row.operatorUserId
|
|
7442
7526
|
)) }),
|
|
7443
|
-
/* @__PURE__ */ (0,
|
|
7444
|
-
myRow != null && (offBoard ? /* @__PURE__ */ (0,
|
|
7445
|
-
segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ (0,
|
|
7446
|
-
segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ (0,
|
|
7527
|
+
/* @__PURE__ */ (0, import_jsx_runtime84.jsx)("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
|
|
7528
|
+
myRow != null && (offBoard ? /* @__PURE__ */ (0, import_jsx_runtime84.jsx)("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)("div", { className: "ss-w-lb2-rows", children: [
|
|
7529
|
+
segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
|
|
7530
|
+
segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
|
|
7447
7531
|
] })),
|
|
7448
|
-
segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ (0,
|
|
7532
|
+
segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ (0, import_jsx_runtime84.jsx)("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ (0, import_jsx_runtime84.jsx)("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ (0, import_jsx_runtime84.jsx)("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
|
|
7449
7533
|
] })
|
|
7450
7534
|
] });
|
|
7451
7535
|
}
|
|
7452
7536
|
|
|
7453
7537
|
// src/components/LeaderboardPanel.tsx
|
|
7454
|
-
var
|
|
7538
|
+
var import_jsx_runtime85 = require("react/jsx-runtime");
|
|
7455
7539
|
var EMPTY_PAYLOAD = {
|
|
7456
7540
|
week: "",
|
|
7457
7541
|
weeklyTop: [],
|
|
@@ -7462,17 +7546,17 @@ var EMPTY_PAYLOAD = {
|
|
|
7462
7546
|
lastWeek: null
|
|
7463
7547
|
};
|
|
7464
7548
|
function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
|
|
7465
|
-
if (!loggedIn) return /* @__PURE__ */ (0,
|
|
7466
|
-
if (data === null && loading) return /* @__PURE__ */ (0,
|
|
7467
|
-
return /* @__PURE__ */ (0,
|
|
7549
|
+
if (!loggedIn) return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(GamesLoginWall, { ui });
|
|
7550
|
+
if (data === null && loading) return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)("div", { className: "ss-w-mon-list" });
|
|
7551
|
+
return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
|
|
7468
7552
|
}
|
|
7469
7553
|
|
|
7470
7554
|
// src/components/ChatPanel.tsx
|
|
7471
|
-
var
|
|
7555
|
+
var import_jsx_runtime86 = require("react/jsx-runtime");
|
|
7472
7556
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
7473
7557
|
function useIsModal() {
|
|
7474
|
-
const [modal, setModal] = (0,
|
|
7475
|
-
(0,
|
|
7558
|
+
const [modal, setModal] = (0, import_react45.useState)(false);
|
|
7559
|
+
(0, import_react45.useEffect)(() => {
|
|
7476
7560
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
7477
7561
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
7478
7562
|
const sync = () => setModal(mql.matches);
|
|
@@ -7485,7 +7569,7 @@ function useIsModal() {
|
|
|
7485
7569
|
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, loggedIn, conversation }) {
|
|
7486
7570
|
const { state, close, stop, send, reset } = controller;
|
|
7487
7571
|
const isModal = useIsModal();
|
|
7488
|
-
(0,
|
|
7572
|
+
(0, import_react45.useEffect)(() => {
|
|
7489
7573
|
const onKey = (e) => {
|
|
7490
7574
|
if (e.key === "Escape") close();
|
|
7491
7575
|
};
|
|
@@ -7496,11 +7580,15 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
7496
7580
|
monitor?.setActiveTab("chat");
|
|
7497
7581
|
send(text);
|
|
7498
7582
|
};
|
|
7499
|
-
(
|
|
7583
|
+
const handleAsk = (text, grounding) => {
|
|
7584
|
+
monitor?.setActiveTab("chat");
|
|
7585
|
+
send(text, { grounding });
|
|
7586
|
+
};
|
|
7587
|
+
(0, import_react45.useEffect)(() => {
|
|
7500
7588
|
if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
|
|
7501
7589
|
}, [monitor, state.isStreaming, state.messages.length]);
|
|
7502
|
-
return /* @__PURE__ */ (0,
|
|
7503
|
-
/* @__PURE__ */ (0,
|
|
7590
|
+
return /* @__PURE__ */ (0, import_jsx_runtime86.jsxs)("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
|
|
7591
|
+
/* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
|
|
7504
7592
|
ChatHeader,
|
|
7505
7593
|
{
|
|
7506
7594
|
onClose: close,
|
|
@@ -7513,7 +7601,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
7513
7601
|
moreOptionsLabel: ui.moreOptions
|
|
7514
7602
|
}
|
|
7515
7603
|
),
|
|
7516
|
-
monitor && /* @__PURE__ */ (0,
|
|
7604
|
+
monitor && /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
|
|
7517
7605
|
TabBar,
|
|
7518
7606
|
{
|
|
7519
7607
|
monitor,
|
|
@@ -7525,17 +7613,17 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
7525
7613
|
gamesEnabled: gamesResult?.enabled ?? false
|
|
7526
7614
|
}
|
|
7527
7615
|
),
|
|
7528
|
-
/* @__PURE__ */ (0,
|
|
7616
|
+
/* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
|
|
7529
7617
|
"div",
|
|
7530
7618
|
{
|
|
7531
7619
|
style: !monitor || monitor.activeTab === "chat" ? { display: "contents" } : { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" },
|
|
7532
|
-
children: /* @__PURE__ */ (0,
|
|
7620
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(MessageList, { controller, ui, slip, onDashboardTap, monitor })
|
|
7533
7621
|
}
|
|
7534
7622
|
),
|
|
7535
|
-
monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ (0,
|
|
7536
|
-
monitor && monitor.activeTab === "following" && /* @__PURE__ */ (0,
|
|
7537
|
-
monitor && monitor.activeTab === "odds" && /* @__PURE__ */ (0,
|
|
7538
|
-
monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ (0,
|
|
7623
|
+
monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(TodayPanel, { discovery, ui, monitor }),
|
|
7624
|
+
monitor && monitor.activeTab === "following" && /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(MatchesPanel, { monitor, ui, slip, onAsk: handleAsk }),
|
|
7625
|
+
monitor && monitor.activeTab === "odds" && /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(OddsPanel, { monitor, ui, slip }),
|
|
7626
|
+
monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
|
|
7539
7627
|
GamesPanel,
|
|
7540
7628
|
{
|
|
7541
7629
|
loggedIn: !!loggedIn,
|
|
@@ -7549,7 +7637,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
7549
7637
|
}
|
|
7550
7638
|
}
|
|
7551
7639
|
),
|
|
7552
|
-
monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */ (0,
|
|
7640
|
+
monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
|
|
7553
7641
|
LeaderboardPanel,
|
|
7554
7642
|
{
|
|
7555
7643
|
loggedIn: !!loggedIn,
|
|
@@ -7559,7 +7647,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
7559
7647
|
ui
|
|
7560
7648
|
}
|
|
7561
7649
|
),
|
|
7562
|
-
(!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */ (0,
|
|
7650
|
+
(!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(ChatInput, { placeholder: ui.placeholder, streaming: state.isStreaming, onSend: handleSend, onStop: stop, stopLabel: ui.stopResponse, sendLabel: ui.sendMessage })
|
|
7563
7651
|
] });
|
|
7564
7652
|
}
|
|
7565
7653
|
|
|
@@ -8500,6 +8588,21 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
8500
8588
|
.ss-w-mon-scorers-home { text-align: right; }
|
|
8501
8589
|
.ss-w-mon-scorers-away { text-align: left; }
|
|
8502
8590
|
.ss-w-mon-scorers-ball { flex: none; align-self: start; line-height: 1.35; }
|
|
8591
|
+
.ss-w-fact { display: flex; flex-direction: column; gap: 7px; padding: 10px 12px; border-radius: 10px; background: color-mix(in srgb, var(--ss-w-accent) 9%, transparent); border: 1px solid color-mix(in srgb, var(--ss-w-accent) 22%, transparent); }
|
|
8592
|
+
.ss-w-fact-k { display: flex; align-items: center; gap: 6px; font-size: 10.5px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase; color: var(--ss-w-accent); }
|
|
8593
|
+
.ss-w-fact-min { color: var(--ss-w-ink); letter-spacing: 0; }
|
|
8594
|
+
.ss-w-fact-subj { margin-left: auto; text-transform: none; letter-spacing: 0; font-weight: 650; color: var(--ss-w-faint); }
|
|
8595
|
+
.ss-w-fact-text { margin: 0; font-size: 13.5px; line-height: 1.45; color: var(--ss-w-ink); }
|
|
8596
|
+
.ss-w-fact-basis { font-size: 10.5px; color: var(--ss-w-faint); }
|
|
8597
|
+
.ss-w-fact-mkt { display: flex; align-items: center; gap: 8px; font-size: 11.5px; border: 1px solid var(--ss-w-line); border-radius: 8px; padding: 6px 8px; }
|
|
8598
|
+
.ss-w-fact-foot { display: flex; align-items: center; gap: 14px; }
|
|
8599
|
+
.ss-w-fact-link { font: inherit; font-size: 11.5px; font-weight: 700; color: var(--ss-w-accent); background: none; border: none; padding: 4px 0; min-height: 32px; cursor: pointer; }
|
|
8600
|
+
.ss-w-fact-link--muted { color: var(--ss-w-faint); margin-left: auto; }
|
|
8601
|
+
.ss-w-fact-hist { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--ss-w-line); }
|
|
8602
|
+
.ss-w-fact-hist li { display: grid; grid-template-columns: 34px 1fr; gap: 8px; padding: 9px 0; border-bottom: 1px solid var(--ss-w-line); }
|
|
8603
|
+
.ss-w-fact-hist li:last-child { border-bottom: none; }
|
|
8604
|
+
.ss-w-fact-hmin { font-size: 11px; font-weight: 800; color: var(--ss-w-faint); font-variant-numeric: tabular-nums; }
|
|
8605
|
+
.ss-w-fact-htext { margin: 0; font-size: 12.5px; line-height: 1.4; color: var(--ss-w-ink); }
|
|
8503
8606
|
.ss-w-mon-stats { display: flex; flex-direction: column; gap: 10px; }
|
|
8504
8607
|
.ss-w-mon-stat { display: flex; flex-direction: column; gap: 5px; }
|
|
8505
8608
|
.ss-w-mon-pstrip { padding: 6px 8px; border-radius: 8px; background: color-mix(in srgb, var(--ss-w-accent) 8%, transparent); }
|
|
@@ -9033,7 +9136,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
9033
9136
|
`;
|
|
9034
9137
|
|
|
9035
9138
|
// src/StatsWidget.tsx
|
|
9036
|
-
var
|
|
9139
|
+
var import_jsx_runtime87 = require("react/jsx-runtime");
|
|
9037
9140
|
function buildClient(props) {
|
|
9038
9141
|
try {
|
|
9039
9142
|
if ("client" in props && props.client) {
|
|
@@ -9058,23 +9161,23 @@ function injectStyles(root) {
|
|
|
9058
9161
|
function StatsWidget(props) {
|
|
9059
9162
|
const injectedClient = "client" in props ? props.client : void 0;
|
|
9060
9163
|
const cfg = props.config;
|
|
9061
|
-
const built = (0,
|
|
9062
|
-
const logger = (0,
|
|
9164
|
+
const built = (0, import_react46.useMemo)(() => buildClient(props), [injectedClient, cfg?.operatorId, cfg?.publicKey, cfg?.baseUrl]);
|
|
9165
|
+
const logger = (0, import_react46.useMemo)(
|
|
9063
9166
|
() => built ? built.client.createEventLogger({
|
|
9064
9167
|
operatorUserId: cfg?.userContext?.operatorUserId,
|
|
9065
9168
|
anonymousUserId: cfg?.userContext?.anonymousUserId
|
|
9066
9169
|
}) : null,
|
|
9067
9170
|
[built?.client]
|
|
9068
9171
|
);
|
|
9069
|
-
const ui = (0,
|
|
9070
|
-
const rootRef = (0,
|
|
9071
|
-
const introDoneRef = (0,
|
|
9072
|
-
const markIntroDone = (0,
|
|
9172
|
+
const ui = (0, import_react46.useMemo)(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
|
|
9173
|
+
const rootRef = (0, import_react46.useRef)(null);
|
|
9174
|
+
const introDoneRef = (0, import_react46.useRef)(false);
|
|
9175
|
+
const markIntroDone = (0, import_react46.useCallback)(() => {
|
|
9073
9176
|
introDoneRef.current = true;
|
|
9074
9177
|
}, []);
|
|
9075
9178
|
const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
|
|
9076
9179
|
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
|
|
9077
|
-
const [hasToday, setHasToday] = (0,
|
|
9180
|
+
const [hasToday, setHasToday] = (0, import_react46.useState)(false);
|
|
9078
9181
|
const monitor = useLiveMonitor({
|
|
9079
9182
|
getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
|
|
9080
9183
|
getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
|
|
@@ -9082,15 +9185,15 @@ function StatsWidget(props) {
|
|
|
9082
9185
|
isOpen: controller.state.isOpen,
|
|
9083
9186
|
hasToday
|
|
9084
9187
|
});
|
|
9085
|
-
const getSchedule = (0,
|
|
9188
|
+
const getSchedule = (0, import_react46.useCallback)(
|
|
9086
9189
|
(localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes) : Promise.resolve(null),
|
|
9087
9190
|
[built]
|
|
9088
9191
|
);
|
|
9089
|
-
const getStates = (0,
|
|
9192
|
+
const getStates = (0, import_react46.useCallback)(
|
|
9090
9193
|
(matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
|
|
9091
9194
|
[built]
|
|
9092
9195
|
);
|
|
9093
|
-
const pinnedMatchIds = (0,
|
|
9196
|
+
const pinnedMatchIds = (0, import_react46.useMemo)(
|
|
9094
9197
|
() => monitor.pins.filter((p) => p.kind === "match").map((p) => p.matchId),
|
|
9095
9198
|
[monitor.pins]
|
|
9096
9199
|
);
|
|
@@ -9102,19 +9205,19 @@ function StatsWidget(props) {
|
|
|
9102
9205
|
pinnedMatchIds
|
|
9103
9206
|
});
|
|
9104
9207
|
const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
|
|
9105
|
-
(0,
|
|
9208
|
+
(0, import_react46.useEffect)(() => {
|
|
9106
9209
|
setHasToday(todayHasContent);
|
|
9107
9210
|
}, [todayHasContent]);
|
|
9108
9211
|
const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
9109
9212
|
const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
9110
9213
|
const markTodayActivity = monitor.markTodayActivity;
|
|
9111
|
-
const prevLiveCountRef = (0,
|
|
9112
|
-
(0,
|
|
9214
|
+
const prevLiveCountRef = (0, import_react46.useRef)(0);
|
|
9215
|
+
(0, import_react46.useEffect)(() => {
|
|
9113
9216
|
const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
|
|
9114
9217
|
prevLiveCountRef.current = discovery.liveCount;
|
|
9115
9218
|
if (rose) markTodayActivity();
|
|
9116
9219
|
}, [discovery.liveCount, markTodayActivity]);
|
|
9117
|
-
const slip = (0,
|
|
9220
|
+
const slip = (0, import_react46.useMemo)(
|
|
9118
9221
|
() => {
|
|
9119
9222
|
const handler = props.config?.onAddToSlip;
|
|
9120
9223
|
return {
|
|
@@ -9131,7 +9234,7 @@ function StatsWidget(props) {
|
|
|
9131
9234
|
},
|
|
9132
9235
|
[props.config?.onAddToSlip, controller.state.conversationId, monitor.markInSlip]
|
|
9133
9236
|
);
|
|
9134
|
-
const onDashboardTap = (0,
|
|
9237
|
+
const onDashboardTap = (0, import_react46.useMemo)(
|
|
9135
9238
|
() => built ? createDashboardTapSignal((input) => built.conversation.sendSignal(input), logger) : void 0,
|
|
9136
9239
|
[built, logger]
|
|
9137
9240
|
);
|
|
@@ -9139,11 +9242,11 @@ function StatsWidget(props) {
|
|
|
9139
9242
|
const operatorUserId = cfg?.userContext?.operatorUserId;
|
|
9140
9243
|
const anonymousUserId = cfg?.userContext?.anonymousUserId;
|
|
9141
9244
|
const conversationId = controller.state.conversationId ?? void 0;
|
|
9142
|
-
(0,
|
|
9245
|
+
(0, import_react46.useEffect)(() => {
|
|
9143
9246
|
if (!logger) return;
|
|
9144
9247
|
logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
|
|
9145
9248
|
}, [logger, operatorUserId, anonymousUserId, conversationId]);
|
|
9146
|
-
(0,
|
|
9249
|
+
(0, import_react46.useEffect)(() => {
|
|
9147
9250
|
if (!logger) return;
|
|
9148
9251
|
const onHide = () => {
|
|
9149
9252
|
logger.flushOnHide();
|
|
@@ -9160,14 +9263,14 @@ function StatsWidget(props) {
|
|
|
9160
9263
|
logger.dispose();
|
|
9161
9264
|
};
|
|
9162
9265
|
}, [logger]);
|
|
9163
|
-
(0,
|
|
9266
|
+
(0, import_react46.useEffect)(() => {
|
|
9164
9267
|
if (!built || !ui.injectStyles) return;
|
|
9165
9268
|
const node = rootRef.current?.getRootNode();
|
|
9166
9269
|
if (node) injectStyles(node);
|
|
9167
9270
|
}, [built, ui.injectStyles]);
|
|
9168
9271
|
if (!built) return null;
|
|
9169
9272
|
const attrs = themeAttrs(ui);
|
|
9170
|
-
return /* @__PURE__ */ (0,
|
|
9273
|
+
return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ (0, import_jsx_runtime87.jsx)("div", { ref: rootRef, className: "ss-w-root", "data-ss-w-theme": attrs["data-ss-w-theme"], "data-ss-w-pos": attrs["data-ss-w-pos"], style: attrs.style, children: controller.state.isOpen ? /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(
|
|
9171
9274
|
ChatPanel,
|
|
9172
9275
|
{
|
|
9173
9276
|
controller,
|
|
@@ -9181,7 +9284,7 @@ function StatsWidget(props) {
|
|
|
9181
9284
|
loggedIn: !!operatorUserId,
|
|
9182
9285
|
conversation: built?.conversation ?? null
|
|
9183
9286
|
}
|
|
9184
|
-
) : /* @__PURE__ */ (0,
|
|
9287
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(
|
|
9185
9288
|
ChatFab,
|
|
9186
9289
|
{
|
|
9187
9290
|
label: ui.launcherLabel,
|