@sensiblestats/widget-react 0.61.3 → 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 +22 -0
- package/dist/index.cjs +1135 -907
- 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 +1089 -861
- package/dist/index.js.map +1 -1
- package/dist/styles.css +68 -0
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/StatsWidget.tsx
|
|
2
|
-
import { useCallback as
|
|
2
|
+
import { useCallback as useCallback10, useEffect as useEffect19, useMemo as useMemo3, useRef as useRef15, useState as useState39 } from "react";
|
|
3
3
|
import { StatsWidgetClient } from "@sensiblestats/widget-sdk";
|
|
4
4
|
|
|
5
5
|
// src/kickoff.ts
|
|
@@ -89,6 +89,10 @@ var STRINGS = {
|
|
|
89
89
|
inSlipLabel: "In slip",
|
|
90
90
|
oddsUnavailable: "Odds unavailable right now",
|
|
91
91
|
momentumLabel: "Momentum",
|
|
92
|
+
liveFactLabel: "Live fact",
|
|
93
|
+
liveFactAsk: "Ask about this",
|
|
94
|
+
liveFactEarlier: (n) => `Earlier facts (${n})`,
|
|
95
|
+
liveFactHideEarlier: "Hide earlier facts",
|
|
92
96
|
accordionValueLabel: "Value",
|
|
93
97
|
accordionRetry: "Couldn't load odds \u2014 tap to retry",
|
|
94
98
|
accordionSuspended: "Suspended",
|
|
@@ -385,6 +389,10 @@ var STRINGS = {
|
|
|
385
389
|
inSlipLabel: "Kuponda",
|
|
386
390
|
oddsUnavailable: "Oranlar \u015Fu anda kullan\u0131lam\u0131yor",
|
|
387
391
|
momentumLabel: "Momentum",
|
|
392
|
+
liveFactLabel: "Canl\u0131 bilgi",
|
|
393
|
+
liveFactAsk: "Bunu sor",
|
|
394
|
+
liveFactEarlier: (n) => `\xD6nceki bilgiler (${n})`,
|
|
395
|
+
liveFactHideEarlier: "\xD6nceki bilgileri gizle",
|
|
388
396
|
accordionValueLabel: "De\u011Fer",
|
|
389
397
|
accordionRetry: "Oranlar y\xFCklenemedi \u2014 yeniden dene",
|
|
390
398
|
accordionSuspended: "Ask\u0131da",
|
|
@@ -614,6 +622,10 @@ var STRINGS = {
|
|
|
614
622
|
function resolveLocaleStrings(locale) {
|
|
615
623
|
return STRINGS[locale] ?? STRINGS.en;
|
|
616
624
|
}
|
|
625
|
+
function isEnglishLocale(locale) {
|
|
626
|
+
const lang = (locale ?? "").trim().toLowerCase().split(/[-_]/)[0] ?? "";
|
|
627
|
+
return lang === "en" || !Object.prototype.hasOwnProperty.call(STRINGS, lang);
|
|
628
|
+
}
|
|
617
629
|
|
|
618
630
|
// src/config.ts
|
|
619
631
|
function normalizeUi(cfg) {
|
|
@@ -623,6 +635,7 @@ function normalizeUi(cfg) {
|
|
|
623
635
|
accent: cfg.accent,
|
|
624
636
|
logoUrl: cfg.logoUrl,
|
|
625
637
|
headerTitle: cfg.headerTitle,
|
|
638
|
+
rawBettingLabels: isEnglishLocale(cfg.locale),
|
|
626
639
|
cta: cfg.cta,
|
|
627
640
|
surface: cfg.surface,
|
|
628
641
|
ink: cfg.ink,
|
|
@@ -704,6 +717,10 @@ function normalizeUi(cfg) {
|
|
|
704
717
|
inSlipLabel: strings.inSlipLabel,
|
|
705
718
|
oddsUnavailable: strings.oddsUnavailable,
|
|
706
719
|
momentumLabel: strings.momentumLabel,
|
|
720
|
+
liveFactLabel: strings.liveFactLabel,
|
|
721
|
+
liveFactAsk: strings.liveFactAsk,
|
|
722
|
+
liveFactEarlier: strings.liveFactEarlier,
|
|
723
|
+
liveFactHideEarlier: strings.liveFactHideEarlier,
|
|
707
724
|
accordionValueLabel: strings.accordionValueLabel,
|
|
708
725
|
accordionRetry: strings.accordionRetry,
|
|
709
726
|
accordionSuspended: strings.accordionSuspended,
|
|
@@ -738,6 +755,24 @@ function toUserContext(cfg) {
|
|
|
738
755
|
|
|
739
756
|
// src/slip.ts
|
|
740
757
|
var ADD_TO_SLIP_TIMEOUT_MS = 1e4;
|
|
758
|
+
var MAX_SELECTION = 64;
|
|
759
|
+
var MAX_LINE = 32;
|
|
760
|
+
var MAX_ODDS = 1e4;
|
|
761
|
+
function slipPickFields(selection, label, line) {
|
|
762
|
+
const fields = {};
|
|
763
|
+
if (Number.isSafeInteger(selection.matchId) && selection.matchId > 0) fields.matchId = selection.matchId;
|
|
764
|
+
if (label && label.trim() && label.length <= MAX_SELECTION) fields.selection = label;
|
|
765
|
+
if (line && line.trim() && line.length <= MAX_LINE) fields.line = line;
|
|
766
|
+
const odds = selection.oddsDecimal;
|
|
767
|
+
if (Number.isFinite(odds) && odds > 1 && odds <= MAX_ODDS) fields.odds = odds;
|
|
768
|
+
return fields;
|
|
769
|
+
}
|
|
770
|
+
function chipSelection(market, matchId, conversationId) {
|
|
771
|
+
if (!market || !market.addToSlipEnabled || typeof market.matchOddsId !== "number" || typeof market.price !== "number") return null;
|
|
772
|
+
const selection = { matchOddsId: market.matchOddsId, matchId, oddsDecimal: market.price };
|
|
773
|
+
if (conversationId !== void 0) selection.conversationId = conversationId;
|
|
774
|
+
return selection;
|
|
775
|
+
}
|
|
741
776
|
function wasAdded(result) {
|
|
742
777
|
if (!result) return true;
|
|
743
778
|
if (result.status === "price_changed") return result.accepted;
|
|
@@ -1024,6 +1059,8 @@ function toMarketOddsVM(card) {
|
|
|
1024
1059
|
return {
|
|
1025
1060
|
key: `${selection}:${str(r.line) ?? ""}:${i}`,
|
|
1026
1061
|
selection,
|
|
1062
|
+
selectionLabel: str(r.selectionLabel),
|
|
1063
|
+
line: str(r.line),
|
|
1027
1064
|
odds: price !== void 0 ? price.toFixed(2) : "",
|
|
1028
1065
|
oddsDecimal: price,
|
|
1029
1066
|
matchOddsId: typeof r.matchOddsId === "number" ? r.matchOddsId : void 0,
|
|
@@ -1454,7 +1491,7 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
|
|
|
1454
1491
|
const send = useCallback((text, opts) => {
|
|
1455
1492
|
const trimmed = text.trim();
|
|
1456
1493
|
if (!trimmed) return;
|
|
1457
|
-
run({ message: trimmed, actionId: opts?.actionId, actionRef: opts?.actionRef }, opts?.displayText);
|
|
1494
|
+
run({ message: trimmed, actionId: opts?.actionId, actionRef: opts?.actionRef, grounding: opts?.grounding }, opts?.displayText);
|
|
1458
1495
|
}, [run]);
|
|
1459
1496
|
const retry = useCallback(() => {
|
|
1460
1497
|
const last = stateRef.current.lastUserInput;
|
|
@@ -1777,6 +1814,7 @@ function useLiveMonitor(opts) {
|
|
|
1777
1814
|
const inFlightRef = useRef3(false);
|
|
1778
1815
|
const timerRef = useRef3(void 0);
|
|
1779
1816
|
const disabledRef = useRef3(false);
|
|
1817
|
+
const mountedRef = useRef3(false);
|
|
1780
1818
|
const getLiveMonitorRef = useRef3(opts.getLiveMonitor);
|
|
1781
1819
|
getLiveMonitorRef.current = opts.getLiveMonitor;
|
|
1782
1820
|
const tick = useCallback2(async () => {
|
|
@@ -1784,6 +1822,7 @@ function useLiveMonitor(opts) {
|
|
|
1784
1822
|
inFlightRef.current = true;
|
|
1785
1823
|
try {
|
|
1786
1824
|
const snap = await getLiveMonitorRef.current(pinsRef.current);
|
|
1825
|
+
if (!mountedRef.current) return;
|
|
1787
1826
|
if (snap === null) {
|
|
1788
1827
|
disabledRef.current = true;
|
|
1789
1828
|
applySnapshot(null);
|
|
@@ -1805,10 +1844,16 @@ function useLiveMonitor(opts) {
|
|
|
1805
1844
|
});
|
|
1806
1845
|
scheduleRef.current = () => {
|
|
1807
1846
|
window.clearTimeout(timerRef.current);
|
|
1808
|
-
if (disabledRef.current || pinsRef.current.length === 0 || document.visibilityState === "hidden") return;
|
|
1847
|
+
if (!mountedRef.current || disabledRef.current || pinsRef.current.length === 0 || document.visibilityState === "hidden") return;
|
|
1809
1848
|
const hinted = (snapshotRef.current?.nextPollSeconds ?? DEFAULT_POLL_MS / 1e3) * 1e3;
|
|
1810
1849
|
timerRef.current = window.setTimeout(() => void tick(), Math.max(MIN_POLL_MS, hinted));
|
|
1811
1850
|
};
|
|
1851
|
+
useEffect3(() => {
|
|
1852
|
+
mountedRef.current = true;
|
|
1853
|
+
return () => {
|
|
1854
|
+
mountedRef.current = false;
|
|
1855
|
+
};
|
|
1856
|
+
}, []);
|
|
1812
1857
|
const prevPinsLengthRef = useRef3(0);
|
|
1813
1858
|
useEffect3(() => {
|
|
1814
1859
|
const wasEmpty = prevPinsLengthRef.current === 0;
|
|
@@ -2203,8 +2248,31 @@ function useEventLog() {
|
|
|
2203
2248
|
return useContext(EventLogContext);
|
|
2204
2249
|
}
|
|
2205
2250
|
|
|
2251
|
+
// src/popupTelemetry.ts
|
|
2252
|
+
import { useCallback as useCallback6, useEffect as useEffect7, useRef as useRef7 } from "react";
|
|
2253
|
+
function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
2254
|
+
const shownRef = useRef7(/* @__PURE__ */ new Set());
|
|
2255
|
+
const closedTextRef = useRef7(null);
|
|
2256
|
+
useEffect7(() => {
|
|
2257
|
+
if (isOpen) {
|
|
2258
|
+
if (closedTextRef.current) log?.log({ name: "popup_opened" });
|
|
2259
|
+
closedTextRef.current = null;
|
|
2260
|
+
return;
|
|
2261
|
+
}
|
|
2262
|
+
closedTextRef.current = popupText;
|
|
2263
|
+
if (popupText && !shownRef.current.has(popupText)) {
|
|
2264
|
+
shownRef.current.add(popupText);
|
|
2265
|
+
log?.log({ name: "popup_shown" });
|
|
2266
|
+
}
|
|
2267
|
+
}, [log, isOpen, popupText]);
|
|
2268
|
+
return useCallback6(() => {
|
|
2269
|
+
log?.log({ name: "popup_dismissed" });
|
|
2270
|
+
dismissPopup();
|
|
2271
|
+
}, [log, dismissPopup]);
|
|
2272
|
+
}
|
|
2273
|
+
|
|
2206
2274
|
// src/components/ChatFab.tsx
|
|
2207
|
-
import { useEffect as
|
|
2275
|
+
import { useEffect as useEffect8, useRef as useRef8, useState as useState7 } from "react";
|
|
2208
2276
|
|
|
2209
2277
|
// src/components/BrandMark.tsx
|
|
2210
2278
|
import { useState as useState6 } from "react";
|
|
@@ -2282,8 +2350,8 @@ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
|
2282
2350
|
function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart }) {
|
|
2283
2351
|
const bubble = popupText ?? greeting;
|
|
2284
2352
|
const [intro, setIntro] = useState7(false);
|
|
2285
|
-
const armedRef =
|
|
2286
|
-
|
|
2353
|
+
const armedRef = useRef8(introAllowed);
|
|
2354
|
+
useEffect8(() => {
|
|
2287
2355
|
if (armedRef.current && bubble) {
|
|
2288
2356
|
armedRef.current = false;
|
|
2289
2357
|
setIntro(true);
|
|
@@ -2297,10 +2365,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
|
|
|
2297
2365
|
}
|
|
2298
2366
|
|
|
2299
2367
|
// src/components/ChatPanel.tsx
|
|
2300
|
-
import { useEffect as
|
|
2368
|
+
import { useEffect as useEffect18, useState as useState38 } from "react";
|
|
2301
2369
|
|
|
2302
2370
|
// src/components/ChatHeader.tsx
|
|
2303
|
-
import { useEffect as
|
|
2371
|
+
import { useEffect as useEffect9, useRef as useRef9, useState as useState8 } from "react";
|
|
2304
2372
|
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
2305
2373
|
function ChatHeader({
|
|
2306
2374
|
onClose,
|
|
@@ -2313,14 +2381,14 @@ function ChatHeader({
|
|
|
2313
2381
|
moreOptionsLabel = "More options"
|
|
2314
2382
|
}) {
|
|
2315
2383
|
const [menuOpen, setMenuOpen] = useState8(false);
|
|
2316
|
-
const wrapRef =
|
|
2317
|
-
const kebabRef =
|
|
2318
|
-
const firstItemRef =
|
|
2384
|
+
const wrapRef = useRef9(null);
|
|
2385
|
+
const kebabRef = useRef9(null);
|
|
2386
|
+
const firstItemRef = useRef9(null);
|
|
2319
2387
|
const hasMenu = !!(canReset && onNewConversation);
|
|
2320
|
-
|
|
2388
|
+
useEffect9(() => {
|
|
2321
2389
|
if (menuOpen) firstItemRef.current?.focus();
|
|
2322
2390
|
}, [menuOpen]);
|
|
2323
|
-
|
|
2391
|
+
useEffect9(() => {
|
|
2324
2392
|
if (!menuOpen) return;
|
|
2325
2393
|
const onPointer = (e) => {
|
|
2326
2394
|
if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
|
|
@@ -2376,7 +2444,7 @@ function ChatHeader({
|
|
|
2376
2444
|
}
|
|
2377
2445
|
|
|
2378
2446
|
// src/components/MessageList.tsx
|
|
2379
|
-
import { useEffect as
|
|
2447
|
+
import { useEffect as useEffect13, useRef as useRef11 } from "react";
|
|
2380
2448
|
|
|
2381
2449
|
// src/components/Markdown.tsx
|
|
2382
2450
|
import ReactMarkdown from "react-markdown";
|
|
@@ -2506,15 +2574,15 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
|
|
|
2506
2574
|
import { useState as useState13 } from "react";
|
|
2507
2575
|
|
|
2508
2576
|
// src/components/AddToSlipButton.tsx
|
|
2509
|
-
import { useCallback as
|
|
2577
|
+
import { useCallback as useCallback7, useState as useState10 } from "react";
|
|
2510
2578
|
import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
|
|
2511
2579
|
|
|
2512
2580
|
// src/components/Toast.tsx
|
|
2513
|
-
import { useEffect as
|
|
2581
|
+
import { useEffect as useEffect10 } from "react";
|
|
2514
2582
|
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
2515
2583
|
var DISMISS_MS = 4e3;
|
|
2516
2584
|
function Toast({ toast, onDismiss }) {
|
|
2517
|
-
|
|
2585
|
+
useEffect10(() => {
|
|
2518
2586
|
if (!toast) return;
|
|
2519
2587
|
const timer = setTimeout(onDismiss, DISMISS_MS);
|
|
2520
2588
|
return () => clearTimeout(timer);
|
|
@@ -2531,18 +2599,19 @@ function withTimeout(value) {
|
|
|
2531
2599
|
new Promise((_, reject) => setTimeout(() => reject(new Error("add-to-slip timed out")), ADD_TO_SLIP_TIMEOUT_MS))
|
|
2532
2600
|
]);
|
|
2533
2601
|
}
|
|
2534
|
-
function SlipButton({ selection, shownOdds,
|
|
2602
|
+
function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui }) {
|
|
2535
2603
|
const [pending, setPending] = useState10(false);
|
|
2536
2604
|
const [settled, setSettled] = useState10(false);
|
|
2537
2605
|
const [toast, setToast] = useState10(null);
|
|
2538
|
-
const dismiss =
|
|
2606
|
+
const dismiss = useCallback7(() => setToast(null), []);
|
|
2539
2607
|
const log = useEventLog();
|
|
2540
2608
|
const handler = slip.onAddToSlip;
|
|
2541
2609
|
if (!ui || !handler || !selection) return null;
|
|
2542
2610
|
const onClick = async () => {
|
|
2543
2611
|
setPending(true);
|
|
2612
|
+
const pick = slipPickFields(selection, ui.rawBettingLabels ? selectionLabel : void 0, line);
|
|
2544
2613
|
if (marketDeveloperName !== void 0) {
|
|
2545
|
-
log?.log({ name: "slip_click", entityType: "market", marketDeveloperName, entityId: marketDeveloperName });
|
|
2614
|
+
log?.log({ name: "slip_click", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, ...pick });
|
|
2546
2615
|
}
|
|
2547
2616
|
try {
|
|
2548
2617
|
const raw = await withTimeout(Promise.resolve(handler(selection)));
|
|
@@ -2554,20 +2623,15 @@ function SlipButton({ selection, shownOdds, marketName, marketDeveloperName, sli
|
|
|
2554
2623
|
entityType: "market",
|
|
2555
2624
|
marketDeveloperName,
|
|
2556
2625
|
entityId: marketDeveloperName,
|
|
2557
|
-
outcome: slipOutcome(result)
|
|
2626
|
+
outcome: slipOutcome(result),
|
|
2627
|
+
...pick
|
|
2558
2628
|
});
|
|
2559
2629
|
}
|
|
2560
2630
|
setToast(resultToToast(result, shownOdds || selection.oddsDecimal.toFixed(2), ui));
|
|
2561
2631
|
setSettled(isTerminal(result));
|
|
2562
|
-
if (wasAdded(result) && slip.onMarketClicked) {
|
|
2563
|
-
try {
|
|
2564
|
-
slip.onMarketClicked(marketName);
|
|
2565
|
-
} catch {
|
|
2566
|
-
}
|
|
2567
|
-
}
|
|
2568
2632
|
} catch {
|
|
2569
2633
|
if (marketDeveloperName !== void 0) {
|
|
2570
|
-
log?.log({ name: "slip_result", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, outcome: "timeout" });
|
|
2634
|
+
log?.log({ name: "slip_result", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, outcome: "timeout", ...pick });
|
|
2571
2635
|
}
|
|
2572
2636
|
setToast({ kind: "error", text: ui.slipFailed });
|
|
2573
2637
|
} finally {
|
|
@@ -2595,8 +2659,9 @@ function AddToSlipButton({ it, slip, ui }) {
|
|
|
2595
2659
|
{
|
|
2596
2660
|
selection,
|
|
2597
2661
|
shownOdds: it.odds ?? "",
|
|
2598
|
-
marketName: it.market,
|
|
2599
2662
|
marketDeveloperName: it.marketDeveloperName,
|
|
2663
|
+
selectionLabel: it.selectionLabel,
|
|
2664
|
+
line: it.line,
|
|
2600
2665
|
slip,
|
|
2601
2666
|
ui
|
|
2602
2667
|
}
|
|
@@ -2640,7 +2705,7 @@ function Crest2({ url, name, kind }) {
|
|
|
2640
2705
|
}
|
|
2641
2706
|
|
|
2642
2707
|
// src/components/PinToggle.tsx
|
|
2643
|
-
import { useCallback as
|
|
2708
|
+
import { useCallback as useCallback8, useState as useState12 } from "react";
|
|
2644
2709
|
import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
2645
2710
|
var PIN_GLYPHS = {
|
|
2646
2711
|
pin: { viewBox: "0 0 24 24", strokeWidth: 1.4, transform: "scale(1.5)", d: "M9.5 1.5 14.5 6.5 13 8l-.5-.5-3 3 .3 2.2-1.4 1.4L5.6 11.3l-3.3 3.3-1-1 3.3-3.3L1.9 7.5l1.4-1.4 2.2.3 3-3L8 2.9z" },
|
|
@@ -2649,7 +2714,7 @@ var PIN_GLYPHS = {
|
|
|
2649
2714
|
};
|
|
2650
2715
|
function PinToggle({ pin, monitor, ui }) {
|
|
2651
2716
|
const [toast, setToast] = useState12(null);
|
|
2652
|
-
const dismiss =
|
|
2717
|
+
const dismiss = useCallback8(() => setToast(null), []);
|
|
2653
2718
|
const log = useEventLog();
|
|
2654
2719
|
if (!monitor || !monitor.enabled) return null;
|
|
2655
2720
|
const key = pinKey(pin);
|
|
@@ -2853,7 +2918,7 @@ function OddsRow({ vm, row, ui, slip, inSlipIds }) {
|
|
|
2853
2918
|
"\u2713 ",
|
|
2854
2919
|
ui.inSlipLabel
|
|
2855
2920
|
] }) : null,
|
|
2856
|
-
/* @__PURE__ */ jsx14(SlipButton, { selection, shownOdds: row.odds,
|
|
2921
|
+
/* @__PURE__ */ jsx14(SlipButton, { selection, shownOdds: row.odds, marketDeveloperName: vm.marketDeveloperName, selectionLabel: row.selectionLabel, line: row.line, slip, ui })
|
|
2857
2922
|
] });
|
|
2858
2923
|
}
|
|
2859
2924
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
|
|
@@ -3025,7 +3090,37 @@ function ActionButtons({ actions, loading, disabled, onAct }) {
|
|
|
3025
3090
|
// src/components/dashboard/DashboardTile.tsx
|
|
3026
3091
|
import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
3027
3092
|
var MAX_CRESTS = 3;
|
|
3028
|
-
|
|
3093
|
+
var ODDS_TAIL = /\s*·\s*@(\d+(?:\.\d+)?)\s*$/;
|
|
3094
|
+
function splitOdds(subtitle) {
|
|
3095
|
+
const m = ODDS_TAIL.exec(subtitle);
|
|
3096
|
+
return m ? { text: subtitle.slice(0, m.index), odds: m[1] } : { text: subtitle };
|
|
3097
|
+
}
|
|
3098
|
+
function HeroTile({ tile, onTap, oddsLabel }) {
|
|
3099
|
+
const crests = (tile.imageUrls ?? []).filter(Boolean).slice(0, 2);
|
|
3100
|
+
const sub = tile.subtitle ? splitOdds(tile.subtitle) : null;
|
|
3101
|
+
return /* @__PURE__ */ jsxs13("button", { type: "button", className: "ss-w-dash-tile ss-w-dash-tile--full ss-w-dash-hero", onClick: onTap, children: [
|
|
3102
|
+
/* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-hero-top", children: [
|
|
3103
|
+
tile.badgeText ? /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-badge", children: tile.badgeText }) : null,
|
|
3104
|
+
sub?.odds ? /* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-hero-price", children: [
|
|
3105
|
+
/* @__PURE__ */ jsxs13("span", { className: "ss-g-sr", children: [
|
|
3106
|
+
oddsLabel,
|
|
3107
|
+
" "
|
|
3108
|
+
] }),
|
|
3109
|
+
sub.odds
|
|
3110
|
+
] }) : null,
|
|
3111
|
+
/* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-chevron", children: /* @__PURE__ */ jsx17(ChevronIcon, {}) })
|
|
3112
|
+
] }),
|
|
3113
|
+
/* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-hero-main", children: [
|
|
3114
|
+
/* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-visual", "aria-hidden": "true", children: crests.length > 0 ? crests.map((url, i) => /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-crest", style: { backgroundImage: `url(${url})` } }, `${url}-${i}`)) : /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-icon", children: /* @__PURE__ */ jsx17(DashboardIcon, { name: tile.icon }) }) }),
|
|
3115
|
+
/* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-hero-body", children: [
|
|
3116
|
+
/* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-title", children: tile.title }),
|
|
3117
|
+
sub?.text ? /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-hero-subtitle", children: sub.text }) : null
|
|
3118
|
+
] })
|
|
3119
|
+
] })
|
|
3120
|
+
] });
|
|
3121
|
+
}
|
|
3122
|
+
function DashboardTile({ tile, onTap, oddsLabel = "Odds" }) {
|
|
3123
|
+
if (tile.emphasis === "hero") return /* @__PURE__ */ jsx17(HeroTile, { tile, onTap, oddsLabel });
|
|
3029
3124
|
const spanClass = tile.span === "full" ? "ss-w-dash-tile--full" : "ss-w-dash-tile--half";
|
|
3030
3125
|
const crests = (tile.imageUrls ?? []).slice(0, MAX_CRESTS);
|
|
3031
3126
|
const hasMeta = Boolean(tile.badgeText) || crests.length > 0;
|
|
@@ -3058,13 +3153,13 @@ var LAYOUT_CLASSES = {
|
|
|
3058
3153
|
function layoutClass(layout) {
|
|
3059
3154
|
return Object.prototype.hasOwnProperty.call(LAYOUT_CLASSES, layout) ? LAYOUT_CLASSES[layout] : LAYOUT_CLASSES.goal;
|
|
3060
3155
|
}
|
|
3061
|
-
function GreetingDashboard({ dashboard, onTap }) {
|
|
3156
|
+
function GreetingDashboard({ dashboard, onTap, oddsLabel }) {
|
|
3062
3157
|
return /* @__PURE__ */ jsxs14("div", { className: `ss-w-dash ${layoutClass(dashboard.layout)}`, children: [
|
|
3063
3158
|
/* @__PURE__ */ jsxs14("div", { className: "ss-w-dash-head", children: [
|
|
3064
3159
|
/* @__PURE__ */ jsx18("span", { className: "ss-w-dash-title", children: dashboard.title }),
|
|
3065
3160
|
dashboard.subtitle ? /* @__PURE__ */ jsx18("span", { className: "ss-w-dash-subtitle", children: dashboard.subtitle }) : null
|
|
3066
3161
|
] }),
|
|
3067
|
-
/* @__PURE__ */ jsx18("div", { className: "ss-w-dash-grid", children: dashboard.tiles.map((t, i) => /* @__PURE__ */ jsx18(DashboardTile, { tile: t, onTap: () => onTap(t, i) }, `${t.title}-${i}`)) }),
|
|
3162
|
+
/* @__PURE__ */ jsx18("div", { className: "ss-w-dash-grid", children: dashboard.tiles.map((t, i) => /* @__PURE__ */ jsx18(DashboardTile, { tile: t, onTap: () => onTap(t, i), oddsLabel }, `${t.title}-${i}`)) }),
|
|
3068
3163
|
dashboard.footerTip ? /* @__PURE__ */ jsx18("span", { className: "ss-w-dash-foot", children: dashboard.footerTip }) : null
|
|
3069
3164
|
] });
|
|
3070
3165
|
}
|
|
@@ -3160,7 +3255,7 @@ function FixtureCard({ card }) {
|
|
|
3160
3255
|
}
|
|
3161
3256
|
|
|
3162
3257
|
// src/components/dashboard/CountdownCard.tsx
|
|
3163
|
-
import { Fragment as Fragment6, useEffect as
|
|
3258
|
+
import { Fragment as Fragment6, useEffect as useEffect11, useState as useState15 } from "react";
|
|
3164
3259
|
import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
3165
3260
|
var DAY_MS = 864e5;
|
|
3166
3261
|
function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
@@ -3184,7 +3279,7 @@ function CountdownCard({ card }) {
|
|
|
3184
3279
|
() => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
|
3185
3280
|
);
|
|
3186
3281
|
const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
|
|
3187
|
-
|
|
3282
|
+
useEffect11(() => {
|
|
3188
3283
|
if (reduced) return;
|
|
3189
3284
|
const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
|
|
3190
3285
|
return () => window.clearInterval(id);
|
|
@@ -3541,10 +3636,10 @@ function RestingFormCard({ card }) {
|
|
|
3541
3636
|
}
|
|
3542
3637
|
|
|
3543
3638
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
3544
|
-
import { useRef as
|
|
3639
|
+
import { useRef as useRef10, useState as useState19 } from "react";
|
|
3545
3640
|
|
|
3546
3641
|
// src/useLiveClock.ts
|
|
3547
|
-
import { useEffect as
|
|
3642
|
+
import { useEffect as useEffect12, useState as useState18 } from "react";
|
|
3548
3643
|
var TICK_MS = 6e4;
|
|
3549
3644
|
var MAX_LIVE_TICK_MINUTES = 15;
|
|
3550
3645
|
function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
@@ -3556,7 +3651,7 @@ function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
|
3556
3651
|
const [displayMinute, setDisplayMinute] = useState18(
|
|
3557
3652
|
() => computeDisplayMinute(minute, clockRunning, receivedAtMs)
|
|
3558
3653
|
);
|
|
3559
|
-
|
|
3654
|
+
useEffect12(() => {
|
|
3560
3655
|
setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
|
|
3561
3656
|
if (!clockRunning) return;
|
|
3562
3657
|
const id = window.setInterval(() => {
|
|
@@ -3592,7 +3687,7 @@ function LiveScoreCard({
|
|
|
3592
3687
|
}) {
|
|
3593
3688
|
const { data } = card;
|
|
3594
3689
|
const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
|
|
3595
|
-
const seedRef =
|
|
3690
|
+
const seedRef = useRef10(null);
|
|
3596
3691
|
if (!seedRef.current || seedRef.current.key !== seedKey) {
|
|
3597
3692
|
seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
|
|
3598
3693
|
}
|
|
@@ -3881,7 +3976,7 @@ function ChatMessage({ message, disabled, onAct, onTap, ui, slip, monitor }) {
|
|
|
3881
3976
|
};
|
|
3882
3977
|
return /* @__PURE__ */ jsxs37("div", { className: "ss-w-msg ss-w-bot", "data-msg-id": message.id, children: [
|
|
3883
3978
|
message.text && !message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ jsx41(Markdown, { text: message.text }) : null,
|
|
3884
|
-
message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ jsx41(GreetingDashboard, { dashboard: message.greetingDashboard, onTap }) : null,
|
|
3979
|
+
message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ jsx41(GreetingDashboard, { dashboard: message.greetingDashboard, onTap, oddsLabel: ui?.oddsLabel }) : null,
|
|
3885
3980
|
message.clubFanDashboard ? /* @__PURE__ */ jsx41(ClubFanDashboard, { dashboard: message.clubFanDashboard, onTap: onFanDashboardTap, ui }) : null,
|
|
3886
3981
|
/* @__PURE__ */ jsx41(EntityCardList, { cards: message.cards, disabled, showLessLabel: ui?.showLess, showMoreLabel: ui?.showMore }),
|
|
3887
3982
|
/* @__PURE__ */ jsx41(BettingInsightList, { insights: message.insights, ui, slip, monitor }),
|
|
@@ -3914,11 +4009,11 @@ function turnAnchor(messages) {
|
|
|
3914
4009
|
}
|
|
3915
4010
|
function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
3916
4011
|
const { state, send } = controller;
|
|
3917
|
-
const listRef =
|
|
3918
|
-
const endRef =
|
|
3919
|
-
const pinnedRef =
|
|
3920
|
-
const anchoredTurnRef =
|
|
3921
|
-
|
|
4012
|
+
const listRef = useRef11(null);
|
|
4013
|
+
const endRef = useRef11(null);
|
|
4014
|
+
const pinnedRef = useRef11(true);
|
|
4015
|
+
const anchoredTurnRef = useRef11(null);
|
|
4016
|
+
useEffect13(() => {
|
|
3922
4017
|
const anchor = turnAnchor(state.messages);
|
|
3923
4018
|
const list = listRef.current;
|
|
3924
4019
|
if (anchor && anchor.turnId !== anchoredTurnRef.current) {
|
|
@@ -4099,15 +4194,79 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
4099
4194
|
}) });
|
|
4100
4195
|
}
|
|
4101
4196
|
|
|
4102
|
-
// src/components/
|
|
4197
|
+
// src/components/LiveFactBlock.tsx
|
|
4198
|
+
import { useState as useState22 } from "react";
|
|
4103
4199
|
import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
4104
|
-
function
|
|
4105
|
-
const
|
|
4106
|
-
|
|
4107
|
-
|
|
4108
|
-
|
|
4109
|
-
return
|
|
4200
|
+
function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
|
|
4201
|
+
const [expanded, setExpanded] = useState22(false);
|
|
4202
|
+
const [current, ...earlier] = facts;
|
|
4203
|
+
if (!current) return null;
|
|
4204
|
+
const m = current.market;
|
|
4205
|
+
return /* @__PURE__ */ jsxs42("section", { className: "ss-w-fact", "aria-label": ui.liveFactLabel, children: [
|
|
4206
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-fact-k", children: [
|
|
4207
|
+
/* @__PURE__ */ jsx47("span", { children: ui.liveFactLabel }),
|
|
4208
|
+
/* @__PURE__ */ jsxs42("span", { className: "ss-w-fact-min", children: [
|
|
4209
|
+
"\xB7 ",
|
|
4210
|
+
current.minuteLabel
|
|
4211
|
+
] }),
|
|
4212
|
+
/* @__PURE__ */ jsx47("span", { className: "ss-w-fact-subj", children: current.subjectLabel })
|
|
4213
|
+
] }),
|
|
4214
|
+
/* @__PURE__ */ jsx47("p", { className: "ss-w-fact-text", children: current.text }),
|
|
4215
|
+
/* @__PURE__ */ jsx47("div", { className: "ss-w-fact-basis", children: current.basis }),
|
|
4216
|
+
m && !m.isSuspended && /* @__PURE__ */ jsxs42("div", { className: "ss-w-fact-mkt", children: [
|
|
4217
|
+
/* @__PURE__ */ jsxs42("span", { children: [
|
|
4218
|
+
m.marketLabel,
|
|
4219
|
+
" \xB7 ",
|
|
4220
|
+
m.selectionLabel
|
|
4221
|
+
] }),
|
|
4222
|
+
/* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-stat-mkt-right", children: [
|
|
4223
|
+
typeof m.price === "number" && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-price", children: m.price.toFixed(2) }),
|
|
4224
|
+
/* @__PURE__ */ jsx47(
|
|
4225
|
+
SlipButton,
|
|
4226
|
+
{
|
|
4227
|
+
selection: chipSelection(m, matchId, slip.conversationId),
|
|
4228
|
+
shownOdds: typeof m.price === "number" ? m.price.toFixed(2) : "",
|
|
4229
|
+
marketDeveloperName: m.marketDeveloperName,
|
|
4230
|
+
selectionLabel: m.selectionLabel,
|
|
4231
|
+
slip,
|
|
4232
|
+
ui
|
|
4233
|
+
}
|
|
4234
|
+
)
|
|
4235
|
+
] })
|
|
4236
|
+
] }),
|
|
4237
|
+
expanded && earlier.length > 0 && /* @__PURE__ */ jsx47("ul", { className: "ss-w-fact-hist", children: earlier.map((f) => /* @__PURE__ */ jsxs42("li", { children: [
|
|
4238
|
+
/* @__PURE__ */ jsx47("span", { className: "ss-w-fact-hmin", children: f.minuteLabel }),
|
|
4239
|
+
/* @__PURE__ */ jsxs42("div", { children: [
|
|
4240
|
+
/* @__PURE__ */ jsx47("p", { className: "ss-w-fact-htext", children: f.text }),
|
|
4241
|
+
/* @__PURE__ */ jsx47("div", { className: "ss-w-fact-basis", children: f.basis })
|
|
4242
|
+
] })
|
|
4243
|
+
] }, f.id)) }),
|
|
4244
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-fact-foot", children: [
|
|
4245
|
+
onAsk && /* @__PURE__ */ jsx47(
|
|
4246
|
+
"button",
|
|
4247
|
+
{
|
|
4248
|
+
type: "button",
|
|
4249
|
+
className: "ss-w-fact-link",
|
|
4250
|
+
onClick: () => onAsk(current.text, { kind: "liveFact", matchId, subject: current.text.slice(0, 400) }),
|
|
4251
|
+
children: ui.liveFactAsk
|
|
4252
|
+
}
|
|
4253
|
+
),
|
|
4254
|
+
earlier.length > 0 && /* @__PURE__ */ jsx47(
|
|
4255
|
+
"button",
|
|
4256
|
+
{
|
|
4257
|
+
type: "button",
|
|
4258
|
+
className: "ss-w-fact-link ss-w-fact-link--muted",
|
|
4259
|
+
"aria-expanded": expanded,
|
|
4260
|
+
onClick: () => setExpanded((v) => !v),
|
|
4261
|
+
children: expanded ? ui.liveFactHideEarlier : ui.liveFactEarlier(earlier.length)
|
|
4262
|
+
}
|
|
4263
|
+
)
|
|
4264
|
+
] })
|
|
4265
|
+
] });
|
|
4110
4266
|
}
|
|
4267
|
+
|
|
4268
|
+
// src/components/MonitorMatchCard.tsx
|
|
4269
|
+
import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
4111
4270
|
function isPromoted(row, promotedPins) {
|
|
4112
4271
|
const chip = row.market;
|
|
4113
4272
|
if (!chip) return false;
|
|
@@ -4133,7 +4292,7 @@ function groupScorers(goals, ownGoalLabel) {
|
|
|
4133
4292
|
return { player: name, label: name ? `${name} ${minutes}` : minutes };
|
|
4134
4293
|
});
|
|
4135
4294
|
}
|
|
4136
|
-
function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
4295
|
+
function MonitorMatchCard({ match, promotedPins, monitor, ui, slip, onAsk }) {
|
|
4137
4296
|
const live = match.phase === "live";
|
|
4138
4297
|
const goals = match.events.filter((e) => e.type === "goal");
|
|
4139
4298
|
const homeScorers = groupScorers(goals.filter((e) => e.side === "home"), ui.ownGoalLabel);
|
|
@@ -4142,73 +4301,74 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
4142
4301
|
const otherRows = match.statRows.filter((row) => !isPromoted(row, promotedPins));
|
|
4143
4302
|
const orderedRows = [...promotedRows, ...otherRows];
|
|
4144
4303
|
const kickoff = match.phase === "preMatch" && match.kickoffUtc ? ui.bettingKickoff(match.kickoffUtc) : void 0;
|
|
4145
|
-
return /* @__PURE__ */
|
|
4146
|
-
/* @__PURE__ */
|
|
4147
|
-
live && /* @__PURE__ */
|
|
4148
|
-
/* @__PURE__ */
|
|
4304
|
+
return /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon", children: [
|
|
4305
|
+
/* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-top", children: [
|
|
4306
|
+
live && /* @__PURE__ */ jsxs43("span", { className: "ss-w-fandash-live-pill", children: [
|
|
4307
|
+
/* @__PURE__ */ jsx48("span", { className: "ss-w-fandash-live-dot", "aria-hidden": "true" }),
|
|
4149
4308
|
ui.liveLabel
|
|
4150
4309
|
] }),
|
|
4151
|
-
match.phase === "fullTime" && /* @__PURE__ */
|
|
4152
|
-
kickoff && /* @__PURE__ */
|
|
4310
|
+
match.phase === "fullTime" && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
|
|
4311
|
+
kickoff && /* @__PURE__ */ jsxs43("span", { className: "ss-w-mon-pill", children: [
|
|
4153
4312
|
kickoff.dayLabel,
|
|
4154
4313
|
" \xB7 ",
|
|
4155
4314
|
kickoff.time
|
|
4156
4315
|
] }),
|
|
4157
|
-
live && match.minuteLabel && /* @__PURE__ */
|
|
4158
|
-
match.competitionName && /* @__PURE__ */
|
|
4159
|
-
/* @__PURE__ */
|
|
4316
|
+
live && match.minuteLabel && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-min", children: match.minuteLabel }),
|
|
4317
|
+
match.competitionName && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-comp", children: match.competitionName }),
|
|
4318
|
+
/* @__PURE__ */ jsx48(PinToggle, { ui, monitor, pin: { kind: "match", matchId: match.matchId } })
|
|
4160
4319
|
] }),
|
|
4161
|
-
/* @__PURE__ */
|
|
4162
|
-
/* @__PURE__ */
|
|
4163
|
-
/* @__PURE__ */
|
|
4164
|
-
/* @__PURE__ */
|
|
4320
|
+
/* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-main", children: [
|
|
4321
|
+
/* @__PURE__ */ jsxs43("span", { className: "ss-w-mon-side", children: [
|
|
4322
|
+
/* @__PURE__ */ jsx48(Crest2, { kind: "team", url: match.homeCrestUrl ?? void 0, name: match.homeTeamName ?? void 0 }),
|
|
4323
|
+
/* @__PURE__ */ jsx48("span", { className: "ss-w-mon-name", children: match.homeTeamName })
|
|
4165
4324
|
] }),
|
|
4166
|
-
match.phase === "preMatch" ? /* @__PURE__ */
|
|
4325
|
+
match.phase === "preMatch" ? /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-vs", children: "vs" }) : /* @__PURE__ */ jsxs43("span", { className: "ss-w-mon-score", children: [
|
|
4167
4326
|
match.homeScore,
|
|
4168
|
-
/* @__PURE__ */
|
|
4327
|
+
/* @__PURE__ */ jsx48("i", { children: "\u2013" }),
|
|
4169
4328
|
match.awayScore
|
|
4170
4329
|
] }),
|
|
4171
|
-
/* @__PURE__ */
|
|
4172
|
-
/* @__PURE__ */
|
|
4173
|
-
/* @__PURE__ */
|
|
4330
|
+
/* @__PURE__ */ jsxs43("span", { className: "ss-w-mon-side ss-w-mon-side--away", children: [
|
|
4331
|
+
/* @__PURE__ */ jsx48(Crest2, { kind: "team", url: match.awayCrestUrl ?? void 0, name: match.awayTeamName ?? void 0 }),
|
|
4332
|
+
/* @__PURE__ */ jsx48("span", { className: "ss-w-mon-name", children: match.awayTeamName })
|
|
4174
4333
|
] })
|
|
4175
4334
|
] }),
|
|
4176
|
-
(homeScorers.length > 0 || awayScorers.length > 0) && /* @__PURE__ */
|
|
4177
|
-
/* @__PURE__ */
|
|
4178
|
-
/* @__PURE__ */
|
|
4179
|
-
/* @__PURE__ */
|
|
4335
|
+
(homeScorers.length > 0 || awayScorers.length > 0) && /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-scorers", children: [
|
|
4336
|
+
/* @__PURE__ */ jsx48("ul", { className: "ss-w-mon-scorers-col ss-w-mon-scorers-home", children: homeScorers.map((s, i) => /* @__PURE__ */ jsx48("li", { children: s.label }, `${s.player}-${i}`)) }),
|
|
4337
|
+
/* @__PURE__ */ jsx48("span", { className: "ss-w-mon-scorers-ball", "aria-hidden": "true", children: "\u26BD" }),
|
|
4338
|
+
/* @__PURE__ */ jsx48("ul", { className: "ss-w-mon-scorers-col ss-w-mon-scorers-away", children: awayScorers.map((s, i) => /* @__PURE__ */ jsx48("li", { children: s.label }, `${s.player}-${i}`)) })
|
|
4180
4339
|
] }),
|
|
4181
|
-
/* @__PURE__ */
|
|
4340
|
+
live && match.facts && match.facts.length > 0 && /* @__PURE__ */ jsx48(LiveFactBlock, { facts: match.facts, matchId: match.matchId, ui, slip, onAsk }),
|
|
4341
|
+
/* @__PURE__ */ jsx48("div", { className: "ss-w-mon-stats", children: orderedRows.map((row) => {
|
|
4182
4342
|
const total = row.homeNum + row.awayNum;
|
|
4183
4343
|
const homePct = total > 0 ? row.homeNum / total * 75 : 0;
|
|
4184
4344
|
const awayPct = total > 0 ? row.awayNum / total * 75 : 0;
|
|
4185
4345
|
const promoted = isPromoted(row, promotedPins);
|
|
4186
|
-
const selection = chipSelection(row, match.matchId, slip.conversationId);
|
|
4187
|
-
return /* @__PURE__ */
|
|
4188
|
-
/* @__PURE__ */
|
|
4189
|
-
/* @__PURE__ */
|
|
4190
|
-
/* @__PURE__ */
|
|
4191
|
-
/* @__PURE__ */
|
|
4346
|
+
const selection = chipSelection(row.market, match.matchId, slip.conversationId);
|
|
4347
|
+
return /* @__PURE__ */ jsxs43("div", { className: promoted ? "ss-w-mon-stat ss-w-mon-pstrip" : "ss-w-mon-stat", children: [
|
|
4348
|
+
/* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-stat-row", children: [
|
|
4349
|
+
/* @__PURE__ */ jsx48("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--home", children: row.homeValue }),
|
|
4350
|
+
/* @__PURE__ */ jsx48("span", { className: "ss-w-mon-stat-l", children: row.label }),
|
|
4351
|
+
/* @__PURE__ */ jsx48("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--away", children: row.awayValue })
|
|
4192
4352
|
] }),
|
|
4193
|
-
/* @__PURE__ */
|
|
4194
|
-
/* @__PURE__ */
|
|
4195
|
-
/* @__PURE__ */
|
|
4353
|
+
/* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-bar", children: [
|
|
4354
|
+
/* @__PURE__ */ jsx48("b", { className: "ss-w-mon-bar-home", style: { width: `${homePct}%` } }),
|
|
4355
|
+
/* @__PURE__ */ jsx48("i", { className: "ss-w-mon-bar-away", style: { width: `${awayPct}%` } })
|
|
4196
4356
|
] }),
|
|
4197
|
-
row.market && !row.market.isSuspended && /* @__PURE__ */
|
|
4198
|
-
/* @__PURE__ */
|
|
4357
|
+
row.market && !row.market.isSuspended && /* @__PURE__ */ jsxs43("div", { className: promoted ? "ss-w-mon-stat-mkt ss-w-mon-mkt" : "ss-w-mon-stat-mkt", children: [
|
|
4358
|
+
/* @__PURE__ */ jsxs43("span", { children: [
|
|
4199
4359
|
row.market.marketLabel,
|
|
4200
4360
|
" \xB7 ",
|
|
4201
4361
|
row.market.selectionLabel
|
|
4202
4362
|
] }),
|
|
4203
|
-
/* @__PURE__ */
|
|
4204
|
-
typeof row.market.price === "number" && /* @__PURE__ */
|
|
4205
|
-
/* @__PURE__ */
|
|
4363
|
+
/* @__PURE__ */ jsxs43("span", { className: "ss-w-mon-stat-mkt-right", children: [
|
|
4364
|
+
typeof row.market.price === "number" && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-price", children: row.market.price.toFixed(2) }),
|
|
4365
|
+
/* @__PURE__ */ jsx48(
|
|
4206
4366
|
SlipButton,
|
|
4207
4367
|
{
|
|
4208
4368
|
selection,
|
|
4209
4369
|
shownOdds: typeof row.market.price === "number" ? row.market.price.toFixed(2) : "",
|
|
4210
|
-
marketName: row.market.marketLabel,
|
|
4211
4370
|
marketDeveloperName: row.market.marketDeveloperName,
|
|
4371
|
+
selectionLabel: row.market.selectionLabel,
|
|
4212
4372
|
slip,
|
|
4213
4373
|
ui
|
|
4214
4374
|
}
|
|
@@ -4217,23 +4377,23 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
4217
4377
|
] })
|
|
4218
4378
|
] }, row.label);
|
|
4219
4379
|
}) }),
|
|
4220
|
-
match.status === "stale" && /* @__PURE__ */
|
|
4221
|
-
match.momentum.length > 0 && /* @__PURE__ */
|
|
4222
|
-
/* @__PURE__ */
|
|
4223
|
-
/* @__PURE__ */
|
|
4380
|
+
match.status === "stale" && /* @__PURE__ */ jsx48("span", { className: "ss-w-mon-asof", children: ui.asOf(formatTime(match.asOfUtc)) }),
|
|
4381
|
+
match.momentum.length > 0 && /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-mom", children: [
|
|
4382
|
+
/* @__PURE__ */ jsx48("span", { className: "ss-w-mon-stat-l", children: ui.momentumLabel }),
|
|
4383
|
+
/* @__PURE__ */ jsx48(MomentumWave, { points: match.momentum, clubIsHome: true })
|
|
4224
4384
|
] }),
|
|
4225
|
-
match.phase === "fullTime" && /* @__PURE__ */
|
|
4385
|
+
match.phase === "fullTime" && /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-grace", children: ui.graceNote })
|
|
4226
4386
|
] });
|
|
4227
4387
|
}
|
|
4228
4388
|
|
|
4229
4389
|
// src/components/MonitorTabs.tsx
|
|
4230
|
-
import { jsx as
|
|
4390
|
+
import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
4231
4391
|
function OddsLiveStrip({ m, ui }) {
|
|
4232
4392
|
const showScore = m.phase !== "preMatch" && typeof m.homeScore === "number";
|
|
4233
4393
|
const stale = m.status === "stale";
|
|
4234
4394
|
if (!showScore && !m.minuteLabel && !(m.isSuspended && !m.isSettled) && !m.isSettled && !stale) return null;
|
|
4235
|
-
return /* @__PURE__ */
|
|
4236
|
-
showScore && /* @__PURE__ */
|
|
4395
|
+
return /* @__PURE__ */ jsxs44("div", { className: "ss-w-mk-live", children: [
|
|
4396
|
+
showScore && /* @__PURE__ */ jsxs44("b", { className: "ss-w-mk-live-score", children: [
|
|
4237
4397
|
m.homeTeamName,
|
|
4238
4398
|
" ",
|
|
4239
4399
|
m.homeScore,
|
|
@@ -4242,27 +4402,28 @@ function OddsLiveStrip({ m, ui }) {
|
|
|
4242
4402
|
" ",
|
|
4243
4403
|
m.awayTeamName
|
|
4244
4404
|
] }),
|
|
4245
|
-
m.minuteLabel && /* @__PURE__ */
|
|
4246
|
-
m.isSuspended && !m.isSettled && /* @__PURE__ */
|
|
4247
|
-
m.isSettled && /* @__PURE__ */
|
|
4248
|
-
stale && /* @__PURE__ */
|
|
4405
|
+
m.minuteLabel && /* @__PURE__ */ jsx49("span", { className: "ss-w-mon-min", children: m.minuteLabel }),
|
|
4406
|
+
m.isSuspended && !m.isSettled && /* @__PURE__ */ jsx49("span", { className: "ss-w-mon-susp", children: ui.suspendedLabel }),
|
|
4407
|
+
m.isSettled && /* @__PURE__ */ jsx49("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
|
|
4408
|
+
stale && /* @__PURE__ */ jsx49("span", { className: "ss-w-mon-asof", children: ui.asOf(new Date(m.asOfUtc).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" })) })
|
|
4249
4409
|
] });
|
|
4250
4410
|
}
|
|
4251
|
-
function MatchesPanel({ monitor, ui, slip }) {
|
|
4411
|
+
function MatchesPanel({ monitor, ui, slip, onAsk }) {
|
|
4252
4412
|
const matches = (monitor.snapshot?.matches ?? []).filter((m) => monitor.pins.some((p) => p.kind === "match" && p.matchId === m.matchId));
|
|
4253
|
-
if (matches.length === 0) return /* @__PURE__ */
|
|
4254
|
-
return /* @__PURE__ */
|
|
4255
|
-
/* @__PURE__ */
|
|
4413
|
+
if (matches.length === 0) return /* @__PURE__ */ jsx49("div", { className: "ss-w-mon-empty", children: ui.emptyMatchesTab });
|
|
4414
|
+
return /* @__PURE__ */ jsx49("div", { className: "ss-w-mon-list", children: matches.map((m) => /* @__PURE__ */ jsxs44("div", { className: "ss-w-mon-item", children: [
|
|
4415
|
+
/* @__PURE__ */ jsx49(
|
|
4256
4416
|
MonitorMatchCard,
|
|
4257
4417
|
{
|
|
4258
4418
|
match: m,
|
|
4259
4419
|
promotedPins: monitor.pins.filter((p) => p.kind !== "match" && p.matchId === m.matchId),
|
|
4260
4420
|
monitor,
|
|
4261
4421
|
ui,
|
|
4262
|
-
slip
|
|
4422
|
+
slip,
|
|
4423
|
+
onAsk
|
|
4263
4424
|
}
|
|
4264
4425
|
),
|
|
4265
|
-
/* @__PURE__ */
|
|
4426
|
+
/* @__PURE__ */ jsx49(MarketAccordion, { match: m, monitor, ui, slip })
|
|
4266
4427
|
] }, m.matchId)) });
|
|
4267
4428
|
}
|
|
4268
4429
|
function withSinceViewMovement(vm, prev) {
|
|
@@ -4277,12 +4438,12 @@ function withSinceViewMovement(vm, prev) {
|
|
|
4277
4438
|
}
|
|
4278
4439
|
function OddsPanel({ monitor, ui, slip }) {
|
|
4279
4440
|
const markets = (monitor.snapshot?.markets ?? []).filter((m) => monitor.pins.some((p) => p.key === m.key));
|
|
4280
|
-
if (markets.length === 0) return /* @__PURE__ */
|
|
4281
|
-
return /* @__PURE__ */
|
|
4441
|
+
if (markets.length === 0) return /* @__PURE__ */ jsx49("div", { className: "ss-w-mon-empty", children: ui.emptyOddsTab });
|
|
4442
|
+
return /* @__PURE__ */ jsx49("div", { className: "ss-w-mon-list", children: markets.map((m) => {
|
|
4282
4443
|
const pin = monitor.pins.find((p) => p.key === m.key);
|
|
4283
|
-
return /* @__PURE__ */
|
|
4284
|
-
/* @__PURE__ */
|
|
4285
|
-
m.card && /* @__PURE__ */
|
|
4444
|
+
return /* @__PURE__ */ jsxs44("div", { className: "ss-w-mon-oddspin", "data-settled": m.isSettled || void 0, children: [
|
|
4445
|
+
/* @__PURE__ */ jsx49(OddsLiveStrip, { m, ui }),
|
|
4446
|
+
m.card && /* @__PURE__ */ jsx49(
|
|
4286
4447
|
MarketOddsCardList,
|
|
4287
4448
|
{
|
|
4288
4449
|
cards: [withSinceViewMovement(toMarketOddsVM(m.card), monitor.lastViewedPrices[m.key])],
|
|
@@ -4293,22 +4454,22 @@ function OddsPanel({ monitor, ui, slip }) {
|
|
|
4293
4454
|
inSlipIds: monitor.inSlip
|
|
4294
4455
|
}
|
|
4295
4456
|
),
|
|
4296
|
-
m.history && /* @__PURE__ */
|
|
4297
|
-
!m.card && !m.history && /* @__PURE__ */
|
|
4457
|
+
m.history && /* @__PURE__ */ jsx49(OddsMovementCardList, { cards: [toOddsMovementVM(m.history)], ui }),
|
|
4458
|
+
!m.card && !m.history && /* @__PURE__ */ jsx49("div", { className: "ss-w-mon-empty-card", children: ui.oddsUnavailable })
|
|
4298
4459
|
] }, m.key);
|
|
4299
4460
|
}) });
|
|
4300
4461
|
}
|
|
4301
4462
|
|
|
4302
4463
|
// src/components/FixtureRow.tsx
|
|
4303
|
-
import { jsx as
|
|
4464
|
+
import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
4304
4465
|
function kickoffLabel(kickoffUnix) {
|
|
4305
4466
|
const d = new Date(kickoffUnix * 1e3);
|
|
4306
4467
|
return `${`${d.getHours()}`.padStart(2, "0")}:${`${d.getMinutes()}`.padStart(2, "0")}`;
|
|
4307
4468
|
}
|
|
4308
4469
|
function Side({ name, crest, away = false }) {
|
|
4309
|
-
return /* @__PURE__ */
|
|
4310
|
-
crest ? /* @__PURE__ */
|
|
4311
|
-
/* @__PURE__ */
|
|
4470
|
+
return /* @__PURE__ */ jsxs45("span", { className: away ? "ss-w-drow-side ss-w-drow-side--away" : "ss-w-drow-side", children: [
|
|
4471
|
+
crest ? /* @__PURE__ */ jsx50("img", { className: "ss-w-drow-crest", src: crest, alt: "" }) : null,
|
|
4472
|
+
/* @__PURE__ */ jsx50("span", { className: "ss-w-drow-nm", children: name })
|
|
4312
4473
|
] });
|
|
4313
4474
|
}
|
|
4314
4475
|
function FixtureRow({ match, state, stale, ui, monitor }) {
|
|
@@ -4316,45 +4477,45 @@ function FixtureRow({ match, state, stale, ui, monitor }) {
|
|
|
4316
4477
|
const hasScore = (state?.phase === "live" || state?.phase === "fullTime") && typeof state.homeScore === "number" && typeof state.awayScore === "number";
|
|
4317
4478
|
const ticked = state?.phase === "live" ? state.minuteLabel ?? null : null;
|
|
4318
4479
|
const when = state?.isHalfTime && !stale ? ui.halfTime : isLive ? ticked ?? "\u2014" : state?.phase === "live" ? "\u2014" : kickoffLabel(match.kickoffUnix);
|
|
4319
|
-
return /* @__PURE__ */
|
|
4320
|
-
/* @__PURE__ */
|
|
4321
|
-
/* @__PURE__ */
|
|
4322
|
-
/* @__PURE__ */
|
|
4323
|
-
/* @__PURE__ */
|
|
4324
|
-
/* @__PURE__ */
|
|
4480
|
+
return /* @__PURE__ */ jsxs45("div", { className: isLive || state?.isHalfTime ? "ss-w-drow ss-w-drow--live" : "ss-w-drow", children: [
|
|
4481
|
+
/* @__PURE__ */ jsx50("span", { className: isLive || state?.isHalfTime ? "ss-w-drow-when ss-w-drow-when--live" : "ss-w-drow-when", children: when }),
|
|
4482
|
+
/* @__PURE__ */ jsxs45("span", { className: "ss-w-drow-fx", children: [
|
|
4483
|
+
/* @__PURE__ */ jsx50(Side, { name: match.homeTeamName, crest: match.homeTeamImagePath }),
|
|
4484
|
+
/* @__PURE__ */ jsx50("span", { className: hasScore ? "ss-w-drow-sc" : "ss-w-drow-sc ss-w-drow-sc--idle", children: hasScore ? `${state.homeScore}\u2013${state.awayScore}` : "\u2013" }),
|
|
4485
|
+
/* @__PURE__ */ jsx50(Side, { name: match.awayTeamName, crest: match.awayTeamImagePath, away: true })
|
|
4325
4486
|
] }),
|
|
4326
|
-
/* @__PURE__ */
|
|
4487
|
+
/* @__PURE__ */ jsx50(PinToggle, { ui, monitor, pin: { kind: "match", matchId: match.matchId } })
|
|
4327
4488
|
] });
|
|
4328
4489
|
}
|
|
4329
4490
|
|
|
4330
4491
|
// src/components/CompetitionGroup.tsx
|
|
4331
|
-
import { jsx as
|
|
4492
|
+
import { jsx as jsx51, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
4332
4493
|
function CompetitionGroup({ group, open, onToggle, states, stale, ui, monitor, disambiguate = false }) {
|
|
4333
4494
|
const own = group.matches.filter((m) => !isTreatedLive(states[m.matchId], stale));
|
|
4334
4495
|
const hasLive = own.length !== group.matches.length;
|
|
4335
4496
|
if (own.length === 0) {
|
|
4336
4497
|
return null;
|
|
4337
4498
|
}
|
|
4338
|
-
return /* @__PURE__ */
|
|
4339
|
-
/* @__PURE__ */
|
|
4340
|
-
/* @__PURE__ */
|
|
4341
|
-
hasLive && /* @__PURE__ */
|
|
4342
|
-
/* @__PURE__ */
|
|
4499
|
+
return /* @__PURE__ */ jsxs46("div", { className: "ss-w-grp", children: [
|
|
4500
|
+
/* @__PURE__ */ jsxs46("button", { type: "button", className: "ss-w-grp-head", "aria-expanded": open, onClick: onToggle, children: [
|
|
4501
|
+
/* @__PURE__ */ jsx51("span", { className: "ss-w-grp-chev", children: open ? "\u25BE" : "\u25B8" }),
|
|
4502
|
+
hasLive && /* @__PURE__ */ jsx51("span", { className: "ss-w-sec-dot", "aria-hidden": "true" }),
|
|
4503
|
+
/* @__PURE__ */ jsxs46("span", { className: "ss-w-grp-name", children: [
|
|
4343
4504
|
group.competitionName,
|
|
4344
|
-
disambiguate && group.competitionCountry ? /* @__PURE__ */
|
|
4505
|
+
disambiguate && group.competitionCountry ? /* @__PURE__ */ jsxs46("span", { className: "ss-w-grp-country", children: [
|
|
4345
4506
|
" (",
|
|
4346
4507
|
group.competitionCountry,
|
|
4347
4508
|
")"
|
|
4348
4509
|
] }) : null
|
|
4349
4510
|
] }),
|
|
4350
|
-
/* @__PURE__ */
|
|
4511
|
+
/* @__PURE__ */ jsx51("span", { className: "ss-w-grp-count", children: own.length })
|
|
4351
4512
|
] }),
|
|
4352
|
-
open && /* @__PURE__ */
|
|
4513
|
+
open && /* @__PURE__ */ jsx51("div", { className: "ss-w-grp-body", children: own.map((m) => /* @__PURE__ */ jsx51(FixtureRow, { match: m, state: states[m.matchId], stale, ui, monitor }, m.matchId)) })
|
|
4353
4514
|
] });
|
|
4354
4515
|
}
|
|
4355
4516
|
|
|
4356
4517
|
// src/components/TodayPanel.tsx
|
|
4357
|
-
import { Fragment as Fragment7, jsx as
|
|
4518
|
+
import { Fragment as Fragment7, jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
4358
4519
|
function TodayPanel({ discovery, ui, monitor }) {
|
|
4359
4520
|
const { groups, states, stale, expanded, toggleGroup } = discovery;
|
|
4360
4521
|
const visibleGroups = visibleGroupsOf(groups, states);
|
|
@@ -4363,14 +4524,14 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
4363
4524
|
acc[g.competitionName] = (acc[g.competitionName] ?? 0) + 1;
|
|
4364
4525
|
return acc;
|
|
4365
4526
|
}, {});
|
|
4366
|
-
return /* @__PURE__ */
|
|
4367
|
-
stale && /* @__PURE__ */
|
|
4368
|
-
liveRows.length > 0 && /* @__PURE__ */
|
|
4369
|
-
/* @__PURE__ */
|
|
4370
|
-
/* @__PURE__ */
|
|
4527
|
+
return /* @__PURE__ */ jsxs47("div", { className: "ss-w-mon-list", children: [
|
|
4528
|
+
stale && /* @__PURE__ */ jsx52("div", { className: "ss-w-stale", children: ui.staleStates }),
|
|
4529
|
+
liveRows.length > 0 && /* @__PURE__ */ jsxs47(Fragment7, { children: [
|
|
4530
|
+
/* @__PURE__ */ jsxs47("div", { className: "ss-w-sec-head", children: [
|
|
4531
|
+
/* @__PURE__ */ jsx52("span", { className: "ss-w-sec-dot", "aria-hidden": "true" }),
|
|
4371
4532
|
ui.sectionLive
|
|
4372
4533
|
] }),
|
|
4373
|
-
/* @__PURE__ */
|
|
4534
|
+
/* @__PURE__ */ jsx52("div", { className: "ss-w-today-live", children: liveRows.map(({ match }) => /* @__PURE__ */ jsx52(
|
|
4374
4535
|
FixtureRow,
|
|
4375
4536
|
{
|
|
4376
4537
|
match,
|
|
@@ -4382,7 +4543,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
4382
4543
|
match.matchId
|
|
4383
4544
|
)) })
|
|
4384
4545
|
] }),
|
|
4385
|
-
visibleGroups.map((group) => /* @__PURE__ */
|
|
4546
|
+
visibleGroups.map((group) => /* @__PURE__ */ jsx52(
|
|
4386
4547
|
CompetitionGroup,
|
|
4387
4548
|
{
|
|
4388
4549
|
group,
|
|
@@ -4400,16 +4561,16 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
4400
4561
|
}
|
|
4401
4562
|
|
|
4402
4563
|
// src/components/GamesPanel.tsx
|
|
4403
|
-
import { useEffect as
|
|
4564
|
+
import { useEffect as useEffect17, useState as useState36 } from "react";
|
|
4404
4565
|
|
|
4405
4566
|
// src/components/GamesLoginWall.tsx
|
|
4406
|
-
import { jsx as
|
|
4567
|
+
import { jsx as jsx53 } from "react/jsx-runtime";
|
|
4407
4568
|
function GamesLoginWall({ ui }) {
|
|
4408
|
-
return /* @__PURE__ */
|
|
4569
|
+
return /* @__PURE__ */ jsx53("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx53("div", { className: "ss-w-games-wall", children: /* @__PURE__ */ jsx53("p", { children: ui.gamesLoginRequired }) }) });
|
|
4409
4570
|
}
|
|
4410
4571
|
|
|
4411
4572
|
// src/components/GamesHub.tsx
|
|
4412
|
-
import { useEffect as
|
|
4573
|
+
import { useEffect as useEffect14, useState as useState23 } from "react";
|
|
4413
4574
|
|
|
4414
4575
|
// src/components/games/ui/gameMeta.ts
|
|
4415
4576
|
function prettifyGameId(gameId) {
|
|
@@ -4425,75 +4586,75 @@ function splitName(full) {
|
|
|
4425
4586
|
}
|
|
4426
4587
|
|
|
4427
4588
|
// src/components/GameTileArt.tsx
|
|
4428
|
-
import { Fragment as Fragment8, jsx as
|
|
4589
|
+
import { Fragment as Fragment8, jsx as jsx54, jsxs as jsxs48 } from "react/jsx-runtime";
|
|
4429
4590
|
function GameTileArt({ gameId }) {
|
|
4430
|
-
return /* @__PURE__ */
|
|
4591
|
+
return /* @__PURE__ */ jsx54("svg", { className: "ss-g-art", viewBox: "0 0 120 74", "aria-hidden": "true", children: ART[gameId] ?? ART.default });
|
|
4431
4592
|
}
|
|
4432
|
-
var head = (cx, cy, r, cls = "ss-g-art-fg") => /* @__PURE__ */
|
|
4433
|
-
/* @__PURE__ */
|
|
4434
|
-
/* @__PURE__ */
|
|
4593
|
+
var head = (cx, cy, r, cls = "ss-g-art-fg") => /* @__PURE__ */ jsxs48("g", { className: cls, children: [
|
|
4594
|
+
/* @__PURE__ */ jsx54("circle", { cx, cy: cy - r * 0.3, r: r * 0.45 }),
|
|
4595
|
+
/* @__PURE__ */ jsx54("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` })
|
|
4435
4596
|
] });
|
|
4436
4597
|
var ART = {
|
|
4437
|
-
"mystery-tiger": /* @__PURE__ */
|
|
4598
|
+
"mystery-tiger": /* @__PURE__ */ jsxs48(Fragment8, { children: [
|
|
4438
4599
|
head(60, 38, 26, "ss-g-art-fg"),
|
|
4439
|
-
/* @__PURE__ */
|
|
4600
|
+
/* @__PURE__ */ jsx54("text", { x: "60", y: "36", className: "ss-g-art-q", textAnchor: "middle", children: "?" })
|
|
4440
4601
|
] }),
|
|
4441
|
-
"higher-or-lower": /* @__PURE__ */
|
|
4602
|
+
"higher-or-lower": /* @__PURE__ */ jsxs48(Fragment8, { children: [
|
|
4442
4603
|
head(32, 38, 20),
|
|
4443
4604
|
head(88, 38, 20),
|
|
4444
|
-
/* @__PURE__ */
|
|
4445
|
-
/* @__PURE__ */
|
|
4605
|
+
/* @__PURE__ */ jsx54("circle", { cx: "60", cy: "37", r: "11", className: "ss-g-art-accent" }),
|
|
4606
|
+
/* @__PURE__ */ jsx54("path", { d: "M57 33l3-3 3 3M57 41l3 3 3-3", className: "ss-g-art-ink" })
|
|
4446
4607
|
] }),
|
|
4447
|
-
"guess-the-xi": /* @__PURE__ */
|
|
4448
|
-
/* @__PURE__ */
|
|
4449
|
-
[[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__ */
|
|
4608
|
+
"guess-the-xi": /* @__PURE__ */ jsxs48(Fragment8, { children: [
|
|
4609
|
+
/* @__PURE__ */ jsx54("rect", { x: "8", y: "4", width: "104", height: "66", rx: "6", className: "ss-g-art-pitch" }),
|
|
4610
|
+
[[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__ */ jsx54("circle", { cx: x, cy: y, r: "4", className: a ? "ss-g-art-accent" : "ss-g-art-dot" }, i))
|
|
4450
4611
|
] }),
|
|
4451
|
-
"daily-quiz": /* @__PURE__ */
|
|
4452
|
-
"career-path": /* @__PURE__ */
|
|
4453
|
-
/* @__PURE__ */
|
|
4454
|
-
/* @__PURE__ */
|
|
4455
|
-
/* @__PURE__ */
|
|
4456
|
-
/* @__PURE__ */
|
|
4457
|
-
/* @__PURE__ */
|
|
4612
|
+
"daily-quiz": /* @__PURE__ */ jsx54(Fragment8, { children: [[14, 8], [62, 8], [14, 40], [62, 40]].map(([x, y], i) => /* @__PURE__ */ jsx54("rect", { x, y, width: "44", height: "26", rx: "5", className: i === 1 ? "ss-g-art-correct" : "ss-g-art-block" }, i)) }),
|
|
4613
|
+
"career-path": /* @__PURE__ */ jsxs48(Fragment8, { children: [
|
|
4614
|
+
/* @__PURE__ */ jsx54("path", { d: "M18 22h24v10c0 7-5 11-12 13-7-2-12-6-12-13z", className: "ss-g-art-fg" }),
|
|
4615
|
+
/* @__PURE__ */ jsx54("path", { d: "M48 37h8M84 37h8", className: "ss-g-art-line" }),
|
|
4616
|
+
/* @__PURE__ */ jsx54("path", { d: "M60 22h24v10c0 7-5 11-12 13-7-2-12-6-12-13z", className: "ss-g-art-fg" }),
|
|
4617
|
+
/* @__PURE__ */ jsx54("rect", { x: "96", y: "22", width: "18", height: "26", rx: "4", className: "ss-g-art-dash" }),
|
|
4618
|
+
/* @__PURE__ */ jsx54("text", { x: "105", y: "40", className: "ss-g-art-q", textAnchor: "middle", children: "?" })
|
|
4458
4619
|
] }),
|
|
4459
|
-
"beat-the-grid": /* @__PURE__ */
|
|
4460
|
-
"matchday-predictor": /* @__PURE__ */
|
|
4461
|
-
/* @__PURE__ */
|
|
4462
|
-
/* @__PURE__ */
|
|
4463
|
-
/* @__PURE__ */
|
|
4464
|
-
/* @__PURE__ */
|
|
4620
|
+
"beat-the-grid": /* @__PURE__ */ jsx54(Fragment8, { children: [0, 1, 2].flatMap((r) => [0, 1, 2].map((c) => /* @__PURE__ */ jsx54("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}`))) }),
|
|
4621
|
+
"matchday-predictor": /* @__PURE__ */ jsxs48(Fragment8, { children: [
|
|
4622
|
+
/* @__PURE__ */ jsx54("path", { d: "M10 20h20v9c0 6-4 9-10 11-6-2-10-5-10-11z", className: "ss-g-art-fg" }),
|
|
4623
|
+
/* @__PURE__ */ jsx54("rect", { x: "38", y: "22", width: "18", height: "24", rx: "4", className: "ss-g-art-accent-stroke" }),
|
|
4624
|
+
/* @__PURE__ */ jsx54("rect", { x: "64", y: "22", width: "18", height: "24", rx: "4", className: "ss-g-art-dash" }),
|
|
4625
|
+
/* @__PURE__ */ jsx54("path", { d: "M90 20h20v9c0 6-4 9-10 11-6-2-10-5-10-11z", className: "ss-g-art-fg" })
|
|
4465
4626
|
] }),
|
|
4466
|
-
"starting-xi": /* @__PURE__ */
|
|
4467
|
-
/* @__PURE__ */
|
|
4468
|
-
[[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__ */
|
|
4627
|
+
"starting-xi": /* @__PURE__ */ jsxs48(Fragment8, { children: [
|
|
4628
|
+
/* @__PURE__ */ jsx54("rect", { x: "8", y: "4", width: "104", height: "66", rx: "6", className: "ss-g-art-pitch" }),
|
|
4629
|
+
[[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__ */ jsx54("circle", { cx: x, cy: y, r: "5", className: i < 7 ? "ss-g-art-accent" : "ss-g-art-dash" }, i))
|
|
4469
4630
|
] }),
|
|
4470
|
-
"stat-ladder": /* @__PURE__ */
|
|
4471
|
-
"fan-motm": /* @__PURE__ */
|
|
4472
|
-
/* @__PURE__ */
|
|
4631
|
+
"stat-ladder": /* @__PURE__ */ jsx54(Fragment8, { children: [[20, 70], [34, 52], [48, 34]].map(([y, w], i) => /* @__PURE__ */ jsx54("rect", { x: "24", y, width: w, height: "12", rx: "3", className: i === 1 ? "ss-g-art-accent" : "ss-g-art-block" }, i)) }),
|
|
4632
|
+
"fan-motm": /* @__PURE__ */ jsxs48(Fragment8, { children: [
|
|
4633
|
+
/* @__PURE__ */ jsx54("circle", { cx: "60", cy: "37", r: "26", className: "ss-g-art-accent-stroke" }),
|
|
4473
4634
|
head(60, 40, 18),
|
|
4474
|
-
/* @__PURE__ */
|
|
4635
|
+
/* @__PURE__ */ jsx54("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" })
|
|
4475
4636
|
] }),
|
|
4476
|
-
default: /* @__PURE__ */
|
|
4637
|
+
default: /* @__PURE__ */ jsx54("circle", { cx: "60", cy: "37", r: "22", className: "ss-g-art-fg" })
|
|
4477
4638
|
};
|
|
4478
4639
|
|
|
4479
4640
|
// src/components/games/ui/Chip.tsx
|
|
4480
|
-
import { jsx as
|
|
4641
|
+
import { jsx as jsx55, jsxs as jsxs49 } from "react/jsx-runtime";
|
|
4481
4642
|
function Chip({ variant = "neutral", icon, children, className }) {
|
|
4482
|
-
return /* @__PURE__ */
|
|
4643
|
+
return /* @__PURE__ */ jsxs49("span", { className: `ss-g-chip ss-g-chip--${variant}${className ? ` ${className}` : ""}`, children: [
|
|
4483
4644
|
icon,
|
|
4484
4645
|
children
|
|
4485
4646
|
] });
|
|
4486
4647
|
}
|
|
4487
4648
|
function StatStack({ value, label }) {
|
|
4488
|
-
return /* @__PURE__ */
|
|
4489
|
-
/* @__PURE__ */
|
|
4490
|
-
/* @__PURE__ */
|
|
4649
|
+
return /* @__PURE__ */ jsxs49("span", { className: "ss-g-statstack", children: [
|
|
4650
|
+
/* @__PURE__ */ jsx55("span", { className: "ss-g-statstack-v", children: value }),
|
|
4651
|
+
/* @__PURE__ */ jsx55("span", { className: "ss-g-statstack-l", children: label })
|
|
4491
4652
|
] });
|
|
4492
4653
|
}
|
|
4493
4654
|
|
|
4494
4655
|
// src/components/games/ui/icons.tsx
|
|
4495
|
-
import { jsx as
|
|
4496
|
-
var svg = (size, children, fill = false) => /* @__PURE__ */
|
|
4656
|
+
import { jsx as jsx56 } from "react/jsx-runtime";
|
|
4657
|
+
var svg = (size, children, fill = false) => /* @__PURE__ */ jsx56(
|
|
4497
4658
|
"svg",
|
|
4498
4659
|
{
|
|
4499
4660
|
width: size,
|
|
@@ -4508,25 +4669,25 @@ var svg = (size, children, fill = false) => /* @__PURE__ */ jsx55(
|
|
|
4508
4669
|
children
|
|
4509
4670
|
}
|
|
4510
4671
|
);
|
|
4511
|
-
var IconChevronLeft = ({ size = 20 }) => svg(size, /* @__PURE__ */
|
|
4512
|
-
var IconLock = ({ size = 14 }) => svg(size, [/* @__PURE__ */
|
|
4513
|
-
var IconCheck = ({ size = 14 }) => svg(size, /* @__PURE__ */
|
|
4514
|
-
var IconClose = ({ size = 16 }) => svg(size, /* @__PURE__ */
|
|
4515
|
-
var IconSearch = ({ size = 18 }) => svg(size, [/* @__PURE__ */
|
|
4516
|
-
var IconPlus = ({ size = 20 }) => svg(size, /* @__PURE__ */
|
|
4517
|
-
var IconBulb = ({ size = 16 }) => svg(size, [/* @__PURE__ */
|
|
4518
|
-
var IconArrowUp = ({ size = 12 }) => svg(size, /* @__PURE__ */
|
|
4519
|
-
var IconArrowDown = ({ size = 12 }) => svg(size, /* @__PURE__ */
|
|
4520
|
-
var IconCalendar = ({ size = 18 }) => svg(size, [/* @__PURE__ */
|
|
4521
|
-
var IconShield = ({ size = 18 }) => svg(size, /* @__PURE__ */
|
|
4522
|
-
var IconFlag = ({ size = 18 }) => svg(size, /* @__PURE__ */
|
|
4523
|
-
var IconBall = ({ size = 18 }) => svg(size, [/* @__PURE__ */
|
|
4524
|
-
var IconBoot = ({ size = 18 }) => svg(size, /* @__PURE__ */
|
|
4525
|
-
var IconGloves = ({ size = 18 }) => svg(size, /* @__PURE__ */
|
|
4526
|
-
var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */
|
|
4672
|
+
var IconChevronLeft = ({ size = 20 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M15 18l-6-6 6-6" }));
|
|
4673
|
+
var IconLock = ({ size = 14 }) => svg(size, [/* @__PURE__ */ jsx56("rect", { x: "5", y: "11", width: "14", height: "10", rx: "2" }, "a"), /* @__PURE__ */ jsx56("path", { d: "M8 11V7a4 4 0 0 1 8 0v4" }, "b")]);
|
|
4674
|
+
var IconCheck = ({ size = 14 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M5 12l5 5 9-10" }));
|
|
4675
|
+
var IconClose = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M6 6l12 12M18 6L6 18" }));
|
|
4676
|
+
var IconSearch = ({ size = 18 }) => svg(size, [/* @__PURE__ */ jsx56("circle", { cx: "11", cy: "11", r: "7" }, "a"), /* @__PURE__ */ jsx56("path", { d: "M20 20l-3.5-3.5" }, "b")]);
|
|
4677
|
+
var IconPlus = ({ size = 20 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M12 5v14M5 12h14" }));
|
|
4678
|
+
var IconBulb = ({ size = 16 }) => svg(size, [/* @__PURE__ */ jsx56("path", { d: "M9 18h6M10 21h4" }, "a"), /* @__PURE__ */ jsx56("path", { d: "M12 3a6 6 0 0 0-3.5 10.9V16h7v-2.1A6 6 0 0 0 12 3z" }, "b")]);
|
|
4679
|
+
var IconArrowUp = ({ size = 12 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M12 19V5M5 12l7-7 7 7" }));
|
|
4680
|
+
var IconArrowDown = ({ size = 12 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M12 5v14M19 12l-7 7-7-7" }));
|
|
4681
|
+
var IconCalendar = ({ size = 18 }) => svg(size, [/* @__PURE__ */ jsx56("rect", { x: "4", y: "5", width: "16", height: "15", rx: "2" }, "a"), /* @__PURE__ */ jsx56("path", { d: "M4 10h16M9 3v4M15 3v4" }, "b")]);
|
|
4682
|
+
var IconShield = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M12 3l7 3v6c0 5-3 8-7 9-4-1-7-4-7-9V6z" }));
|
|
4683
|
+
var IconFlag = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M5 21V4M5 4h12l-2 4 2 4H5" }));
|
|
4684
|
+
var IconBall = ({ size = 18 }) => svg(size, [/* @__PURE__ */ jsx56("circle", { cx: "12", cy: "12", r: "9" }, "a"), /* @__PURE__ */ jsx56("path", { d: "M12 7l4 3-1.5 4.5h-5L8 10z" }, "b")]);
|
|
4685
|
+
var IconBoot = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx56("path", { d: "M4 6h6l1 6 8 3v3H4z" }));
|
|
4686
|
+
var IconGloves = ({ size = 18 }) => svg(size, /* @__PURE__ */ jsx56("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" }));
|
|
4687
|
+
var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx56("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);
|
|
4527
4688
|
|
|
4528
4689
|
// src/components/GameTile.tsx
|
|
4529
|
-
import { Fragment as Fragment9, jsx as
|
|
4690
|
+
import { Fragment as Fragment9, jsx as jsx57, jsxs as jsxs50 } from "react/jsx-runtime";
|
|
4530
4691
|
function tileStatus(game, ui) {
|
|
4531
4692
|
switch (game.status) {
|
|
4532
4693
|
case "locked":
|
|
@@ -4550,38 +4711,38 @@ function GameTile({ game, onOpen, ui, variant = "tile" }) {
|
|
|
4550
4711
|
const status = tileStatus(game, ui);
|
|
4551
4712
|
const disabled = DISABLED.has(game.status);
|
|
4552
4713
|
const title = gameTitle(game, ui.games.titles);
|
|
4553
|
-
const body = variant === "hero" ? /* @__PURE__ */
|
|
4554
|
-
/* @__PURE__ */
|
|
4555
|
-
/* @__PURE__ */
|
|
4556
|
-
status.tone === "new" && /* @__PURE__ */
|
|
4557
|
-
/* @__PURE__ */
|
|
4558
|
-
/* @__PURE__ */
|
|
4559
|
-
status.tone === "success" ? /* @__PURE__ */
|
|
4714
|
+
const body = variant === "hero" ? /* @__PURE__ */ jsxs50(Fragment9, { children: [
|
|
4715
|
+
/* @__PURE__ */ jsxs50("span", { className: "ss-g-hero-text", children: [
|
|
4716
|
+
/* @__PURE__ */ jsx57("span", { className: "ss-g-hero-eyebrow", children: ui.games.dailyChallenge }),
|
|
4717
|
+
status.tone === "new" && /* @__PURE__ */ jsx57(Chip, { variant: "badge", children: ui.games.newToday }),
|
|
4718
|
+
/* @__PURE__ */ jsx57("span", { className: "ss-g-hero-title", children: title }),
|
|
4719
|
+
/* @__PURE__ */ jsx57("span", { className: "ss-g-hero-sub", children: ui.games.taglines[game.gameId] ?? "" }),
|
|
4720
|
+
status.tone === "success" ? /* @__PURE__ */ jsx57("span", { className: "ss-g-tile-status", "data-tone": "success", children: status.text }) : /* @__PURE__ */ jsxs50("span", { className: "ss-g-hero-cta", children: [
|
|
4560
4721
|
status.tone === "accent" ? ui.games.resume : ui.games.playNow,
|
|
4561
4722
|
" \u2192"
|
|
4562
4723
|
] })
|
|
4563
4724
|
] }),
|
|
4564
|
-
/* @__PURE__ */
|
|
4565
|
-
] }) : variant === "wide" ? /* @__PURE__ */
|
|
4566
|
-
/* @__PURE__ */
|
|
4567
|
-
/* @__PURE__ */
|
|
4568
|
-
/* @__PURE__ */
|
|
4569
|
-
/* @__PURE__ */
|
|
4570
|
-
status.tone === "new" && /* @__PURE__ */
|
|
4725
|
+
/* @__PURE__ */ jsx57("span", { className: "ss-g-hero-art", children: /* @__PURE__ */ jsx57(GameTileArt, { gameId: game.gameId }) })
|
|
4726
|
+
] }) : variant === "wide" ? /* @__PURE__ */ jsxs50(Fragment9, { children: [
|
|
4727
|
+
/* @__PURE__ */ jsx57("span", { className: "ss-g-wide-art", children: /* @__PURE__ */ jsx57(GameTileArt, { gameId: game.gameId }) }),
|
|
4728
|
+
/* @__PURE__ */ jsxs50("span", { className: "ss-g-wide-text", children: [
|
|
4729
|
+
/* @__PURE__ */ jsx57("span", { className: "ss-g-tile-title", children: title }),
|
|
4730
|
+
/* @__PURE__ */ jsx57("span", { className: "ss-g-tile-status", "data-tone": status.tone, children: status.text }),
|
|
4731
|
+
status.tone === "new" && /* @__PURE__ */ jsx57(Chip, { variant: "badge", children: ui.games.newToday })
|
|
4571
4732
|
] }),
|
|
4572
|
-
/* @__PURE__ */
|
|
4573
|
-
] }) : /* @__PURE__ */
|
|
4574
|
-
/* @__PURE__ */
|
|
4575
|
-
/* @__PURE__ */
|
|
4576
|
-
/* @__PURE__ */
|
|
4733
|
+
/* @__PURE__ */ jsx57("span", { className: "ss-g-wide-chev", children: /* @__PURE__ */ jsx57(IconChevronLeft, { size: 18 }) })
|
|
4734
|
+
] }) : /* @__PURE__ */ jsxs50(Fragment9, { children: [
|
|
4735
|
+
/* @__PURE__ */ jsx57("span", { className: "ss-g-tile-art", children: /* @__PURE__ */ jsx57(GameTileArt, { gameId: game.gameId }) }),
|
|
4736
|
+
/* @__PURE__ */ jsx57("span", { className: "ss-g-tile-title", children: title }),
|
|
4737
|
+
/* @__PURE__ */ jsx57("span", { className: "ss-g-tile-status", "data-tone": status.tone, children: status.text })
|
|
4577
4738
|
] });
|
|
4578
4739
|
const cls = `ss-g-tile ss-g-tile--${variant}`;
|
|
4579
|
-
if (disabled) return /* @__PURE__ */
|
|
4580
|
-
return /* @__PURE__ */
|
|
4740
|
+
if (disabled) return /* @__PURE__ */ jsx57("div", { className: cls, "data-disabled": true, "aria-disabled": "true", children: body });
|
|
4741
|
+
return /* @__PURE__ */ jsx57("button", { type: "button", className: cls, "aria-label": `${title} \u2014 ${status.text}`, onClick: () => onOpen(game), children: body });
|
|
4581
4742
|
}
|
|
4582
4743
|
|
|
4583
4744
|
// src/components/GamesHub.tsx
|
|
4584
|
-
import { Fragment as Fragment10, jsx as
|
|
4745
|
+
import { Fragment as Fragment10, jsx as jsx58, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
4585
4746
|
var PLAYABLE = /* @__PURE__ */ new Set(["available", "in_progress"]);
|
|
4586
4747
|
var DONE = /* @__PURE__ */ new Set(["played", "graded"]);
|
|
4587
4748
|
function pickHeroGame(games) {
|
|
@@ -4594,8 +4755,8 @@ function pickHeroGame(games) {
|
|
|
4594
4755
|
}
|
|
4595
4756
|
var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
|
|
4596
4757
|
function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
4597
|
-
const [, setTick] =
|
|
4598
|
-
|
|
4758
|
+
const [, setTick] = useState23(0);
|
|
4759
|
+
useEffect14(() => {
|
|
4599
4760
|
const id = setInterval(() => setTick((t) => t + 1), 6e4);
|
|
4600
4761
|
return () => clearInterval(id);
|
|
4601
4762
|
}, []);
|
|
@@ -4607,58 +4768,58 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
|
4607
4768
|
const kickoffs = fixtures.map((g) => g.kickoffUtc).filter((k) => !!k).sort();
|
|
4608
4769
|
const todayPts = games.filter((g) => DONE.has(g.status)).reduce((s, g) => s + (g.score ?? 0), 0);
|
|
4609
4770
|
const dash = "\u2014";
|
|
4610
|
-
return /* @__PURE__ */
|
|
4611
|
-
/* @__PURE__ */
|
|
4612
|
-
/* @__PURE__ */
|
|
4613
|
-
/* @__PURE__ */
|
|
4614
|
-
/* @__PURE__ */
|
|
4615
|
-
myWeeklyRow ? /* @__PURE__ */
|
|
4616
|
-
/* @__PURE__ */
|
|
4771
|
+
return /* @__PURE__ */ jsxs51("div", { className: "ss-g-hub", children: [
|
|
4772
|
+
/* @__PURE__ */ jsxs51("div", { className: "ss-g-stats", children: [
|
|
4773
|
+
/* @__PURE__ */ jsxs51("div", { className: "ss-g-stat", children: [
|
|
4774
|
+
/* @__PURE__ */ jsx58("span", { className: "ss-g-stat-l", children: ui.games.statStreak }),
|
|
4775
|
+
/* @__PURE__ */ jsxs51("span", { className: "ss-g-stat-v", "data-testid": "stat-streak", children: [
|
|
4776
|
+
myWeeklyRow ? /* @__PURE__ */ jsxs51(Fragment10, { children: [
|
|
4777
|
+
/* @__PURE__ */ jsx58(IconFlame, {}),
|
|
4617
4778
|
myWeeklyRow.currentStreak
|
|
4618
4779
|
] }) : dash,
|
|
4619
|
-
myWeeklyRow && /* @__PURE__ */
|
|
4780
|
+
myWeeklyRow && /* @__PURE__ */ jsx58("small", { children: ui.games.unitDays })
|
|
4620
4781
|
] })
|
|
4621
4782
|
] }),
|
|
4622
|
-
/* @__PURE__ */
|
|
4623
|
-
/* @__PURE__ */
|
|
4624
|
-
/* @__PURE__ */
|
|
4783
|
+
/* @__PURE__ */ jsxs51("div", { className: "ss-g-stat", children: [
|
|
4784
|
+
/* @__PURE__ */ jsx58("span", { className: "ss-g-stat-l", children: ui.games.statToday }),
|
|
4785
|
+
/* @__PURE__ */ jsxs51("span", { className: "ss-g-stat-v ss-g-stat-v--accent", "data-testid": "stat-today", children: [
|
|
4625
4786
|
ui.games.formatPts(todayPts),
|
|
4626
|
-
/* @__PURE__ */
|
|
4787
|
+
/* @__PURE__ */ jsx58("small", { children: ui.games.unitPts })
|
|
4627
4788
|
] })
|
|
4628
4789
|
] }),
|
|
4629
|
-
/* @__PURE__ */
|
|
4630
|
-
/* @__PURE__ */
|
|
4631
|
-
/* @__PURE__ */
|
|
4790
|
+
/* @__PURE__ */ jsxs51("div", { className: "ss-g-stat", children: [
|
|
4791
|
+
/* @__PURE__ */ jsx58("span", { className: "ss-g-stat-l", children: ui.games.statRank }),
|
|
4792
|
+
/* @__PURE__ */ jsxs51("span", { className: "ss-g-stat-v", "data-testid": "stat-rank", children: [
|
|
4632
4793
|
myWeeklyRow ? `#${myWeeklyRow.rank}` : dash,
|
|
4633
|
-
myWeeklyRow && /* @__PURE__ */
|
|
4794
|
+
myWeeklyRow && /* @__PURE__ */ jsx58("small", { children: ui.games.thisWeek })
|
|
4634
4795
|
] })
|
|
4635
4796
|
] })
|
|
4636
4797
|
] }),
|
|
4637
|
-
weeklyPrize && /* @__PURE__ */
|
|
4638
|
-
hero && /* @__PURE__ */
|
|
4639
|
-
(grid.length > 0 || wide) && /* @__PURE__ */
|
|
4640
|
-
/* @__PURE__ */
|
|
4641
|
-
/* @__PURE__ */
|
|
4642
|
-
/* @__PURE__ */
|
|
4798
|
+
weeklyPrize && /* @__PURE__ */ jsx58(Chip, { variant: "accent", className: "ss-g-prize", children: weeklyPrize }),
|
|
4799
|
+
hero && /* @__PURE__ */ jsx58(GameTile, { game: hero, onOpen, ui, variant: "hero" }),
|
|
4800
|
+
(grid.length > 0 || wide) && /* @__PURE__ */ jsxs51("section", { className: "ss-g-sec", children: [
|
|
4801
|
+
/* @__PURE__ */ jsxs51("div", { className: "ss-g-sec-head", children: [
|
|
4802
|
+
/* @__PURE__ */ jsx58("h3", { children: ui.games.dailyGames }),
|
|
4803
|
+
/* @__PURE__ */ jsx58("span", { children: ui.games.newSetAtMidnight })
|
|
4643
4804
|
] }),
|
|
4644
|
-
grid.length > 0 && /* @__PURE__ */
|
|
4645
|
-
wide && /* @__PURE__ */
|
|
4805
|
+
grid.length > 0 && /* @__PURE__ */ jsx58("div", { className: "ss-g-grid", children: grid.map((g) => /* @__PURE__ */ jsx58(GameTile, { game: g, onOpen, ui }, tileKey(g))) }),
|
|
4806
|
+
wide && /* @__PURE__ */ jsx58(GameTile, { game: wide, onOpen, ui, variant: "wide" })
|
|
4646
4807
|
] }),
|
|
4647
|
-
fixtures.length > 0 && /* @__PURE__ */
|
|
4648
|
-
/* @__PURE__ */
|
|
4649
|
-
/* @__PURE__ */
|
|
4650
|
-
kickoffs[0] && /* @__PURE__ */
|
|
4808
|
+
fixtures.length > 0 && /* @__PURE__ */ jsxs51("section", { className: "ss-g-sec", children: [
|
|
4809
|
+
/* @__PURE__ */ jsxs51("div", { className: "ss-g-sec-head", children: [
|
|
4810
|
+
/* @__PURE__ */ jsx58("h3", { children: ui.games.matchdayGames }),
|
|
4811
|
+
kickoffs[0] && /* @__PURE__ */ jsx58("span", { children: ui.games.kickoffAt(ui.games.formatDayTime(kickoffs[0])) })
|
|
4651
4812
|
] }),
|
|
4652
|
-
/* @__PURE__ */
|
|
4813
|
+
/* @__PURE__ */ jsx58("div", { className: "ss-g-grid", children: fixtures.map((g) => /* @__PURE__ */ jsx58(GameTile, { game: g, onOpen, ui }, tileKey(g))) })
|
|
4653
4814
|
] })
|
|
4654
4815
|
] });
|
|
4655
4816
|
}
|
|
4656
4817
|
|
|
4657
4818
|
// src/components/GameScreenHost.tsx
|
|
4658
|
-
import { useEffect as
|
|
4819
|
+
import { useEffect as useEffect16, useRef as useRef14, useState as useState35 } from "react";
|
|
4659
4820
|
|
|
4660
4821
|
// src/useGamePlay.ts
|
|
4661
|
-
import { useCallback as
|
|
4822
|
+
import { useCallback as useCallback9, useRef as useRef12, useState as useState24 } from "react";
|
|
4662
4823
|
function toSubmitResult(payload) {
|
|
4663
4824
|
return {
|
|
4664
4825
|
// 'pending' means the play is recorded but awaiting resolution (fixture games)
|
|
@@ -4670,17 +4831,17 @@ function toSubmitResult(payload) {
|
|
|
4670
4831
|
};
|
|
4671
4832
|
}
|
|
4672
4833
|
function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
|
|
4673
|
-
const [result, setResult] =
|
|
4674
|
-
const [submitting, setSubmitting] =
|
|
4675
|
-
const [rawStatus, setRawStatus] =
|
|
4676
|
-
const inFlightRef =
|
|
4677
|
-
const convRef =
|
|
4834
|
+
const [result, setResult] = useState24(null);
|
|
4835
|
+
const [submitting, setSubmitting] = useState24(false);
|
|
4836
|
+
const [rawStatus, setRawStatus] = useState24(null);
|
|
4837
|
+
const inFlightRef = useRef12(false);
|
|
4838
|
+
const convRef = useRef12(conversation);
|
|
4678
4839
|
convRef.current = conversation;
|
|
4679
|
-
const optsRef =
|
|
4840
|
+
const optsRef = useRef12({ gameId, gameDay, fixtureId, locale, refresh });
|
|
4680
4841
|
optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
|
|
4681
|
-
const resultRef =
|
|
4842
|
+
const resultRef = useRef12(null);
|
|
4682
4843
|
resultRef.current = result;
|
|
4683
|
-
const refetch =
|
|
4844
|
+
const refetch = useCallback9(async () => {
|
|
4684
4845
|
const conv = convRef.current;
|
|
4685
4846
|
if (!conv) return;
|
|
4686
4847
|
const opts = optsRef.current;
|
|
@@ -4696,7 +4857,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
4696
4857
|
} catch {
|
|
4697
4858
|
}
|
|
4698
4859
|
}, []);
|
|
4699
|
-
const submit =
|
|
4860
|
+
const submit = useCallback9(async (answerJson) => {
|
|
4700
4861
|
const conv = convRef.current;
|
|
4701
4862
|
if (!conv || inFlightRef.current) return;
|
|
4702
4863
|
inFlightRef.current = true;
|
|
@@ -4723,14 +4884,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
4723
4884
|
setSubmitting(false);
|
|
4724
4885
|
}
|
|
4725
4886
|
}, [refetch]);
|
|
4726
|
-
const hydrate =
|
|
4887
|
+
const hydrate = useCallback9(() => {
|
|
4727
4888
|
void refetch();
|
|
4728
4889
|
}, [refetch]);
|
|
4729
4890
|
return { result, submitting, submit, hydrate, rawStatus };
|
|
4730
4891
|
}
|
|
4731
4892
|
|
|
4732
4893
|
// src/components/games/MysteryTigerGame.tsx
|
|
4733
|
-
import { useState as
|
|
4894
|
+
import { useState as useState26, useId as useId2 } from "react";
|
|
4734
4895
|
|
|
4735
4896
|
// src/components/games/nationFlags.ts
|
|
4736
4897
|
var FLAGS = {
|
|
@@ -4941,8 +5102,8 @@ function isNationCode(flag) {
|
|
|
4941
5102
|
}
|
|
4942
5103
|
|
|
4943
5104
|
// src/components/games/PlayerAvatar.tsx
|
|
4944
|
-
import { useState as
|
|
4945
|
-
import { jsx as
|
|
5105
|
+
import { useState as useState25 } from "react";
|
|
5106
|
+
import { jsx as jsx59 } from "react/jsx-runtime";
|
|
4946
5107
|
function initialsOf(name) {
|
|
4947
5108
|
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
4948
5109
|
const first = parts[0];
|
|
@@ -4959,41 +5120,41 @@ function PlayerAvatar({
|
|
|
4959
5120
|
imagePath,
|
|
4960
5121
|
className
|
|
4961
5122
|
}) {
|
|
4962
|
-
const [failed, setFailed] =
|
|
5123
|
+
const [failed, setFailed] = useState25(false);
|
|
4963
5124
|
const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
|
|
4964
|
-
return /* @__PURE__ */
|
|
5125
|
+
return /* @__PURE__ */ jsx59("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ jsx59("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ jsx59("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
|
|
4965
5126
|
}
|
|
4966
5127
|
|
|
4967
5128
|
// src/components/games/ui/GameHeader.tsx
|
|
4968
|
-
import { jsx as
|
|
5129
|
+
import { jsx as jsx60, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
4969
5130
|
function GameHeader({ title, eyebrow, right, onBack, backLabel }) {
|
|
4970
|
-
return /* @__PURE__ */
|
|
4971
|
-
onBack && /* @__PURE__ */
|
|
4972
|
-
/* @__PURE__ */
|
|
4973
|
-
eyebrow && /* @__PURE__ */
|
|
4974
|
-
/* @__PURE__ */
|
|
5131
|
+
return /* @__PURE__ */ jsxs52("div", { className: "ss-g-head", children: [
|
|
5132
|
+
onBack && /* @__PURE__ */ jsx60("button", { type: "button", className: "ss-g-back", "aria-label": backLabel, onClick: onBack, children: /* @__PURE__ */ jsx60(IconChevronLeft, {}) }),
|
|
5133
|
+
/* @__PURE__ */ jsxs52("div", { className: "ss-g-head-text", children: [
|
|
5134
|
+
eyebrow && /* @__PURE__ */ jsx60("span", { className: "ss-g-eyebrow", children: eyebrow }),
|
|
5135
|
+
/* @__PURE__ */ jsx60("h2", { className: "ss-g-title", children: title })
|
|
4975
5136
|
] }),
|
|
4976
|
-
right && /* @__PURE__ */
|
|
5137
|
+
right && /* @__PURE__ */ jsx60("div", { className: "ss-g-head-right", children: right })
|
|
4977
5138
|
] });
|
|
4978
5139
|
}
|
|
4979
5140
|
|
|
4980
5141
|
// src/components/games/ui/SegmentProgress.tsx
|
|
4981
|
-
import { jsx as
|
|
5142
|
+
import { jsx as jsx61, jsxs as jsxs53 } from "react/jsx-runtime";
|
|
4982
5143
|
function SegmentProgress({ segments, ariaLabel, leftLabel, rightLabel, right }) {
|
|
4983
|
-
return /* @__PURE__ */
|
|
4984
|
-
/* @__PURE__ */
|
|
4985
|
-
(leftLabel || rightLabel) && /* @__PURE__ */
|
|
4986
|
-
/* @__PURE__ */
|
|
4987
|
-
/* @__PURE__ */
|
|
5144
|
+
return /* @__PURE__ */ jsxs53("div", { className: "ss-g-progress", children: [
|
|
5145
|
+
/* @__PURE__ */ jsxs53("div", { className: "ss-g-progress-main", children: [
|
|
5146
|
+
(leftLabel || rightLabel) && /* @__PURE__ */ jsxs53("div", { className: "ss-g-progress-labels", children: [
|
|
5147
|
+
/* @__PURE__ */ jsx61("span", { children: leftLabel }),
|
|
5148
|
+
/* @__PURE__ */ jsx61("span", { className: "ss-g-progress-rl", children: rightLabel })
|
|
4988
5149
|
] }),
|
|
4989
|
-
/* @__PURE__ */
|
|
5150
|
+
/* @__PURE__ */ jsx61(
|
|
4990
5151
|
"div",
|
|
4991
5152
|
{
|
|
4992
5153
|
className: "ss-g-segs",
|
|
4993
5154
|
role: "img",
|
|
4994
5155
|
"aria-label": ariaLabel,
|
|
4995
5156
|
style: { gridTemplateColumns: `repeat(${segments.length}, minmax(0, 1fr))` },
|
|
4996
|
-
children: segments.map((s, i) => /* @__PURE__ */
|
|
5157
|
+
children: segments.map((s, i) => /* @__PURE__ */ jsx61("span", { className: "ss-g-seg", "data-state": s }, i))
|
|
4997
5158
|
}
|
|
4998
5159
|
)
|
|
4999
5160
|
] }),
|
|
@@ -5002,13 +5163,13 @@ function SegmentProgress({ segments, ariaLabel, leftLabel, rightLabel, right })
|
|
|
5002
5163
|
}
|
|
5003
5164
|
|
|
5004
5165
|
// src/components/games/ui/SearchField.tsx
|
|
5005
|
-
import { jsx as
|
|
5166
|
+
import { jsx as jsx62, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
5006
5167
|
function SearchField({ id, label, labelHidden = false, placeholder, value, onChange, disabled, inputRef, onKeyDown }) {
|
|
5007
|
-
return /* @__PURE__ */
|
|
5008
|
-
/* @__PURE__ */
|
|
5009
|
-
/* @__PURE__ */
|
|
5010
|
-
/* @__PURE__ */
|
|
5011
|
-
/* @__PURE__ */
|
|
5168
|
+
return /* @__PURE__ */ jsxs54("div", { className: "ss-g-search", children: [
|
|
5169
|
+
/* @__PURE__ */ jsx62("label", { htmlFor: id, className: labelHidden ? "ss-g-sr" : "ss-g-search-label", children: label }),
|
|
5170
|
+
/* @__PURE__ */ jsxs54("div", { className: "ss-g-search-box", children: [
|
|
5171
|
+
/* @__PURE__ */ jsx62(IconSearch, {}),
|
|
5172
|
+
/* @__PURE__ */ jsx62(
|
|
5012
5173
|
"input",
|
|
5013
5174
|
{
|
|
5014
5175
|
id,
|
|
@@ -5027,52 +5188,52 @@ function SearchField({ id, label, labelHidden = false, placeholder, value, onCha
|
|
|
5027
5188
|
}
|
|
5028
5189
|
|
|
5029
5190
|
// src/components/games/ui/FooterBar.tsx
|
|
5030
|
-
import { jsx as
|
|
5191
|
+
import { jsx as jsx63 } from "react/jsx-runtime";
|
|
5031
5192
|
function FooterBar({ children }) {
|
|
5032
|
-
return /* @__PURE__ */
|
|
5193
|
+
return /* @__PURE__ */ jsx63("div", { className: "ss-g-footer", children });
|
|
5033
5194
|
}
|
|
5034
5195
|
|
|
5035
5196
|
// src/components/games/ui/Silhouette.tsx
|
|
5036
|
-
import { jsx as
|
|
5197
|
+
import { jsx as jsx64, jsxs as jsxs55 } from "react/jsx-runtime";
|
|
5037
5198
|
function Silhouette({ size, variant = "default" }) {
|
|
5038
|
-
return /* @__PURE__ */
|
|
5039
|
-
/* @__PURE__ */
|
|
5040
|
-
/* @__PURE__ */
|
|
5041
|
-
/* @__PURE__ */
|
|
5199
|
+
return /* @__PURE__ */ jsxs55("span", { className: `ss-g-sil ss-g-sil--${variant}`, style: { width: size, height: size }, "aria-hidden": "true", children: [
|
|
5200
|
+
/* @__PURE__ */ jsxs55("svg", { width: size * 0.86, height: size * 0.86, viewBox: "0 0 100 100", children: [
|
|
5201
|
+
/* @__PURE__ */ jsx64("circle", { cx: "50", cy: "40", r: "19", fill: "currentColor" }),
|
|
5202
|
+
/* @__PURE__ */ jsx64("path", { d: "M12 100c0-23 17-38 38-38s38 15 38 38z", fill: "currentColor" })
|
|
5042
5203
|
] }),
|
|
5043
|
-
variant === "mystery" && /* @__PURE__ */
|
|
5204
|
+
variant === "mystery" && /* @__PURE__ */ jsx64("span", { className: "ss-g-sil-q", children: "?" })
|
|
5044
5205
|
] });
|
|
5045
5206
|
}
|
|
5046
5207
|
|
|
5047
5208
|
// src/components/games/ui/GameButton.tsx
|
|
5048
|
-
import { jsx as
|
|
5209
|
+
import { jsx as jsx65 } from "react/jsx-runtime";
|
|
5049
5210
|
function GameButton({ variant = "primary", block = false, className, type = "button", ...rest }) {
|
|
5050
5211
|
const cls = `ss-g-btn ss-g-btn--${variant}${block ? " ss-g-btn--block" : ""}${className ? ` ${className}` : ""}`;
|
|
5051
|
-
return /* @__PURE__ */
|
|
5212
|
+
return /* @__PURE__ */ jsx65("button", { type, className: cls, ...rest });
|
|
5052
5213
|
}
|
|
5053
5214
|
|
|
5054
5215
|
// src/components/games/ui/ResultCard.tsx
|
|
5055
|
-
import { jsx as
|
|
5216
|
+
import { jsx as jsx66, jsxs as jsxs56 } from "react/jsx-runtime";
|
|
5056
5217
|
function ResultCard({ tone, title, score, detail, onBack, ui }) {
|
|
5057
|
-
return /* @__PURE__ */
|
|
5058
|
-
/* @__PURE__ */
|
|
5059
|
-
score !== void 0 && /* @__PURE__ */
|
|
5060
|
-
/* @__PURE__ */
|
|
5218
|
+
return /* @__PURE__ */ jsxs56("div", { className: "ss-g-result", "data-tone": tone, role: "status", children: [
|
|
5219
|
+
/* @__PURE__ */ jsx66("span", { className: "ss-g-result-title", children: title }),
|
|
5220
|
+
score !== void 0 && /* @__PURE__ */ jsxs56("span", { className: "ss-g-result-score", children: [
|
|
5221
|
+
/* @__PURE__ */ jsx66("span", { className: "ss-g-result-num", children: score }),
|
|
5061
5222
|
ui.games.unitPts
|
|
5062
5223
|
] }),
|
|
5063
|
-
detail && /* @__PURE__ */
|
|
5064
|
-
onBack && /* @__PURE__ */
|
|
5224
|
+
detail && /* @__PURE__ */ jsx66("span", { className: "ss-g-result-detail", children: detail }),
|
|
5225
|
+
onBack && /* @__PURE__ */ jsx66(GameButton, { variant: "outline", onClick: onBack, children: ui.games.backToGames })
|
|
5065
5226
|
] });
|
|
5066
5227
|
}
|
|
5067
5228
|
|
|
5068
5229
|
// src/components/games/ui/OptionList.tsx
|
|
5069
|
-
import { jsx as
|
|
5230
|
+
import { jsx as jsx67 } from "react/jsx-runtime";
|
|
5070
5231
|
function OptionList({ label, options, onPick }) {
|
|
5071
|
-
return /* @__PURE__ */
|
|
5232
|
+
return /* @__PURE__ */ jsx67("div", { className: "ss-g-opts", role: "listbox", "aria-label": label, children: options.map((o) => /* @__PURE__ */ jsx67("button", { type: "button", role: "option", "aria-selected": false, className: "ss-g-opt", onClick: () => onPick(o.key), children: o.content }, o.key)) });
|
|
5072
5233
|
}
|
|
5073
5234
|
|
|
5074
5235
|
// src/components/games/MysteryTigerGame.tsx
|
|
5075
|
-
import { Fragment as Fragment11, jsx as
|
|
5236
|
+
import { Fragment as Fragment11, jsx as jsx68, jsxs as jsxs57 } from "react/jsx-runtime";
|
|
5076
5237
|
function parseClientState(json) {
|
|
5077
5238
|
if (!json) return null;
|
|
5078
5239
|
try {
|
|
@@ -5174,7 +5335,7 @@ function MysteryTigerGame({
|
|
|
5174
5335
|
onBack
|
|
5175
5336
|
}) {
|
|
5176
5337
|
const t = ui.games.mysteryTiger;
|
|
5177
|
-
const [query, setQuery] =
|
|
5338
|
+
const [query, setQuery] = useState26("");
|
|
5178
5339
|
const inputId = useId2();
|
|
5179
5340
|
const clientState = parseClientState(result?.clientStateJson);
|
|
5180
5341
|
const guessResults = clientState?.guessResults ?? [];
|
|
@@ -5196,22 +5357,22 @@ function MysteryTigerGame({
|
|
|
5196
5357
|
setQuery("");
|
|
5197
5358
|
onSubmit(JSON.stringify({ guesses: newGuesses }));
|
|
5198
5359
|
}
|
|
5199
|
-
const headerRight = !config ? void 0 : isOver ? /* @__PURE__ */
|
|
5360
|
+
const headerRight = !config ? void 0 : isOver ? /* @__PURE__ */ jsxs57(Chip, { variant: "accent", children: [
|
|
5200
5361
|
score,
|
|
5201
5362
|
" ",
|
|
5202
5363
|
ui.games.unitPts
|
|
5203
|
-
] }) : /* @__PURE__ */
|
|
5364
|
+
] }) : /* @__PURE__ */ jsx68("span", { "data-testid": "mt-chip", children: /* @__PURE__ */ jsxs57(Chip, { children: [
|
|
5204
5365
|
ui.games.guess,
|
|
5205
5366
|
" ",
|
|
5206
|
-
/* @__PURE__ */
|
|
5367
|
+
/* @__PURE__ */ jsx68("span", { className: "ss-g-num", children: guessesUsed + 1 }),
|
|
5207
5368
|
" / ",
|
|
5208
5369
|
totalGuesses
|
|
5209
5370
|
] }) });
|
|
5210
5371
|
const segments = Array.from({ length: totalGuesses }, (_, i) => i < guessesUsed ? "done" : i === guessesUsed ? "current" : "todo");
|
|
5211
5372
|
const cols = { gridTemplateColumns: `minmax(0, 1fr) repeat(${keys.length}, 42px)` };
|
|
5212
5373
|
const known = deriveKnownAttributes(guessResults, keys);
|
|
5213
|
-
return /* @__PURE__ */
|
|
5214
|
-
/* @__PURE__ */
|
|
5374
|
+
return /* @__PURE__ */ jsxs57("div", { className: "ss-g-screen ss-g-mt", "data-testid": "game-screen-mystery-tiger", children: [
|
|
5375
|
+
/* @__PURE__ */ jsx68(
|
|
5215
5376
|
GameHeader,
|
|
5216
5377
|
{
|
|
5217
5378
|
title: gameTitle({ gameId: "mystery-tiger" }, ui.games.titles),
|
|
@@ -5221,40 +5382,40 @@ function MysteryTigerGame({
|
|
|
5221
5382
|
backLabel: ui.back
|
|
5222
5383
|
}
|
|
5223
5384
|
),
|
|
5224
|
-
!config && /* @__PURE__ */
|
|
5225
|
-
config && /* @__PURE__ */
|
|
5226
|
-
/* @__PURE__ */
|
|
5227
|
-
/* @__PURE__ */
|
|
5228
|
-
/* @__PURE__ */
|
|
5229
|
-
revealName ? /* @__PURE__ */
|
|
5230
|
-
revealName && /* @__PURE__ */
|
|
5385
|
+
!config && /* @__PURE__ */ jsx68("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
|
|
5386
|
+
config && /* @__PURE__ */ jsxs57(Fragment11, { children: [
|
|
5387
|
+
/* @__PURE__ */ jsxs57("div", { className: "ss-g-body", children: [
|
|
5388
|
+
/* @__PURE__ */ jsxs57("div", { className: `ss-g-mt-card${isOver ? " ss-g-mt-card--reveal" : ""}`, children: [
|
|
5389
|
+
/* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-portrait", children: [
|
|
5390
|
+
revealName ? /* @__PURE__ */ jsx68(PlayerAvatar, { className: "ss-g-mt-photo", name: revealName, imagePath: clientState?.revealedPlayerImagePath }) : /* @__PURE__ */ jsx68(Silhouette, { size: 150, variant: "mystery" }),
|
|
5391
|
+
revealName && /* @__PURE__ */ jsx68("span", { className: "ss-g-mt-reveal-name", children: revealName })
|
|
5231
5392
|
] }),
|
|
5232
|
-
/* @__PURE__ */
|
|
5233
|
-
/* @__PURE__ */
|
|
5234
|
-
/* @__PURE__ */
|
|
5393
|
+
/* @__PURE__ */ jsx68("div", { className: "ss-g-mt-known", style: { gridTemplateColumns: `repeat(${keys.length}, minmax(0, 1fr))` }, children: known.map((k) => /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-known-cell", children: [
|
|
5394
|
+
/* @__PURE__ */ jsx68("span", { className: "ss-g-mt-lab", children: t.labels[k.key] }),
|
|
5395
|
+
/* @__PURE__ */ jsx68("span", { className: "ss-g-mt-known-v", "data-state": k.state, "data-testid": `known-${k.key}`, children: k.text })
|
|
5235
5396
|
] }, k.key)) })
|
|
5236
5397
|
] }),
|
|
5237
|
-
!isOver && /* @__PURE__ */
|
|
5238
|
-
guessResults.length > 0 && /* @__PURE__ */
|
|
5239
|
-
/* @__PURE__ */
|
|
5240
|
-
/* @__PURE__ */
|
|
5241
|
-
keys.map((k) => /* @__PURE__ */
|
|
5398
|
+
!isOver && /* @__PURE__ */ jsx68(SegmentProgress, { segments, ariaLabel: t.progress(guessesUsed, totalGuesses) }),
|
|
5399
|
+
guessResults.length > 0 && /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-table", children: [
|
|
5400
|
+
/* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-thead", style: cols, children: [
|
|
5401
|
+
/* @__PURE__ */ jsx68("span", { children: t.yourGuesses }),
|
|
5402
|
+
keys.map((k) => /* @__PURE__ */ jsx68("span", { children: t.labels[k] }, k))
|
|
5242
5403
|
] }),
|
|
5243
5404
|
guessResults.map((gr, i) => {
|
|
5244
5405
|
const name = config.squadPlayers.find((p) => p.id === gr.playerId)?.name ?? `#${gr.playerId}`;
|
|
5245
5406
|
const { first, last } = splitName(name);
|
|
5246
|
-
return /* @__PURE__ */
|
|
5247
|
-
/* @__PURE__ */
|
|
5248
|
-
/* @__PURE__ */
|
|
5249
|
-
/* @__PURE__ */
|
|
5250
|
-
first && /* @__PURE__ */
|
|
5251
|
-
/* @__PURE__ */
|
|
5407
|
+
return /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-row", style: cols, children: [
|
|
5408
|
+
/* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-who", children: [
|
|
5409
|
+
/* @__PURE__ */ jsx68(PlayerAvatar, { className: "ss-g-mt-av", name }),
|
|
5410
|
+
/* @__PURE__ */ jsxs57("span", { className: "ss-g-mt-names", children: [
|
|
5411
|
+
first && /* @__PURE__ */ jsx68("span", { className: "ss-g-mt-first", children: first }),
|
|
5412
|
+
/* @__PURE__ */ jsx68("span", { className: "ss-g-mt-last", children: last })
|
|
5252
5413
|
] })
|
|
5253
5414
|
] }),
|
|
5254
5415
|
keys.map((key) => {
|
|
5255
5416
|
const v = gr[key];
|
|
5256
5417
|
const arrow = directionArrow(v);
|
|
5257
|
-
return /* @__PURE__ */
|
|
5418
|
+
return /* @__PURE__ */ jsxs57(
|
|
5258
5419
|
"div",
|
|
5259
5420
|
{
|
|
5260
5421
|
className: "ss-g-mt-cell",
|
|
@@ -5262,8 +5423,8 @@ function MysteryTigerGame({
|
|
|
5262
5423
|
"data-verdict": v.verdict,
|
|
5263
5424
|
"aria-label": `${t.labels[key]}: ${v.value ?? v.verdict}${v.direction ? ` ${v.direction}` : ""}`,
|
|
5264
5425
|
children: [
|
|
5265
|
-
/* @__PURE__ */
|
|
5266
|
-
arrow && /* @__PURE__ */
|
|
5426
|
+
/* @__PURE__ */ jsx68("span", { className: "ss-g-mt-cell-v", "aria-hidden": "true", children: tileFace(key, v) }),
|
|
5427
|
+
arrow && /* @__PURE__ */ jsx68("span", { className: "ss-g-mt-cell-dir", "aria-hidden": "true", children: arrow })
|
|
5267
5428
|
]
|
|
5268
5429
|
},
|
|
5269
5430
|
key
|
|
@@ -5272,25 +5433,25 @@ function MysteryTigerGame({
|
|
|
5272
5433
|
] }, gr.playerId);
|
|
5273
5434
|
})
|
|
5274
5435
|
] }),
|
|
5275
|
-
!isOver && /* @__PURE__ */
|
|
5276
|
-
/* @__PURE__ */
|
|
5277
|
-
/* @__PURE__ */
|
|
5436
|
+
!isOver && /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-legend", children: [
|
|
5437
|
+
/* @__PURE__ */ jsxs57("span", { children: [
|
|
5438
|
+
/* @__PURE__ */ jsx68("i", { className: "ss-g-mt-sw", "data-verdict": "exact" }),
|
|
5278
5439
|
t.legendMatch
|
|
5279
5440
|
] }),
|
|
5280
|
-
/* @__PURE__ */
|
|
5281
|
-
/* @__PURE__ */
|
|
5441
|
+
/* @__PURE__ */ jsxs57("span", { children: [
|
|
5442
|
+
/* @__PURE__ */ jsx68("i", { className: "ss-g-mt-sw", "data-verdict": "near" }),
|
|
5282
5443
|
t.legendClose
|
|
5283
5444
|
] }),
|
|
5284
|
-
/* @__PURE__ */
|
|
5445
|
+
/* @__PURE__ */ jsxs57("span", { children: [
|
|
5285
5446
|
"\u25B2 ",
|
|
5286
5447
|
t.legendHigher
|
|
5287
5448
|
] })
|
|
5288
5449
|
] }),
|
|
5289
|
-
clientState?.hintLine && !isOver && /* @__PURE__ */
|
|
5290
|
-
/* @__PURE__ */
|
|
5291
|
-
/* @__PURE__ */
|
|
5450
|
+
clientState?.hintLine && !isOver && /* @__PURE__ */ jsxs57("div", { className: "ss-g-mt-hint", children: [
|
|
5451
|
+
/* @__PURE__ */ jsx68(IconBulb, {}),
|
|
5452
|
+
/* @__PURE__ */ jsx68("span", { children: clientState.hintLine })
|
|
5292
5453
|
] }),
|
|
5293
|
-
isOver && /* @__PURE__ */
|
|
5454
|
+
isOver && /* @__PURE__ */ jsx68(
|
|
5294
5455
|
ResultCard,
|
|
5295
5456
|
{
|
|
5296
5457
|
tone: clientState?.solved ? "win" : clientState?.failed ? "lose" : "neutral",
|
|
@@ -5302,22 +5463,22 @@ function MysteryTigerGame({
|
|
|
5302
5463
|
}
|
|
5303
5464
|
)
|
|
5304
5465
|
] }),
|
|
5305
|
-
!isOver && /* @__PURE__ */
|
|
5306
|
-
query.length > 0 && filtered.length > 0 && /* @__PURE__ */
|
|
5466
|
+
!isOver && /* @__PURE__ */ jsxs57(FooterBar, { children: [
|
|
5467
|
+
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx68(
|
|
5307
5468
|
OptionList,
|
|
5308
5469
|
{
|
|
5309
5470
|
label: t.optionsLabel,
|
|
5310
5471
|
options: filtered.map((p) => ({
|
|
5311
5472
|
key: p.id,
|
|
5312
|
-
content: /* @__PURE__ */
|
|
5313
|
-
/* @__PURE__ */
|
|
5314
|
-
/* @__PURE__ */
|
|
5473
|
+
content: /* @__PURE__ */ jsxs57(Fragment11, { children: [
|
|
5474
|
+
/* @__PURE__ */ jsx68(PlayerAvatar, { className: "ss-g-opt-av", name: p.name }),
|
|
5475
|
+
/* @__PURE__ */ jsx68("span", { children: p.name })
|
|
5315
5476
|
] })
|
|
5316
5477
|
})),
|
|
5317
5478
|
onPick: (k) => handleSelect(Number(k))
|
|
5318
5479
|
}
|
|
5319
5480
|
),
|
|
5320
|
-
/* @__PURE__ */
|
|
5481
|
+
/* @__PURE__ */ jsx68(
|
|
5321
5482
|
SearchField,
|
|
5322
5483
|
{
|
|
5323
5484
|
id: inputId,
|
|
@@ -5334,7 +5495,7 @@ function MysteryTigerGame({
|
|
|
5334
5495
|
}
|
|
5335
5496
|
|
|
5336
5497
|
// src/components/games/HigherOrLowerGame.tsx
|
|
5337
|
-
import { Fragment as Fragment12, jsx as
|
|
5498
|
+
import { Fragment as Fragment12, jsx as jsx69, jsxs as jsxs58 } from "react/jsx-runtime";
|
|
5338
5499
|
var POINTS_PER_CORRECT = 10;
|
|
5339
5500
|
function parseClientState2(json) {
|
|
5340
5501
|
if (!json) return null;
|
|
@@ -5346,11 +5507,11 @@ function parseClientState2(json) {
|
|
|
5346
5507
|
}
|
|
5347
5508
|
function PlayerCard({ name, imagePath, highlight, children }) {
|
|
5348
5509
|
const { first, last } = splitName(name);
|
|
5349
|
-
return /* @__PURE__ */
|
|
5350
|
-
/* @__PURE__ */
|
|
5351
|
-
/* @__PURE__ */
|
|
5352
|
-
first && /* @__PURE__ */
|
|
5353
|
-
/* @__PURE__ */
|
|
5510
|
+
return /* @__PURE__ */ jsxs58("div", { className: `ss-g-hl-card${highlight ? " ss-g-hl-card--b" : ""}`, children: [
|
|
5511
|
+
/* @__PURE__ */ jsx69("div", { className: "ss-g-hl-photo-wrap", children: imagePath ? /* @__PURE__ */ jsx69(PlayerAvatar, { className: "ss-g-hl-photo", name, imagePath }) : /* @__PURE__ */ jsx69(Silhouette, { size: 150 }) }),
|
|
5512
|
+
/* @__PURE__ */ jsxs58("div", { className: "ss-g-hl-info", children: [
|
|
5513
|
+
first && /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-first", children: first }),
|
|
5514
|
+
/* @__PURE__ */ jsx69("span", { className: "ss-g-hl-surname", children: last }),
|
|
5354
5515
|
children
|
|
5355
5516
|
] })
|
|
5356
5517
|
] });
|
|
@@ -5382,47 +5543,47 @@ function HigherOrLowerGame({
|
|
|
5382
5543
|
const newAnswers = [...prevAnswers, { pairIndex: currentPair.pairIndex, pick }];
|
|
5383
5544
|
onSubmit(JSON.stringify({ answers: newAnswers }));
|
|
5384
5545
|
}
|
|
5385
|
-
return /* @__PURE__ */
|
|
5386
|
-
/* @__PURE__ */
|
|
5546
|
+
return /* @__PURE__ */ jsxs58("div", { className: "ss-g-screen ss-g-hl", "data-testid": "game-screen-higher-or-lower", children: [
|
|
5547
|
+
/* @__PURE__ */ jsx69(
|
|
5387
5548
|
GameHeader,
|
|
5388
5549
|
{
|
|
5389
5550
|
title: gameTitle({ gameId: "higher-or-lower" }, ui.games.titles),
|
|
5390
5551
|
eyebrow: t.eyebrow(POINTS_PER_CORRECT),
|
|
5391
|
-
right: config ? /* @__PURE__ */
|
|
5552
|
+
right: config ? /* @__PURE__ */ jsx69(StatStack, { value: runLength, label: t.streak }) : void 0,
|
|
5392
5553
|
onBack,
|
|
5393
5554
|
backLabel: ui.back
|
|
5394
5555
|
}
|
|
5395
5556
|
),
|
|
5396
|
-
!config && /* @__PURE__ */
|
|
5397
|
-
config && /* @__PURE__ */
|
|
5398
|
-
/* @__PURE__ */
|
|
5399
|
-
/* @__PURE__ */
|
|
5400
|
-
/* @__PURE__ */
|
|
5401
|
-
/* @__PURE__ */
|
|
5402
|
-
/* @__PURE__ */
|
|
5557
|
+
!config && /* @__PURE__ */ jsx69("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
|
|
5558
|
+
config && /* @__PURE__ */ jsxs58(Fragment12, { children: [
|
|
5559
|
+
/* @__PURE__ */ jsxs58("div", { className: "ss-g-body", children: [
|
|
5560
|
+
/* @__PURE__ */ jsxs58("div", { className: "ss-g-hl-prompt", "data-testid": "hol-prompt", children: [
|
|
5561
|
+
/* @__PURE__ */ jsx69("span", { className: "ss-g-hl-prompt-q", children: t.whoHadMore }),
|
|
5562
|
+
/* @__PURE__ */ jsx69("span", { className: "ss-g-hl-prompt-stat", children: config.statLabel }),
|
|
5563
|
+
/* @__PURE__ */ jsx69("span", { className: "ss-g-hl-prompt-season", children: t.season(config.seasonLabel) })
|
|
5403
5564
|
] }),
|
|
5404
|
-
currentPair && /* @__PURE__ */
|
|
5405
|
-
/* @__PURE__ */
|
|
5406
|
-
/* @__PURE__ */
|
|
5407
|
-
/* @__PURE__ */
|
|
5565
|
+
currentPair && /* @__PURE__ */ jsxs58("div", { className: "ss-g-hl-pair", children: [
|
|
5566
|
+
/* @__PURE__ */ jsxs58(PlayerCard, { name: currentPair.playerAName, imagePath: currentPair.playerAImagePath, children: [
|
|
5567
|
+
/* @__PURE__ */ jsx69("span", { className: "ss-g-hl-value", children: currentPair.playerAValue }),
|
|
5568
|
+
/* @__PURE__ */ jsx69("span", { className: "ss-g-hl-stat", children: config.statLabel })
|
|
5408
5569
|
] }),
|
|
5409
|
-
/* @__PURE__ */
|
|
5410
|
-
/* @__PURE__ */
|
|
5411
|
-
/* @__PURE__ */
|
|
5412
|
-
/* @__PURE__ */
|
|
5570
|
+
/* @__PURE__ */ jsx69("span", { className: "ss-g-hl-vs", "aria-hidden": "true", children: t.vs }),
|
|
5571
|
+
/* @__PURE__ */ jsx69(PlayerCard, { name: currentPair.playerBName, imagePath: currentPair.playerBImagePath, highlight: true, children: /* @__PURE__ */ jsxs58("div", { className: "ss-g-hl-btns", children: [
|
|
5572
|
+
/* @__PURE__ */ jsxs58(GameButton, { variant: "primary", disabled: submitting, onClick: () => handlePick("higher"), children: [
|
|
5573
|
+
/* @__PURE__ */ jsx69(IconArrowUp, { size: 16 }),
|
|
5413
5574
|
t.higher
|
|
5414
5575
|
] }),
|
|
5415
|
-
/* @__PURE__ */
|
|
5416
|
-
/* @__PURE__ */
|
|
5576
|
+
/* @__PURE__ */ jsxs58(GameButton, { variant: "outline", disabled: submitting, onClick: () => handlePick("lower"), children: [
|
|
5577
|
+
/* @__PURE__ */ jsx69(IconArrowDown, { size: 16 }),
|
|
5417
5578
|
t.lower
|
|
5418
5579
|
] })
|
|
5419
5580
|
] }) })
|
|
5420
5581
|
] }),
|
|
5421
|
-
lastAnswer && lastAnswerPair && /* @__PURE__ */
|
|
5422
|
-
lastAnswer.wasCorrect ? /* @__PURE__ */
|
|
5582
|
+
lastAnswer && lastAnswerPair && /* @__PURE__ */ jsxs58("p", { className: "ss-g-hl-feedback", "data-testid": "hol-last", "data-correct": lastAnswer.wasCorrect ? "true" : "false", children: [
|
|
5583
|
+
lastAnswer.wasCorrect ? /* @__PURE__ */ jsx69(IconCheck, {}) : /* @__PURE__ */ jsx69(IconClose, {}),
|
|
5423
5584
|
t.lastAnswer(splitName(lastAnswerPair.playerBName).last, lastAnswer.playerBValue)
|
|
5424
5585
|
] }),
|
|
5425
|
-
isOver && /* @__PURE__ */
|
|
5586
|
+
isOver && /* @__PURE__ */ jsx69(
|
|
5426
5587
|
ResultCard,
|
|
5427
5588
|
{
|
|
5428
5589
|
tone: runEndedWrong ? "lose" : allPairsAnswered ? "win" : "neutral",
|
|
@@ -5434,15 +5595,15 @@ function HigherOrLowerGame({
|
|
|
5434
5595
|
}
|
|
5435
5596
|
)
|
|
5436
5597
|
] }),
|
|
5437
|
-
!isOver && /* @__PURE__ */
|
|
5438
|
-
/* @__PURE__ */
|
|
5598
|
+
!isOver && /* @__PURE__ */ jsx69(FooterBar, { children: /* @__PURE__ */ jsxs58("div", { className: "ss-g-hl-foot", children: [
|
|
5599
|
+
/* @__PURE__ */ jsx69("div", { className: "ss-g-hl-dots", role: "img", "aria-label": t.answersSoFar(answeredCount, config.pairs.length), children: config.pairs.map((p, i) => {
|
|
5439
5600
|
const a = answeredPairs[i];
|
|
5440
|
-
return /* @__PURE__ */
|
|
5601
|
+
return /* @__PURE__ */ jsx69("span", { className: "ss-g-hl-dot", "data-state": a ? a.wasCorrect ? "correct" : "wrong" : "todo" }, p.pairIndex);
|
|
5441
5602
|
}) }),
|
|
5442
|
-
/* @__PURE__ */
|
|
5443
|
-
/* @__PURE__ */
|
|
5603
|
+
/* @__PURE__ */ jsxs58("span", { className: "ss-g-hl-pts", children: [
|
|
5604
|
+
/* @__PURE__ */ jsx69("span", { "data-testid": "hol-score", children: score }),
|
|
5444
5605
|
" ",
|
|
5445
|
-
/* @__PURE__ */
|
|
5606
|
+
/* @__PURE__ */ jsx69("span", { className: "ss-g-hl-pts-unit", children: ui.games.unitPts })
|
|
5446
5607
|
] })
|
|
5447
5608
|
] }) })
|
|
5448
5609
|
] })
|
|
@@ -5450,21 +5611,21 @@ function HigherOrLowerGame({
|
|
|
5450
5611
|
}
|
|
5451
5612
|
|
|
5452
5613
|
// src/components/games/CareerPathGame.tsx
|
|
5453
|
-
import { useState as
|
|
5614
|
+
import { useState as useState28, useId as useId3 } from "react";
|
|
5454
5615
|
|
|
5455
5616
|
// src/components/games/ui/CrestShield.tsx
|
|
5456
|
-
import { useState as
|
|
5457
|
-
import { jsx as
|
|
5617
|
+
import { useState as useState27 } from "react";
|
|
5618
|
+
import { jsx as jsx70 } from "react/jsx-runtime";
|
|
5458
5619
|
function CrestShield({ src, name, size = 28 }) {
|
|
5459
|
-
const [failed, setFailed] =
|
|
5620
|
+
const [failed, setFailed] = useState27(false);
|
|
5460
5621
|
if (src && !isPlaceholderImage(src) && !failed) {
|
|
5461
|
-
return /* @__PURE__ */
|
|
5622
|
+
return /* @__PURE__ */ jsx70("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
|
|
5462
5623
|
}
|
|
5463
|
-
return /* @__PURE__ */
|
|
5624
|
+
return /* @__PURE__ */ jsx70("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__ */ jsx70("path", { d: "M2 3h24v12c0 9-6 14-12 17C8 29 2 24 2 15z", fill: "currentColor" }) });
|
|
5464
5625
|
}
|
|
5465
5626
|
|
|
5466
5627
|
// src/components/games/CareerPathGame.tsx
|
|
5467
|
-
import { Fragment as Fragment13, jsx as
|
|
5628
|
+
import { Fragment as Fragment13, jsx as jsx71, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
5468
5629
|
function parseClientState3(json) {
|
|
5469
5630
|
if (!json) return null;
|
|
5470
5631
|
try {
|
|
@@ -5488,15 +5649,15 @@ function CareerPathGame({
|
|
|
5488
5649
|
}) {
|
|
5489
5650
|
const s = ui.games.careerPath;
|
|
5490
5651
|
const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
|
|
5491
|
-
const [query, setQuery] =
|
|
5652
|
+
const [query, setQuery] = useState28("");
|
|
5492
5653
|
const inputId = useId3();
|
|
5493
5654
|
const clientState = parseClientState3(result?.clientStateJson);
|
|
5494
5655
|
const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
|
|
5495
5656
|
const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
|
|
5496
5657
|
if (!config) {
|
|
5497
|
-
return /* @__PURE__ */
|
|
5498
|
-
/* @__PURE__ */
|
|
5499
|
-
/* @__PURE__ */
|
|
5658
|
+
return /* @__PURE__ */ jsxs59("div", { className: "ss-g-screen", "data-testid": "game-screen-career-path", children: [
|
|
5659
|
+
/* @__PURE__ */ jsx71(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
|
|
5660
|
+
/* @__PURE__ */ jsx71("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
5500
5661
|
] });
|
|
5501
5662
|
}
|
|
5502
5663
|
const visiblePath = clientState?.visiblePath ?? config.initialPath;
|
|
@@ -5512,60 +5673,60 @@ function CareerPathGame({
|
|
|
5512
5673
|
setQuery("");
|
|
5513
5674
|
onSubmit(JSON.stringify({ guesses: newGuesses }));
|
|
5514
5675
|
}
|
|
5515
|
-
const right = !isOver && clientState ? /* @__PURE__ */
|
|
5676
|
+
const right = !isOver && clientState ? /* @__PURE__ */ jsx71("span", { "data-testid": "cp-guess-chip", children: /* @__PURE__ */ jsxs59(Chip, { variant: "neutral", children: [
|
|
5516
5677
|
ui.games.guess,
|
|
5517
5678
|
" ",
|
|
5518
|
-
/* @__PURE__ */
|
|
5679
|
+
/* @__PURE__ */ jsx71("span", { className: "ss-g-num", children: clientState.guessesUsed + 1 }),
|
|
5519
5680
|
" / ",
|
|
5520
5681
|
clientState.guessesUsed + clientState.guessesRemaining
|
|
5521
5682
|
] }) }) : void 0;
|
|
5522
5683
|
const outcome = clientState?.solved ? s.solved : clientState?.failed ? s.failed : ui.games.done;
|
|
5523
|
-
return /* @__PURE__ */
|
|
5524
|
-
/* @__PURE__ */
|
|
5525
|
-
/* @__PURE__ */
|
|
5526
|
-
/* @__PURE__ */
|
|
5527
|
-
isOver && clientState?.revealedPlayerName ? /* @__PURE__ */
|
|
5528
|
-
/* @__PURE__ */
|
|
5529
|
-
/* @__PURE__ */
|
|
5530
|
-
clientState?.hintLine ? /* @__PURE__ */
|
|
5531
|
-
/* @__PURE__ */
|
|
5532
|
-
/* @__PURE__ */
|
|
5684
|
+
return /* @__PURE__ */ jsxs59("div", { className: "ss-g-screen", "data-testid": "game-screen-career-path", children: [
|
|
5685
|
+
/* @__PURE__ */ jsx71(GameHeader, { title, eyebrow: s.eyebrow, right, onBack, backLabel: ui.back }),
|
|
5686
|
+
/* @__PURE__ */ jsxs59("div", { className: "ss-g-body", children: [
|
|
5687
|
+
/* @__PURE__ */ jsxs59("div", { className: "ss-g-cp-card", children: [
|
|
5688
|
+
isOver && clientState?.revealedPlayerName ? /* @__PURE__ */ jsx71(PlayerAvatar, { className: "ss-g-cp-photo", name: clientState.revealedPlayerName, imagePath: clientState.revealedPlayerImagePath }) : /* @__PURE__ */ jsx71(Silhouette, { size: 64, variant: isOver ? "default" : "mystery" }),
|
|
5689
|
+
/* @__PURE__ */ jsxs59("div", { className: "ss-g-cp-card-text", children: [
|
|
5690
|
+
/* @__PURE__ */ jsx71("span", { className: "ss-g-cp-card-title", children: isOver && clientState?.revealedPlayerName ? clientState.revealedPlayerName : s.mysteryPlayer }),
|
|
5691
|
+
clientState?.hintLine ? /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-hint", children: clientState.hintLine }) : !isOver ? /* @__PURE__ */ jsxs59("span", { className: "ss-g-cp-locks", children: [
|
|
5692
|
+
/* @__PURE__ */ jsx71(Chip, { variant: "lock", icon: /* @__PURE__ */ jsx71(IconLock, { size: 11 }), children: s.lockPosition }),
|
|
5693
|
+
/* @__PURE__ */ jsx71(Chip, { variant: "lock", icon: /* @__PURE__ */ jsx71(IconLock, { size: 11 }), children: s.lockNationality })
|
|
5533
5694
|
] }) : null
|
|
5534
5695
|
] })
|
|
5535
5696
|
] }),
|
|
5536
|
-
/* @__PURE__ */
|
|
5697
|
+
/* @__PURE__ */ jsxs59("ol", { className: "ss-g-cp-line", children: [
|
|
5537
5698
|
visiblePath.map((spell, i) => {
|
|
5538
5699
|
const years = i === 0 ? s.firstClub : spellYears(spell);
|
|
5539
|
-
return /* @__PURE__ */
|
|
5540
|
-
/* @__PURE__ */
|
|
5541
|
-
/* @__PURE__ */
|
|
5542
|
-
/* @__PURE__ */
|
|
5700
|
+
return /* @__PURE__ */ jsxs59("li", { className: "ss-g-cp-step", children: [
|
|
5701
|
+
/* @__PURE__ */ jsxs59("span", { className: "ss-g-cp-rail", children: [
|
|
5702
|
+
/* @__PURE__ */ jsx71("span", { className: "ss-g-cp-tile", children: /* @__PURE__ */ jsx71(CrestShield, { src: spell.crestUrl, name: spell.clubName, size: 30 }) }),
|
|
5703
|
+
/* @__PURE__ */ jsx71("span", { className: "ss-g-cp-conn", "aria-hidden": "true" })
|
|
5543
5704
|
] }),
|
|
5544
|
-
/* @__PURE__ */
|
|
5545
|
-
/* @__PURE__ */
|
|
5546
|
-
/* @__PURE__ */
|
|
5547
|
-
/* @__PURE__ */
|
|
5548
|
-
spell.isLoan && /* @__PURE__ */
|
|
5705
|
+
/* @__PURE__ */ jsxs59("span", { className: "ss-g-cp-step-text", children: [
|
|
5706
|
+
/* @__PURE__ */ jsx71("span", { className: "ss-g-cp-club", children: spell.clubName }),
|
|
5707
|
+
/* @__PURE__ */ jsxs59("span", { className: "ss-g-cp-sub", children: [
|
|
5708
|
+
/* @__PURE__ */ jsx71("span", { className: "ss-g-cp-years", children: years }),
|
|
5709
|
+
spell.isLoan && /* @__PURE__ */ jsxs59(Fragment13, { children: [
|
|
5549
5710
|
years ? " \xB7 " : "",
|
|
5550
|
-
/* @__PURE__ */
|
|
5711
|
+
/* @__PURE__ */ jsx71("span", { className: "ss-g-cp-loan", children: s.loan })
|
|
5551
5712
|
] })
|
|
5552
5713
|
] })
|
|
5553
5714
|
] })
|
|
5554
5715
|
] }, `${spell.clubName}-${i}`);
|
|
5555
5716
|
}),
|
|
5556
|
-
hidden > 0 && /* @__PURE__ */
|
|
5557
|
-
/* @__PURE__ */
|
|
5558
|
-
/* @__PURE__ */
|
|
5559
|
-
hidden > 1 && /* @__PURE__ */
|
|
5717
|
+
hidden > 0 && /* @__PURE__ */ jsxs59("li", { className: "ss-g-cp-step ss-g-cp-step--hidden", children: [
|
|
5718
|
+
/* @__PURE__ */ jsxs59("span", { className: "ss-g-cp-rail", children: [
|
|
5719
|
+
/* @__PURE__ */ jsx71("span", { className: "ss-g-cp-tile ss-g-cp-tile--locked", children: /* @__PURE__ */ jsx71(IconLock, { size: 18 }) }),
|
|
5720
|
+
hidden > 1 && /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-conn ss-g-cp-conn--faint", "aria-hidden": "true" })
|
|
5560
5721
|
] }),
|
|
5561
|
-
/* @__PURE__ */
|
|
5722
|
+
/* @__PURE__ */ jsx71("span", { className: "ss-g-cp-step-text", children: /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-sub", children: s.nextClubHidden }) })
|
|
5562
5723
|
] }),
|
|
5563
|
-
hidden > 1 && /* @__PURE__ */
|
|
5564
|
-
/* @__PURE__ */
|
|
5565
|
-
/* @__PURE__ */
|
|
5724
|
+
hidden > 1 && /* @__PURE__ */ jsxs59("li", { className: "ss-g-cp-step ss-g-cp-step--more", children: [
|
|
5725
|
+
/* @__PURE__ */ jsx71("span", { className: "ss-g-cp-rail", children: /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-tile ss-g-cp-tile--faint", children: /* @__PURE__ */ jsx71(IconLock, { size: 18 }) }) }),
|
|
5726
|
+
/* @__PURE__ */ jsx71("span", { className: "ss-g-cp-step-text", children: /* @__PURE__ */ jsx71("span", { className: "ss-g-cp-sub", children: s.moreClubs(hidden - 1) }) })
|
|
5566
5727
|
] })
|
|
5567
5728
|
] }),
|
|
5568
|
-
isOver && /* @__PURE__ */
|
|
5729
|
+
isOver && /* @__PURE__ */ jsx71(
|
|
5569
5730
|
ResultCard,
|
|
5570
5731
|
{
|
|
5571
5732
|
tone: clientState?.solved ? "win" : clientState?.failed ? "lose" : "neutral",
|
|
@@ -5577,22 +5738,22 @@ function CareerPathGame({
|
|
|
5577
5738
|
}
|
|
5578
5739
|
)
|
|
5579
5740
|
] }),
|
|
5580
|
-
!isOver && /* @__PURE__ */
|
|
5581
|
-
query.length > 0 && filtered.length > 0 && /* @__PURE__ */
|
|
5741
|
+
!isOver && /* @__PURE__ */ jsxs59(FooterBar, { children: [
|
|
5742
|
+
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx71(
|
|
5582
5743
|
OptionList,
|
|
5583
5744
|
{
|
|
5584
5745
|
label: s.searchLabel,
|
|
5585
5746
|
options: filtered.map((p) => ({
|
|
5586
5747
|
key: p.id,
|
|
5587
|
-
content: /* @__PURE__ */
|
|
5588
|
-
/* @__PURE__ */
|
|
5589
|
-
/* @__PURE__ */
|
|
5748
|
+
content: /* @__PURE__ */ jsxs59(Fragment13, { children: [
|
|
5749
|
+
/* @__PURE__ */ jsx71(PlayerAvatar, { className: "ss-g-opt-av", name: p.name }),
|
|
5750
|
+
/* @__PURE__ */ jsx71("span", { children: p.name })
|
|
5590
5751
|
] })
|
|
5591
5752
|
})),
|
|
5592
5753
|
onPick: (k) => handleSelect(Number(k))
|
|
5593
5754
|
}
|
|
5594
5755
|
),
|
|
5595
|
-
/* @__PURE__ */
|
|
5756
|
+
/* @__PURE__ */ jsx71(
|
|
5596
5757
|
SearchField,
|
|
5597
5758
|
{
|
|
5598
5759
|
id: inputId,
|
|
@@ -5608,8 +5769,8 @@ function CareerPathGame({
|
|
|
5608
5769
|
}
|
|
5609
5770
|
|
|
5610
5771
|
// src/components/games/BeatTheGridGame.tsx
|
|
5611
|
-
import React, { useEffect as
|
|
5612
|
-
import { Fragment as Fragment14, jsx as
|
|
5772
|
+
import React, { useEffect as useEffect15, useId as useId4, useRef as useRef13, useState as useState29 } from "react";
|
|
5773
|
+
import { Fragment as Fragment14, jsx as jsx72, jsxs as jsxs60 } from "react/jsx-runtime";
|
|
5613
5774
|
function criterionIconKind(label, key) {
|
|
5614
5775
|
const l = (key ?? label).toLowerCase();
|
|
5615
5776
|
if (l.includes("app")) return "calendar";
|
|
@@ -5627,34 +5788,34 @@ function rowAbbrev(label, map, key) {
|
|
|
5627
5788
|
function CriterionIcon({ kind }) {
|
|
5628
5789
|
switch (kind) {
|
|
5629
5790
|
case "calendar":
|
|
5630
|
-
return /* @__PURE__ */
|
|
5791
|
+
return /* @__PURE__ */ jsx72(IconCalendar, {});
|
|
5631
5792
|
case "ball":
|
|
5632
|
-
return /* @__PURE__ */
|
|
5793
|
+
return /* @__PURE__ */ jsx72(IconBall, {});
|
|
5633
5794
|
case "boot":
|
|
5634
|
-
return /* @__PURE__ */
|
|
5795
|
+
return /* @__PURE__ */ jsx72(IconBoot, {});
|
|
5635
5796
|
case "gloves":
|
|
5636
|
-
return /* @__PURE__ */
|
|
5797
|
+
return /* @__PURE__ */ jsx72(IconGloves, {});
|
|
5637
5798
|
case "shield":
|
|
5638
|
-
return /* @__PURE__ */
|
|
5799
|
+
return /* @__PURE__ */ jsx72(IconShield, {});
|
|
5639
5800
|
default:
|
|
5640
|
-
return /* @__PURE__ */
|
|
5801
|
+
return /* @__PURE__ */ jsx72(IconFlag, {});
|
|
5641
5802
|
}
|
|
5642
5803
|
}
|
|
5643
5804
|
function HeaderVisual({ label, textKey: iKey, meta }) {
|
|
5644
5805
|
if (!meta) {
|
|
5645
|
-
return /* @__PURE__ */
|
|
5806
|
+
return /* @__PURE__ */ jsx72(CriterionIcon, { kind: criterionIconKind(label, iKey) });
|
|
5646
5807
|
}
|
|
5647
5808
|
switch (meta.kind) {
|
|
5648
5809
|
case "club":
|
|
5649
|
-
return /* @__PURE__ */
|
|
5810
|
+
return /* @__PURE__ */ jsx72(CrestShield, { src: meta.imageUrl, name: label, size: 24 });
|
|
5650
5811
|
case "coach":
|
|
5651
|
-
return /* @__PURE__ */
|
|
5812
|
+
return /* @__PURE__ */ jsx72(PlayerAvatar, { name: label, imagePath: meta.imageUrl, className: "ss-g-btg-coach-av" });
|
|
5652
5813
|
case "country":
|
|
5653
|
-
return /* @__PURE__ */
|
|
5814
|
+
return /* @__PURE__ */ jsx72("span", { className: "ss-g-btg-hdr-flag", "aria-hidden": "true", children: nationalityFlag(meta.country ?? label) });
|
|
5654
5815
|
case "position":
|
|
5655
|
-
return /* @__PURE__ */
|
|
5816
|
+
return /* @__PURE__ */ jsx72(Fragment14, {});
|
|
5656
5817
|
default:
|
|
5657
|
-
return /* @__PURE__ */
|
|
5818
|
+
return /* @__PURE__ */ jsx72(CriterionIcon, { kind: criterionIconKind(label, iKey) });
|
|
5658
5819
|
}
|
|
5659
5820
|
}
|
|
5660
5821
|
function parseClientState4(json) {
|
|
@@ -5689,21 +5850,21 @@ function SearchSheet({
|
|
|
5689
5850
|
ui
|
|
5690
5851
|
}) {
|
|
5691
5852
|
const s = ui.games.beatTheGrid;
|
|
5692
|
-
const [query, setQuery] =
|
|
5853
|
+
const [query, setQuery] = useState29("");
|
|
5693
5854
|
const inputId = useId4();
|
|
5694
|
-
const inputRef =
|
|
5695
|
-
|
|
5855
|
+
const inputRef = useRef13(null);
|
|
5856
|
+
useEffect15(() => {
|
|
5696
5857
|
inputRef.current?.focus();
|
|
5697
5858
|
}, [row, col]);
|
|
5698
5859
|
const filtered = playerPool.filter(
|
|
5699
5860
|
(p) => !alreadyFilledIds.has(p.id) && p.name.toLowerCase().includes(query.toLowerCase())
|
|
5700
5861
|
);
|
|
5701
|
-
return /* @__PURE__ */
|
|
5702
|
-
/* @__PURE__ */
|
|
5703
|
-
/* @__PURE__ */
|
|
5704
|
-
/* @__PURE__ */
|
|
5705
|
-
/* @__PURE__ */
|
|
5706
|
-
/* @__PURE__ */
|
|
5862
|
+
return /* @__PURE__ */ jsxs60("div", { className: "ss-g-btg-sheet", "data-testid": "btg-search-sheet", children: [
|
|
5863
|
+
/* @__PURE__ */ jsxs60("div", { className: "ss-g-btg-sheet-hdr", children: [
|
|
5864
|
+
/* @__PURE__ */ jsx72(Chip, { variant: "neutral", children: rowLabel }),
|
|
5865
|
+
/* @__PURE__ */ jsx72("span", { className: "ss-g-btg-sheet-x", "aria-hidden": "true", children: /* @__PURE__ */ jsx72(IconClose, { size: 12 }) }),
|
|
5866
|
+
/* @__PURE__ */ jsx72(Chip, { variant: "accent", children: colLabel }),
|
|
5867
|
+
/* @__PURE__ */ jsx72(
|
|
5707
5868
|
"button",
|
|
5708
5869
|
{
|
|
5709
5870
|
type: "button",
|
|
@@ -5711,12 +5872,12 @@ function SearchSheet({
|
|
|
5711
5872
|
"data-testid": "btg-sheet-dismiss",
|
|
5712
5873
|
"aria-label": s.closeSearch,
|
|
5713
5874
|
onClick: onDismiss,
|
|
5714
|
-
children: /* @__PURE__ */
|
|
5875
|
+
children: /* @__PURE__ */ jsx72(IconClose, {})
|
|
5715
5876
|
}
|
|
5716
5877
|
)
|
|
5717
5878
|
] }),
|
|
5718
|
-
playerPool.length === 0 ? /* @__PURE__ */
|
|
5719
|
-
/* @__PURE__ */
|
|
5879
|
+
playerPool.length === 0 ? /* @__PURE__ */ jsx72("div", { className: "ss-g-btg-sheet-empty", children: s.emptyPool }) : /* @__PURE__ */ jsxs60(Fragment14, { children: [
|
|
5880
|
+
/* @__PURE__ */ jsx72(
|
|
5720
5881
|
SearchField,
|
|
5721
5882
|
{
|
|
5722
5883
|
id: inputId,
|
|
@@ -5728,16 +5889,16 @@ function SearchSheet({
|
|
|
5728
5889
|
inputRef
|
|
5729
5890
|
}
|
|
5730
5891
|
),
|
|
5731
|
-
query.length > 0 && filtered.length > 0 && /* @__PURE__ */
|
|
5892
|
+
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx72(
|
|
5732
5893
|
OptionList,
|
|
5733
5894
|
{
|
|
5734
5895
|
label: s.searchLabel(rowLabel, colLabel),
|
|
5735
5896
|
options: filtered.map((p) => ({
|
|
5736
5897
|
key: p.id,
|
|
5737
|
-
content: /* @__PURE__ */
|
|
5738
|
-
/* @__PURE__ */
|
|
5739
|
-
/* @__PURE__ */
|
|
5740
|
-
/* @__PURE__ */
|
|
5898
|
+
content: /* @__PURE__ */ jsxs60(Fragment14, { children: [
|
|
5899
|
+
/* @__PURE__ */ jsx72(PlayerAvatar, { name: p.name, imagePath: p.imagePath, className: "ss-g-opt-av" }),
|
|
5900
|
+
/* @__PURE__ */ jsx72("span", { className: "ss-g-btg-result-name", children: p.name }),
|
|
5901
|
+
/* @__PURE__ */ jsx72("span", { className: "ss-g-btg-result-plus", "aria-hidden": "true", children: /* @__PURE__ */ jsx72(IconPlus, { size: 18 }) })
|
|
5741
5902
|
] })
|
|
5742
5903
|
})),
|
|
5743
5904
|
onPick: (k) => onPick(row, col, Number(k))
|
|
@@ -5757,7 +5918,7 @@ function BeatTheGridGame({
|
|
|
5757
5918
|
}) {
|
|
5758
5919
|
const s = ui.games.beatTheGrid;
|
|
5759
5920
|
const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
|
|
5760
|
-
const [activeCell, setActiveCell] =
|
|
5921
|
+
const [activeCell, setActiveCell] = useState29(null);
|
|
5761
5922
|
const clientState = parseClientState4(result?.clientStateJson);
|
|
5762
5923
|
const filledCells = clientState?.cells ?? [];
|
|
5763
5924
|
const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
|
|
@@ -5775,9 +5936,9 @@ function BeatTheGridGame({
|
|
|
5775
5936
|
onSubmit(JSON.stringify({ cells: newCells }));
|
|
5776
5937
|
}
|
|
5777
5938
|
if (!config) {
|
|
5778
|
-
return /* @__PURE__ */
|
|
5779
|
-
/* @__PURE__ */
|
|
5780
|
-
/* @__PURE__ */
|
|
5939
|
+
return /* @__PURE__ */ jsxs60("div", { className: "ss-g-screen", "data-testid": "game-screen-beat-the-grid", children: [
|
|
5940
|
+
/* @__PURE__ */ jsx72(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
|
|
5941
|
+
/* @__PURE__ */ jsx72("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
5781
5942
|
] });
|
|
5782
5943
|
}
|
|
5783
5944
|
const rows = config.rows;
|
|
@@ -5790,20 +5951,20 @@ function BeatTheGridGame({
|
|
|
5790
5951
|
(_, i) => i < correctCount ? "correct" : i < correctCount + wrongCount ? "wrong" : "todo"
|
|
5791
5952
|
);
|
|
5792
5953
|
const totalScore = clientState?.totalScore ?? result?.score ?? 0;
|
|
5793
|
-
return /* @__PURE__ */
|
|
5794
|
-
/* @__PURE__ */
|
|
5795
|
-
/* @__PURE__ */
|
|
5954
|
+
return /* @__PURE__ */ jsxs60("div", { className: "ss-g-screen", "data-testid": "game-screen-beat-the-grid", children: [
|
|
5955
|
+
/* @__PURE__ */ jsx72(GameHeader, { title, eyebrow: s.eyebrow, onBack, backLabel: ui.back }),
|
|
5956
|
+
/* @__PURE__ */ jsx72(
|
|
5796
5957
|
SegmentProgress,
|
|
5797
5958
|
{
|
|
5798
5959
|
segments,
|
|
5799
5960
|
ariaLabel: s.progressAria(filledCells.length, total),
|
|
5800
5961
|
leftLabel: s.filled(filledCells.length, total),
|
|
5801
5962
|
rightLabel: s.toGo(Math.max(0, total - filledCells.length)),
|
|
5802
|
-
right: /* @__PURE__ */
|
|
5963
|
+
right: /* @__PURE__ */ jsx72(Chip, { variant: "accent", children: `${totalScore} ${ui.games.unitPts}` })
|
|
5803
5964
|
}
|
|
5804
5965
|
),
|
|
5805
|
-
/* @__PURE__ */
|
|
5806
|
-
/* @__PURE__ */
|
|
5966
|
+
/* @__PURE__ */ jsxs60("div", { className: "ss-g-body", children: [
|
|
5967
|
+
/* @__PURE__ */ jsxs60(
|
|
5807
5968
|
"div",
|
|
5808
5969
|
{
|
|
5809
5970
|
className: activeCell !== null ? "ss-g-btg-grid ss-g-btg-grid--fit" : "ss-g-btg-grid",
|
|
@@ -5813,31 +5974,31 @@ function BeatTheGridGame({
|
|
|
5813
5974
|
},
|
|
5814
5975
|
role: "grid",
|
|
5815
5976
|
children: [
|
|
5816
|
-
/* @__PURE__ */
|
|
5977
|
+
/* @__PURE__ */ jsx72("div", { className: "ss-g-btg-corner" }),
|
|
5817
5978
|
cols.map((col, colIdx) => {
|
|
5818
5979
|
const colMeta = config.colsMeta?.[colIdx];
|
|
5819
|
-
return /* @__PURE__ */
|
|
5820
|
-
/* @__PURE__ */
|
|
5821
|
-
/* @__PURE__ */
|
|
5980
|
+
return /* @__PURE__ */ jsxs60("div", { className: "ss-g-btg-colhdr", "data-meta": colMeta ? "true" : void 0, children: [
|
|
5981
|
+
/* @__PURE__ */ jsx72(HeaderVisual, { label: col, textKey: config.colsI18n?.[colIdx]?.key, meta: colMeta }),
|
|
5982
|
+
/* @__PURE__ */ jsx72("span", { children: col })
|
|
5822
5983
|
] }, col);
|
|
5823
5984
|
}),
|
|
5824
5985
|
rows.map((rowLabel, rowIdx) => {
|
|
5825
5986
|
const rowMeta = config.rowsMeta?.[rowIdx];
|
|
5826
5987
|
const abbr = rowAbbrev(rowLabel, s.rowAbbrev, config.rowsI18n?.[rowIdx]?.key);
|
|
5827
|
-
const rowHeaderContent = rowMeta ? /* @__PURE__ */
|
|
5828
|
-
/* @__PURE__ */
|
|
5829
|
-
/* @__PURE__ */
|
|
5830
|
-
] }) : abbr === rowLabel ? /* @__PURE__ */
|
|
5831
|
-
/* @__PURE__ */
|
|
5832
|
-
/* @__PURE__ */
|
|
5988
|
+
const rowHeaderContent = rowMeta ? /* @__PURE__ */ jsxs60(Fragment14, { children: [
|
|
5989
|
+
/* @__PURE__ */ jsx72(HeaderVisual, { label: rowLabel, textKey: config.rowsI18n?.[rowIdx]?.key, meta: rowMeta }),
|
|
5990
|
+
/* @__PURE__ */ jsx72("span", { children: rowLabel })
|
|
5991
|
+
] }) : abbr === rowLabel ? /* @__PURE__ */ jsx72("span", { children: rowLabel }) : /* @__PURE__ */ jsxs60(Fragment14, { children: [
|
|
5992
|
+
/* @__PURE__ */ jsx72("span", { "aria-hidden": "true", children: abbr }),
|
|
5993
|
+
/* @__PURE__ */ jsx72("span", { className: "ss-g-sr", children: rowLabel })
|
|
5833
5994
|
] });
|
|
5834
|
-
return /* @__PURE__ */
|
|
5835
|
-
/* @__PURE__ */
|
|
5995
|
+
return /* @__PURE__ */ jsxs60(React.Fragment, { children: [
|
|
5996
|
+
/* @__PURE__ */ jsx72("div", { className: "ss-g-btg-rowhdr", "data-meta": rowMeta ? "true" : void 0, children: rowHeaderContent }),
|
|
5836
5997
|
cols.map((colLabel, colIdx) => {
|
|
5837
5998
|
const filled = findCellResult(filledCells, rowIdx, colIdx);
|
|
5838
5999
|
const isActive = activeCell?.row === rowIdx && activeCell?.col === colIdx;
|
|
5839
6000
|
const state = filled ? filled.isCorrect ? "correct" : "wrong" : isActive ? "active" : "empty";
|
|
5840
|
-
return /* @__PURE__ */
|
|
6001
|
+
return /* @__PURE__ */ jsx72(
|
|
5841
6002
|
"button",
|
|
5842
6003
|
{
|
|
5843
6004
|
type: "button",
|
|
@@ -5848,20 +6009,20 @@ function BeatTheGridGame({
|
|
|
5848
6009
|
className: "ss-g-btg-cell",
|
|
5849
6010
|
disabled: isLocked2 || submitting,
|
|
5850
6011
|
onClick: () => handleCellClick(rowIdx, colIdx),
|
|
5851
|
-
children: filled ? /* @__PURE__ */
|
|
5852
|
-
/* @__PURE__ */
|
|
6012
|
+
children: filled ? /* @__PURE__ */ jsxs60(Fragment14, { children: [
|
|
6013
|
+
/* @__PURE__ */ jsx72(
|
|
5853
6014
|
"span",
|
|
5854
6015
|
{
|
|
5855
6016
|
className: `ss-g-btg-badge ss-g-btg-badge--${filled.isCorrect ? "correct" : "wrong"}`,
|
|
5856
6017
|
role: "img",
|
|
5857
6018
|
"aria-label": filled.isCorrect ? s.correct : s.wrong,
|
|
5858
|
-
children: filled.isCorrect ? /* @__PURE__ */
|
|
6019
|
+
children: filled.isCorrect ? /* @__PURE__ */ jsx72(IconCheck, { size: 11 }) : /* @__PURE__ */ jsx72(IconClose, { size: 11 })
|
|
5859
6020
|
}
|
|
5860
6021
|
),
|
|
5861
|
-
/* @__PURE__ */
|
|
6022
|
+
/* @__PURE__ */ jsx72("span", { className: "ss-g-btg-rarity", children: filled.rarityScore }),
|
|
5862
6023
|
(() => {
|
|
5863
6024
|
const entry = playerPool.find((p) => p.id === filled.playerId);
|
|
5864
|
-
return /* @__PURE__ */
|
|
6025
|
+
return /* @__PURE__ */ jsx72(
|
|
5865
6026
|
PlayerAvatar,
|
|
5866
6027
|
{
|
|
5867
6028
|
name: entry?.name ?? "",
|
|
@@ -5870,8 +6031,8 @@ function BeatTheGridGame({
|
|
|
5870
6031
|
}
|
|
5871
6032
|
);
|
|
5872
6033
|
})(),
|
|
5873
|
-
/* @__PURE__ */
|
|
5874
|
-
] }) : /* @__PURE__ */
|
|
6034
|
+
/* @__PURE__ */ jsx72("span", { className: "ss-g-btg-name", children: shortName(playerPool.find((p) => p.id === filled.playerId)?.name) })
|
|
6035
|
+
] }) : /* @__PURE__ */ jsx72("span", { className: "ss-g-btg-plus", "aria-hidden": "true", children: /* @__PURE__ */ jsx72(IconPlus, { size: 22 }) })
|
|
5875
6036
|
},
|
|
5876
6037
|
`cell-${rowIdx}-${colIdx}`
|
|
5877
6038
|
);
|
|
@@ -5881,7 +6042,7 @@ function BeatTheGridGame({
|
|
|
5881
6042
|
]
|
|
5882
6043
|
}
|
|
5883
6044
|
),
|
|
5884
|
-
isLocked2 && /* @__PURE__ */
|
|
6045
|
+
isLocked2 && /* @__PURE__ */ jsx72(
|
|
5885
6046
|
ResultCard,
|
|
5886
6047
|
{
|
|
5887
6048
|
tone: "neutral",
|
|
@@ -5893,7 +6054,7 @@ function BeatTheGridGame({
|
|
|
5893
6054
|
}
|
|
5894
6055
|
)
|
|
5895
6056
|
] }),
|
|
5896
|
-
activeCell !== null && /* @__PURE__ */
|
|
6057
|
+
activeCell !== null && /* @__PURE__ */ jsx72("div", { className: "ss-g-btg-pin", children: /* @__PURE__ */ jsx72(
|
|
5897
6058
|
SearchSheet,
|
|
5898
6059
|
{
|
|
5899
6060
|
row: activeCell.row,
|
|
@@ -5912,21 +6073,21 @@ function BeatTheGridGame({
|
|
|
5912
6073
|
}
|
|
5913
6074
|
|
|
5914
6075
|
// src/components/games/GuessTheXiGame.tsx
|
|
5915
|
-
import { useState as
|
|
6076
|
+
import { useState as useState30, useId as useId5 } from "react";
|
|
5916
6077
|
|
|
5917
6078
|
// src/components/games/ui/PitchSvg.tsx
|
|
5918
|
-
import { Fragment as Fragment15, jsx as
|
|
6079
|
+
import { Fragment as Fragment15, jsx as jsx73, jsxs as jsxs61 } from "react/jsx-runtime";
|
|
5919
6080
|
function PitchSvg({ variant }) {
|
|
5920
|
-
return /* @__PURE__ */
|
|
5921
|
-
/* @__PURE__ */
|
|
5922
|
-
variant === "full" ? /* @__PURE__ */
|
|
5923
|
-
/* @__PURE__ */
|
|
5924
|
-
/* @__PURE__ */
|
|
5925
|
-
/* @__PURE__ */
|
|
5926
|
-
/* @__PURE__ */
|
|
5927
|
-
] }) : /* @__PURE__ */
|
|
5928
|
-
/* @__PURE__ */
|
|
5929
|
-
/* @__PURE__ */
|
|
6081
|
+
return /* @__PURE__ */ jsxs61("svg", { className: "ss-g-pitch-svg", viewBox: variant === "full" ? "0 0 100 150" : "0 0 100 100", preserveAspectRatio: "none", "aria-hidden": "true", children: [
|
|
6082
|
+
/* @__PURE__ */ jsx73("rect", { x: "4", y: "4", width: "92", height: variant === "full" ? 142 : 92, fill: "none" }),
|
|
6083
|
+
variant === "full" ? /* @__PURE__ */ jsxs61(Fragment15, { children: [
|
|
6084
|
+
/* @__PURE__ */ jsx73("line", { x1: "4", y1: "75", x2: "96", y2: "75" }),
|
|
6085
|
+
/* @__PURE__ */ jsx73("circle", { cx: "50", cy: "75", r: "12", fill: "none" }),
|
|
6086
|
+
/* @__PURE__ */ jsx73("rect", { x: "26", y: "4", width: "48", height: "20", fill: "none" }),
|
|
6087
|
+
/* @__PURE__ */ jsx73("rect", { x: "26", y: "126", width: "48", height: "20", fill: "none" })
|
|
6088
|
+
] }) : /* @__PURE__ */ jsxs61(Fragment15, { children: [
|
|
6089
|
+
/* @__PURE__ */ jsx73("path", { d: "M38 4a12 12 0 0 0 24 0", fill: "none" }),
|
|
6090
|
+
/* @__PURE__ */ jsx73("rect", { x: "26", y: "76", width: "48", height: "20", fill: "none" })
|
|
5930
6091
|
] })
|
|
5931
6092
|
] });
|
|
5932
6093
|
}
|
|
@@ -5982,7 +6143,7 @@ function positionsBySlot(formation, rowsAttackFirst) {
|
|
|
5982
6143
|
}
|
|
5983
6144
|
|
|
5984
6145
|
// src/components/games/GuessTheXiGame.tsx
|
|
5985
|
-
import { Fragment as Fragment16, jsx as
|
|
6146
|
+
import { Fragment as Fragment16, jsx as jsx74, jsxs as jsxs62 } from "react/jsx-runtime";
|
|
5986
6147
|
var MAX_GUESSES2 = 3;
|
|
5987
6148
|
function parseClientState5(json) {
|
|
5988
6149
|
if (!json) return null;
|
|
@@ -6001,7 +6162,7 @@ function GuessTheXiGame({
|
|
|
6001
6162
|
onBack
|
|
6002
6163
|
}) {
|
|
6003
6164
|
const t = ui.games.guessTheXi;
|
|
6004
|
-
const [query, setQuery] =
|
|
6165
|
+
const [query, setQuery] = useState30("");
|
|
6005
6166
|
const inputId = useId5();
|
|
6006
6167
|
const clientState = parseClientState5(result?.clientStateJson);
|
|
6007
6168
|
const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
|
|
@@ -6032,30 +6193,30 @@ function GuessTheXiGame({
|
|
|
6032
6193
|
const wrongGuesses = (clientState?.guessHistory ?? []).filter((g) => !g.wasCorrect);
|
|
6033
6194
|
const guessesLeft = Math.max(0, MAX_GUESSES2 - (clientState?.guessesUsed ?? 0));
|
|
6034
6195
|
const teamName = (id) => config?.teamPool.find((tm) => tm.teamId === id)?.teamName ?? `#${id}`;
|
|
6035
|
-
return /* @__PURE__ */
|
|
6036
|
-
/* @__PURE__ */
|
|
6196
|
+
return /* @__PURE__ */ jsxs62("div", { className: "ss-g-screen ss-g-gxi", "data-testid": "game-screen-guess-the-xi", children: [
|
|
6197
|
+
/* @__PURE__ */ jsx74(
|
|
6037
6198
|
GameHeader,
|
|
6038
6199
|
{
|
|
6039
6200
|
title: gameTitle({ gameId: "guess-the-xi" }, ui.games.titles),
|
|
6040
6201
|
eyebrow: config?.poolLabel,
|
|
6041
|
-
right: formation ? /* @__PURE__ */
|
|
6202
|
+
right: formation ? /* @__PURE__ */ jsx74(Chip, { variant: "accent", children: formation }) : void 0,
|
|
6042
6203
|
onBack,
|
|
6043
6204
|
backLabel: ui.back
|
|
6044
6205
|
}
|
|
6045
6206
|
),
|
|
6046
|
-
!config && /* @__PURE__ */
|
|
6047
|
-
config && /* @__PURE__ */
|
|
6048
|
-
/* @__PURE__ */
|
|
6049
|
-
rows.length > 0 && /* @__PURE__ */
|
|
6050
|
-
/* @__PURE__ */
|
|
6051
|
-
/* @__PURE__ */
|
|
6207
|
+
!config && /* @__PURE__ */ jsx74("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading }),
|
|
6208
|
+
config && /* @__PURE__ */ jsxs62(Fragment16, { children: [
|
|
6209
|
+
/* @__PURE__ */ jsxs62("div", { className: "ss-g-body", children: [
|
|
6210
|
+
rows.length > 0 && /* @__PURE__ */ jsxs62("div", { className: "ss-g-gxi-pitch", role: "group", "aria-label": t.pitchLabel, children: [
|
|
6211
|
+
/* @__PURE__ */ jsx74(PitchSvg, { variant: "full" }),
|
|
6212
|
+
/* @__PURE__ */ jsx74("div", { className: "ss-g-gxi-rows", children: rows.map((row, r) => /* @__PURE__ */ jsx74("div", { className: "ss-g-gxi-row", children: row.map((pos, c) => {
|
|
6052
6213
|
const posLabel = pos.slot ? posBySlot.get(pos.slot) ?? "" : "";
|
|
6053
6214
|
const name = pos.slot ? nameBySlot.get(pos.slot) : void 0;
|
|
6054
6215
|
const lineupEntry = pos.slot ? lineupBySlot.get(pos.slot) : void 0;
|
|
6055
6216
|
const flag = nationalityFlag(pos.nationality);
|
|
6056
6217
|
if (lineupEntry) {
|
|
6057
|
-
return /* @__PURE__ */
|
|
6058
|
-
/* @__PURE__ */
|
|
6218
|
+
return /* @__PURE__ */ jsxs62("div", { className: "ss-g-gxi-node", "data-revealed": "true", children: [
|
|
6219
|
+
/* @__PURE__ */ jsx74(
|
|
6059
6220
|
PlayerAvatar,
|
|
6060
6221
|
{
|
|
6061
6222
|
name: lineupEntry.name,
|
|
@@ -6063,11 +6224,11 @@ function GuessTheXiGame({
|
|
|
6063
6224
|
className: "ss-g-gxi-disc ss-g-gxi-disc--photo"
|
|
6064
6225
|
}
|
|
6065
6226
|
),
|
|
6066
|
-
/* @__PURE__ */
|
|
6227
|
+
/* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-pos ss-g-gxi-pos--name", children: splitName(lineupEntry.name).last })
|
|
6067
6228
|
] }, `${pos.slot}-${c}`);
|
|
6068
6229
|
}
|
|
6069
|
-
return /* @__PURE__ */
|
|
6070
|
-
/* @__PURE__ */
|
|
6230
|
+
return /* @__PURE__ */ jsxs62("div", { className: "ss-g-gxi-node", "data-revealed": name ? "true" : void 0, children: [
|
|
6231
|
+
/* @__PURE__ */ jsx74(
|
|
6071
6232
|
"span",
|
|
6072
6233
|
{
|
|
6073
6234
|
className: "ss-g-gxi-disc",
|
|
@@ -6078,22 +6239,22 @@ function GuessTheXiGame({
|
|
|
6078
6239
|
children: flag
|
|
6079
6240
|
}
|
|
6080
6241
|
),
|
|
6081
|
-
name ? /* @__PURE__ */
|
|
6242
|
+
name ? /* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-pos ss-g-gxi-pos--name", children: splitName(name).last }) : posLabel && /* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-pos", children: posLabel })
|
|
6082
6243
|
] }, `${pos.slot}-${c}`);
|
|
6083
6244
|
}) }, r)) })
|
|
6084
6245
|
] }),
|
|
6085
|
-
!isOver && wrongGuesses.length > 0 && /* @__PURE__ */
|
|
6086
|
-
/* @__PURE__ */
|
|
6246
|
+
!isOver && wrongGuesses.length > 0 && /* @__PURE__ */ jsxs62("div", { className: "ss-g-gxi-wrong", children: [
|
|
6247
|
+
/* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-wrong-l", children: t.notThem }),
|
|
6087
6248
|
wrongGuesses.map((g) => {
|
|
6088
6249
|
const crestUrl = config?.teamPool.find((tm) => tm.teamId === g.teamId)?.crestUrl;
|
|
6089
|
-
return /* @__PURE__ */
|
|
6090
|
-
/* @__PURE__ */
|
|
6091
|
-
/* @__PURE__ */
|
|
6250
|
+
return /* @__PURE__ */ jsxs62("span", { className: "ss-g-gxi-wrong-chip", children: [
|
|
6251
|
+
/* @__PURE__ */ jsx74(CrestShield, { src: crestUrl, name: teamName(g.teamId), size: 18 }),
|
|
6252
|
+
/* @__PURE__ */ jsx74("s", { children: teamName(g.teamId) })
|
|
6092
6253
|
] }, g.teamId);
|
|
6093
6254
|
})
|
|
6094
6255
|
] }),
|
|
6095
|
-
isOver && /* @__PURE__ */
|
|
6096
|
-
/* @__PURE__ */
|
|
6256
|
+
isOver && /* @__PURE__ */ jsxs62(Fragment16, { children: [
|
|
6257
|
+
/* @__PURE__ */ jsx74(
|
|
6097
6258
|
ResultCard,
|
|
6098
6259
|
{
|
|
6099
6260
|
tone: solved ? "win" : failed ? "lose" : "neutral",
|
|
@@ -6104,29 +6265,29 @@ function GuessTheXiGame({
|
|
|
6104
6265
|
ui
|
|
6105
6266
|
}
|
|
6106
6267
|
),
|
|
6107
|
-
(solved || failed) && clientState?.answer && /* @__PURE__ */
|
|
6108
|
-
/* @__PURE__ */
|
|
6109
|
-
/* @__PURE__ */
|
|
6110
|
-
/* @__PURE__ */
|
|
6268
|
+
(solved || failed) && clientState?.answer && /* @__PURE__ */ jsxs62("div", { className: "ss-g-gxi-answer", "data-testid": "gxi-answer-reveal", children: [
|
|
6269
|
+
/* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-answer-label", children: t.theAnswer }),
|
|
6270
|
+
/* @__PURE__ */ jsx74(CrestShield, { src: clientState.answer.crestUrl, name: clientState.answer.teamName, size: 32 }),
|
|
6271
|
+
/* @__PURE__ */ jsx74("span", { className: "ss-g-gxi-answer-name", children: clientState.answer.teamName })
|
|
6111
6272
|
] })
|
|
6112
6273
|
] })
|
|
6113
6274
|
] }),
|
|
6114
|
-
!isOver && /* @__PURE__ */
|
|
6115
|
-
query.length > 0 && filtered.length > 0 && /* @__PURE__ */
|
|
6275
|
+
!isOver && /* @__PURE__ */ jsxs62(FooterBar, { children: [
|
|
6276
|
+
query.length > 0 && filtered.length > 0 && /* @__PURE__ */ jsx74(
|
|
6116
6277
|
OptionList,
|
|
6117
6278
|
{
|
|
6118
6279
|
label: t.optionsLabel,
|
|
6119
6280
|
options: filtered.map((tm) => ({
|
|
6120
6281
|
key: tm.teamId,
|
|
6121
|
-
content: /* @__PURE__ */
|
|
6122
|
-
/* @__PURE__ */
|
|
6123
|
-
/* @__PURE__ */
|
|
6282
|
+
content: /* @__PURE__ */ jsxs62(Fragment16, { children: [
|
|
6283
|
+
/* @__PURE__ */ jsx74(CrestShield, { src: tm.crestUrl, name: tm.teamName, size: 28 }),
|
|
6284
|
+
/* @__PURE__ */ jsx74("span", { children: tm.teamName })
|
|
6124
6285
|
] })
|
|
6125
6286
|
})),
|
|
6126
6287
|
onPick: (k) => handlePick(Number(k))
|
|
6127
6288
|
}
|
|
6128
6289
|
),
|
|
6129
|
-
/* @__PURE__ */
|
|
6290
|
+
/* @__PURE__ */ jsx74(
|
|
6130
6291
|
SearchField,
|
|
6131
6292
|
{
|
|
6132
6293
|
id: inputId,
|
|
@@ -6143,8 +6304,8 @@ function GuessTheXiGame({
|
|
|
6143
6304
|
}
|
|
6144
6305
|
|
|
6145
6306
|
// src/components/games/DailyQuizGame.tsx
|
|
6146
|
-
import { useState as
|
|
6147
|
-
import { Fragment as Fragment17, jsx as
|
|
6307
|
+
import { useState as useState31 } from "react";
|
|
6308
|
+
import { Fragment as Fragment17, jsx as jsx75, jsxs as jsxs63 } from "react/jsx-runtime";
|
|
6148
6309
|
function parseClientState6(json) {
|
|
6149
6310
|
if (!json) return null;
|
|
6150
6311
|
try {
|
|
@@ -6165,13 +6326,13 @@ function OptionName({ text }) {
|
|
|
6165
6326
|
const tokens = base.split(/\s+/).filter(Boolean);
|
|
6166
6327
|
const isPlainName = tokens.length >= 1 && tokens.length <= 4 && tokens.every((t) => NAME_TOKEN.test(t));
|
|
6167
6328
|
if (!isPlainName || base === "") {
|
|
6168
|
-
return /* @__PURE__ */
|
|
6329
|
+
return /* @__PURE__ */ jsx75("span", { className: "ss-g-dq-opt-name", children: /* @__PURE__ */ jsx75("span", { className: "ss-g-dq-opt-full", children: text }) });
|
|
6169
6330
|
}
|
|
6170
6331
|
const { first, last } = splitName(base);
|
|
6171
|
-
return /* @__PURE__ */
|
|
6172
|
-
first && /* @__PURE__ */
|
|
6173
|
-
/* @__PURE__ */
|
|
6174
|
-
suffix && /* @__PURE__ */
|
|
6332
|
+
return /* @__PURE__ */ jsxs63("span", { className: "ss-g-dq-opt-name", children: [
|
|
6333
|
+
first && /* @__PURE__ */ jsx75("span", { className: "ss-g-dq-opt-first", children: first }),
|
|
6334
|
+
/* @__PURE__ */ jsx75("span", { className: "ss-g-dq-opt-last", children: last }),
|
|
6335
|
+
suffix && /* @__PURE__ */ jsx75("span", { className: "ss-g-dq-opt-suffix", children: suffix })
|
|
6175
6336
|
] });
|
|
6176
6337
|
}
|
|
6177
6338
|
function DailyQuizGame({
|
|
@@ -6184,15 +6345,15 @@ function DailyQuizGame({
|
|
|
6184
6345
|
}) {
|
|
6185
6346
|
const s = ui.games.dailyQuiz;
|
|
6186
6347
|
const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
|
|
6187
|
-
const [selections, setSelections] =
|
|
6188
|
-
const [page, setPage] =
|
|
6348
|
+
const [selections, setSelections] = useState31(/* @__PURE__ */ new Map());
|
|
6349
|
+
const [page, setPage] = useState31(0);
|
|
6189
6350
|
const clientState = parseClientState6(result?.clientStateJson);
|
|
6190
6351
|
const results = clientState?.results ?? [];
|
|
6191
6352
|
const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
|
|
6192
6353
|
if (!config) {
|
|
6193
|
-
return /* @__PURE__ */
|
|
6194
|
-
/* @__PURE__ */
|
|
6195
|
-
/* @__PURE__ */
|
|
6354
|
+
return /* @__PURE__ */ jsxs63("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
|
|
6355
|
+
/* @__PURE__ */ jsx75(GameHeader, { title, onBack, backLabel: ui.back }),
|
|
6356
|
+
/* @__PURE__ */ jsx75("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
6196
6357
|
] });
|
|
6197
6358
|
}
|
|
6198
6359
|
const questions = config.questions;
|
|
@@ -6227,11 +6388,11 @@ function DailyQuizGame({
|
|
|
6227
6388
|
return r.isCorrect ? "correct" : "wrong";
|
|
6228
6389
|
});
|
|
6229
6390
|
const correctCount = results.filter((r) => r.isCorrect).length;
|
|
6230
|
-
return /* @__PURE__ */
|
|
6231
|
-
/* @__PURE__ */
|
|
6232
|
-
/* @__PURE__ */
|
|
6233
|
-
/* @__PURE__ */
|
|
6234
|
-
/* @__PURE__ */
|
|
6391
|
+
return /* @__PURE__ */ jsxs63("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
|
|
6392
|
+
/* @__PURE__ */ jsx75(GameHeader, { title, eyebrow: s.results, onBack, backLabel: ui.back }),
|
|
6393
|
+
/* @__PURE__ */ jsx75(SegmentProgress, { segments: segments2, ariaLabel: s.results }),
|
|
6394
|
+
/* @__PURE__ */ jsxs63("div", { className: "ss-g-body", children: [
|
|
6395
|
+
/* @__PURE__ */ jsx75(
|
|
6235
6396
|
ResultCard,
|
|
6236
6397
|
{
|
|
6237
6398
|
tone: "neutral",
|
|
@@ -6244,15 +6405,15 @@ function DailyQuizGame({
|
|
|
6244
6405
|
questions.map((q) => {
|
|
6245
6406
|
const r = findResult(results, q.index);
|
|
6246
6407
|
const picked = selections.get(q.index);
|
|
6247
|
-
return /* @__PURE__ */
|
|
6248
|
-
/* @__PURE__ */
|
|
6249
|
-
r && /* @__PURE__ */
|
|
6408
|
+
return /* @__PURE__ */ jsxs63("div", { className: "ss-g-dq-rq", children: [
|
|
6409
|
+
/* @__PURE__ */ jsx75("div", { className: "ss-g-dq-rq-stem", children: q.stem }),
|
|
6410
|
+
r && /* @__PURE__ */ jsx75("div", { className: "ss-g-dq-rq-opts", children: q.options.map((opt, optIdx) => {
|
|
6250
6411
|
let cls = "ss-g-dq-rq-opt";
|
|
6251
6412
|
if (optIdx === r.correctOptionIndex) cls += " ss-g-dq-rq-opt--correct";
|
|
6252
6413
|
else if (optIdx === picked && !r.isCorrect) cls += " ss-g-dq-rq-opt--wrong";
|
|
6253
|
-
return /* @__PURE__ */
|
|
6414
|
+
return /* @__PURE__ */ jsx75("span", { className: cls, children: opt }, optIdx);
|
|
6254
6415
|
}) }),
|
|
6255
|
-
r?.revealText && /* @__PURE__ */
|
|
6416
|
+
r?.revealText && /* @__PURE__ */ jsx75("div", { className: "ss-g-dq-why", children: r.revealText })
|
|
6256
6417
|
] }, q.index);
|
|
6257
6418
|
})
|
|
6258
6419
|
] })
|
|
@@ -6260,16 +6421,16 @@ function DailyQuizGame({
|
|
|
6260
6421
|
}
|
|
6261
6422
|
const segments = questions.map((_, i) => i < page ? "done" : i === page ? "current" : "todo");
|
|
6262
6423
|
const selectedIdx = current ? selections.get(current.index) : void 0;
|
|
6263
|
-
return /* @__PURE__ */
|
|
6264
|
-
/* @__PURE__ */
|
|
6265
|
-
/* @__PURE__ */
|
|
6266
|
-
/* @__PURE__ */
|
|
6267
|
-
/* @__PURE__ */
|
|
6268
|
-
/* @__PURE__ */
|
|
6424
|
+
return /* @__PURE__ */ jsxs63("div", { className: "ss-g-screen", "data-testid": "game-screen-daily-quiz", children: [
|
|
6425
|
+
/* @__PURE__ */ jsx75(GameHeader, { title, eyebrow: s.questionOf(page + 1, total), onBack, backLabel: ui.back }),
|
|
6426
|
+
/* @__PURE__ */ jsx75(SegmentProgress, { segments, ariaLabel: s.progressAria(page + 1, total) }),
|
|
6427
|
+
/* @__PURE__ */ jsx75("div", { className: "ss-g-body", children: current && /* @__PURE__ */ jsxs63(Fragment17, { children: [
|
|
6428
|
+
/* @__PURE__ */ jsx75("h3", { className: "ss-g-dq-stem", children: current.stem }),
|
|
6429
|
+
/* @__PURE__ */ jsx75("div", { className: "ss-g-dq-opts", children: current.options.map((opt, optIdx) => {
|
|
6269
6430
|
const selected = optIdx === selectedIdx;
|
|
6270
6431
|
const imagePath = current.optionImagePaths?.[optIdx] ?? void 0;
|
|
6271
6432
|
const playerName = opt;
|
|
6272
|
-
return /* @__PURE__ */
|
|
6433
|
+
return /* @__PURE__ */ jsxs63(
|
|
6273
6434
|
"button",
|
|
6274
6435
|
{
|
|
6275
6436
|
type: "button",
|
|
@@ -6278,25 +6439,25 @@ function DailyQuizGame({
|
|
|
6278
6439
|
disabled: submitting,
|
|
6279
6440
|
onClick: () => handleSelect(current.index, optIdx),
|
|
6280
6441
|
children: [
|
|
6281
|
-
current.optionImagePaths && /* @__PURE__ */
|
|
6282
|
-
/* @__PURE__ */
|
|
6283
|
-
/* @__PURE__ */
|
|
6442
|
+
current.optionImagePaths && /* @__PURE__ */ jsx75(PlayerAvatar, { name: playerName, imagePath, className: "ss-g-dq-opt-av" }),
|
|
6443
|
+
/* @__PURE__ */ jsx75("span", { className: "ss-g-dq-badge", "aria-hidden": "true", children: selected ? /* @__PURE__ */ jsx75(IconCheck, {}) : String.fromCharCode(65 + optIdx) }),
|
|
6444
|
+
/* @__PURE__ */ jsx75(OptionName, { text: opt })
|
|
6284
6445
|
]
|
|
6285
6446
|
},
|
|
6286
6447
|
optIdx
|
|
6287
6448
|
);
|
|
6288
6449
|
}) })
|
|
6289
6450
|
] }) }),
|
|
6290
|
-
/* @__PURE__ */
|
|
6291
|
-
page > 0 && /* @__PURE__ */
|
|
6292
|
-
isLast ? /* @__PURE__ */
|
|
6451
|
+
/* @__PURE__ */ jsx75(FooterBar, { children: /* @__PURE__ */ jsxs63("div", { className: "ss-g-dq-nav", children: [
|
|
6452
|
+
page > 0 && /* @__PURE__ */ jsx75(GameButton, { variant: "outline", onClick: goPrev, disabled: submitting, children: s.previous }),
|
|
6453
|
+
isLast ? /* @__PURE__ */ jsx75(GameButton, { variant: "primary", block: true, onClick: handleSubmit, disabled: !currentAnswered || !allAnswered || submitting, children: submitting ? s.submitting : s.submit }) : /* @__PURE__ */ jsx75(GameButton, { variant: "primary", block: true, onClick: goNext, disabled: !currentAnswered || submitting, children: s.next })
|
|
6293
6454
|
] }) })
|
|
6294
6455
|
] });
|
|
6295
6456
|
}
|
|
6296
6457
|
|
|
6297
6458
|
// src/components/games/MatchdayPredictorGame.tsx
|
|
6298
|
-
import { useId as useId6, useState as
|
|
6299
|
-
import { jsx as
|
|
6459
|
+
import { useId as useId6, useState as useState32 } from "react";
|
|
6460
|
+
import { jsx as jsx76, jsxs as jsxs64 } from "react/jsx-runtime";
|
|
6300
6461
|
var SCORER_SEARCH_THRESHOLD = 9;
|
|
6301
6462
|
function parseClientState7(json) {
|
|
6302
6463
|
if (!json) return null;
|
|
@@ -6314,7 +6475,7 @@ function isLocked(kickoffUtc) {
|
|
|
6314
6475
|
}
|
|
6315
6476
|
}
|
|
6316
6477
|
function IconMinus() {
|
|
6317
|
-
return /* @__PURE__ */
|
|
6478
|
+
return /* @__PURE__ */ jsx76(
|
|
6318
6479
|
"svg",
|
|
6319
6480
|
{
|
|
6320
6481
|
width: 18,
|
|
@@ -6325,20 +6486,20 @@ function IconMinus() {
|
|
|
6325
6486
|
strokeWidth: 2.2,
|
|
6326
6487
|
strokeLinecap: "round",
|
|
6327
6488
|
"aria-hidden": "true",
|
|
6328
|
-
children: /* @__PURE__ */
|
|
6489
|
+
children: /* @__PURE__ */ jsx76("path", { d: "M5 12h14" })
|
|
6329
6490
|
}
|
|
6330
6491
|
);
|
|
6331
6492
|
}
|
|
6332
6493
|
function TeamBadge({ team, label }) {
|
|
6333
|
-
return /* @__PURE__ */
|
|
6334
|
-
/* @__PURE__ */
|
|
6335
|
-
/* @__PURE__ */
|
|
6336
|
-
/* @__PURE__ */
|
|
6494
|
+
return /* @__PURE__ */ jsxs64("div", { className: "ss-g-mp-team", children: [
|
|
6495
|
+
/* @__PURE__ */ jsx76(CrestShield, { name: team.name, size: 44 }),
|
|
6496
|
+
/* @__PURE__ */ jsx76("span", { className: "ss-g-mp-team-name", children: team.name }),
|
|
6497
|
+
/* @__PURE__ */ jsx76("span", { className: "ss-g-mp-team-side", children: label })
|
|
6337
6498
|
] });
|
|
6338
6499
|
}
|
|
6339
6500
|
function ScoreCard({ home, away, h, a, t, edit }) {
|
|
6340
|
-
const col = (side, team, value) => /* @__PURE__ */
|
|
6341
|
-
edit && /* @__PURE__ */
|
|
6501
|
+
const col = (side, team, value) => /* @__PURE__ */ jsxs64("div", { className: "ss-g-mp-col", children: [
|
|
6502
|
+
edit && /* @__PURE__ */ jsx76(
|
|
6342
6503
|
"button",
|
|
6343
6504
|
{
|
|
6344
6505
|
type: "button",
|
|
@@ -6346,11 +6507,11 @@ function ScoreCard({ home, away, h, a, t, edit }) {
|
|
|
6346
6507
|
"aria-label": t.goalsUp(team.name),
|
|
6347
6508
|
disabled: edit.disabled,
|
|
6348
6509
|
onClick: () => edit.onStep(side, 1),
|
|
6349
|
-
children: /* @__PURE__ */
|
|
6510
|
+
children: /* @__PURE__ */ jsx76(IconPlus, { size: 18 })
|
|
6350
6511
|
}
|
|
6351
6512
|
),
|
|
6352
|
-
/* @__PURE__ */
|
|
6353
|
-
edit && /* @__PURE__ */
|
|
6513
|
+
/* @__PURE__ */ jsx76("span", { className: "ss-g-mp-digit", "data-testid": "mp-digit", "data-active": edit ? String(edit.active === side) : "false", children: value }),
|
|
6514
|
+
edit && /* @__PURE__ */ jsx76(
|
|
6354
6515
|
"button",
|
|
6355
6516
|
{
|
|
6356
6517
|
type: "button",
|
|
@@ -6358,27 +6519,27 @@ function ScoreCard({ home, away, h, a, t, edit }) {
|
|
|
6358
6519
|
"aria-label": t.goalsDown(team.name),
|
|
6359
6520
|
disabled: edit.disabled || value <= 0,
|
|
6360
6521
|
onClick: () => edit.onStep(side, -1),
|
|
6361
|
-
children: /* @__PURE__ */
|
|
6522
|
+
children: /* @__PURE__ */ jsx76(IconMinus, {})
|
|
6362
6523
|
}
|
|
6363
6524
|
)
|
|
6364
6525
|
] });
|
|
6365
|
-
return /* @__PURE__ */
|
|
6366
|
-
/* @__PURE__ */
|
|
6367
|
-
/* @__PURE__ */
|
|
6526
|
+
return /* @__PURE__ */ jsxs64("div", { className: "ss-g-mp-card", children: [
|
|
6527
|
+
/* @__PURE__ */ jsx76(TeamBadge, { team: home, label: t.home }),
|
|
6528
|
+
/* @__PURE__ */ jsxs64("div", { className: "ss-g-mp-scores", children: [
|
|
6368
6529
|
col("home", home, h),
|
|
6369
|
-
/* @__PURE__ */
|
|
6530
|
+
/* @__PURE__ */ jsx76("span", { className: "ss-g-mp-dash", "aria-hidden": "true", children: "\u2013" }),
|
|
6370
6531
|
col("away", away, a)
|
|
6371
6532
|
] }),
|
|
6372
|
-
/* @__PURE__ */
|
|
6533
|
+
/* @__PURE__ */ jsx76(TeamBadge, { team: away, label: t.away })
|
|
6373
6534
|
] });
|
|
6374
6535
|
}
|
|
6375
6536
|
function OutcomeRow({ label, ok, detail, t }) {
|
|
6376
|
-
return /* @__PURE__ */
|
|
6377
|
-
/* @__PURE__ */
|
|
6378
|
-
/* @__PURE__ */
|
|
6379
|
-
ok ? /* @__PURE__ */
|
|
6380
|
-
/* @__PURE__ */
|
|
6381
|
-
detail ? /* @__PURE__ */
|
|
6537
|
+
return /* @__PURE__ */ jsxs64("li", { className: "ss-g-mp-row", "data-testid": "mp-row", "data-ok": String(ok), children: [
|
|
6538
|
+
/* @__PURE__ */ jsx76("span", { className: "ss-g-mp-row-k", children: label }),
|
|
6539
|
+
/* @__PURE__ */ jsxs64("span", { className: "ss-g-mp-row-v", children: [
|
|
6540
|
+
ok ? /* @__PURE__ */ jsx76(IconCheck, {}) : /* @__PURE__ */ jsx76(IconClose, { size: 14 }),
|
|
6541
|
+
/* @__PURE__ */ jsx76("span", { className: "ss-g-sr", children: ok ? t.correct : t.incorrect }),
|
|
6542
|
+
detail ? /* @__PURE__ */ jsx76("span", { className: "ss-g-mp-row-d", children: detail }) : null
|
|
6382
6543
|
] })
|
|
6383
6544
|
] });
|
|
6384
6545
|
}
|
|
@@ -6391,20 +6552,20 @@ function MatchdayPredictorGame({
|
|
|
6391
6552
|
onBack
|
|
6392
6553
|
}) {
|
|
6393
6554
|
const t = ui.games.predictor;
|
|
6394
|
-
const [homeScore, setHomeScore] =
|
|
6395
|
-
const [awayScore, setAwayScore] =
|
|
6396
|
-
const [firstScorerPlayerId, setFirstScorerPlayerId] =
|
|
6397
|
-
const [lastEdited, setLastEdited] =
|
|
6398
|
-
const [query, setQuery] =
|
|
6555
|
+
const [homeScore, setHomeScore] = useState32(0);
|
|
6556
|
+
const [awayScore, setAwayScore] = useState32(0);
|
|
6557
|
+
const [firstScorerPlayerId, setFirstScorerPlayerId] = useState32(null);
|
|
6558
|
+
const [lastEdited, setLastEdited] = useState32("home");
|
|
6559
|
+
const [query, setQuery] = useState32("");
|
|
6399
6560
|
const searchId = useId6();
|
|
6400
6561
|
const clientState = parseClientState7(result?.clientStateJson);
|
|
6401
6562
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
6402
|
-
const header = /* @__PURE__ */
|
|
6563
|
+
const header = /* @__PURE__ */ jsx76(
|
|
6403
6564
|
GameHeader,
|
|
6404
6565
|
{
|
|
6405
6566
|
title: gameTitle({ gameId: "matchday-predictor" }, ui.games.titles),
|
|
6406
6567
|
eyebrow: config ? t.eyebrow(config.homeTeam.name, config.awayTeam.name) : void 0,
|
|
6407
|
-
right: config ? /* @__PURE__ */
|
|
6568
|
+
right: config ? /* @__PURE__ */ jsx76(Chip, { icon: /* @__PURE__ */ jsx76(IconLock, {}), children: ui.games.formatDayTime(config.kickoffUtc) }) : void 0,
|
|
6408
6569
|
onBack,
|
|
6409
6570
|
backLabel: ui.back
|
|
6410
6571
|
}
|
|
@@ -6412,10 +6573,10 @@ function MatchdayPredictorGame({
|
|
|
6412
6573
|
if (alreadyPlayed && clientState) {
|
|
6413
6574
|
if (!clientState.graded) {
|
|
6414
6575
|
const scorer = config?.scorerPool.find((p) => p.playerId === clientState.predictedFirstScorerPlayerId) ?? null;
|
|
6415
|
-
return /* @__PURE__ */
|
|
6576
|
+
return /* @__PURE__ */ jsxs64("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
|
|
6416
6577
|
header,
|
|
6417
|
-
/* @__PURE__ */
|
|
6418
|
-
config && /* @__PURE__ */
|
|
6578
|
+
/* @__PURE__ */ jsxs64("div", { className: "ss-g-body", children: [
|
|
6579
|
+
config && /* @__PURE__ */ jsx76(
|
|
6419
6580
|
ScoreCard,
|
|
6420
6581
|
{
|
|
6421
6582
|
home: config.homeTeam,
|
|
@@ -6425,7 +6586,7 @@ function MatchdayPredictorGame({
|
|
|
6425
6586
|
t
|
|
6426
6587
|
}
|
|
6427
6588
|
),
|
|
6428
|
-
/* @__PURE__ */
|
|
6589
|
+
/* @__PURE__ */ jsx76(
|
|
6429
6590
|
ResultCard,
|
|
6430
6591
|
{
|
|
6431
6592
|
tone: "neutral",
|
|
@@ -6442,28 +6603,28 @@ function MatchdayPredictorGame({
|
|
|
6442
6603
|
}
|
|
6443
6604
|
)
|
|
6444
6605
|
] }),
|
|
6445
|
-
/* @__PURE__ */
|
|
6606
|
+
/* @__PURE__ */ jsx76(FooterBar, { children: /* @__PURE__ */ jsx76("p", { className: "ss-g-mp-fun", children: t.forFun }) })
|
|
6446
6607
|
] });
|
|
6447
6608
|
}
|
|
6448
6609
|
const r = clientState.result;
|
|
6449
|
-
return /* @__PURE__ */
|
|
6610
|
+
return /* @__PURE__ */ jsxs64("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
|
|
6450
6611
|
header,
|
|
6451
|
-
/* @__PURE__ */
|
|
6452
|
-
config && /* @__PURE__ */
|
|
6453
|
-
/* @__PURE__ */
|
|
6454
|
-
/* @__PURE__ */
|
|
6455
|
-
/* @__PURE__ */
|
|
6456
|
-
/* @__PURE__ */
|
|
6457
|
-
!clientState.firstScorerVoid && /* @__PURE__ */
|
|
6612
|
+
/* @__PURE__ */ jsxs64("div", { className: "ss-g-body", children: [
|
|
6613
|
+
config && /* @__PURE__ */ jsx76(ScoreCard, { home: config.homeTeam, away: config.awayTeam, h: r.homeScore, a: r.awayScore, t }),
|
|
6614
|
+
/* @__PURE__ */ jsx76(ResultCard, { tone: "neutral", title: t.fullTime(r.homeScore, r.awayScore), onBack, ui }),
|
|
6615
|
+
/* @__PURE__ */ jsxs64("ul", { className: "ss-g-mp-rows", children: [
|
|
6616
|
+
/* @__PURE__ */ jsx76(OutcomeRow, { label: t.exactScore, ok: clientState.exactScoreCorrect, t }),
|
|
6617
|
+
/* @__PURE__ */ jsx76(OutcomeRow, { label: t.outcome, ok: clientState.outcomeCorrect, t }),
|
|
6618
|
+
!clientState.firstScorerVoid && /* @__PURE__ */ jsx76(OutcomeRow, { label: t.firstScorerRow, ok: clientState.firstScorerCorrect, detail: r.firstScorerName, t })
|
|
6458
6619
|
] })
|
|
6459
6620
|
] }),
|
|
6460
|
-
/* @__PURE__ */
|
|
6621
|
+
/* @__PURE__ */ jsx76(FooterBar, { children: /* @__PURE__ */ jsx76("p", { className: "ss-g-mp-fun", children: t.forFun }) })
|
|
6461
6622
|
] });
|
|
6462
6623
|
}
|
|
6463
6624
|
if (!config) {
|
|
6464
|
-
return /* @__PURE__ */
|
|
6625
|
+
return /* @__PURE__ */ jsxs64("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
|
|
6465
6626
|
header,
|
|
6466
|
-
/* @__PURE__ */
|
|
6627
|
+
/* @__PURE__ */ jsx76("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
6467
6628
|
] });
|
|
6468
6629
|
}
|
|
6469
6630
|
const locked = isLocked(config.kickoffUtc);
|
|
@@ -6487,10 +6648,10 @@ function MatchdayPredictorGame({
|
|
|
6487
6648
|
const showSearch = pool.length > SCORER_SEARCH_THRESHOLD;
|
|
6488
6649
|
const q = query.trim().toLowerCase();
|
|
6489
6650
|
const visible = showSearch && q ? pool.filter((p) => p.playerName.toLowerCase().includes(q)) : pool;
|
|
6490
|
-
return /* @__PURE__ */
|
|
6651
|
+
return /* @__PURE__ */ jsxs64("div", { className: "ss-g-screen", "data-testid": "game-screen-matchday-predictor", children: [
|
|
6491
6652
|
header,
|
|
6492
|
-
/* @__PURE__ */
|
|
6493
|
-
/* @__PURE__ */
|
|
6653
|
+
/* @__PURE__ */ jsxs64("div", { className: "ss-g-body", children: [
|
|
6654
|
+
/* @__PURE__ */ jsx76(
|
|
6494
6655
|
ScoreCard,
|
|
6495
6656
|
{
|
|
6496
6657
|
home: config.homeTeam,
|
|
@@ -6501,12 +6662,12 @@ function MatchdayPredictorGame({
|
|
|
6501
6662
|
edit: { disabled, active: lastEdited, onStep: step }
|
|
6502
6663
|
}
|
|
6503
6664
|
),
|
|
6504
|
-
pool.length > 0 && /* @__PURE__ */
|
|
6505
|
-
/* @__PURE__ */
|
|
6506
|
-
/* @__PURE__ */
|
|
6507
|
-
/* @__PURE__ */
|
|
6665
|
+
pool.length > 0 && /* @__PURE__ */ jsxs64("section", { className: "ss-g-mp-scorer", children: [
|
|
6666
|
+
/* @__PURE__ */ jsxs64("div", { className: "ss-g-mp-sec-head", children: [
|
|
6667
|
+
/* @__PURE__ */ jsx76("h3", { children: t.firstScorer }),
|
|
6668
|
+
/* @__PURE__ */ jsx76("span", { children: t.optional })
|
|
6508
6669
|
] }),
|
|
6509
|
-
showSearch && /* @__PURE__ */
|
|
6670
|
+
showSearch && /* @__PURE__ */ jsx76(
|
|
6510
6671
|
SearchField,
|
|
6511
6672
|
{
|
|
6512
6673
|
id: searchId,
|
|
@@ -6518,9 +6679,9 @@ function MatchdayPredictorGame({
|
|
|
6518
6679
|
disabled
|
|
6519
6680
|
}
|
|
6520
6681
|
),
|
|
6521
|
-
/* @__PURE__ */
|
|
6682
|
+
/* @__PURE__ */ jsx76("div", { className: "ss-g-mp-grid", children: visible.map((p) => {
|
|
6522
6683
|
const selected = firstScorerPlayerId === p.playerId;
|
|
6523
|
-
return /* @__PURE__ */
|
|
6684
|
+
return /* @__PURE__ */ jsxs64(
|
|
6524
6685
|
"button",
|
|
6525
6686
|
{
|
|
6526
6687
|
type: "button",
|
|
@@ -6530,15 +6691,15 @@ function MatchdayPredictorGame({
|
|
|
6530
6691
|
disabled,
|
|
6531
6692
|
onClick: () => setFirstScorerPlayerId((id) => id === p.playerId ? null : p.playerId),
|
|
6532
6693
|
children: [
|
|
6533
|
-
selected && /* @__PURE__ */
|
|
6534
|
-
/* @__PURE__ */
|
|
6535
|
-
/* @__PURE__ */
|
|
6694
|
+
selected && /* @__PURE__ */ jsx76("span", { className: "ss-g-mp-pcheck", children: /* @__PURE__ */ jsx76(IconCheck, { size: 12 }) }),
|
|
6695
|
+
/* @__PURE__ */ jsx76(Silhouette, { size: 52, variant: selected ? "selected" : "default" }),
|
|
6696
|
+
/* @__PURE__ */ jsx76("span", { className: "ss-g-mp-pname", children: splitName(p.playerName).last })
|
|
6536
6697
|
]
|
|
6537
6698
|
},
|
|
6538
6699
|
p.playerId
|
|
6539
6700
|
);
|
|
6540
6701
|
}) }),
|
|
6541
|
-
/* @__PURE__ */
|
|
6702
|
+
/* @__PURE__ */ jsxs64(
|
|
6542
6703
|
"button",
|
|
6543
6704
|
{
|
|
6544
6705
|
type: "button",
|
|
@@ -6547,24 +6708,24 @@ function MatchdayPredictorGame({
|
|
|
6547
6708
|
disabled,
|
|
6548
6709
|
onClick: () => setFirstScorerPlayerId(null),
|
|
6549
6710
|
children: [
|
|
6550
|
-
/* @__PURE__ */
|
|
6711
|
+
/* @__PURE__ */ jsx76("span", { className: "ss-g-mp-radio", "aria-hidden": "true" }),
|
|
6551
6712
|
t.noScorer
|
|
6552
6713
|
]
|
|
6553
6714
|
}
|
|
6554
6715
|
)
|
|
6555
6716
|
] }),
|
|
6556
|
-
locked && /* @__PURE__ */
|
|
6717
|
+
locked && /* @__PURE__ */ jsx76("p", { className: "ss-g-mp-closed", children: t.closed })
|
|
6557
6718
|
] }),
|
|
6558
|
-
/* @__PURE__ */
|
|
6559
|
-
/* @__PURE__ */
|
|
6560
|
-
/* @__PURE__ */
|
|
6719
|
+
/* @__PURE__ */ jsxs64(FooterBar, { children: [
|
|
6720
|
+
/* @__PURE__ */ jsx76(GameButton, { variant: "primary", block: true, disabled, onClick: handleSubmit, children: submitting ? t.saving : t.save }),
|
|
6721
|
+
/* @__PURE__ */ jsx76("p", { className: "ss-g-mp-fun", children: t.forFun })
|
|
6561
6722
|
] })
|
|
6562
6723
|
] });
|
|
6563
6724
|
}
|
|
6564
6725
|
|
|
6565
6726
|
// src/components/games/StartingXiGame.tsx
|
|
6566
|
-
import { useId as useId7, useState as
|
|
6567
|
-
import { Fragment as Fragment18, jsx as
|
|
6727
|
+
import { useId as useId7, useState as useState33 } from "react";
|
|
6728
|
+
import { Fragment as Fragment18, jsx as jsx77, jsxs as jsxs65 } from "react/jsx-runtime";
|
|
6568
6729
|
var POINTS_PER_STARTER = 8;
|
|
6569
6730
|
var XI_SIZE = 11;
|
|
6570
6731
|
var DEFAULT_FORMATION = "4-3-3";
|
|
@@ -6607,26 +6768,26 @@ function StartingXiGame({
|
|
|
6607
6768
|
lockAtUtc
|
|
6608
6769
|
}) {
|
|
6609
6770
|
const t = ui.games.startingXi;
|
|
6610
|
-
const [slotPlayers, setSlotPlayers] =
|
|
6611
|
-
const [active, setActive] =
|
|
6612
|
-
const [query, setQuery] =
|
|
6771
|
+
const [slotPlayers, setSlotPlayers] = useState33(() => Array(XI_SIZE).fill(null));
|
|
6772
|
+
const [active, setActive] = useState33(0);
|
|
6773
|
+
const [query, setQuery] = useState33("");
|
|
6613
6774
|
const searchId = useId7();
|
|
6614
6775
|
const clientState = parseClientState8(result?.clientStateJson);
|
|
6615
6776
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
6616
|
-
const header = /* @__PURE__ */
|
|
6777
|
+
const header = /* @__PURE__ */ jsx77(
|
|
6617
6778
|
GameHeader,
|
|
6618
6779
|
{
|
|
6619
6780
|
title: gameTitle({ gameId: "starting-xi" }, ui.games.titles),
|
|
6620
6781
|
eyebrow: t.eyebrow,
|
|
6621
|
-
right: /* @__PURE__ */
|
|
6782
|
+
right: /* @__PURE__ */ jsx77(Chip, { variant: "accent", children: t.perStarter(POINTS_PER_STARTER) }),
|
|
6622
6783
|
onBack,
|
|
6623
6784
|
backLabel: ui.back
|
|
6624
6785
|
}
|
|
6625
6786
|
);
|
|
6626
6787
|
function statusScreen(title, score) {
|
|
6627
|
-
return /* @__PURE__ */
|
|
6788
|
+
return /* @__PURE__ */ jsxs65("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
|
|
6628
6789
|
header,
|
|
6629
|
-
/* @__PURE__ */
|
|
6790
|
+
/* @__PURE__ */ jsx77("div", { className: "ss-g-body", children: /* @__PURE__ */ jsx77(ResultCard, { tone: "neutral", title, score, onBack, ui }) })
|
|
6630
6791
|
] });
|
|
6631
6792
|
}
|
|
6632
6793
|
if (alreadyPlayed) {
|
|
@@ -6635,9 +6796,9 @@ function StartingXiGame({
|
|
|
6635
6796
|
if (clientState.status === "graded") return statusScreen(t.gradedLine(clientState.correctCount), clientState.score);
|
|
6636
6797
|
}
|
|
6637
6798
|
if (!config) {
|
|
6638
|
-
return /* @__PURE__ */
|
|
6799
|
+
return /* @__PURE__ */ jsxs65("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
|
|
6639
6800
|
header,
|
|
6640
|
-
/* @__PURE__ */
|
|
6801
|
+
/* @__PURE__ */ jsx77("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
6641
6802
|
] });
|
|
6642
6803
|
}
|
|
6643
6804
|
const { formation, slots } = formationSlots(config.formation);
|
|
@@ -6672,27 +6833,27 @@ function StartingXiGame({
|
|
|
6672
6833
|
onSubmit(JSON.stringify({ predictedPlayerIds: slotPlayers }));
|
|
6673
6834
|
}
|
|
6674
6835
|
const segments = slotPlayers.map((p) => p !== null ? "current" : "todo");
|
|
6675
|
-
return /* @__PURE__ */
|
|
6836
|
+
return /* @__PURE__ */ jsxs65("div", { className: "ss-g-screen", "data-testid": "game-screen-starting-xi", children: [
|
|
6676
6837
|
header,
|
|
6677
|
-
/* @__PURE__ */
|
|
6838
|
+
/* @__PURE__ */ jsx77(
|
|
6678
6839
|
SegmentProgress,
|
|
6679
6840
|
{
|
|
6680
6841
|
segments,
|
|
6681
6842
|
ariaLabel: t.picked(pickedCount),
|
|
6682
6843
|
leftLabel: t.picked(pickedCount),
|
|
6683
6844
|
rightLabel: t.toGo(XI_SIZE - pickedCount),
|
|
6684
|
-
right: /* @__PURE__ */
|
|
6845
|
+
right: /* @__PURE__ */ jsx77(Chip, { children: formation })
|
|
6685
6846
|
}
|
|
6686
6847
|
),
|
|
6687
|
-
/* @__PURE__ */
|
|
6688
|
-
/* @__PURE__ */
|
|
6689
|
-
/* @__PURE__ */
|
|
6848
|
+
/* @__PURE__ */ jsxs65("div", { className: "ss-g-body", children: [
|
|
6849
|
+
/* @__PURE__ */ jsxs65("div", { className: "ss-g-xi-pitch", children: [
|
|
6850
|
+
/* @__PURE__ */ jsx77(PitchSvg, { variant: "half" }),
|
|
6690
6851
|
slots.map((s) => {
|
|
6691
6852
|
const playerId = slotPlayers[s.index] ?? null;
|
|
6692
6853
|
const player = playerId !== null ? byId.get(playerId) ?? null : null;
|
|
6693
6854
|
const name = player?.playerName ?? "";
|
|
6694
6855
|
const state = player ? "filled" : active === s.index ? "active" : "empty";
|
|
6695
|
-
return /* @__PURE__ */
|
|
6856
|
+
return /* @__PURE__ */ jsxs65(
|
|
6696
6857
|
"button",
|
|
6697
6858
|
{
|
|
6698
6859
|
type: "button",
|
|
@@ -6704,21 +6865,21 @@ function StartingXiGame({
|
|
|
6704
6865
|
disabled: submitting,
|
|
6705
6866
|
onClick: () => tapSlot(s.index),
|
|
6706
6867
|
children: [
|
|
6707
|
-
/* @__PURE__ */
|
|
6708
|
-
/* @__PURE__ */
|
|
6868
|
+
/* @__PURE__ */ jsx77("span", { className: "ss-g-xi-ring", "aria-hidden": "true", children: player ? player.jerseyNumber ?? "" : /* @__PURE__ */ jsx77(IconPlus, { size: 18 }) }),
|
|
6869
|
+
/* @__PURE__ */ jsx77("span", { className: "ss-g-xi-tag", "aria-hidden": "true", children: player ? splitName(name).last : s.label })
|
|
6709
6870
|
]
|
|
6710
6871
|
},
|
|
6711
6872
|
s.index
|
|
6712
6873
|
);
|
|
6713
6874
|
})
|
|
6714
6875
|
] }),
|
|
6715
|
-
/* @__PURE__ */
|
|
6716
|
-
/* @__PURE__ */
|
|
6717
|
-
/* @__PURE__ */
|
|
6718
|
-
/* @__PURE__ */
|
|
6719
|
-
] }) : /* @__PURE__ */
|
|
6720
|
-
activeSlot && /* @__PURE__ */
|
|
6721
|
-
/* @__PURE__ */
|
|
6876
|
+
/* @__PURE__ */ jsxs65("div", { className: "ss-g-xi-picker", children: [
|
|
6877
|
+
/* @__PURE__ */ jsx77("div", { className: "ss-g-xi-picker-head", children: activeSlot ? /* @__PURE__ */ jsxs65(Fragment18, { children: [
|
|
6878
|
+
/* @__PURE__ */ jsx77(Chip, { variant: "badge", children: activeSlot.label }),
|
|
6879
|
+
/* @__PURE__ */ jsx77("strong", { children: t.pickFor(activeSlot.label) })
|
|
6880
|
+
] }) : /* @__PURE__ */ jsx77("strong", { children: t.allPicked }) }),
|
|
6881
|
+
activeSlot && /* @__PURE__ */ jsxs65(Fragment18, { children: [
|
|
6882
|
+
/* @__PURE__ */ jsx77(
|
|
6722
6883
|
SearchField,
|
|
6723
6884
|
{
|
|
6724
6885
|
id: searchId,
|
|
@@ -6730,18 +6891,18 @@ function StartingXiGame({
|
|
|
6730
6891
|
disabled: submitting
|
|
6731
6892
|
}
|
|
6732
6893
|
),
|
|
6733
|
-
/* @__PURE__ */
|
|
6734
|
-
/* @__PURE__ */
|
|
6735
|
-
/* @__PURE__ */
|
|
6736
|
-
/* @__PURE__ */
|
|
6894
|
+
/* @__PURE__ */ jsx77("ul", { className: "ss-g-xi-list", children: available.map((p) => /* @__PURE__ */ jsx77("li", { children: /* @__PURE__ */ jsxs65("button", { type: "button", className: "ss-g-xi-opt", disabled: submitting, onClick: () => pick(p.playerId), children: [
|
|
6895
|
+
/* @__PURE__ */ jsx77("span", { className: "ss-g-xi-opt-no", "aria-hidden": "true", children: p.jerseyNumber ?? "" }),
|
|
6896
|
+
/* @__PURE__ */ jsx77("span", { className: "ss-g-xi-opt-name", children: p.playerName }),
|
|
6897
|
+
/* @__PURE__ */ jsx77("span", { className: "ss-g-xi-opt-pos", children: p.positionName })
|
|
6737
6898
|
] }) }, p.playerId)) })
|
|
6738
6899
|
] })
|
|
6739
6900
|
] })
|
|
6740
6901
|
] }),
|
|
6741
|
-
/* @__PURE__ */
|
|
6742
|
-
/* @__PURE__ */
|
|
6743
|
-
/* @__PURE__ */
|
|
6744
|
-
/* @__PURE__ */
|
|
6902
|
+
/* @__PURE__ */ jsxs65(FooterBar, { children: [
|
|
6903
|
+
/* @__PURE__ */ jsx77(GameButton, { variant: "primary", block: true, disabled: !canSubmit, onClick: handleSubmit, children: submitting ? t.submitting : t.submit }),
|
|
6904
|
+
/* @__PURE__ */ jsxs65("p", { className: "ss-g-xi-lock", children: [
|
|
6905
|
+
/* @__PURE__ */ jsx77(IconLock, {}),
|
|
6745
6906
|
lockAtUtc ? t.locksAt(ui.games.formatDayTime(lockAtUtc)) : t.locksSoon
|
|
6746
6907
|
] })
|
|
6747
6908
|
] })
|
|
@@ -6749,8 +6910,8 @@ function StartingXiGame({
|
|
|
6749
6910
|
}
|
|
6750
6911
|
|
|
6751
6912
|
// src/components/games/StatLadderGame.tsx
|
|
6752
|
-
import { useId as useId8, useState as
|
|
6753
|
-
import { jsx as
|
|
6913
|
+
import { useId as useId8, useState as useState34 } from "react";
|
|
6914
|
+
import { jsx as jsx78, jsxs as jsxs66 } from "react/jsx-runtime";
|
|
6754
6915
|
function ladderClue(ladder) {
|
|
6755
6916
|
const mystery = ladder.find((r) => r.rank === 2);
|
|
6756
6917
|
if (!mystery) return null;
|
|
@@ -6772,9 +6933,9 @@ function parseClientState9(json) {
|
|
|
6772
6933
|
}
|
|
6773
6934
|
function NameStack({ name }) {
|
|
6774
6935
|
const { first, last } = splitName(name);
|
|
6775
|
-
return /* @__PURE__ */
|
|
6776
|
-
first && /* @__PURE__ */
|
|
6777
|
-
/* @__PURE__ */
|
|
6936
|
+
return /* @__PURE__ */ jsxs66("span", { className: "ss-g-sl-name", children: [
|
|
6937
|
+
first && /* @__PURE__ */ jsx78("small", { children: `${first[0]}.` }),
|
|
6938
|
+
/* @__PURE__ */ jsx78("b", { children: last })
|
|
6778
6939
|
] });
|
|
6779
6940
|
}
|
|
6780
6941
|
function StatLadderGame({
|
|
@@ -6786,16 +6947,16 @@ function StatLadderGame({
|
|
|
6786
6947
|
onBack
|
|
6787
6948
|
}) {
|
|
6788
6949
|
const t = ui.games.statLadder;
|
|
6789
|
-
const [query, setQuery] =
|
|
6790
|
-
const [selectedId, setSelectedId] =
|
|
6950
|
+
const [query, setQuery] = useState34("");
|
|
6951
|
+
const [selectedId, setSelectedId] = useState34(null);
|
|
6791
6952
|
const searchId = useId8();
|
|
6792
6953
|
const clientState = parseClientState9(result?.clientStateJson);
|
|
6793
6954
|
const revealed = clientState != null;
|
|
6794
|
-
const header = /* @__PURE__ */
|
|
6955
|
+
const header = /* @__PURE__ */ jsx78(GameHeader, { title: gameTitle({ gameId: "stat-ladder" }, ui.games.titles), eyebrow: t.eyebrow, onBack, backLabel: ui.back });
|
|
6795
6956
|
if (!config) {
|
|
6796
|
-
return /* @__PURE__ */
|
|
6957
|
+
return /* @__PURE__ */ jsxs66("div", { className: "ss-g-screen", "data-testid": "game-screen-stat-ladder", children: [
|
|
6797
6958
|
header,
|
|
6798
|
-
/* @__PURE__ */
|
|
6959
|
+
/* @__PURE__ */ jsx78("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
6799
6960
|
] });
|
|
6800
6961
|
}
|
|
6801
6962
|
const question = t.question(config.statLabel);
|
|
@@ -6807,44 +6968,44 @@ function StatLadderGame({
|
|
|
6807
6968
|
if (selectedId === null || submitting || revealed) return;
|
|
6808
6969
|
onSubmit(JSON.stringify({ guessedPlayerId: selectedId }));
|
|
6809
6970
|
}
|
|
6810
|
-
return /* @__PURE__ */
|
|
6971
|
+
return /* @__PURE__ */ jsxs66("div", { className: "ss-g-screen", "data-testid": "game-screen-stat-ladder", children: [
|
|
6811
6972
|
header,
|
|
6812
|
-
/* @__PURE__ */
|
|
6813
|
-
/* @__PURE__ */
|
|
6814
|
-
/* @__PURE__ */
|
|
6815
|
-
/* @__PURE__ */
|
|
6973
|
+
/* @__PURE__ */ jsxs66("div", { className: "ss-g-body", children: [
|
|
6974
|
+
/* @__PURE__ */ jsxs66("div", { className: "ss-g-sl-prompt", children: [
|
|
6975
|
+
/* @__PURE__ */ jsx78(Chip, { variant: "accent", icon: /* @__PURE__ */ jsx78(IconShield, { size: 14 }), className: "ss-g-sl-stat", children: config.statLabel }),
|
|
6976
|
+
/* @__PURE__ */ jsxs66("h3", { className: "ss-g-sl-q", children: [
|
|
6816
6977
|
question.pre,
|
|
6817
|
-
/* @__PURE__ */
|
|
6978
|
+
/* @__PURE__ */ jsx78("em", { children: question.emph }),
|
|
6818
6979
|
question.post
|
|
6819
6980
|
] })
|
|
6820
6981
|
] }),
|
|
6821
|
-
/* @__PURE__ */
|
|
6822
|
-
(rung) => rung.rank === 2 ? /* @__PURE__ */
|
|
6982
|
+
/* @__PURE__ */ jsx78("ol", { className: "ss-g-sl-rungs", children: rungs.map(
|
|
6983
|
+
(rung) => rung.rank === 2 ? /* @__PURE__ */ jsxs66(
|
|
6823
6984
|
"li",
|
|
6824
6985
|
{
|
|
6825
6986
|
className: "ss-g-sl-rung ss-g-sl-rung--mystery",
|
|
6826
6987
|
"data-testid": "sl-mystery-rung",
|
|
6827
6988
|
"data-result": revealed ? clientState.isCorrect ? "correct" : "wrong" : void 0,
|
|
6828
6989
|
children: [
|
|
6829
|
-
/* @__PURE__ */
|
|
6830
|
-
revealed ? /* @__PURE__ */
|
|
6831
|
-
revealed ? /* @__PURE__ */
|
|
6832
|
-
/* @__PURE__ */
|
|
6990
|
+
/* @__PURE__ */ jsx78("span", { className: "ss-g-sl-rank", children: "2" }),
|
|
6991
|
+
revealed ? /* @__PURE__ */ jsx78(PlayerAvatar, { name: clientState.revealedRank2.playerName, className: "ss-g-sl-av" }) : /* @__PURE__ */ jsx78(Silhouette, { size: 52, variant: "mystery" }),
|
|
6992
|
+
revealed ? /* @__PURE__ */ jsx78(NameStack, { name: clientState.revealedRank2.playerName }) : /* @__PURE__ */ jsx78("span", { className: "ss-g-sl-who", children: t.whoSecond }),
|
|
6993
|
+
/* @__PURE__ */ jsx78("span", { className: "ss-g-sl-val ss-g-sl-val--mystery", children: rung.statValue })
|
|
6833
6994
|
]
|
|
6834
6995
|
},
|
|
6835
6996
|
rung.rank
|
|
6836
|
-
) : /* @__PURE__ */
|
|
6837
|
-
/* @__PURE__ */
|
|
6838
|
-
/* @__PURE__ */
|
|
6839
|
-
/* @__PURE__ */
|
|
6840
|
-
/* @__PURE__ */
|
|
6997
|
+
) : /* @__PURE__ */ jsxs66("li", { className: "ss-g-sl-rung", children: [
|
|
6998
|
+
/* @__PURE__ */ jsx78("span", { className: "ss-g-sl-rank", children: rung.rank }),
|
|
6999
|
+
/* @__PURE__ */ jsx78(PlayerAvatar, { name: rung.playerName ?? "?", className: "ss-g-sl-av" }),
|
|
7000
|
+
/* @__PURE__ */ jsx78(NameStack, { name: rung.playerName ?? "?" }),
|
|
7001
|
+
/* @__PURE__ */ jsx78("span", { className: "ss-g-sl-val", children: rung.statValue })
|
|
6841
7002
|
] }, rung.rank)
|
|
6842
7003
|
) }),
|
|
6843
|
-
clue && /* @__PURE__ */
|
|
6844
|
-
/* @__PURE__ */
|
|
6845
|
-
/* @__PURE__ */
|
|
7004
|
+
clue && /* @__PURE__ */ jsxs66("p", { className: "ss-g-sl-clue", children: [
|
|
7005
|
+
/* @__PURE__ */ jsx78(IconBulb, {}),
|
|
7006
|
+
/* @__PURE__ */ jsx78("span", { children: t.clue(clue, config.statLabel) })
|
|
6846
7007
|
] }),
|
|
6847
|
-
!revealed && /* @__PURE__ */
|
|
7008
|
+
!revealed && /* @__PURE__ */ jsx78("ul", { className: "ss-g-sl-pool", children: pool.map((p) => /* @__PURE__ */ jsx78("li", { children: /* @__PURE__ */ jsxs66(
|
|
6848
7009
|
"button",
|
|
6849
7010
|
{
|
|
6850
7011
|
type: "button",
|
|
@@ -6857,13 +7018,13 @@ function StatLadderGame({
|
|
|
6857
7018
|
setQuery(p.playerName);
|
|
6858
7019
|
},
|
|
6859
7020
|
children: [
|
|
6860
|
-
/* @__PURE__ */
|
|
6861
|
-
/* @__PURE__ */
|
|
6862
|
-
selectedId === p.playerId && /* @__PURE__ */
|
|
7021
|
+
/* @__PURE__ */ jsx78(PlayerAvatar, { name: p.playerName, className: "ss-g-sl-opt-av" }),
|
|
7022
|
+
/* @__PURE__ */ jsx78("span", { className: "ss-g-sl-opt-name", children: p.playerName }),
|
|
7023
|
+
selectedId === p.playerId && /* @__PURE__ */ jsx78(IconCheck, {})
|
|
6863
7024
|
]
|
|
6864
7025
|
}
|
|
6865
7026
|
) }, p.playerId)) }),
|
|
6866
|
-
revealed && /* @__PURE__ */
|
|
7027
|
+
revealed && /* @__PURE__ */ jsx78(
|
|
6867
7028
|
ResultCard,
|
|
6868
7029
|
{
|
|
6869
7030
|
tone: clientState.isCorrect ? "win" : "lose",
|
|
@@ -6874,8 +7035,8 @@ function StatLadderGame({
|
|
|
6874
7035
|
}
|
|
6875
7036
|
)
|
|
6876
7037
|
] }),
|
|
6877
|
-
!revealed && /* @__PURE__ */
|
|
6878
|
-
/* @__PURE__ */
|
|
7038
|
+
!revealed && /* @__PURE__ */ jsx78(FooterBar, { children: /* @__PURE__ */ jsxs66("div", { className: "ss-g-sl-guess", children: [
|
|
7039
|
+
/* @__PURE__ */ jsx78(
|
|
6879
7040
|
SearchField,
|
|
6880
7041
|
{
|
|
6881
7042
|
id: searchId,
|
|
@@ -6890,13 +7051,13 @@ function StatLadderGame({
|
|
|
6890
7051
|
disabled: submitting
|
|
6891
7052
|
}
|
|
6892
7053
|
),
|
|
6893
|
-
/* @__PURE__ */
|
|
7054
|
+
/* @__PURE__ */ jsx78(GameButton, { variant: "primary", disabled: selectedId === null || submitting, onClick: guess, children: t.guess })
|
|
6894
7055
|
] }) })
|
|
6895
7056
|
] });
|
|
6896
7057
|
}
|
|
6897
7058
|
|
|
6898
7059
|
// src/components/games/FanMotmGame.tsx
|
|
6899
|
-
import { jsx as
|
|
7060
|
+
import { jsx as jsx79, jsxs as jsxs67 } from "react/jsx-runtime";
|
|
6900
7061
|
function parseClientState10(json) {
|
|
6901
7062
|
if (!json) return null;
|
|
6902
7063
|
try {
|
|
@@ -6917,20 +7078,20 @@ function FanMotmGame({
|
|
|
6917
7078
|
const clientState = parseClientState10(result?.clientStateJson);
|
|
6918
7079
|
const alreadyVoted = result?.alreadyPlayed === true;
|
|
6919
7080
|
const pickedId = clientState?.pickedPlayerId ?? null;
|
|
6920
|
-
const header = /* @__PURE__ */
|
|
7081
|
+
const header = /* @__PURE__ */ jsx79(
|
|
6921
7082
|
GameHeader,
|
|
6922
7083
|
{
|
|
6923
7084
|
title: t.title,
|
|
6924
7085
|
eyebrow: t.eyebrow,
|
|
6925
|
-
right: alreadyVoted ? /* @__PURE__ */
|
|
7086
|
+
right: alreadyVoted ? /* @__PURE__ */ jsx79(Chip, { variant: "success", icon: /* @__PURE__ */ jsx79(IconCheck, {}), children: t.voted }) : void 0,
|
|
6926
7087
|
onBack,
|
|
6927
7088
|
backLabel: ui.back
|
|
6928
7089
|
}
|
|
6929
7090
|
);
|
|
6930
7091
|
if (!config) {
|
|
6931
|
-
return /* @__PURE__ */
|
|
7092
|
+
return /* @__PURE__ */ jsxs67("div", { className: "ss-g-screen", "data-testid": "game-screen-fan-motm", children: [
|
|
6932
7093
|
header,
|
|
6933
|
-
/* @__PURE__ */
|
|
7094
|
+
/* @__PURE__ */ jsx79("div", { className: "ss-g-body ss-g-loading", children: ui.games.loading })
|
|
6934
7095
|
] });
|
|
6935
7096
|
}
|
|
6936
7097
|
const picked = config.candidates.find((c) => c.playerId === pickedId) ?? null;
|
|
@@ -6938,12 +7099,12 @@ function FanMotmGame({
|
|
|
6938
7099
|
if (alreadyVoted || submitting) return;
|
|
6939
7100
|
onSubmit(JSON.stringify({ pickedPlayerId: candidateId }));
|
|
6940
7101
|
}
|
|
6941
|
-
return /* @__PURE__ */
|
|
7102
|
+
return /* @__PURE__ */ jsxs67("div", { className: "ss-g-screen", "data-testid": "game-screen-fan-motm", children: [
|
|
6942
7103
|
header,
|
|
6943
|
-
/* @__PURE__ */
|
|
6944
|
-
/* @__PURE__ */
|
|
7104
|
+
/* @__PURE__ */ jsxs67("div", { className: "ss-g-body", children: [
|
|
7105
|
+
/* @__PURE__ */ jsx79("ul", { className: "ss-g-motm-list", children: config.candidates.map((c) => {
|
|
6945
7106
|
const isVoted = alreadyVoted && pickedId === c.playerId;
|
|
6946
|
-
return /* @__PURE__ */
|
|
7107
|
+
return /* @__PURE__ */ jsx79("li", { children: /* @__PURE__ */ jsxs67(
|
|
6947
7108
|
"button",
|
|
6948
7109
|
{
|
|
6949
7110
|
type: "button",
|
|
@@ -6952,24 +7113,24 @@ function FanMotmGame({
|
|
|
6952
7113
|
disabled: alreadyVoted || submitting,
|
|
6953
7114
|
onClick: () => handleVote(c.playerId),
|
|
6954
7115
|
children: [
|
|
6955
|
-
/* @__PURE__ */
|
|
6956
|
-
/* @__PURE__ */
|
|
6957
|
-
isVoted && /* @__PURE__ */
|
|
7116
|
+
/* @__PURE__ */ jsx79(PlayerAvatar, { name: c.playerName, className: "ss-g-motm-av" }),
|
|
7117
|
+
/* @__PURE__ */ jsx79("span", { className: "ss-g-motm-name", children: c.playerName }),
|
|
7118
|
+
isVoted && /* @__PURE__ */ jsx79(Chip, { variant: "accent", className: "ss-g-motm-pill", children: t.yourVote })
|
|
6958
7119
|
]
|
|
6959
7120
|
}
|
|
6960
7121
|
) }, c.playerId);
|
|
6961
7122
|
}) }),
|
|
6962
|
-
alreadyVoted && picked && /* @__PURE__ */
|
|
7123
|
+
alreadyVoted && picked && /* @__PURE__ */ jsx79(ResultCard, { tone: "neutral", title: t.youVoted(picked.playerName), detail: t.thanks, onBack, ui })
|
|
6963
7124
|
] }),
|
|
6964
|
-
/* @__PURE__ */
|
|
6965
|
-
!alreadyVoted && /* @__PURE__ */
|
|
6966
|
-
/* @__PURE__ */
|
|
7125
|
+
/* @__PURE__ */ jsxs67(FooterBar, { children: [
|
|
7126
|
+
!alreadyVoted && /* @__PURE__ */ jsx79("p", { className: "ss-g-motm-foot", children: t.tapToVote }),
|
|
7127
|
+
/* @__PURE__ */ jsx79("p", { className: "ss-g-motm-fun", children: t.forFun })
|
|
6967
7128
|
] })
|
|
6968
7129
|
] });
|
|
6969
7130
|
}
|
|
6970
7131
|
|
|
6971
7132
|
// src/components/GameScreenHost.tsx
|
|
6972
|
-
import { jsx as
|
|
7133
|
+
import { jsx as jsx80 } from "react/jsx-runtime";
|
|
6973
7134
|
var FIXTURE_GAME_IDS = /* @__PURE__ */ new Set([
|
|
6974
7135
|
"matchday-predictor",
|
|
6975
7136
|
"starting-xi",
|
|
@@ -6993,8 +7154,8 @@ function GameScreenHost({
|
|
|
6993
7154
|
ui
|
|
6994
7155
|
}) {
|
|
6995
7156
|
const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
|
|
6996
|
-
const [configJson, setConfigJson] =
|
|
6997
|
-
|
|
7157
|
+
const [configJson, setConfigJson] = useState35(null);
|
|
7158
|
+
useEffect16(() => {
|
|
6998
7159
|
setConfigJson(null);
|
|
6999
7160
|
if (!conversation) return;
|
|
7000
7161
|
let cancelled = false;
|
|
@@ -7017,12 +7178,12 @@ function GameScreenHost({
|
|
|
7017
7178
|
fixtureId: fixtureId || void 0,
|
|
7018
7179
|
locale: ui.games.lang
|
|
7019
7180
|
});
|
|
7020
|
-
|
|
7181
|
+
useEffect16(() => {
|
|
7021
7182
|
if (conversation) hydrate();
|
|
7022
7183
|
}, [conversation, gameId]);
|
|
7023
|
-
const hydrateRef =
|
|
7184
|
+
const hydrateRef = useRef14(hydrate);
|
|
7024
7185
|
hydrateRef.current = hydrate;
|
|
7025
|
-
|
|
7186
|
+
useEffect16(() => {
|
|
7026
7187
|
if (!FIXTURE_GAME_IDS.has(gameId)) return;
|
|
7027
7188
|
if (rawStatus !== "pending") return;
|
|
7028
7189
|
const timerId = setInterval(() => {
|
|
@@ -7045,7 +7206,7 @@ function GameScreenHost({
|
|
|
7045
7206
|
function renderScreen() {
|
|
7046
7207
|
switch (gameId) {
|
|
7047
7208
|
case "mystery-tiger":
|
|
7048
|
-
return /* @__PURE__ */
|
|
7209
|
+
return /* @__PURE__ */ jsx80(
|
|
7049
7210
|
MysteryTigerGame,
|
|
7050
7211
|
{
|
|
7051
7212
|
...sharedProps,
|
|
@@ -7053,7 +7214,7 @@ function GameScreenHost({
|
|
|
7053
7214
|
}
|
|
7054
7215
|
);
|
|
7055
7216
|
case "higher-or-lower":
|
|
7056
|
-
return /* @__PURE__ */
|
|
7217
|
+
return /* @__PURE__ */ jsx80(
|
|
7057
7218
|
HigherOrLowerGame,
|
|
7058
7219
|
{
|
|
7059
7220
|
...sharedProps,
|
|
@@ -7061,7 +7222,7 @@ function GameScreenHost({
|
|
|
7061
7222
|
}
|
|
7062
7223
|
);
|
|
7063
7224
|
case "career-path":
|
|
7064
|
-
return /* @__PURE__ */
|
|
7225
|
+
return /* @__PURE__ */ jsx80(
|
|
7065
7226
|
CareerPathGame,
|
|
7066
7227
|
{
|
|
7067
7228
|
...sharedProps,
|
|
@@ -7070,7 +7231,7 @@ function GameScreenHost({
|
|
|
7070
7231
|
);
|
|
7071
7232
|
case "beat-the-grid": {
|
|
7072
7233
|
const btgConfig = safeParseConfig(configJson);
|
|
7073
|
-
return /* @__PURE__ */
|
|
7234
|
+
return /* @__PURE__ */ jsx80(
|
|
7074
7235
|
BeatTheGridGame,
|
|
7075
7236
|
{
|
|
7076
7237
|
...sharedProps,
|
|
@@ -7080,7 +7241,7 @@ function GameScreenHost({
|
|
|
7080
7241
|
);
|
|
7081
7242
|
}
|
|
7082
7243
|
case "guess-the-xi":
|
|
7083
|
-
return /* @__PURE__ */
|
|
7244
|
+
return /* @__PURE__ */ jsx80(
|
|
7084
7245
|
GuessTheXiGame,
|
|
7085
7246
|
{
|
|
7086
7247
|
...sharedProps,
|
|
@@ -7088,7 +7249,7 @@ function GameScreenHost({
|
|
|
7088
7249
|
}
|
|
7089
7250
|
);
|
|
7090
7251
|
case "daily-quiz":
|
|
7091
|
-
return /* @__PURE__ */
|
|
7252
|
+
return /* @__PURE__ */ jsx80(
|
|
7092
7253
|
DailyQuizGame,
|
|
7093
7254
|
{
|
|
7094
7255
|
...sharedProps,
|
|
@@ -7096,7 +7257,7 @@ function GameScreenHost({
|
|
|
7096
7257
|
}
|
|
7097
7258
|
);
|
|
7098
7259
|
case "matchday-predictor":
|
|
7099
|
-
return /* @__PURE__ */
|
|
7260
|
+
return /* @__PURE__ */ jsx80(
|
|
7100
7261
|
MatchdayPredictorGame,
|
|
7101
7262
|
{
|
|
7102
7263
|
...sharedProps,
|
|
@@ -7104,7 +7265,7 @@ function GameScreenHost({
|
|
|
7104
7265
|
}
|
|
7105
7266
|
);
|
|
7106
7267
|
case "starting-xi":
|
|
7107
|
-
return /* @__PURE__ */
|
|
7268
|
+
return /* @__PURE__ */ jsx80(
|
|
7108
7269
|
StartingXiGame,
|
|
7109
7270
|
{
|
|
7110
7271
|
...sharedProps,
|
|
@@ -7112,7 +7273,7 @@ function GameScreenHost({
|
|
|
7112
7273
|
}
|
|
7113
7274
|
);
|
|
7114
7275
|
case "stat-ladder":
|
|
7115
|
-
return /* @__PURE__ */
|
|
7276
|
+
return /* @__PURE__ */ jsx80(
|
|
7116
7277
|
StatLadderGame,
|
|
7117
7278
|
{
|
|
7118
7279
|
...sharedProps,
|
|
@@ -7120,7 +7281,7 @@ function GameScreenHost({
|
|
|
7120
7281
|
}
|
|
7121
7282
|
);
|
|
7122
7283
|
case "fan-motm":
|
|
7123
|
-
return /* @__PURE__ */
|
|
7284
|
+
return /* @__PURE__ */ jsx80(
|
|
7124
7285
|
FanMotmGame,
|
|
7125
7286
|
{
|
|
7126
7287
|
...sharedProps,
|
|
@@ -7128,10 +7289,10 @@ function GameScreenHost({
|
|
|
7128
7289
|
}
|
|
7129
7290
|
);
|
|
7130
7291
|
default:
|
|
7131
|
-
return /* @__PURE__ */
|
|
7292
|
+
return /* @__PURE__ */ jsx80("div", { className: "ss-g-screen", "data-testid": `game-screen-${gameId}`, children: /* @__PURE__ */ jsx80(GameHeader, { title: gameTitle({ gameId }, ui.games.titles), onBack, backLabel: ui.back }) });
|
|
7132
7293
|
}
|
|
7133
7294
|
}
|
|
7134
|
-
return /* @__PURE__ */
|
|
7295
|
+
return /* @__PURE__ */ jsx80("div", { className: "ss-w-gscreen", "data-testid": "gscreen", "data-lock-at": lockAtUtc ?? void 0, children: renderScreen() });
|
|
7135
7296
|
}
|
|
7136
7297
|
|
|
7137
7298
|
// src/components/games/ui/fonts.ts
|
|
@@ -7148,7 +7309,7 @@ function ensureGamesFonts(doc = document) {
|
|
|
7148
7309
|
}
|
|
7149
7310
|
|
|
7150
7311
|
// src/components/GamesPanel.tsx
|
|
7151
|
-
import { jsx as
|
|
7312
|
+
import { jsx as jsx81 } from "react/jsx-runtime";
|
|
7152
7313
|
function GamesPanel({
|
|
7153
7314
|
loggedIn,
|
|
7154
7315
|
games,
|
|
@@ -7157,13 +7318,13 @@ function GamesPanel({
|
|
|
7157
7318
|
leaderboard,
|
|
7158
7319
|
refreshHub
|
|
7159
7320
|
}) {
|
|
7160
|
-
const [selected, setSelected] =
|
|
7161
|
-
|
|
7321
|
+
const [selected, setSelected] = useState36(null);
|
|
7322
|
+
useEffect17(() => {
|
|
7162
7323
|
ensureGamesFonts();
|
|
7163
7324
|
}, []);
|
|
7164
|
-
if (!loggedIn) return /* @__PURE__ */
|
|
7325
|
+
if (!loggedIn) return /* @__PURE__ */ jsx81(GamesLoginWall, { ui });
|
|
7165
7326
|
if (selected !== null) {
|
|
7166
|
-
return /* @__PURE__ */
|
|
7327
|
+
return /* @__PURE__ */ jsx81("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ jsx81(
|
|
7167
7328
|
GameScreenHost,
|
|
7168
7329
|
{
|
|
7169
7330
|
selected,
|
|
@@ -7177,7 +7338,7 @@ function GamesPanel({
|
|
|
7177
7338
|
}
|
|
7178
7339
|
) });
|
|
7179
7340
|
}
|
|
7180
|
-
return /* @__PURE__ */
|
|
7341
|
+
return /* @__PURE__ */ jsx81("div", { className: "ss-g-hub-wrap", "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ jsx81(
|
|
7181
7342
|
GamesHub,
|
|
7182
7343
|
{
|
|
7183
7344
|
games,
|
|
@@ -7189,10 +7350,10 @@ function GamesPanel({
|
|
|
7189
7350
|
}
|
|
7190
7351
|
|
|
7191
7352
|
// src/components/Leaderboard.tsx
|
|
7192
|
-
import { useState as
|
|
7353
|
+
import { useState as useState37 } from "react";
|
|
7193
7354
|
|
|
7194
7355
|
// src/components/LeaderboardRow.tsx
|
|
7195
|
-
import { jsx as
|
|
7356
|
+
import { jsx as jsx82, jsxs as jsxs68 } from "react/jsx-runtime";
|
|
7196
7357
|
function formatPoints(n) {
|
|
7197
7358
|
return n.toLocaleString("en");
|
|
7198
7359
|
}
|
|
@@ -7201,14 +7362,14 @@ function LeaderboardWeeklyRow({
|
|
|
7201
7362
|
isMe
|
|
7202
7363
|
}) {
|
|
7203
7364
|
const rankClass = `ss-w-lb2-rank${row.rank <= 3 ? " ss-w-lb2-rank--top3" : ""}`;
|
|
7204
|
-
return /* @__PURE__ */
|
|
7205
|
-
/* @__PURE__ */
|
|
7365
|
+
return /* @__PURE__ */ jsxs68("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
|
|
7366
|
+
/* @__PURE__ */ jsxs68("span", { className: rankClass, children: [
|
|
7206
7367
|
"#",
|
|
7207
7368
|
row.rank
|
|
7208
7369
|
] }),
|
|
7209
|
-
/* @__PURE__ */
|
|
7210
|
-
/* @__PURE__ */
|
|
7211
|
-
row.currentStreak > 0 && /* @__PURE__ */
|
|
7370
|
+
/* @__PURE__ */ jsx82("span", { className: "ss-w-lb2-handle", children: row.handle }),
|
|
7371
|
+
/* @__PURE__ */ jsx82("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
|
|
7372
|
+
row.currentStreak > 0 && /* @__PURE__ */ jsxs68("span", { className: "ss-w-lb2-streak", children: [
|
|
7212
7373
|
"\u{1F525} ",
|
|
7213
7374
|
row.currentStreak
|
|
7214
7375
|
] })
|
|
@@ -7219,18 +7380,18 @@ function LeaderboardAllTimeRow({
|
|
|
7219
7380
|
isMe
|
|
7220
7381
|
}) {
|
|
7221
7382
|
const rankClass = `ss-w-lb2-rank${row.rank <= 3 ? " ss-w-lb2-rank--top3" : ""}`;
|
|
7222
|
-
return /* @__PURE__ */
|
|
7223
|
-
/* @__PURE__ */
|
|
7383
|
+
return /* @__PURE__ */ jsxs68("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
|
|
7384
|
+
/* @__PURE__ */ jsxs68("span", { className: rankClass, children: [
|
|
7224
7385
|
"#",
|
|
7225
7386
|
row.rank
|
|
7226
7387
|
] }),
|
|
7227
|
-
/* @__PURE__ */
|
|
7228
|
-
/* @__PURE__ */
|
|
7388
|
+
/* @__PURE__ */ jsx82("span", { className: "ss-w-lb2-handle", children: row.handle }),
|
|
7389
|
+
/* @__PURE__ */ jsx82("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
|
|
7229
7390
|
] });
|
|
7230
7391
|
}
|
|
7231
7392
|
|
|
7232
7393
|
// src/components/LeaderboardEmpty.tsx
|
|
7233
|
-
import { jsx as
|
|
7394
|
+
import { jsx as jsx83, jsxs as jsxs69 } from "react/jsx-runtime";
|
|
7234
7395
|
function LeaderboardEmpty({
|
|
7235
7396
|
segment,
|
|
7236
7397
|
lastWeek,
|
|
@@ -7239,48 +7400,48 @@ function LeaderboardEmpty({
|
|
|
7239
7400
|
ui
|
|
7240
7401
|
}) {
|
|
7241
7402
|
if (segment === "alltime") {
|
|
7242
|
-
return /* @__PURE__ */
|
|
7243
|
-
/* @__PURE__ */
|
|
7244
|
-
/* @__PURE__ */
|
|
7403
|
+
return /* @__PURE__ */ jsxs69("div", { className: "ss-w-lb-empty ss-w-lb-empty--alltime", children: [
|
|
7404
|
+
/* @__PURE__ */ jsx83("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
|
|
7405
|
+
/* @__PURE__ */ jsx83("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
|
|
7245
7406
|
] });
|
|
7246
7407
|
}
|
|
7247
7408
|
const fresh = lastWeek != null;
|
|
7248
7409
|
const title = fresh ? ui.leaderboardEmptyFreshTitle : ui.leaderboardEmptyColdTitle;
|
|
7249
7410
|
const body = fresh ? ui.leaderboardEmptyFreshBody : ui.leaderboardEmptyColdBody;
|
|
7250
|
-
return /* @__PURE__ */
|
|
7251
|
-
weeklyPrize && /* @__PURE__ */
|
|
7252
|
-
/* @__PURE__ */
|
|
7253
|
-
/* @__PURE__ */
|
|
7411
|
+
return /* @__PURE__ */ jsxs69("div", { className: "ss-w-lb-empty", children: [
|
|
7412
|
+
weeklyPrize && /* @__PURE__ */ jsxs69("div", { className: "ss-w-prize", children: [
|
|
7413
|
+
/* @__PURE__ */ jsx83("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
|
|
7414
|
+
/* @__PURE__ */ jsx83("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ jsx83("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
|
|
7254
7415
|
] }),
|
|
7255
|
-
/* @__PURE__ */
|
|
7256
|
-
/* @__PURE__ */
|
|
7257
|
-
/* @__PURE__ */
|
|
7258
|
-
/* @__PURE__ */
|
|
7259
|
-
onPlay && /* @__PURE__ */
|
|
7416
|
+
/* @__PURE__ */ jsxs69("div", { className: "ss-w-lb-empty-hero", children: [
|
|
7417
|
+
/* @__PURE__ */ jsx83("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
|
|
7418
|
+
/* @__PURE__ */ jsx83("h4", { className: "ss-w-lb-empty-title", children: title }),
|
|
7419
|
+
/* @__PURE__ */ jsx83("p", { className: "ss-w-lb-empty-body", children: body }),
|
|
7420
|
+
onPlay && /* @__PURE__ */ jsx83("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
|
|
7260
7421
|
] }),
|
|
7261
|
-
fresh && lastWeek && /* @__PURE__ */
|
|
7262
|
-
/* @__PURE__ */
|
|
7263
|
-
/* @__PURE__ */
|
|
7264
|
-
/* @__PURE__ */
|
|
7265
|
-
/* @__PURE__ */
|
|
7422
|
+
fresh && lastWeek && /* @__PURE__ */ jsxs69("div", { className: "ss-w-lb-last", children: [
|
|
7423
|
+
/* @__PURE__ */ jsx83("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
|
|
7424
|
+
/* @__PURE__ */ jsx83("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
|
|
7425
|
+
/* @__PURE__ */ jsx83("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
|
|
7426
|
+
/* @__PURE__ */ jsx83("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
|
|
7266
7427
|
] })
|
|
7267
7428
|
] });
|
|
7268
7429
|
}
|
|
7269
7430
|
|
|
7270
7431
|
// src/components/Leaderboard.tsx
|
|
7271
|
-
import { Fragment as Fragment19, jsx as
|
|
7432
|
+
import { Fragment as Fragment19, jsx as jsx84, jsxs as jsxs70 } from "react/jsx-runtime";
|
|
7272
7433
|
function Leaderboard({
|
|
7273
7434
|
data,
|
|
7274
7435
|
ui,
|
|
7275
7436
|
onPlay
|
|
7276
7437
|
}) {
|
|
7277
|
-
const [segment, setSegment] =
|
|
7438
|
+
const [segment, setSegment] = useState37("weekly");
|
|
7278
7439
|
const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
|
|
7279
7440
|
const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
|
|
7280
7441
|
const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
|
|
7281
|
-
return /* @__PURE__ */
|
|
7282
|
-
/* @__PURE__ */
|
|
7283
|
-
/* @__PURE__ */
|
|
7442
|
+
return /* @__PURE__ */ jsxs70("div", { className: "ss-w-lb2", children: [
|
|
7443
|
+
/* @__PURE__ */ jsxs70("div", { className: "ss-w-seg", children: [
|
|
7444
|
+
/* @__PURE__ */ jsx84(
|
|
7284
7445
|
"button",
|
|
7285
7446
|
{
|
|
7286
7447
|
type: "button",
|
|
@@ -7290,7 +7451,7 @@ function Leaderboard({
|
|
|
7290
7451
|
children: ui.leaderboardThisWeek
|
|
7291
7452
|
}
|
|
7292
7453
|
),
|
|
7293
|
-
/* @__PURE__ */
|
|
7454
|
+
/* @__PURE__ */ jsx84(
|
|
7294
7455
|
"button",
|
|
7295
7456
|
{
|
|
7296
7457
|
type: "button",
|
|
@@ -7301,7 +7462,7 @@ function Leaderboard({
|
|
|
7301
7462
|
}
|
|
7302
7463
|
)
|
|
7303
7464
|
] }),
|
|
7304
|
-
isEmpty ? /* @__PURE__ */
|
|
7465
|
+
isEmpty ? /* @__PURE__ */ jsx84(
|
|
7305
7466
|
LeaderboardEmpty,
|
|
7306
7467
|
{
|
|
7307
7468
|
segment,
|
|
@@ -7310,15 +7471,15 @@ function Leaderboard({
|
|
|
7310
7471
|
onPlay,
|
|
7311
7472
|
ui
|
|
7312
7473
|
}
|
|
7313
|
-
) : /* @__PURE__ */
|
|
7314
|
-
/* @__PURE__ */
|
|
7474
|
+
) : /* @__PURE__ */ jsxs70(Fragment19, { children: [
|
|
7475
|
+
/* @__PURE__ */ jsx84("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ jsx84(
|
|
7315
7476
|
LeaderboardWeeklyRow,
|
|
7316
7477
|
{
|
|
7317
7478
|
row,
|
|
7318
7479
|
isMe: row.operatorUserId === data.myWeeklyRow?.operatorUserId
|
|
7319
7480
|
},
|
|
7320
7481
|
row.operatorUserId
|
|
7321
|
-
)) : data.allTimeTop.map((row) => /* @__PURE__ */
|
|
7482
|
+
)) : data.allTimeTop.map((row) => /* @__PURE__ */ jsx84(
|
|
7322
7483
|
LeaderboardAllTimeRow,
|
|
7323
7484
|
{
|
|
7324
7485
|
row,
|
|
@@ -7326,18 +7487,18 @@ function Leaderboard({
|
|
|
7326
7487
|
},
|
|
7327
7488
|
row.operatorUserId
|
|
7328
7489
|
)) }),
|
|
7329
|
-
/* @__PURE__ */
|
|
7330
|
-
myRow != null && (offBoard ? /* @__PURE__ */
|
|
7331
|
-
segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */
|
|
7332
|
-
segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */
|
|
7490
|
+
/* @__PURE__ */ jsx84("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
|
|
7491
|
+
myRow != null && (offBoard ? /* @__PURE__ */ jsx84("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ jsxs70("div", { className: "ss-w-lb2-rows", children: [
|
|
7492
|
+
segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ jsx84(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
|
|
7493
|
+
segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ jsx84(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
|
|
7333
7494
|
] })),
|
|
7334
|
-
segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */
|
|
7495
|
+
segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ jsx84("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ jsx84("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ jsx84("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
|
|
7335
7496
|
] })
|
|
7336
7497
|
] });
|
|
7337
7498
|
}
|
|
7338
7499
|
|
|
7339
7500
|
// src/components/LeaderboardPanel.tsx
|
|
7340
|
-
import { jsx as
|
|
7501
|
+
import { jsx as jsx85 } from "react/jsx-runtime";
|
|
7341
7502
|
var EMPTY_PAYLOAD = {
|
|
7342
7503
|
week: "",
|
|
7343
7504
|
weeklyTop: [],
|
|
@@ -7348,17 +7509,17 @@ var EMPTY_PAYLOAD = {
|
|
|
7348
7509
|
lastWeek: null
|
|
7349
7510
|
};
|
|
7350
7511
|
function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
|
|
7351
|
-
if (!loggedIn) return /* @__PURE__ */
|
|
7352
|
-
if (data === null && loading) return /* @__PURE__ */
|
|
7353
|
-
return /* @__PURE__ */
|
|
7512
|
+
if (!loggedIn) return /* @__PURE__ */ jsx85(GamesLoginWall, { ui });
|
|
7513
|
+
if (data === null && loading) return /* @__PURE__ */ jsx85("div", { className: "ss-w-mon-list" });
|
|
7514
|
+
return /* @__PURE__ */ jsx85("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx85(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
|
|
7354
7515
|
}
|
|
7355
7516
|
|
|
7356
7517
|
// src/components/ChatPanel.tsx
|
|
7357
|
-
import { jsx as
|
|
7518
|
+
import { jsx as jsx86, jsxs as jsxs71 } from "react/jsx-runtime";
|
|
7358
7519
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
7359
7520
|
function useIsModal() {
|
|
7360
|
-
const [modal, setModal] =
|
|
7361
|
-
|
|
7521
|
+
const [modal, setModal] = useState38(false);
|
|
7522
|
+
useEffect18(() => {
|
|
7362
7523
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
7363
7524
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
7364
7525
|
const sync = () => setModal(mql.matches);
|
|
@@ -7371,7 +7532,7 @@ function useIsModal() {
|
|
|
7371
7532
|
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, loggedIn, conversation }) {
|
|
7372
7533
|
const { state, close, stop, send, reset } = controller;
|
|
7373
7534
|
const isModal = useIsModal();
|
|
7374
|
-
|
|
7535
|
+
useEffect18(() => {
|
|
7375
7536
|
const onKey = (e) => {
|
|
7376
7537
|
if (e.key === "Escape") close();
|
|
7377
7538
|
};
|
|
@@ -7382,11 +7543,15 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
7382
7543
|
monitor?.setActiveTab("chat");
|
|
7383
7544
|
send(text);
|
|
7384
7545
|
};
|
|
7385
|
-
|
|
7546
|
+
const handleAsk = (text, grounding) => {
|
|
7547
|
+
monitor?.setActiveTab("chat");
|
|
7548
|
+
send(text, { grounding });
|
|
7549
|
+
};
|
|
7550
|
+
useEffect18(() => {
|
|
7386
7551
|
if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
|
|
7387
7552
|
}, [monitor, state.isStreaming, state.messages.length]);
|
|
7388
|
-
return /* @__PURE__ */
|
|
7389
|
-
/* @__PURE__ */
|
|
7553
|
+
return /* @__PURE__ */ jsxs71("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
|
|
7554
|
+
/* @__PURE__ */ jsx86(
|
|
7390
7555
|
ChatHeader,
|
|
7391
7556
|
{
|
|
7392
7557
|
onClose: close,
|
|
@@ -7399,7 +7564,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
7399
7564
|
moreOptionsLabel: ui.moreOptions
|
|
7400
7565
|
}
|
|
7401
7566
|
),
|
|
7402
|
-
monitor && /* @__PURE__ */
|
|
7567
|
+
monitor && /* @__PURE__ */ jsx86(
|
|
7403
7568
|
TabBar,
|
|
7404
7569
|
{
|
|
7405
7570
|
monitor,
|
|
@@ -7411,17 +7576,17 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
7411
7576
|
gamesEnabled: gamesResult?.enabled ?? false
|
|
7412
7577
|
}
|
|
7413
7578
|
),
|
|
7414
|
-
/* @__PURE__ */
|
|
7579
|
+
/* @__PURE__ */ jsx86(
|
|
7415
7580
|
"div",
|
|
7416
7581
|
{
|
|
7417
7582
|
style: !monitor || monitor.activeTab === "chat" ? { display: "contents" } : { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" },
|
|
7418
|
-
children: /* @__PURE__ */
|
|
7583
|
+
children: /* @__PURE__ */ jsx86(MessageList, { controller, ui, slip, onDashboardTap, monitor })
|
|
7419
7584
|
}
|
|
7420
7585
|
),
|
|
7421
|
-
monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */
|
|
7422
|
-
monitor && monitor.activeTab === "following" && /* @__PURE__ */
|
|
7423
|
-
monitor && monitor.activeTab === "odds" && /* @__PURE__ */
|
|
7424
|
-
monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */
|
|
7586
|
+
monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx86(TodayPanel, { discovery, ui, monitor }),
|
|
7587
|
+
monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx86(MatchesPanel, { monitor, ui, slip, onAsk: handleAsk }),
|
|
7588
|
+
monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx86(OddsPanel, { monitor, ui, slip }),
|
|
7589
|
+
monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx86(
|
|
7425
7590
|
GamesPanel,
|
|
7426
7591
|
{
|
|
7427
7592
|
loggedIn: !!loggedIn,
|
|
@@ -7435,7 +7600,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
7435
7600
|
}
|
|
7436
7601
|
}
|
|
7437
7602
|
),
|
|
7438
|
-
monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */
|
|
7603
|
+
monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */ jsx86(
|
|
7439
7604
|
LeaderboardPanel,
|
|
7440
7605
|
{
|
|
7441
7606
|
loggedIn: !!loggedIn,
|
|
@@ -7445,7 +7610,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
7445
7610
|
ui
|
|
7446
7611
|
}
|
|
7447
7612
|
),
|
|
7448
|
-
(!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */
|
|
7613
|
+
(!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */ jsx86(ChatInput, { placeholder: ui.placeholder, streaming: state.isStreaming, onSend: handleSend, onStop: stop, stopLabel: ui.stopResponse, sendLabel: ui.sendMessage })
|
|
7449
7614
|
] });
|
|
7450
7615
|
}
|
|
7451
7616
|
|
|
@@ -7993,6 +8158,59 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
7993
8158
|
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(2) { background: color-mix(in srgb, #3a82f6 10%, var(--ss-w-panel)); }
|
|
7994
8159
|
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(3) { background: color-mix(in srgb, #f5a623 10%, var(--ss-w-panel)); }
|
|
7995
8160
|
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(4) { background: color-mix(in srgb, #a855f7 10%, var(--ss-w-panel)); }
|
|
8161
|
+
/* A hero tile would take the first tint position; count only regular tiles where \`of S\` parses. */
|
|
8162
|
+
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(1 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #34c759 10%, var(--ss-w-panel)); }
|
|
8163
|
+
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(2 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #3a82f6 10%, var(--ss-w-panel)); }
|
|
8164
|
+
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(3 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #f5a623 10%, var(--ss-w-panel)); }
|
|
8165
|
+
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(4 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #a855f7 10%, var(--ss-w-panel)); }
|
|
8166
|
+
|
|
8167
|
+
/* Hero: the personalized lead tile. Declared after the layout rules and at three-class
|
|
8168
|
+
specificity so it keeps one look in every layout -- no market rail, no goal pill, no
|
|
8169
|
+
discovery tint or stacking. Colours derive from accent/panel/ink so an operator surface
|
|
8170
|
+
and dark mode both work without their own rules. */
|
|
8171
|
+
.ss-w-dash .ss-w-dash-grid .ss-w-dash-hero {
|
|
8172
|
+
display: flex; flex-direction: column; align-items: stretch; gap: 10px;
|
|
8173
|
+
padding: 12px 14px 14px; border-radius: 16px;
|
|
8174
|
+
border: 1px solid color-mix(in srgb, var(--ss-w-accent) 38%, var(--ss-w-line));
|
|
8175
|
+
background:
|
|
8176
|
+
radial-gradient(120% 140% at 0% 0%, color-mix(in srgb, var(--ss-w-accent) 18%, transparent) 0%, transparent 60%),
|
|
8177
|
+
var(--ss-w-panel);
|
|
8178
|
+
box-shadow: 0 10px 24px -18px color-mix(in srgb, var(--ss-w-accent) 80%, transparent);
|
|
8179
|
+
}
|
|
8180
|
+
.ss-w-dash .ss-w-dash-grid .ss-w-dash-hero:hover { border-color: var(--ss-w-accent); }
|
|
8181
|
+
.ss-w-dash .ss-w-dash-grid .ss-w-dash-hero:focus-visible { outline: 2px solid var(--ss-w-accent); outline-offset: 2px; }
|
|
8182
|
+
.ss-w-dash-hero-top { display: flex; align-items: center; gap: 8px; min-height: 20px; }
|
|
8183
|
+
.ss-w-dash-hero-badge {
|
|
8184
|
+
font-size: 10.5px; font-weight: 750; letter-spacing: .06em; text-transform: uppercase;
|
|
8185
|
+
color: var(--ss-w-panel); background: color-mix(in srgb, var(--ss-w-accent) 45%, var(--ss-w-ink)); border-radius: 999px; padding: 3px 10px;
|
|
8186
|
+
white-space: nowrap;
|
|
8187
|
+
}
|
|
8188
|
+
.ss-w-dash-hero-chevron { flex: none; width: 14px; height: 14px; color: var(--ss-w-faint); }
|
|
8189
|
+
.ss-w-dash-hero-badge { margin-right: auto; }
|
|
8190
|
+
.ss-w-dash-hero-chevron:only-child { margin-left: auto; }
|
|
8191
|
+
.ss-w-dash-hero-main { display: flex; align-items: center; gap: 12px; min-width: 0; }
|
|
8192
|
+
.ss-w-dash-hero-visual { flex: none; display: flex; align-items: center; }
|
|
8193
|
+
.ss-w-dash-hero-crest {
|
|
8194
|
+
width: 40px; height: 40px; border-radius: 50%;
|
|
8195
|
+
background-color: color-mix(in srgb, var(--ss-w-ink) 4%, var(--ss-w-panel));
|
|
8196
|
+
background-size: 72%; background-position: center; background-repeat: no-repeat;
|
|
8197
|
+
box-shadow: 0 0 0 2px var(--ss-w-panel), 0 0 0 3px color-mix(in srgb, var(--ss-w-ink) 10%, var(--ss-w-panel));
|
|
8198
|
+
}
|
|
8199
|
+
.ss-w-dash-hero-crest + .ss-w-dash-hero-crest { margin-left: -8px; }
|
|
8200
|
+
.ss-w-dash-hero-icon {
|
|
8201
|
+
display: grid; place-items: center; width: 40px; height: 40px; border-radius: 50%; font-size: 22px;
|
|
8202
|
+
background: color-mix(in srgb, var(--ss-w-accent) 14%, var(--ss-w-panel));
|
|
8203
|
+
}
|
|
8204
|
+
.ss-w-dash-hero-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
|
|
8205
|
+
.ss-w-dash-hero-title { font-size: 15.5px; font-weight: 700; line-height: 1.25; color: var(--ss-w-ink); overflow-wrap: anywhere; }
|
|
8206
|
+
.ss-w-dash-hero-subtitle { font-size: 12px; color: var(--ss-w-faint); overflow-wrap: anywhere; }
|
|
8207
|
+
.ss-w-dash-hero-price {
|
|
8208
|
+
flex: none; margin-left: auto;
|
|
8209
|
+
font-family: ui-monospace, monospace; font-variant-numeric: tabular-nums; font-size: 15px; font-weight: 750; line-height: 1;
|
|
8210
|
+
color: color-mix(in srgb, var(--ss-w-accent) 45%, var(--ss-w-ink)); padding: 5px 9px; border-radius: 8px;
|
|
8211
|
+
background: color-mix(in srgb, var(--ss-w-accent) 12%, var(--ss-w-panel));
|
|
8212
|
+
border: 1px solid color-mix(in srgb, var(--ss-w-accent) 30%, var(--ss-w-panel));
|
|
8213
|
+
}
|
|
7996
8214
|
|
|
7997
8215
|
/* club fan pre-match dashboard */
|
|
7998
8216
|
.ss-w-fandash { display: flex; flex-direction: column; gap: 10px; padding: 4px 0; }
|
|
@@ -8333,6 +8551,21 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
8333
8551
|
.ss-w-mon-scorers-home { text-align: right; }
|
|
8334
8552
|
.ss-w-mon-scorers-away { text-align: left; }
|
|
8335
8553
|
.ss-w-mon-scorers-ball { flex: none; align-self: start; line-height: 1.35; }
|
|
8554
|
+
.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); }
|
|
8555
|
+
.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); }
|
|
8556
|
+
.ss-w-fact-min { color: var(--ss-w-ink); letter-spacing: 0; }
|
|
8557
|
+
.ss-w-fact-subj { margin-left: auto; text-transform: none; letter-spacing: 0; font-weight: 650; color: var(--ss-w-faint); }
|
|
8558
|
+
.ss-w-fact-text { margin: 0; font-size: 13.5px; line-height: 1.45; color: var(--ss-w-ink); }
|
|
8559
|
+
.ss-w-fact-basis { font-size: 10.5px; color: var(--ss-w-faint); }
|
|
8560
|
+
.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; }
|
|
8561
|
+
.ss-w-fact-foot { display: flex; align-items: center; gap: 14px; }
|
|
8562
|
+
.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; }
|
|
8563
|
+
.ss-w-fact-link--muted { color: var(--ss-w-faint); margin-left: auto; }
|
|
8564
|
+
.ss-w-fact-hist { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--ss-w-line); }
|
|
8565
|
+
.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); }
|
|
8566
|
+
.ss-w-fact-hist li:last-child { border-bottom: none; }
|
|
8567
|
+
.ss-w-fact-hmin { font-size: 11px; font-weight: 800; color: var(--ss-w-faint); font-variant-numeric: tabular-nums; }
|
|
8568
|
+
.ss-w-fact-htext { margin: 0; font-size: 12.5px; line-height: 1.4; color: var(--ss-w-ink); }
|
|
8336
8569
|
.ss-w-mon-stats { display: flex; flex-direction: column; gap: 10px; }
|
|
8337
8570
|
.ss-w-mon-stat { display: flex; flex-direction: column; gap: 5px; }
|
|
8338
8571
|
.ss-w-mon-pstrip { padding: 6px 8px; border-radius: 8px; background: color-mix(in srgb, var(--ss-w-accent) 8%, transparent); }
|
|
@@ -8866,7 +9099,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
8866
9099
|
`;
|
|
8867
9100
|
|
|
8868
9101
|
// src/StatsWidget.tsx
|
|
8869
|
-
import { jsx as
|
|
9102
|
+
import { jsx as jsx87 } from "react/jsx-runtime";
|
|
8870
9103
|
function buildClient(props) {
|
|
8871
9104
|
try {
|
|
8872
9105
|
if ("client" in props && props.client) {
|
|
@@ -8900,14 +9133,14 @@ function StatsWidget(props) {
|
|
|
8900
9133
|
[built?.client]
|
|
8901
9134
|
);
|
|
8902
9135
|
const ui = useMemo3(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
|
|
8903
|
-
const rootRef =
|
|
8904
|
-
const introDoneRef =
|
|
8905
|
-
const markIntroDone =
|
|
9136
|
+
const rootRef = useRef15(null);
|
|
9137
|
+
const introDoneRef = useRef15(false);
|
|
9138
|
+
const markIntroDone = useCallback10(() => {
|
|
8906
9139
|
introDoneRef.current = true;
|
|
8907
9140
|
}, []);
|
|
8908
9141
|
const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
|
|
8909
9142
|
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
|
|
8910
|
-
const [hasToday, setHasToday] =
|
|
9143
|
+
const [hasToday, setHasToday] = useState39(false);
|
|
8911
9144
|
const monitor = useLiveMonitor({
|
|
8912
9145
|
getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
|
|
8913
9146
|
getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
|
|
@@ -8915,11 +9148,11 @@ function StatsWidget(props) {
|
|
|
8915
9148
|
isOpen: controller.state.isOpen,
|
|
8916
9149
|
hasToday
|
|
8917
9150
|
});
|
|
8918
|
-
const getSchedule =
|
|
9151
|
+
const getSchedule = useCallback10(
|
|
8919
9152
|
(localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes) : Promise.resolve(null),
|
|
8920
9153
|
[built]
|
|
8921
9154
|
);
|
|
8922
|
-
const getStates =
|
|
9155
|
+
const getStates = useCallback10(
|
|
8923
9156
|
(matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
|
|
8924
9157
|
[built]
|
|
8925
9158
|
);
|
|
@@ -8935,14 +9168,14 @@ function StatsWidget(props) {
|
|
|
8935
9168
|
pinnedMatchIds
|
|
8936
9169
|
});
|
|
8937
9170
|
const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
|
|
8938
|
-
|
|
9171
|
+
useEffect19(() => {
|
|
8939
9172
|
setHasToday(todayHasContent);
|
|
8940
9173
|
}, [todayHasContent]);
|
|
8941
9174
|
const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
8942
9175
|
const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
8943
9176
|
const markTodayActivity = monitor.markTodayActivity;
|
|
8944
|
-
const prevLiveCountRef =
|
|
8945
|
-
|
|
9177
|
+
const prevLiveCountRef = useRef15(0);
|
|
9178
|
+
useEffect19(() => {
|
|
8946
9179
|
const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
|
|
8947
9180
|
prevLiveCountRef.current = discovery.liveCount;
|
|
8948
9181
|
if (rose) markTodayActivity();
|
|
@@ -8959,29 +9192,24 @@ function StatsWidget(props) {
|
|
|
8959
9192
|
if (wasAdded(result)) monitor.markInSlip(sel.matchOddsId);
|
|
8960
9193
|
return result;
|
|
8961
9194
|
}),
|
|
8962
|
-
conversationId: controller.state.conversationId ?? void 0
|
|
8963
|
-
onMarketClicked: (marketName) => {
|
|
8964
|
-
try {
|
|
8965
|
-
void built?.conversation.sendSignal({ signalType: "InsightMarketClicked", entityType: "Market", entityName: marketName }).catch(() => void 0);
|
|
8966
|
-
} catch {
|
|
8967
|
-
}
|
|
8968
|
-
}
|
|
9195
|
+
conversationId: controller.state.conversationId ?? void 0
|
|
8969
9196
|
};
|
|
8970
9197
|
},
|
|
8971
|
-
[props.config?.onAddToSlip, controller.state.conversationId,
|
|
9198
|
+
[props.config?.onAddToSlip, controller.state.conversationId, monitor.markInSlip]
|
|
8972
9199
|
);
|
|
8973
9200
|
const onDashboardTap = useMemo3(
|
|
8974
9201
|
() => built ? createDashboardTapSignal((input) => built.conversation.sendSignal(input), logger) : void 0,
|
|
8975
9202
|
[built, logger]
|
|
8976
9203
|
);
|
|
9204
|
+
const dismissPopup = usePopupTelemetry(logger, controller.state.isOpen, controller.state.popupText, controller.dismissPopup);
|
|
8977
9205
|
const operatorUserId = cfg?.userContext?.operatorUserId;
|
|
8978
9206
|
const anonymousUserId = cfg?.userContext?.anonymousUserId;
|
|
8979
9207
|
const conversationId = controller.state.conversationId ?? void 0;
|
|
8980
|
-
|
|
9208
|
+
useEffect19(() => {
|
|
8981
9209
|
if (!logger) return;
|
|
8982
9210
|
logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
|
|
8983
9211
|
}, [logger, operatorUserId, anonymousUserId, conversationId]);
|
|
8984
|
-
|
|
9212
|
+
useEffect19(() => {
|
|
8985
9213
|
if (!logger) return;
|
|
8986
9214
|
const onHide = () => {
|
|
8987
9215
|
logger.flushOnHide();
|
|
@@ -8998,14 +9226,14 @@ function StatsWidget(props) {
|
|
|
8998
9226
|
logger.dispose();
|
|
8999
9227
|
};
|
|
9000
9228
|
}, [logger]);
|
|
9001
|
-
|
|
9229
|
+
useEffect19(() => {
|
|
9002
9230
|
if (!built || !ui.injectStyles) return;
|
|
9003
9231
|
const node = rootRef.current?.getRootNode();
|
|
9004
9232
|
if (node) injectStyles(node);
|
|
9005
9233
|
}, [built, ui.injectStyles]);
|
|
9006
9234
|
if (!built) return null;
|
|
9007
9235
|
const attrs = themeAttrs(ui);
|
|
9008
|
-
return /* @__PURE__ */
|
|
9236
|
+
return /* @__PURE__ */ jsx87(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx87("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__ */ jsx87(
|
|
9009
9237
|
ChatPanel,
|
|
9010
9238
|
{
|
|
9011
9239
|
controller,
|
|
@@ -9019,7 +9247,7 @@ function StatsWidget(props) {
|
|
|
9019
9247
|
loggedIn: !!operatorUserId,
|
|
9020
9248
|
conversation: built?.conversation ?? null
|
|
9021
9249
|
}
|
|
9022
|
-
) : /* @__PURE__ */
|
|
9250
|
+
) : /* @__PURE__ */ jsx87(
|
|
9023
9251
|
ChatFab,
|
|
9024
9252
|
{
|
|
9025
9253
|
label: ui.launcherLabel,
|
|
@@ -9027,7 +9255,7 @@ function StatsWidget(props) {
|
|
|
9027
9255
|
popupText: controller.state.popupText,
|
|
9028
9256
|
logoUrl: ui.logoUrl,
|
|
9029
9257
|
onOpen: controller.open,
|
|
9030
|
-
onDismissPopup:
|
|
9258
|
+
onDismissPopup: dismissPopup,
|
|
9031
9259
|
dismissLabel: ui.dismissGreeting,
|
|
9032
9260
|
introAllowed: !introDoneRef.current,
|
|
9033
9261
|
onIntroStart: markIntroDone
|