@sensiblestats/widget-react 0.38.0 → 0.39.1
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 +12 -0
- package/dist/index.cjs +147 -69
- 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 +363 -285
- package/dist/index.js.map +1 -1
- package/dist/styles.css +7 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/StatsWidget.tsx
|
|
2
|
-
import { useCallback as useCallback5, useEffect as
|
|
2
|
+
import { useCallback as useCallback5, useEffect as useEffect11, useMemo as useMemo2, useRef as useRef8 } from "react";
|
|
3
3
|
import { StatsWidgetClient } from "@sensiblestats/widget-sdk";
|
|
4
4
|
|
|
5
5
|
// src/kickoff.ts
|
|
@@ -21,6 +21,7 @@ var STRINGS = {
|
|
|
21
21
|
placeholder: "Ask about a team, player or match\u2026",
|
|
22
22
|
closeChat: "Close chat",
|
|
23
23
|
newConversation: "New conversation",
|
|
24
|
+
moreOptions: "More options",
|
|
24
25
|
chatDialogLabel: "SensibleStats chat",
|
|
25
26
|
stopResponse: "Stop response",
|
|
26
27
|
sendMessage: "Send message",
|
|
@@ -94,6 +95,7 @@ var STRINGS = {
|
|
|
94
95
|
placeholder: "Bir tak\u0131m, oyuncu veya ma\xE7 hakk\u0131nda sor\u2026",
|
|
95
96
|
closeChat: "Sohbeti kapat",
|
|
96
97
|
newConversation: "Yeni sohbet",
|
|
98
|
+
moreOptions: "Di\u011Fer se\xE7enekler",
|
|
97
99
|
chatDialogLabel: "SensibleStats sohbet",
|
|
98
100
|
stopResponse: "Yan\u0131t\u0131 durdur",
|
|
99
101
|
sendMessage: "Mesaj g\xF6nder",
|
|
@@ -190,6 +192,7 @@ function normalizeUi(cfg) {
|
|
|
190
192
|
injectStyles: cfg.injectStyles ?? true,
|
|
191
193
|
closeChat: strings.closeChat,
|
|
192
194
|
newConversation: strings.newConversation,
|
|
195
|
+
moreOptions: strings.moreOptions,
|
|
193
196
|
chatDialogLabel: strings.chatDialogLabel,
|
|
194
197
|
stopResponse: strings.stopResponse,
|
|
195
198
|
sendMessage: strings.sendMessage,
|
|
@@ -1378,7 +1381,7 @@ import { useState as useState2 } from "react";
|
|
|
1378
1381
|
var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
|
|
1379
1382
|
|
|
1380
1383
|
// src/components/Icons.tsx
|
|
1381
|
-
import { jsx } from "react/jsx-runtime";
|
|
1384
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
1382
1385
|
function SsMark({ className }) {
|
|
1383
1386
|
return /* @__PURE__ */ jsx("img", { className, src: SS_LOGO_DATA_URI, alt: "", "aria-hidden": "true" });
|
|
1384
1387
|
}
|
|
@@ -1391,8 +1394,12 @@ function CloseIcon() {
|
|
|
1391
1394
|
function ChevronIcon() {
|
|
1392
1395
|
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) });
|
|
1393
1396
|
}
|
|
1394
|
-
function
|
|
1395
|
-
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */
|
|
1397
|
+
function KebabIcon() {
|
|
1398
|
+
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ jsxs("g", { fill: "currentColor", children: [
|
|
1399
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "5", r: "1.6" }),
|
|
1400
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "1.6" }),
|
|
1401
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "19", r: "1.6" })
|
|
1402
|
+
] }) });
|
|
1396
1403
|
}
|
|
1397
1404
|
var DASHBOARD_EMOJI = {
|
|
1398
1405
|
football: "\u26BD",
|
|
@@ -1423,11 +1430,11 @@ function BrandMark({ logoUrl, className }) {
|
|
|
1423
1430
|
}
|
|
1424
1431
|
|
|
1425
1432
|
// src/components/GreetingBubble.tsx
|
|
1426
|
-
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
|
|
1433
|
+
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
1427
1434
|
function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss" }) {
|
|
1428
|
-
return /* @__PURE__ */
|
|
1429
|
-
/* @__PURE__ */
|
|
1430
|
-
/* @__PURE__ */
|
|
1435
|
+
return /* @__PURE__ */ jsxs2("div", { className: "ss-w-greeting", role: "note", children: [
|
|
1436
|
+
/* @__PURE__ */ jsxs2("button", { type: "button", className: "ss-w-greeting-body", onClick: onOpen, children: [
|
|
1437
|
+
/* @__PURE__ */ jsxs2("span", { className: "ss-w-greeting-dots", "aria-hidden": "true", children: [
|
|
1431
1438
|
/* @__PURE__ */ jsx3("i", {}),
|
|
1432
1439
|
/* @__PURE__ */ jsx3("i", {}),
|
|
1433
1440
|
/* @__PURE__ */ jsx3("i", {})
|
|
@@ -1439,7 +1446,7 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss" }) {
|
|
|
1439
1446
|
}
|
|
1440
1447
|
|
|
1441
1448
|
// src/components/ChatFab.tsx
|
|
1442
|
-
import { jsx as jsx4, jsxs as
|
|
1449
|
+
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
1443
1450
|
function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart }) {
|
|
1444
1451
|
const bubble = popupText ?? greeting;
|
|
1445
1452
|
const [intro, setIntro] = useState3(false);
|
|
@@ -1451,28 +1458,93 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
|
|
|
1451
1458
|
onIntroStart?.();
|
|
1452
1459
|
}
|
|
1453
1460
|
}, [bubble, onIntroStart]);
|
|
1454
|
-
return /* @__PURE__ */
|
|
1461
|
+
return /* @__PURE__ */ jsxs3("div", { className: intro ? "ss-w-fab-wrap ss-w-intro" : "ss-w-fab-wrap", children: [
|
|
1455
1462
|
bubble ? /* @__PURE__ */ jsx4(GreetingBubble, { text: bubble, onOpen, onDismiss: popupText ? onDismissPopup : void 0, dismissLabel }) : null,
|
|
1456
1463
|
/* @__PURE__ */ jsx4("button", { type: "button", className: "ss-w-fab", "aria-label": label, onClick: onOpen, children: /* @__PURE__ */ jsx4(BrandMark, { logoUrl, className: "ss-w-fab-mark" }) })
|
|
1457
1464
|
] });
|
|
1458
1465
|
}
|
|
1459
1466
|
|
|
1460
1467
|
// src/components/ChatPanel.tsx
|
|
1461
|
-
import { useEffect as
|
|
1468
|
+
import { useEffect as useEffect10, useState as useState18 } from "react";
|
|
1462
1469
|
|
|
1463
1470
|
// src/components/ChatHeader.tsx
|
|
1464
|
-
import {
|
|
1465
|
-
|
|
1466
|
-
|
|
1471
|
+
import { useEffect as useEffect5, useRef as useRef5, useState as useState4 } from "react";
|
|
1472
|
+
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
1473
|
+
function ChatHeader({
|
|
1474
|
+
onClose,
|
|
1475
|
+
closeLabel = "Close chat",
|
|
1476
|
+
logoUrl,
|
|
1477
|
+
headerTitle,
|
|
1478
|
+
onNewConversation,
|
|
1479
|
+
canReset,
|
|
1480
|
+
newConversationLabel = "New conversation",
|
|
1481
|
+
moreOptionsLabel = "More options"
|
|
1482
|
+
}) {
|
|
1483
|
+
const [menuOpen, setMenuOpen] = useState4(false);
|
|
1484
|
+
const wrapRef = useRef5(null);
|
|
1485
|
+
const kebabRef = useRef5(null);
|
|
1486
|
+
const firstItemRef = useRef5(null);
|
|
1487
|
+
const hasMenu = !!(canReset && onNewConversation);
|
|
1488
|
+
useEffect5(() => {
|
|
1489
|
+
if (menuOpen) firstItemRef.current?.focus();
|
|
1490
|
+
}, [menuOpen]);
|
|
1491
|
+
useEffect5(() => {
|
|
1492
|
+
if (!menuOpen) return;
|
|
1493
|
+
const onPointer = (e) => {
|
|
1494
|
+
if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
|
|
1495
|
+
};
|
|
1496
|
+
const onKey = (e) => {
|
|
1497
|
+
if (e.key === "Escape") {
|
|
1498
|
+
setMenuOpen(false);
|
|
1499
|
+
kebabRef.current?.focus();
|
|
1500
|
+
}
|
|
1501
|
+
};
|
|
1502
|
+
document.addEventListener("mousedown", onPointer);
|
|
1503
|
+
document.addEventListener("keydown", onKey);
|
|
1504
|
+
return () => {
|
|
1505
|
+
document.removeEventListener("mousedown", onPointer);
|
|
1506
|
+
document.removeEventListener("keydown", onKey);
|
|
1507
|
+
};
|
|
1508
|
+
}, [menuOpen]);
|
|
1509
|
+
const runNewConversation = () => {
|
|
1510
|
+
setMenuOpen(false);
|
|
1511
|
+
onNewConversation?.();
|
|
1512
|
+
};
|
|
1513
|
+
return /* @__PURE__ */ jsxs4("header", { className: "ss-w-header", children: [
|
|
1467
1514
|
/* @__PURE__ */ jsx5(BrandMark, { logoUrl, className: "ss-w-header-mark" }),
|
|
1468
1515
|
/* @__PURE__ */ jsx5("span", { className: "ss-w-header-title", children: headerTitle ?? "SensibleStats" }),
|
|
1469
|
-
|
|
1516
|
+
hasMenu ? /* @__PURE__ */ jsxs4("div", { className: "ss-w-menu-wrap", ref: wrapRef, children: [
|
|
1517
|
+
/* @__PURE__ */ jsx5(
|
|
1518
|
+
"button",
|
|
1519
|
+
{
|
|
1520
|
+
type: "button",
|
|
1521
|
+
className: "ss-w-kebab",
|
|
1522
|
+
ref: kebabRef,
|
|
1523
|
+
"aria-haspopup": "menu",
|
|
1524
|
+
"aria-expanded": menuOpen,
|
|
1525
|
+
"aria-label": moreOptionsLabel,
|
|
1526
|
+
onClick: () => setMenuOpen((open) => !open),
|
|
1527
|
+
children: /* @__PURE__ */ jsx5(KebabIcon, {})
|
|
1528
|
+
}
|
|
1529
|
+
),
|
|
1530
|
+
menuOpen ? /* @__PURE__ */ jsx5("div", { className: "ss-w-menu", role: "menu", "aria-label": moreOptionsLabel, children: /* @__PURE__ */ jsx5(
|
|
1531
|
+
"button",
|
|
1532
|
+
{
|
|
1533
|
+
type: "button",
|
|
1534
|
+
className: "ss-w-menu-item",
|
|
1535
|
+
role: "menuitem",
|
|
1536
|
+
ref: firstItemRef,
|
|
1537
|
+
onClick: runNewConversation,
|
|
1538
|
+
children: /* @__PURE__ */ jsx5("span", { children: newConversationLabel })
|
|
1539
|
+
}
|
|
1540
|
+
) }) : null
|
|
1541
|
+
] }) : null,
|
|
1470
1542
|
/* @__PURE__ */ jsx5("button", { type: "button", className: "ss-w-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx5(CloseIcon, {}) })
|
|
1471
1543
|
] });
|
|
1472
1544
|
}
|
|
1473
1545
|
|
|
1474
1546
|
// src/components/MessageList.tsx
|
|
1475
|
-
import { useEffect as
|
|
1547
|
+
import { useEffect as useEffect9, useRef as useRef7 } from "react";
|
|
1476
1548
|
|
|
1477
1549
|
// src/components/Markdown.tsx
|
|
1478
1550
|
import ReactMarkdown from "react-markdown";
|
|
@@ -1490,8 +1562,8 @@ function Markdown({ text }) {
|
|
|
1490
1562
|
}
|
|
1491
1563
|
|
|
1492
1564
|
// src/components/EntityCardList.tsx
|
|
1493
|
-
import { useState as
|
|
1494
|
-
import { jsx as jsx7, jsxs as
|
|
1565
|
+
import { useState as useState5 } from "react";
|
|
1566
|
+
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1495
1567
|
var MAX_VISIBLE = 3;
|
|
1496
1568
|
var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
|
|
1497
1569
|
function initials(name) {
|
|
@@ -1512,7 +1584,7 @@ function Crest({ image, label }) {
|
|
|
1512
1584
|
}
|
|
1513
1585
|
function FormBar({ w, d, l }) {
|
|
1514
1586
|
if (w + d + l === 0) return null;
|
|
1515
|
-
return /* @__PURE__ */
|
|
1587
|
+
return /* @__PURE__ */ jsxs5("span", { className: "ss-w-form", "aria-hidden": "true", children: [
|
|
1516
1588
|
w > 0 ? /* @__PURE__ */ jsx7("span", { className: "ss-w-form-w", style: { flexGrow: w } }) : null,
|
|
1517
1589
|
d > 0 ? /* @__PURE__ */ jsx7("span", { className: "ss-w-form-d", style: { flexGrow: d } }) : null,
|
|
1518
1590
|
l > 0 ? /* @__PURE__ */ jsx7("span", { className: "ss-w-form-l", style: { flexGrow: l } }) : null
|
|
@@ -1521,12 +1593,12 @@ function FormBar({ w, d, l }) {
|
|
|
1521
1593
|
function StatCellView({ s }) {
|
|
1522
1594
|
const m = RECORD_RE.exec(s.value);
|
|
1523
1595
|
if (m) {
|
|
1524
|
-
return /* @__PURE__ */
|
|
1596
|
+
return /* @__PURE__ */ jsxs5("div", { className: "ss-w-ecard-cell", children: [
|
|
1525
1597
|
/* @__PURE__ */ jsx7("span", { className: "ss-w-ecard-cval", children: /* @__PURE__ */ jsx7(FormBar, { w: Number(m[1]), d: Number(m[2]), l: Number(m[3]) }) }),
|
|
1526
1598
|
/* @__PURE__ */ jsx7("span", { className: "ss-w-ecard-clabel", children: s.value })
|
|
1527
1599
|
] });
|
|
1528
1600
|
}
|
|
1529
|
-
return /* @__PURE__ */
|
|
1601
|
+
return /* @__PURE__ */ jsxs5("div", { className: "ss-w-ecard-cell", children: [
|
|
1530
1602
|
/* @__PURE__ */ jsx7("span", { className: "ss-w-ecard-cval", children: s.value }),
|
|
1531
1603
|
/* @__PURE__ */ jsx7("span", { className: "ss-w-ecard-clabel", children: s.label })
|
|
1532
1604
|
] });
|
|
@@ -1538,7 +1610,7 @@ function StatStrip({ stats }) {
|
|
|
1538
1610
|
}
|
|
1539
1611
|
function CardHeader({ c, showScopeCrest }) {
|
|
1540
1612
|
const onlyScope = c.scopes.length === 1 ? c.scopes[0] : null;
|
|
1541
|
-
return /* @__PURE__ */
|
|
1613
|
+
return /* @__PURE__ */ jsxs5("div", { className: "ss-w-ecard-hd", children: [
|
|
1542
1614
|
/* @__PURE__ */ jsx7(
|
|
1543
1615
|
"span",
|
|
1544
1616
|
{
|
|
@@ -1547,11 +1619,11 @@ function CardHeader({ c, showScopeCrest }) {
|
|
|
1547
1619
|
children: c.image ? "" : initials(c.name)
|
|
1548
1620
|
}
|
|
1549
1621
|
),
|
|
1550
|
-
/* @__PURE__ */
|
|
1622
|
+
/* @__PURE__ */ jsxs5("span", { className: "ss-w-ecard-idtext", children: [
|
|
1551
1623
|
/* @__PURE__ */ jsx7("span", { className: "ss-w-nm", children: c.name }),
|
|
1552
1624
|
c.sub ? /* @__PURE__ */ jsx7("span", { className: "ss-w-sub", children: c.sub }) : null
|
|
1553
1625
|
] }),
|
|
1554
|
-
/* @__PURE__ */
|
|
1626
|
+
/* @__PURE__ */ jsxs5("span", { className: "ss-w-ecard-meta", children: [
|
|
1555
1627
|
showScopeCrest && onlyScope?.image ? /* @__PURE__ */ jsx7(Crest, { image: onlyScope.image, label: onlyScope.label }) : null,
|
|
1556
1628
|
c.season ? /* @__PURE__ */ jsx7("span", { className: "ss-w-ecard-season", children: shortSeason(c.season) }) : null
|
|
1557
1629
|
] })
|
|
@@ -1574,43 +1646,43 @@ function ScopeTabs({ scopes, active, onSelect }) {
|
|
|
1574
1646
|
)) });
|
|
1575
1647
|
}
|
|
1576
1648
|
function EntityCardItem({ c }) {
|
|
1577
|
-
const [active, setActive] =
|
|
1649
|
+
const [active, setActive] = useState5(0);
|
|
1578
1650
|
const hasBody = c.scopes.length > 0;
|
|
1579
1651
|
if (!hasBody) {
|
|
1580
1652
|
return /* @__PURE__ */ jsx7("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ jsx7(CardHeader, { c, showScopeCrest: false }) });
|
|
1581
1653
|
}
|
|
1582
1654
|
const multi = c.scopes.length > 1;
|
|
1583
1655
|
const scope = c.scopes[multi ? c.scopes[active] ? active : 0 : 0];
|
|
1584
|
-
return /* @__PURE__ */
|
|
1656
|
+
return /* @__PURE__ */ jsxs5("div", { className: "ss-w-ecard", "data-kind": c.kind, children: [
|
|
1585
1657
|
/* @__PURE__ */ jsx7(CardHeader, { c, showScopeCrest: !multi }),
|
|
1586
1658
|
multi ? /* @__PURE__ */ jsx7(ScopeTabs, { scopes: c.scopes, active, onSelect: setActive }) : null,
|
|
1587
1659
|
/* @__PURE__ */ jsx7(StatStrip, { stats: scope.stats })
|
|
1588
1660
|
] });
|
|
1589
1661
|
}
|
|
1590
1662
|
function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
|
|
1591
|
-
const [expanded, setExpanded] =
|
|
1663
|
+
const [expanded, setExpanded] = useState5(false);
|
|
1592
1664
|
if (cards.length === 0) return null;
|
|
1593
1665
|
const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
|
|
1594
1666
|
const overflow = cards.length - MAX_VISIBLE;
|
|
1595
|
-
return /* @__PURE__ */
|
|
1667
|
+
return /* @__PURE__ */ jsxs5("div", { className: "ss-w-cards", children: [
|
|
1596
1668
|
visible.map((c) => /* @__PURE__ */ jsx7(EntityCardItem, { c }, c.id)),
|
|
1597
1669
|
overflow > 0 ? /* @__PURE__ */ jsx7("button", { type: "button", className: "ss-w-cards-more", disabled, onClick: () => setExpanded((v) => !v), children: expanded ? showLessLabel : showMoreLabel(overflow) }) : null
|
|
1598
1670
|
] });
|
|
1599
1671
|
}
|
|
1600
1672
|
|
|
1601
1673
|
// src/components/BettingInsightList.tsx
|
|
1602
|
-
import { useState as
|
|
1674
|
+
import { useState as useState9 } from "react";
|
|
1603
1675
|
|
|
1604
1676
|
// src/components/AddToSlipButton.tsx
|
|
1605
|
-
import { useCallback as useCallback3, useState as
|
|
1677
|
+
import { useCallback as useCallback3, useState as useState6 } from "react";
|
|
1606
1678
|
import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
|
|
1607
1679
|
|
|
1608
1680
|
// src/components/Toast.tsx
|
|
1609
|
-
import { useEffect as
|
|
1681
|
+
import { useEffect as useEffect6 } from "react";
|
|
1610
1682
|
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
1611
1683
|
var DISMISS_MS = 4e3;
|
|
1612
1684
|
function Toast({ toast, onDismiss }) {
|
|
1613
|
-
|
|
1685
|
+
useEffect6(() => {
|
|
1614
1686
|
if (!toast) return;
|
|
1615
1687
|
const timer = setTimeout(onDismiss, DISMISS_MS);
|
|
1616
1688
|
return () => clearTimeout(timer);
|
|
@@ -1620,7 +1692,7 @@ function Toast({ toast, onDismiss }) {
|
|
|
1620
1692
|
}
|
|
1621
1693
|
|
|
1622
1694
|
// src/components/AddToSlipButton.tsx
|
|
1623
|
-
import { jsx as jsx9, jsxs as
|
|
1695
|
+
import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1624
1696
|
function withTimeout(value) {
|
|
1625
1697
|
return Promise.race([
|
|
1626
1698
|
value,
|
|
@@ -1628,9 +1700,9 @@ function withTimeout(value) {
|
|
|
1628
1700
|
]);
|
|
1629
1701
|
}
|
|
1630
1702
|
function SlipButton({ selection, shownOdds, marketName, slip, ui }) {
|
|
1631
|
-
const [pending, setPending] =
|
|
1632
|
-
const [settled, setSettled] =
|
|
1633
|
-
const [toast, setToast] =
|
|
1703
|
+
const [pending, setPending] = useState6(false);
|
|
1704
|
+
const [settled, setSettled] = useState6(false);
|
|
1705
|
+
const [toast, setToast] = useState6(null);
|
|
1634
1706
|
const dismiss = useCallback3(() => setToast(null), []);
|
|
1635
1707
|
const handler = slip.onAddToSlip;
|
|
1636
1708
|
if (!ui || !handler || !selection) return null;
|
|
@@ -1654,7 +1726,7 @@ function SlipButton({ selection, shownOdds, marketName, slip, ui }) {
|
|
|
1654
1726
|
setPending(false);
|
|
1655
1727
|
}
|
|
1656
1728
|
};
|
|
1657
|
-
return /* @__PURE__ */
|
|
1729
|
+
return /* @__PURE__ */ jsxs6("div", { className: "ss-w-slip", children: [
|
|
1658
1730
|
/* @__PURE__ */ jsx9(
|
|
1659
1731
|
"button",
|
|
1660
1732
|
{
|
|
@@ -1674,7 +1746,7 @@ function AddToSlipButton({ it, slip, ui }) {
|
|
|
1674
1746
|
}
|
|
1675
1747
|
|
|
1676
1748
|
// src/components/OddsMovementBadge.tsx
|
|
1677
|
-
import { jsx as jsx10, jsxs as
|
|
1749
|
+
import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
1678
1750
|
function OddsMovementBadge({
|
|
1679
1751
|
previous,
|
|
1680
1752
|
current,
|
|
@@ -1687,7 +1759,7 @@ function OddsMovementBadge({
|
|
|
1687
1759
|
return (
|
|
1688
1760
|
// Strikethrough is invisible to screen readers, so the whole was/now/direction sentence rides
|
|
1689
1761
|
// on one aria-label and the visual glyphs are hidden from the accessibility tree.
|
|
1690
|
-
/* @__PURE__ */
|
|
1762
|
+
/* @__PURE__ */ jsxs7("span", { className: "ss-w-move", role: "img", "aria-label": label, children: [
|
|
1691
1763
|
/* @__PURE__ */ jsx10("span", { className: "ss-w-move-prev", "aria-hidden": "true", children: previous }),
|
|
1692
1764
|
/* @__PURE__ */ jsx10("span", { className: "ss-w-move-arrow", "aria-hidden": "true", children: direction === "shortened" ? "\u25BC" : "\u25B2" })
|
|
1693
1765
|
] })
|
|
@@ -1695,14 +1767,14 @@ function OddsMovementBadge({
|
|
|
1695
1767
|
}
|
|
1696
1768
|
|
|
1697
1769
|
// src/components/Crest.tsx
|
|
1698
|
-
import { useState as
|
|
1770
|
+
import { useState as useState7 } from "react";
|
|
1699
1771
|
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
1700
1772
|
function initials2(name) {
|
|
1701
1773
|
return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
|
|
1702
1774
|
}
|
|
1703
1775
|
function Crest2({ url, name, kind }) {
|
|
1704
1776
|
const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
|
|
1705
|
-
const [failed, setFailed] =
|
|
1777
|
+
const [failed, setFailed] = useState7(false);
|
|
1706
1778
|
if (url && !failed) {
|
|
1707
1779
|
return /* @__PURE__ */ jsx11("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
1708
1780
|
}
|
|
@@ -1710,15 +1782,15 @@ function Crest2({ url, name, kind }) {
|
|
|
1710
1782
|
}
|
|
1711
1783
|
|
|
1712
1784
|
// src/components/PinToggle.tsx
|
|
1713
|
-
import { useCallback as useCallback4, useState as
|
|
1714
|
-
import { jsx as jsx12, jsxs as
|
|
1785
|
+
import { useCallback as useCallback4, useState as useState8 } from "react";
|
|
1786
|
+
import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
1715
1787
|
var PIN_GLYPHS = {
|
|
1716
1788
|
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" },
|
|
1717
1789
|
star: { viewBox: "0 0 24 24", strokeWidth: 2, d: "M12 2.5l2.9 5.9 6.5.95-4.7 4.58 1.1 6.47L12 17.35 6.1 20.4l1.1-6.47L2.5 9.35l6.5-.95z" },
|
|
1718
1790
|
bookmark: { viewBox: "0 0 24 24", strokeWidth: 2, d: "M7 3h10a1.5 1.5 0 0 1 1.5 1.5V21l-6.5-3.6L5.5 21V4.5A1.5 1.5 0 0 1 7 3z" }
|
|
1719
1791
|
};
|
|
1720
1792
|
function PinToggle({ pin, monitor, ui }) {
|
|
1721
|
-
const [toast, setToast] =
|
|
1793
|
+
const [toast, setToast] = useState8(null);
|
|
1722
1794
|
const dismiss = useCallback4(() => setToast(null), []);
|
|
1723
1795
|
if (!monitor || !monitor.enabled) return null;
|
|
1724
1796
|
const key = pinKey(pin);
|
|
@@ -1733,7 +1805,7 @@ function PinToggle({ pin, monitor, ui }) {
|
|
|
1733
1805
|
}
|
|
1734
1806
|
};
|
|
1735
1807
|
const glyph = PIN_GLYPHS[ui.pinIcon];
|
|
1736
|
-
return /* @__PURE__ */
|
|
1808
|
+
return /* @__PURE__ */ jsxs8("div", { className: "ss-w-pin-wrap", children: [
|
|
1737
1809
|
/* @__PURE__ */ jsx12(
|
|
1738
1810
|
"button",
|
|
1739
1811
|
{
|
|
@@ -1763,17 +1835,17 @@ function PinToggle({ pin, monitor, ui }) {
|
|
|
1763
1835
|
}
|
|
1764
1836
|
|
|
1765
1837
|
// src/components/BettingInsightList.tsx
|
|
1766
|
-
import { Fragment, jsx as jsx13, jsxs as
|
|
1838
|
+
import { Fragment, jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1767
1839
|
function StatRows({ stats }) {
|
|
1768
|
-
return /* @__PURE__ */ jsx13("div", { className: "ss-w-bi-rows", children: stats.map((s) => /* @__PURE__ */
|
|
1840
|
+
return /* @__PURE__ */ jsx13("div", { className: "ss-w-bi-rows", children: stats.map((s) => /* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-row", children: [
|
|
1769
1841
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-row-lbl", children: s.label }),
|
|
1770
1842
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-row-num", children: s.value })
|
|
1771
1843
|
] }, `${s.label}:${s.value}`)) });
|
|
1772
1844
|
}
|
|
1773
1845
|
function ScopedStats({ scopes }) {
|
|
1774
|
-
const [active, setActive] =
|
|
1846
|
+
const [active, setActive] = useState9(0);
|
|
1775
1847
|
const current = scopes[active] ?? scopes[0] ?? { key: "", label: "", stats: [] };
|
|
1776
|
-
return /* @__PURE__ */
|
|
1848
|
+
return /* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-scoped", children: [
|
|
1777
1849
|
/* @__PURE__ */ jsx13("div", { className: "ss-w-bi-scopes", role: "group", children: scopes.map((s, i) => /* @__PURE__ */ jsx13("button", { type: "button", className: "ss-w-bi-chip", "aria-pressed": i === active, onClick: () => setActive(i), children: s.label }, s.key)) }),
|
|
1778
1850
|
/* @__PURE__ */ jsx13(StatRows, { stats: current.stats }, current.key)
|
|
1779
1851
|
] });
|
|
@@ -1782,15 +1854,15 @@ function hasStatsContent(it) {
|
|
|
1782
1854
|
return !!it.scopes && it.scopes.length >= 2 || it.stats.length > 0;
|
|
1783
1855
|
}
|
|
1784
1856
|
function ReasonStrip({ it, ui }) {
|
|
1785
|
-
const [open, setOpen] =
|
|
1857
|
+
const [open, setOpen] = useState9(false);
|
|
1786
1858
|
const hasScopes = !!it.scopes && it.scopes.length >= 2;
|
|
1787
1859
|
const hasStats = hasStatsContent(it);
|
|
1788
1860
|
const hasText = !!it.text;
|
|
1789
1861
|
if (!hasText && !hasStats) return null;
|
|
1790
1862
|
const expandable = hasStats || (it.text?.length ?? 0) > 90;
|
|
1791
|
-
return /* @__PURE__ */
|
|
1863
|
+
return /* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-reason", children: [
|
|
1792
1864
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-chart", "aria-hidden": "true" }),
|
|
1793
|
-
/* @__PURE__ */
|
|
1865
|
+
/* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-reason-body", children: [
|
|
1794
1866
|
hasText ? /* @__PURE__ */ jsx13("p", { className: `ss-w-bi-text${open ? "" : " ss-w-bi-text-clamp"}`, children: it.text }) : null,
|
|
1795
1867
|
open && hasStats ? hasScopes ? /* @__PURE__ */ jsx13(ScopedStats, { scopes: it.scopes }) : /* @__PURE__ */ jsx13(StatRows, { stats: it.stats }) : null
|
|
1796
1868
|
] }),
|
|
@@ -1809,7 +1881,7 @@ function ReasonStrip({ it, ui }) {
|
|
|
1809
1881
|
}
|
|
1810
1882
|
function CardFixture({ it }) {
|
|
1811
1883
|
if (it.homeTeamName && it.awayTeamName) {
|
|
1812
|
-
return /* @__PURE__ */
|
|
1884
|
+
return /* @__PURE__ */ jsxs9(Fragment, { children: [
|
|
1813
1885
|
/* @__PURE__ */ jsx13(Crest2, { kind: "team", url: it.homeCrest, name: it.homeTeamName }),
|
|
1814
1886
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-team", children: it.homeTeamName }),
|
|
1815
1887
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-vs", "aria-hidden": "true", children: "vs" }),
|
|
@@ -1819,7 +1891,7 @@ function CardFixture({ it }) {
|
|
|
1819
1891
|
}
|
|
1820
1892
|
if (it.fixture) return /* @__PURE__ */ jsx13("span", { className: "ss-w-bi-fixture-txt", children: it.fixture });
|
|
1821
1893
|
if (it.competition) {
|
|
1822
|
-
return /* @__PURE__ */
|
|
1894
|
+
return /* @__PURE__ */ jsxs9(Fragment, { children: [
|
|
1823
1895
|
/* @__PURE__ */ jsx13(Crest2, { kind: "comp", url: it.competitionCrest, name: it.competition }),
|
|
1824
1896
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-comp", children: it.competition })
|
|
1825
1897
|
] });
|
|
@@ -1834,16 +1906,16 @@ function InsightCard({ it, ui, slip, monitor }) {
|
|
|
1834
1906
|
const compInMeta = leftIsFixture && !!it.competition;
|
|
1835
1907
|
const showPin = !!monitor && it.pinEnabled;
|
|
1836
1908
|
const showHeader = leftIsFixture || !!it.competition || live || !!kickoff || showPin;
|
|
1837
|
-
return /* @__PURE__ */
|
|
1838
|
-
showHeader ? /* @__PURE__ */
|
|
1909
|
+
return /* @__PURE__ */ jsxs9("div", { className: "ss-w-binsight", children: [
|
|
1910
|
+
showHeader ? /* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-header", children: [
|
|
1839
1911
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-header-left", children: /* @__PURE__ */ jsx13(CardFixture, { it }) }),
|
|
1840
|
-
/* @__PURE__ */
|
|
1841
|
-
live ? /* @__PURE__ */
|
|
1912
|
+
/* @__PURE__ */ jsxs9("span", { className: "ss-w-bi-header-right", children: [
|
|
1913
|
+
live ? /* @__PURE__ */ jsxs9("span", { className: "ss-w-bi-live", children: [
|
|
1842
1914
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-live-dot", "aria-hidden": "true" }),
|
|
1843
1915
|
ui?.liveLabel ?? "Live"
|
|
1844
1916
|
] }) : null,
|
|
1845
1917
|
compInMeta ? /* @__PURE__ */ jsx13("span", { className: "ss-w-bi-comp-meta", title: it.competition, children: /* @__PURE__ */ jsx13(Crest2, { kind: "comp", url: it.competitionCrest, name: it.competition }) }) : null,
|
|
1846
|
-
kickoff ? /* @__PURE__ */
|
|
1918
|
+
kickoff ? /* @__PURE__ */ jsxs9("span", { className: "ss-w-bi-kick", children: [
|
|
1847
1919
|
kickoff.dayLabel,
|
|
1848
1920
|
" ",
|
|
1849
1921
|
kickoff.time
|
|
@@ -1851,15 +1923,15 @@ function InsightCard({ it, ui, slip, monitor }) {
|
|
|
1851
1923
|
showPin && ui ? /* @__PURE__ */ jsx13(PinToggle, { ui, monitor, pin: { kind: "match", matchId: it.matchId } }) : null
|
|
1852
1924
|
] })
|
|
1853
1925
|
] }) : null,
|
|
1854
|
-
/* @__PURE__ */
|
|
1855
|
-
/* @__PURE__ */
|
|
1926
|
+
/* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-action-row", children: [
|
|
1927
|
+
/* @__PURE__ */ jsxs9("span", { className: "ss-w-bi-pick", children: [
|
|
1856
1928
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-market", children: it.market }),
|
|
1857
|
-
it.selection ? /* @__PURE__ */
|
|
1929
|
+
it.selection ? /* @__PURE__ */ jsxs9(Fragment, { children: [
|
|
1858
1930
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-pick-dot", "aria-hidden": "true", children: "\xB7" }),
|
|
1859
1931
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-sel", children: it.selection })
|
|
1860
1932
|
] }) : null
|
|
1861
1933
|
] }),
|
|
1862
|
-
it.odds ? /* @__PURE__ */
|
|
1934
|
+
it.odds ? /* @__PURE__ */ jsxs9("span", { className: "ss-w-bi-odds", children: [
|
|
1863
1935
|
/* @__PURE__ */ jsx13("b", { children: it.odds }),
|
|
1864
1936
|
/* @__PURE__ */ jsx13(OddsMovementBadge, { previous: it.previousOdds, current: it.odds, direction: it.movementDirection, ui }),
|
|
1865
1937
|
it.bookmaker ? /* @__PURE__ */ jsx13("span", { className: "ss-w-bi-book", children: it.bookmaker }) : null
|
|
@@ -1892,16 +1964,16 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
|
|
|
1892
1964
|
}
|
|
1893
1965
|
|
|
1894
1966
|
// src/components/MarketOddsCardList.tsx
|
|
1895
|
-
import { useState as
|
|
1896
|
-
import { Fragment as Fragment2, jsx as jsx14, jsxs as
|
|
1967
|
+
import { useState as useState10 } from "react";
|
|
1968
|
+
import { Fragment as Fragment2, jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1897
1969
|
function OddsRow({ vm, row, ui, slip, inSlipIds }) {
|
|
1898
1970
|
const selection = vm.addToSlipEnabled ? marketOddsRowToSlipSelection(vm, row, slip.conversationId) : null;
|
|
1899
1971
|
const inSlip = !!inSlipIds && row.matchOddsId != null && !!inSlipIds[row.matchOddsId];
|
|
1900
|
-
return /* @__PURE__ */
|
|
1972
|
+
return /* @__PURE__ */ jsxs10("div", { className: "ss-w-mo-row", children: [
|
|
1901
1973
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-mo-sel", children: row.selection }),
|
|
1902
1974
|
/* @__PURE__ */ jsx14(OddsMovementBadge, { previous: row.previousOdds, current: row.odds, direction: row.movementDirection, ui }),
|
|
1903
1975
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-mo-price", children: row.odds }),
|
|
1904
|
-
inSlip && ui ? /* @__PURE__ */
|
|
1976
|
+
inSlip && ui ? /* @__PURE__ */ jsxs10("span", { className: "ss-w-mon-inslip", children: [
|
|
1905
1977
|
"\u2713 ",
|
|
1906
1978
|
ui.inSlipLabel
|
|
1907
1979
|
] }) : null,
|
|
@@ -1909,24 +1981,24 @@ function OddsRow({ vm, row, ui, slip, inSlipIds }) {
|
|
|
1909
1981
|
] });
|
|
1910
1982
|
}
|
|
1911
1983
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
|
|
1912
|
-
const [open, setOpen] =
|
|
1984
|
+
const [open, setOpen] = useState10(false);
|
|
1913
1985
|
const kickoff = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
|
|
1914
1986
|
const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
|
|
1915
1987
|
const showPin = !!monitor && vm.pinEnabled;
|
|
1916
1988
|
const showHeader = !!vm.competition || vm.isLive || !!kickoff || showPin;
|
|
1917
|
-
return /* @__PURE__ */
|
|
1918
|
-
!hideHeader && /* @__PURE__ */
|
|
1919
|
-
showHeader ? /* @__PURE__ */
|
|
1920
|
-
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-header-left", children: vm.competition ? /* @__PURE__ */
|
|
1989
|
+
return /* @__PURE__ */ jsxs10("div", { className: hideHeader ? "ss-w-mocard ss-w-mocard--bare" : "ss-w-mocard", children: [
|
|
1990
|
+
!hideHeader && /* @__PURE__ */ jsxs10(Fragment2, { children: [
|
|
1991
|
+
showHeader ? /* @__PURE__ */ jsxs10("div", { className: "ss-w-bi-header", children: [
|
|
1992
|
+
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-header-left", children: vm.competition ? /* @__PURE__ */ jsxs10(Fragment2, { children: [
|
|
1921
1993
|
/* @__PURE__ */ jsx14(Crest2, { kind: "comp", url: vm.competitionCrest, name: vm.competition }),
|
|
1922
1994
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-comp", children: vm.competition })
|
|
1923
1995
|
] }) : null }),
|
|
1924
|
-
/* @__PURE__ */
|
|
1925
|
-
vm.isLive ? /* @__PURE__ */
|
|
1996
|
+
/* @__PURE__ */ jsxs10("span", { className: "ss-w-bi-header-right", children: [
|
|
1997
|
+
vm.isLive ? /* @__PURE__ */ jsxs10("span", { className: "ss-w-bi-live", children: [
|
|
1926
1998
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-live-dot", "aria-hidden": "true" }),
|
|
1927
1999
|
ui?.liveLabel ?? "Live"
|
|
1928
2000
|
] }) : null,
|
|
1929
|
-
kickoff ? /* @__PURE__ */
|
|
2001
|
+
kickoff ? /* @__PURE__ */ jsxs10("span", { className: "ss-w-bi-kick", children: [
|
|
1930
2002
|
kickoff.dayLabel,
|
|
1931
2003
|
" ",
|
|
1932
2004
|
kickoff.time
|
|
@@ -1941,8 +2013,8 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
1941
2013
|
) : null
|
|
1942
2014
|
] })
|
|
1943
2015
|
] }) : null,
|
|
1944
|
-
hasNamedTeams || vm.fixture || vm.market ? /* @__PURE__ */
|
|
1945
|
-
hasNamedTeams ? /* @__PURE__ */
|
|
2016
|
+
hasNamedTeams || vm.fixture || vm.market ? /* @__PURE__ */ jsxs10("div", { className: "ss-w-mo-sub", children: [
|
|
2017
|
+
hasNamedTeams ? /* @__PURE__ */ jsxs10("div", { className: "ss-w-bi-fixture", children: [
|
|
1946
2018
|
/* @__PURE__ */ jsx14(Crest2, { kind: "team", url: vm.homeCrest, name: vm.homeTeamName }),
|
|
1947
2019
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-team", children: vm.homeTeamName }),
|
|
1948
2020
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-vs", "aria-hidden": "true", children: "vs" }),
|
|
@@ -1952,11 +2024,11 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
1952
2024
|
vm.market ? /* @__PURE__ */ jsx14("span", { className: "ss-w-mo-market", children: vm.market }) : null
|
|
1953
2025
|
] }) : null
|
|
1954
2026
|
] }),
|
|
1955
|
-
/* @__PURE__ */
|
|
2027
|
+
/* @__PURE__ */ jsxs10("div", { className: "ss-w-mo-rows", children: [
|
|
1956
2028
|
vm.mainRows.map((row) => /* @__PURE__ */ jsx14(OddsRow, { vm, row, ui, slip, inSlipIds }, row.key)),
|
|
1957
2029
|
open ? vm.moreRows.map((row) => /* @__PURE__ */ jsx14(OddsRow, { vm, row, ui, slip, inSlipIds }, row.key)) : null
|
|
1958
2030
|
] }),
|
|
1959
|
-
vm.moreRows.length > 0 ? /* @__PURE__ */
|
|
2031
|
+
vm.moreRows.length > 0 ? /* @__PURE__ */ jsxs10("button", { type: "button", className: "ss-w-mo-more", "aria-expanded": open, onClick: () => setOpen((v) => !v), children: [
|
|
1960
2032
|
/* @__PURE__ */ jsx14("span", { children: open ? ui?.hideLines ?? "Hide lines" : `${ui?.moreLines ?? "More lines"} (${vm.moreRows.length})` }),
|
|
1961
2033
|
/* @__PURE__ */ jsx14("span", { className: `ss-w-mo-more-chev${open ? " ss-w-mo-more-chev-up" : ""}`, "aria-hidden": "true" })
|
|
1962
2034
|
] }) : null,
|
|
@@ -1970,7 +2042,7 @@ function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds, hideHeader, p
|
|
|
1970
2042
|
}
|
|
1971
2043
|
|
|
1972
2044
|
// src/components/OddsMovementCard.tsx
|
|
1973
|
-
import { Fragment as Fragment3, jsx as jsx15, jsxs as
|
|
2045
|
+
import { Fragment as Fragment3, jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1974
2046
|
function directionWord(vm, ui) {
|
|
1975
2047
|
if (vm.direction === "shortened") return ui?.oddsShortened ?? "shortened";
|
|
1976
2048
|
if (vm.direction === "drifted") return ui?.oddsDrifted ?? "drifted";
|
|
@@ -1981,8 +2053,8 @@ function OddsMovementCard({ vm, ui, monitor }) {
|
|
|
1981
2053
|
const drift = word ? `, ${word}` : "";
|
|
1982
2054
|
const aria = ui?.chartAria ? ui.chartAria(vm.opening, vm.current, word, vm.windowHours) : `Price movement over the last ${vm.windowHours} hours: opened at ${vm.opening}, currently ${vm.current}${drift}.`;
|
|
1983
2055
|
const showPin = !!monitor && vm.pinEnabled;
|
|
1984
|
-
return /* @__PURE__ */
|
|
1985
|
-
/* @__PURE__ */
|
|
2056
|
+
return /* @__PURE__ */ jsxs11("div", { className: "ss-w-omcard", children: [
|
|
2057
|
+
/* @__PURE__ */ jsxs11("div", { className: "ss-w-om-head", children: [
|
|
1986
2058
|
/* @__PURE__ */ jsx15("span", { className: "ss-w-om-market", children: vm.market }),
|
|
1987
2059
|
/* @__PURE__ */ jsx15("span", { className: "ss-w-om-tag", children: ui?.priceMovement ?? "Price movement" }),
|
|
1988
2060
|
showPin && ui ? /* @__PURE__ */ jsx15(
|
|
@@ -2002,13 +2074,13 @@ function OddsMovementCard({ vm, ui, monitor }) {
|
|
|
2002
2074
|
}
|
|
2003
2075
|
) : null
|
|
2004
2076
|
] }),
|
|
2005
|
-
vm.fixture ? /* @__PURE__ */
|
|
2077
|
+
vm.fixture ? /* @__PURE__ */ jsxs11("div", { className: "ss-w-om-fixture", children: [
|
|
2006
2078
|
/* @__PURE__ */ jsx15("span", { children: vm.fixture }),
|
|
2007
2079
|
vm.competition ? /* @__PURE__ */ jsx15("span", { className: "ss-w-om-comp", children: vm.competition }) : null
|
|
2008
2080
|
] }) : null,
|
|
2009
2081
|
/* @__PURE__ */ jsx15("div", { className: "ss-w-om-sel", children: vm.selection }),
|
|
2010
2082
|
/* @__PURE__ */ jsx15(OddsMovementBadge, { previous: vm.opening, current: vm.current, direction: vm.direction, ui }),
|
|
2011
|
-
vm.geometry === null ? /* @__PURE__ */ jsx15("div", { className: "ss-w-om-empty", children: vm.observationCount === 1 ? ui?.singlePricePoint ?? "Only one price recorded so far for this selection." : ui?.notEnoughHistory ?? "No price history recorded yet for this selection." }) : /* @__PURE__ */
|
|
2083
|
+
vm.geometry === null ? /* @__PURE__ */ jsx15("div", { className: "ss-w-om-empty", children: vm.observationCount === 1 ? ui?.singlePricePoint ?? "Only one price recorded so far for this selection." : ui?.notEnoughHistory ?? "No price history recorded yet for this selection." }) : /* @__PURE__ */ jsxs11(
|
|
2012
2084
|
"svg",
|
|
2013
2085
|
{
|
|
2014
2086
|
className: "ss-w-om-chart",
|
|
@@ -2017,26 +2089,26 @@ function OddsMovementCard({ vm, ui, monitor }) {
|
|
|
2017
2089
|
role: "img",
|
|
2018
2090
|
"aria-label": aria,
|
|
2019
2091
|
children: [
|
|
2020
|
-
vm.geometry.gridlines.map((g) => /* @__PURE__ */
|
|
2092
|
+
vm.geometry.gridlines.map((g) => /* @__PURE__ */ jsxs11("g", { children: [
|
|
2021
2093
|
/* @__PURE__ */ jsx15("line", { className: "ss-w-om-grid", x1: 40, y1: g.y, x2: CHART_VIEW_W - 8, y2: g.y }),
|
|
2022
2094
|
/* @__PURE__ */ jsx15("text", { className: "ss-w-om-ylab", x: 34, y: g.y + 3, textAnchor: "end", children: g.price.toFixed(2) })
|
|
2023
2095
|
] }, g.price)),
|
|
2024
2096
|
/* @__PURE__ */ jsx15("path", { className: "ss-w-om-line", d: vm.geometry.path, fill: "none" }),
|
|
2025
2097
|
vm.geometry.markers.map((m, i) => /* @__PURE__ */ jsx15("circle", { className: "ss-w-om-dot", cx: m.x, cy: m.y, r: 2.5 }, i)),
|
|
2026
|
-
ui?.chartTimeLabel ? /* @__PURE__ */
|
|
2098
|
+
ui?.chartTimeLabel ? /* @__PURE__ */ jsxs11(Fragment3, { children: [
|
|
2027
2099
|
/* @__PURE__ */ jsx15("text", { className: "ss-w-om-xlab", x: 40, y: CHART_VIEW_H - 8, textAnchor: "start", children: ui.chartTimeLabel(vm.geometry.startMs) }),
|
|
2028
2100
|
/* @__PURE__ */ jsx15("text", { className: "ss-w-om-xlab", x: CHART_VIEW_W - 8, y: CHART_VIEW_H - 8, textAnchor: "end", children: ui.chartTimeLabel(vm.geometry.endMs) })
|
|
2029
2101
|
] }) : /* @__PURE__ */ jsx15("text", { className: "ss-w-om-xlab", x: 40, y: CHART_VIEW_H - 8, children: ui?.movementWindow ? ui.movementWindow(vm.windowHours) : `Last ${vm.windowHours}h` })
|
|
2030
2102
|
]
|
|
2031
2103
|
}
|
|
2032
2104
|
),
|
|
2033
|
-
/* @__PURE__ */
|
|
2034
|
-
/* @__PURE__ */
|
|
2105
|
+
/* @__PURE__ */ jsxs11("div", { className: "ss-w-om-foot", children: [
|
|
2106
|
+
/* @__PURE__ */ jsxs11("span", { children: [
|
|
2035
2107
|
ui?.openingLabel ?? "Opening",
|
|
2036
2108
|
" ",
|
|
2037
2109
|
/* @__PURE__ */ jsx15("b", { children: vm.opening })
|
|
2038
2110
|
] }),
|
|
2039
|
-
/* @__PURE__ */
|
|
2111
|
+
/* @__PURE__ */ jsxs11("span", { children: [
|
|
2040
2112
|
ui?.currentLabel ?? "Current",
|
|
2041
2113
|
" ",
|
|
2042
2114
|
/* @__PURE__ */ jsx15("b", { children: vm.current })
|
|
@@ -2054,12 +2126,12 @@ function OddsMovementCardList({ cards, ui, monitor }) {
|
|
|
2054
2126
|
}
|
|
2055
2127
|
|
|
2056
2128
|
// src/components/ActionButtons.tsx
|
|
2057
|
-
import { Fragment as Fragment4, jsx as jsx16, jsxs as
|
|
2129
|
+
import { Fragment as Fragment4, jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
2058
2130
|
function ActionButtons({ actions, loading, disabled, onAct }) {
|
|
2059
2131
|
if (actions.length === 0 && !loading) return null;
|
|
2060
|
-
return /* @__PURE__ */
|
|
2132
|
+
return /* @__PURE__ */ jsxs12("div", { className: "ss-w-actions", children: [
|
|
2061
2133
|
actions.map((a, i) => /* @__PURE__ */ jsx16("button", { type: "button", className: "ss-w-abtn", disabled, onClick: () => onAct(a), children: a.label }, `${a.label}-${i}`)),
|
|
2062
|
-
actions.length === 0 && loading ? /* @__PURE__ */
|
|
2134
|
+
actions.length === 0 && loading ? /* @__PURE__ */ jsxs12(Fragment4, { children: [
|
|
2063
2135
|
/* @__PURE__ */ jsx16("span", { className: "ss-w-abtn-shimmer" }),
|
|
2064
2136
|
/* @__PURE__ */ jsx16("span", { className: "ss-w-abtn-shimmer" })
|
|
2065
2137
|
] }) : null
|
|
@@ -2067,22 +2139,22 @@ function ActionButtons({ actions, loading, disabled, onAct }) {
|
|
|
2067
2139
|
}
|
|
2068
2140
|
|
|
2069
2141
|
// src/components/dashboard/DashboardTile.tsx
|
|
2070
|
-
import { jsx as jsx17, jsxs as
|
|
2142
|
+
import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
2071
2143
|
var MAX_CRESTS = 3;
|
|
2072
2144
|
function DashboardTile({ tile, onTap }) {
|
|
2073
2145
|
const spanClass = tile.span === "full" ? "ss-w-dash-tile--full" : "ss-w-dash-tile--half";
|
|
2074
2146
|
const crests = (tile.imageUrls ?? []).slice(0, MAX_CRESTS);
|
|
2075
2147
|
const hasMeta = Boolean(tile.badgeText) || crests.length > 0;
|
|
2076
|
-
return /* @__PURE__ */
|
|
2148
|
+
return /* @__PURE__ */ jsxs13("button", { type: "button", className: `ss-w-dash-tile ${spanClass}`, onClick: onTap, children: [
|
|
2077
2149
|
/* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-icon", children: /* @__PURE__ */ jsx17(DashboardIcon, { name: tile.icon }) }),
|
|
2078
|
-
/* @__PURE__ */
|
|
2150
|
+
/* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-tile-body", children: [
|
|
2079
2151
|
/* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-title", children: tile.title }),
|
|
2080
2152
|
tile.subtitle ? /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-subtitle", children: tile.subtitle }) : null,
|
|
2081
2153
|
hasMeta ? (
|
|
2082
2154
|
// Badge + crests sit on their own row, below the title, instead of sharing the
|
|
2083
2155
|
// icon/chevron row -- at the half-span tile's ~180px width a nowrap badge alone
|
|
2084
2156
|
// (~70px) left the title column at ~22px and forced character-by-character wrapping.
|
|
2085
|
-
/* @__PURE__ */
|
|
2157
|
+
/* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-tile-meta", children: [
|
|
2086
2158
|
tile.badgeText ? /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-badge", children: tile.badgeText }) : null,
|
|
2087
2159
|
crests.length > 0 ? /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-crests", children: crests.map((url, i) => /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-crest", style: { backgroundImage: `url(${url})` }, "aria-hidden": "true" }, `${url}-${i}`)) }) : null
|
|
2088
2160
|
] })
|
|
@@ -2093,7 +2165,7 @@ function DashboardTile({ tile, onTap }) {
|
|
|
2093
2165
|
}
|
|
2094
2166
|
|
|
2095
2167
|
// src/components/dashboard/GreetingDashboard.tsx
|
|
2096
|
-
import { jsx as jsx18, jsxs as
|
|
2168
|
+
import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
2097
2169
|
var LAYOUT_CLASSES = {
|
|
2098
2170
|
market: "ss-w-dash--market",
|
|
2099
2171
|
goal: "ss-w-dash--goal",
|
|
@@ -2103,8 +2175,8 @@ function layoutClass(layout) {
|
|
|
2103
2175
|
return Object.prototype.hasOwnProperty.call(LAYOUT_CLASSES, layout) ? LAYOUT_CLASSES[layout] : LAYOUT_CLASSES.goal;
|
|
2104
2176
|
}
|
|
2105
2177
|
function GreetingDashboard({ dashboard, onTap }) {
|
|
2106
|
-
return /* @__PURE__ */
|
|
2107
|
-
/* @__PURE__ */
|
|
2178
|
+
return /* @__PURE__ */ jsxs14("div", { className: `ss-w-dash ${layoutClass(dashboard.layout)}`, children: [
|
|
2179
|
+
/* @__PURE__ */ jsxs14("div", { className: "ss-w-dash-head", children: [
|
|
2108
2180
|
/* @__PURE__ */ jsx18("span", { className: "ss-w-dash-title", children: dashboard.title }),
|
|
2109
2181
|
dashboard.subtitle ? /* @__PURE__ */ jsx18("span", { className: "ss-w-dash-subtitle", children: dashboard.subtitle }) : null
|
|
2110
2182
|
] }),
|
|
@@ -2114,7 +2186,7 @@ function GreetingDashboard({ dashboard, onTap }) {
|
|
|
2114
2186
|
}
|
|
2115
2187
|
|
|
2116
2188
|
// src/components/dashboard/FixtureCard.tsx
|
|
2117
|
-
import { Fragment as Fragment5, jsx as jsx19, jsxs as
|
|
2189
|
+
import { Fragment as Fragment5, jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
2118
2190
|
function teamFormResultClass(result) {
|
|
2119
2191
|
if (result === "W") return "ss-w-fandash-teamform-cell--win";
|
|
2120
2192
|
if (result === "L") return "ss-w-fandash-teamform-cell--loss";
|
|
@@ -2124,7 +2196,7 @@ function TeamFormCell({ m, subjectCrestUrl, subjectName }) {
|
|
|
2124
2196
|
const subjectCrest = /* @__PURE__ */ jsx19(Crest2, { url: subjectCrestUrl ?? void 0, name: subjectName, kind: "team" });
|
|
2125
2197
|
const opponentCrest = /* @__PURE__ */ jsx19(Crest2, { url: m.opponentCrestUrl ?? void 0, kind: "team" });
|
|
2126
2198
|
const score = m.teamIsHome ? `${m.teamScore} - ${m.oppScore}` : `${m.oppScore} - ${m.teamScore}`;
|
|
2127
|
-
return /* @__PURE__ */
|
|
2199
|
+
return /* @__PURE__ */ jsxs15("div", { className: `ss-w-fandash-teamform-cell ${teamFormResultClass(m.result)}`, children: [
|
|
2128
2200
|
m.teamIsHome ? subjectCrest : opponentCrest,
|
|
2129
2201
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-teamform-score", children: score }),
|
|
2130
2202
|
m.teamIsHome ? opponentCrest : subjectCrest
|
|
@@ -2140,59 +2212,59 @@ function teamFormRows(data) {
|
|
|
2140
2212
|
function FixtureCard({ card }) {
|
|
2141
2213
|
const { data } = card;
|
|
2142
2214
|
const h2h = data.h2H;
|
|
2143
|
-
return /* @__PURE__ */
|
|
2144
|
-
/* @__PURE__ */
|
|
2145
|
-
/* @__PURE__ */
|
|
2215
|
+
return /* @__PURE__ */ jsxs15(Fragment5, { children: [
|
|
2216
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-card ss-w-fandash-fixture", children: [
|
|
2217
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-eyebrow", children: [
|
|
2146
2218
|
card.title,
|
|
2147
2219
|
" \xB7 ",
|
|
2148
2220
|
data.competition
|
|
2149
2221
|
] }),
|
|
2150
|
-
/* @__PURE__ */
|
|
2151
|
-
/* @__PURE__ */
|
|
2222
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-fixture-teams", children: [
|
|
2223
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-fixture-team", children: [
|
|
2152
2224
|
/* @__PURE__ */ jsx19(Crest2, { url: data.homeCrestUrl ?? void 0, name: data.homeName, kind: "team" }),
|
|
2153
2225
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-fixture-name", children: data.homeName })
|
|
2154
2226
|
] }),
|
|
2155
2227
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-fixture-vs", children: "v" }),
|
|
2156
|
-
/* @__PURE__ */
|
|
2228
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-fixture-team ss-w-fandash-fixture-team--away", children: [
|
|
2157
2229
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-fixture-name", children: data.awayName }),
|
|
2158
2230
|
/* @__PURE__ */ jsx19(Crest2, { url: data.awayCrestUrl ?? void 0, name: data.awayName, kind: "team" })
|
|
2159
2231
|
] })
|
|
2160
2232
|
] }),
|
|
2161
|
-
/* @__PURE__ */
|
|
2233
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-fixture-meta", children: [
|
|
2162
2234
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-fixture-kickoff", children: data.kickoffLabel }),
|
|
2163
|
-
data.venue ? /* @__PURE__ */
|
|
2235
|
+
data.venue ? /* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-fixture-venue", children: [
|
|
2164
2236
|
" \xB7 ",
|
|
2165
2237
|
data.venue
|
|
2166
2238
|
] }) : null
|
|
2167
2239
|
] })
|
|
2168
2240
|
] }),
|
|
2169
|
-
/* @__PURE__ */
|
|
2241
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-card ss-w-fandash-lastfive", children: [
|
|
2170
2242
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-eyebrow", children: data.formLabel }),
|
|
2171
|
-
/* @__PURE__ */
|
|
2172
|
-
/* @__PURE__ */
|
|
2243
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-teamform-head", children: [
|
|
2244
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-teamform-head-team", children: [
|
|
2173
2245
|
/* @__PURE__ */ jsx19(Crest2, { url: data.homeCrestUrl ?? void 0, name: data.homeName, kind: "team" }),
|
|
2174
2246
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-teamform-head-name", children: data.homeName })
|
|
2175
2247
|
] }),
|
|
2176
|
-
/* @__PURE__ */
|
|
2248
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-teamform-head-team", children: [
|
|
2177
2249
|
/* @__PURE__ */ jsx19(Crest2, { url: data.awayCrestUrl ?? void 0, name: data.awayName, kind: "team" }),
|
|
2178
2250
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-teamform-head-name", children: data.awayName })
|
|
2179
2251
|
] })
|
|
2180
2252
|
] }),
|
|
2181
2253
|
/* @__PURE__ */ jsx19("div", { className: "ss-w-fandash-teamform-rows", children: teamFormRows(data) })
|
|
2182
2254
|
] }),
|
|
2183
|
-
h2h || data.fact ? /* @__PURE__ */
|
|
2184
|
-
h2h ? /* @__PURE__ */
|
|
2255
|
+
h2h || data.fact ? /* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-card ss-w-fandash-h2h", children: [
|
|
2256
|
+
h2h ? /* @__PURE__ */ jsxs15(Fragment5, { children: [
|
|
2185
2257
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-eyebrow", children: h2h.label }),
|
|
2186
|
-
/* @__PURE__ */
|
|
2187
|
-
/* @__PURE__ */
|
|
2258
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-split", children: [
|
|
2259
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-split-cell", children: [
|
|
2188
2260
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-value", children: h2h.wins }),
|
|
2189
2261
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-label", children: h2h.homeWinsLabel })
|
|
2190
2262
|
] }),
|
|
2191
|
-
/* @__PURE__ */
|
|
2263
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-split-cell", children: [
|
|
2192
2264
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-value", children: h2h.draws }),
|
|
2193
2265
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-label", children: h2h.drawsLabel })
|
|
2194
2266
|
] }),
|
|
2195
|
-
/* @__PURE__ */
|
|
2267
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-split-cell", children: [
|
|
2196
2268
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-value", children: h2h.losses }),
|
|
2197
2269
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-label", children: h2h.awayWinsLabel })
|
|
2198
2270
|
] })
|
|
@@ -2204,8 +2276,8 @@ function FixtureCard({ card }) {
|
|
|
2204
2276
|
}
|
|
2205
2277
|
|
|
2206
2278
|
// src/components/dashboard/CountdownCard.tsx
|
|
2207
|
-
import { Fragment as Fragment6, useEffect as
|
|
2208
|
-
import { jsx as jsx20, jsxs as
|
|
2279
|
+
import { Fragment as Fragment6, useEffect as useEffect7, useState as useState11 } from "react";
|
|
2280
|
+
import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
2209
2281
|
var DAY_MS = 864e5;
|
|
2210
2282
|
function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
2211
2283
|
const totalSeconds = Math.floor((kickoffUnix * 1e3 - nowMs) / 1e3);
|
|
@@ -2223,22 +2295,22 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
|
2223
2295
|
function CountdownCard({ card }) {
|
|
2224
2296
|
const { data } = card;
|
|
2225
2297
|
const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
|
|
2226
|
-
const [nowMs, setNowMs] =
|
|
2227
|
-
const [reduced] =
|
|
2298
|
+
const [nowMs, setNowMs] = useState11(() => Date.now());
|
|
2299
|
+
const [reduced] = useState11(
|
|
2228
2300
|
() => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
|
2229
2301
|
);
|
|
2230
2302
|
const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
|
|
2231
|
-
|
|
2303
|
+
useEffect7(() => {
|
|
2232
2304
|
if (reduced) return;
|
|
2233
2305
|
const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
|
|
2234
2306
|
return () => window.clearInterval(id);
|
|
2235
2307
|
}, [reduced, withinDay]);
|
|
2236
2308
|
const segments = remainingSegments(data.kickoffUnix, nowMs, withinDay && !reduced);
|
|
2237
|
-
return /* @__PURE__ */ jsx20("div", { className: "ss-w-fandash-card ss-w-fandash-countdown", children: /* @__PURE__ */
|
|
2309
|
+
return /* @__PURE__ */ jsx20("div", { className: "ss-w-fandash-card ss-w-fandash-countdown", children: /* @__PURE__ */ jsxs16("div", { className: "ss-w-fandash-countdown-top", children: [
|
|
2238
2310
|
/* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-eyebrow", children: card.title ?? "Kick-off in" }),
|
|
2239
|
-
segments ? /* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */
|
|
2311
|
+
segments ? /* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ jsxs16(Fragment6, { children: [
|
|
2240
2312
|
i > 0 ? /* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-countdown-colon", children: ":" }) : null,
|
|
2241
|
-
/* @__PURE__ */
|
|
2313
|
+
/* @__PURE__ */ jsxs16("span", { className: "ss-w-fandash-countdown-seg", children: [
|
|
2242
2314
|
/* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-countdown-value", children: s.value }),
|
|
2243
2315
|
/* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-countdown-unit", children: unitLabel[s.unit] })
|
|
2244
2316
|
] })
|
|
@@ -2247,11 +2319,11 @@ function CountdownCard({ card }) {
|
|
|
2247
2319
|
}
|
|
2248
2320
|
|
|
2249
2321
|
// src/components/dashboard/InjuriesCard.tsx
|
|
2250
|
-
import { useState as
|
|
2251
|
-
import { jsx as jsx21, jsxs as
|
|
2322
|
+
import { useState as useState12 } from "react";
|
|
2323
|
+
import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
2252
2324
|
var SHOWN = 3;
|
|
2253
2325
|
function ColHead({ name, crestUrl }) {
|
|
2254
|
-
return /* @__PURE__ */
|
|
2326
|
+
return /* @__PURE__ */ jsxs17("span", { className: "ss-w-fandash-injuries-col-head", children: [
|
|
2255
2327
|
/* @__PURE__ */ jsx21(Crest2, { url: crestUrl ?? void 0, name, kind: "team" }),
|
|
2256
2328
|
/* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injuries-col-head-name", children: name })
|
|
2257
2329
|
] });
|
|
@@ -2259,9 +2331,9 @@ function ColHead({ name, crestUrl }) {
|
|
|
2259
2331
|
function InjuryList({ rows, emptyLabel, limit }) {
|
|
2260
2332
|
if (rows.length === 0) return /* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injuries-empty", children: emptyLabel });
|
|
2261
2333
|
const shown = limit === void 0 ? rows : rows.slice(0, limit);
|
|
2262
|
-
return /* @__PURE__ */ jsx21("ul", { className: "ss-w-fandash-injury-list", children: shown.map((r, i) => /* @__PURE__ */
|
|
2334
|
+
return /* @__PURE__ */ jsx21("ul", { className: "ss-w-fandash-injury-list", children: shown.map((r, i) => /* @__PURE__ */ jsxs17("li", { className: "ss-w-fandash-injury-row", children: [
|
|
2263
2335
|
/* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injury-name", children: r.playerName }),
|
|
2264
|
-
/* @__PURE__ */
|
|
2336
|
+
/* @__PURE__ */ jsxs17("span", { className: "ss-w-fandash-injury-meta", children: [
|
|
2265
2337
|
/* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injury-status", children: r.status }),
|
|
2266
2338
|
r.injuryType ? /* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injury-type", children: r.injuryType }) : null,
|
|
2267
2339
|
r.expectedReturnLabel ? /* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injury-return", children: r.expectedReturnLabel }) : null
|
|
@@ -2270,20 +2342,20 @@ function InjuryList({ rows, emptyLabel, limit }) {
|
|
|
2270
2342
|
}
|
|
2271
2343
|
function InjuriesCard({ card, ui }) {
|
|
2272
2344
|
const { data } = card;
|
|
2273
|
-
const [expanded, setExpanded] =
|
|
2345
|
+
const [expanded, setExpanded] = useState12(false);
|
|
2274
2346
|
const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
|
|
2275
2347
|
const limit = expanded ? void 0 : SHOWN;
|
|
2276
2348
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
2277
2349
|
const showLess = ui?.showLess ?? "Show less";
|
|
2278
|
-
return /* @__PURE__ */
|
|
2350
|
+
return /* @__PURE__ */ jsxs17("div", { className: "ss-w-fandash-card ss-w-fandash-injuries", children: [
|
|
2279
2351
|
card.title ? /* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2280
|
-
/* @__PURE__ */
|
|
2281
|
-
/* @__PURE__ */
|
|
2352
|
+
/* @__PURE__ */ jsxs17("div", { className: "ss-w-fandash-injuries-cols", children: [
|
|
2353
|
+
/* @__PURE__ */ jsxs17("div", { className: "ss-w-fandash-injuries-col", children: [
|
|
2282
2354
|
/* @__PURE__ */ jsx21(ColHead, { name: data.oursName, crestUrl: data.oursCrestUrl }),
|
|
2283
2355
|
/* @__PURE__ */ jsx21(InjuryList, { rows: data.ours, emptyLabel: data.emptyLabel, limit })
|
|
2284
2356
|
] }),
|
|
2285
2357
|
/* @__PURE__ */ jsx21("div", { className: "ss-w-fandash-injuries-divider" }),
|
|
2286
|
-
/* @__PURE__ */
|
|
2358
|
+
/* @__PURE__ */ jsxs17("div", { className: "ss-w-fandash-injuries-col", children: [
|
|
2287
2359
|
/* @__PURE__ */ jsx21(ColHead, { name: data.theirsName, crestUrl: data.theirsCrestUrl }),
|
|
2288
2360
|
/* @__PURE__ */ jsx21(InjuryList, { rows: data.theirs, emptyLabel: data.emptyLabel, limit })
|
|
2289
2361
|
] })
|
|
@@ -2302,29 +2374,29 @@ function InjuriesCard({ card, ui }) {
|
|
|
2302
2374
|
}
|
|
2303
2375
|
|
|
2304
2376
|
// src/components/dashboard/ReasonToBetCard.tsx
|
|
2305
|
-
import { jsx as jsx22, jsxs as
|
|
2377
|
+
import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
2306
2378
|
function ReasonToBetCard({ card }) {
|
|
2307
|
-
return /* @__PURE__ */
|
|
2379
|
+
return /* @__PURE__ */ jsxs18("div", { className: "ss-w-fandash-card ss-w-fandash-reasons", children: [
|
|
2308
2380
|
card.title ? /* @__PURE__ */ jsx22("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2309
2381
|
/* @__PURE__ */ jsx22("ul", { className: "ss-w-fandash-reason-list", children: card.data.angles.map((angle, i) => /* @__PURE__ */ jsx22("li", { className: "ss-w-fandash-reason-item", children: angle }, `${angle}-${i}`)) })
|
|
2310
2382
|
] });
|
|
2311
2383
|
}
|
|
2312
2384
|
|
|
2313
2385
|
// src/components/dashboard/WhereToWatchCard.tsx
|
|
2314
|
-
import { jsx as jsx23, jsxs as
|
|
2386
|
+
import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
2315
2387
|
function WhereToWatchCard({ card }) {
|
|
2316
|
-
return /* @__PURE__ */
|
|
2388
|
+
return /* @__PURE__ */ jsxs19("div", { className: "ss-w-fandash-card ss-w-fandash-watch", children: [
|
|
2317
2389
|
card.title ? /* @__PURE__ */ jsx23("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2318
2390
|
/* @__PURE__ */ jsx23("span", { className: "ss-w-fandash-stations", children: card.data.stations.map((station, i) => /* @__PURE__ */ jsx23("span", { className: "ss-w-fandash-station-chip", children: station }, `${station}-${i}`)) })
|
|
2319
2391
|
] });
|
|
2320
2392
|
}
|
|
2321
2393
|
|
|
2322
2394
|
// src/components/dashboard/CongestedWeekCard.tsx
|
|
2323
|
-
import { jsx as jsx24, jsxs as
|
|
2395
|
+
import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
2324
2396
|
function CongestedWeekCard({ card, onTap }) {
|
|
2325
|
-
return /* @__PURE__ */
|
|
2397
|
+
return /* @__PURE__ */ jsxs20("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-congested", onClick: () => onTap(card), children: [
|
|
2326
2398
|
card.title ? /* @__PURE__ */ jsx24("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2327
|
-
/* @__PURE__ */ jsx24("div", { className: "ss-w-fandash-congested-grid", children: card.data.entries.map((entry, i) => /* @__PURE__ */
|
|
2399
|
+
/* @__PURE__ */ jsx24("div", { className: "ss-w-fandash-congested-grid", children: card.data.entries.map((entry, i) => /* @__PURE__ */ jsxs20("span", { className: "ss-w-fandash-congested-cell", children: [
|
|
2328
2400
|
/* @__PURE__ */ jsx24("span", { className: "ss-w-fandash-congested-day", children: entry.dayLabel }),
|
|
2329
2401
|
/* @__PURE__ */ jsx24("span", { className: "ss-w-fandash-congested-opponent", children: entry.opponent }),
|
|
2330
2402
|
/* @__PURE__ */ jsx24("span", { className: "ss-w-fandash-congested-comp", children: entry.competition }),
|
|
@@ -2335,10 +2407,10 @@ function CongestedWeekCard({ card, onTap }) {
|
|
|
2335
2407
|
}
|
|
2336
2408
|
|
|
2337
2409
|
// src/components/dashboard/TransfersCard.tsx
|
|
2338
|
-
import { jsx as jsx25, jsxs as
|
|
2410
|
+
import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
2339
2411
|
function TransferList({ rows }) {
|
|
2340
2412
|
if (rows.length === 0) return /* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfers-empty", children: "None" });
|
|
2341
|
-
return /* @__PURE__ */ jsx25("ul", { className: "ss-w-fandash-transfer-list", children: rows.map((r, i) => /* @__PURE__ */
|
|
2413
|
+
return /* @__PURE__ */ jsx25("ul", { className: "ss-w-fandash-transfer-list", children: rows.map((r, i) => /* @__PURE__ */ jsxs21("li", { className: "ss-w-fandash-transfer-row", children: [
|
|
2342
2414
|
/* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfer-name", children: r.playerName }),
|
|
2343
2415
|
/* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfer-club", children: r.otherClub }),
|
|
2344
2416
|
r.type ? /* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfer-type", children: r.type }) : null
|
|
@@ -2346,14 +2418,14 @@ function TransferList({ rows }) {
|
|
|
2346
2418
|
}
|
|
2347
2419
|
function TransfersCard({ card }) {
|
|
2348
2420
|
const { data } = card;
|
|
2349
|
-
return /* @__PURE__ */
|
|
2421
|
+
return /* @__PURE__ */ jsxs21("div", { className: "ss-w-fandash-card ss-w-fandash-transfers", children: [
|
|
2350
2422
|
card.title ? /* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2351
|
-
/* @__PURE__ */
|
|
2352
|
-
/* @__PURE__ */
|
|
2423
|
+
/* @__PURE__ */ jsxs21("div", { className: "ss-w-fandash-transfers-cols", children: [
|
|
2424
|
+
/* @__PURE__ */ jsxs21("div", { className: "ss-w-fandash-transfers-col", children: [
|
|
2353
2425
|
/* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfers-col-head", children: "In" }),
|
|
2354
2426
|
/* @__PURE__ */ jsx25(TransferList, { rows: data.in })
|
|
2355
2427
|
] }),
|
|
2356
|
-
/* @__PURE__ */
|
|
2428
|
+
/* @__PURE__ */ jsxs21("div", { className: "ss-w-fandash-transfers-col", children: [
|
|
2357
2429
|
/* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfers-col-head", children: "Out" }),
|
|
2358
2430
|
/* @__PURE__ */ jsx25(TransferList, { rows: data.out })
|
|
2359
2431
|
] })
|
|
@@ -2362,11 +2434,11 @@ function TransfersCard({ card }) {
|
|
|
2362
2434
|
}
|
|
2363
2435
|
|
|
2364
2436
|
// src/components/dashboard/LinksCard.tsx
|
|
2365
|
-
import { jsx as jsx26, jsxs as
|
|
2437
|
+
import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
2366
2438
|
function LinksCard({ card }) {
|
|
2367
|
-
return /* @__PURE__ */
|
|
2439
|
+
return /* @__PURE__ */ jsxs22("div", { className: "ss-w-fandash-card ss-w-fandash-links", children: [
|
|
2368
2440
|
card.title ? /* @__PURE__ */ jsx26("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2369
|
-
/* @__PURE__ */ jsx26("div", { className: "ss-w-fandash-link-grid", children: card.data.links.map((link, i) => /* @__PURE__ */
|
|
2441
|
+
/* @__PURE__ */ jsx26("div", { className: "ss-w-fandash-link-grid", children: card.data.links.map((link, i) => /* @__PURE__ */ jsxs22("a", { className: "ss-w-fandash-link-tile", href: link.url, target: "_blank", rel: "noopener noreferrer", children: [
|
|
2370
2442
|
/* @__PURE__ */ jsx26("span", { className: "ss-w-fandash-link-label", children: link.label }),
|
|
2371
2443
|
/* @__PURE__ */ jsx26("span", { className: "ss-w-fandash-link-chevron", children: /* @__PURE__ */ jsx26(ChevronIcon, {}) })
|
|
2372
2444
|
] }, `${link.url}-${i}`)) })
|
|
@@ -2374,8 +2446,8 @@ function LinksCard({ card }) {
|
|
|
2374
2446
|
}
|
|
2375
2447
|
|
|
2376
2448
|
// src/components/dashboard/PostMatchResultCard.tsx
|
|
2377
|
-
import { useState as
|
|
2378
|
-
import { jsx as jsx27, jsxs as
|
|
2449
|
+
import { useState as useState13 } from "react";
|
|
2450
|
+
import { jsx as jsx27, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
2379
2451
|
function initials3(name) {
|
|
2380
2452
|
return name.trim().slice(0, 3).toUpperCase();
|
|
2381
2453
|
}
|
|
@@ -2384,7 +2456,7 @@ function PostMatchCrest({
|
|
|
2384
2456
|
name,
|
|
2385
2457
|
side
|
|
2386
2458
|
}) {
|
|
2387
|
-
const [failed, setFailed] =
|
|
2459
|
+
const [failed, setFailed] = useState13(false);
|
|
2388
2460
|
const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
|
|
2389
2461
|
if (url && !failed) {
|
|
2390
2462
|
return /* @__PURE__ */ jsx27("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -2395,17 +2467,17 @@ function PostMatchResultCard({ card }) {
|
|
|
2395
2467
|
const { data } = card;
|
|
2396
2468
|
const homeWon = data.homeScore >= data.awayScore;
|
|
2397
2469
|
const awayWon = data.awayScore >= data.homeScore;
|
|
2398
|
-
return /* @__PURE__ */
|
|
2399
|
-
/* @__PURE__ */
|
|
2470
|
+
return /* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-card ss-w-fandash-postmatch-result", children: [
|
|
2471
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-top", children: [
|
|
2400
2472
|
card.title ? /* @__PURE__ */ jsx27("span", { className: "ss-w-fandash-postmatch-pill", children: card.title }) : null,
|
|
2401
2473
|
/* @__PURE__ */ jsx27("span", { className: `ss-w-fandash-postmatch-tag ss-w-fandash-postmatch-tag--${data.outcome}`, children: data.resultLabel })
|
|
2402
2474
|
] }),
|
|
2403
|
-
/* @__PURE__ */
|
|
2404
|
-
/* @__PURE__ */
|
|
2475
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-main", children: [
|
|
2476
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-side ss-w-fandash-postmatch-side--home", children: [
|
|
2405
2477
|
/* @__PURE__ */ jsx27(PostMatchCrest, { url: data.homeCrestUrl, name: data.homeName, side: "home" }),
|
|
2406
2478
|
/* @__PURE__ */ jsx27("span", { className: "ss-w-fandash-postmatch-team-name", children: data.homeName })
|
|
2407
2479
|
] }),
|
|
2408
|
-
/* @__PURE__ */
|
|
2480
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-score-main", children: [
|
|
2409
2481
|
/* @__PURE__ */ jsx27(
|
|
2410
2482
|
"span",
|
|
2411
2483
|
{
|
|
@@ -2422,12 +2494,12 @@ function PostMatchResultCard({ card }) {
|
|
|
2422
2494
|
}
|
|
2423
2495
|
)
|
|
2424
2496
|
] }),
|
|
2425
|
-
/* @__PURE__ */
|
|
2497
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-side ss-w-fandash-postmatch-side--away", children: [
|
|
2426
2498
|
/* @__PURE__ */ jsx27(PostMatchCrest, { url: data.awayCrestUrl, name: data.awayName, side: "away" }),
|
|
2427
2499
|
/* @__PURE__ */ jsx27("span", { className: "ss-w-fandash-postmatch-team-name", children: data.awayName })
|
|
2428
2500
|
] })
|
|
2429
2501
|
] }),
|
|
2430
|
-
/* @__PURE__ */
|
|
2502
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-meta", children: [
|
|
2431
2503
|
data.kickoffLabel,
|
|
2432
2504
|
data.competition ? ` \xB7 ${data.competition}` : ""
|
|
2433
2505
|
] })
|
|
@@ -2435,11 +2507,11 @@ function PostMatchResultCard({ card }) {
|
|
|
2435
2507
|
}
|
|
2436
2508
|
|
|
2437
2509
|
// src/components/dashboard/PostMatchGoalsCard.tsx
|
|
2438
|
-
import { jsx as jsx28, jsxs as
|
|
2510
|
+
import { jsx as jsx28, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
2439
2511
|
function PostMatchGoalsCard({ card, onTap }) {
|
|
2440
|
-
return /* @__PURE__ */
|
|
2512
|
+
return /* @__PURE__ */ jsxs24("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-postmatch-goals", onClick: () => onTap(card), children: [
|
|
2441
2513
|
card.title ? /* @__PURE__ */ jsx28("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2442
|
-
/* @__PURE__ */ jsx28("ul", { className: "ss-w-fandash-postmatch-goal-list", children: card.data.goals.map((g, i) => /* @__PURE__ */
|
|
2514
|
+
/* @__PURE__ */ jsx28("ul", { className: "ss-w-fandash-postmatch-goal-list", children: card.data.goals.map((g, i) => /* @__PURE__ */ jsxs24("li", { className: g.scoredByClub ? "ss-w-fandash-postmatch-goal ss-w-fandash-postmatch-goal--club" : "ss-w-fandash-postmatch-goal", children: [
|
|
2443
2515
|
/* @__PURE__ */ jsx28("span", { className: "ss-w-fandash-postmatch-goal-ball" }),
|
|
2444
2516
|
/* @__PURE__ */ jsx28("span", { children: g.text })
|
|
2445
2517
|
] }, `${g.text}-${i}`)) }),
|
|
@@ -2448,7 +2520,7 @@ function PostMatchGoalsCard({ card, onTap }) {
|
|
|
2448
2520
|
}
|
|
2449
2521
|
|
|
2450
2522
|
// src/components/dashboard/PostMatchStatsCard.tsx
|
|
2451
|
-
import { jsx as jsx29, jsxs as
|
|
2523
|
+
import { jsx as jsx29, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
2452
2524
|
function splitWidths(homeNum, awayNum) {
|
|
2453
2525
|
const total = homeNum + awayNum;
|
|
2454
2526
|
if (total <= 0) return { home: "50%", away: "50%" };
|
|
@@ -2457,7 +2529,7 @@ function splitWidths(homeNum, awayNum) {
|
|
|
2457
2529
|
}
|
|
2458
2530
|
function PostMatchStatsCard({ card, onTap }) {
|
|
2459
2531
|
const { data } = card;
|
|
2460
|
-
return /* @__PURE__ */
|
|
2532
|
+
return /* @__PURE__ */ jsxs25("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-postmatch-stats", onClick: () => onTap(card), children: [
|
|
2461
2533
|
card.title ? /* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2462
2534
|
/* @__PURE__ */ jsx29("div", { className: "ss-w-fandash-postmatch-stat-rows", children: data.rows.map((r, i) => {
|
|
2463
2535
|
const leftValue = data.clubIsHome ? r.clubValue : r.oppValue;
|
|
@@ -2465,24 +2537,24 @@ function PostMatchStatsCard({ card, onTap }) {
|
|
|
2465
2537
|
const homeNum = data.clubIsHome ? r.clubNum : r.oppNum;
|
|
2466
2538
|
const awayNum = data.clubIsHome ? r.oppNum : r.clubNum;
|
|
2467
2539
|
const { home, away } = splitWidths(homeNum, awayNum);
|
|
2468
|
-
return /* @__PURE__ */
|
|
2469
|
-
/* @__PURE__ */
|
|
2540
|
+
return /* @__PURE__ */ jsxs25("div", { className: "ss-w-fandash-postmatch-stat", children: [
|
|
2541
|
+
/* @__PURE__ */ jsxs25("div", { className: "ss-w-fandash-postmatch-stat-row", children: [
|
|
2470
2542
|
/* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-postmatch-stat-value ss-w-fandash-postmatch-stat-value--home", children: leftValue }),
|
|
2471
2543
|
/* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-postmatch-stat-label", children: r.label }),
|
|
2472
2544
|
/* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-postmatch-stat-value ss-w-fandash-postmatch-stat-value--away", children: rightValue })
|
|
2473
2545
|
] }),
|
|
2474
|
-
/* @__PURE__ */
|
|
2546
|
+
/* @__PURE__ */ jsxs25("div", { className: "ss-w-fandash-postmatch-stat-bar", children: [
|
|
2475
2547
|
/* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-postmatch-stat-bar-home", style: { width: home } }),
|
|
2476
2548
|
/* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-postmatch-stat-bar-away", style: { width: away } })
|
|
2477
2549
|
] })
|
|
2478
2550
|
] }, `${r.label}-${i}`);
|
|
2479
2551
|
}) }),
|
|
2480
|
-
data.rows.length > 0 ? /* @__PURE__ */
|
|
2481
|
-
/* @__PURE__ */
|
|
2552
|
+
data.rows.length > 0 ? /* @__PURE__ */ jsxs25("div", { className: "ss-w-fandash-postmatch-legend", children: [
|
|
2553
|
+
/* @__PURE__ */ jsxs25("span", { className: "ss-w-fandash-postmatch-legend-item", children: [
|
|
2482
2554
|
/* @__PURE__ */ jsx29("i", { className: "ss-w-fandash-postmatch-legend-swatch ss-w-fandash-postmatch-legend-swatch--home" }),
|
|
2483
2555
|
data.homeName
|
|
2484
2556
|
] }),
|
|
2485
|
-
/* @__PURE__ */
|
|
2557
|
+
/* @__PURE__ */ jsxs25("span", { className: "ss-w-fandash-postmatch-legend-item", children: [
|
|
2486
2558
|
/* @__PURE__ */ jsx29("i", { className: "ss-w-fandash-postmatch-legend-swatch ss-w-fandash-postmatch-legend-swatch--away" }),
|
|
2487
2559
|
data.awayName
|
|
2488
2560
|
] })
|
|
@@ -2492,7 +2564,7 @@ function PostMatchStatsCard({ card, onTap }) {
|
|
|
2492
2564
|
}
|
|
2493
2565
|
|
|
2494
2566
|
// src/components/dashboard/PostMatchTopPerformerCard.tsx
|
|
2495
|
-
import { jsx as jsx30, jsxs as
|
|
2567
|
+
import { jsx as jsx30, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
2496
2568
|
function initials4(playerName) {
|
|
2497
2569
|
const words = playerName.trim().split(/\s+/).filter(Boolean);
|
|
2498
2570
|
if (words.length === 0) return "?";
|
|
@@ -2502,9 +2574,9 @@ function initials4(playerName) {
|
|
|
2502
2574
|
}
|
|
2503
2575
|
function PostMatchTopPerformerCard({ card, onTap }) {
|
|
2504
2576
|
const { data } = card;
|
|
2505
|
-
return /* @__PURE__ */
|
|
2577
|
+
return /* @__PURE__ */ jsxs26("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-postmatch-performer", onClick: () => onTap(card), children: [
|
|
2506
2578
|
card.title ? /* @__PURE__ */ jsx30("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2507
|
-
/* @__PURE__ */
|
|
2579
|
+
/* @__PURE__ */ jsxs26("div", { className: "ss-w-fandash-postmatch-perf-row", children: [
|
|
2508
2580
|
/* @__PURE__ */ jsx30("span", { className: "ss-w-fandash-postmatch-perf-avatar", "aria-hidden": "true", children: initials4(data.playerName) }),
|
|
2509
2581
|
/* @__PURE__ */ jsx30("span", { className: "ss-w-fandash-postmatch-perf-name", children: data.playerName }),
|
|
2510
2582
|
/* @__PURE__ */ jsx30("span", { className: "ss-w-fandash-postmatch-perf-rating", children: data.ratingLabel })
|
|
@@ -2514,22 +2586,22 @@ function PostMatchTopPerformerCard({ card, onTap }) {
|
|
|
2514
2586
|
}
|
|
2515
2587
|
|
|
2516
2588
|
// src/components/dashboard/PostMatchNextCard.tsx
|
|
2517
|
-
import { jsx as jsx31, jsxs as
|
|
2589
|
+
import { jsx as jsx31, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
2518
2590
|
function PostMatchNextCard({ card }) {
|
|
2519
2591
|
const { data } = card;
|
|
2520
|
-
return /* @__PURE__ */
|
|
2592
|
+
return /* @__PURE__ */ jsxs27("div", { className: "ss-w-fandash-card ss-w-fandash-postmatch-next", children: [
|
|
2521
2593
|
card.title ? /* @__PURE__ */ jsx31("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2522
2594
|
/* @__PURE__ */ jsx31("div", { className: "ss-w-fandash-postmatch-next-row", children: /* @__PURE__ */ jsx31("span", { className: "ss-w-fandash-postmatch-next-when", children: data.whenLabel }) })
|
|
2523
2595
|
] });
|
|
2524
2596
|
}
|
|
2525
2597
|
|
|
2526
2598
|
// src/components/dashboard/RestingNextCard.tsx
|
|
2527
|
-
import { jsx as jsx32, jsxs as
|
|
2599
|
+
import { jsx as jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
2528
2600
|
function RestingNextCard({ card, onTap }) {
|
|
2529
2601
|
const { data } = card;
|
|
2530
|
-
return /* @__PURE__ */
|
|
2602
|
+
return /* @__PURE__ */ jsxs28("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-resting-next", onClick: () => onTap(card), children: [
|
|
2531
2603
|
card.title ? /* @__PURE__ */ jsx32("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2532
|
-
/* @__PURE__ */
|
|
2604
|
+
/* @__PURE__ */ jsxs28("div", { className: "ss-w-fandash-resting-next-row", children: [
|
|
2533
2605
|
/* @__PURE__ */ jsx32("span", { className: "ss-w-fandash-resting-next-when", children: data.whenLabel }),
|
|
2534
2606
|
data.competition ? /* @__PURE__ */ jsx32("span", { className: "ss-w-fandash-resting-next-competition", children: data.competition }) : null
|
|
2535
2607
|
] }),
|
|
@@ -2538,12 +2610,12 @@ function RestingNextCard({ card, onTap }) {
|
|
|
2538
2610
|
}
|
|
2539
2611
|
|
|
2540
2612
|
// src/components/dashboard/RestingStandingsCard.tsx
|
|
2541
|
-
import { jsx as jsx33, jsxs as
|
|
2613
|
+
import { jsx as jsx33, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
2542
2614
|
function RestingStandingsCard({ card, onTap }) {
|
|
2543
2615
|
const { data } = card;
|
|
2544
|
-
return /* @__PURE__ */
|
|
2616
|
+
return /* @__PURE__ */ jsxs29("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-resting-standings", onClick: () => onTap(card), children: [
|
|
2545
2617
|
card.title ? /* @__PURE__ */ jsx33("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2546
|
-
/* @__PURE__ */
|
|
2618
|
+
/* @__PURE__ */ jsxs29("div", { className: "ss-w-fandash-resting-standings-row", children: [
|
|
2547
2619
|
/* @__PURE__ */ jsx33("span", { className: "ss-w-fandash-resting-standings-position", children: data.positionLabel }),
|
|
2548
2620
|
/* @__PURE__ */ jsx33("span", { className: "ss-w-fandash-resting-standings-record", children: data.recordLabel })
|
|
2549
2621
|
] }),
|
|
@@ -2552,12 +2624,12 @@ function RestingStandingsCard({ card, onTap }) {
|
|
|
2552
2624
|
}
|
|
2553
2625
|
|
|
2554
2626
|
// src/components/dashboard/RestingSeasonCard.tsx
|
|
2555
|
-
import { jsx as jsx34, jsxs as
|
|
2627
|
+
import { jsx as jsx34, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2556
2628
|
function RestingSeasonCard({ card, onTap }) {
|
|
2557
2629
|
const { data } = card;
|
|
2558
|
-
return /* @__PURE__ */
|
|
2630
|
+
return /* @__PURE__ */ jsxs30("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-resting-season", onClick: () => onTap(card), children: [
|
|
2559
2631
|
card.title ? /* @__PURE__ */ jsx34("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2560
|
-
/* @__PURE__ */
|
|
2632
|
+
/* @__PURE__ */ jsxs30("div", { className: "ss-w-fandash-resting-season-rows", children: [
|
|
2561
2633
|
data.scorerLabel ? /* @__PURE__ */ jsx34("span", { className: "ss-w-fandash-resting-season-row", children: data.scorerLabel }) : null,
|
|
2562
2634
|
data.playerLabel ? /* @__PURE__ */ jsx34("span", { className: "ss-w-fandash-resting-season-row", children: data.playerLabel }) : null,
|
|
2563
2635
|
/* @__PURE__ */ jsx34("span", { className: "ss-w-fandash-resting-season-row", children: data.tallyLabel })
|
|
@@ -2567,7 +2639,7 @@ function RestingSeasonCard({ card, onTap }) {
|
|
|
2567
2639
|
}
|
|
2568
2640
|
|
|
2569
2641
|
// src/components/dashboard/RestingFormCard.tsx
|
|
2570
|
-
import { jsx as jsx35, jsxs as
|
|
2642
|
+
import { jsx as jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2571
2643
|
function resultClass(result) {
|
|
2572
2644
|
const upper = result.toUpperCase();
|
|
2573
2645
|
if (upper === "W") return "ss-w-fandash-form-pill--win";
|
|
@@ -2576,17 +2648,17 @@ function resultClass(result) {
|
|
|
2576
2648
|
}
|
|
2577
2649
|
function RestingFormCard({ card }) {
|
|
2578
2650
|
const { data } = card;
|
|
2579
|
-
return /* @__PURE__ */
|
|
2651
|
+
return /* @__PURE__ */ jsxs31("div", { className: "ss-w-fandash-card ss-w-fandash-resting-form", children: [
|
|
2580
2652
|
card.title ? /* @__PURE__ */ jsx35("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2581
2653
|
/* @__PURE__ */ jsx35("span", { className: "ss-w-fandash-form", children: data.letters.map((r, i) => /* @__PURE__ */ jsx35("span", { className: `ss-w-fandash-form-pill ${resultClass(r)}`, children: r }, `${r}-${i}`)) })
|
|
2582
2654
|
] });
|
|
2583
2655
|
}
|
|
2584
2656
|
|
|
2585
2657
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
2586
|
-
import { useRef as
|
|
2658
|
+
import { useRef as useRef6, useState as useState15 } from "react";
|
|
2587
2659
|
|
|
2588
2660
|
// src/useLiveClock.ts
|
|
2589
|
-
import { useEffect as
|
|
2661
|
+
import { useEffect as useEffect8, useState as useState14 } from "react";
|
|
2590
2662
|
var TICK_MS = 6e4;
|
|
2591
2663
|
var MAX_LIVE_TICK_MINUTES = 15;
|
|
2592
2664
|
function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
@@ -2595,10 +2667,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
|
2595
2667
|
return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
|
|
2596
2668
|
}
|
|
2597
2669
|
function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
2598
|
-
const [displayMinute, setDisplayMinute] =
|
|
2670
|
+
const [displayMinute, setDisplayMinute] = useState14(
|
|
2599
2671
|
() => computeDisplayMinute(minute, clockRunning, receivedAtMs)
|
|
2600
2672
|
);
|
|
2601
|
-
|
|
2673
|
+
useEffect8(() => {
|
|
2602
2674
|
setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
|
|
2603
2675
|
if (!clockRunning) return;
|
|
2604
2676
|
const id = window.setInterval(() => {
|
|
@@ -2610,12 +2682,12 @@ function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
|
2610
2682
|
}
|
|
2611
2683
|
|
|
2612
2684
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
2613
|
-
import { jsx as jsx36, jsxs as
|
|
2685
|
+
import { jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
2614
2686
|
function initials5(name) {
|
|
2615
2687
|
return name.trim().slice(0, 3).toUpperCase();
|
|
2616
2688
|
}
|
|
2617
2689
|
function LiveCrest({ url, name, side }) {
|
|
2618
|
-
const [failed, setFailed] =
|
|
2690
|
+
const [failed, setFailed] = useState15(false);
|
|
2619
2691
|
const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
|
|
2620
2692
|
if (url && !failed) {
|
|
2621
2693
|
return /* @__PURE__ */ jsx36("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -2634,39 +2706,39 @@ function LiveScoreCard({
|
|
|
2634
2706
|
}) {
|
|
2635
2707
|
const { data } = card;
|
|
2636
2708
|
const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
|
|
2637
|
-
const seedRef =
|
|
2709
|
+
const seedRef = useRef6(null);
|
|
2638
2710
|
if (!seedRef.current || seedRef.current.key !== seedKey) {
|
|
2639
2711
|
seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
|
|
2640
2712
|
}
|
|
2641
2713
|
const displayMinute = useLiveClock(data.minute, data.clockRunning, seedRef.current.receivedAtMs);
|
|
2642
2714
|
const minuteSuffix = data.minuteLabel.replace(/^\d+/, "");
|
|
2643
2715
|
const scorers = scorersLine(goalEvents);
|
|
2644
|
-
return /* @__PURE__ */
|
|
2716
|
+
return /* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-card ss-w-fandash-live-score", children: [
|
|
2645
2717
|
card.title ? /* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2646
|
-
/* @__PURE__ */
|
|
2647
|
-
/* @__PURE__ */
|
|
2718
|
+
/* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-top", children: [
|
|
2719
|
+
/* @__PURE__ */ jsxs32("span", { className: "ss-w-fandash-live-pill", children: [
|
|
2648
2720
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-dot", "aria-hidden": "true" }),
|
|
2649
2721
|
data.statusLabel
|
|
2650
2722
|
] }),
|
|
2651
2723
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-minute", children: `${displayMinute}${minuteSuffix}` }),
|
|
2652
2724
|
data.competition ? /* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-competition", children: data.competition }) : null
|
|
2653
2725
|
] }),
|
|
2654
|
-
/* @__PURE__ */
|
|
2655
|
-
/* @__PURE__ */
|
|
2726
|
+
/* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-main", children: [
|
|
2727
|
+
/* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-side ss-w-fandash-live-side--home", children: [
|
|
2656
2728
|
/* @__PURE__ */ jsx36(LiveCrest, { url: data.homeCrestUrl, name: data.homeName, side: "home" }),
|
|
2657
2729
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-team-name", children: data.homeName })
|
|
2658
2730
|
] }),
|
|
2659
|
-
/* @__PURE__ */
|
|
2731
|
+
/* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-score-main", children: [
|
|
2660
2732
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-score-value", children: data.homeScore }),
|
|
2661
2733
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-score-sep", children: "\u2013" }),
|
|
2662
2734
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-score-value", children: data.awayScore })
|
|
2663
2735
|
] }),
|
|
2664
|
-
/* @__PURE__ */
|
|
2736
|
+
/* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-side ss-w-fandash-live-side--away", children: [
|
|
2665
2737
|
/* @__PURE__ */ jsx36(LiveCrest, { url: data.awayCrestUrl, name: data.awayName, side: "away" }),
|
|
2666
2738
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-team-name", children: data.awayName })
|
|
2667
2739
|
] })
|
|
2668
2740
|
] }),
|
|
2669
|
-
scorers ? /* @__PURE__ */
|
|
2741
|
+
scorers ? /* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-scorers", children: [
|
|
2670
2742
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-scorers-icon", "aria-hidden": "true", children: "\u26BD" }),
|
|
2671
2743
|
scorers
|
|
2672
2744
|
] }) : null
|
|
@@ -2674,8 +2746,8 @@ function LiveScoreCard({
|
|
|
2674
2746
|
}
|
|
2675
2747
|
|
|
2676
2748
|
// src/components/dashboard/LiveTimelineCard.tsx
|
|
2677
|
-
import { useState as
|
|
2678
|
-
import { jsx as jsx37, jsxs as
|
|
2749
|
+
import { useState as useState16 } from "react";
|
|
2750
|
+
import { jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
2679
2751
|
var SHOWN2 = 3;
|
|
2680
2752
|
function EventIcon({ type }) {
|
|
2681
2753
|
if (type === "goal") {
|
|
@@ -2691,9 +2763,9 @@ function EventIcon({ type }) {
|
|
|
2691
2763
|
}
|
|
2692
2764
|
function EventLabel({ e }) {
|
|
2693
2765
|
if (e.type === "sub") {
|
|
2694
|
-
return /* @__PURE__ */
|
|
2766
|
+
return /* @__PURE__ */ jsxs33("span", { className: "ss-w-fandash-live-tl-who", children: [
|
|
2695
2767
|
e.player ?? e.text,
|
|
2696
|
-
e.playerOff ? /* @__PURE__ */
|
|
2768
|
+
e.playerOff ? /* @__PURE__ */ jsxs33("span", { className: "ss-w-fandash-live-tl-off", children: [
|
|
2697
2769
|
" for ",
|
|
2698
2770
|
e.playerOff
|
|
2699
2771
|
] }) : null
|
|
@@ -2707,8 +2779,8 @@ function EventRow({ e }) {
|
|
|
2707
2779
|
e.side === "home" ? "ss-w-fandash-live-tl-ev--home" : "ss-w-fandash-live-tl-ev--away",
|
|
2708
2780
|
e.type === "goal" ? "ss-w-fandash-live-tl-ev--goal" : ""
|
|
2709
2781
|
].filter(Boolean).join(" ");
|
|
2710
|
-
return /* @__PURE__ */
|
|
2711
|
-
/* @__PURE__ */
|
|
2782
|
+
return /* @__PURE__ */ jsxs33("div", { className: cls, children: [
|
|
2783
|
+
/* @__PURE__ */ jsxs33("span", { className: "ss-w-fandash-live-tl-txt", children: [
|
|
2712
2784
|
/* @__PURE__ */ jsx37(EventLabel, { e }),
|
|
2713
2785
|
/* @__PURE__ */ jsx37(EventIcon, { type: e.type })
|
|
2714
2786
|
] }),
|
|
@@ -2716,7 +2788,7 @@ function EventRow({ e }) {
|
|
|
2716
2788
|
] });
|
|
2717
2789
|
}
|
|
2718
2790
|
function LiveTimelineCard({ card, ui }) {
|
|
2719
|
-
const [expanded, setExpanded] =
|
|
2791
|
+
const [expanded, setExpanded] = useState16(false);
|
|
2720
2792
|
const events = card.data.events;
|
|
2721
2793
|
if (!events || events.length === 0) return null;
|
|
2722
2794
|
const sorted = [...events].sort((a, b) => b.minute - a.minute);
|
|
@@ -2724,7 +2796,7 @@ function LiveTimelineCard({ card, ui }) {
|
|
|
2724
2796
|
const shown = expanded ? sorted : sorted.slice(0, SHOWN2);
|
|
2725
2797
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
2726
2798
|
const showLess = ui?.showLess ?? "Show less";
|
|
2727
|
-
return /* @__PURE__ */
|
|
2799
|
+
return /* @__PURE__ */ jsxs33("div", { className: "ss-w-fandash-card ss-w-fandash-live-timeline", children: [
|
|
2728
2800
|
card.title ? /* @__PURE__ */ jsx37("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2729
2801
|
/* @__PURE__ */ jsx37("div", { className: "ss-w-fandash-live-tl", children: shown.map((e, i) => /* @__PURE__ */ jsx37(EventRow, { e }, `${e.minute}-${e.side}-${e.type}-${i}`)) }),
|
|
2730
2802
|
rest > 0 ? /* @__PURE__ */ jsx37(
|
|
@@ -2742,7 +2814,7 @@ function LiveTimelineCard({ card, ui }) {
|
|
|
2742
2814
|
|
|
2743
2815
|
// src/components/dashboard/MomentumWave.tsx
|
|
2744
2816
|
import { useId } from "react";
|
|
2745
|
-
import { jsx as jsx38, jsxs as
|
|
2817
|
+
import { jsx as jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
2746
2818
|
var WIDTH = 270;
|
|
2747
2819
|
var HEIGHT = 56;
|
|
2748
2820
|
var BASELINE = HEIGHT / 2;
|
|
@@ -2770,10 +2842,10 @@ function MomentumWave({
|
|
|
2770
2842
|
const bottomClipId = `${clipId}-bottom`;
|
|
2771
2843
|
const topClass = clubIsHome ? "ss-w-fandash-live-mom-home" : "ss-w-fandash-live-mom-away";
|
|
2772
2844
|
const bottomClass = clubIsHome ? "ss-w-fandash-live-mom-away" : "ss-w-fandash-live-mom-home";
|
|
2773
|
-
return /* @__PURE__ */
|
|
2845
|
+
return /* @__PURE__ */ jsxs34("div", { className: "ss-w-fandash-live-mom", children: [
|
|
2774
2846
|
caption ? /* @__PURE__ */ jsx38("span", { className: "ss-w-fandash-live-mom-caption", children: caption }) : null,
|
|
2775
|
-
/* @__PURE__ */
|
|
2776
|
-
/* @__PURE__ */
|
|
2847
|
+
/* @__PURE__ */ jsxs34("div", { className: "ss-w-fandash-live-mom-plot", children: [
|
|
2848
|
+
/* @__PURE__ */ jsxs34(
|
|
2777
2849
|
"svg",
|
|
2778
2850
|
{
|
|
2779
2851
|
className: "ss-w-fandash-live-mom-svg",
|
|
@@ -2782,7 +2854,7 @@ function MomentumWave({
|
|
|
2782
2854
|
role: "img",
|
|
2783
2855
|
"aria-label": caption ?? "Momentum",
|
|
2784
2856
|
children: [
|
|
2785
|
-
/* @__PURE__ */
|
|
2857
|
+
/* @__PURE__ */ jsxs34("defs", { children: [
|
|
2786
2858
|
/* @__PURE__ */ jsx38("clipPath", { id: topClipId, children: /* @__PURE__ */ jsx38("rect", { x: 0, y: 0, width: WIDTH, height: BASELINE }) }),
|
|
2787
2859
|
/* @__PURE__ */ jsx38("clipPath", { id: bottomClipId, children: /* @__PURE__ */ jsx38("rect", { x: 0, y: BASELINE, width: WIDTH, height: HEIGHT - BASELINE }) })
|
|
2788
2860
|
] }),
|
|
@@ -2806,7 +2878,7 @@ function MomentumWave({
|
|
|
2806
2878
|
}
|
|
2807
2879
|
|
|
2808
2880
|
// src/components/dashboard/LiveStatsCard.tsx
|
|
2809
|
-
import { jsx as jsx39, jsxs as
|
|
2881
|
+
import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
2810
2882
|
function splitWidths2(homeNum, awayNum) {
|
|
2811
2883
|
const total = homeNum + awayNum;
|
|
2812
2884
|
if (total <= 0) return { home: "50%", away: "50%" };
|
|
@@ -2815,7 +2887,7 @@ function splitWidths2(homeNum, awayNum) {
|
|
|
2815
2887
|
}
|
|
2816
2888
|
function LiveStatsCard({ card }) {
|
|
2817
2889
|
const { data } = card;
|
|
2818
|
-
return /* @__PURE__ */
|
|
2890
|
+
return /* @__PURE__ */ jsxs35("div", { className: "ss-w-fandash-card ss-w-fandash-live-stats", children: [
|
|
2819
2891
|
card.title ? /* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2820
2892
|
/* @__PURE__ */ jsx39("div", { className: "ss-w-fandash-live-stat-rows", children: data.rows.map((r, i) => {
|
|
2821
2893
|
const homeValue = data.clubIsHome ? r.clubValue : r.oppValue;
|
|
@@ -2823,25 +2895,25 @@ function LiveStatsCard({ card }) {
|
|
|
2823
2895
|
const homeNum = data.clubIsHome ? r.clubNum : r.oppNum;
|
|
2824
2896
|
const awayNum = data.clubIsHome ? r.oppNum : r.clubNum;
|
|
2825
2897
|
const { home, away } = splitWidths2(homeNum, awayNum);
|
|
2826
|
-
return /* @__PURE__ */
|
|
2827
|
-
/* @__PURE__ */
|
|
2898
|
+
return /* @__PURE__ */ jsxs35("div", { className: "ss-w-fandash-live-stat", children: [
|
|
2899
|
+
/* @__PURE__ */ jsxs35("div", { className: "ss-w-fandash-live-stat-row", children: [
|
|
2828
2900
|
/* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-stat-value ss-w-fandash-live-stat-value--home", children: homeValue }),
|
|
2829
2901
|
/* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-stat-label", children: r.label }),
|
|
2830
2902
|
/* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-stat-value ss-w-fandash-live-stat-value--away", children: awayValue })
|
|
2831
2903
|
] }),
|
|
2832
|
-
/* @__PURE__ */
|
|
2904
|
+
/* @__PURE__ */ jsxs35("div", { className: "ss-w-fandash-live-bar", children: [
|
|
2833
2905
|
/* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-bar-home", style: { width: home } }),
|
|
2834
2906
|
/* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-bar-away", style: { width: away } })
|
|
2835
2907
|
] })
|
|
2836
2908
|
] }, `${r.label}-${i}`);
|
|
2837
2909
|
}) }),
|
|
2838
2910
|
data.momentum.length > 0 ? /* @__PURE__ */ jsx39(MomentumWave, { points: data.momentum, caption: data.momentumLabel, clubIsHome: data.clubIsHome }) : data.momentumLabel ? /* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-momentum", children: data.momentumLabel }) : null,
|
|
2839
|
-
data.rows.length > 0 ? /* @__PURE__ */
|
|
2840
|
-
/* @__PURE__ */
|
|
2911
|
+
data.rows.length > 0 ? /* @__PURE__ */ jsxs35("div", { className: "ss-w-fandash-live-legend", children: [
|
|
2912
|
+
/* @__PURE__ */ jsxs35("span", { className: "ss-w-fandash-live-legend-item", children: [
|
|
2841
2913
|
/* @__PURE__ */ jsx39("i", { className: "ss-w-fandash-live-legend-swatch ss-w-fandash-live-legend-swatch--home" }),
|
|
2842
2914
|
data.homeName
|
|
2843
2915
|
] }),
|
|
2844
|
-
/* @__PURE__ */
|
|
2916
|
+
/* @__PURE__ */ jsxs35("span", { className: "ss-w-fandash-live-legend-item", children: [
|
|
2845
2917
|
/* @__PURE__ */ jsx39("i", { className: "ss-w-fandash-live-legend-swatch ss-w-fandash-live-legend-swatch--away" }),
|
|
2846
2918
|
data.awayName
|
|
2847
2919
|
] })
|
|
@@ -2850,7 +2922,7 @@ function LiveStatsCard({ card }) {
|
|
|
2850
2922
|
}
|
|
2851
2923
|
|
|
2852
2924
|
// src/components/dashboard/ClubFanDashboard.tsx
|
|
2853
|
-
import { jsx as jsx40, jsxs as
|
|
2925
|
+
import { jsx as jsx40, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
2854
2926
|
function ClubFanDashboard({ dashboard, onTap, ui }) {
|
|
2855
2927
|
const orderedCards = [
|
|
2856
2928
|
...dashboard.cards.filter((c) => c.cardType === "countdown"),
|
|
@@ -2860,7 +2932,7 @@ function ClubFanDashboard({ dashboard, onTap, ui }) {
|
|
|
2860
2932
|
(c) => c.cardType === "liveTimeline"
|
|
2861
2933
|
);
|
|
2862
2934
|
const goalEvents = timelineCard?.data.events.filter((e) => e.type === "goal");
|
|
2863
|
-
return /* @__PURE__ */
|
|
2935
|
+
return /* @__PURE__ */ jsxs36("div", { className: "ss-w-fandash", children: [
|
|
2864
2936
|
dashboard.greeting ? /* @__PURE__ */ jsx40("span", { className: dashboard.greetingIsLead ? "ss-w-fandash-greeting ss-w-fandash-greeting--lead" : "ss-w-fandash-greeting", children: dashboard.greeting }) : null,
|
|
2865
2937
|
/* @__PURE__ */ jsx40("div", { className: "ss-w-fandash-cards", children: orderedCards.map((card, i) => /* @__PURE__ */ jsx40(FanDashboardCard, { card, onTap, ui, goalEvents }, `${card.cardType}-${i}`)) })
|
|
2866
2938
|
] });
|
|
@@ -2913,7 +2985,7 @@ function FanDashboardCard({ card, onTap, ui, goalEvents }) {
|
|
|
2913
2985
|
}
|
|
2914
2986
|
|
|
2915
2987
|
// src/components/ChatMessage.tsx
|
|
2916
|
-
import { jsx as jsx41, jsxs as
|
|
2988
|
+
import { jsx as jsx41, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
2917
2989
|
function ChatMessage({ message, disabled, onAct, onTap, ui, slip, monitor }) {
|
|
2918
2990
|
if (message.role === "user") {
|
|
2919
2991
|
return /* @__PURE__ */ jsx41("div", { className: "ss-w-msg ss-w-user", "data-msg-id": message.id, children: /* @__PURE__ */ jsx41("div", { className: "ss-w-bubble", children: message.text }) });
|
|
@@ -2921,7 +2993,7 @@ function ChatMessage({ message, disabled, onAct, onTap, ui, slip, monitor }) {
|
|
|
2921
2993
|
const onFanDashboardTap = (card) => {
|
|
2922
2994
|
onAct({ message: card.actionLabel, actionRef: card.actionRef, label: card.actionLabel || card.title || "" });
|
|
2923
2995
|
};
|
|
2924
|
-
return /* @__PURE__ */
|
|
2996
|
+
return /* @__PURE__ */ jsxs37("div", { className: "ss-w-msg ss-w-bot", "data-msg-id": message.id, children: [
|
|
2925
2997
|
message.text && !message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ jsx41(Markdown, { text: message.text }) : null,
|
|
2926
2998
|
message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ jsx41(GreetingDashboard, { dashboard: message.greetingDashboard, onTap }) : null,
|
|
2927
2999
|
message.clubFanDashboard ? /* @__PURE__ */ jsx41(ClubFanDashboard, { dashboard: message.clubFanDashboard, onTap: onFanDashboardTap, ui }) : null,
|
|
@@ -2947,7 +3019,7 @@ function isPinnedToBottom(el, threshold = PIN_THRESHOLD) {
|
|
|
2947
3019
|
}
|
|
2948
3020
|
|
|
2949
3021
|
// src/components/MessageList.tsx
|
|
2950
|
-
import { jsx as jsx43, jsxs as
|
|
3022
|
+
import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
2951
3023
|
function turnAnchor(messages) {
|
|
2952
3024
|
const last = messages[messages.length - 1];
|
|
2953
3025
|
if (!last || last.role !== "assistant") return null;
|
|
@@ -2956,16 +3028,16 @@ function turnAnchor(messages) {
|
|
|
2956
3028
|
}
|
|
2957
3029
|
function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
2958
3030
|
const { state, send } = controller;
|
|
2959
|
-
const listRef =
|
|
2960
|
-
const endRef =
|
|
2961
|
-
const pinnedRef =
|
|
2962
|
-
const anchoredTurnRef =
|
|
2963
|
-
|
|
3031
|
+
const listRef = useRef7(null);
|
|
3032
|
+
const endRef = useRef7(null);
|
|
3033
|
+
const pinnedRef = useRef7(true);
|
|
3034
|
+
const anchoredTurnRef = useRef7(null);
|
|
3035
|
+
useEffect9(() => {
|
|
2964
3036
|
const anchor = turnAnchor(state.messages);
|
|
2965
3037
|
const list = listRef.current;
|
|
2966
3038
|
if (anchor && anchor.turnId !== anchoredTurnRef.current) {
|
|
2967
3039
|
anchoredTurnRef.current = anchor.turnId;
|
|
2968
|
-
if (endRef.current && list) endRef.current.style.height = `${list.clientHeight}px
|
|
3040
|
+
if (endRef.current && list) endRef.current.style.height = state.isStreaming ? `${list.clientHeight}px` : "";
|
|
2969
3041
|
pinnedRef.current = false;
|
|
2970
3042
|
list?.querySelector(`[data-msg-id="${anchor.anchorId}"]`)?.scrollIntoView({ block: "start" });
|
|
2971
3043
|
return;
|
|
@@ -2975,7 +3047,7 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
2975
3047
|
}, [state.messages, state.status, state.isStreaming]);
|
|
2976
3048
|
const hasUserMessage = state.messages.some((m) => m.role === "user");
|
|
2977
3049
|
const hasDashboard = state.messages.some((m) => m.role === "assistant" && (m.greetingDashboard || m.clubFanDashboard));
|
|
2978
|
-
return /* @__PURE__ */
|
|
3050
|
+
return /* @__PURE__ */ jsxs38(
|
|
2979
3051
|
"div",
|
|
2980
3052
|
{
|
|
2981
3053
|
className: "ss-w-list",
|
|
@@ -3004,7 +3076,7 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
3004
3076
|
state.isStreaming && state.actionsLoading ? /* @__PURE__ */ jsx43(ActionButtons, { actions: [], loading: true, onAct: () => {
|
|
3005
3077
|
} }) : null,
|
|
3006
3078
|
state.status ? /* @__PURE__ */ jsx43("div", { className: "ss-w-status", children: state.status }) : null,
|
|
3007
|
-
state.error ? /* @__PURE__ */
|
|
3079
|
+
state.error ? /* @__PURE__ */ jsxs38("div", { className: "ss-w-error", role: "alert", children: [
|
|
3008
3080
|
/* @__PURE__ */ jsx43("span", { children: "message" in state.error ? state.error.message : ui.somethingWentWrong }),
|
|
3009
3081
|
/* @__PURE__ */ jsx43("button", { type: "button", className: "ss-w-retry", onClick: () => controller.retry(), children: ui.retry })
|
|
3010
3082
|
] }) : null,
|
|
@@ -3016,10 +3088,10 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
3016
3088
|
}
|
|
3017
3089
|
|
|
3018
3090
|
// src/components/ChatInput.tsx
|
|
3019
|
-
import { useState as
|
|
3020
|
-
import { jsx as jsx44, jsxs as
|
|
3091
|
+
import { useState as useState17 } from "react";
|
|
3092
|
+
import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
3021
3093
|
function ChatInput({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message" }) {
|
|
3022
|
-
const [value, setValue] =
|
|
3094
|
+
const [value, setValue] = useState17("");
|
|
3023
3095
|
const submit = () => {
|
|
3024
3096
|
const t = value.trim();
|
|
3025
3097
|
if (!t) return;
|
|
@@ -3032,14 +3104,14 @@ function ChatInput({ placeholder, streaming, onSend, onStop, stopLabel = "Stop r
|
|
|
3032
3104
|
submit();
|
|
3033
3105
|
}
|
|
3034
3106
|
};
|
|
3035
|
-
return /* @__PURE__ */
|
|
3107
|
+
return /* @__PURE__ */ jsxs39("div", { className: "ss-w-input", children: [
|
|
3036
3108
|
/* @__PURE__ */ jsx44("textarea", { className: "ss-w-textarea", rows: 1, placeholder, value, disabled: streaming, onChange: (e) => setValue(e.target.value), onKeyDown }),
|
|
3037
3109
|
streaming ? /* @__PURE__ */ jsx44("button", { type: "button", className: "ss-w-send ss-w-stop", "aria-label": stopLabel, onClick: onStop, children: /* @__PURE__ */ jsx44("span", { className: "ss-w-stop-glyph" }) }) : /* @__PURE__ */ jsx44("button", { type: "button", className: "ss-w-send", "aria-label": sendLabel, onClick: submit, children: /* @__PURE__ */ jsx44(SendIcon, {}) })
|
|
3038
3110
|
] });
|
|
3039
3111
|
}
|
|
3040
3112
|
|
|
3041
3113
|
// src/components/TabBar.tsx
|
|
3042
|
-
import { jsx as jsx45, jsxs as
|
|
3114
|
+
import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
3043
3115
|
var TABS = [
|
|
3044
3116
|
{ tab: "chat", labelKey: "tabChat" },
|
|
3045
3117
|
{ tab: "matches", labelKey: "tabMatches" },
|
|
@@ -3056,7 +3128,7 @@ function TabBar({ monitor, ui, matchCount, oddsCount }) {
|
|
|
3056
3128
|
return /* @__PURE__ */ jsx45("div", { className: "ss-w-tabs", role: "tablist", children: TABS.map(({ tab, labelKey }) => {
|
|
3057
3129
|
const active = monitor.activeTab === tab;
|
|
3058
3130
|
const count = counts[tab];
|
|
3059
|
-
return /* @__PURE__ */
|
|
3131
|
+
return /* @__PURE__ */ jsxs40(
|
|
3060
3132
|
"button",
|
|
3061
3133
|
{
|
|
3062
3134
|
type: "button",
|
|
@@ -3077,7 +3149,7 @@ function TabBar({ monitor, ui, matchCount, oddsCount }) {
|
|
|
3077
3149
|
}
|
|
3078
3150
|
|
|
3079
3151
|
// src/components/MarketAccordion.tsx
|
|
3080
|
-
import { jsx as jsx46, jsxs as
|
|
3152
|
+
import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
3081
3153
|
function MarketAccordion({ match, monitor, ui, slip }) {
|
|
3082
3154
|
const markets = match.availableMarkets ?? [];
|
|
3083
3155
|
if (markets.length === 0) return null;
|
|
@@ -3086,9 +3158,9 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
3086
3158
|
const isOpen = open === m.marketDeveloperName;
|
|
3087
3159
|
const key = `${match.matchId}:${m.marketDeveloperName}`;
|
|
3088
3160
|
const entry = monitor.marketOdds[key];
|
|
3089
|
-
return /* @__PURE__ */
|
|
3090
|
-
/* @__PURE__ */
|
|
3091
|
-
/* @__PURE__ */
|
|
3161
|
+
return /* @__PURE__ */ jsxs41("div", { className: isOpen ? "ss-w-acc-row ss-w-acc-row-open" : "ss-w-acc-row", children: [
|
|
3162
|
+
/* @__PURE__ */ jsxs41("div", { className: "ss-w-acc-head", children: [
|
|
3163
|
+
/* @__PURE__ */ jsxs41(
|
|
3092
3164
|
"button",
|
|
3093
3165
|
{
|
|
3094
3166
|
type: "button",
|
|
@@ -3112,7 +3184,7 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
3112
3184
|
}
|
|
3113
3185
|
)
|
|
3114
3186
|
] }),
|
|
3115
|
-
isOpen && /* @__PURE__ */
|
|
3187
|
+
isOpen && /* @__PURE__ */ jsxs41("div", { className: "ss-w-acc-panel", children: [
|
|
3116
3188
|
entry?.error && /* @__PURE__ */ jsx46(
|
|
3117
3189
|
"div",
|
|
3118
3190
|
{
|
|
@@ -3121,7 +3193,7 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
3121
3193
|
children: ui.accordionRetry
|
|
3122
3194
|
}
|
|
3123
3195
|
),
|
|
3124
|
-
entry?.block?.insight?.text && /* @__PURE__ */
|
|
3196
|
+
entry?.block?.insight?.text && /* @__PURE__ */ jsxs41("div", { className: "ss-w-acc-insight", children: [
|
|
3125
3197
|
/* @__PURE__ */ jsx46("span", { className: "ss-w-acc-badge", children: ui.accordionValueLabel }),
|
|
3126
3198
|
" ",
|
|
3127
3199
|
entry.block.insight.text
|
|
@@ -3143,7 +3215,7 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
3143
3215
|
}
|
|
3144
3216
|
|
|
3145
3217
|
// src/components/MonitorMatchCard.tsx
|
|
3146
|
-
import { jsx as jsx47, jsxs as
|
|
3218
|
+
import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
3147
3219
|
function chipSelection(row, matchId, conversationId) {
|
|
3148
3220
|
const chip = row.market;
|
|
3149
3221
|
if (!chip || !chip.addToSlipEnabled || typeof chip.matchOddsId !== "number" || typeof chip.price !== "number") return null;
|
|
@@ -3166,14 +3238,14 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
3166
3238
|
const otherRows = match.statRows.filter((row) => !isPromoted(row, promotedPins));
|
|
3167
3239
|
const orderedRows = [...promotedRows, ...otherRows];
|
|
3168
3240
|
const kickoff = match.phase === "preMatch" && match.kickoffUtc ? ui.bettingKickoff(match.kickoffUtc) : void 0;
|
|
3169
|
-
return /* @__PURE__ */
|
|
3170
|
-
/* @__PURE__ */
|
|
3171
|
-
live && /* @__PURE__ */
|
|
3241
|
+
return /* @__PURE__ */ jsxs42("div", { className: "ss-w-mon", children: [
|
|
3242
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-top", children: [
|
|
3243
|
+
live && /* @__PURE__ */ jsxs42("span", { className: "ss-w-fandash-live-pill", children: [
|
|
3172
3244
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-fandash-live-dot", "aria-hidden": "true" }),
|
|
3173
3245
|
ui.liveLabel
|
|
3174
3246
|
] }),
|
|
3175
3247
|
match.phase === "fullTime" && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
|
|
3176
|
-
kickoff && /* @__PURE__ */
|
|
3248
|
+
kickoff && /* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-pill", children: [
|
|
3177
3249
|
kickoff.dayLabel,
|
|
3178
3250
|
" \xB7 ",
|
|
3179
3251
|
kickoff.time
|
|
@@ -3182,17 +3254,17 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
3182
3254
|
match.competitionName && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-comp", children: match.competitionName }),
|
|
3183
3255
|
/* @__PURE__ */ jsx47(PinToggle, { ui, monitor, pin: { kind: "match", matchId: match.matchId } })
|
|
3184
3256
|
] }),
|
|
3185
|
-
/* @__PURE__ */
|
|
3186
|
-
/* @__PURE__ */
|
|
3257
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-main", children: [
|
|
3258
|
+
/* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-side", children: [
|
|
3187
3259
|
/* @__PURE__ */ jsx47(Crest2, { kind: "team", url: match.homeCrestUrl ?? void 0, name: match.homeTeamName ?? void 0 }),
|
|
3188
3260
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-name", children: match.homeTeamName })
|
|
3189
3261
|
] }),
|
|
3190
|
-
match.phase === "preMatch" ? /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-vs", children: "vs" }) : /* @__PURE__ */
|
|
3262
|
+
match.phase === "preMatch" ? /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-vs", children: "vs" }) : /* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-score", children: [
|
|
3191
3263
|
match.homeScore,
|
|
3192
3264
|
/* @__PURE__ */ jsx47("i", { children: "\u2013" }),
|
|
3193
3265
|
match.awayScore
|
|
3194
3266
|
] }),
|
|
3195
|
-
/* @__PURE__ */
|
|
3267
|
+
/* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-side ss-w-mon-side--away", children: [
|
|
3196
3268
|
/* @__PURE__ */ jsx47(Crest2, { kind: "team", url: match.awayCrestUrl ?? void 0, name: match.awayTeamName ?? void 0 }),
|
|
3197
3269
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-name", children: match.awayTeamName })
|
|
3198
3270
|
] })
|
|
@@ -3204,23 +3276,23 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
3204
3276
|
const awayPct = total > 0 ? row.awayNum / total * 75 : 0;
|
|
3205
3277
|
const promoted = isPromoted(row, promotedPins);
|
|
3206
3278
|
const selection = chipSelection(row, match.matchId, slip.conversationId);
|
|
3207
|
-
return /* @__PURE__ */
|
|
3208
|
-
/* @__PURE__ */
|
|
3279
|
+
return /* @__PURE__ */ jsxs42("div", { className: promoted ? "ss-w-mon-stat ss-w-mon-pstrip" : "ss-w-mon-stat", children: [
|
|
3280
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-stat-row", children: [
|
|
3209
3281
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--home", children: row.homeValue }),
|
|
3210
3282
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-l", children: row.label }),
|
|
3211
3283
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--away", children: row.awayValue })
|
|
3212
3284
|
] }),
|
|
3213
|
-
/* @__PURE__ */
|
|
3285
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-bar", children: [
|
|
3214
3286
|
/* @__PURE__ */ jsx47("b", { className: "ss-w-mon-bar-home", style: { width: `${homePct}%` } }),
|
|
3215
3287
|
/* @__PURE__ */ jsx47("i", { className: "ss-w-mon-bar-away", style: { width: `${awayPct}%` } })
|
|
3216
3288
|
] }),
|
|
3217
|
-
row.market && /* @__PURE__ */
|
|
3218
|
-
/* @__PURE__ */
|
|
3289
|
+
row.market && /* @__PURE__ */ jsxs42("div", { className: promoted ? "ss-w-mon-stat-mkt ss-w-mon-mkt" : "ss-w-mon-stat-mkt", children: [
|
|
3290
|
+
/* @__PURE__ */ jsxs42("span", { children: [
|
|
3219
3291
|
row.market.marketLabel,
|
|
3220
3292
|
" \xB7 ",
|
|
3221
3293
|
row.market.selectionLabel
|
|
3222
3294
|
] }),
|
|
3223
|
-
/* @__PURE__ */
|
|
3295
|
+
/* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-stat-mkt-right", children: [
|
|
3224
3296
|
row.market.isSuspended ? /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-susp", children: ui.suspendedLabel }) : typeof row.market.price === "number" && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-price", children: row.market.price.toFixed(2) }),
|
|
3225
3297
|
/* @__PURE__ */ jsx47(
|
|
3226
3298
|
SlipButton,
|
|
@@ -3237,8 +3309,8 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
3237
3309
|
] }, row.label);
|
|
3238
3310
|
}) }),
|
|
3239
3311
|
match.status === "stale" && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-asof", children: ui.asOf(formatTime(match.asOfUtc)) }),
|
|
3240
|
-
match.momentum.length > 0 && /* @__PURE__ */
|
|
3241
|
-
/* @__PURE__ */
|
|
3312
|
+
match.momentum.length > 0 && /* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-mom", children: [
|
|
3313
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-stat-row", children: [
|
|
3242
3314
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--home", children: typeof match.momentumHomePct === "number" ? `${match.momentumHomePct}%` : "" }),
|
|
3243
3315
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-l", children: ui.momentumLabel }),
|
|
3244
3316
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--away", children: typeof match.momentumHomePct === "number" ? `${100 - match.momentumHomePct}%` : "" })
|
|
@@ -3250,13 +3322,13 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
3250
3322
|
}
|
|
3251
3323
|
|
|
3252
3324
|
// src/components/MonitorTabs.tsx
|
|
3253
|
-
import { jsx as jsx48, jsxs as
|
|
3325
|
+
import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
3254
3326
|
function OddsLiveStrip({ m, ui }) {
|
|
3255
3327
|
const showScore = m.phase !== "preMatch" && typeof m.homeScore === "number";
|
|
3256
3328
|
const stale = m.status === "stale";
|
|
3257
3329
|
if (!showScore && !m.minuteLabel && !(m.isSuspended && !m.isSettled) && !m.isSettled && !stale) return null;
|
|
3258
|
-
return /* @__PURE__ */
|
|
3259
|
-
showScore && /* @__PURE__ */
|
|
3330
|
+
return /* @__PURE__ */ jsxs43("div", { className: "ss-w-mk-live", children: [
|
|
3331
|
+
showScore && /* @__PURE__ */ jsxs43("b", { className: "ss-w-mk-live-score", children: [
|
|
3260
3332
|
m.homeTeamName,
|
|
3261
3333
|
" ",
|
|
3262
3334
|
m.homeScore,
|
|
@@ -3274,7 +3346,7 @@ function OddsLiveStrip({ m, ui }) {
|
|
|
3274
3346
|
function MatchesPanel({ monitor, ui, slip }) {
|
|
3275
3347
|
const matches = (monitor.snapshot?.matches ?? []).filter((m) => monitor.pins.some((p) => p.kind === "match" && p.matchId === m.matchId));
|
|
3276
3348
|
if (matches.length === 0) return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-empty", children: ui.emptyMatchesTab });
|
|
3277
|
-
return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-list", children: matches.map((m) => /* @__PURE__ */
|
|
3349
|
+
return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-list", children: matches.map((m) => /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-item", children: [
|
|
3278
3350
|
/* @__PURE__ */ jsx48(
|
|
3279
3351
|
MonitorMatchCard,
|
|
3280
3352
|
{
|
|
@@ -3303,7 +3375,7 @@ function OddsPanel({ monitor, ui, slip }) {
|
|
|
3303
3375
|
if (markets.length === 0) return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-empty", children: ui.emptyOddsTab });
|
|
3304
3376
|
return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-list", children: markets.map((m) => {
|
|
3305
3377
|
const pin = monitor.pins.find((p) => p.key === m.key);
|
|
3306
|
-
return /* @__PURE__ */
|
|
3378
|
+
return /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-oddspin", "data-settled": m.isSettled || void 0, children: [
|
|
3307
3379
|
/* @__PURE__ */ jsx48(OddsLiveStrip, { m, ui }),
|
|
3308
3380
|
m.card && /* @__PURE__ */ jsx48(
|
|
3309
3381
|
MarketOddsCardList,
|
|
@@ -3323,11 +3395,11 @@ function OddsPanel({ monitor, ui, slip }) {
|
|
|
3323
3395
|
}
|
|
3324
3396
|
|
|
3325
3397
|
// src/components/ChatPanel.tsx
|
|
3326
|
-
import { jsx as jsx49, jsxs as
|
|
3398
|
+
import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
3327
3399
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
3328
3400
|
function useIsModal() {
|
|
3329
|
-
const [modal, setModal] =
|
|
3330
|
-
|
|
3401
|
+
const [modal, setModal] = useState18(false);
|
|
3402
|
+
useEffect10(() => {
|
|
3331
3403
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
3332
3404
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
3333
3405
|
const sync = () => setModal(mql.matches);
|
|
@@ -3340,7 +3412,7 @@ function useIsModal() {
|
|
|
3340
3412
|
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
3341
3413
|
const { state, close, stop, send, reset } = controller;
|
|
3342
3414
|
const isModal = useIsModal();
|
|
3343
|
-
|
|
3415
|
+
useEffect10(() => {
|
|
3344
3416
|
const onKey = (e) => {
|
|
3345
3417
|
if (e.key === "Escape") close();
|
|
3346
3418
|
};
|
|
@@ -3351,10 +3423,10 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
3351
3423
|
monitor?.setActiveTab("chat");
|
|
3352
3424
|
send(text);
|
|
3353
3425
|
};
|
|
3354
|
-
|
|
3426
|
+
useEffect10(() => {
|
|
3355
3427
|
if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
|
|
3356
3428
|
}, [monitor, state.isStreaming, state.messages.length]);
|
|
3357
|
-
return /* @__PURE__ */
|
|
3429
|
+
return /* @__PURE__ */ jsxs44("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
|
|
3358
3430
|
/* @__PURE__ */ jsx49(
|
|
3359
3431
|
ChatHeader,
|
|
3360
3432
|
{
|
|
@@ -3364,7 +3436,8 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
3364
3436
|
headerTitle: ui.headerTitle,
|
|
3365
3437
|
onNewConversation: reset,
|
|
3366
3438
|
canReset: state.messages.length > 0,
|
|
3367
|
-
newConversationLabel: ui.newConversation
|
|
3439
|
+
newConversationLabel: ui.newConversation,
|
|
3440
|
+
moreOptionsLabel: ui.moreOptions
|
|
3368
3441
|
}
|
|
3369
3442
|
),
|
|
3370
3443
|
monitor && /* @__PURE__ */ jsx49(
|
|
@@ -3482,14 +3555,19 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
3482
3555
|
.ss-w-header { display: flex; align-items: center; gap: 8px; padding: 12px 14px; border-bottom: 1px solid var(--ss-w-line); }
|
|
3483
3556
|
.ss-w-header-mark { width: 18px; height: 18px; display: block; object-fit: contain; }
|
|
3484
3557
|
.ss-w-header-title { font-weight: 660; flex: 1; }
|
|
3485
|
-
.ss-w-newconv { background: none; border: none; color: var(--ss-w-faint); cursor: pointer; font-size: 16px; display: grid; place-items: center; }
|
|
3486
3558
|
.ss-w-close { background: none; border: none; color: var(--ss-w-faint); cursor: pointer; font-size: 16px; display: grid; place-items: center; }
|
|
3559
|
+
.ss-w-menu-wrap { position: relative; display: grid; place-items: center; }
|
|
3560
|
+
.ss-w-kebab { background: none; border: none; color: var(--ss-w-faint); cursor: pointer; font-size: 16px; display: grid; place-items: center; }
|
|
3561
|
+
.ss-w-menu { position: absolute; top: calc(100% + 6px); right: 0; z-index: 5; min-width: 184px; padding: 6px; background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); border-radius: 12px; box-shadow: 0 8px 24px rgba(0,0,0,.18); }
|
|
3562
|
+
.ss-w-menu-item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 10px; background: none; border: none; border-radius: 8px; color: var(--ss-w-ink); font: inherit; font-size: 13px; text-align: left; cursor: pointer; }
|
|
3563
|
+
.ss-w-menu-item:hover, .ss-w-menu-item:focus-visible { background: var(--ss-w-bubble); }
|
|
3564
|
+
.ss-w-menu-item svg { color: var(--ss-w-faint); font-size: 15px; flex: none; }
|
|
3487
3565
|
|
|
3488
3566
|
/* messages */
|
|
3489
3567
|
/* .ss-w-mon-list (Matches/Odds tab scrollers) shares .ss-w-list's box/scroll rules by design --
|
|
3490
3568
|
same visual rhythm as the chat message list -- but gets its own class so it isn't the same DOM
|
|
3491
3569
|
landmark as the chat list when both exist in the panel at once (Task 16 fix round, M4). */
|
|
3492
|
-
.ss-w-list, .ss-w-mon-list { flex: 1; overflow-y: auto; padding: 14px; display: flex; flex-direction: column; gap: 12px; scroll-padding-top: 14px; }
|
|
3570
|
+
.ss-w-list, .ss-w-mon-list { flex: 1; overflow-y: auto; overscroll-behavior: contain; padding: 14px; display: flex; flex-direction: column; gap: 12px; scroll-padding-top: 14px; }
|
|
3493
3571
|
/* Transient bottom spacer: reserves a viewport of room below a new turn so its
|
|
3494
3572
|
top can be scrolled into view while the reply is still streaming in. Height is
|
|
3495
3573
|
set imperatively and flex must not shrink it away. */
|
|
@@ -4225,8 +4303,8 @@ function StatsWidget(props) {
|
|
|
4225
4303
|
const cfg = props.config;
|
|
4226
4304
|
const built = useMemo2(() => buildClient(props), [injectedClient, cfg?.operatorId, cfg?.publicKey, cfg?.baseUrl]);
|
|
4227
4305
|
const ui = useMemo2(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
|
|
4228
|
-
const rootRef =
|
|
4229
|
-
const introDoneRef =
|
|
4306
|
+
const rootRef = useRef8(null);
|
|
4307
|
+
const introDoneRef = useRef8(false);
|
|
4230
4308
|
const markIntroDone = useCallback5(() => {
|
|
4231
4309
|
introDoneRef.current = true;
|
|
4232
4310
|
}, []);
|
|
@@ -4265,7 +4343,7 @@ function StatsWidget(props) {
|
|
|
4265
4343
|
() => built ? createDashboardTapSignal((input) => built.conversation.sendSignal(input)) : void 0,
|
|
4266
4344
|
[built]
|
|
4267
4345
|
);
|
|
4268
|
-
|
|
4346
|
+
useEffect11(() => {
|
|
4269
4347
|
if (!built || !ui.injectStyles) return;
|
|
4270
4348
|
const node = rootRef.current?.getRootNode();
|
|
4271
4349
|
if (node) injectStyles(node);
|