@sensiblestats/widget-react 0.33.2 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/index.cjs +699 -670
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -1
- package/dist/index.d.ts +13 -1
- package/dist/index.js +509 -480
- package/dist/index.js.map +1 -1
- package/dist/styles.css +4 -2
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -36,7 +36,7 @@ __export(index_exports, {
|
|
|
36
36
|
module.exports = __toCommonJS(index_exports);
|
|
37
37
|
|
|
38
38
|
// src/StatsWidget.tsx
|
|
39
|
-
var
|
|
39
|
+
var import_react22 = require("react");
|
|
40
40
|
var import_widget_sdk5 = require("@sensiblestats/widget-sdk");
|
|
41
41
|
|
|
42
42
|
// src/kickoff.ts
|
|
@@ -202,6 +202,12 @@ function normalizeUi(cfg) {
|
|
|
202
202
|
return {
|
|
203
203
|
theme: cfg.theme ?? "auto",
|
|
204
204
|
accent: cfg.accent,
|
|
205
|
+
logoUrl: cfg.logoUrl,
|
|
206
|
+
headerTitle: cfg.headerTitle,
|
|
207
|
+
cta: cfg.cta,
|
|
208
|
+
surface: cfg.surface,
|
|
209
|
+
ink: cfg.ink,
|
|
210
|
+
attribution: cfg.attribution ?? true,
|
|
205
211
|
position: cfg.position ?? "right",
|
|
206
212
|
offset: { x: cfg.offset?.x ?? 20, y: cfg.offset?.y ?? 20 },
|
|
207
213
|
radius: cfg.radius ?? 16,
|
|
@@ -340,6 +346,14 @@ function themeAttrs(ui) {
|
|
|
340
346
|
"--ss-w-radius": `${ui.radius}px`
|
|
341
347
|
};
|
|
342
348
|
if (ui.accent) style["--ss-w-accent"] = ui.accent;
|
|
349
|
+
if (ui.cta) style["--ss-w-cta"] = ui.cta;
|
|
350
|
+
if (ui.surface) style["--ss-w-panel"] = ui.surface;
|
|
351
|
+
if (ui.ink) style["--ss-w-ink"] = ui.ink;
|
|
352
|
+
if (ui.surface && ui.ink) {
|
|
353
|
+
style["--ss-w-bubble"] = "color-mix(in srgb, var(--ss-w-ink) 5%, var(--ss-w-panel))";
|
|
354
|
+
style["--ss-w-line"] = "color-mix(in srgb, var(--ss-w-ink) 12%, var(--ss-w-panel))";
|
|
355
|
+
style["--ss-w-faint"] = "color-mix(in srgb, var(--ss-w-ink) 55%, var(--ss-w-panel))";
|
|
356
|
+
}
|
|
343
357
|
return { "data-ss-w-theme": ui.theme, "data-ss-w-pos": ui.position, style };
|
|
344
358
|
}
|
|
345
359
|
|
|
@@ -1181,6 +1195,9 @@ function useLiveMonitor(opts) {
|
|
|
1181
1195
|
};
|
|
1182
1196
|
}
|
|
1183
1197
|
|
|
1198
|
+
// src/components/BrandMark.tsx
|
|
1199
|
+
var import_react4 = require("react");
|
|
1200
|
+
|
|
1184
1201
|
// src/assets/logo.ts
|
|
1185
1202
|
var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
|
|
1186
1203
|
|
|
@@ -1218,59 +1235,67 @@ function DashboardIcon({ name }) {
|
|
|
1218
1235
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "ss-w-dash-emoji", "aria-hidden": "true", children: glyph });
|
|
1219
1236
|
}
|
|
1220
1237
|
|
|
1221
|
-
// src/components/
|
|
1238
|
+
// src/components/BrandMark.tsx
|
|
1222
1239
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
1240
|
+
function BrandMark({ logoUrl, className }) {
|
|
1241
|
+
const [failed, setFailed] = (0, import_react4.useState)(false);
|
|
1242
|
+
if (!logoUrl || failed) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SsMark, { className });
|
|
1243
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
// src/components/GreetingBubble.tsx
|
|
1247
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
1223
1248
|
function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss" }) {
|
|
1224
|
-
return /* @__PURE__ */ (0,
|
|
1225
|
-
/* @__PURE__ */ (0,
|
|
1226
|
-
onDismiss ? /* @__PURE__ */ (0,
|
|
1249
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "ss-w-greeting", role: "note", children: [
|
|
1250
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "button", className: "ss-w-greeting-body", onClick: onOpen, children: text }),
|
|
1251
|
+
onDismiss ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "button", className: "ss-w-greeting-x", "aria-label": dismissLabel, onClick: onDismiss, children: "\xD7" }) : null
|
|
1227
1252
|
] });
|
|
1228
1253
|
}
|
|
1229
1254
|
|
|
1230
1255
|
// src/components/ChatFab.tsx
|
|
1231
|
-
var
|
|
1232
|
-
function ChatFab({ label, greeting, popupText, onOpen, onDismissPopup, dismissLabel = "Dismiss" }) {
|
|
1256
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
1257
|
+
function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss" }) {
|
|
1233
1258
|
const bubble = popupText ?? greeting;
|
|
1234
|
-
return /* @__PURE__ */ (0,
|
|
1235
|
-
bubble ? /* @__PURE__ */ (0,
|
|
1236
|
-
/* @__PURE__ */ (0,
|
|
1259
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "ss-w-fab-wrap", children: [
|
|
1260
|
+
bubble ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(GreetingBubble, { text: bubble, onOpen, onDismiss: popupText ? onDismissPopup : void 0, dismissLabel }) : null,
|
|
1261
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "ss-w-fab", "aria-label": label, onClick: onOpen, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(BrandMark, { logoUrl, className: "ss-w-fab-mark" }) })
|
|
1237
1262
|
] });
|
|
1238
1263
|
}
|
|
1239
1264
|
|
|
1240
1265
|
// src/components/ChatPanel.tsx
|
|
1241
|
-
var
|
|
1266
|
+
var import_react21 = require("react");
|
|
1242
1267
|
|
|
1243
1268
|
// src/components/ChatHeader.tsx
|
|
1244
|
-
var
|
|
1245
|
-
function ChatHeader({ onClose, closeLabel = "Close chat" }) {
|
|
1246
|
-
return /* @__PURE__ */ (0,
|
|
1247
|
-
/* @__PURE__ */ (0,
|
|
1248
|
-
/* @__PURE__ */ (0,
|
|
1249
|
-
/* @__PURE__ */ (0,
|
|
1269
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
1270
|
+
function ChatHeader({ onClose, closeLabel = "Close chat", logoUrl, headerTitle }) {
|
|
1271
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("header", { className: "ss-w-header", children: [
|
|
1272
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(BrandMark, { logoUrl, className: "ss-w-header-mark" }),
|
|
1273
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-header-title", children: headerTitle ?? "SensibleStats" }),
|
|
1274
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "ss-w-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseIcon, {}) })
|
|
1250
1275
|
] });
|
|
1251
1276
|
}
|
|
1252
1277
|
|
|
1253
1278
|
// src/components/MessageList.tsx
|
|
1254
|
-
var
|
|
1279
|
+
var import_react19 = require("react");
|
|
1255
1280
|
|
|
1256
1281
|
// src/components/Markdown.tsx
|
|
1257
1282
|
var import_react_markdown = __toESM(require("react-markdown"), 1);
|
|
1258
1283
|
var import_remark_gfm = __toESM(require("remark-gfm"), 1);
|
|
1259
|
-
var
|
|
1284
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
1260
1285
|
var components = {
|
|
1261
|
-
a: ({ children, href }) => /* @__PURE__ */ (0,
|
|
1262
|
-
table: ({ children }) => /* @__PURE__ */ (0,
|
|
1263
|
-
ul: ({ children }) => /* @__PURE__ */ (0,
|
|
1264
|
-
ol: ({ children }) => /* @__PURE__ */ (0,
|
|
1265
|
-
code: ({ children }) => /* @__PURE__ */ (0,
|
|
1286
|
+
a: ({ children, href }) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("a", { href, target: "_blank", rel: "noopener noreferrer", className: "ss-w-md-link", children }),
|
|
1287
|
+
table: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "ss-w-table-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("table", { className: "ss-w-md-table", children }) }),
|
|
1288
|
+
ul: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ul", { className: "ss-w-md-ul", children }),
|
|
1289
|
+
ol: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ol", { className: "ss-w-md-ol", children }),
|
|
1290
|
+
code: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("code", { className: "ss-w-md-code", children })
|
|
1266
1291
|
};
|
|
1267
1292
|
function Markdown({ text }) {
|
|
1268
|
-
return /* @__PURE__ */ (0,
|
|
1293
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "ss-w-md", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default], components, children: text }) });
|
|
1269
1294
|
}
|
|
1270
1295
|
|
|
1271
1296
|
// src/components/EntityCardList.tsx
|
|
1272
|
-
var
|
|
1273
|
-
var
|
|
1297
|
+
var import_react5 = require("react");
|
|
1298
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
1274
1299
|
var MAX_VISIBLE = 3;
|
|
1275
1300
|
var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
|
|
1276
1301
|
function initials(name) {
|
|
@@ -1280,7 +1305,7 @@ function shortSeason(season) {
|
|
|
1280
1305
|
return season.replace(/\d{4}/g, (year) => year.slice(2));
|
|
1281
1306
|
}
|
|
1282
1307
|
function Crest({ image, label }) {
|
|
1283
|
-
return /* @__PURE__ */ (0,
|
|
1308
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
1284
1309
|
"span",
|
|
1285
1310
|
{
|
|
1286
1311
|
className: "ss-w-ecard-crest",
|
|
@@ -1291,34 +1316,34 @@ function Crest({ image, label }) {
|
|
|
1291
1316
|
}
|
|
1292
1317
|
function FormBar({ w, d, l }) {
|
|
1293
1318
|
if (w + d + l === 0) return null;
|
|
1294
|
-
return /* @__PURE__ */ (0,
|
|
1295
|
-
w > 0 ? /* @__PURE__ */ (0,
|
|
1296
|
-
d > 0 ? /* @__PURE__ */ (0,
|
|
1297
|
-
l > 0 ? /* @__PURE__ */ (0,
|
|
1319
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { className: "ss-w-form", "aria-hidden": "true", children: [
|
|
1320
|
+
w > 0 ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "ss-w-form-w", style: { flexGrow: w } }) : null,
|
|
1321
|
+
d > 0 ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "ss-w-form-d", style: { flexGrow: d } }) : null,
|
|
1322
|
+
l > 0 ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "ss-w-form-l", style: { flexGrow: l } }) : null
|
|
1298
1323
|
] });
|
|
1299
1324
|
}
|
|
1300
1325
|
function StatCellView({ s }) {
|
|
1301
1326
|
const m = RECORD_RE.exec(s.value);
|
|
1302
1327
|
if (m) {
|
|
1303
|
-
return /* @__PURE__ */ (0,
|
|
1304
|
-
/* @__PURE__ */ (0,
|
|
1305
|
-
/* @__PURE__ */ (0,
|
|
1328
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "ss-w-ecard-cell", children: [
|
|
1329
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "ss-w-ecard-cval", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FormBar, { w: Number(m[1]), d: Number(m[2]), l: Number(m[3]) }) }),
|
|
1330
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "ss-w-ecard-clabel", children: s.value })
|
|
1306
1331
|
] });
|
|
1307
1332
|
}
|
|
1308
|
-
return /* @__PURE__ */ (0,
|
|
1309
|
-
/* @__PURE__ */ (0,
|
|
1310
|
-
/* @__PURE__ */ (0,
|
|
1333
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "ss-w-ecard-cell", children: [
|
|
1334
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "ss-w-ecard-cval", children: s.value }),
|
|
1335
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "ss-w-ecard-clabel", children: s.label })
|
|
1311
1336
|
] });
|
|
1312
1337
|
}
|
|
1313
1338
|
function StatStrip({ stats }) {
|
|
1314
1339
|
if (stats.length === 0) return null;
|
|
1315
1340
|
const cols = Math.min(stats.length, 4);
|
|
1316
|
-
return /* @__PURE__ */ (0,
|
|
1341
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "ss-w-ecard-strip", style: { gridTemplateColumns: `repeat(${cols}, 1fr)` }, children: stats.map((s) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(StatCellView, { s }, s.label + s.value)) });
|
|
1317
1342
|
}
|
|
1318
1343
|
function CardHeader({ c, showScopeCrest }) {
|
|
1319
1344
|
const onlyScope = c.scopes.length === 1 ? c.scopes[0] : null;
|
|
1320
|
-
return /* @__PURE__ */ (0,
|
|
1321
|
-
/* @__PURE__ */ (0,
|
|
1345
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "ss-w-ecard-hd", children: [
|
|
1346
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
1322
1347
|
"span",
|
|
1323
1348
|
{
|
|
1324
1349
|
className: c.kind === "team" ? "ss-w-thumb ss-w-team" : "ss-w-thumb",
|
|
@@ -1326,18 +1351,18 @@ function CardHeader({ c, showScopeCrest }) {
|
|
|
1326
1351
|
children: c.image ? "" : initials(c.name)
|
|
1327
1352
|
}
|
|
1328
1353
|
),
|
|
1329
|
-
/* @__PURE__ */ (0,
|
|
1330
|
-
/* @__PURE__ */ (0,
|
|
1331
|
-
c.sub ? /* @__PURE__ */ (0,
|
|
1354
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { className: "ss-w-ecard-idtext", children: [
|
|
1355
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "ss-w-nm", children: c.name }),
|
|
1356
|
+
c.sub ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "ss-w-sub", children: c.sub }) : null
|
|
1332
1357
|
] }),
|
|
1333
|
-
/* @__PURE__ */ (0,
|
|
1334
|
-
showScopeCrest && onlyScope?.image ? /* @__PURE__ */ (0,
|
|
1335
|
-
c.season ? /* @__PURE__ */ (0,
|
|
1358
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { className: "ss-w-ecard-meta", children: [
|
|
1359
|
+
showScopeCrest && onlyScope?.image ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Crest, { image: onlyScope.image, label: onlyScope.label }) : null,
|
|
1360
|
+
c.season ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "ss-w-ecard-season", children: shortSeason(c.season) }) : null
|
|
1336
1361
|
] })
|
|
1337
1362
|
] });
|
|
1338
1363
|
}
|
|
1339
1364
|
function ScopeTabs({ scopes, active, onSelect }) {
|
|
1340
|
-
return /* @__PURE__ */ (0,
|
|
1365
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "ss-w-ecard-scopes", role: "tablist", children: scopes.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
1341
1366
|
"button",
|
|
1342
1367
|
{
|
|
1343
1368
|
type: "button",
|
|
@@ -1347,59 +1372,59 @@ function ScopeTabs({ scopes, active, onSelect }) {
|
|
|
1347
1372
|
"aria-label": s.label,
|
|
1348
1373
|
title: s.label,
|
|
1349
1374
|
onClick: () => onSelect(i),
|
|
1350
|
-
children: s.image ? /* @__PURE__ */ (0,
|
|
1375
|
+
children: s.image ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Crest, { image: s.image }) : s.label
|
|
1351
1376
|
},
|
|
1352
1377
|
String(s.competitionId ?? "all")
|
|
1353
1378
|
)) });
|
|
1354
1379
|
}
|
|
1355
1380
|
function EntityCardItem({ c }) {
|
|
1356
|
-
const [active, setActive] = (0,
|
|
1381
|
+
const [active, setActive] = (0, import_react5.useState)(0);
|
|
1357
1382
|
const hasBody = c.scopes.length > 0;
|
|
1358
1383
|
if (!hasBody) {
|
|
1359
|
-
return /* @__PURE__ */ (0,
|
|
1384
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { c, showScopeCrest: false }) });
|
|
1360
1385
|
}
|
|
1361
1386
|
const multi = c.scopes.length > 1;
|
|
1362
1387
|
const scope = c.scopes[multi ? c.scopes[active] ? active : 0 : 0];
|
|
1363
|
-
return /* @__PURE__ */ (0,
|
|
1364
|
-
/* @__PURE__ */ (0,
|
|
1365
|
-
multi ? /* @__PURE__ */ (0,
|
|
1366
|
-
/* @__PURE__ */ (0,
|
|
1388
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "ss-w-ecard", "data-kind": c.kind, children: [
|
|
1389
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { c, showScopeCrest: !multi }),
|
|
1390
|
+
multi ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ScopeTabs, { scopes: c.scopes, active, onSelect: setActive }) : null,
|
|
1391
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(StatStrip, { stats: scope.stats })
|
|
1367
1392
|
] });
|
|
1368
1393
|
}
|
|
1369
1394
|
function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
|
|
1370
|
-
const [expanded, setExpanded] = (0,
|
|
1395
|
+
const [expanded, setExpanded] = (0, import_react5.useState)(false);
|
|
1371
1396
|
if (cards.length === 0) return null;
|
|
1372
1397
|
const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
|
|
1373
1398
|
const overflow = cards.length - MAX_VISIBLE;
|
|
1374
|
-
return /* @__PURE__ */ (0,
|
|
1375
|
-
visible.map((c) => /* @__PURE__ */ (0,
|
|
1376
|
-
overflow > 0 ? /* @__PURE__ */ (0,
|
|
1399
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "ss-w-cards", children: [
|
|
1400
|
+
visible.map((c) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(EntityCardItem, { c }, c.id)),
|
|
1401
|
+
overflow > 0 ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { type: "button", className: "ss-w-cards-more", disabled, onClick: () => setExpanded((v) => !v), children: expanded ? showLessLabel : showMoreLabel(overflow) }) : null
|
|
1377
1402
|
] });
|
|
1378
1403
|
}
|
|
1379
1404
|
|
|
1380
1405
|
// src/components/BettingInsightList.tsx
|
|
1381
|
-
var
|
|
1406
|
+
var import_react10 = require("react");
|
|
1382
1407
|
|
|
1383
1408
|
// src/components/AddToSlipButton.tsx
|
|
1384
|
-
var
|
|
1409
|
+
var import_react7 = require("react");
|
|
1385
1410
|
var import_widget_sdk4 = require("@sensiblestats/widget-sdk");
|
|
1386
1411
|
|
|
1387
1412
|
// src/components/Toast.tsx
|
|
1388
|
-
var
|
|
1389
|
-
var
|
|
1413
|
+
var import_react6 = require("react");
|
|
1414
|
+
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
1390
1415
|
var DISMISS_MS = 4e3;
|
|
1391
1416
|
function Toast({ toast, onDismiss }) {
|
|
1392
|
-
(0,
|
|
1417
|
+
(0, import_react6.useEffect)(() => {
|
|
1393
1418
|
if (!toast) return;
|
|
1394
1419
|
const timer = setTimeout(onDismiss, DISMISS_MS);
|
|
1395
1420
|
return () => clearTimeout(timer);
|
|
1396
1421
|
}, [toast, onDismiss]);
|
|
1397
1422
|
if (!toast) return null;
|
|
1398
|
-
return /* @__PURE__ */ (0,
|
|
1423
|
+
return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: `ss-w-toast ss-w-toast-${toast.kind}`, role: "status", "aria-live": "polite", children: toast.text });
|
|
1399
1424
|
}
|
|
1400
1425
|
|
|
1401
1426
|
// src/components/AddToSlipButton.tsx
|
|
1402
|
-
var
|
|
1427
|
+
var import_jsx_runtime9 = require("react/jsx-runtime");
|
|
1403
1428
|
function withTimeout(value) {
|
|
1404
1429
|
return Promise.race([
|
|
1405
1430
|
value,
|
|
@@ -1407,10 +1432,10 @@ function withTimeout(value) {
|
|
|
1407
1432
|
]);
|
|
1408
1433
|
}
|
|
1409
1434
|
function SlipButton({ selection, shownOdds, marketName, slip, ui }) {
|
|
1410
|
-
const [pending, setPending] = (0,
|
|
1411
|
-
const [settled, setSettled] = (0,
|
|
1412
|
-
const [toast, setToast] = (0,
|
|
1413
|
-
const dismiss = (0,
|
|
1435
|
+
const [pending, setPending] = (0, import_react7.useState)(false);
|
|
1436
|
+
const [settled, setSettled] = (0, import_react7.useState)(false);
|
|
1437
|
+
const [toast, setToast] = (0, import_react7.useState)(null);
|
|
1438
|
+
const dismiss = (0, import_react7.useCallback)(() => setToast(null), []);
|
|
1414
1439
|
const handler = slip.onAddToSlip;
|
|
1415
1440
|
if (!ui || !handler || !selection) return null;
|
|
1416
1441
|
const onClick = async () => {
|
|
@@ -1433,8 +1458,8 @@ function SlipButton({ selection, shownOdds, marketName, slip, ui }) {
|
|
|
1433
1458
|
setPending(false);
|
|
1434
1459
|
}
|
|
1435
1460
|
};
|
|
1436
|
-
return /* @__PURE__ */ (0,
|
|
1437
|
-
/* @__PURE__ */ (0,
|
|
1461
|
+
return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "ss-w-slip", children: [
|
|
1462
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
1438
1463
|
"button",
|
|
1439
1464
|
{
|
|
1440
1465
|
type: "button",
|
|
@@ -1444,16 +1469,16 @@ function SlipButton({ selection, shownOdds, marketName, slip, ui }) {
|
|
|
1444
1469
|
children: settled ? ui.inSlip : ui.addToSlip
|
|
1445
1470
|
}
|
|
1446
1471
|
),
|
|
1447
|
-
/* @__PURE__ */ (0,
|
|
1472
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Toast, { toast, onDismiss: dismiss })
|
|
1448
1473
|
] });
|
|
1449
1474
|
}
|
|
1450
1475
|
function AddToSlipButton({ it, slip, ui }) {
|
|
1451
1476
|
const selection = it.addToSlipEnabled ? toSlipSelection(it, slip.conversationId) : null;
|
|
1452
|
-
return /* @__PURE__ */ (0,
|
|
1477
|
+
return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SlipButton, { selection, shownOdds: it.odds ?? "", marketName: it.market, slip, ui });
|
|
1453
1478
|
}
|
|
1454
1479
|
|
|
1455
1480
|
// src/components/OddsMovementBadge.tsx
|
|
1456
|
-
var
|
|
1481
|
+
var import_jsx_runtime10 = (
|
|
1457
1482
|
// Strikethrough is invisible to screen readers, so the whole was/now/direction sentence rides
|
|
1458
1483
|
// on one aria-label and the visual glyphs are hidden from the accessibility tree.
|
|
1459
1484
|
require("react/jsx-runtime")
|
|
@@ -1467,33 +1492,33 @@ function OddsMovementBadge({
|
|
|
1467
1492
|
if (previous === void 0 || direction === void 0) return null;
|
|
1468
1493
|
const directionWord2 = direction === "shortened" ? ui?.oddsShortened ?? "shortened" : ui?.oddsDrifted ?? "drifted";
|
|
1469
1494
|
const label = ui?.oddsMoved?.(previous, current, directionWord2) ?? `was ${previous}, now ${current}, ${directionWord2}`;
|
|
1470
|
-
return /* @__PURE__ */ (0,
|
|
1471
|
-
/* @__PURE__ */ (0,
|
|
1472
|
-
/* @__PURE__ */ (0,
|
|
1495
|
+
return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: "ss-w-move", role: "img", "aria-label": label, children: [
|
|
1496
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "ss-w-move-prev", "aria-hidden": "true", children: previous }),
|
|
1497
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "ss-w-move-arrow", "aria-hidden": "true", children: direction === "shortened" ? "\u25BC" : "\u25B2" })
|
|
1473
1498
|
] });
|
|
1474
1499
|
}
|
|
1475
1500
|
|
|
1476
1501
|
// src/components/Crest.tsx
|
|
1477
|
-
var
|
|
1478
|
-
var
|
|
1502
|
+
var import_react8 = require("react");
|
|
1503
|
+
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
1479
1504
|
function initials2(name) {
|
|
1480
1505
|
return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
|
|
1481
1506
|
}
|
|
1482
1507
|
function Crest2({ url, name, kind }) {
|
|
1483
1508
|
const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
|
|
1484
|
-
const [failed, setFailed] = (0,
|
|
1509
|
+
const [failed, setFailed] = (0, import_react8.useState)(false);
|
|
1485
1510
|
if (url && !failed) {
|
|
1486
|
-
return /* @__PURE__ */ (0,
|
|
1511
|
+
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
1487
1512
|
}
|
|
1488
|
-
return /* @__PURE__ */ (0,
|
|
1513
|
+
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: `${cls} ss-w-bi-crest-mono`, "aria-hidden": "true", children: initials2(name) });
|
|
1489
1514
|
}
|
|
1490
1515
|
|
|
1491
1516
|
// src/components/PinToggle.tsx
|
|
1492
|
-
var
|
|
1493
|
-
var
|
|
1517
|
+
var import_react9 = require("react");
|
|
1518
|
+
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
1494
1519
|
function PinToggle({ pin, monitor, ui }) {
|
|
1495
|
-
const [toast, setToast] = (0,
|
|
1496
|
-
const dismiss = (0,
|
|
1520
|
+
const [toast, setToast] = (0, import_react9.useState)(null);
|
|
1521
|
+
const dismiss = (0, import_react9.useCallback)(() => setToast(null), []);
|
|
1497
1522
|
if (!monitor || !monitor.enabled) return null;
|
|
1498
1523
|
const key = pinKey(pin);
|
|
1499
1524
|
const pinned = monitor.isPinned(key);
|
|
@@ -1506,8 +1531,8 @@ function PinToggle({ pin, monitor, ui }) {
|
|
|
1506
1531
|
setToast({ kind: "error", text: ui.marketLimitToast });
|
|
1507
1532
|
}
|
|
1508
1533
|
};
|
|
1509
|
-
return /* @__PURE__ */ (0,
|
|
1510
|
-
/* @__PURE__ */ (0,
|
|
1534
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "ss-w-pin-wrap", children: [
|
|
1535
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
1511
1536
|
"button",
|
|
1512
1537
|
{
|
|
1513
1538
|
type: "button",
|
|
@@ -1516,46 +1541,46 @@ function PinToggle({ pin, monitor, ui }) {
|
|
|
1516
1541
|
"aria-pressed": pinned,
|
|
1517
1542
|
"aria-label": pinned ? labels.unpin : labels.pin,
|
|
1518
1543
|
onClick,
|
|
1519
|
-
children: /* @__PURE__ */ (0,
|
|
1544
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("path", { fill: "currentColor", 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" }) })
|
|
1520
1545
|
}
|
|
1521
1546
|
),
|
|
1522
|
-
/* @__PURE__ */ (0,
|
|
1547
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Toast, { toast, onDismiss: dismiss })
|
|
1523
1548
|
] });
|
|
1524
1549
|
}
|
|
1525
1550
|
|
|
1526
1551
|
// src/components/BettingInsightList.tsx
|
|
1527
|
-
var
|
|
1552
|
+
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
1528
1553
|
function StatRows({ stats }) {
|
|
1529
|
-
return /* @__PURE__ */ (0,
|
|
1530
|
-
/* @__PURE__ */ (0,
|
|
1531
|
-
/* @__PURE__ */ (0,
|
|
1554
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "ss-w-bi-rows", children: stats.map((s) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ss-w-bi-row", children: [
|
|
1555
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-row-lbl", children: s.label }),
|
|
1556
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-row-num", children: s.value })
|
|
1532
1557
|
] }, `${s.label}:${s.value}`)) });
|
|
1533
1558
|
}
|
|
1534
1559
|
function ScopedStats({ scopes }) {
|
|
1535
|
-
const [active, setActive] = (0,
|
|
1560
|
+
const [active, setActive] = (0, import_react10.useState)(0);
|
|
1536
1561
|
const current = scopes[active] ?? scopes[0] ?? { key: "", label: "", stats: [] };
|
|
1537
|
-
return /* @__PURE__ */ (0,
|
|
1538
|
-
/* @__PURE__ */ (0,
|
|
1539
|
-
/* @__PURE__ */ (0,
|
|
1562
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ss-w-bi-scoped", children: [
|
|
1563
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "ss-w-bi-scopes", role: "group", children: scopes.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("button", { type: "button", className: "ss-w-bi-chip", "aria-pressed": i === active, onClick: () => setActive(i), children: s.label }, s.key)) }),
|
|
1564
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(StatRows, { stats: current.stats }, current.key)
|
|
1540
1565
|
] });
|
|
1541
1566
|
}
|
|
1542
1567
|
function hasStatsContent(it) {
|
|
1543
1568
|
return !!it.scopes && it.scopes.length >= 2 || it.stats.length > 0;
|
|
1544
1569
|
}
|
|
1545
1570
|
function ReasonStrip({ it, ui }) {
|
|
1546
|
-
const [open, setOpen] = (0,
|
|
1571
|
+
const [open, setOpen] = (0, import_react10.useState)(false);
|
|
1547
1572
|
const hasScopes = !!it.scopes && it.scopes.length >= 2;
|
|
1548
1573
|
const hasStats = hasStatsContent(it);
|
|
1549
1574
|
const hasText = !!it.text;
|
|
1550
1575
|
if (!hasText && !hasStats) return null;
|
|
1551
1576
|
const expandable = hasStats || (it.text?.length ?? 0) > 90;
|
|
1552
|
-
return /* @__PURE__ */ (0,
|
|
1553
|
-
/* @__PURE__ */ (0,
|
|
1554
|
-
/* @__PURE__ */ (0,
|
|
1555
|
-
hasText ? /* @__PURE__ */ (0,
|
|
1556
|
-
open && hasStats ? hasScopes ? /* @__PURE__ */ (0,
|
|
1577
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ss-w-bi-reason", children: [
|
|
1578
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-chart", "aria-hidden": "true" }),
|
|
1579
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ss-w-bi-reason-body", children: [
|
|
1580
|
+
hasText ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: `ss-w-bi-text${open ? "" : " ss-w-bi-text-clamp"}`, children: it.text }) : null,
|
|
1581
|
+
open && hasStats ? hasScopes ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ScopedStats, { scopes: it.scopes }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(StatRows, { stats: it.stats }) : null
|
|
1557
1582
|
] }),
|
|
1558
|
-
expandable ? /* @__PURE__ */ (0,
|
|
1583
|
+
expandable ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1559
1584
|
"button",
|
|
1560
1585
|
{
|
|
1561
1586
|
type: "button",
|
|
@@ -1563,26 +1588,26 @@ function ReasonStrip({ it, ui }) {
|
|
|
1563
1588
|
"aria-expanded": open,
|
|
1564
1589
|
"aria-label": open ? ui?.hideStats ?? "Hide stats" : ui?.showStats ?? "Show stats",
|
|
1565
1590
|
onClick: () => setOpen((v) => !v),
|
|
1566
|
-
children: /* @__PURE__ */ (0,
|
|
1591
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: `ss-w-bi-arrow${open ? " ss-w-bi-arrow-open" : ""}`, "aria-hidden": "true" })
|
|
1567
1592
|
}
|
|
1568
1593
|
) : null
|
|
1569
1594
|
] });
|
|
1570
1595
|
}
|
|
1571
1596
|
function CardFixture({ it }) {
|
|
1572
1597
|
if (it.homeTeamName && it.awayTeamName) {
|
|
1573
|
-
return /* @__PURE__ */ (0,
|
|
1574
|
-
/* @__PURE__ */ (0,
|
|
1575
|
-
/* @__PURE__ */ (0,
|
|
1576
|
-
/* @__PURE__ */ (0,
|
|
1577
|
-
/* @__PURE__ */ (0,
|
|
1578
|
-
/* @__PURE__ */ (0,
|
|
1598
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
|
|
1599
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Crest2, { kind: "team", url: it.homeCrest, name: it.homeTeamName }),
|
|
1600
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-team", children: it.homeTeamName }),
|
|
1601
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-vs", "aria-hidden": "true", children: "vs" }),
|
|
1602
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-team", children: it.awayTeamName }),
|
|
1603
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Crest2, { kind: "team", url: it.awayCrest, name: it.awayTeamName })
|
|
1579
1604
|
] });
|
|
1580
1605
|
}
|
|
1581
|
-
if (it.fixture) return /* @__PURE__ */ (0,
|
|
1606
|
+
if (it.fixture) return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-fixture-txt", children: it.fixture });
|
|
1582
1607
|
if (it.competition) {
|
|
1583
|
-
return /* @__PURE__ */ (0,
|
|
1584
|
-
/* @__PURE__ */ (0,
|
|
1585
|
-
/* @__PURE__ */ (0,
|
|
1608
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
|
|
1609
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Crest2, { kind: "comp", url: it.competitionCrest, name: it.competition }),
|
|
1610
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-comp", children: it.competition })
|
|
1586
1611
|
] });
|
|
1587
1612
|
}
|
|
1588
1613
|
return null;
|
|
@@ -1595,38 +1620,38 @@ function InsightCard({ it, ui, slip, monitor }) {
|
|
|
1595
1620
|
const compInMeta = leftIsFixture && !!it.competition;
|
|
1596
1621
|
const showPin = !!monitor && it.pinEnabled;
|
|
1597
1622
|
const showHeader = leftIsFixture || !!it.competition || live || !!kickoff || showPin;
|
|
1598
|
-
return /* @__PURE__ */ (0,
|
|
1599
|
-
showHeader ? /* @__PURE__ */ (0,
|
|
1600
|
-
/* @__PURE__ */ (0,
|
|
1601
|
-
/* @__PURE__ */ (0,
|
|
1602
|
-
live ? /* @__PURE__ */ (0,
|
|
1603
|
-
/* @__PURE__ */ (0,
|
|
1623
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ss-w-binsight", children: [
|
|
1624
|
+
showHeader ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ss-w-bi-header", children: [
|
|
1625
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-header-left", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(CardFixture, { it }) }),
|
|
1626
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "ss-w-bi-header-right", children: [
|
|
1627
|
+
live ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "ss-w-bi-live", children: [
|
|
1628
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-live-dot", "aria-hidden": "true" }),
|
|
1604
1629
|
ui?.liveLabel ?? "Live"
|
|
1605
1630
|
] }) : null,
|
|
1606
|
-
compInMeta ? /* @__PURE__ */ (0,
|
|
1607
|
-
kickoff ? /* @__PURE__ */ (0,
|
|
1631
|
+
compInMeta ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-comp-meta", title: it.competition, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Crest2, { kind: "comp", url: it.competitionCrest, name: it.competition }) }) : null,
|
|
1632
|
+
kickoff ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "ss-w-bi-kick", children: [
|
|
1608
1633
|
kickoff.dayLabel,
|
|
1609
1634
|
" ",
|
|
1610
1635
|
kickoff.time
|
|
1611
1636
|
] }) : null,
|
|
1612
|
-
showPin && ui ? /* @__PURE__ */ (0,
|
|
1637
|
+
showPin && ui ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(PinToggle, { ui, monitor, pin: { kind: "match", matchId: it.matchId } }) : null
|
|
1613
1638
|
] })
|
|
1614
1639
|
] }) : null,
|
|
1615
|
-
/* @__PURE__ */ (0,
|
|
1616
|
-
/* @__PURE__ */ (0,
|
|
1617
|
-
/* @__PURE__ */ (0,
|
|
1618
|
-
it.selection ? /* @__PURE__ */ (0,
|
|
1619
|
-
/* @__PURE__ */ (0,
|
|
1620
|
-
/* @__PURE__ */ (0,
|
|
1640
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ss-w-bi-action-row", children: [
|
|
1641
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "ss-w-bi-pick", children: [
|
|
1642
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-market", children: it.market }),
|
|
1643
|
+
it.selection ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
|
|
1644
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-pick-dot", "aria-hidden": "true", children: "\xB7" }),
|
|
1645
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-sel", children: it.selection })
|
|
1621
1646
|
] }) : null
|
|
1622
1647
|
] }),
|
|
1623
|
-
it.odds ? /* @__PURE__ */ (0,
|
|
1624
|
-
/* @__PURE__ */ (0,
|
|
1625
|
-
/* @__PURE__ */ (0,
|
|
1626
|
-
it.bookmaker ? /* @__PURE__ */ (0,
|
|
1648
|
+
it.odds ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "ss-w-bi-odds", children: [
|
|
1649
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("b", { children: it.odds }),
|
|
1650
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(OddsMovementBadge, { previous: it.previousOdds, current: it.odds, direction: it.movementDirection, ui }),
|
|
1651
|
+
it.bookmaker ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-book", children: it.bookmaker }) : null
|
|
1627
1652
|
] }) : null,
|
|
1628
|
-
/* @__PURE__ */ (0,
|
|
1629
|
-
showPin && ui ? /* @__PURE__ */ (0,
|
|
1653
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(AddToSlipButton, { it, slip, ui }),
|
|
1654
|
+
showPin && ui ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1630
1655
|
PinToggle,
|
|
1631
1656
|
{
|
|
1632
1657
|
ui,
|
|
@@ -1642,56 +1667,56 @@ function InsightCard({ it, ui, slip, monitor }) {
|
|
|
1642
1667
|
}
|
|
1643
1668
|
) : null
|
|
1644
1669
|
] }),
|
|
1645
|
-
it.isMarketFloor ? /* @__PURE__ */ (0,
|
|
1646
|
-
/* @__PURE__ */ (0,
|
|
1647
|
-
it.disclaimer ? /* @__PURE__ */ (0,
|
|
1670
|
+
it.isMarketFloor ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "ss-w-bi-floor", children: ui?.marketFloorLabel ?? "Market price \xB7 not a value pick" }) : null,
|
|
1671
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ReasonStrip, { it, ui }),
|
|
1672
|
+
it.disclaimer ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "ss-w-bi-disc", children: it.disclaimer }) : null
|
|
1648
1673
|
] });
|
|
1649
1674
|
}
|
|
1650
1675
|
function BettingInsightList({ insights, ui, slip, monitor }) {
|
|
1651
1676
|
if (!insights || insights.length === 0) return null;
|
|
1652
|
-
return /* @__PURE__ */ (0,
|
|
1677
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "ss-w-binsights", children: insights.map((it) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(InsightCard, { it, ui, slip, monitor }, it.id)) });
|
|
1653
1678
|
}
|
|
1654
1679
|
|
|
1655
1680
|
// src/components/MarketOddsCardList.tsx
|
|
1656
|
-
var
|
|
1657
|
-
var
|
|
1681
|
+
var import_react11 = require("react");
|
|
1682
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
1658
1683
|
function OddsRow({ vm, row, ui, slip, inSlipIds }) {
|
|
1659
1684
|
const selection = vm.addToSlipEnabled ? marketOddsRowToSlipSelection(vm, row, slip.conversationId) : null;
|
|
1660
1685
|
const inSlip = !!inSlipIds && row.matchOddsId != null && !!inSlipIds[row.matchOddsId];
|
|
1661
|
-
return /* @__PURE__ */ (0,
|
|
1662
|
-
/* @__PURE__ */ (0,
|
|
1663
|
-
/* @__PURE__ */ (0,
|
|
1664
|
-
/* @__PURE__ */ (0,
|
|
1665
|
-
inSlip && ui ? /* @__PURE__ */ (0,
|
|
1686
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "ss-w-mo-row", children: [
|
|
1687
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ss-w-mo-sel", children: row.selection }),
|
|
1688
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(OddsMovementBadge, { previous: row.previousOdds, current: row.odds, direction: row.movementDirection, ui }),
|
|
1689
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ss-w-mo-price", children: row.odds }),
|
|
1690
|
+
inSlip && ui ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { className: "ss-w-mon-inslip", children: [
|
|
1666
1691
|
"\u2713 ",
|
|
1667
1692
|
ui.inSlipLabel
|
|
1668
1693
|
] }) : null,
|
|
1669
|
-
/* @__PURE__ */ (0,
|
|
1694
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SlipButton, { selection, shownOdds: row.odds, marketName: vm.market, slip, ui })
|
|
1670
1695
|
] });
|
|
1671
1696
|
}
|
|
1672
1697
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds }) {
|
|
1673
|
-
const [open, setOpen] = (0,
|
|
1698
|
+
const [open, setOpen] = (0, import_react11.useState)(false);
|
|
1674
1699
|
const kickoff = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
|
|
1675
1700
|
const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
|
|
1676
1701
|
const showPin = !!monitor && vm.pinEnabled;
|
|
1677
1702
|
const showHeader = !!vm.competition || vm.isLive || !!kickoff || showPin;
|
|
1678
|
-
return /* @__PURE__ */ (0,
|
|
1679
|
-
showHeader ? /* @__PURE__ */ (0,
|
|
1680
|
-
/* @__PURE__ */ (0,
|
|
1681
|
-
/* @__PURE__ */ (0,
|
|
1682
|
-
/* @__PURE__ */ (0,
|
|
1703
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "ss-w-mocard", children: [
|
|
1704
|
+
showHeader ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "ss-w-bi-header", children: [
|
|
1705
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ss-w-bi-header-left", children: vm.competition ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
|
|
1706
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Crest2, { kind: "comp", url: vm.competitionCrest, name: vm.competition }),
|
|
1707
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ss-w-bi-comp", children: vm.competition })
|
|
1683
1708
|
] }) : null }),
|
|
1684
|
-
/* @__PURE__ */ (0,
|
|
1685
|
-
vm.isLive ? /* @__PURE__ */ (0,
|
|
1686
|
-
/* @__PURE__ */ (0,
|
|
1709
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { className: "ss-w-bi-header-right", children: [
|
|
1710
|
+
vm.isLive ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { className: "ss-w-bi-live", children: [
|
|
1711
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ss-w-bi-live-dot", "aria-hidden": "true" }),
|
|
1687
1712
|
ui?.liveLabel ?? "Live"
|
|
1688
1713
|
] }) : null,
|
|
1689
|
-
kickoff ? /* @__PURE__ */ (0,
|
|
1714
|
+
kickoff ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { className: "ss-w-bi-kick", children: [
|
|
1690
1715
|
kickoff.dayLabel,
|
|
1691
1716
|
" ",
|
|
1692
1717
|
kickoff.time
|
|
1693
1718
|
] }) : null,
|
|
1694
|
-
showPin && ui ? /* @__PURE__ */ (0,
|
|
1719
|
+
showPin && ui ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1695
1720
|
PinToggle,
|
|
1696
1721
|
{
|
|
1697
1722
|
ui,
|
|
@@ -1701,35 +1726,35 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds }) {
|
|
|
1701
1726
|
) : null
|
|
1702
1727
|
] })
|
|
1703
1728
|
] }) : null,
|
|
1704
|
-
hasNamedTeams || vm.fixture || vm.market ? /* @__PURE__ */ (0,
|
|
1705
|
-
hasNamedTeams ? /* @__PURE__ */ (0,
|
|
1706
|
-
/* @__PURE__ */ (0,
|
|
1707
|
-
/* @__PURE__ */ (0,
|
|
1708
|
-
/* @__PURE__ */ (0,
|
|
1709
|
-
/* @__PURE__ */ (0,
|
|
1710
|
-
/* @__PURE__ */ (0,
|
|
1711
|
-
] }) : vm.fixture ? /* @__PURE__ */ (0,
|
|
1712
|
-
vm.market ? /* @__PURE__ */ (0,
|
|
1729
|
+
hasNamedTeams || vm.fixture || vm.market ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "ss-w-mo-sub", children: [
|
|
1730
|
+
hasNamedTeams ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "ss-w-bi-fixture", children: [
|
|
1731
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Crest2, { kind: "team", url: vm.homeCrest, name: vm.homeTeamName }),
|
|
1732
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ss-w-bi-team", children: vm.homeTeamName }),
|
|
1733
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ss-w-bi-vs", "aria-hidden": "true", children: "vs" }),
|
|
1734
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ss-w-bi-team", children: vm.awayTeamName }),
|
|
1735
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Crest2, { kind: "team", url: vm.awayCrest, name: vm.awayTeamName })
|
|
1736
|
+
] }) : vm.fixture ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ss-w-mo-teams", children: vm.fixture }) : null,
|
|
1737
|
+
vm.market ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ss-w-mo-market", children: vm.market }) : null
|
|
1713
1738
|
] }) : null,
|
|
1714
|
-
/* @__PURE__ */ (0,
|
|
1715
|
-
vm.mainRows.map((row) => /* @__PURE__ */ (0,
|
|
1716
|
-
open ? vm.moreRows.map((row) => /* @__PURE__ */ (0,
|
|
1739
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "ss-w-mo-rows", children: [
|
|
1740
|
+
vm.mainRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(OddsRow, { vm, row, ui, slip, inSlipIds }, row.key)),
|
|
1741
|
+
open ? vm.moreRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(OddsRow, { vm, row, ui, slip, inSlipIds }, row.key)) : null
|
|
1717
1742
|
] }),
|
|
1718
|
-
vm.moreRows.length > 0 ? /* @__PURE__ */ (0,
|
|
1719
|
-
/* @__PURE__ */ (0,
|
|
1720
|
-
/* @__PURE__ */ (0,
|
|
1743
|
+
vm.moreRows.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("button", { type: "button", className: "ss-w-mo-more", "aria-expanded": open, onClick: () => setOpen((v) => !v), children: [
|
|
1744
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: open ? ui?.hideLines ?? "Hide lines" : `${ui?.moreLines ?? "More lines"} (${vm.moreRows.length})` }),
|
|
1745
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: `ss-w-mo-more-chev${open ? " ss-w-mo-more-chev-up" : ""}`, "aria-hidden": "true" })
|
|
1721
1746
|
] }) : null,
|
|
1722
|
-
vm.bookmaker ? /* @__PURE__ */ (0,
|
|
1723
|
-
vm.disclaimer ? /* @__PURE__ */ (0,
|
|
1747
|
+
vm.bookmaker ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "ss-w-mo-foot", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: vm.bookmaker }) }) : null,
|
|
1748
|
+
vm.disclaimer ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "ss-w-bi-disc", children: vm.disclaimer }) : null
|
|
1724
1749
|
] });
|
|
1725
1750
|
}
|
|
1726
1751
|
function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds }) {
|
|
1727
1752
|
if (!cards || cards.length === 0) return null;
|
|
1728
|
-
return /* @__PURE__ */ (0,
|
|
1753
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "ss-w-mocards", children: cards.map((vm) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(MarketOddsCard, { vm, ui, slip, monitor, inSlipIds }, vm.id)) });
|
|
1729
1754
|
}
|
|
1730
1755
|
|
|
1731
1756
|
// src/components/OddsMovementCard.tsx
|
|
1732
|
-
var
|
|
1757
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
1733
1758
|
function directionWord(vm, ui) {
|
|
1734
1759
|
if (vm.direction === "shortened") return ui?.oddsShortened ?? "shortened";
|
|
1735
1760
|
if (vm.direction === "drifted") return ui?.oddsDrifted ?? "drifted";
|
|
@@ -1740,11 +1765,11 @@ function OddsMovementCard({ vm, ui, monitor }) {
|
|
|
1740
1765
|
const drift = word ? `, ${word}` : "";
|
|
1741
1766
|
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}.`;
|
|
1742
1767
|
const showPin = !!monitor && vm.pinEnabled;
|
|
1743
|
-
return /* @__PURE__ */ (0,
|
|
1744
|
-
/* @__PURE__ */ (0,
|
|
1745
|
-
/* @__PURE__ */ (0,
|
|
1746
|
-
/* @__PURE__ */ (0,
|
|
1747
|
-
showPin && ui ? /* @__PURE__ */ (0,
|
|
1768
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ss-w-omcard", children: [
|
|
1769
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ss-w-om-head", children: [
|
|
1770
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ss-w-om-market", children: vm.market }),
|
|
1771
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ss-w-om-tag", children: ui?.priceMovement ?? "Price movement" }),
|
|
1772
|
+
showPin && ui ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1748
1773
|
PinToggle,
|
|
1749
1774
|
{
|
|
1750
1775
|
ui,
|
|
@@ -1761,13 +1786,13 @@ function OddsMovementCard({ vm, ui, monitor }) {
|
|
|
1761
1786
|
}
|
|
1762
1787
|
) : null
|
|
1763
1788
|
] }),
|
|
1764
|
-
vm.fixture ? /* @__PURE__ */ (0,
|
|
1765
|
-
/* @__PURE__ */ (0,
|
|
1766
|
-
vm.competition ? /* @__PURE__ */ (0,
|
|
1789
|
+
vm.fixture ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ss-w-om-fixture", children: [
|
|
1790
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: vm.fixture }),
|
|
1791
|
+
vm.competition ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ss-w-om-comp", children: vm.competition }) : null
|
|
1767
1792
|
] }) : null,
|
|
1768
|
-
/* @__PURE__ */ (0,
|
|
1769
|
-
/* @__PURE__ */ (0,
|
|
1770
|
-
vm.geometry === null ? /* @__PURE__ */ (0,
|
|
1793
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-om-sel", children: vm.selection }),
|
|
1794
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(OddsMovementBadge, { previous: vm.opening, current: vm.current, direction: vm.direction, ui }),
|
|
1795
|
+
vm.geometry === null ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("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__ */ (0, import_jsx_runtime15.jsxs)(
|
|
1771
1796
|
"svg",
|
|
1772
1797
|
{
|
|
1773
1798
|
className: "ss-w-om-chart",
|
|
@@ -1776,83 +1801,83 @@ function OddsMovementCard({ vm, ui, monitor }) {
|
|
|
1776
1801
|
role: "img",
|
|
1777
1802
|
"aria-label": aria,
|
|
1778
1803
|
children: [
|
|
1779
|
-
vm.geometry.gridlines.map((g) => /* @__PURE__ */ (0,
|
|
1780
|
-
/* @__PURE__ */ (0,
|
|
1781
|
-
/* @__PURE__ */ (0,
|
|
1804
|
+
vm.geometry.gridlines.map((g) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("g", { children: [
|
|
1805
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("line", { className: "ss-w-om-grid", x1: 40, y1: g.y, x2: CHART_VIEW_W - 8, y2: g.y }),
|
|
1806
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("text", { className: "ss-w-om-ylab", x: 34, y: g.y + 3, textAnchor: "end", children: g.price.toFixed(2) })
|
|
1782
1807
|
] }, g.price)),
|
|
1783
|
-
/* @__PURE__ */ (0,
|
|
1784
|
-
vm.geometry.markers.map((m, i) => /* @__PURE__ */ (0,
|
|
1785
|
-
ui?.chartTimeLabel ? /* @__PURE__ */ (0,
|
|
1786
|
-
/* @__PURE__ */ (0,
|
|
1787
|
-
/* @__PURE__ */ (0,
|
|
1788
|
-
] }) : /* @__PURE__ */ (0,
|
|
1808
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("path", { className: "ss-w-om-line", d: vm.geometry.path, fill: "none" }),
|
|
1809
|
+
vm.geometry.markers.map((m, i) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("circle", { className: "ss-w-om-dot", cx: m.x, cy: m.y, r: 2.5 }, i)),
|
|
1810
|
+
ui?.chartTimeLabel ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
|
|
1811
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("text", { className: "ss-w-om-xlab", x: 40, y: CHART_VIEW_H - 8, textAnchor: "start", children: ui.chartTimeLabel(vm.geometry.startMs) }),
|
|
1812
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("text", { className: "ss-w-om-xlab", x: CHART_VIEW_W - 8, y: CHART_VIEW_H - 8, textAnchor: "end", children: ui.chartTimeLabel(vm.geometry.endMs) })
|
|
1813
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("text", { className: "ss-w-om-xlab", x: 40, y: CHART_VIEW_H - 8, children: ui?.movementWindow ? ui.movementWindow(vm.windowHours) : `Last ${vm.windowHours}h` })
|
|
1789
1814
|
]
|
|
1790
1815
|
}
|
|
1791
1816
|
),
|
|
1792
|
-
/* @__PURE__ */ (0,
|
|
1793
|
-
/* @__PURE__ */ (0,
|
|
1817
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ss-w-om-foot", children: [
|
|
1818
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
|
|
1794
1819
|
ui?.openingLabel ?? "Opening",
|
|
1795
1820
|
" ",
|
|
1796
|
-
/* @__PURE__ */ (0,
|
|
1821
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("b", { children: vm.opening })
|
|
1797
1822
|
] }),
|
|
1798
|
-
/* @__PURE__ */ (0,
|
|
1823
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
|
|
1799
1824
|
ui?.currentLabel ?? "Current",
|
|
1800
1825
|
" ",
|
|
1801
|
-
/* @__PURE__ */ (0,
|
|
1826
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("b", { children: vm.current })
|
|
1802
1827
|
] })
|
|
1803
1828
|
] }),
|
|
1804
|
-
vm.bookmaker ? /* @__PURE__ */ (0,
|
|
1805
|
-
vm.excludedCount > 0 ? /* @__PURE__ */ (0,
|
|
1806
|
-
vm.isSuspended ? /* @__PURE__ */ (0,
|
|
1807
|
-
vm.disclaimer ? /* @__PURE__ */ (0,
|
|
1829
|
+
vm.bookmaker ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-om-foot", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: vm.bookmaker }) }) : null,
|
|
1830
|
+
vm.excludedCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-om-excl", children: ui?.excludedSuspended ? ui.excludedSuspended(vm.excludedCount) : `${vm.excludedCount} suspended price(s) excluded from this chart.` }) : null,
|
|
1831
|
+
vm.isSuspended ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-om-susp", children: ui?.selectionSuspended ?? "This selection is not currently available to bet." }) : null,
|
|
1832
|
+
vm.disclaimer ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-om-disc", children: vm.disclaimer }) : null
|
|
1808
1833
|
] });
|
|
1809
1834
|
}
|
|
1810
1835
|
function OddsMovementCardList({ cards, ui, monitor }) {
|
|
1811
1836
|
if (!cards || cards.length === 0) return null;
|
|
1812
|
-
return /* @__PURE__ */ (0,
|
|
1837
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-omcards", children: cards.map((vm) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(OddsMovementCard, { vm, ui, monitor }, vm.id)) });
|
|
1813
1838
|
}
|
|
1814
1839
|
|
|
1815
1840
|
// src/components/ActionButtons.tsx
|
|
1816
|
-
var
|
|
1841
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
1817
1842
|
function ActionButtons({ actions, loading, disabled, onAct }) {
|
|
1818
1843
|
if (actions.length === 0 && !loading) return null;
|
|
1819
|
-
return /* @__PURE__ */ (0,
|
|
1820
|
-
actions.map((a, i) => /* @__PURE__ */ (0,
|
|
1821
|
-
actions.length === 0 && loading ? /* @__PURE__ */ (0,
|
|
1822
|
-
/* @__PURE__ */ (0,
|
|
1823
|
-
/* @__PURE__ */ (0,
|
|
1844
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "ss-w-actions", children: [
|
|
1845
|
+
actions.map((a, i) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("button", { type: "button", className: "ss-w-abtn", disabled, onClick: () => onAct(a), children: a.label }, `${a.label}-${i}`)),
|
|
1846
|
+
actions.length === 0 && loading ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
|
|
1847
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "ss-w-abtn-shimmer" }),
|
|
1848
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "ss-w-abtn-shimmer" })
|
|
1824
1849
|
] }) : null
|
|
1825
1850
|
] });
|
|
1826
1851
|
}
|
|
1827
1852
|
|
|
1828
1853
|
// src/components/dashboard/DashboardTile.tsx
|
|
1829
|
-
var
|
|
1854
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
1830
1855
|
var MAX_CRESTS = 3;
|
|
1831
1856
|
function DashboardTile({ tile, onTap }) {
|
|
1832
1857
|
const spanClass = tile.span === "full" ? "ss-w-dash-tile--full" : "ss-w-dash-tile--half";
|
|
1833
1858
|
const crests = (tile.imageUrls ?? []).slice(0, MAX_CRESTS);
|
|
1834
1859
|
const hasMeta = Boolean(tile.badgeText) || crests.length > 0;
|
|
1835
|
-
return /* @__PURE__ */ (0,
|
|
1836
|
-
/* @__PURE__ */ (0,
|
|
1837
|
-
/* @__PURE__ */ (0,
|
|
1838
|
-
/* @__PURE__ */ (0,
|
|
1839
|
-
tile.subtitle ? /* @__PURE__ */ (0,
|
|
1860
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("button", { type: "button", className: `ss-w-dash-tile ${spanClass}`, onClick: onTap, children: [
|
|
1861
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-tile-icon", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(DashboardIcon, { name: tile.icon }) }),
|
|
1862
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-dash-tile-body", children: [
|
|
1863
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-tile-title", children: tile.title }),
|
|
1864
|
+
tile.subtitle ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-tile-subtitle", children: tile.subtitle }) : null,
|
|
1840
1865
|
hasMeta ? (
|
|
1841
1866
|
// Badge + crests sit on their own row, below the title, instead of sharing the
|
|
1842
1867
|
// icon/chevron row -- at the half-span tile's ~180px width a nowrap badge alone
|
|
1843
1868
|
// (~70px) left the title column at ~22px and forced character-by-character wrapping.
|
|
1844
|
-
/* @__PURE__ */ (0,
|
|
1845
|
-
tile.badgeText ? /* @__PURE__ */ (0,
|
|
1846
|
-
crests.length > 0 ? /* @__PURE__ */ (0,
|
|
1869
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-dash-tile-meta", children: [
|
|
1870
|
+
tile.badgeText ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-tile-badge", children: tile.badgeText }) : null,
|
|
1871
|
+
crests.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-tile-crests", children: crests.map((url, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-tile-crest", style: { backgroundImage: `url(${url})` }, "aria-hidden": "true" }, `${url}-${i}`)) }) : null
|
|
1847
1872
|
] })
|
|
1848
1873
|
) : null
|
|
1849
1874
|
] }),
|
|
1850
|
-
/* @__PURE__ */ (0,
|
|
1875
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-tile-chevron", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ChevronIcon, {}) })
|
|
1851
1876
|
] });
|
|
1852
1877
|
}
|
|
1853
1878
|
|
|
1854
1879
|
// src/components/dashboard/GreetingDashboard.tsx
|
|
1855
|
-
var
|
|
1880
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
1856
1881
|
var LAYOUT_CLASSES = {
|
|
1857
1882
|
market: "ss-w-dash--market",
|
|
1858
1883
|
goal: "ss-w-dash--goal",
|
|
@@ -1862,109 +1887,109 @@ function layoutClass(layout) {
|
|
|
1862
1887
|
return Object.prototype.hasOwnProperty.call(LAYOUT_CLASSES, layout) ? LAYOUT_CLASSES[layout] : LAYOUT_CLASSES.goal;
|
|
1863
1888
|
}
|
|
1864
1889
|
function GreetingDashboard({ dashboard, onTap }) {
|
|
1865
|
-
return /* @__PURE__ */ (0,
|
|
1866
|
-
/* @__PURE__ */ (0,
|
|
1867
|
-
/* @__PURE__ */ (0,
|
|
1868
|
-
dashboard.subtitle ? /* @__PURE__ */ (0,
|
|
1890
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: `ss-w-dash ${layoutClass(dashboard.layout)}`, children: [
|
|
1891
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "ss-w-dash-head", children: [
|
|
1892
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "ss-w-dash-title", children: dashboard.title }),
|
|
1893
|
+
dashboard.subtitle ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "ss-w-dash-subtitle", children: dashboard.subtitle }) : null
|
|
1869
1894
|
] }),
|
|
1870
|
-
/* @__PURE__ */ (0,
|
|
1871
|
-
dashboard.footerTip ? /* @__PURE__ */ (0,
|
|
1895
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "ss-w-dash-grid", children: dashboard.tiles.map((t, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(DashboardTile, { tile: t, onTap: () => onTap(t, i) }, `${t.title}-${i}`)) }),
|
|
1896
|
+
dashboard.footerTip ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "ss-w-dash-foot", children: dashboard.footerTip }) : null
|
|
1872
1897
|
] });
|
|
1873
1898
|
}
|
|
1874
1899
|
|
|
1875
1900
|
// src/components/dashboard/FixtureCard.tsx
|
|
1876
|
-
var
|
|
1901
|
+
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
1877
1902
|
function teamFormResultClass(result) {
|
|
1878
1903
|
if (result === "W") return "ss-w-fandash-teamform-cell--win";
|
|
1879
1904
|
if (result === "L") return "ss-w-fandash-teamform-cell--loss";
|
|
1880
1905
|
return "ss-w-fandash-teamform-cell--draw";
|
|
1881
1906
|
}
|
|
1882
1907
|
function TeamFormCell({ m, subjectCrestUrl, subjectName }) {
|
|
1883
|
-
const subjectCrest = /* @__PURE__ */ (0,
|
|
1884
|
-
const opponentCrest = /* @__PURE__ */ (0,
|
|
1908
|
+
const subjectCrest = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Crest2, { url: subjectCrestUrl ?? void 0, name: subjectName, kind: "team" });
|
|
1909
|
+
const opponentCrest = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Crest2, { url: m.opponentCrestUrl ?? void 0, kind: "team" });
|
|
1885
1910
|
const score = m.teamIsHome ? `${m.teamScore} - ${m.oppScore}` : `${m.oppScore} - ${m.teamScore}`;
|
|
1886
|
-
return /* @__PURE__ */ (0,
|
|
1911
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: `ss-w-fandash-teamform-cell ${teamFormResultClass(m.result)}`, children: [
|
|
1887
1912
|
m.teamIsHome ? subjectCrest : opponentCrest,
|
|
1888
|
-
/* @__PURE__ */ (0,
|
|
1913
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-teamform-score", children: score }),
|
|
1889
1914
|
m.teamIsHome ? opponentCrest : subjectCrest
|
|
1890
1915
|
] });
|
|
1891
1916
|
}
|
|
1892
1917
|
var TEAM_FORM_ROWS = 5;
|
|
1893
1918
|
function teamFormRows(data) {
|
|
1894
1919
|
return Array.from({ length: TEAM_FORM_ROWS }, (_, i) => i).flatMap((i) => [
|
|
1895
|
-
/* @__PURE__ */ (0,
|
|
1896
|
-
/* @__PURE__ */ (0,
|
|
1920
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-teamform-slot", children: data.homeForm[i] ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(TeamFormCell, { m: data.homeForm[i], subjectCrestUrl: data.homeCrestUrl, subjectName: data.homeName }) : null }, `h-${i}`),
|
|
1921
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-teamform-slot", children: data.awayForm[i] ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(TeamFormCell, { m: data.awayForm[i], subjectCrestUrl: data.awayCrestUrl, subjectName: data.awayName }) : null }, `a-${i}`)
|
|
1897
1922
|
]);
|
|
1898
1923
|
}
|
|
1899
1924
|
function FixtureCard({ card }) {
|
|
1900
1925
|
const { data } = card;
|
|
1901
1926
|
const h2h = data.h2H;
|
|
1902
|
-
return /* @__PURE__ */ (0,
|
|
1903
|
-
/* @__PURE__ */ (0,
|
|
1904
|
-
/* @__PURE__ */ (0,
|
|
1927
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
|
|
1928
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-fixture", children: [
|
|
1929
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "ss-w-fandash-eyebrow", children: [
|
|
1905
1930
|
card.title,
|
|
1906
1931
|
" \xB7 ",
|
|
1907
1932
|
data.competition
|
|
1908
1933
|
] }),
|
|
1909
|
-
/* @__PURE__ */ (0,
|
|
1910
|
-
/* @__PURE__ */ (0,
|
|
1911
|
-
/* @__PURE__ */ (0,
|
|
1912
|
-
/* @__PURE__ */ (0,
|
|
1934
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "ss-w-fandash-fixture-teams", children: [
|
|
1935
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "ss-w-fandash-fixture-team", children: [
|
|
1936
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Crest2, { url: data.homeCrestUrl ?? void 0, name: data.homeName, kind: "team" }),
|
|
1937
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-fixture-name", children: data.homeName })
|
|
1913
1938
|
] }),
|
|
1914
|
-
/* @__PURE__ */ (0,
|
|
1915
|
-
/* @__PURE__ */ (0,
|
|
1916
|
-
/* @__PURE__ */ (0,
|
|
1917
|
-
/* @__PURE__ */ (0,
|
|
1939
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-fixture-vs", children: "v" }),
|
|
1940
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "ss-w-fandash-fixture-team ss-w-fandash-fixture-team--away", children: [
|
|
1941
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-fixture-name", children: data.awayName }),
|
|
1942
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Crest2, { url: data.awayCrestUrl ?? void 0, name: data.awayName, kind: "team" })
|
|
1918
1943
|
] })
|
|
1919
1944
|
] }),
|
|
1920
|
-
/* @__PURE__ */ (0,
|
|
1921
|
-
/* @__PURE__ */ (0,
|
|
1922
|
-
data.venue ? /* @__PURE__ */ (0,
|
|
1945
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "ss-w-fandash-fixture-meta", children: [
|
|
1946
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-fixture-kickoff", children: data.kickoffLabel }),
|
|
1947
|
+
data.venue ? /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "ss-w-fandash-fixture-venue", children: [
|
|
1923
1948
|
" \xB7 ",
|
|
1924
1949
|
data.venue
|
|
1925
1950
|
] }) : null
|
|
1926
1951
|
] })
|
|
1927
1952
|
] }),
|
|
1928
|
-
/* @__PURE__ */ (0,
|
|
1929
|
-
/* @__PURE__ */ (0,
|
|
1930
|
-
/* @__PURE__ */ (0,
|
|
1931
|
-
/* @__PURE__ */ (0,
|
|
1932
|
-
/* @__PURE__ */ (0,
|
|
1933
|
-
/* @__PURE__ */ (0,
|
|
1953
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-lastfive", children: [
|
|
1954
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-eyebrow", children: data.formLabel }),
|
|
1955
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "ss-w-fandash-teamform-head", children: [
|
|
1956
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "ss-w-fandash-teamform-head-team", children: [
|
|
1957
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Crest2, { url: data.homeCrestUrl ?? void 0, name: data.homeName, kind: "team" }),
|
|
1958
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-teamform-head-name", children: data.homeName })
|
|
1934
1959
|
] }),
|
|
1935
|
-
/* @__PURE__ */ (0,
|
|
1936
|
-
/* @__PURE__ */ (0,
|
|
1937
|
-
/* @__PURE__ */ (0,
|
|
1960
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "ss-w-fandash-teamform-head-team", children: [
|
|
1961
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Crest2, { url: data.awayCrestUrl ?? void 0, name: data.awayName, kind: "team" }),
|
|
1962
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-teamform-head-name", children: data.awayName })
|
|
1938
1963
|
] })
|
|
1939
1964
|
] }),
|
|
1940
|
-
/* @__PURE__ */ (0,
|
|
1965
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "ss-w-fandash-teamform-rows", children: teamFormRows(data) })
|
|
1941
1966
|
] }),
|
|
1942
|
-
h2h || data.fact ? /* @__PURE__ */ (0,
|
|
1943
|
-
h2h ? /* @__PURE__ */ (0,
|
|
1944
|
-
/* @__PURE__ */ (0,
|
|
1945
|
-
/* @__PURE__ */ (0,
|
|
1946
|
-
/* @__PURE__ */ (0,
|
|
1947
|
-
/* @__PURE__ */ (0,
|
|
1948
|
-
/* @__PURE__ */ (0,
|
|
1967
|
+
h2h || data.fact ? /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-h2h", children: [
|
|
1968
|
+
h2h ? /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
|
|
1969
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-eyebrow", children: h2h.label }),
|
|
1970
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "ss-w-fandash-split", children: [
|
|
1971
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "ss-w-fandash-split-cell", children: [
|
|
1972
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-split-value", children: h2h.wins }),
|
|
1973
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-split-label", children: h2h.homeWinsLabel })
|
|
1949
1974
|
] }),
|
|
1950
|
-
/* @__PURE__ */ (0,
|
|
1951
|
-
/* @__PURE__ */ (0,
|
|
1952
|
-
/* @__PURE__ */ (0,
|
|
1975
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "ss-w-fandash-split-cell", children: [
|
|
1976
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-split-value", children: h2h.draws }),
|
|
1977
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-split-label", children: h2h.drawsLabel })
|
|
1953
1978
|
] }),
|
|
1954
|
-
/* @__PURE__ */ (0,
|
|
1955
|
-
/* @__PURE__ */ (0,
|
|
1956
|
-
/* @__PURE__ */ (0,
|
|
1979
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "ss-w-fandash-split-cell", children: [
|
|
1980
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-split-value", children: h2h.losses }),
|
|
1981
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-split-label", children: h2h.awayWinsLabel })
|
|
1957
1982
|
] })
|
|
1958
1983
|
] })
|
|
1959
1984
|
] }) : null,
|
|
1960
|
-
data.fact ? /* @__PURE__ */ (0,
|
|
1985
|
+
data.fact ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "ss-w-fandash-fact", children: data.fact }) : null
|
|
1961
1986
|
] }) : null
|
|
1962
1987
|
] });
|
|
1963
1988
|
}
|
|
1964
1989
|
|
|
1965
1990
|
// src/components/dashboard/CountdownCard.tsx
|
|
1966
|
-
var
|
|
1967
|
-
var
|
|
1991
|
+
var import_react12 = require("react");
|
|
1992
|
+
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
1968
1993
|
var DAY_MS = 864e5;
|
|
1969
1994
|
function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
1970
1995
|
const totalSeconds = Math.floor((kickoffUnix * 1e3 - nowMs) / 1e3);
|
|
@@ -1982,72 +2007,72 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
|
1982
2007
|
function CountdownCard({ card }) {
|
|
1983
2008
|
const { data } = card;
|
|
1984
2009
|
const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
|
|
1985
|
-
const [nowMs, setNowMs] = (0,
|
|
1986
|
-
const [reduced] = (0,
|
|
2010
|
+
const [nowMs, setNowMs] = (0, import_react12.useState)(() => Date.now());
|
|
2011
|
+
const [reduced] = (0, import_react12.useState)(
|
|
1987
2012
|
() => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
|
1988
2013
|
);
|
|
1989
2014
|
const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
|
|
1990
|
-
(0,
|
|
2015
|
+
(0, import_react12.useEffect)(() => {
|
|
1991
2016
|
if (reduced) return;
|
|
1992
2017
|
const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
|
|
1993
2018
|
return () => window.clearInterval(id);
|
|
1994
2019
|
}, [reduced, withinDay]);
|
|
1995
2020
|
const segments = remainingSegments(data.kickoffUnix, nowMs, withinDay && !reduced);
|
|
1996
|
-
return /* @__PURE__ */ (0,
|
|
1997
|
-
/* @__PURE__ */ (0,
|
|
1998
|
-
segments ? /* @__PURE__ */ (0,
|
|
1999
|
-
i > 0 ? /* @__PURE__ */ (0,
|
|
2000
|
-
/* @__PURE__ */ (0,
|
|
2001
|
-
/* @__PURE__ */ (0,
|
|
2002
|
-
/* @__PURE__ */ (0,
|
|
2021
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "ss-w-fandash-card ss-w-fandash-countdown", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "ss-w-fandash-countdown-top", children: [
|
|
2022
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title ?? "Kick-off in" }),
|
|
2023
|
+
segments ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_react12.Fragment, { children: [
|
|
2024
|
+
i > 0 ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-colon", children: ":" }) : null,
|
|
2025
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("span", { className: "ss-w-fandash-countdown-seg", children: [
|
|
2026
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-value", children: s.value }),
|
|
2027
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-unit", children: unitLabel[s.unit] })
|
|
2003
2028
|
] })
|
|
2004
2029
|
] }, s.unit)) }) : null
|
|
2005
2030
|
] }) });
|
|
2006
2031
|
}
|
|
2007
2032
|
|
|
2008
2033
|
// src/components/dashboard/InjuriesCard.tsx
|
|
2009
|
-
var
|
|
2010
|
-
var
|
|
2034
|
+
var import_react13 = require("react");
|
|
2035
|
+
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
2011
2036
|
var SHOWN = 3;
|
|
2012
2037
|
function ColHead({ name, crestUrl }) {
|
|
2013
|
-
return /* @__PURE__ */ (0,
|
|
2014
|
-
/* @__PURE__ */ (0,
|
|
2015
|
-
/* @__PURE__ */ (0,
|
|
2038
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("span", { className: "ss-w-fandash-injuries-col-head", children: [
|
|
2039
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Crest2, { url: crestUrl ?? void 0, name, kind: "team" }),
|
|
2040
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "ss-w-fandash-injuries-col-head-name", children: name })
|
|
2016
2041
|
] });
|
|
2017
2042
|
}
|
|
2018
2043
|
function InjuryList({ rows, emptyLabel, limit }) {
|
|
2019
|
-
if (rows.length === 0) return /* @__PURE__ */ (0,
|
|
2044
|
+
if (rows.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "ss-w-fandash-injuries-empty", children: emptyLabel });
|
|
2020
2045
|
const shown = limit === void 0 ? rows : rows.slice(0, limit);
|
|
2021
|
-
return /* @__PURE__ */ (0,
|
|
2022
|
-
/* @__PURE__ */ (0,
|
|
2023
|
-
/* @__PURE__ */ (0,
|
|
2024
|
-
/* @__PURE__ */ (0,
|
|
2025
|
-
r.injuryType ? /* @__PURE__ */ (0,
|
|
2026
|
-
r.expectedReturnLabel ? /* @__PURE__ */ (0,
|
|
2046
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("ul", { className: "ss-w-fandash-injury-list", children: shown.map((r, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("li", { className: "ss-w-fandash-injury-row", children: [
|
|
2047
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "ss-w-fandash-injury-name", children: r.playerName }),
|
|
2048
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("span", { className: "ss-w-fandash-injury-meta", children: [
|
|
2049
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "ss-w-fandash-injury-status", children: r.status }),
|
|
2050
|
+
r.injuryType ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "ss-w-fandash-injury-type", children: r.injuryType }) : null,
|
|
2051
|
+
r.expectedReturnLabel ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "ss-w-fandash-injury-return", children: r.expectedReturnLabel }) : null
|
|
2027
2052
|
] })
|
|
2028
2053
|
] }, `${r.playerName}-${i}`)) });
|
|
2029
2054
|
}
|
|
2030
2055
|
function InjuriesCard({ card, ui }) {
|
|
2031
2056
|
const { data } = card;
|
|
2032
|
-
const [expanded, setExpanded] = (0,
|
|
2057
|
+
const [expanded, setExpanded] = (0, import_react13.useState)(false);
|
|
2033
2058
|
const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
|
|
2034
2059
|
const limit = expanded ? void 0 : SHOWN;
|
|
2035
2060
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
2036
2061
|
const showLess = ui?.showLess ?? "Show less";
|
|
2037
|
-
return /* @__PURE__ */ (0,
|
|
2038
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2039
|
-
/* @__PURE__ */ (0,
|
|
2040
|
-
/* @__PURE__ */ (0,
|
|
2041
|
-
/* @__PURE__ */ (0,
|
|
2042
|
-
/* @__PURE__ */ (0,
|
|
2062
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-injuries", children: [
|
|
2063
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2064
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "ss-w-fandash-injuries-cols", children: [
|
|
2065
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "ss-w-fandash-injuries-col", children: [
|
|
2066
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ColHead, { name: data.oursName, crestUrl: data.oursCrestUrl }),
|
|
2067
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(InjuryList, { rows: data.ours, emptyLabel: data.emptyLabel, limit })
|
|
2043
2068
|
] }),
|
|
2044
|
-
/* @__PURE__ */ (0,
|
|
2045
|
-
/* @__PURE__ */ (0,
|
|
2046
|
-
/* @__PURE__ */ (0,
|
|
2047
|
-
/* @__PURE__ */ (0,
|
|
2069
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "ss-w-fandash-injuries-divider" }),
|
|
2070
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "ss-w-fandash-injuries-col", children: [
|
|
2071
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ColHead, { name: data.theirsName, crestUrl: data.theirsCrestUrl }),
|
|
2072
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(InjuryList, { rows: data.theirs, emptyLabel: data.emptyLabel, limit })
|
|
2048
2073
|
] })
|
|
2049
2074
|
] }),
|
|
2050
|
-
hidden > 0 ? /* @__PURE__ */ (0,
|
|
2075
|
+
hidden > 0 ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
2051
2076
|
"button",
|
|
2052
2077
|
{
|
|
2053
2078
|
type: "button",
|
|
@@ -2061,80 +2086,80 @@ function InjuriesCard({ card, ui }) {
|
|
|
2061
2086
|
}
|
|
2062
2087
|
|
|
2063
2088
|
// src/components/dashboard/ReasonToBetCard.tsx
|
|
2064
|
-
var
|
|
2089
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
2065
2090
|
function ReasonToBetCard({ card }) {
|
|
2066
|
-
return /* @__PURE__ */ (0,
|
|
2067
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2068
|
-
/* @__PURE__ */ (0,
|
|
2091
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-reasons", children: [
|
|
2092
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2093
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("ul", { className: "ss-w-fandash-reason-list", children: card.data.angles.map((angle, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("li", { className: "ss-w-fandash-reason-item", children: angle }, `${angle}-${i}`)) })
|
|
2069
2094
|
] });
|
|
2070
2095
|
}
|
|
2071
2096
|
|
|
2072
2097
|
// src/components/dashboard/WhereToWatchCard.tsx
|
|
2073
|
-
var
|
|
2098
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
2074
2099
|
function WhereToWatchCard({ card }) {
|
|
2075
|
-
return /* @__PURE__ */ (0,
|
|
2076
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2077
|
-
/* @__PURE__ */ (0,
|
|
2100
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-watch", children: [
|
|
2101
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2102
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "ss-w-fandash-stations", children: card.data.stations.map((station, i) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "ss-w-fandash-station-chip", children: station }, `${station}-${i}`)) })
|
|
2078
2103
|
] });
|
|
2079
2104
|
}
|
|
2080
2105
|
|
|
2081
2106
|
// src/components/dashboard/CongestedWeekCard.tsx
|
|
2082
|
-
var
|
|
2107
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
2083
2108
|
function CongestedWeekCard({ card, onTap }) {
|
|
2084
|
-
return /* @__PURE__ */ (0,
|
|
2085
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2086
|
-
/* @__PURE__ */ (0,
|
|
2087
|
-
/* @__PURE__ */ (0,
|
|
2088
|
-
/* @__PURE__ */ (0,
|
|
2089
|
-
/* @__PURE__ */ (0,
|
|
2090
|
-
/* @__PURE__ */ (0,
|
|
2109
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-congested", onClick: () => onTap(card), children: [
|
|
2110
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2111
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "ss-w-fandash-congested-grid", children: card.data.entries.map((entry, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: "ss-w-fandash-congested-cell", children: [
|
|
2112
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "ss-w-fandash-congested-day", children: entry.dayLabel }),
|
|
2113
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "ss-w-fandash-congested-opponent", children: entry.opponent }),
|
|
2114
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "ss-w-fandash-congested-comp", children: entry.competition }),
|
|
2115
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "ss-w-fandash-congested-time", children: entry.timeLabel })
|
|
2091
2116
|
] }, `${entry.opponent}-${i}`)) }),
|
|
2092
|
-
/* @__PURE__ */ (0,
|
|
2117
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "ss-w-fandash-card-cta", children: card.actionLabel })
|
|
2093
2118
|
] });
|
|
2094
2119
|
}
|
|
2095
2120
|
|
|
2096
2121
|
// src/components/dashboard/TransfersCard.tsx
|
|
2097
|
-
var
|
|
2122
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
2098
2123
|
function TransferList({ rows }) {
|
|
2099
|
-
if (rows.length === 0) return /* @__PURE__ */ (0,
|
|
2100
|
-
return /* @__PURE__ */ (0,
|
|
2101
|
-
/* @__PURE__ */ (0,
|
|
2102
|
-
/* @__PURE__ */ (0,
|
|
2103
|
-
r.type ? /* @__PURE__ */ (0,
|
|
2124
|
+
if (rows.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-transfers-empty", children: "None" });
|
|
2125
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("ul", { className: "ss-w-fandash-transfer-list", children: rows.map((r, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("li", { className: "ss-w-fandash-transfer-row", children: [
|
|
2126
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-transfer-name", children: r.playerName }),
|
|
2127
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-transfer-club", children: r.otherClub }),
|
|
2128
|
+
r.type ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-transfer-type", children: r.type }) : null
|
|
2104
2129
|
] }, `${r.playerName}-${i}`)) });
|
|
2105
2130
|
}
|
|
2106
2131
|
function TransfersCard({ card }) {
|
|
2107
2132
|
const { data } = card;
|
|
2108
|
-
return /* @__PURE__ */ (0,
|
|
2109
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2110
|
-
/* @__PURE__ */ (0,
|
|
2111
|
-
/* @__PURE__ */ (0,
|
|
2112
|
-
/* @__PURE__ */ (0,
|
|
2113
|
-
/* @__PURE__ */ (0,
|
|
2133
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-transfers", children: [
|
|
2134
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2135
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "ss-w-fandash-transfers-cols", children: [
|
|
2136
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "ss-w-fandash-transfers-col", children: [
|
|
2137
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-transfers-col-head", children: "In" }),
|
|
2138
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(TransferList, { rows: data.in })
|
|
2114
2139
|
] }),
|
|
2115
|
-
/* @__PURE__ */ (0,
|
|
2116
|
-
/* @__PURE__ */ (0,
|
|
2117
|
-
/* @__PURE__ */ (0,
|
|
2140
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "ss-w-fandash-transfers-col", children: [
|
|
2141
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-transfers-col-head", children: "Out" }),
|
|
2142
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(TransferList, { rows: data.out })
|
|
2118
2143
|
] })
|
|
2119
2144
|
] })
|
|
2120
2145
|
] });
|
|
2121
2146
|
}
|
|
2122
2147
|
|
|
2123
2148
|
// src/components/dashboard/LinksCard.tsx
|
|
2124
|
-
var
|
|
2149
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
2125
2150
|
function LinksCard({ card }) {
|
|
2126
|
-
return /* @__PURE__ */ (0,
|
|
2127
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2128
|
-
/* @__PURE__ */ (0,
|
|
2129
|
-
/* @__PURE__ */ (0,
|
|
2130
|
-
/* @__PURE__ */ (0,
|
|
2151
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-links", children: [
|
|
2152
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2153
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "ss-w-fandash-link-grid", children: card.data.links.map((link, i) => /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("a", { className: "ss-w-fandash-link-tile", href: link.url, target: "_blank", rel: "noopener noreferrer", children: [
|
|
2154
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "ss-w-fandash-link-label", children: link.label }),
|
|
2155
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "ss-w-fandash-link-chevron", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ChevronIcon, {}) })
|
|
2131
2156
|
] }, `${link.url}-${i}`)) })
|
|
2132
2157
|
] });
|
|
2133
2158
|
}
|
|
2134
2159
|
|
|
2135
2160
|
// src/components/dashboard/PostMatchResultCard.tsx
|
|
2136
|
-
var
|
|
2137
|
-
var
|
|
2161
|
+
var import_react14 = require("react");
|
|
2162
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
2138
2163
|
function initials3(name) {
|
|
2139
2164
|
return name.trim().slice(0, 3).toUpperCase();
|
|
2140
2165
|
}
|
|
@@ -2143,37 +2168,37 @@ function PostMatchCrest({
|
|
|
2143
2168
|
name,
|
|
2144
2169
|
side
|
|
2145
2170
|
}) {
|
|
2146
|
-
const [failed, setFailed] = (0,
|
|
2171
|
+
const [failed, setFailed] = (0, import_react14.useState)(false);
|
|
2147
2172
|
const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
|
|
2148
2173
|
if (url && !failed) {
|
|
2149
|
-
return /* @__PURE__ */ (0,
|
|
2174
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
2150
2175
|
}
|
|
2151
|
-
return /* @__PURE__ */ (0,
|
|
2176
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: `${cls} ss-w-fandash-postmatch-crest--fallback`, "aria-hidden": "true", children: initials3(name) });
|
|
2152
2177
|
}
|
|
2153
2178
|
function PostMatchResultCard({ card }) {
|
|
2154
2179
|
const { data } = card;
|
|
2155
2180
|
const homeWon = data.homeScore >= data.awayScore;
|
|
2156
2181
|
const awayWon = data.awayScore >= data.homeScore;
|
|
2157
|
-
return /* @__PURE__ */ (0,
|
|
2158
|
-
/* @__PURE__ */ (0,
|
|
2159
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2160
|
-
/* @__PURE__ */ (0,
|
|
2182
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-postmatch-result", children: [
|
|
2183
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "ss-w-fandash-postmatch-top", children: [
|
|
2184
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "ss-w-fandash-postmatch-pill", children: card.title }) : null,
|
|
2185
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: `ss-w-fandash-postmatch-tag ss-w-fandash-postmatch-tag--${data.outcome}`, children: data.resultLabel })
|
|
2161
2186
|
] }),
|
|
2162
|
-
/* @__PURE__ */ (0,
|
|
2163
|
-
/* @__PURE__ */ (0,
|
|
2164
|
-
/* @__PURE__ */ (0,
|
|
2165
|
-
/* @__PURE__ */ (0,
|
|
2187
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "ss-w-fandash-postmatch-main", children: [
|
|
2188
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "ss-w-fandash-postmatch-side ss-w-fandash-postmatch-side--home", children: [
|
|
2189
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(PostMatchCrest, { url: data.homeCrestUrl, name: data.homeName, side: "home" }),
|
|
2190
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "ss-w-fandash-postmatch-team-name", children: data.homeName })
|
|
2166
2191
|
] }),
|
|
2167
|
-
/* @__PURE__ */ (0,
|
|
2168
|
-
/* @__PURE__ */ (0,
|
|
2192
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "ss-w-fandash-postmatch-score-main", children: [
|
|
2193
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2169
2194
|
"span",
|
|
2170
2195
|
{
|
|
2171
2196
|
className: `ss-w-fandash-postmatch-score-value ss-w-fandash-postmatch-score-value--${homeWon ? "win" : "lose"}`,
|
|
2172
2197
|
children: data.homeScore
|
|
2173
2198
|
}
|
|
2174
2199
|
),
|
|
2175
|
-
/* @__PURE__ */ (0,
|
|
2176
|
-
/* @__PURE__ */ (0,
|
|
2200
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "ss-w-fandash-postmatch-score-sep", children: "\u2013" }),
|
|
2201
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2177
2202
|
"span",
|
|
2178
2203
|
{
|
|
2179
2204
|
className: `ss-w-fandash-postmatch-score-value ss-w-fandash-postmatch-score-value--${awayWon ? "win" : "lose"}`,
|
|
@@ -2181,12 +2206,12 @@ function PostMatchResultCard({ card }) {
|
|
|
2181
2206
|
}
|
|
2182
2207
|
)
|
|
2183
2208
|
] }),
|
|
2184
|
-
/* @__PURE__ */ (0,
|
|
2185
|
-
/* @__PURE__ */ (0,
|
|
2186
|
-
/* @__PURE__ */ (0,
|
|
2209
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "ss-w-fandash-postmatch-side ss-w-fandash-postmatch-side--away", children: [
|
|
2210
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(PostMatchCrest, { url: data.awayCrestUrl, name: data.awayName, side: "away" }),
|
|
2211
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "ss-w-fandash-postmatch-team-name", children: data.awayName })
|
|
2187
2212
|
] })
|
|
2188
2213
|
] }),
|
|
2189
|
-
/* @__PURE__ */ (0,
|
|
2214
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "ss-w-fandash-postmatch-meta", children: [
|
|
2190
2215
|
data.kickoffLabel,
|
|
2191
2216
|
data.competition ? ` \xB7 ${data.competition}` : ""
|
|
2192
2217
|
] })
|
|
@@ -2194,20 +2219,20 @@ function PostMatchResultCard({ card }) {
|
|
|
2194
2219
|
}
|
|
2195
2220
|
|
|
2196
2221
|
// src/components/dashboard/PostMatchGoalsCard.tsx
|
|
2197
|
-
var
|
|
2222
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
2198
2223
|
function PostMatchGoalsCard({ card, onTap }) {
|
|
2199
|
-
return /* @__PURE__ */ (0,
|
|
2200
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2201
|
-
/* @__PURE__ */ (0,
|
|
2202
|
-
/* @__PURE__ */ (0,
|
|
2203
|
-
/* @__PURE__ */ (0,
|
|
2224
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-postmatch-goals", onClick: () => onTap(card), children: [
|
|
2225
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2226
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("ul", { className: "ss-w-fandash-postmatch-goal-list", children: card.data.goals.map((g, i) => /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("li", { className: g.scoredByClub ? "ss-w-fandash-postmatch-goal ss-w-fandash-postmatch-goal--club" : "ss-w-fandash-postmatch-goal", children: [
|
|
2227
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "ss-w-fandash-postmatch-goal-ball" }),
|
|
2228
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { children: g.text })
|
|
2204
2229
|
] }, `${g.text}-${i}`)) }),
|
|
2205
|
-
/* @__PURE__ */ (0,
|
|
2230
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "ss-w-fandash-card-cta", children: card.actionLabel })
|
|
2206
2231
|
] });
|
|
2207
2232
|
}
|
|
2208
2233
|
|
|
2209
2234
|
// src/components/dashboard/PostMatchStatsCard.tsx
|
|
2210
|
-
var
|
|
2235
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
2211
2236
|
function splitWidths(homeNum, awayNum) {
|
|
2212
2237
|
const total = homeNum + awayNum;
|
|
2213
2238
|
if (total <= 0) return { home: "50%", away: "50%" };
|
|
@@ -2216,42 +2241,42 @@ function splitWidths(homeNum, awayNum) {
|
|
|
2216
2241
|
}
|
|
2217
2242
|
function PostMatchStatsCard({ card, onTap }) {
|
|
2218
2243
|
const { data } = card;
|
|
2219
|
-
return /* @__PURE__ */ (0,
|
|
2220
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2221
|
-
/* @__PURE__ */ (0,
|
|
2244
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-postmatch-stats", onClick: () => onTap(card), children: [
|
|
2245
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2246
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "ss-w-fandash-postmatch-stat-rows", children: data.rows.map((r, i) => {
|
|
2222
2247
|
const leftValue = data.clubIsHome ? r.clubValue : r.oppValue;
|
|
2223
2248
|
const rightValue = data.clubIsHome ? r.oppValue : r.clubValue;
|
|
2224
2249
|
const homeNum = data.clubIsHome ? r.clubNum : r.oppNum;
|
|
2225
2250
|
const awayNum = data.clubIsHome ? r.oppNum : r.clubNum;
|
|
2226
2251
|
const { home, away } = splitWidths(homeNum, awayNum);
|
|
2227
|
-
return /* @__PURE__ */ (0,
|
|
2228
|
-
/* @__PURE__ */ (0,
|
|
2229
|
-
/* @__PURE__ */ (0,
|
|
2230
|
-
/* @__PURE__ */ (0,
|
|
2231
|
-
/* @__PURE__ */ (0,
|
|
2252
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "ss-w-fandash-postmatch-stat", children: [
|
|
2253
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "ss-w-fandash-postmatch-stat-row", children: [
|
|
2254
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "ss-w-fandash-postmatch-stat-value ss-w-fandash-postmatch-stat-value--home", children: leftValue }),
|
|
2255
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "ss-w-fandash-postmatch-stat-label", children: r.label }),
|
|
2256
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "ss-w-fandash-postmatch-stat-value ss-w-fandash-postmatch-stat-value--away", children: rightValue })
|
|
2232
2257
|
] }),
|
|
2233
|
-
/* @__PURE__ */ (0,
|
|
2234
|
-
/* @__PURE__ */ (0,
|
|
2235
|
-
/* @__PURE__ */ (0,
|
|
2258
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "ss-w-fandash-postmatch-stat-bar", children: [
|
|
2259
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "ss-w-fandash-postmatch-stat-bar-home", style: { width: home } }),
|
|
2260
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "ss-w-fandash-postmatch-stat-bar-away", style: { width: away } })
|
|
2236
2261
|
] })
|
|
2237
2262
|
] }, `${r.label}-${i}`);
|
|
2238
2263
|
}) }),
|
|
2239
|
-
data.rows.length > 0 ? /* @__PURE__ */ (0,
|
|
2240
|
-
/* @__PURE__ */ (0,
|
|
2241
|
-
/* @__PURE__ */ (0,
|
|
2264
|
+
data.rows.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "ss-w-fandash-postmatch-legend", children: [
|
|
2265
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: "ss-w-fandash-postmatch-legend-item", children: [
|
|
2266
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("i", { className: "ss-w-fandash-postmatch-legend-swatch ss-w-fandash-postmatch-legend-swatch--home" }),
|
|
2242
2267
|
data.homeName
|
|
2243
2268
|
] }),
|
|
2244
|
-
/* @__PURE__ */ (0,
|
|
2245
|
-
/* @__PURE__ */ (0,
|
|
2269
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: "ss-w-fandash-postmatch-legend-item", children: [
|
|
2270
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("i", { className: "ss-w-fandash-postmatch-legend-swatch ss-w-fandash-postmatch-legend-swatch--away" }),
|
|
2246
2271
|
data.awayName
|
|
2247
2272
|
] })
|
|
2248
2273
|
] }) : null,
|
|
2249
|
-
/* @__PURE__ */ (0,
|
|
2274
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "ss-w-fandash-card-cta", children: card.actionLabel })
|
|
2250
2275
|
] });
|
|
2251
2276
|
}
|
|
2252
2277
|
|
|
2253
2278
|
// src/components/dashboard/PostMatchTopPerformerCard.tsx
|
|
2254
|
-
var
|
|
2279
|
+
var import_jsx_runtime30 = require("react/jsx-runtime");
|
|
2255
2280
|
function initials4(playerName) {
|
|
2256
2281
|
const words = playerName.trim().split(/\s+/).filter(Boolean);
|
|
2257
2282
|
if (words.length === 0) return "?";
|
|
@@ -2261,72 +2286,72 @@ function initials4(playerName) {
|
|
|
2261
2286
|
}
|
|
2262
2287
|
function PostMatchTopPerformerCard({ card, onTap }) {
|
|
2263
2288
|
const { data } = card;
|
|
2264
|
-
return /* @__PURE__ */ (0,
|
|
2265
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2266
|
-
/* @__PURE__ */ (0,
|
|
2267
|
-
/* @__PURE__ */ (0,
|
|
2268
|
-
/* @__PURE__ */ (0,
|
|
2269
|
-
/* @__PURE__ */ (0,
|
|
2289
|
+
return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-postmatch-performer", onClick: () => onTap(card), children: [
|
|
2290
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2291
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "ss-w-fandash-postmatch-perf-row", children: [
|
|
2292
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "ss-w-fandash-postmatch-perf-avatar", "aria-hidden": "true", children: initials4(data.playerName) }),
|
|
2293
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "ss-w-fandash-postmatch-perf-name", children: data.playerName }),
|
|
2294
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "ss-w-fandash-postmatch-perf-rating", children: data.ratingLabel })
|
|
2270
2295
|
] }),
|
|
2271
|
-
/* @__PURE__ */ (0,
|
|
2296
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "ss-w-fandash-card-cta", children: card.actionLabel })
|
|
2272
2297
|
] });
|
|
2273
2298
|
}
|
|
2274
2299
|
|
|
2275
2300
|
// src/components/dashboard/PostMatchNextCard.tsx
|
|
2276
|
-
var
|
|
2301
|
+
var import_jsx_runtime31 = require("react/jsx-runtime");
|
|
2277
2302
|
function PostMatchNextCard({ card }) {
|
|
2278
2303
|
const { data } = card;
|
|
2279
|
-
return /* @__PURE__ */ (0,
|
|
2280
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2281
|
-
/* @__PURE__ */ (0,
|
|
2304
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-postmatch-next", children: [
|
|
2305
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2306
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "ss-w-fandash-postmatch-next-row", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "ss-w-fandash-postmatch-next-when", children: data.whenLabel }) })
|
|
2282
2307
|
] });
|
|
2283
2308
|
}
|
|
2284
2309
|
|
|
2285
2310
|
// src/components/dashboard/RestingNextCard.tsx
|
|
2286
|
-
var
|
|
2311
|
+
var import_jsx_runtime32 = require("react/jsx-runtime");
|
|
2287
2312
|
function RestingNextCard({ card, onTap }) {
|
|
2288
2313
|
const { data } = card;
|
|
2289
|
-
return /* @__PURE__ */ (0,
|
|
2290
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2291
|
-
/* @__PURE__ */ (0,
|
|
2292
|
-
/* @__PURE__ */ (0,
|
|
2293
|
-
data.competition ? /* @__PURE__ */ (0,
|
|
2314
|
+
return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-resting-next", onClick: () => onTap(card), children: [
|
|
2315
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2316
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "ss-w-fandash-resting-next-row", children: [
|
|
2317
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "ss-w-fandash-resting-next-when", children: data.whenLabel }),
|
|
2318
|
+
data.competition ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "ss-w-fandash-resting-next-competition", children: data.competition }) : null
|
|
2294
2319
|
] }),
|
|
2295
|
-
/* @__PURE__ */ (0,
|
|
2320
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "ss-w-fandash-card-cta", children: card.actionLabel })
|
|
2296
2321
|
] });
|
|
2297
2322
|
}
|
|
2298
2323
|
|
|
2299
2324
|
// src/components/dashboard/RestingStandingsCard.tsx
|
|
2300
|
-
var
|
|
2325
|
+
var import_jsx_runtime33 = require("react/jsx-runtime");
|
|
2301
2326
|
function RestingStandingsCard({ card, onTap }) {
|
|
2302
2327
|
const { data } = card;
|
|
2303
|
-
return /* @__PURE__ */ (0,
|
|
2304
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2305
|
-
/* @__PURE__ */ (0,
|
|
2306
|
-
/* @__PURE__ */ (0,
|
|
2307
|
-
/* @__PURE__ */ (0,
|
|
2328
|
+
return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-resting-standings", onClick: () => onTap(card), children: [
|
|
2329
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2330
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "ss-w-fandash-resting-standings-row", children: [
|
|
2331
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "ss-w-fandash-resting-standings-position", children: data.positionLabel }),
|
|
2332
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "ss-w-fandash-resting-standings-record", children: data.recordLabel })
|
|
2308
2333
|
] }),
|
|
2309
|
-
/* @__PURE__ */ (0,
|
|
2334
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "ss-w-fandash-card-cta", children: card.actionLabel })
|
|
2310
2335
|
] });
|
|
2311
2336
|
}
|
|
2312
2337
|
|
|
2313
2338
|
// src/components/dashboard/RestingSeasonCard.tsx
|
|
2314
|
-
var
|
|
2339
|
+
var import_jsx_runtime34 = require("react/jsx-runtime");
|
|
2315
2340
|
function RestingSeasonCard({ card, onTap }) {
|
|
2316
2341
|
const { data } = card;
|
|
2317
|
-
return /* @__PURE__ */ (0,
|
|
2318
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2319
|
-
/* @__PURE__ */ (0,
|
|
2320
|
-
data.scorerLabel ? /* @__PURE__ */ (0,
|
|
2321
|
-
data.playerLabel ? /* @__PURE__ */ (0,
|
|
2322
|
-
/* @__PURE__ */ (0,
|
|
2342
|
+
return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-resting-season", onClick: () => onTap(card), children: [
|
|
2343
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2344
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: "ss-w-fandash-resting-season-rows", children: [
|
|
2345
|
+
data.scorerLabel ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "ss-w-fandash-resting-season-row", children: data.scorerLabel }) : null,
|
|
2346
|
+
data.playerLabel ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "ss-w-fandash-resting-season-row", children: data.playerLabel }) : null,
|
|
2347
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "ss-w-fandash-resting-season-row", children: data.tallyLabel })
|
|
2323
2348
|
] }),
|
|
2324
|
-
/* @__PURE__ */ (0,
|
|
2349
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "ss-w-fandash-card-cta", children: card.actionLabel })
|
|
2325
2350
|
] });
|
|
2326
2351
|
}
|
|
2327
2352
|
|
|
2328
2353
|
// src/components/dashboard/RestingFormCard.tsx
|
|
2329
|
-
var
|
|
2354
|
+
var import_jsx_runtime35 = require("react/jsx-runtime");
|
|
2330
2355
|
function resultClass(result) {
|
|
2331
2356
|
const upper = result.toUpperCase();
|
|
2332
2357
|
if (upper === "W") return "ss-w-fandash-form-pill--win";
|
|
@@ -2335,17 +2360,17 @@ function resultClass(result) {
|
|
|
2335
2360
|
}
|
|
2336
2361
|
function RestingFormCard({ card }) {
|
|
2337
2362
|
const { data } = card;
|
|
2338
|
-
return /* @__PURE__ */ (0,
|
|
2339
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2340
|
-
/* @__PURE__ */ (0,
|
|
2363
|
+
return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-resting-form", children: [
|
|
2364
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2365
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "ss-w-fandash-form", children: data.letters.map((r, i) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: `ss-w-fandash-form-pill ${resultClass(r)}`, children: r }, `${r}-${i}`)) })
|
|
2341
2366
|
] });
|
|
2342
2367
|
}
|
|
2343
2368
|
|
|
2344
2369
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
2345
|
-
var
|
|
2370
|
+
var import_react16 = require("react");
|
|
2346
2371
|
|
|
2347
2372
|
// src/useLiveClock.ts
|
|
2348
|
-
var
|
|
2373
|
+
var import_react15 = require("react");
|
|
2349
2374
|
var TICK_MS = 6e4;
|
|
2350
2375
|
var MAX_LIVE_TICK_MINUTES = 15;
|
|
2351
2376
|
function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
@@ -2354,10 +2379,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
|
2354
2379
|
return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
|
|
2355
2380
|
}
|
|
2356
2381
|
function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
2357
|
-
const [displayMinute, setDisplayMinute] = (0,
|
|
2382
|
+
const [displayMinute, setDisplayMinute] = (0, import_react15.useState)(
|
|
2358
2383
|
() => computeDisplayMinute(minute, clockRunning, receivedAtMs)
|
|
2359
2384
|
);
|
|
2360
|
-
(0,
|
|
2385
|
+
(0, import_react15.useEffect)(() => {
|
|
2361
2386
|
setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
|
|
2362
2387
|
if (!clockRunning) return;
|
|
2363
2388
|
const id = window.setInterval(() => {
|
|
@@ -2369,17 +2394,17 @@ function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
|
2369
2394
|
}
|
|
2370
2395
|
|
|
2371
2396
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
2372
|
-
var
|
|
2397
|
+
var import_jsx_runtime36 = require("react/jsx-runtime");
|
|
2373
2398
|
function initials5(name) {
|
|
2374
2399
|
return name.trim().slice(0, 3).toUpperCase();
|
|
2375
2400
|
}
|
|
2376
2401
|
function LiveCrest({ url, name, side }) {
|
|
2377
|
-
const [failed, setFailed] = (0,
|
|
2402
|
+
const [failed, setFailed] = (0, import_react16.useState)(false);
|
|
2378
2403
|
const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
|
|
2379
2404
|
if (url && !failed) {
|
|
2380
|
-
return /* @__PURE__ */ (0,
|
|
2405
|
+
return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
2381
2406
|
}
|
|
2382
|
-
return /* @__PURE__ */ (0,
|
|
2407
|
+
return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: `${cls} ss-w-fandash-live-crest--fallback`, "aria-hidden": "true", children: initials5(name) });
|
|
2383
2408
|
}
|
|
2384
2409
|
function scorersLine(goalEvents) {
|
|
2385
2410
|
if (!goalEvents || goalEvents.length === 0) return null;
|
|
@@ -2393,72 +2418,72 @@ function LiveScoreCard({
|
|
|
2393
2418
|
}) {
|
|
2394
2419
|
const { data } = card;
|
|
2395
2420
|
const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
|
|
2396
|
-
const seedRef = (0,
|
|
2421
|
+
const seedRef = (0, import_react16.useRef)(null);
|
|
2397
2422
|
if (!seedRef.current || seedRef.current.key !== seedKey) {
|
|
2398
2423
|
seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
|
|
2399
2424
|
}
|
|
2400
2425
|
const displayMinute = useLiveClock(data.minute, data.clockRunning, seedRef.current.receivedAtMs);
|
|
2401
2426
|
const minuteSuffix = data.minuteLabel.replace(/^\d+/, "");
|
|
2402
2427
|
const scorers = scorersLine(goalEvents);
|
|
2403
|
-
return /* @__PURE__ */ (0,
|
|
2404
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2405
|
-
/* @__PURE__ */ (0,
|
|
2406
|
-
/* @__PURE__ */ (0,
|
|
2407
|
-
/* @__PURE__ */ (0,
|
|
2428
|
+
return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-live-score", children: [
|
|
2429
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2430
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "ss-w-fandash-live-top", children: [
|
|
2431
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("span", { className: "ss-w-fandash-live-pill", children: [
|
|
2432
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "ss-w-fandash-live-dot", "aria-hidden": "true" }),
|
|
2408
2433
|
data.statusLabel
|
|
2409
2434
|
] }),
|
|
2410
|
-
/* @__PURE__ */ (0,
|
|
2411
|
-
data.competition ? /* @__PURE__ */ (0,
|
|
2435
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "ss-w-fandash-live-minute", children: `${displayMinute}${minuteSuffix}` }),
|
|
2436
|
+
data.competition ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "ss-w-fandash-live-competition", children: data.competition }) : null
|
|
2412
2437
|
] }),
|
|
2413
|
-
/* @__PURE__ */ (0,
|
|
2414
|
-
/* @__PURE__ */ (0,
|
|
2415
|
-
/* @__PURE__ */ (0,
|
|
2416
|
-
/* @__PURE__ */ (0,
|
|
2438
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "ss-w-fandash-live-main", children: [
|
|
2439
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "ss-w-fandash-live-side ss-w-fandash-live-side--home", children: [
|
|
2440
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(LiveCrest, { url: data.homeCrestUrl, name: data.homeName, side: "home" }),
|
|
2441
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "ss-w-fandash-live-team-name", children: data.homeName })
|
|
2417
2442
|
] }),
|
|
2418
|
-
/* @__PURE__ */ (0,
|
|
2419
|
-
/* @__PURE__ */ (0,
|
|
2420
|
-
/* @__PURE__ */ (0,
|
|
2421
|
-
/* @__PURE__ */ (0,
|
|
2443
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "ss-w-fandash-live-score-main", children: [
|
|
2444
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "ss-w-fandash-live-score-value", children: data.homeScore }),
|
|
2445
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "ss-w-fandash-live-score-sep", children: "\u2013" }),
|
|
2446
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "ss-w-fandash-live-score-value", children: data.awayScore })
|
|
2422
2447
|
] }),
|
|
2423
|
-
/* @__PURE__ */ (0,
|
|
2424
|
-
/* @__PURE__ */ (0,
|
|
2425
|
-
/* @__PURE__ */ (0,
|
|
2448
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "ss-w-fandash-live-side ss-w-fandash-live-side--away", children: [
|
|
2449
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(LiveCrest, { url: data.awayCrestUrl, name: data.awayName, side: "away" }),
|
|
2450
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "ss-w-fandash-live-team-name", children: data.awayName })
|
|
2426
2451
|
] })
|
|
2427
2452
|
] }),
|
|
2428
|
-
scorers ? /* @__PURE__ */ (0,
|
|
2429
|
-
/* @__PURE__ */ (0,
|
|
2453
|
+
scorers ? /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "ss-w-fandash-live-scorers", children: [
|
|
2454
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "ss-w-fandash-live-scorers-icon", "aria-hidden": "true", children: "\u26BD" }),
|
|
2430
2455
|
scorers
|
|
2431
2456
|
] }) : null
|
|
2432
2457
|
] });
|
|
2433
2458
|
}
|
|
2434
2459
|
|
|
2435
2460
|
// src/components/dashboard/LiveTimelineCard.tsx
|
|
2436
|
-
var
|
|
2437
|
-
var
|
|
2461
|
+
var import_react17 = require("react");
|
|
2462
|
+
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
2438
2463
|
var SHOWN2 = 3;
|
|
2439
2464
|
function EventIcon({ type }) {
|
|
2440
2465
|
if (type === "goal") {
|
|
2441
|
-
return /* @__PURE__ */ (0,
|
|
2466
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "ss-w-fandash-live-tl-ico ss-w-fandash-live-tl-ico--goal", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "ss-w-fandash-live-tl-ball" }) });
|
|
2442
2467
|
}
|
|
2443
2468
|
if (type === "yellow" || type === "red") {
|
|
2444
|
-
return /* @__PURE__ */ (0,
|
|
2469
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "ss-w-fandash-live-tl-ico", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: `ss-w-fandash-live-tl-card ss-w-fandash-live-tl-card--${type}` }) });
|
|
2445
2470
|
}
|
|
2446
2471
|
if (type === "sub") {
|
|
2447
|
-
return /* @__PURE__ */ (0,
|
|
2472
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "ss-w-fandash-live-tl-ico", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "ss-w-fandash-live-tl-subarrows", children: "\u21C5" }) });
|
|
2448
2473
|
}
|
|
2449
|
-
return /* @__PURE__ */ (0,
|
|
2474
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "ss-w-fandash-live-tl-ico", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "ss-w-fandash-live-tl-dot" }) });
|
|
2450
2475
|
}
|
|
2451
2476
|
function EventLabel({ e }) {
|
|
2452
2477
|
if (e.type === "sub") {
|
|
2453
|
-
return /* @__PURE__ */ (0,
|
|
2478
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "ss-w-fandash-live-tl-who", children: [
|
|
2454
2479
|
e.player ?? e.text,
|
|
2455
|
-
e.playerOff ? /* @__PURE__ */ (0,
|
|
2480
|
+
e.playerOff ? /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "ss-w-fandash-live-tl-off", children: [
|
|
2456
2481
|
" for ",
|
|
2457
2482
|
e.playerOff
|
|
2458
2483
|
] }) : null
|
|
2459
2484
|
] });
|
|
2460
2485
|
}
|
|
2461
|
-
return /* @__PURE__ */ (0,
|
|
2486
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "ss-w-fandash-live-tl-who", children: e.player ?? e.text });
|
|
2462
2487
|
}
|
|
2463
2488
|
function EventRow({ e }) {
|
|
2464
2489
|
const cls = [
|
|
@@ -2466,16 +2491,16 @@ function EventRow({ e }) {
|
|
|
2466
2491
|
e.side === "home" ? "ss-w-fandash-live-tl-ev--home" : "ss-w-fandash-live-tl-ev--away",
|
|
2467
2492
|
e.type === "goal" ? "ss-w-fandash-live-tl-ev--goal" : ""
|
|
2468
2493
|
].filter(Boolean).join(" ");
|
|
2469
|
-
return /* @__PURE__ */ (0,
|
|
2470
|
-
/* @__PURE__ */ (0,
|
|
2471
|
-
/* @__PURE__ */ (0,
|
|
2472
|
-
/* @__PURE__ */ (0,
|
|
2494
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: cls, children: [
|
|
2495
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "ss-w-fandash-live-tl-txt", children: [
|
|
2496
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(EventLabel, { e }),
|
|
2497
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(EventIcon, { type: e.type })
|
|
2473
2498
|
] }),
|
|
2474
|
-
/* @__PURE__ */ (0,
|
|
2499
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "ss-w-fandash-live-tl-badge", children: e.minuteLabel })
|
|
2475
2500
|
] });
|
|
2476
2501
|
}
|
|
2477
2502
|
function LiveTimelineCard({ card, ui }) {
|
|
2478
|
-
const [expanded, setExpanded] = (0,
|
|
2503
|
+
const [expanded, setExpanded] = (0, import_react17.useState)(false);
|
|
2479
2504
|
const events = card.data.events;
|
|
2480
2505
|
if (!events || events.length === 0) return null;
|
|
2481
2506
|
const sorted = [...events].sort((a, b) => b.minute - a.minute);
|
|
@@ -2483,10 +2508,10 @@ function LiveTimelineCard({ card, ui }) {
|
|
|
2483
2508
|
const shown = expanded ? sorted : sorted.slice(0, SHOWN2);
|
|
2484
2509
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
2485
2510
|
const showLess = ui?.showLess ?? "Show less";
|
|
2486
|
-
return /* @__PURE__ */ (0,
|
|
2487
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2488
|
-
/* @__PURE__ */ (0,
|
|
2489
|
-
rest > 0 ? /* @__PURE__ */ (0,
|
|
2511
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-live-timeline", children: [
|
|
2512
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2513
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "ss-w-fandash-live-tl", children: shown.map((e, i) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(EventRow, { e }, `${e.minute}-${e.side}-${e.type}-${i}`)) }),
|
|
2514
|
+
rest > 0 ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
|
|
2490
2515
|
"button",
|
|
2491
2516
|
{
|
|
2492
2517
|
type: "button",
|
|
@@ -2500,8 +2525,8 @@ function LiveTimelineCard({ card, ui }) {
|
|
|
2500
2525
|
}
|
|
2501
2526
|
|
|
2502
2527
|
// src/components/dashboard/MomentumWave.tsx
|
|
2503
|
-
var
|
|
2504
|
-
var
|
|
2528
|
+
var import_react18 = require("react");
|
|
2529
|
+
var import_jsx_runtime38 = require("react/jsx-runtime");
|
|
2505
2530
|
var WIDTH = 270;
|
|
2506
2531
|
var HEIGHT = 56;
|
|
2507
2532
|
var BASELINE = HEIGHT / 2;
|
|
@@ -2524,15 +2549,15 @@ function MomentumWave({
|
|
|
2524
2549
|
}) {
|
|
2525
2550
|
if (points.length === 0) return null;
|
|
2526
2551
|
const { area, line, lastLeftPct, lastTopPx } = buildPaths(points);
|
|
2527
|
-
const clipId = (0,
|
|
2552
|
+
const clipId = (0, import_react18.useId)();
|
|
2528
2553
|
const topClipId = `${clipId}-top`;
|
|
2529
2554
|
const bottomClipId = `${clipId}-bottom`;
|
|
2530
2555
|
const topClass = clubIsHome ? "ss-w-fandash-live-mom-home" : "ss-w-fandash-live-mom-away";
|
|
2531
2556
|
const bottomClass = clubIsHome ? "ss-w-fandash-live-mom-away" : "ss-w-fandash-live-mom-home";
|
|
2532
|
-
return /* @__PURE__ */ (0,
|
|
2533
|
-
caption ? /* @__PURE__ */ (0,
|
|
2534
|
-
/* @__PURE__ */ (0,
|
|
2535
|
-
/* @__PURE__ */ (0,
|
|
2557
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "ss-w-fandash-live-mom", children: [
|
|
2558
|
+
caption ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "ss-w-fandash-live-mom-caption", children: caption }) : null,
|
|
2559
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "ss-w-fandash-live-mom-plot", children: [
|
|
2560
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
|
|
2536
2561
|
"svg",
|
|
2537
2562
|
{
|
|
2538
2563
|
className: "ss-w-fandash-live-mom-svg",
|
|
@@ -2541,18 +2566,18 @@ function MomentumWave({
|
|
|
2541
2566
|
role: "img",
|
|
2542
2567
|
"aria-label": caption ?? "Momentum",
|
|
2543
2568
|
children: [
|
|
2544
|
-
/* @__PURE__ */ (0,
|
|
2545
|
-
/* @__PURE__ */ (0,
|
|
2546
|
-
/* @__PURE__ */ (0,
|
|
2569
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("defs", { children: [
|
|
2570
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("clipPath", { id: topClipId, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("rect", { x: 0, y: 0, width: WIDTH, height: BASELINE }) }),
|
|
2571
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("clipPath", { id: bottomClipId, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("rect", { x: 0, y: BASELINE, width: WIDTH, height: HEIGHT - BASELINE }) })
|
|
2547
2572
|
] }),
|
|
2548
|
-
/* @__PURE__ */ (0,
|
|
2549
|
-
/* @__PURE__ */ (0,
|
|
2550
|
-
/* @__PURE__ */ (0,
|
|
2551
|
-
/* @__PURE__ */ (0,
|
|
2573
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("path", { d: area, className: topClass, clipPath: `url(#${topClipId})` }),
|
|
2574
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("path", { d: area, className: bottomClass, clipPath: `url(#${bottomClipId})` }),
|
|
2575
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("line", { x1: 0, y1: BASELINE, x2: WIDTH, y2: BASELINE, className: "ss-w-fandash-live-mom-base" }),
|
|
2576
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("path", { d: line, className: "ss-w-fandash-live-mom-line", vectorEffect: "non-scaling-stroke" })
|
|
2552
2577
|
]
|
|
2553
2578
|
}
|
|
2554
2579
|
),
|
|
2555
|
-
/* @__PURE__ */ (0,
|
|
2580
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
2556
2581
|
"span",
|
|
2557
2582
|
{
|
|
2558
2583
|
className: "ss-w-fandash-live-mom-now",
|
|
@@ -2565,7 +2590,7 @@ function MomentumWave({
|
|
|
2565
2590
|
}
|
|
2566
2591
|
|
|
2567
2592
|
// src/components/dashboard/LiveStatsCard.tsx
|
|
2568
|
-
var
|
|
2593
|
+
var import_jsx_runtime39 = require("react/jsx-runtime");
|
|
2569
2594
|
function splitWidths2(homeNum, awayNum) {
|
|
2570
2595
|
const total = homeNum + awayNum;
|
|
2571
2596
|
if (total <= 0) return { home: "50%", away: "50%" };
|
|
@@ -2574,34 +2599,34 @@ function splitWidths2(homeNum, awayNum) {
|
|
|
2574
2599
|
}
|
|
2575
2600
|
function LiveStatsCard({ card }) {
|
|
2576
2601
|
const { data } = card;
|
|
2577
|
-
return /* @__PURE__ */ (0,
|
|
2578
|
-
card.title ? /* @__PURE__ */ (0,
|
|
2579
|
-
/* @__PURE__ */ (0,
|
|
2602
|
+
return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: "ss-w-fandash-card ss-w-fandash-live-stats", children: [
|
|
2603
|
+
card.title ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2604
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: "ss-w-fandash-live-stat-rows", children: data.rows.map((r, i) => {
|
|
2580
2605
|
const homeValue = data.clubIsHome ? r.clubValue : r.oppValue;
|
|
2581
2606
|
const awayValue = data.clubIsHome ? r.oppValue : r.clubValue;
|
|
2582
2607
|
const homeNum = data.clubIsHome ? r.clubNum : r.oppNum;
|
|
2583
2608
|
const awayNum = data.clubIsHome ? r.oppNum : r.clubNum;
|
|
2584
2609
|
const { home, away } = splitWidths2(homeNum, awayNum);
|
|
2585
|
-
return /* @__PURE__ */ (0,
|
|
2586
|
-
/* @__PURE__ */ (0,
|
|
2587
|
-
/* @__PURE__ */ (0,
|
|
2588
|
-
/* @__PURE__ */ (0,
|
|
2589
|
-
/* @__PURE__ */ (0,
|
|
2610
|
+
return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: "ss-w-fandash-live-stat", children: [
|
|
2611
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: "ss-w-fandash-live-stat-row", children: [
|
|
2612
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "ss-w-fandash-live-stat-value ss-w-fandash-live-stat-value--home", children: homeValue }),
|
|
2613
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "ss-w-fandash-live-stat-label", children: r.label }),
|
|
2614
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "ss-w-fandash-live-stat-value ss-w-fandash-live-stat-value--away", children: awayValue })
|
|
2590
2615
|
] }),
|
|
2591
|
-
/* @__PURE__ */ (0,
|
|
2592
|
-
/* @__PURE__ */ (0,
|
|
2593
|
-
/* @__PURE__ */ (0,
|
|
2616
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: "ss-w-fandash-live-bar", children: [
|
|
2617
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "ss-w-fandash-live-bar-home", style: { width: home } }),
|
|
2618
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "ss-w-fandash-live-bar-away", style: { width: away } })
|
|
2594
2619
|
] })
|
|
2595
2620
|
] }, `${r.label}-${i}`);
|
|
2596
2621
|
}) }),
|
|
2597
|
-
data.momentum.length > 0 ? /* @__PURE__ */ (0,
|
|
2598
|
-
data.rows.length > 0 ? /* @__PURE__ */ (0,
|
|
2599
|
-
/* @__PURE__ */ (0,
|
|
2600
|
-
/* @__PURE__ */ (0,
|
|
2622
|
+
data.momentum.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(MomentumWave, { points: data.momentum, caption: data.momentumLabel, clubIsHome: data.clubIsHome }) : data.momentumLabel ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "ss-w-fandash-live-momentum", children: data.momentumLabel }) : null,
|
|
2623
|
+
data.rows.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: "ss-w-fandash-live-legend", children: [
|
|
2624
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("span", { className: "ss-w-fandash-live-legend-item", children: [
|
|
2625
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)("i", { className: "ss-w-fandash-live-legend-swatch ss-w-fandash-live-legend-swatch--home" }),
|
|
2601
2626
|
data.homeName
|
|
2602
2627
|
] }),
|
|
2603
|
-
/* @__PURE__ */ (0,
|
|
2604
|
-
/* @__PURE__ */ (0,
|
|
2628
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("span", { className: "ss-w-fandash-live-legend-item", children: [
|
|
2629
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)("i", { className: "ss-w-fandash-live-legend-swatch ss-w-fandash-live-legend-swatch--away" }),
|
|
2605
2630
|
data.awayName
|
|
2606
2631
|
] })
|
|
2607
2632
|
] }) : null
|
|
@@ -2609,7 +2634,7 @@ function LiveStatsCard({ card }) {
|
|
|
2609
2634
|
}
|
|
2610
2635
|
|
|
2611
2636
|
// src/components/dashboard/ClubFanDashboard.tsx
|
|
2612
|
-
var
|
|
2637
|
+
var import_jsx_runtime40 = require("react/jsx-runtime");
|
|
2613
2638
|
function ClubFanDashboard({ dashboard, onTap, ui }) {
|
|
2614
2639
|
const orderedCards = [
|
|
2615
2640
|
...dashboard.cards.filter((c) => c.cardType === "countdown"),
|
|
@@ -2619,84 +2644,84 @@ function ClubFanDashboard({ dashboard, onTap, ui }) {
|
|
|
2619
2644
|
(c) => c.cardType === "liveTimeline"
|
|
2620
2645
|
);
|
|
2621
2646
|
const goalEvents = timelineCard?.data.events.filter((e) => e.type === "goal");
|
|
2622
|
-
return /* @__PURE__ */ (0,
|
|
2623
|
-
dashboard.greeting ? /* @__PURE__ */ (0,
|
|
2624
|
-
/* @__PURE__ */ (0,
|
|
2647
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { className: "ss-w-fandash", children: [
|
|
2648
|
+
dashboard.greeting ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { className: dashboard.greetingIsLead ? "ss-w-fandash-greeting ss-w-fandash-greeting--lead" : "ss-w-fandash-greeting", children: dashboard.greeting }) : null,
|
|
2649
|
+
/* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "ss-w-fandash-cards", children: orderedCards.map((card, i) => /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(FanDashboardCard, { card, onTap, ui, goalEvents }, `${card.cardType}-${i}`)) })
|
|
2625
2650
|
] });
|
|
2626
2651
|
}
|
|
2627
2652
|
function FanDashboardCard({ card, onTap, ui, goalEvents }) {
|
|
2628
2653
|
switch (card.cardType) {
|
|
2629
2654
|
case "fixture":
|
|
2630
|
-
return /* @__PURE__ */ (0,
|
|
2655
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(FixtureCard, { card });
|
|
2631
2656
|
case "countdown":
|
|
2632
|
-
return /* @__PURE__ */ (0,
|
|
2657
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(CountdownCard, { card });
|
|
2633
2658
|
case "injuries":
|
|
2634
|
-
return /* @__PURE__ */ (0,
|
|
2659
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(InjuriesCard, { card, ui });
|
|
2635
2660
|
case "reasonToBet":
|
|
2636
|
-
return /* @__PURE__ */ (0,
|
|
2661
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(ReasonToBetCard, { card });
|
|
2637
2662
|
case "whereToWatch":
|
|
2638
|
-
return /* @__PURE__ */ (0,
|
|
2663
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(WhereToWatchCard, { card });
|
|
2639
2664
|
case "congestedWeek":
|
|
2640
|
-
return /* @__PURE__ */ (0,
|
|
2665
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(CongestedWeekCard, { card, onTap });
|
|
2641
2666
|
case "transfers":
|
|
2642
|
-
return /* @__PURE__ */ (0,
|
|
2667
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(TransfersCard, { card });
|
|
2643
2668
|
case "links":
|
|
2644
|
-
return /* @__PURE__ */ (0,
|
|
2669
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(LinksCard, { card });
|
|
2645
2670
|
case "postMatchResult":
|
|
2646
|
-
return /* @__PURE__ */ (0,
|
|
2671
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(PostMatchResultCard, { card });
|
|
2647
2672
|
case "postMatchGoals":
|
|
2648
|
-
return /* @__PURE__ */ (0,
|
|
2673
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(PostMatchGoalsCard, { card, onTap });
|
|
2649
2674
|
case "postMatchStats":
|
|
2650
|
-
return /* @__PURE__ */ (0,
|
|
2675
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(PostMatchStatsCard, { card, onTap });
|
|
2651
2676
|
case "postMatchTopPerformer":
|
|
2652
|
-
return /* @__PURE__ */ (0,
|
|
2677
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(PostMatchTopPerformerCard, { card, onTap });
|
|
2653
2678
|
case "postMatchNext":
|
|
2654
|
-
return /* @__PURE__ */ (0,
|
|
2679
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(PostMatchNextCard, { card });
|
|
2655
2680
|
case "restingNext":
|
|
2656
|
-
return /* @__PURE__ */ (0,
|
|
2681
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(RestingNextCard, { card, onTap });
|
|
2657
2682
|
case "restingStandings":
|
|
2658
|
-
return /* @__PURE__ */ (0,
|
|
2683
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(RestingStandingsCard, { card, onTap });
|
|
2659
2684
|
case "restingSeason":
|
|
2660
|
-
return /* @__PURE__ */ (0,
|
|
2685
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(RestingSeasonCard, { card, onTap });
|
|
2661
2686
|
case "restingForm":
|
|
2662
|
-
return /* @__PURE__ */ (0,
|
|
2687
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(RestingFormCard, { card });
|
|
2663
2688
|
case "liveScore":
|
|
2664
|
-
return /* @__PURE__ */ (0,
|
|
2689
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(LiveScoreCard, { card, goalEvents });
|
|
2665
2690
|
case "liveTimeline":
|
|
2666
|
-
return /* @__PURE__ */ (0,
|
|
2691
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(LiveTimelineCard, { card, ui });
|
|
2667
2692
|
case "liveStats":
|
|
2668
|
-
return /* @__PURE__ */ (0,
|
|
2693
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(LiveStatsCard, { card });
|
|
2669
2694
|
default:
|
|
2670
2695
|
return null;
|
|
2671
2696
|
}
|
|
2672
2697
|
}
|
|
2673
2698
|
|
|
2674
2699
|
// src/components/ChatMessage.tsx
|
|
2675
|
-
var
|
|
2700
|
+
var import_jsx_runtime41 = require("react/jsx-runtime");
|
|
2676
2701
|
function ChatMessage({ message, disabled, onAct, onTap, ui, slip, monitor }) {
|
|
2677
2702
|
if (message.role === "user") {
|
|
2678
|
-
return /* @__PURE__ */ (0,
|
|
2703
|
+
return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "ss-w-msg ss-w-user", "data-msg-id": message.id, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "ss-w-bubble", children: message.text }) });
|
|
2679
2704
|
}
|
|
2680
2705
|
const onFanDashboardTap = (card) => {
|
|
2681
2706
|
onAct({ message: card.actionLabel, actionRef: card.actionRef, label: card.actionLabel || card.title || "" });
|
|
2682
2707
|
};
|
|
2683
|
-
return /* @__PURE__ */ (0,
|
|
2684
|
-
message.text && !message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ (0,
|
|
2685
|
-
message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ (0,
|
|
2686
|
-
message.clubFanDashboard ? /* @__PURE__ */ (0,
|
|
2687
|
-
/* @__PURE__ */ (0,
|
|
2688
|
-
/* @__PURE__ */ (0,
|
|
2689
|
-
/* @__PURE__ */ (0,
|
|
2690
|
-
/* @__PURE__ */ (0,
|
|
2691
|
-
/* @__PURE__ */ (0,
|
|
2708
|
+
return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "ss-w-msg ss-w-bot", "data-msg-id": message.id, children: [
|
|
2709
|
+
message.text && !message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Markdown, { text: message.text }) : null,
|
|
2710
|
+
message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(GreetingDashboard, { dashboard: message.greetingDashboard, onTap }) : null,
|
|
2711
|
+
message.clubFanDashboard ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(ClubFanDashboard, { dashboard: message.clubFanDashboard, onTap: onFanDashboardTap, ui }) : null,
|
|
2712
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(EntityCardList, { cards: message.cards, disabled, showLessLabel: ui?.showLess, showMoreLabel: ui?.showMore }),
|
|
2713
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(BettingInsightList, { insights: message.insights, ui, slip, monitor }),
|
|
2714
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(MarketOddsCardList, { cards: message.marketOdds, ui, slip, monitor }),
|
|
2715
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(OddsMovementCardList, { cards: message.oddsMovement, ui, monitor }),
|
|
2716
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(ActionButtons, { actions: message.actions, loading: false, disabled, onAct })
|
|
2692
2717
|
] });
|
|
2693
2718
|
}
|
|
2694
2719
|
|
|
2695
2720
|
// src/components/IntentChips.tsx
|
|
2696
|
-
var
|
|
2721
|
+
var import_jsx_runtime42 = require("react/jsx-runtime");
|
|
2697
2722
|
function IntentChips({ chips, onPick }) {
|
|
2698
2723
|
if (chips.length === 0) return null;
|
|
2699
|
-
return /* @__PURE__ */ (0,
|
|
2724
|
+
return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "ss-w-chips", children: chips.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("button", { type: "button", className: "ss-w-chip", onClick: () => onPick(c.text), children: c.text }, `${c.text}-${i}`)) });
|
|
2700
2725
|
}
|
|
2701
2726
|
|
|
2702
2727
|
// src/scroll.ts
|
|
@@ -2706,7 +2731,7 @@ function isPinnedToBottom(el, threshold = PIN_THRESHOLD) {
|
|
|
2706
2731
|
}
|
|
2707
2732
|
|
|
2708
2733
|
// src/components/MessageList.tsx
|
|
2709
|
-
var
|
|
2734
|
+
var import_jsx_runtime43 = require("react/jsx-runtime");
|
|
2710
2735
|
function turnAnchor(messages) {
|
|
2711
2736
|
const last = messages[messages.length - 1];
|
|
2712
2737
|
if (!last || last.role !== "assistant") return null;
|
|
@@ -2715,11 +2740,11 @@ function turnAnchor(messages) {
|
|
|
2715
2740
|
}
|
|
2716
2741
|
function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
2717
2742
|
const { state, send } = controller;
|
|
2718
|
-
const listRef = (0,
|
|
2719
|
-
const endRef = (0,
|
|
2720
|
-
const pinnedRef = (0,
|
|
2721
|
-
const anchoredTurnRef = (0,
|
|
2722
|
-
(0,
|
|
2743
|
+
const listRef = (0, import_react19.useRef)(null);
|
|
2744
|
+
const endRef = (0, import_react19.useRef)(null);
|
|
2745
|
+
const pinnedRef = (0, import_react19.useRef)(true);
|
|
2746
|
+
const anchoredTurnRef = (0, import_react19.useRef)(null);
|
|
2747
|
+
(0, import_react19.useEffect)(() => {
|
|
2723
2748
|
const anchor = turnAnchor(state.messages);
|
|
2724
2749
|
const list = listRef.current;
|
|
2725
2750
|
if (anchor && anchor.turnId !== anchoredTurnRef.current) {
|
|
@@ -2734,7 +2759,7 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
2734
2759
|
}, [state.messages, state.status, state.isStreaming]);
|
|
2735
2760
|
const hasUserMessage = state.messages.some((m) => m.role === "user");
|
|
2736
2761
|
const hasDashboard = state.messages.some((m) => m.role === "assistant" && (m.greetingDashboard || m.clubFanDashboard));
|
|
2737
|
-
return /* @__PURE__ */ (0,
|
|
2762
|
+
return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
|
|
2738
2763
|
"div",
|
|
2739
2764
|
{
|
|
2740
2765
|
className: "ss-w-list",
|
|
@@ -2744,7 +2769,7 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
2744
2769
|
if (listRef.current) pinnedRef.current = isPinnedToBottom(listRef.current);
|
|
2745
2770
|
},
|
|
2746
2771
|
children: [
|
|
2747
|
-
state.messages.map((m) => /* @__PURE__ */ (0,
|
|
2772
|
+
state.messages.map((m) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
|
|
2748
2773
|
ChatMessage,
|
|
2749
2774
|
{
|
|
2750
2775
|
message: m,
|
|
@@ -2760,25 +2785,25 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
2760
2785
|
},
|
|
2761
2786
|
m.id
|
|
2762
2787
|
)),
|
|
2763
|
-
state.isStreaming && state.actionsLoading ? /* @__PURE__ */ (0,
|
|
2788
|
+
state.isStreaming && state.actionsLoading ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(ActionButtons, { actions: [], loading: true, onAct: () => {
|
|
2764
2789
|
} }) : null,
|
|
2765
|
-
state.status ? /* @__PURE__ */ (0,
|
|
2766
|
-
state.error ? /* @__PURE__ */ (0,
|
|
2767
|
-
/* @__PURE__ */ (0,
|
|
2768
|
-
/* @__PURE__ */ (0,
|
|
2790
|
+
state.status ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className: "ss-w-status", children: state.status }) : null,
|
|
2791
|
+
state.error ? /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("div", { className: "ss-w-error", role: "alert", children: [
|
|
2792
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsx)("span", { children: "message" in state.error ? state.error.message : ui.somethingWentWrong }),
|
|
2793
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsx)("button", { type: "button", className: "ss-w-retry", onClick: () => controller.retry(), children: ui.retry })
|
|
2769
2794
|
] }) : null,
|
|
2770
|
-
!hasUserMessage && !hasDashboard ? /* @__PURE__ */ (0,
|
|
2771
|
-
/* @__PURE__ */ (0,
|
|
2795
|
+
!hasUserMessage && !hasDashboard ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(IntentChips, { chips: state.starters, onPick: (t) => send(t) }) : null,
|
|
2796
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { ref: endRef, className: "ss-w-turn-spacer", "aria-hidden": "true" })
|
|
2772
2797
|
]
|
|
2773
2798
|
}
|
|
2774
2799
|
);
|
|
2775
2800
|
}
|
|
2776
2801
|
|
|
2777
2802
|
// src/components/ChatInput.tsx
|
|
2778
|
-
var
|
|
2779
|
-
var
|
|
2803
|
+
var import_react20 = require("react");
|
|
2804
|
+
var import_jsx_runtime44 = require("react/jsx-runtime");
|
|
2780
2805
|
function ChatInput({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message" }) {
|
|
2781
|
-
const [value, setValue] = (0,
|
|
2806
|
+
const [value, setValue] = (0, import_react20.useState)("");
|
|
2782
2807
|
const submit = () => {
|
|
2783
2808
|
const t = value.trim();
|
|
2784
2809
|
if (!t) return;
|
|
@@ -2791,14 +2816,14 @@ function ChatInput({ placeholder, streaming, onSend, onStop, stopLabel = "Stop r
|
|
|
2791
2816
|
submit();
|
|
2792
2817
|
}
|
|
2793
2818
|
};
|
|
2794
|
-
return /* @__PURE__ */ (0,
|
|
2795
|
-
/* @__PURE__ */ (0,
|
|
2796
|
-
streaming ? /* @__PURE__ */ (0,
|
|
2819
|
+
return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "ss-w-input", children: [
|
|
2820
|
+
/* @__PURE__ */ (0, import_jsx_runtime44.jsx)("textarea", { className: "ss-w-textarea", rows: 1, placeholder, value, disabled: streaming, onChange: (e) => setValue(e.target.value), onKeyDown }),
|
|
2821
|
+
streaming ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("button", { type: "button", className: "ss-w-send ss-w-stop", "aria-label": stopLabel, onClick: onStop, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "ss-w-stop-glyph" }) }) : /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("button", { type: "button", className: "ss-w-send", "aria-label": sendLabel, onClick: submit, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(SendIcon, {}) })
|
|
2797
2822
|
] });
|
|
2798
2823
|
}
|
|
2799
2824
|
|
|
2800
2825
|
// src/components/TabBar.tsx
|
|
2801
|
-
var
|
|
2826
|
+
var import_jsx_runtime45 = require("react/jsx-runtime");
|
|
2802
2827
|
var TABS = [
|
|
2803
2828
|
{ tab: "chat", labelKey: "tabChat" },
|
|
2804
2829
|
{ tab: "matches", labelKey: "tabMatches" },
|
|
@@ -2812,10 +2837,10 @@ function TabBar({ monitor, ui, matchCount, oddsCount }) {
|
|
|
2812
2837
|
matches: monitor.matchesDot && monitor.activeTab !== "matches",
|
|
2813
2838
|
odds: monitor.oddsDot && monitor.activeTab !== "odds"
|
|
2814
2839
|
};
|
|
2815
|
-
return /* @__PURE__ */ (0,
|
|
2840
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "ss-w-tabs", role: "tablist", children: TABS.map(({ tab, labelKey }) => {
|
|
2816
2841
|
const active = monitor.activeTab === tab;
|
|
2817
2842
|
const count = counts[tab];
|
|
2818
|
-
return /* @__PURE__ */ (0,
|
|
2843
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
2819
2844
|
"button",
|
|
2820
2845
|
{
|
|
2821
2846
|
type: "button",
|
|
@@ -2826,8 +2851,8 @@ function TabBar({ monitor, ui, matchCount, oddsCount }) {
|
|
|
2826
2851
|
onClick: () => monitor.setActiveTab(tab),
|
|
2827
2852
|
children: [
|
|
2828
2853
|
ui[labelKey],
|
|
2829
|
-
count > 0 && /* @__PURE__ */ (0,
|
|
2830
|
-
dots[tab] && /* @__PURE__ */ (0,
|
|
2854
|
+
count > 0 && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "ss-w-tab-count", children: count }),
|
|
2855
|
+
dots[tab] && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "ss-w-tab-dot", "aria-hidden": "true" })
|
|
2831
2856
|
]
|
|
2832
2857
|
},
|
|
2833
2858
|
tab
|
|
@@ -2836,7 +2861,7 @@ function TabBar({ monitor, ui, matchCount, oddsCount }) {
|
|
|
2836
2861
|
}
|
|
2837
2862
|
|
|
2838
2863
|
// src/components/MonitorMatchCard.tsx
|
|
2839
|
-
var
|
|
2864
|
+
var import_jsx_runtime46 = require("react/jsx-runtime");
|
|
2840
2865
|
function chipSelection(row, matchId, conversationId) {
|
|
2841
2866
|
const chip = row.market;
|
|
2842
2867
|
if (!chip || !chip.addToSlipEnabled || typeof chip.matchOddsId !== "number" || typeof chip.price !== "number") return null;
|
|
@@ -2859,63 +2884,63 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
2859
2884
|
const otherRows = match.statRows.filter((row) => !isPromoted(row, promotedPins));
|
|
2860
2885
|
const orderedRows = [...promotedRows, ...otherRows];
|
|
2861
2886
|
const kickoff = match.phase === "preMatch" && match.kickoffUtc ? ui.bettingKickoff(match.kickoffUtc) : void 0;
|
|
2862
|
-
return /* @__PURE__ */ (0,
|
|
2863
|
-
/* @__PURE__ */ (0,
|
|
2864
|
-
live && /* @__PURE__ */ (0,
|
|
2865
|
-
/* @__PURE__ */ (0,
|
|
2887
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "ss-w-mon", children: [
|
|
2888
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "ss-w-mon-top", children: [
|
|
2889
|
+
live && /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { className: "ss-w-fandash-live-pill", children: [
|
|
2890
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-fandash-live-dot", "aria-hidden": "true" }),
|
|
2866
2891
|
ui.liveLabel
|
|
2867
2892
|
] }),
|
|
2868
|
-
match.phase === "fullTime" && /* @__PURE__ */ (0,
|
|
2869
|
-
kickoff && /* @__PURE__ */ (0,
|
|
2893
|
+
match.phase === "fullTime" && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
|
|
2894
|
+
kickoff && /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { className: "ss-w-mon-pill", children: [
|
|
2870
2895
|
kickoff.dayLabel,
|
|
2871
2896
|
" \xB7 ",
|
|
2872
2897
|
kickoff.time
|
|
2873
2898
|
] }),
|
|
2874
|
-
live && match.minuteLabel && /* @__PURE__ */ (0,
|
|
2875
|
-
match.competitionName && /* @__PURE__ */ (0,
|
|
2876
|
-
/* @__PURE__ */ (0,
|
|
2899
|
+
live && match.minuteLabel && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-min", children: match.minuteLabel }),
|
|
2900
|
+
match.competitionName && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-comp", children: match.competitionName }),
|
|
2901
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(PinToggle, { ui, monitor, pin: { kind: "match", matchId: match.matchId } })
|
|
2877
2902
|
] }),
|
|
2878
|
-
/* @__PURE__ */ (0,
|
|
2879
|
-
/* @__PURE__ */ (0,
|
|
2880
|
-
/* @__PURE__ */ (0,
|
|
2881
|
-
/* @__PURE__ */ (0,
|
|
2903
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "ss-w-mon-main", children: [
|
|
2904
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { className: "ss-w-mon-side", children: [
|
|
2905
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Crest2, { kind: "team", url: match.homeCrestUrl ?? void 0, name: match.homeTeamName ?? void 0 }),
|
|
2906
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-name", children: match.homeTeamName })
|
|
2882
2907
|
] }),
|
|
2883
|
-
match.phase === "preMatch" ? /* @__PURE__ */ (0,
|
|
2908
|
+
match.phase === "preMatch" ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-vs", children: "vs" }) : /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { className: "ss-w-mon-score", children: [
|
|
2884
2909
|
match.homeScore,
|
|
2885
|
-
/* @__PURE__ */ (0,
|
|
2910
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("i", { children: "\u2013" }),
|
|
2886
2911
|
match.awayScore
|
|
2887
2912
|
] }),
|
|
2888
|
-
/* @__PURE__ */ (0,
|
|
2889
|
-
/* @__PURE__ */ (0,
|
|
2890
|
-
/* @__PURE__ */ (0,
|
|
2913
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { className: "ss-w-mon-side ss-w-mon-side--away", children: [
|
|
2914
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Crest2, { kind: "team", url: match.awayCrestUrl ?? void 0, name: match.awayTeamName ?? void 0 }),
|
|
2915
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-name", children: match.awayTeamName })
|
|
2891
2916
|
] })
|
|
2892
2917
|
] }),
|
|
2893
|
-
scorers.length > 0 && /* @__PURE__ */ (0,
|
|
2894
|
-
/* @__PURE__ */ (0,
|
|
2918
|
+
scorers.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "ss-w-mon-scorers", children: scorers.map((e) => `${e.player ?? ""} ${e.minuteLabel}`).join(", ") }),
|
|
2919
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "ss-w-mon-stats", children: orderedRows.map((row) => {
|
|
2895
2920
|
const total = row.homeNum + row.awayNum;
|
|
2896
2921
|
const homePct = total > 0 ? row.homeNum / total * 75 : 0;
|
|
2897
2922
|
const awayPct = total > 0 ? row.awayNum / total * 75 : 0;
|
|
2898
2923
|
const promoted = isPromoted(row, promotedPins);
|
|
2899
2924
|
const selection = chipSelection(row, match.matchId, slip.conversationId);
|
|
2900
|
-
return /* @__PURE__ */ (0,
|
|
2901
|
-
/* @__PURE__ */ (0,
|
|
2902
|
-
/* @__PURE__ */ (0,
|
|
2903
|
-
/* @__PURE__ */ (0,
|
|
2904
|
-
/* @__PURE__ */ (0,
|
|
2925
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: promoted ? "ss-w-mon-stat ss-w-mon-pstrip" : "ss-w-mon-stat", children: [
|
|
2926
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "ss-w-mon-stat-row", children: [
|
|
2927
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--home", children: row.homeValue }),
|
|
2928
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-stat-l", children: row.label }),
|
|
2929
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--away", children: row.awayValue })
|
|
2905
2930
|
] }),
|
|
2906
|
-
/* @__PURE__ */ (0,
|
|
2907
|
-
/* @__PURE__ */ (0,
|
|
2908
|
-
/* @__PURE__ */ (0,
|
|
2931
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "ss-w-mon-bar", children: [
|
|
2932
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("b", { className: "ss-w-mon-bar-home", style: { width: `${homePct}%` } }),
|
|
2933
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("i", { className: "ss-w-mon-bar-away", style: { width: `${awayPct}%` } })
|
|
2909
2934
|
] }),
|
|
2910
|
-
row.market && /* @__PURE__ */ (0,
|
|
2911
|
-
/* @__PURE__ */ (0,
|
|
2935
|
+
row.market && /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: promoted ? "ss-w-mon-stat-mkt ss-w-mon-mkt" : "ss-w-mon-stat-mkt", children: [
|
|
2936
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { children: [
|
|
2912
2937
|
row.market.marketLabel,
|
|
2913
2938
|
" \xB7 ",
|
|
2914
2939
|
row.market.selectionLabel
|
|
2915
2940
|
] }),
|
|
2916
|
-
/* @__PURE__ */ (0,
|
|
2917
|
-
row.market.isSuspended ? /* @__PURE__ */ (0,
|
|
2918
|
-
/* @__PURE__ */ (0,
|
|
2941
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { className: "ss-w-mon-stat-mkt-right", children: [
|
|
2942
|
+
row.market.isSuspended ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-susp", children: ui.suspendedLabel }) : typeof row.market.price === "number" && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-price", children: row.market.price.toFixed(2) }),
|
|
2943
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
2919
2944
|
SlipButton,
|
|
2920
2945
|
{
|
|
2921
2946
|
selection,
|
|
@@ -2929,58 +2954,58 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
2929
2954
|
] })
|
|
2930
2955
|
] }, row.label);
|
|
2931
2956
|
}) }),
|
|
2932
|
-
match.status === "stale" && /* @__PURE__ */ (0,
|
|
2933
|
-
match.momentum.length > 0 && /* @__PURE__ */ (0,
|
|
2934
|
-
/* @__PURE__ */ (0,
|
|
2935
|
-
/* @__PURE__ */ (0,
|
|
2936
|
-
/* @__PURE__ */ (0,
|
|
2937
|
-
/* @__PURE__ */ (0,
|
|
2957
|
+
match.status === "stale" && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-asof", children: ui.asOf(formatTime(match.asOfUtc)) }),
|
|
2958
|
+
match.momentum.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "ss-w-mon-mom", children: [
|
|
2959
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "ss-w-mon-stat-row", children: [
|
|
2960
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--home", children: typeof match.momentumHomePct === "number" ? `${match.momentumHomePct}%` : "" }),
|
|
2961
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-stat-l", children: ui.momentumLabel }),
|
|
2962
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--away", children: typeof match.momentumHomePct === "number" ? `${100 - match.momentumHomePct}%` : "" })
|
|
2938
2963
|
] }),
|
|
2939
|
-
/* @__PURE__ */ (0,
|
|
2964
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(MomentumWave, { points: match.momentum, clubIsHome: true })
|
|
2940
2965
|
] }),
|
|
2941
|
-
match.mainMarket && match.phase !== "fullTime" && /* @__PURE__ */ (0,
|
|
2942
|
-
match.phase === "fullTime" && /* @__PURE__ */ (0,
|
|
2966
|
+
match.mainMarket && match.phase !== "fullTime" && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(MarketOddsCardList, { cards: [toMarketOddsVM(match.mainMarket)], ui, slip }),
|
|
2967
|
+
match.phase === "fullTime" && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "ss-w-mon-grace", children: ui.graceNote })
|
|
2943
2968
|
] });
|
|
2944
2969
|
}
|
|
2945
2970
|
|
|
2946
2971
|
// src/components/MonitorTabs.tsx
|
|
2947
|
-
var
|
|
2972
|
+
var import_jsx_runtime47 = require("react/jsx-runtime");
|
|
2948
2973
|
function ContextLine({ m, monitor, ui }) {
|
|
2949
2974
|
const kick = m.kickoffUtc ? ui.bettingKickoff(m.kickoffUtc) : void 0;
|
|
2950
|
-
return /* @__PURE__ */ (0,
|
|
2951
|
-
/* @__PURE__ */ (0,
|
|
2952
|
-
/* @__PURE__ */ (0,
|
|
2953
|
-
/* @__PURE__ */ (0,
|
|
2975
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "ss-w-mk-ctx", children: [
|
|
2976
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("span", { className: "ss-w-mk-ctx-side", children: [
|
|
2977
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Crest2, { kind: "team", url: m.homeCrestUrl ?? void 0, name: m.homeTeamName ?? void 0 }),
|
|
2978
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "ss-w-mon-name", children: m.homeTeamName })
|
|
2954
2979
|
] }),
|
|
2955
|
-
m.phase === "preMatch" ? kick && /* @__PURE__ */ (0,
|
|
2980
|
+
m.phase === "preMatch" ? kick && /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("span", { className: "ss-w-mon-pill", children: [
|
|
2956
2981
|
kick.dayLabel,
|
|
2957
2982
|
" ",
|
|
2958
2983
|
kick.time
|
|
2959
|
-
] }) : typeof m.homeScore === "number" && /* @__PURE__ */ (0,
|
|
2984
|
+
] }) : typeof m.homeScore === "number" && /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("b", { children: [
|
|
2960
2985
|
m.homeScore,
|
|
2961
2986
|
"\u2013",
|
|
2962
2987
|
m.awayScore
|
|
2963
2988
|
] }),
|
|
2964
|
-
/* @__PURE__ */ (0,
|
|
2965
|
-
/* @__PURE__ */ (0,
|
|
2966
|
-
/* @__PURE__ */ (0,
|
|
2989
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("span", { className: "ss-w-mk-ctx-side", children: [
|
|
2990
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "ss-w-mon-name", children: m.awayTeamName }),
|
|
2991
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Crest2, { kind: "team", url: m.awayCrestUrl ?? void 0, name: m.awayTeamName ?? void 0 })
|
|
2967
2992
|
] }),
|
|
2968
|
-
m.minuteLabel && /* @__PURE__ */ (0,
|
|
2969
|
-
/* @__PURE__ */ (0,
|
|
2970
|
-
m.isSuspended && !m.isSettled && /* @__PURE__ */ (0,
|
|
2971
|
-
m.isSettled && /* @__PURE__ */ (0,
|
|
2972
|
-
m.status === "stale" && /* @__PURE__ */ (0,
|
|
2993
|
+
m.minuteLabel && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "ss-w-mon-min", children: m.minuteLabel }),
|
|
2994
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("span", { className: "ss-w-mk-ctx-right", children: [
|
|
2995
|
+
m.isSuspended && !m.isSettled && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "ss-w-mon-susp", children: ui.suspendedLabel }),
|
|
2996
|
+
m.isSettled && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
|
|
2997
|
+
m.status === "stale" && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "ss-w-mon-asof", children: ui.asOf(new Date(m.asOfUtc).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" })) }),
|
|
2973
2998
|
(() => {
|
|
2974
2999
|
const pin = monitor.pins.find((p) => p.key === m.key);
|
|
2975
|
-
return pin ? /* @__PURE__ */ (0,
|
|
3000
|
+
return pin ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(PinToggle, { ui, monitor, pin }) : null;
|
|
2976
3001
|
})()
|
|
2977
3002
|
] })
|
|
2978
3003
|
] });
|
|
2979
3004
|
}
|
|
2980
3005
|
function MatchesPanel({ monitor, ui, slip }) {
|
|
2981
3006
|
const matches = (monitor.snapshot?.matches ?? []).filter((m) => monitor.pins.some((p) => p.kind === "match" && p.matchId === m.matchId));
|
|
2982
|
-
if (matches.length === 0) return /* @__PURE__ */ (0,
|
|
2983
|
-
return /* @__PURE__ */ (0,
|
|
3007
|
+
if (matches.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "ss-w-mon-empty", children: ui.emptyMatchesTab });
|
|
3008
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "ss-w-mon-list", children: matches.map((m) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
2984
3009
|
MonitorMatchCard,
|
|
2985
3010
|
{
|
|
2986
3011
|
match: m,
|
|
@@ -3004,10 +3029,10 @@ function withSinceViewMovement(vm, prev) {
|
|
|
3004
3029
|
}
|
|
3005
3030
|
function OddsPanel({ monitor, ui, slip }) {
|
|
3006
3031
|
const markets = (monitor.snapshot?.markets ?? []).filter((m) => monitor.pins.some((p) => p.key === m.key));
|
|
3007
|
-
if (markets.length === 0) return /* @__PURE__ */ (0,
|
|
3008
|
-
return /* @__PURE__ */ (0,
|
|
3009
|
-
/* @__PURE__ */ (0,
|
|
3010
|
-
m.card && /* @__PURE__ */ (0,
|
|
3032
|
+
if (markets.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "ss-w-mon-empty", children: ui.emptyOddsTab });
|
|
3033
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "ss-w-mon-list", children: markets.map((m) => /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "ss-w-mon-oddspin", "data-settled": m.isSettled || void 0, children: [
|
|
3034
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(ContextLine, { m, monitor, ui }),
|
|
3035
|
+
m.card && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
3011
3036
|
MarketOddsCardList,
|
|
3012
3037
|
{
|
|
3013
3038
|
cards: [withSinceViewMovement(toMarketOddsVM(m.card), monitor.lastViewedPrices[m.key])],
|
|
@@ -3016,17 +3041,17 @@ function OddsPanel({ monitor, ui, slip }) {
|
|
|
3016
3041
|
inSlipIds: monitor.inSlip
|
|
3017
3042
|
}
|
|
3018
3043
|
),
|
|
3019
|
-
m.history && /* @__PURE__ */ (0,
|
|
3020
|
-
!m.card && !m.history && /* @__PURE__ */ (0,
|
|
3044
|
+
m.history && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(OddsMovementCardList, { cards: [toOddsMovementVM(m.history)], ui }),
|
|
3045
|
+
!m.card && !m.history && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "ss-w-mon-empty-card", children: ui.oddsUnavailable })
|
|
3021
3046
|
] }, m.key)) });
|
|
3022
3047
|
}
|
|
3023
3048
|
|
|
3024
3049
|
// src/components/ChatPanel.tsx
|
|
3025
|
-
var
|
|
3050
|
+
var import_jsx_runtime48 = require("react/jsx-runtime");
|
|
3026
3051
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
3027
3052
|
function useIsModal() {
|
|
3028
|
-
const [modal, setModal] = (0,
|
|
3029
|
-
(0,
|
|
3053
|
+
const [modal, setModal] = (0, import_react21.useState)(false);
|
|
3054
|
+
(0, import_react21.useEffect)(() => {
|
|
3030
3055
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
3031
3056
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
3032
3057
|
const sync = () => setModal(mql.matches);
|
|
@@ -3039,7 +3064,7 @@ function useIsModal() {
|
|
|
3039
3064
|
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
3040
3065
|
const { state, close, stop, send } = controller;
|
|
3041
3066
|
const isModal = useIsModal();
|
|
3042
|
-
(0,
|
|
3067
|
+
(0, import_react21.useEffect)(() => {
|
|
3043
3068
|
const onKey = (e) => {
|
|
3044
3069
|
if (e.key === "Escape") close();
|
|
3045
3070
|
};
|
|
@@ -3050,12 +3075,12 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
3050
3075
|
monitor?.setActiveTab("chat");
|
|
3051
3076
|
send(text);
|
|
3052
3077
|
};
|
|
3053
|
-
(0,
|
|
3078
|
+
(0, import_react21.useEffect)(() => {
|
|
3054
3079
|
if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
|
|
3055
3080
|
}, [monitor, state.isStreaming, state.messages.length]);
|
|
3056
|
-
return /* @__PURE__ */ (0,
|
|
3057
|
-
/* @__PURE__ */ (0,
|
|
3058
|
-
monitor && /* @__PURE__ */ (0,
|
|
3081
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
|
|
3082
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(ChatHeader, { onClose: close, closeLabel: ui.closeChat, logoUrl: ui.logoUrl, headerTitle: ui.headerTitle }),
|
|
3083
|
+
monitor && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
3059
3084
|
TabBar,
|
|
3060
3085
|
{
|
|
3061
3086
|
monitor,
|
|
@@ -3064,16 +3089,17 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
3064
3089
|
oddsCount: monitor.pins.filter((p) => p.kind !== "match").length
|
|
3065
3090
|
}
|
|
3066
3091
|
),
|
|
3067
|
-
/* @__PURE__ */ (0,
|
|
3092
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
3068
3093
|
"div",
|
|
3069
3094
|
{
|
|
3070
3095
|
style: !monitor || monitor.activeTab === "chat" ? { display: "contents" } : { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" },
|
|
3071
|
-
children: /* @__PURE__ */ (0,
|
|
3096
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(MessageList, { controller, ui, slip, onDashboardTap, monitor })
|
|
3072
3097
|
}
|
|
3073
3098
|
),
|
|
3074
|
-
monitor && monitor.activeTab === "matches" && /* @__PURE__ */ (0,
|
|
3075
|
-
monitor && monitor.activeTab === "odds" && /* @__PURE__ */ (0,
|
|
3076
|
-
/* @__PURE__ */ (0,
|
|
3099
|
+
monitor && monitor.activeTab === "matches" && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(MatchesPanel, { monitor, ui, slip }),
|
|
3100
|
+
monitor && monitor.activeTab === "odds" && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(OddsPanel, { monitor, ui, slip }),
|
|
3101
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(ChatInput, { placeholder: ui.placeholder, streaming: state.isStreaming, onSend: handleSend, onStop: stop, stopLabel: ui.stopResponse, sendLabel: ui.sendMessage }),
|
|
3102
|
+
ui.attribution !== false ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "ss-w-attribution", children: "Powered by SensibleStats" }) : null
|
|
3077
3103
|
] });
|
|
3078
3104
|
}
|
|
3079
3105
|
|
|
@@ -3119,7 +3145,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
3119
3145
|
.ss-w-root[data-ss-w-pos="right"] .ss-w-fab-wrap { right: var(--ss-w-offset-x); }
|
|
3120
3146
|
.ss-w-root[data-ss-w-pos="left"] .ss-w-fab-wrap { left: var(--ss-w-offset-x); align-items: flex-start; }
|
|
3121
3147
|
.ss-w-fab { width: 56px; height: 56px; border: none; border-radius: 50%; background: var(--ss-w-nav); color: #fff; cursor: pointer; display: grid; place-items: center; box-shadow: 0 6px 20px rgba(0,0,0,.28); }
|
|
3122
|
-
.ss-w-fab-mark { width: 30px; height: 30px; display: block; }
|
|
3148
|
+
.ss-w-fab-mark { width: 30px; height: 30px; display: block; object-fit: contain; }
|
|
3123
3149
|
.ss-w-greeting { max-width: 240px; display: flex; align-items: flex-start; background: var(--ss-w-panel); color: var(--ss-w-ink); border: 1px solid var(--ss-w-line); border-radius: 12px; box-shadow: 0 4px 14px rgba(0,0,0,.14); }
|
|
3124
3150
|
.ss-w-greeting-body { flex: 1; min-width: 0; text-align: left; background: none; border: none; color: inherit; font: inherit; cursor: pointer; padding: 9px 4px 9px 12px; }
|
|
3125
3151
|
.ss-w-greeting-x { flex: none; background: none; border: none; color: var(--ss-w-faint); cursor: pointer; font-size: 17px; line-height: 1; padding: 7px 9px 0 2px; }
|
|
@@ -3136,7 +3162,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
3136
3162
|
.ss-w-root[data-ss-w-pos="left"] .ss-w-panel { inset: 0; width: auto; height: auto; border: none; border-radius: 0; }
|
|
3137
3163
|
}
|
|
3138
3164
|
.ss-w-header { display: flex; align-items: center; gap: 8px; padding: 12px 14px; border-bottom: 1px solid var(--ss-w-line); }
|
|
3139
|
-
.ss-w-header-mark { width: 18px; height: 18px; display: block; }
|
|
3165
|
+
.ss-w-header-mark { width: 18px; height: 18px; display: block; object-fit: contain; }
|
|
3140
3166
|
.ss-w-header-title { font-weight: 660; }
|
|
3141
3167
|
.ss-w-close { margin-left: auto; background: none; border: none; color: var(--ss-w-faint); cursor: pointer; font-size: 16px; display: grid; place-items: center; }
|
|
3142
3168
|
|
|
@@ -3361,6 +3387,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
3361
3387
|
}
|
|
3362
3388
|
.ss-w-send { width: 36px; height: 36px; flex: none; border: none; border-radius: 50%; background: var(--ss-w-accent); color: #fff; cursor: pointer; display: grid; place-items: center; font-size: 16px; }
|
|
3363
3389
|
.ss-w-stop-glyph { width: 11px; height: 11px; background: currentColor; border-radius: 2px; }
|
|
3390
|
+
.ss-w-attribution { flex: 0 0 auto; padding: 6px 12px 8px; text-align: center; font-size: 11px; color: var(--ss-w-faint); }
|
|
3364
3391
|
|
|
3365
3392
|
/* add to slip */
|
|
3366
3393
|
.ss-w-slip { position: relative; display: flex; }
|
|
@@ -3456,6 +3483,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
3456
3483
|
/* club fan pre-match dashboard */
|
|
3457
3484
|
.ss-w-fandash { display: flex; flex-direction: column; gap: 10px; padding: 4px 0; }
|
|
3458
3485
|
.ss-w-fandash-greeting { font-size: 14px; font-weight: 600; line-height: 1.3; color: var(--ss-w-ink); }
|
|
3486
|
+
.ss-w-fandash-greeting--lead { font-weight: 400; }
|
|
3459
3487
|
.ss-w-fandash-cards { display: flex; flex-direction: column; gap: 8px; }
|
|
3460
3488
|
|
|
3461
3489
|
/* Shared card chrome -- a plain <div> for [data] cards, a <button> for [prefill] cards. Both
|
|
@@ -3828,7 +3856,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
3828
3856
|
`;
|
|
3829
3857
|
|
|
3830
3858
|
// src/StatsWidget.tsx
|
|
3831
|
-
var
|
|
3859
|
+
var import_jsx_runtime49 = require("react/jsx-runtime");
|
|
3832
3860
|
function buildClient(props) {
|
|
3833
3861
|
try {
|
|
3834
3862
|
if ("client" in props && props.client) {
|
|
@@ -3853,16 +3881,16 @@ function injectStyles(root) {
|
|
|
3853
3881
|
function StatsWidget(props) {
|
|
3854
3882
|
const injectedClient = "client" in props ? props.client : void 0;
|
|
3855
3883
|
const cfg = props.config;
|
|
3856
|
-
const built = (0,
|
|
3857
|
-
const ui = (0,
|
|
3858
|
-
const rootRef = (0,
|
|
3884
|
+
const built = (0, import_react22.useMemo)(() => buildClient(props), [injectedClient, cfg?.operatorId, cfg?.publicKey, cfg?.baseUrl]);
|
|
3885
|
+
const ui = (0, import_react22.useMemo)(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
|
|
3886
|
+
const rootRef = (0, import_react22.useRef)(null);
|
|
3859
3887
|
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0);
|
|
3860
3888
|
const monitor = useLiveMonitor({
|
|
3861
3889
|
getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
|
|
3862
3890
|
storageKey: `ss-w-pins:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`,
|
|
3863
3891
|
isOpen: controller.state.isOpen
|
|
3864
3892
|
});
|
|
3865
|
-
const slip = (0,
|
|
3893
|
+
const slip = (0, import_react22.useMemo)(
|
|
3866
3894
|
() => {
|
|
3867
3895
|
const handler = props.config?.onAddToSlip;
|
|
3868
3896
|
return {
|
|
@@ -3885,23 +3913,24 @@ function StatsWidget(props) {
|
|
|
3885
3913
|
},
|
|
3886
3914
|
[props.config?.onAddToSlip, controller.state.conversationId, built, monitor.markInSlip]
|
|
3887
3915
|
);
|
|
3888
|
-
const onDashboardTap = (0,
|
|
3916
|
+
const onDashboardTap = (0, import_react22.useMemo)(
|
|
3889
3917
|
() => built ? createDashboardTapSignal((input) => built.conversation.sendSignal(input)) : void 0,
|
|
3890
3918
|
[built]
|
|
3891
3919
|
);
|
|
3892
|
-
(0,
|
|
3920
|
+
(0, import_react22.useEffect)(() => {
|
|
3893
3921
|
if (!built || !ui.injectStyles) return;
|
|
3894
3922
|
const node = rootRef.current?.getRootNode();
|
|
3895
3923
|
if (node) injectStyles(node);
|
|
3896
3924
|
}, [built, ui.injectStyles]);
|
|
3897
3925
|
if (!built) return null;
|
|
3898
3926
|
const attrs = themeAttrs(ui);
|
|
3899
|
-
return /* @__PURE__ */ (0,
|
|
3927
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { ref: rootRef, className: "ss-w-root", "data-ss-w-theme": attrs["data-ss-w-theme"], "data-ss-w-pos": attrs["data-ss-w-pos"], style: attrs.style, children: controller.state.isOpen ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(ChatPanel, { controller, ui, slip, onDashboardTap, monitor: monitor.enabled ? monitor : void 0 }) : /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
3900
3928
|
ChatFab,
|
|
3901
3929
|
{
|
|
3902
3930
|
label: ui.launcherLabel,
|
|
3903
3931
|
greeting: ui.greeting,
|
|
3904
3932
|
popupText: controller.state.popupText,
|
|
3933
|
+
logoUrl: ui.logoUrl,
|
|
3905
3934
|
onOpen: controller.open,
|
|
3906
3935
|
onDismissPopup: controller.dismissPopup,
|
|
3907
3936
|
dismissLabel: ui.dismissGreeting
|