@sensiblestats/widget-react 0.37.3 → 0.39.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 +12 -0
- package/dist/index.cjs +318 -77
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +534 -293
- package/dist/index.js.map +1 -1
- package/dist/styles.css +8 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/StatsWidget.tsx
|
|
2
|
-
import { useCallback as useCallback5, useEffect as
|
|
2
|
+
import { useCallback as useCallback5, useEffect as useEffect11, useMemo as useMemo2, useRef as useRef8 } from "react";
|
|
3
3
|
import { StatsWidgetClient } from "@sensiblestats/widget-sdk";
|
|
4
4
|
|
|
5
5
|
// src/kickoff.ts
|
|
@@ -20,6 +20,8 @@ var STRINGS = {
|
|
|
20
20
|
launcherLabel: "Chat with SensibleStats",
|
|
21
21
|
placeholder: "Ask about a team, player or match\u2026",
|
|
22
22
|
closeChat: "Close chat",
|
|
23
|
+
newConversation: "New conversation",
|
|
24
|
+
moreOptions: "More options",
|
|
23
25
|
chatDialogLabel: "SensibleStats chat",
|
|
24
26
|
stopResponse: "Stop response",
|
|
25
27
|
sendMessage: "Send message",
|
|
@@ -92,6 +94,8 @@ var STRINGS = {
|
|
|
92
94
|
launcherLabel: "SensibleStats ile sohbet et",
|
|
93
95
|
placeholder: "Bir tak\u0131m, oyuncu veya ma\xE7 hakk\u0131nda sor\u2026",
|
|
94
96
|
closeChat: "Sohbeti kapat",
|
|
97
|
+
newConversation: "Yeni sohbet",
|
|
98
|
+
moreOptions: "Di\u011Fer se\xE7enekler",
|
|
95
99
|
chatDialogLabel: "SensibleStats sohbet",
|
|
96
100
|
stopResponse: "Yan\u0131t\u0131 durdur",
|
|
97
101
|
sendMessage: "Mesaj g\xF6nder",
|
|
@@ -187,6 +191,8 @@ function normalizeUi(cfg) {
|
|
|
187
191
|
starters: cfg.starters ?? [],
|
|
188
192
|
injectStyles: cfg.injectStyles ?? true,
|
|
189
193
|
closeChat: strings.closeChat,
|
|
194
|
+
newConversation: strings.newConversation,
|
|
195
|
+
moreOptions: strings.moreOptions,
|
|
190
196
|
chatDialogLabel: strings.chatDialogLabel,
|
|
191
197
|
stopResponse: strings.stopResponse,
|
|
192
198
|
sendMessage: strings.sendMessage,
|
|
@@ -605,7 +611,7 @@ function marketOddsRowToSlipSelection(vm, row, conversationId) {
|
|
|
605
611
|
// src/reducer.ts
|
|
606
612
|
var POPUP_MAX = 160;
|
|
607
613
|
function initialState(starters) {
|
|
608
|
-
return { isOpen: false, messages: [], isStreaming: false, status: null, actionsLoading: false, starters, error: null, lastUserInput: null, lastDisplayText: null, popupText: null, conversationId: null };
|
|
614
|
+
return { isOpen: false, messages: [], isStreaming: false, status: null, actionsLoading: false, starters, configuredStarters: starters, error: null, lastUserInput: null, lastDisplayText: null, popupText: null, conversationId: null };
|
|
609
615
|
}
|
|
610
616
|
function activeTurn(state) {
|
|
611
617
|
const last = state.messages[state.messages.length - 1];
|
|
@@ -685,6 +691,19 @@ function reducer(state, action) {
|
|
|
685
691
|
}
|
|
686
692
|
case "DISMISS_POPUP":
|
|
687
693
|
return { ...state, popupText: null };
|
|
694
|
+
case "RESET":
|
|
695
|
+
return { ...initialState(state.configuredStarters), isOpen: state.isOpen };
|
|
696
|
+
case "RESTORE":
|
|
697
|
+
return {
|
|
698
|
+
...state,
|
|
699
|
+
messages: action.messages,
|
|
700
|
+
conversationId: action.conversationId,
|
|
701
|
+
isStreaming: false,
|
|
702
|
+
status: null,
|
|
703
|
+
actionsLoading: false,
|
|
704
|
+
starters: action.messages.length ? [] : state.configuredStarters,
|
|
705
|
+
error: null
|
|
706
|
+
};
|
|
688
707
|
case "EVENT":
|
|
689
708
|
return applyEvent(state, action.event);
|
|
690
709
|
case "STREAM_ERROR":
|
|
@@ -804,17 +823,82 @@ function useLiveDashboardPoll({ messages, dispatch, getLiveDashboard }) {
|
|
|
804
823
|
}, [anchorKey, messages, forceUpdate]);
|
|
805
824
|
}
|
|
806
825
|
|
|
826
|
+
// src/conversationStore.ts
|
|
827
|
+
var TTL_MS = 36e5;
|
|
828
|
+
var MAX_MESSAGES = 30;
|
|
829
|
+
function readConversation(storageKey, now) {
|
|
830
|
+
let raw;
|
|
831
|
+
try {
|
|
832
|
+
raw = window.localStorage.getItem(storageKey);
|
|
833
|
+
} catch {
|
|
834
|
+
return null;
|
|
835
|
+
}
|
|
836
|
+
if (!raw) return null;
|
|
837
|
+
let parsed;
|
|
838
|
+
try {
|
|
839
|
+
parsed = JSON.parse(raw);
|
|
840
|
+
} catch {
|
|
841
|
+
return "corrupt";
|
|
842
|
+
}
|
|
843
|
+
if (parsed?.v !== 1 || !Array.isArray(parsed.messages) || typeof parsed.updatedAt !== "number") return "corrupt";
|
|
844
|
+
if (now - parsed.updatedAt > TTL_MS) return "expired";
|
|
845
|
+
return { conversationId: parsed.conversationId ?? null, messages: parsed.messages };
|
|
846
|
+
}
|
|
847
|
+
function writeConversation(storageKey, conversationId, messages, now) {
|
|
848
|
+
let capped = messages.slice(-MAX_MESSAGES);
|
|
849
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
850
|
+
try {
|
|
851
|
+
window.localStorage.setItem(storageKey, JSON.stringify({ v: 1, updatedAt: now, conversationId, messages: capped }));
|
|
852
|
+
return;
|
|
853
|
+
} catch {
|
|
854
|
+
if (capped.length <= 1) return;
|
|
855
|
+
capped = capped.slice(Math.ceil(capped.length / 2));
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
function clearConversation(storageKey) {
|
|
860
|
+
try {
|
|
861
|
+
window.localStorage.removeItem(storageKey);
|
|
862
|
+
} catch {
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
|
|
807
866
|
// src/useChatStream.ts
|
|
867
|
+
function hasAnswerContent(t) {
|
|
868
|
+
return !!t.text || t.cards.length > 0 || t.insights.length > 0 || t.marketOdds.length > 0 || t.oddsMovement.length > 0 || !!t.greetingDashboard || !!t.clubFanDashboard;
|
|
869
|
+
}
|
|
808
870
|
var STREAM_FALLBACK_TIMEOUT_MS = 3e4;
|
|
809
|
-
function
|
|
810
|
-
|
|
811
|
-
const
|
|
812
|
-
|
|
871
|
+
function seedIdCounter(messages) {
|
|
872
|
+
let max = -1;
|
|
873
|
+
for (const m of messages) {
|
|
874
|
+
const n = Number(m.id.slice(1));
|
|
875
|
+
if (m.id[0] === "m" && Number.isFinite(n) && n > max) max = n;
|
|
876
|
+
}
|
|
877
|
+
return max + 1;
|
|
878
|
+
}
|
|
879
|
+
function useChatStream(conversation, starterTexts, greetingMessage, storageKey) {
|
|
880
|
+
const boot = useMemo(() => {
|
|
881
|
+
const payload = storageKey ? readConversation(storageKey, Date.now()) : null;
|
|
882
|
+
const restored = payload != null && payload !== "expired" && payload !== "corrupt";
|
|
883
|
+
const base = initialState(starterTexts.map(chipFromText));
|
|
884
|
+
if (restored) {
|
|
885
|
+
return { state: { ...base, messages: payload.messages, conversationId: payload.conversationId, starters: [] }, restored: true, stale: false };
|
|
886
|
+
}
|
|
887
|
+
return { state: base, restored: false, stale: payload === "expired" || payload === "corrupt" };
|
|
888
|
+
}, []);
|
|
889
|
+
const [state, dispatch] = useReducer2(reducer, boot.state);
|
|
890
|
+
const idRef = useRef2(seedIdCounter(boot.state.messages));
|
|
813
891
|
const handleRef = useRef2(null);
|
|
814
892
|
const fallbackTimerRef = useRef2(null);
|
|
815
893
|
const stateRef = useRef2(state);
|
|
816
894
|
stateRef.current = state;
|
|
817
|
-
const greetedRef = useRef2(
|
|
895
|
+
const greetedRef = useRef2(boot.restored);
|
|
896
|
+
const hydratedRef = useRef2(false);
|
|
897
|
+
const restoreSeededRef = useRef2(false);
|
|
898
|
+
if (!restoreSeededRef.current) {
|
|
899
|
+
restoreSeededRef.current = true;
|
|
900
|
+
if (boot.restored && boot.state.conversationId) conversation.conversationId = boot.state.conversationId;
|
|
901
|
+
}
|
|
818
902
|
const nextId = () => `m${idRef.current++}`;
|
|
819
903
|
const clearFallbackTimer = useCallback(() => {
|
|
820
904
|
if (fallbackTimerRef.current != null) {
|
|
@@ -870,10 +954,9 @@ function useChatStream(conversation, starterTexts, greetingMessage) {
|
|
|
870
954
|
const last = stateRef.current.lastUserInput;
|
|
871
955
|
if (last) run(last, stateRef.current.lastDisplayText ?? void 0);
|
|
872
956
|
}, [run]);
|
|
873
|
-
|
|
957
|
+
const fireGreeting = useCallback(() => {
|
|
874
958
|
const message = greetingMessage?.trim();
|
|
875
|
-
if (!message
|
|
876
|
-
greetedRef.current = true;
|
|
959
|
+
if (!message) return;
|
|
877
960
|
try {
|
|
878
961
|
handleRef.current?.cancel();
|
|
879
962
|
clearFallbackTimer();
|
|
@@ -886,6 +969,55 @@ function useChatStream(conversation, starterTexts, greetingMessage) {
|
|
|
886
969
|
dispatch({ kind: "STOP" });
|
|
887
970
|
}
|
|
888
971
|
}, [greetingMessage, conversation, consume, clearFallbackTimer, armFallbackTimer]);
|
|
972
|
+
useEffect2(() => {
|
|
973
|
+
if (greetedRef.current) return;
|
|
974
|
+
greetedRef.current = true;
|
|
975
|
+
fireGreeting();
|
|
976
|
+
}, [fireGreeting]);
|
|
977
|
+
useEffect2(() => {
|
|
978
|
+
if (boot.stale && storageKey) clearConversation(storageKey);
|
|
979
|
+
}, []);
|
|
980
|
+
useEffect2(() => {
|
|
981
|
+
if (!storageKey || state.isStreaming) return;
|
|
982
|
+
if (hydratedRef.current) {
|
|
983
|
+
hydratedRef.current = false;
|
|
984
|
+
return;
|
|
985
|
+
}
|
|
986
|
+
const msgs = state.messages;
|
|
987
|
+
const persistable = msgs.filter((m, i) => {
|
|
988
|
+
if (m.role === "user") {
|
|
989
|
+
const next = msgs[i + 1];
|
|
990
|
+
return !!next && next.role === "assistant" && next.done && !next.isGreeting && hasAnswerContent(next);
|
|
991
|
+
}
|
|
992
|
+
return m.done && !m.isGreeting && hasAnswerContent(m);
|
|
993
|
+
});
|
|
994
|
+
if (persistable.length === 0) return;
|
|
995
|
+
writeConversation(storageKey, state.conversationId, persistable, Date.now());
|
|
996
|
+
}, [storageKey, state.isStreaming, state.messages, state.conversationId]);
|
|
997
|
+
useEffect2(() => {
|
|
998
|
+
if (!storageKey) return;
|
|
999
|
+
const onStorage = (e) => {
|
|
1000
|
+
if (e.key !== storageKey || e.storageArea !== window.localStorage) return;
|
|
1001
|
+
if (stateRef.current.isStreaming) return;
|
|
1002
|
+
if (e.newValue == null) {
|
|
1003
|
+
idRef.current = 0;
|
|
1004
|
+
conversation.conversationId = void 0;
|
|
1005
|
+
hydratedRef.current = true;
|
|
1006
|
+
dispatch({ kind: "RESET" });
|
|
1007
|
+
greetedRef.current = true;
|
|
1008
|
+
fireGreeting();
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
1011
|
+
const parsed = readConversation(storageKey, Date.now());
|
|
1012
|
+
if (!parsed || parsed === "expired" || parsed === "corrupt") return;
|
|
1013
|
+
idRef.current = seedIdCounter(parsed.messages);
|
|
1014
|
+
conversation.conversationId = parsed.conversationId ?? void 0;
|
|
1015
|
+
hydratedRef.current = true;
|
|
1016
|
+
dispatch({ kind: "RESTORE", messages: parsed.messages, conversationId: parsed.conversationId });
|
|
1017
|
+
};
|
|
1018
|
+
window.addEventListener("storage", onStorage);
|
|
1019
|
+
return () => window.removeEventListener("storage", onStorage);
|
|
1020
|
+
}, [storageKey, conversation, fireGreeting]);
|
|
889
1021
|
const open = useCallback(() => dispatch({ kind: "OPEN" }), []);
|
|
890
1022
|
const close = useCallback(() => {
|
|
891
1023
|
handleRef.current?.cancel();
|
|
@@ -904,9 +1036,20 @@ function useChatStream(conversation, starterTexts, greetingMessage) {
|
|
|
904
1036
|
else open();
|
|
905
1037
|
}, [close, open]);
|
|
906
1038
|
const dismissPopup = useCallback(() => dispatch({ kind: "DISMISS_POPUP" }), []);
|
|
1039
|
+
const reset = useCallback(() => {
|
|
1040
|
+
handleRef.current?.cancel();
|
|
1041
|
+
handleRef.current = null;
|
|
1042
|
+
clearFallbackTimer();
|
|
1043
|
+
if (storageKey) clearConversation(storageKey);
|
|
1044
|
+
idRef.current = 0;
|
|
1045
|
+
conversation.conversationId = void 0;
|
|
1046
|
+
dispatch({ kind: "RESET" });
|
|
1047
|
+
greetedRef.current = true;
|
|
1048
|
+
fireGreeting();
|
|
1049
|
+
}, [storageKey, conversation, clearFallbackTimer, fireGreeting]);
|
|
907
1050
|
const getLiveDashboard = useCallback(() => conversation.getLiveDashboard(), [conversation]);
|
|
908
1051
|
useLiveDashboardPoll({ messages: state.messages, dispatch, getLiveDashboard });
|
|
909
|
-
return { state, open, close, stop, toggle, send, retry, dismissPopup };
|
|
1052
|
+
return { state, open, close, stop, toggle, send, retry, dismissPopup, reset };
|
|
910
1053
|
}
|
|
911
1054
|
|
|
912
1055
|
// src/useLiveMonitor.ts
|
|
@@ -1238,7 +1381,7 @@ import { useState as useState2 } from "react";
|
|
|
1238
1381
|
var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
|
|
1239
1382
|
|
|
1240
1383
|
// src/components/Icons.tsx
|
|
1241
|
-
import { jsx } from "react/jsx-runtime";
|
|
1384
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
1242
1385
|
function SsMark({ className }) {
|
|
1243
1386
|
return /* @__PURE__ */ jsx("img", { className, src: SS_LOGO_DATA_URI, alt: "", "aria-hidden": "true" });
|
|
1244
1387
|
}
|
|
@@ -1251,6 +1394,16 @@ function CloseIcon() {
|
|
|
1251
1394
|
function ChevronIcon() {
|
|
1252
1395
|
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) });
|
|
1253
1396
|
}
|
|
1397
|
+
function NewChatIcon() {
|
|
1398
|
+
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { fill: "none", d: "M12 5v14M5 12h14", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) });
|
|
1399
|
+
}
|
|
1400
|
+
function KebabIcon() {
|
|
1401
|
+
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ jsxs("g", { fill: "currentColor", children: [
|
|
1402
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "5", r: "1.6" }),
|
|
1403
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "1.6" }),
|
|
1404
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "19", r: "1.6" })
|
|
1405
|
+
] }) });
|
|
1406
|
+
}
|
|
1254
1407
|
var DASHBOARD_EMOJI = {
|
|
1255
1408
|
football: "\u26BD",
|
|
1256
1409
|
"goal-net": "\u{1F945}",
|
|
@@ -1280,11 +1433,11 @@ function BrandMark({ logoUrl, className }) {
|
|
|
1280
1433
|
}
|
|
1281
1434
|
|
|
1282
1435
|
// src/components/GreetingBubble.tsx
|
|
1283
|
-
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
|
|
1436
|
+
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
1284
1437
|
function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss" }) {
|
|
1285
|
-
return /* @__PURE__ */
|
|
1286
|
-
/* @__PURE__ */
|
|
1287
|
-
/* @__PURE__ */
|
|
1438
|
+
return /* @__PURE__ */ jsxs2("div", { className: "ss-w-greeting", role: "note", children: [
|
|
1439
|
+
/* @__PURE__ */ jsxs2("button", { type: "button", className: "ss-w-greeting-body", onClick: onOpen, children: [
|
|
1440
|
+
/* @__PURE__ */ jsxs2("span", { className: "ss-w-greeting-dots", "aria-hidden": "true", children: [
|
|
1288
1441
|
/* @__PURE__ */ jsx3("i", {}),
|
|
1289
1442
|
/* @__PURE__ */ jsx3("i", {}),
|
|
1290
1443
|
/* @__PURE__ */ jsx3("i", {})
|
|
@@ -1296,7 +1449,7 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss" }) {
|
|
|
1296
1449
|
}
|
|
1297
1450
|
|
|
1298
1451
|
// src/components/ChatFab.tsx
|
|
1299
|
-
import { jsx as jsx4, jsxs as
|
|
1452
|
+
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
1300
1453
|
function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart }) {
|
|
1301
1454
|
const bubble = popupText ?? greeting;
|
|
1302
1455
|
const [intro, setIntro] = useState3(false);
|
|
@@ -1308,27 +1461,96 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
|
|
|
1308
1461
|
onIntroStart?.();
|
|
1309
1462
|
}
|
|
1310
1463
|
}, [bubble, onIntroStart]);
|
|
1311
|
-
return /* @__PURE__ */
|
|
1464
|
+
return /* @__PURE__ */ jsxs3("div", { className: intro ? "ss-w-fab-wrap ss-w-intro" : "ss-w-fab-wrap", children: [
|
|
1312
1465
|
bubble ? /* @__PURE__ */ jsx4(GreetingBubble, { text: bubble, onOpen, onDismiss: popupText ? onDismissPopup : void 0, dismissLabel }) : null,
|
|
1313
1466
|
/* @__PURE__ */ jsx4("button", { type: "button", className: "ss-w-fab", "aria-label": label, onClick: onOpen, children: /* @__PURE__ */ jsx4(BrandMark, { logoUrl, className: "ss-w-fab-mark" }) })
|
|
1314
1467
|
] });
|
|
1315
1468
|
}
|
|
1316
1469
|
|
|
1317
1470
|
// src/components/ChatPanel.tsx
|
|
1318
|
-
import { useEffect as
|
|
1471
|
+
import { useEffect as useEffect10, useState as useState18 } from "react";
|
|
1319
1472
|
|
|
1320
1473
|
// src/components/ChatHeader.tsx
|
|
1321
|
-
import {
|
|
1322
|
-
|
|
1323
|
-
|
|
1474
|
+
import { useEffect as useEffect5, useRef as useRef5, useState as useState4 } from "react";
|
|
1475
|
+
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
1476
|
+
function ChatHeader({
|
|
1477
|
+
onClose,
|
|
1478
|
+
closeLabel = "Close chat",
|
|
1479
|
+
logoUrl,
|
|
1480
|
+
headerTitle,
|
|
1481
|
+
onNewConversation,
|
|
1482
|
+
canReset,
|
|
1483
|
+
newConversationLabel = "New conversation",
|
|
1484
|
+
moreOptionsLabel = "More options"
|
|
1485
|
+
}) {
|
|
1486
|
+
const [menuOpen, setMenuOpen] = useState4(false);
|
|
1487
|
+
const wrapRef = useRef5(null);
|
|
1488
|
+
const kebabRef = useRef5(null);
|
|
1489
|
+
const firstItemRef = useRef5(null);
|
|
1490
|
+
const hasMenu = !!(canReset && onNewConversation);
|
|
1491
|
+
useEffect5(() => {
|
|
1492
|
+
if (menuOpen) firstItemRef.current?.focus();
|
|
1493
|
+
}, [menuOpen]);
|
|
1494
|
+
useEffect5(() => {
|
|
1495
|
+
if (!menuOpen) return;
|
|
1496
|
+
const onPointer = (e) => {
|
|
1497
|
+
if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
|
|
1498
|
+
};
|
|
1499
|
+
const onKey = (e) => {
|
|
1500
|
+
if (e.key === "Escape") {
|
|
1501
|
+
setMenuOpen(false);
|
|
1502
|
+
kebabRef.current?.focus();
|
|
1503
|
+
}
|
|
1504
|
+
};
|
|
1505
|
+
document.addEventListener("mousedown", onPointer);
|
|
1506
|
+
document.addEventListener("keydown", onKey);
|
|
1507
|
+
return () => {
|
|
1508
|
+
document.removeEventListener("mousedown", onPointer);
|
|
1509
|
+
document.removeEventListener("keydown", onKey);
|
|
1510
|
+
};
|
|
1511
|
+
}, [menuOpen]);
|
|
1512
|
+
const runNewConversation = () => {
|
|
1513
|
+
setMenuOpen(false);
|
|
1514
|
+
onNewConversation?.();
|
|
1515
|
+
};
|
|
1516
|
+
return /* @__PURE__ */ jsxs4("header", { className: "ss-w-header", children: [
|
|
1324
1517
|
/* @__PURE__ */ jsx5(BrandMark, { logoUrl, className: "ss-w-header-mark" }),
|
|
1325
1518
|
/* @__PURE__ */ jsx5("span", { className: "ss-w-header-title", children: headerTitle ?? "SensibleStats" }),
|
|
1519
|
+
hasMenu ? /* @__PURE__ */ jsxs4("div", { className: "ss-w-menu-wrap", ref: wrapRef, children: [
|
|
1520
|
+
/* @__PURE__ */ jsx5(
|
|
1521
|
+
"button",
|
|
1522
|
+
{
|
|
1523
|
+
type: "button",
|
|
1524
|
+
className: "ss-w-kebab",
|
|
1525
|
+
ref: kebabRef,
|
|
1526
|
+
"aria-haspopup": "menu",
|
|
1527
|
+
"aria-expanded": menuOpen,
|
|
1528
|
+
"aria-label": moreOptionsLabel,
|
|
1529
|
+
onClick: () => setMenuOpen((open) => !open),
|
|
1530
|
+
children: /* @__PURE__ */ jsx5(KebabIcon, {})
|
|
1531
|
+
}
|
|
1532
|
+
),
|
|
1533
|
+
menuOpen ? /* @__PURE__ */ jsx5("div", { className: "ss-w-menu", role: "menu", "aria-label": moreOptionsLabel, children: /* @__PURE__ */ jsxs4(
|
|
1534
|
+
"button",
|
|
1535
|
+
{
|
|
1536
|
+
type: "button",
|
|
1537
|
+
className: "ss-w-menu-item",
|
|
1538
|
+
role: "menuitem",
|
|
1539
|
+
ref: firstItemRef,
|
|
1540
|
+
onClick: runNewConversation,
|
|
1541
|
+
children: [
|
|
1542
|
+
/* @__PURE__ */ jsx5(NewChatIcon, {}),
|
|
1543
|
+
/* @__PURE__ */ jsx5("span", { children: newConversationLabel })
|
|
1544
|
+
]
|
|
1545
|
+
}
|
|
1546
|
+
) }) : null
|
|
1547
|
+
] }) : null,
|
|
1326
1548
|
/* @__PURE__ */ jsx5("button", { type: "button", className: "ss-w-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx5(CloseIcon, {}) })
|
|
1327
1549
|
] });
|
|
1328
1550
|
}
|
|
1329
1551
|
|
|
1330
1552
|
// src/components/MessageList.tsx
|
|
1331
|
-
import { useEffect as
|
|
1553
|
+
import { useEffect as useEffect9, useRef as useRef7 } from "react";
|
|
1332
1554
|
|
|
1333
1555
|
// src/components/Markdown.tsx
|
|
1334
1556
|
import ReactMarkdown from "react-markdown";
|
|
@@ -1346,8 +1568,8 @@ function Markdown({ text }) {
|
|
|
1346
1568
|
}
|
|
1347
1569
|
|
|
1348
1570
|
// src/components/EntityCardList.tsx
|
|
1349
|
-
import { useState as
|
|
1350
|
-
import { jsx as jsx7, jsxs as
|
|
1571
|
+
import { useState as useState5 } from "react";
|
|
1572
|
+
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1351
1573
|
var MAX_VISIBLE = 3;
|
|
1352
1574
|
var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
|
|
1353
1575
|
function initials(name) {
|
|
@@ -1368,7 +1590,7 @@ function Crest({ image, label }) {
|
|
|
1368
1590
|
}
|
|
1369
1591
|
function FormBar({ w, d, l }) {
|
|
1370
1592
|
if (w + d + l === 0) return null;
|
|
1371
|
-
return /* @__PURE__ */
|
|
1593
|
+
return /* @__PURE__ */ jsxs5("span", { className: "ss-w-form", "aria-hidden": "true", children: [
|
|
1372
1594
|
w > 0 ? /* @__PURE__ */ jsx7("span", { className: "ss-w-form-w", style: { flexGrow: w } }) : null,
|
|
1373
1595
|
d > 0 ? /* @__PURE__ */ jsx7("span", { className: "ss-w-form-d", style: { flexGrow: d } }) : null,
|
|
1374
1596
|
l > 0 ? /* @__PURE__ */ jsx7("span", { className: "ss-w-form-l", style: { flexGrow: l } }) : null
|
|
@@ -1377,12 +1599,12 @@ function FormBar({ w, d, l }) {
|
|
|
1377
1599
|
function StatCellView({ s }) {
|
|
1378
1600
|
const m = RECORD_RE.exec(s.value);
|
|
1379
1601
|
if (m) {
|
|
1380
|
-
return /* @__PURE__ */
|
|
1602
|
+
return /* @__PURE__ */ jsxs5("div", { className: "ss-w-ecard-cell", children: [
|
|
1381
1603
|
/* @__PURE__ */ jsx7("span", { className: "ss-w-ecard-cval", children: /* @__PURE__ */ jsx7(FormBar, { w: Number(m[1]), d: Number(m[2]), l: Number(m[3]) }) }),
|
|
1382
1604
|
/* @__PURE__ */ jsx7("span", { className: "ss-w-ecard-clabel", children: s.value })
|
|
1383
1605
|
] });
|
|
1384
1606
|
}
|
|
1385
|
-
return /* @__PURE__ */
|
|
1607
|
+
return /* @__PURE__ */ jsxs5("div", { className: "ss-w-ecard-cell", children: [
|
|
1386
1608
|
/* @__PURE__ */ jsx7("span", { className: "ss-w-ecard-cval", children: s.value }),
|
|
1387
1609
|
/* @__PURE__ */ jsx7("span", { className: "ss-w-ecard-clabel", children: s.label })
|
|
1388
1610
|
] });
|
|
@@ -1394,7 +1616,7 @@ function StatStrip({ stats }) {
|
|
|
1394
1616
|
}
|
|
1395
1617
|
function CardHeader({ c, showScopeCrest }) {
|
|
1396
1618
|
const onlyScope = c.scopes.length === 1 ? c.scopes[0] : null;
|
|
1397
|
-
return /* @__PURE__ */
|
|
1619
|
+
return /* @__PURE__ */ jsxs5("div", { className: "ss-w-ecard-hd", children: [
|
|
1398
1620
|
/* @__PURE__ */ jsx7(
|
|
1399
1621
|
"span",
|
|
1400
1622
|
{
|
|
@@ -1403,11 +1625,11 @@ function CardHeader({ c, showScopeCrest }) {
|
|
|
1403
1625
|
children: c.image ? "" : initials(c.name)
|
|
1404
1626
|
}
|
|
1405
1627
|
),
|
|
1406
|
-
/* @__PURE__ */
|
|
1628
|
+
/* @__PURE__ */ jsxs5("span", { className: "ss-w-ecard-idtext", children: [
|
|
1407
1629
|
/* @__PURE__ */ jsx7("span", { className: "ss-w-nm", children: c.name }),
|
|
1408
1630
|
c.sub ? /* @__PURE__ */ jsx7("span", { className: "ss-w-sub", children: c.sub }) : null
|
|
1409
1631
|
] }),
|
|
1410
|
-
/* @__PURE__ */
|
|
1632
|
+
/* @__PURE__ */ jsxs5("span", { className: "ss-w-ecard-meta", children: [
|
|
1411
1633
|
showScopeCrest && onlyScope?.image ? /* @__PURE__ */ jsx7(Crest, { image: onlyScope.image, label: onlyScope.label }) : null,
|
|
1412
1634
|
c.season ? /* @__PURE__ */ jsx7("span", { className: "ss-w-ecard-season", children: shortSeason(c.season) }) : null
|
|
1413
1635
|
] })
|
|
@@ -1430,43 +1652,43 @@ function ScopeTabs({ scopes, active, onSelect }) {
|
|
|
1430
1652
|
)) });
|
|
1431
1653
|
}
|
|
1432
1654
|
function EntityCardItem({ c }) {
|
|
1433
|
-
const [active, setActive] =
|
|
1655
|
+
const [active, setActive] = useState5(0);
|
|
1434
1656
|
const hasBody = c.scopes.length > 0;
|
|
1435
1657
|
if (!hasBody) {
|
|
1436
1658
|
return /* @__PURE__ */ jsx7("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ jsx7(CardHeader, { c, showScopeCrest: false }) });
|
|
1437
1659
|
}
|
|
1438
1660
|
const multi = c.scopes.length > 1;
|
|
1439
1661
|
const scope = c.scopes[multi ? c.scopes[active] ? active : 0 : 0];
|
|
1440
|
-
return /* @__PURE__ */
|
|
1662
|
+
return /* @__PURE__ */ jsxs5("div", { className: "ss-w-ecard", "data-kind": c.kind, children: [
|
|
1441
1663
|
/* @__PURE__ */ jsx7(CardHeader, { c, showScopeCrest: !multi }),
|
|
1442
1664
|
multi ? /* @__PURE__ */ jsx7(ScopeTabs, { scopes: c.scopes, active, onSelect: setActive }) : null,
|
|
1443
1665
|
/* @__PURE__ */ jsx7(StatStrip, { stats: scope.stats })
|
|
1444
1666
|
] });
|
|
1445
1667
|
}
|
|
1446
1668
|
function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
|
|
1447
|
-
const [expanded, setExpanded] =
|
|
1669
|
+
const [expanded, setExpanded] = useState5(false);
|
|
1448
1670
|
if (cards.length === 0) return null;
|
|
1449
1671
|
const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
|
|
1450
1672
|
const overflow = cards.length - MAX_VISIBLE;
|
|
1451
|
-
return /* @__PURE__ */
|
|
1673
|
+
return /* @__PURE__ */ jsxs5("div", { className: "ss-w-cards", children: [
|
|
1452
1674
|
visible.map((c) => /* @__PURE__ */ jsx7(EntityCardItem, { c }, c.id)),
|
|
1453
1675
|
overflow > 0 ? /* @__PURE__ */ jsx7("button", { type: "button", className: "ss-w-cards-more", disabled, onClick: () => setExpanded((v) => !v), children: expanded ? showLessLabel : showMoreLabel(overflow) }) : null
|
|
1454
1676
|
] });
|
|
1455
1677
|
}
|
|
1456
1678
|
|
|
1457
1679
|
// src/components/BettingInsightList.tsx
|
|
1458
|
-
import { useState as
|
|
1680
|
+
import { useState as useState9 } from "react";
|
|
1459
1681
|
|
|
1460
1682
|
// src/components/AddToSlipButton.tsx
|
|
1461
|
-
import { useCallback as useCallback3, useState as
|
|
1683
|
+
import { useCallback as useCallback3, useState as useState6 } from "react";
|
|
1462
1684
|
import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
|
|
1463
1685
|
|
|
1464
1686
|
// src/components/Toast.tsx
|
|
1465
|
-
import { useEffect as
|
|
1687
|
+
import { useEffect as useEffect6 } from "react";
|
|
1466
1688
|
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
1467
1689
|
var DISMISS_MS = 4e3;
|
|
1468
1690
|
function Toast({ toast, onDismiss }) {
|
|
1469
|
-
|
|
1691
|
+
useEffect6(() => {
|
|
1470
1692
|
if (!toast) return;
|
|
1471
1693
|
const timer = setTimeout(onDismiss, DISMISS_MS);
|
|
1472
1694
|
return () => clearTimeout(timer);
|
|
@@ -1476,7 +1698,7 @@ function Toast({ toast, onDismiss }) {
|
|
|
1476
1698
|
}
|
|
1477
1699
|
|
|
1478
1700
|
// src/components/AddToSlipButton.tsx
|
|
1479
|
-
import { jsx as jsx9, jsxs as
|
|
1701
|
+
import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1480
1702
|
function withTimeout(value) {
|
|
1481
1703
|
return Promise.race([
|
|
1482
1704
|
value,
|
|
@@ -1484,9 +1706,9 @@ function withTimeout(value) {
|
|
|
1484
1706
|
]);
|
|
1485
1707
|
}
|
|
1486
1708
|
function SlipButton({ selection, shownOdds, marketName, slip, ui }) {
|
|
1487
|
-
const [pending, setPending] =
|
|
1488
|
-
const [settled, setSettled] =
|
|
1489
|
-
const [toast, setToast] =
|
|
1709
|
+
const [pending, setPending] = useState6(false);
|
|
1710
|
+
const [settled, setSettled] = useState6(false);
|
|
1711
|
+
const [toast, setToast] = useState6(null);
|
|
1490
1712
|
const dismiss = useCallback3(() => setToast(null), []);
|
|
1491
1713
|
const handler = slip.onAddToSlip;
|
|
1492
1714
|
if (!ui || !handler || !selection) return null;
|
|
@@ -1510,7 +1732,7 @@ function SlipButton({ selection, shownOdds, marketName, slip, ui }) {
|
|
|
1510
1732
|
setPending(false);
|
|
1511
1733
|
}
|
|
1512
1734
|
};
|
|
1513
|
-
return /* @__PURE__ */
|
|
1735
|
+
return /* @__PURE__ */ jsxs6("div", { className: "ss-w-slip", children: [
|
|
1514
1736
|
/* @__PURE__ */ jsx9(
|
|
1515
1737
|
"button",
|
|
1516
1738
|
{
|
|
@@ -1530,7 +1752,7 @@ function AddToSlipButton({ it, slip, ui }) {
|
|
|
1530
1752
|
}
|
|
1531
1753
|
|
|
1532
1754
|
// src/components/OddsMovementBadge.tsx
|
|
1533
|
-
import { jsx as jsx10, jsxs as
|
|
1755
|
+
import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
1534
1756
|
function OddsMovementBadge({
|
|
1535
1757
|
previous,
|
|
1536
1758
|
current,
|
|
@@ -1543,7 +1765,7 @@ function OddsMovementBadge({
|
|
|
1543
1765
|
return (
|
|
1544
1766
|
// Strikethrough is invisible to screen readers, so the whole was/now/direction sentence rides
|
|
1545
1767
|
// on one aria-label and the visual glyphs are hidden from the accessibility tree.
|
|
1546
|
-
/* @__PURE__ */
|
|
1768
|
+
/* @__PURE__ */ jsxs7("span", { className: "ss-w-move", role: "img", "aria-label": label, children: [
|
|
1547
1769
|
/* @__PURE__ */ jsx10("span", { className: "ss-w-move-prev", "aria-hidden": "true", children: previous }),
|
|
1548
1770
|
/* @__PURE__ */ jsx10("span", { className: "ss-w-move-arrow", "aria-hidden": "true", children: direction === "shortened" ? "\u25BC" : "\u25B2" })
|
|
1549
1771
|
] })
|
|
@@ -1551,14 +1773,14 @@ function OddsMovementBadge({
|
|
|
1551
1773
|
}
|
|
1552
1774
|
|
|
1553
1775
|
// src/components/Crest.tsx
|
|
1554
|
-
import { useState as
|
|
1776
|
+
import { useState as useState7 } from "react";
|
|
1555
1777
|
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
1556
1778
|
function initials2(name) {
|
|
1557
1779
|
return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
|
|
1558
1780
|
}
|
|
1559
1781
|
function Crest2({ url, name, kind }) {
|
|
1560
1782
|
const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
|
|
1561
|
-
const [failed, setFailed] =
|
|
1783
|
+
const [failed, setFailed] = useState7(false);
|
|
1562
1784
|
if (url && !failed) {
|
|
1563
1785
|
return /* @__PURE__ */ jsx11("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
1564
1786
|
}
|
|
@@ -1566,15 +1788,15 @@ function Crest2({ url, name, kind }) {
|
|
|
1566
1788
|
}
|
|
1567
1789
|
|
|
1568
1790
|
// src/components/PinToggle.tsx
|
|
1569
|
-
import { useCallback as useCallback4, useState as
|
|
1570
|
-
import { jsx as jsx12, jsxs as
|
|
1791
|
+
import { useCallback as useCallback4, useState as useState8 } from "react";
|
|
1792
|
+
import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
1571
1793
|
var PIN_GLYPHS = {
|
|
1572
1794
|
pin: { viewBox: "0 0 24 24", strokeWidth: 1.4, transform: "scale(1.5)", d: "M9.5 1.5 14.5 6.5 13 8l-.5-.5-3 3 .3 2.2-1.4 1.4L5.6 11.3l-3.3 3.3-1-1 3.3-3.3L1.9 7.5l1.4-1.4 2.2.3 3-3L8 2.9z" },
|
|
1573
1795
|
star: { viewBox: "0 0 24 24", strokeWidth: 2, d: "M12 2.5l2.9 5.9 6.5.95-4.7 4.58 1.1 6.47L12 17.35 6.1 20.4l1.1-6.47L2.5 9.35l6.5-.95z" },
|
|
1574
1796
|
bookmark: { viewBox: "0 0 24 24", strokeWidth: 2, d: "M7 3h10a1.5 1.5 0 0 1 1.5 1.5V21l-6.5-3.6L5.5 21V4.5A1.5 1.5 0 0 1 7 3z" }
|
|
1575
1797
|
};
|
|
1576
1798
|
function PinToggle({ pin, monitor, ui }) {
|
|
1577
|
-
const [toast, setToast] =
|
|
1799
|
+
const [toast, setToast] = useState8(null);
|
|
1578
1800
|
const dismiss = useCallback4(() => setToast(null), []);
|
|
1579
1801
|
if (!monitor || !monitor.enabled) return null;
|
|
1580
1802
|
const key = pinKey(pin);
|
|
@@ -1589,7 +1811,7 @@ function PinToggle({ pin, monitor, ui }) {
|
|
|
1589
1811
|
}
|
|
1590
1812
|
};
|
|
1591
1813
|
const glyph = PIN_GLYPHS[ui.pinIcon];
|
|
1592
|
-
return /* @__PURE__ */
|
|
1814
|
+
return /* @__PURE__ */ jsxs8("div", { className: "ss-w-pin-wrap", children: [
|
|
1593
1815
|
/* @__PURE__ */ jsx12(
|
|
1594
1816
|
"button",
|
|
1595
1817
|
{
|
|
@@ -1619,17 +1841,17 @@ function PinToggle({ pin, monitor, ui }) {
|
|
|
1619
1841
|
}
|
|
1620
1842
|
|
|
1621
1843
|
// src/components/BettingInsightList.tsx
|
|
1622
|
-
import { Fragment, jsx as jsx13, jsxs as
|
|
1844
|
+
import { Fragment, jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1623
1845
|
function StatRows({ stats }) {
|
|
1624
|
-
return /* @__PURE__ */ jsx13("div", { className: "ss-w-bi-rows", children: stats.map((s) => /* @__PURE__ */
|
|
1846
|
+
return /* @__PURE__ */ jsx13("div", { className: "ss-w-bi-rows", children: stats.map((s) => /* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-row", children: [
|
|
1625
1847
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-row-lbl", children: s.label }),
|
|
1626
1848
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-row-num", children: s.value })
|
|
1627
1849
|
] }, `${s.label}:${s.value}`)) });
|
|
1628
1850
|
}
|
|
1629
1851
|
function ScopedStats({ scopes }) {
|
|
1630
|
-
const [active, setActive] =
|
|
1852
|
+
const [active, setActive] = useState9(0);
|
|
1631
1853
|
const current = scopes[active] ?? scopes[0] ?? { key: "", label: "", stats: [] };
|
|
1632
|
-
return /* @__PURE__ */
|
|
1854
|
+
return /* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-scoped", children: [
|
|
1633
1855
|
/* @__PURE__ */ jsx13("div", { className: "ss-w-bi-scopes", role: "group", children: scopes.map((s, i) => /* @__PURE__ */ jsx13("button", { type: "button", className: "ss-w-bi-chip", "aria-pressed": i === active, onClick: () => setActive(i), children: s.label }, s.key)) }),
|
|
1634
1856
|
/* @__PURE__ */ jsx13(StatRows, { stats: current.stats }, current.key)
|
|
1635
1857
|
] });
|
|
@@ -1638,15 +1860,15 @@ function hasStatsContent(it) {
|
|
|
1638
1860
|
return !!it.scopes && it.scopes.length >= 2 || it.stats.length > 0;
|
|
1639
1861
|
}
|
|
1640
1862
|
function ReasonStrip({ it, ui }) {
|
|
1641
|
-
const [open, setOpen] =
|
|
1863
|
+
const [open, setOpen] = useState9(false);
|
|
1642
1864
|
const hasScopes = !!it.scopes && it.scopes.length >= 2;
|
|
1643
1865
|
const hasStats = hasStatsContent(it);
|
|
1644
1866
|
const hasText = !!it.text;
|
|
1645
1867
|
if (!hasText && !hasStats) return null;
|
|
1646
1868
|
const expandable = hasStats || (it.text?.length ?? 0) > 90;
|
|
1647
|
-
return /* @__PURE__ */
|
|
1869
|
+
return /* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-reason", children: [
|
|
1648
1870
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-chart", "aria-hidden": "true" }),
|
|
1649
|
-
/* @__PURE__ */
|
|
1871
|
+
/* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-reason-body", children: [
|
|
1650
1872
|
hasText ? /* @__PURE__ */ jsx13("p", { className: `ss-w-bi-text${open ? "" : " ss-w-bi-text-clamp"}`, children: it.text }) : null,
|
|
1651
1873
|
open && hasStats ? hasScopes ? /* @__PURE__ */ jsx13(ScopedStats, { scopes: it.scopes }) : /* @__PURE__ */ jsx13(StatRows, { stats: it.stats }) : null
|
|
1652
1874
|
] }),
|
|
@@ -1665,7 +1887,7 @@ function ReasonStrip({ it, ui }) {
|
|
|
1665
1887
|
}
|
|
1666
1888
|
function CardFixture({ it }) {
|
|
1667
1889
|
if (it.homeTeamName && it.awayTeamName) {
|
|
1668
|
-
return /* @__PURE__ */
|
|
1890
|
+
return /* @__PURE__ */ jsxs9(Fragment, { children: [
|
|
1669
1891
|
/* @__PURE__ */ jsx13(Crest2, { kind: "team", url: it.homeCrest, name: it.homeTeamName }),
|
|
1670
1892
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-team", children: it.homeTeamName }),
|
|
1671
1893
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-vs", "aria-hidden": "true", children: "vs" }),
|
|
@@ -1675,7 +1897,7 @@ function CardFixture({ it }) {
|
|
|
1675
1897
|
}
|
|
1676
1898
|
if (it.fixture) return /* @__PURE__ */ jsx13("span", { className: "ss-w-bi-fixture-txt", children: it.fixture });
|
|
1677
1899
|
if (it.competition) {
|
|
1678
|
-
return /* @__PURE__ */
|
|
1900
|
+
return /* @__PURE__ */ jsxs9(Fragment, { children: [
|
|
1679
1901
|
/* @__PURE__ */ jsx13(Crest2, { kind: "comp", url: it.competitionCrest, name: it.competition }),
|
|
1680
1902
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-comp", children: it.competition })
|
|
1681
1903
|
] });
|
|
@@ -1690,16 +1912,16 @@ function InsightCard({ it, ui, slip, monitor }) {
|
|
|
1690
1912
|
const compInMeta = leftIsFixture && !!it.competition;
|
|
1691
1913
|
const showPin = !!monitor && it.pinEnabled;
|
|
1692
1914
|
const showHeader = leftIsFixture || !!it.competition || live || !!kickoff || showPin;
|
|
1693
|
-
return /* @__PURE__ */
|
|
1694
|
-
showHeader ? /* @__PURE__ */
|
|
1915
|
+
return /* @__PURE__ */ jsxs9("div", { className: "ss-w-binsight", children: [
|
|
1916
|
+
showHeader ? /* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-header", children: [
|
|
1695
1917
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-header-left", children: /* @__PURE__ */ jsx13(CardFixture, { it }) }),
|
|
1696
|
-
/* @__PURE__ */
|
|
1697
|
-
live ? /* @__PURE__ */
|
|
1918
|
+
/* @__PURE__ */ jsxs9("span", { className: "ss-w-bi-header-right", children: [
|
|
1919
|
+
live ? /* @__PURE__ */ jsxs9("span", { className: "ss-w-bi-live", children: [
|
|
1698
1920
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-live-dot", "aria-hidden": "true" }),
|
|
1699
1921
|
ui?.liveLabel ?? "Live"
|
|
1700
1922
|
] }) : null,
|
|
1701
1923
|
compInMeta ? /* @__PURE__ */ jsx13("span", { className: "ss-w-bi-comp-meta", title: it.competition, children: /* @__PURE__ */ jsx13(Crest2, { kind: "comp", url: it.competitionCrest, name: it.competition }) }) : null,
|
|
1702
|
-
kickoff ? /* @__PURE__ */
|
|
1924
|
+
kickoff ? /* @__PURE__ */ jsxs9("span", { className: "ss-w-bi-kick", children: [
|
|
1703
1925
|
kickoff.dayLabel,
|
|
1704
1926
|
" ",
|
|
1705
1927
|
kickoff.time
|
|
@@ -1707,15 +1929,15 @@ function InsightCard({ it, ui, slip, monitor }) {
|
|
|
1707
1929
|
showPin && ui ? /* @__PURE__ */ jsx13(PinToggle, { ui, monitor, pin: { kind: "match", matchId: it.matchId } }) : null
|
|
1708
1930
|
] })
|
|
1709
1931
|
] }) : null,
|
|
1710
|
-
/* @__PURE__ */
|
|
1711
|
-
/* @__PURE__ */
|
|
1932
|
+
/* @__PURE__ */ jsxs9("div", { className: "ss-w-bi-action-row", children: [
|
|
1933
|
+
/* @__PURE__ */ jsxs9("span", { className: "ss-w-bi-pick", children: [
|
|
1712
1934
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-market", children: it.market }),
|
|
1713
|
-
it.selection ? /* @__PURE__ */
|
|
1935
|
+
it.selection ? /* @__PURE__ */ jsxs9(Fragment, { children: [
|
|
1714
1936
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-pick-dot", "aria-hidden": "true", children: "\xB7" }),
|
|
1715
1937
|
/* @__PURE__ */ jsx13("span", { className: "ss-w-bi-sel", children: it.selection })
|
|
1716
1938
|
] }) : null
|
|
1717
1939
|
] }),
|
|
1718
|
-
it.odds ? /* @__PURE__ */
|
|
1940
|
+
it.odds ? /* @__PURE__ */ jsxs9("span", { className: "ss-w-bi-odds", children: [
|
|
1719
1941
|
/* @__PURE__ */ jsx13("b", { children: it.odds }),
|
|
1720
1942
|
/* @__PURE__ */ jsx13(OddsMovementBadge, { previous: it.previousOdds, current: it.odds, direction: it.movementDirection, ui }),
|
|
1721
1943
|
it.bookmaker ? /* @__PURE__ */ jsx13("span", { className: "ss-w-bi-book", children: it.bookmaker }) : null
|
|
@@ -1748,16 +1970,16 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
|
|
|
1748
1970
|
}
|
|
1749
1971
|
|
|
1750
1972
|
// src/components/MarketOddsCardList.tsx
|
|
1751
|
-
import { useState as
|
|
1752
|
-
import { Fragment as Fragment2, jsx as jsx14, jsxs as
|
|
1973
|
+
import { useState as useState10 } from "react";
|
|
1974
|
+
import { Fragment as Fragment2, jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1753
1975
|
function OddsRow({ vm, row, ui, slip, inSlipIds }) {
|
|
1754
1976
|
const selection = vm.addToSlipEnabled ? marketOddsRowToSlipSelection(vm, row, slip.conversationId) : null;
|
|
1755
1977
|
const inSlip = !!inSlipIds && row.matchOddsId != null && !!inSlipIds[row.matchOddsId];
|
|
1756
|
-
return /* @__PURE__ */
|
|
1978
|
+
return /* @__PURE__ */ jsxs10("div", { className: "ss-w-mo-row", children: [
|
|
1757
1979
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-mo-sel", children: row.selection }),
|
|
1758
1980
|
/* @__PURE__ */ jsx14(OddsMovementBadge, { previous: row.previousOdds, current: row.odds, direction: row.movementDirection, ui }),
|
|
1759
1981
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-mo-price", children: row.odds }),
|
|
1760
|
-
inSlip && ui ? /* @__PURE__ */
|
|
1982
|
+
inSlip && ui ? /* @__PURE__ */ jsxs10("span", { className: "ss-w-mon-inslip", children: [
|
|
1761
1983
|
"\u2713 ",
|
|
1762
1984
|
ui.inSlipLabel
|
|
1763
1985
|
] }) : null,
|
|
@@ -1765,24 +1987,24 @@ function OddsRow({ vm, row, ui, slip, inSlipIds }) {
|
|
|
1765
1987
|
] });
|
|
1766
1988
|
}
|
|
1767
1989
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
|
|
1768
|
-
const [open, setOpen] =
|
|
1990
|
+
const [open, setOpen] = useState10(false);
|
|
1769
1991
|
const kickoff = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
|
|
1770
1992
|
const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
|
|
1771
1993
|
const showPin = !!monitor && vm.pinEnabled;
|
|
1772
1994
|
const showHeader = !!vm.competition || vm.isLive || !!kickoff || showPin;
|
|
1773
|
-
return /* @__PURE__ */
|
|
1774
|
-
!hideHeader && /* @__PURE__ */
|
|
1775
|
-
showHeader ? /* @__PURE__ */
|
|
1776
|
-
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-header-left", children: vm.competition ? /* @__PURE__ */
|
|
1995
|
+
return /* @__PURE__ */ jsxs10("div", { className: hideHeader ? "ss-w-mocard ss-w-mocard--bare" : "ss-w-mocard", children: [
|
|
1996
|
+
!hideHeader && /* @__PURE__ */ jsxs10(Fragment2, { children: [
|
|
1997
|
+
showHeader ? /* @__PURE__ */ jsxs10("div", { className: "ss-w-bi-header", children: [
|
|
1998
|
+
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-header-left", children: vm.competition ? /* @__PURE__ */ jsxs10(Fragment2, { children: [
|
|
1777
1999
|
/* @__PURE__ */ jsx14(Crest2, { kind: "comp", url: vm.competitionCrest, name: vm.competition }),
|
|
1778
2000
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-comp", children: vm.competition })
|
|
1779
2001
|
] }) : null }),
|
|
1780
|
-
/* @__PURE__ */
|
|
1781
|
-
vm.isLive ? /* @__PURE__ */
|
|
2002
|
+
/* @__PURE__ */ jsxs10("span", { className: "ss-w-bi-header-right", children: [
|
|
2003
|
+
vm.isLive ? /* @__PURE__ */ jsxs10("span", { className: "ss-w-bi-live", children: [
|
|
1782
2004
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-live-dot", "aria-hidden": "true" }),
|
|
1783
2005
|
ui?.liveLabel ?? "Live"
|
|
1784
2006
|
] }) : null,
|
|
1785
|
-
kickoff ? /* @__PURE__ */
|
|
2007
|
+
kickoff ? /* @__PURE__ */ jsxs10("span", { className: "ss-w-bi-kick", children: [
|
|
1786
2008
|
kickoff.dayLabel,
|
|
1787
2009
|
" ",
|
|
1788
2010
|
kickoff.time
|
|
@@ -1797,8 +2019,8 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
1797
2019
|
) : null
|
|
1798
2020
|
] })
|
|
1799
2021
|
] }) : null,
|
|
1800
|
-
hasNamedTeams || vm.fixture || vm.market ? /* @__PURE__ */
|
|
1801
|
-
hasNamedTeams ? /* @__PURE__ */
|
|
2022
|
+
hasNamedTeams || vm.fixture || vm.market ? /* @__PURE__ */ jsxs10("div", { className: "ss-w-mo-sub", children: [
|
|
2023
|
+
hasNamedTeams ? /* @__PURE__ */ jsxs10("div", { className: "ss-w-bi-fixture", children: [
|
|
1802
2024
|
/* @__PURE__ */ jsx14(Crest2, { kind: "team", url: vm.homeCrest, name: vm.homeTeamName }),
|
|
1803
2025
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-team", children: vm.homeTeamName }),
|
|
1804
2026
|
/* @__PURE__ */ jsx14("span", { className: "ss-w-bi-vs", "aria-hidden": "true", children: "vs" }),
|
|
@@ -1808,11 +2030,11 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
1808
2030
|
vm.market ? /* @__PURE__ */ jsx14("span", { className: "ss-w-mo-market", children: vm.market }) : null
|
|
1809
2031
|
] }) : null
|
|
1810
2032
|
] }),
|
|
1811
|
-
/* @__PURE__ */
|
|
2033
|
+
/* @__PURE__ */ jsxs10("div", { className: "ss-w-mo-rows", children: [
|
|
1812
2034
|
vm.mainRows.map((row) => /* @__PURE__ */ jsx14(OddsRow, { vm, row, ui, slip, inSlipIds }, row.key)),
|
|
1813
2035
|
open ? vm.moreRows.map((row) => /* @__PURE__ */ jsx14(OddsRow, { vm, row, ui, slip, inSlipIds }, row.key)) : null
|
|
1814
2036
|
] }),
|
|
1815
|
-
vm.moreRows.length > 0 ? /* @__PURE__ */
|
|
2037
|
+
vm.moreRows.length > 0 ? /* @__PURE__ */ jsxs10("button", { type: "button", className: "ss-w-mo-more", "aria-expanded": open, onClick: () => setOpen((v) => !v), children: [
|
|
1816
2038
|
/* @__PURE__ */ jsx14("span", { children: open ? ui?.hideLines ?? "Hide lines" : `${ui?.moreLines ?? "More lines"} (${vm.moreRows.length})` }),
|
|
1817
2039
|
/* @__PURE__ */ jsx14("span", { className: `ss-w-mo-more-chev${open ? " ss-w-mo-more-chev-up" : ""}`, "aria-hidden": "true" })
|
|
1818
2040
|
] }) : null,
|
|
@@ -1826,7 +2048,7 @@ function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds, hideHeader, p
|
|
|
1826
2048
|
}
|
|
1827
2049
|
|
|
1828
2050
|
// src/components/OddsMovementCard.tsx
|
|
1829
|
-
import { Fragment as Fragment3, jsx as jsx15, jsxs as
|
|
2051
|
+
import { Fragment as Fragment3, jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1830
2052
|
function directionWord(vm, ui) {
|
|
1831
2053
|
if (vm.direction === "shortened") return ui?.oddsShortened ?? "shortened";
|
|
1832
2054
|
if (vm.direction === "drifted") return ui?.oddsDrifted ?? "drifted";
|
|
@@ -1837,8 +2059,8 @@ function OddsMovementCard({ vm, ui, monitor }) {
|
|
|
1837
2059
|
const drift = word ? `, ${word}` : "";
|
|
1838
2060
|
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}.`;
|
|
1839
2061
|
const showPin = !!monitor && vm.pinEnabled;
|
|
1840
|
-
return /* @__PURE__ */
|
|
1841
|
-
/* @__PURE__ */
|
|
2062
|
+
return /* @__PURE__ */ jsxs11("div", { className: "ss-w-omcard", children: [
|
|
2063
|
+
/* @__PURE__ */ jsxs11("div", { className: "ss-w-om-head", children: [
|
|
1842
2064
|
/* @__PURE__ */ jsx15("span", { className: "ss-w-om-market", children: vm.market }),
|
|
1843
2065
|
/* @__PURE__ */ jsx15("span", { className: "ss-w-om-tag", children: ui?.priceMovement ?? "Price movement" }),
|
|
1844
2066
|
showPin && ui ? /* @__PURE__ */ jsx15(
|
|
@@ -1858,13 +2080,13 @@ function OddsMovementCard({ vm, ui, monitor }) {
|
|
|
1858
2080
|
}
|
|
1859
2081
|
) : null
|
|
1860
2082
|
] }),
|
|
1861
|
-
vm.fixture ? /* @__PURE__ */
|
|
2083
|
+
vm.fixture ? /* @__PURE__ */ jsxs11("div", { className: "ss-w-om-fixture", children: [
|
|
1862
2084
|
/* @__PURE__ */ jsx15("span", { children: vm.fixture }),
|
|
1863
2085
|
vm.competition ? /* @__PURE__ */ jsx15("span", { className: "ss-w-om-comp", children: vm.competition }) : null
|
|
1864
2086
|
] }) : null,
|
|
1865
2087
|
/* @__PURE__ */ jsx15("div", { className: "ss-w-om-sel", children: vm.selection }),
|
|
1866
2088
|
/* @__PURE__ */ jsx15(OddsMovementBadge, { previous: vm.opening, current: vm.current, direction: vm.direction, ui }),
|
|
1867
|
-
vm.geometry === null ? /* @__PURE__ */ jsx15("div", { className: "ss-w-om-empty", children: vm.observationCount === 1 ? ui?.singlePricePoint ?? "Only one price recorded so far for this selection." : ui?.notEnoughHistory ?? "No price history recorded yet for this selection." }) : /* @__PURE__ */
|
|
2089
|
+
vm.geometry === null ? /* @__PURE__ */ jsx15("div", { className: "ss-w-om-empty", children: vm.observationCount === 1 ? ui?.singlePricePoint ?? "Only one price recorded so far for this selection." : ui?.notEnoughHistory ?? "No price history recorded yet for this selection." }) : /* @__PURE__ */ jsxs11(
|
|
1868
2090
|
"svg",
|
|
1869
2091
|
{
|
|
1870
2092
|
className: "ss-w-om-chart",
|
|
@@ -1873,26 +2095,26 @@ function OddsMovementCard({ vm, ui, monitor }) {
|
|
|
1873
2095
|
role: "img",
|
|
1874
2096
|
"aria-label": aria,
|
|
1875
2097
|
children: [
|
|
1876
|
-
vm.geometry.gridlines.map((g) => /* @__PURE__ */
|
|
2098
|
+
vm.geometry.gridlines.map((g) => /* @__PURE__ */ jsxs11("g", { children: [
|
|
1877
2099
|
/* @__PURE__ */ jsx15("line", { className: "ss-w-om-grid", x1: 40, y1: g.y, x2: CHART_VIEW_W - 8, y2: g.y }),
|
|
1878
2100
|
/* @__PURE__ */ jsx15("text", { className: "ss-w-om-ylab", x: 34, y: g.y + 3, textAnchor: "end", children: g.price.toFixed(2) })
|
|
1879
2101
|
] }, g.price)),
|
|
1880
2102
|
/* @__PURE__ */ jsx15("path", { className: "ss-w-om-line", d: vm.geometry.path, fill: "none" }),
|
|
1881
2103
|
vm.geometry.markers.map((m, i) => /* @__PURE__ */ jsx15("circle", { className: "ss-w-om-dot", cx: m.x, cy: m.y, r: 2.5 }, i)),
|
|
1882
|
-
ui?.chartTimeLabel ? /* @__PURE__ */
|
|
2104
|
+
ui?.chartTimeLabel ? /* @__PURE__ */ jsxs11(Fragment3, { children: [
|
|
1883
2105
|
/* @__PURE__ */ jsx15("text", { className: "ss-w-om-xlab", x: 40, y: CHART_VIEW_H - 8, textAnchor: "start", children: ui.chartTimeLabel(vm.geometry.startMs) }),
|
|
1884
2106
|
/* @__PURE__ */ jsx15("text", { className: "ss-w-om-xlab", x: CHART_VIEW_W - 8, y: CHART_VIEW_H - 8, textAnchor: "end", children: ui.chartTimeLabel(vm.geometry.endMs) })
|
|
1885
2107
|
] }) : /* @__PURE__ */ jsx15("text", { className: "ss-w-om-xlab", x: 40, y: CHART_VIEW_H - 8, children: ui?.movementWindow ? ui.movementWindow(vm.windowHours) : `Last ${vm.windowHours}h` })
|
|
1886
2108
|
]
|
|
1887
2109
|
}
|
|
1888
2110
|
),
|
|
1889
|
-
/* @__PURE__ */
|
|
1890
|
-
/* @__PURE__ */
|
|
2111
|
+
/* @__PURE__ */ jsxs11("div", { className: "ss-w-om-foot", children: [
|
|
2112
|
+
/* @__PURE__ */ jsxs11("span", { children: [
|
|
1891
2113
|
ui?.openingLabel ?? "Opening",
|
|
1892
2114
|
" ",
|
|
1893
2115
|
/* @__PURE__ */ jsx15("b", { children: vm.opening })
|
|
1894
2116
|
] }),
|
|
1895
|
-
/* @__PURE__ */
|
|
2117
|
+
/* @__PURE__ */ jsxs11("span", { children: [
|
|
1896
2118
|
ui?.currentLabel ?? "Current",
|
|
1897
2119
|
" ",
|
|
1898
2120
|
/* @__PURE__ */ jsx15("b", { children: vm.current })
|
|
@@ -1910,12 +2132,12 @@ function OddsMovementCardList({ cards, ui, monitor }) {
|
|
|
1910
2132
|
}
|
|
1911
2133
|
|
|
1912
2134
|
// src/components/ActionButtons.tsx
|
|
1913
|
-
import { Fragment as Fragment4, jsx as jsx16, jsxs as
|
|
2135
|
+
import { Fragment as Fragment4, jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
1914
2136
|
function ActionButtons({ actions, loading, disabled, onAct }) {
|
|
1915
2137
|
if (actions.length === 0 && !loading) return null;
|
|
1916
|
-
return /* @__PURE__ */
|
|
2138
|
+
return /* @__PURE__ */ jsxs12("div", { className: "ss-w-actions", children: [
|
|
1917
2139
|
actions.map((a, i) => /* @__PURE__ */ jsx16("button", { type: "button", className: "ss-w-abtn", disabled, onClick: () => onAct(a), children: a.label }, `${a.label}-${i}`)),
|
|
1918
|
-
actions.length === 0 && loading ? /* @__PURE__ */
|
|
2140
|
+
actions.length === 0 && loading ? /* @__PURE__ */ jsxs12(Fragment4, { children: [
|
|
1919
2141
|
/* @__PURE__ */ jsx16("span", { className: "ss-w-abtn-shimmer" }),
|
|
1920
2142
|
/* @__PURE__ */ jsx16("span", { className: "ss-w-abtn-shimmer" })
|
|
1921
2143
|
] }) : null
|
|
@@ -1923,22 +2145,22 @@ function ActionButtons({ actions, loading, disabled, onAct }) {
|
|
|
1923
2145
|
}
|
|
1924
2146
|
|
|
1925
2147
|
// src/components/dashboard/DashboardTile.tsx
|
|
1926
|
-
import { jsx as jsx17, jsxs as
|
|
2148
|
+
import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
1927
2149
|
var MAX_CRESTS = 3;
|
|
1928
2150
|
function DashboardTile({ tile, onTap }) {
|
|
1929
2151
|
const spanClass = tile.span === "full" ? "ss-w-dash-tile--full" : "ss-w-dash-tile--half";
|
|
1930
2152
|
const crests = (tile.imageUrls ?? []).slice(0, MAX_CRESTS);
|
|
1931
2153
|
const hasMeta = Boolean(tile.badgeText) || crests.length > 0;
|
|
1932
|
-
return /* @__PURE__ */
|
|
2154
|
+
return /* @__PURE__ */ jsxs13("button", { type: "button", className: `ss-w-dash-tile ${spanClass}`, onClick: onTap, children: [
|
|
1933
2155
|
/* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-icon", children: /* @__PURE__ */ jsx17(DashboardIcon, { name: tile.icon }) }),
|
|
1934
|
-
/* @__PURE__ */
|
|
2156
|
+
/* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-tile-body", children: [
|
|
1935
2157
|
/* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-title", children: tile.title }),
|
|
1936
2158
|
tile.subtitle ? /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-subtitle", children: tile.subtitle }) : null,
|
|
1937
2159
|
hasMeta ? (
|
|
1938
2160
|
// Badge + crests sit on their own row, below the title, instead of sharing the
|
|
1939
2161
|
// icon/chevron row -- at the half-span tile's ~180px width a nowrap badge alone
|
|
1940
2162
|
// (~70px) left the title column at ~22px and forced character-by-character wrapping.
|
|
1941
|
-
/* @__PURE__ */
|
|
2163
|
+
/* @__PURE__ */ jsxs13("span", { className: "ss-w-dash-tile-meta", children: [
|
|
1942
2164
|
tile.badgeText ? /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-badge", children: tile.badgeText }) : null,
|
|
1943
2165
|
crests.length > 0 ? /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-crests", children: crests.map((url, i) => /* @__PURE__ */ jsx17("span", { className: "ss-w-dash-tile-crest", style: { backgroundImage: `url(${url})` }, "aria-hidden": "true" }, `${url}-${i}`)) }) : null
|
|
1944
2166
|
] })
|
|
@@ -1949,7 +2171,7 @@ function DashboardTile({ tile, onTap }) {
|
|
|
1949
2171
|
}
|
|
1950
2172
|
|
|
1951
2173
|
// src/components/dashboard/GreetingDashboard.tsx
|
|
1952
|
-
import { jsx as jsx18, jsxs as
|
|
2174
|
+
import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
1953
2175
|
var LAYOUT_CLASSES = {
|
|
1954
2176
|
market: "ss-w-dash--market",
|
|
1955
2177
|
goal: "ss-w-dash--goal",
|
|
@@ -1959,8 +2181,8 @@ function layoutClass(layout) {
|
|
|
1959
2181
|
return Object.prototype.hasOwnProperty.call(LAYOUT_CLASSES, layout) ? LAYOUT_CLASSES[layout] : LAYOUT_CLASSES.goal;
|
|
1960
2182
|
}
|
|
1961
2183
|
function GreetingDashboard({ dashboard, onTap }) {
|
|
1962
|
-
return /* @__PURE__ */
|
|
1963
|
-
/* @__PURE__ */
|
|
2184
|
+
return /* @__PURE__ */ jsxs14("div", { className: `ss-w-dash ${layoutClass(dashboard.layout)}`, children: [
|
|
2185
|
+
/* @__PURE__ */ jsxs14("div", { className: "ss-w-dash-head", children: [
|
|
1964
2186
|
/* @__PURE__ */ jsx18("span", { className: "ss-w-dash-title", children: dashboard.title }),
|
|
1965
2187
|
dashboard.subtitle ? /* @__PURE__ */ jsx18("span", { className: "ss-w-dash-subtitle", children: dashboard.subtitle }) : null
|
|
1966
2188
|
] }),
|
|
@@ -1970,7 +2192,7 @@ function GreetingDashboard({ dashboard, onTap }) {
|
|
|
1970
2192
|
}
|
|
1971
2193
|
|
|
1972
2194
|
// src/components/dashboard/FixtureCard.tsx
|
|
1973
|
-
import { Fragment as Fragment5, jsx as jsx19, jsxs as
|
|
2195
|
+
import { Fragment as Fragment5, jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
1974
2196
|
function teamFormResultClass(result) {
|
|
1975
2197
|
if (result === "W") return "ss-w-fandash-teamform-cell--win";
|
|
1976
2198
|
if (result === "L") return "ss-w-fandash-teamform-cell--loss";
|
|
@@ -1980,7 +2202,7 @@ function TeamFormCell({ m, subjectCrestUrl, subjectName }) {
|
|
|
1980
2202
|
const subjectCrest = /* @__PURE__ */ jsx19(Crest2, { url: subjectCrestUrl ?? void 0, name: subjectName, kind: "team" });
|
|
1981
2203
|
const opponentCrest = /* @__PURE__ */ jsx19(Crest2, { url: m.opponentCrestUrl ?? void 0, kind: "team" });
|
|
1982
2204
|
const score = m.teamIsHome ? `${m.teamScore} - ${m.oppScore}` : `${m.oppScore} - ${m.teamScore}`;
|
|
1983
|
-
return /* @__PURE__ */
|
|
2205
|
+
return /* @__PURE__ */ jsxs15("div", { className: `ss-w-fandash-teamform-cell ${teamFormResultClass(m.result)}`, children: [
|
|
1984
2206
|
m.teamIsHome ? subjectCrest : opponentCrest,
|
|
1985
2207
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-teamform-score", children: score }),
|
|
1986
2208
|
m.teamIsHome ? opponentCrest : subjectCrest
|
|
@@ -1996,59 +2218,59 @@ function teamFormRows(data) {
|
|
|
1996
2218
|
function FixtureCard({ card }) {
|
|
1997
2219
|
const { data } = card;
|
|
1998
2220
|
const h2h = data.h2H;
|
|
1999
|
-
return /* @__PURE__ */
|
|
2000
|
-
/* @__PURE__ */
|
|
2001
|
-
/* @__PURE__ */
|
|
2221
|
+
return /* @__PURE__ */ jsxs15(Fragment5, { children: [
|
|
2222
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-card ss-w-fandash-fixture", children: [
|
|
2223
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-eyebrow", children: [
|
|
2002
2224
|
card.title,
|
|
2003
2225
|
" \xB7 ",
|
|
2004
2226
|
data.competition
|
|
2005
2227
|
] }),
|
|
2006
|
-
/* @__PURE__ */
|
|
2007
|
-
/* @__PURE__ */
|
|
2228
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-fixture-teams", children: [
|
|
2229
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-fixture-team", children: [
|
|
2008
2230
|
/* @__PURE__ */ jsx19(Crest2, { url: data.homeCrestUrl ?? void 0, name: data.homeName, kind: "team" }),
|
|
2009
2231
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-fixture-name", children: data.homeName })
|
|
2010
2232
|
] }),
|
|
2011
2233
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-fixture-vs", children: "v" }),
|
|
2012
|
-
/* @__PURE__ */
|
|
2234
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-fixture-team ss-w-fandash-fixture-team--away", children: [
|
|
2013
2235
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-fixture-name", children: data.awayName }),
|
|
2014
2236
|
/* @__PURE__ */ jsx19(Crest2, { url: data.awayCrestUrl ?? void 0, name: data.awayName, kind: "team" })
|
|
2015
2237
|
] })
|
|
2016
2238
|
] }),
|
|
2017
|
-
/* @__PURE__ */
|
|
2239
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-fixture-meta", children: [
|
|
2018
2240
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-fixture-kickoff", children: data.kickoffLabel }),
|
|
2019
|
-
data.venue ? /* @__PURE__ */
|
|
2241
|
+
data.venue ? /* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-fixture-venue", children: [
|
|
2020
2242
|
" \xB7 ",
|
|
2021
2243
|
data.venue
|
|
2022
2244
|
] }) : null
|
|
2023
2245
|
] })
|
|
2024
2246
|
] }),
|
|
2025
|
-
/* @__PURE__ */
|
|
2247
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-card ss-w-fandash-lastfive", children: [
|
|
2026
2248
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-eyebrow", children: data.formLabel }),
|
|
2027
|
-
/* @__PURE__ */
|
|
2028
|
-
/* @__PURE__ */
|
|
2249
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-teamform-head", children: [
|
|
2250
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-teamform-head-team", children: [
|
|
2029
2251
|
/* @__PURE__ */ jsx19(Crest2, { url: data.homeCrestUrl ?? void 0, name: data.homeName, kind: "team" }),
|
|
2030
2252
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-teamform-head-name", children: data.homeName })
|
|
2031
2253
|
] }),
|
|
2032
|
-
/* @__PURE__ */
|
|
2254
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-teamform-head-team", children: [
|
|
2033
2255
|
/* @__PURE__ */ jsx19(Crest2, { url: data.awayCrestUrl ?? void 0, name: data.awayName, kind: "team" }),
|
|
2034
2256
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-teamform-head-name", children: data.awayName })
|
|
2035
2257
|
] })
|
|
2036
2258
|
] }),
|
|
2037
2259
|
/* @__PURE__ */ jsx19("div", { className: "ss-w-fandash-teamform-rows", children: teamFormRows(data) })
|
|
2038
2260
|
] }),
|
|
2039
|
-
h2h || data.fact ? /* @__PURE__ */
|
|
2040
|
-
h2h ? /* @__PURE__ */
|
|
2261
|
+
h2h || data.fact ? /* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-card ss-w-fandash-h2h", children: [
|
|
2262
|
+
h2h ? /* @__PURE__ */ jsxs15(Fragment5, { children: [
|
|
2041
2263
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-eyebrow", children: h2h.label }),
|
|
2042
|
-
/* @__PURE__ */
|
|
2043
|
-
/* @__PURE__ */
|
|
2264
|
+
/* @__PURE__ */ jsxs15("div", { className: "ss-w-fandash-split", children: [
|
|
2265
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-split-cell", children: [
|
|
2044
2266
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-value", children: h2h.wins }),
|
|
2045
2267
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-label", children: h2h.homeWinsLabel })
|
|
2046
2268
|
] }),
|
|
2047
|
-
/* @__PURE__ */
|
|
2269
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-split-cell", children: [
|
|
2048
2270
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-value", children: h2h.draws }),
|
|
2049
2271
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-label", children: h2h.drawsLabel })
|
|
2050
2272
|
] }),
|
|
2051
|
-
/* @__PURE__ */
|
|
2273
|
+
/* @__PURE__ */ jsxs15("span", { className: "ss-w-fandash-split-cell", children: [
|
|
2052
2274
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-value", children: h2h.losses }),
|
|
2053
2275
|
/* @__PURE__ */ jsx19("span", { className: "ss-w-fandash-split-label", children: h2h.awayWinsLabel })
|
|
2054
2276
|
] })
|
|
@@ -2060,8 +2282,8 @@ function FixtureCard({ card }) {
|
|
|
2060
2282
|
}
|
|
2061
2283
|
|
|
2062
2284
|
// src/components/dashboard/CountdownCard.tsx
|
|
2063
|
-
import { Fragment as Fragment6, useEffect as
|
|
2064
|
-
import { jsx as jsx20, jsxs as
|
|
2285
|
+
import { Fragment as Fragment6, useEffect as useEffect7, useState as useState11 } from "react";
|
|
2286
|
+
import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
2065
2287
|
var DAY_MS = 864e5;
|
|
2066
2288
|
function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
2067
2289
|
const totalSeconds = Math.floor((kickoffUnix * 1e3 - nowMs) / 1e3);
|
|
@@ -2079,22 +2301,22 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
|
2079
2301
|
function CountdownCard({ card }) {
|
|
2080
2302
|
const { data } = card;
|
|
2081
2303
|
const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
|
|
2082
|
-
const [nowMs, setNowMs] =
|
|
2083
|
-
const [reduced] =
|
|
2304
|
+
const [nowMs, setNowMs] = useState11(() => Date.now());
|
|
2305
|
+
const [reduced] = useState11(
|
|
2084
2306
|
() => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
|
2085
2307
|
);
|
|
2086
2308
|
const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
|
|
2087
|
-
|
|
2309
|
+
useEffect7(() => {
|
|
2088
2310
|
if (reduced) return;
|
|
2089
2311
|
const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
|
|
2090
2312
|
return () => window.clearInterval(id);
|
|
2091
2313
|
}, [reduced, withinDay]);
|
|
2092
2314
|
const segments = remainingSegments(data.kickoffUnix, nowMs, withinDay && !reduced);
|
|
2093
|
-
return /* @__PURE__ */ jsx20("div", { className: "ss-w-fandash-card ss-w-fandash-countdown", children: /* @__PURE__ */
|
|
2315
|
+
return /* @__PURE__ */ jsx20("div", { className: "ss-w-fandash-card ss-w-fandash-countdown", children: /* @__PURE__ */ jsxs16("div", { className: "ss-w-fandash-countdown-top", children: [
|
|
2094
2316
|
/* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-eyebrow", children: card.title ?? "Kick-off in" }),
|
|
2095
|
-
segments ? /* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */
|
|
2317
|
+
segments ? /* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ jsxs16(Fragment6, { children: [
|
|
2096
2318
|
i > 0 ? /* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-countdown-colon", children: ":" }) : null,
|
|
2097
|
-
/* @__PURE__ */
|
|
2319
|
+
/* @__PURE__ */ jsxs16("span", { className: "ss-w-fandash-countdown-seg", children: [
|
|
2098
2320
|
/* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-countdown-value", children: s.value }),
|
|
2099
2321
|
/* @__PURE__ */ jsx20("span", { className: "ss-w-fandash-countdown-unit", children: unitLabel[s.unit] })
|
|
2100
2322
|
] })
|
|
@@ -2103,11 +2325,11 @@ function CountdownCard({ card }) {
|
|
|
2103
2325
|
}
|
|
2104
2326
|
|
|
2105
2327
|
// src/components/dashboard/InjuriesCard.tsx
|
|
2106
|
-
import { useState as
|
|
2107
|
-
import { jsx as jsx21, jsxs as
|
|
2328
|
+
import { useState as useState12 } from "react";
|
|
2329
|
+
import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
2108
2330
|
var SHOWN = 3;
|
|
2109
2331
|
function ColHead({ name, crestUrl }) {
|
|
2110
|
-
return /* @__PURE__ */
|
|
2332
|
+
return /* @__PURE__ */ jsxs17("span", { className: "ss-w-fandash-injuries-col-head", children: [
|
|
2111
2333
|
/* @__PURE__ */ jsx21(Crest2, { url: crestUrl ?? void 0, name, kind: "team" }),
|
|
2112
2334
|
/* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injuries-col-head-name", children: name })
|
|
2113
2335
|
] });
|
|
@@ -2115,9 +2337,9 @@ function ColHead({ name, crestUrl }) {
|
|
|
2115
2337
|
function InjuryList({ rows, emptyLabel, limit }) {
|
|
2116
2338
|
if (rows.length === 0) return /* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injuries-empty", children: emptyLabel });
|
|
2117
2339
|
const shown = limit === void 0 ? rows : rows.slice(0, limit);
|
|
2118
|
-
return /* @__PURE__ */ jsx21("ul", { className: "ss-w-fandash-injury-list", children: shown.map((r, i) => /* @__PURE__ */
|
|
2340
|
+
return /* @__PURE__ */ jsx21("ul", { className: "ss-w-fandash-injury-list", children: shown.map((r, i) => /* @__PURE__ */ jsxs17("li", { className: "ss-w-fandash-injury-row", children: [
|
|
2119
2341
|
/* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injury-name", children: r.playerName }),
|
|
2120
|
-
/* @__PURE__ */
|
|
2342
|
+
/* @__PURE__ */ jsxs17("span", { className: "ss-w-fandash-injury-meta", children: [
|
|
2121
2343
|
/* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injury-status", children: r.status }),
|
|
2122
2344
|
r.injuryType ? /* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injury-type", children: r.injuryType }) : null,
|
|
2123
2345
|
r.expectedReturnLabel ? /* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-injury-return", children: r.expectedReturnLabel }) : null
|
|
@@ -2126,20 +2348,20 @@ function InjuryList({ rows, emptyLabel, limit }) {
|
|
|
2126
2348
|
}
|
|
2127
2349
|
function InjuriesCard({ card, ui }) {
|
|
2128
2350
|
const { data } = card;
|
|
2129
|
-
const [expanded, setExpanded] =
|
|
2351
|
+
const [expanded, setExpanded] = useState12(false);
|
|
2130
2352
|
const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
|
|
2131
2353
|
const limit = expanded ? void 0 : SHOWN;
|
|
2132
2354
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
2133
2355
|
const showLess = ui?.showLess ?? "Show less";
|
|
2134
|
-
return /* @__PURE__ */
|
|
2356
|
+
return /* @__PURE__ */ jsxs17("div", { className: "ss-w-fandash-card ss-w-fandash-injuries", children: [
|
|
2135
2357
|
card.title ? /* @__PURE__ */ jsx21("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2136
|
-
/* @__PURE__ */
|
|
2137
|
-
/* @__PURE__ */
|
|
2358
|
+
/* @__PURE__ */ jsxs17("div", { className: "ss-w-fandash-injuries-cols", children: [
|
|
2359
|
+
/* @__PURE__ */ jsxs17("div", { className: "ss-w-fandash-injuries-col", children: [
|
|
2138
2360
|
/* @__PURE__ */ jsx21(ColHead, { name: data.oursName, crestUrl: data.oursCrestUrl }),
|
|
2139
2361
|
/* @__PURE__ */ jsx21(InjuryList, { rows: data.ours, emptyLabel: data.emptyLabel, limit })
|
|
2140
2362
|
] }),
|
|
2141
2363
|
/* @__PURE__ */ jsx21("div", { className: "ss-w-fandash-injuries-divider" }),
|
|
2142
|
-
/* @__PURE__ */
|
|
2364
|
+
/* @__PURE__ */ jsxs17("div", { className: "ss-w-fandash-injuries-col", children: [
|
|
2143
2365
|
/* @__PURE__ */ jsx21(ColHead, { name: data.theirsName, crestUrl: data.theirsCrestUrl }),
|
|
2144
2366
|
/* @__PURE__ */ jsx21(InjuryList, { rows: data.theirs, emptyLabel: data.emptyLabel, limit })
|
|
2145
2367
|
] })
|
|
@@ -2158,29 +2380,29 @@ function InjuriesCard({ card, ui }) {
|
|
|
2158
2380
|
}
|
|
2159
2381
|
|
|
2160
2382
|
// src/components/dashboard/ReasonToBetCard.tsx
|
|
2161
|
-
import { jsx as jsx22, jsxs as
|
|
2383
|
+
import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
2162
2384
|
function ReasonToBetCard({ card }) {
|
|
2163
|
-
return /* @__PURE__ */
|
|
2385
|
+
return /* @__PURE__ */ jsxs18("div", { className: "ss-w-fandash-card ss-w-fandash-reasons", children: [
|
|
2164
2386
|
card.title ? /* @__PURE__ */ jsx22("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2165
2387
|
/* @__PURE__ */ jsx22("ul", { className: "ss-w-fandash-reason-list", children: card.data.angles.map((angle, i) => /* @__PURE__ */ jsx22("li", { className: "ss-w-fandash-reason-item", children: angle }, `${angle}-${i}`)) })
|
|
2166
2388
|
] });
|
|
2167
2389
|
}
|
|
2168
2390
|
|
|
2169
2391
|
// src/components/dashboard/WhereToWatchCard.tsx
|
|
2170
|
-
import { jsx as jsx23, jsxs as
|
|
2392
|
+
import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
2171
2393
|
function WhereToWatchCard({ card }) {
|
|
2172
|
-
return /* @__PURE__ */
|
|
2394
|
+
return /* @__PURE__ */ jsxs19("div", { className: "ss-w-fandash-card ss-w-fandash-watch", children: [
|
|
2173
2395
|
card.title ? /* @__PURE__ */ jsx23("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2174
2396
|
/* @__PURE__ */ jsx23("span", { className: "ss-w-fandash-stations", children: card.data.stations.map((station, i) => /* @__PURE__ */ jsx23("span", { className: "ss-w-fandash-station-chip", children: station }, `${station}-${i}`)) })
|
|
2175
2397
|
] });
|
|
2176
2398
|
}
|
|
2177
2399
|
|
|
2178
2400
|
// src/components/dashboard/CongestedWeekCard.tsx
|
|
2179
|
-
import { jsx as jsx24, jsxs as
|
|
2401
|
+
import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
2180
2402
|
function CongestedWeekCard({ card, onTap }) {
|
|
2181
|
-
return /* @__PURE__ */
|
|
2403
|
+
return /* @__PURE__ */ jsxs20("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-congested", onClick: () => onTap(card), children: [
|
|
2182
2404
|
card.title ? /* @__PURE__ */ jsx24("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2183
|
-
/* @__PURE__ */ jsx24("div", { className: "ss-w-fandash-congested-grid", children: card.data.entries.map((entry, i) => /* @__PURE__ */
|
|
2405
|
+
/* @__PURE__ */ jsx24("div", { className: "ss-w-fandash-congested-grid", children: card.data.entries.map((entry, i) => /* @__PURE__ */ jsxs20("span", { className: "ss-w-fandash-congested-cell", children: [
|
|
2184
2406
|
/* @__PURE__ */ jsx24("span", { className: "ss-w-fandash-congested-day", children: entry.dayLabel }),
|
|
2185
2407
|
/* @__PURE__ */ jsx24("span", { className: "ss-w-fandash-congested-opponent", children: entry.opponent }),
|
|
2186
2408
|
/* @__PURE__ */ jsx24("span", { className: "ss-w-fandash-congested-comp", children: entry.competition }),
|
|
@@ -2191,10 +2413,10 @@ function CongestedWeekCard({ card, onTap }) {
|
|
|
2191
2413
|
}
|
|
2192
2414
|
|
|
2193
2415
|
// src/components/dashboard/TransfersCard.tsx
|
|
2194
|
-
import { jsx as jsx25, jsxs as
|
|
2416
|
+
import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
2195
2417
|
function TransferList({ rows }) {
|
|
2196
2418
|
if (rows.length === 0) return /* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfers-empty", children: "None" });
|
|
2197
|
-
return /* @__PURE__ */ jsx25("ul", { className: "ss-w-fandash-transfer-list", children: rows.map((r, i) => /* @__PURE__ */
|
|
2419
|
+
return /* @__PURE__ */ jsx25("ul", { className: "ss-w-fandash-transfer-list", children: rows.map((r, i) => /* @__PURE__ */ jsxs21("li", { className: "ss-w-fandash-transfer-row", children: [
|
|
2198
2420
|
/* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfer-name", children: r.playerName }),
|
|
2199
2421
|
/* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfer-club", children: r.otherClub }),
|
|
2200
2422
|
r.type ? /* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfer-type", children: r.type }) : null
|
|
@@ -2202,14 +2424,14 @@ function TransferList({ rows }) {
|
|
|
2202
2424
|
}
|
|
2203
2425
|
function TransfersCard({ card }) {
|
|
2204
2426
|
const { data } = card;
|
|
2205
|
-
return /* @__PURE__ */
|
|
2427
|
+
return /* @__PURE__ */ jsxs21("div", { className: "ss-w-fandash-card ss-w-fandash-transfers", children: [
|
|
2206
2428
|
card.title ? /* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2207
|
-
/* @__PURE__ */
|
|
2208
|
-
/* @__PURE__ */
|
|
2429
|
+
/* @__PURE__ */ jsxs21("div", { className: "ss-w-fandash-transfers-cols", children: [
|
|
2430
|
+
/* @__PURE__ */ jsxs21("div", { className: "ss-w-fandash-transfers-col", children: [
|
|
2209
2431
|
/* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfers-col-head", children: "In" }),
|
|
2210
2432
|
/* @__PURE__ */ jsx25(TransferList, { rows: data.in })
|
|
2211
2433
|
] }),
|
|
2212
|
-
/* @__PURE__ */
|
|
2434
|
+
/* @__PURE__ */ jsxs21("div", { className: "ss-w-fandash-transfers-col", children: [
|
|
2213
2435
|
/* @__PURE__ */ jsx25("span", { className: "ss-w-fandash-transfers-col-head", children: "Out" }),
|
|
2214
2436
|
/* @__PURE__ */ jsx25(TransferList, { rows: data.out })
|
|
2215
2437
|
] })
|
|
@@ -2218,11 +2440,11 @@ function TransfersCard({ card }) {
|
|
|
2218
2440
|
}
|
|
2219
2441
|
|
|
2220
2442
|
// src/components/dashboard/LinksCard.tsx
|
|
2221
|
-
import { jsx as jsx26, jsxs as
|
|
2443
|
+
import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
2222
2444
|
function LinksCard({ card }) {
|
|
2223
|
-
return /* @__PURE__ */
|
|
2445
|
+
return /* @__PURE__ */ jsxs22("div", { className: "ss-w-fandash-card ss-w-fandash-links", children: [
|
|
2224
2446
|
card.title ? /* @__PURE__ */ jsx26("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2225
|
-
/* @__PURE__ */ jsx26("div", { className: "ss-w-fandash-link-grid", children: card.data.links.map((link, i) => /* @__PURE__ */
|
|
2447
|
+
/* @__PURE__ */ jsx26("div", { className: "ss-w-fandash-link-grid", children: card.data.links.map((link, i) => /* @__PURE__ */ jsxs22("a", { className: "ss-w-fandash-link-tile", href: link.url, target: "_blank", rel: "noopener noreferrer", children: [
|
|
2226
2448
|
/* @__PURE__ */ jsx26("span", { className: "ss-w-fandash-link-label", children: link.label }),
|
|
2227
2449
|
/* @__PURE__ */ jsx26("span", { className: "ss-w-fandash-link-chevron", children: /* @__PURE__ */ jsx26(ChevronIcon, {}) })
|
|
2228
2450
|
] }, `${link.url}-${i}`)) })
|
|
@@ -2230,8 +2452,8 @@ function LinksCard({ card }) {
|
|
|
2230
2452
|
}
|
|
2231
2453
|
|
|
2232
2454
|
// src/components/dashboard/PostMatchResultCard.tsx
|
|
2233
|
-
import { useState as
|
|
2234
|
-
import { jsx as jsx27, jsxs as
|
|
2455
|
+
import { useState as useState13 } from "react";
|
|
2456
|
+
import { jsx as jsx27, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
2235
2457
|
function initials3(name) {
|
|
2236
2458
|
return name.trim().slice(0, 3).toUpperCase();
|
|
2237
2459
|
}
|
|
@@ -2240,7 +2462,7 @@ function PostMatchCrest({
|
|
|
2240
2462
|
name,
|
|
2241
2463
|
side
|
|
2242
2464
|
}) {
|
|
2243
|
-
const [failed, setFailed] =
|
|
2465
|
+
const [failed, setFailed] = useState13(false);
|
|
2244
2466
|
const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
|
|
2245
2467
|
if (url && !failed) {
|
|
2246
2468
|
return /* @__PURE__ */ jsx27("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -2251,17 +2473,17 @@ function PostMatchResultCard({ card }) {
|
|
|
2251
2473
|
const { data } = card;
|
|
2252
2474
|
const homeWon = data.homeScore >= data.awayScore;
|
|
2253
2475
|
const awayWon = data.awayScore >= data.homeScore;
|
|
2254
|
-
return /* @__PURE__ */
|
|
2255
|
-
/* @__PURE__ */
|
|
2476
|
+
return /* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-card ss-w-fandash-postmatch-result", children: [
|
|
2477
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-top", children: [
|
|
2256
2478
|
card.title ? /* @__PURE__ */ jsx27("span", { className: "ss-w-fandash-postmatch-pill", children: card.title }) : null,
|
|
2257
2479
|
/* @__PURE__ */ jsx27("span", { className: `ss-w-fandash-postmatch-tag ss-w-fandash-postmatch-tag--${data.outcome}`, children: data.resultLabel })
|
|
2258
2480
|
] }),
|
|
2259
|
-
/* @__PURE__ */
|
|
2260
|
-
/* @__PURE__ */
|
|
2481
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-main", children: [
|
|
2482
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-side ss-w-fandash-postmatch-side--home", children: [
|
|
2261
2483
|
/* @__PURE__ */ jsx27(PostMatchCrest, { url: data.homeCrestUrl, name: data.homeName, side: "home" }),
|
|
2262
2484
|
/* @__PURE__ */ jsx27("span", { className: "ss-w-fandash-postmatch-team-name", children: data.homeName })
|
|
2263
2485
|
] }),
|
|
2264
|
-
/* @__PURE__ */
|
|
2486
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-score-main", children: [
|
|
2265
2487
|
/* @__PURE__ */ jsx27(
|
|
2266
2488
|
"span",
|
|
2267
2489
|
{
|
|
@@ -2278,12 +2500,12 @@ function PostMatchResultCard({ card }) {
|
|
|
2278
2500
|
}
|
|
2279
2501
|
)
|
|
2280
2502
|
] }),
|
|
2281
|
-
/* @__PURE__ */
|
|
2503
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-side ss-w-fandash-postmatch-side--away", children: [
|
|
2282
2504
|
/* @__PURE__ */ jsx27(PostMatchCrest, { url: data.awayCrestUrl, name: data.awayName, side: "away" }),
|
|
2283
2505
|
/* @__PURE__ */ jsx27("span", { className: "ss-w-fandash-postmatch-team-name", children: data.awayName })
|
|
2284
2506
|
] })
|
|
2285
2507
|
] }),
|
|
2286
|
-
/* @__PURE__ */
|
|
2508
|
+
/* @__PURE__ */ jsxs23("div", { className: "ss-w-fandash-postmatch-meta", children: [
|
|
2287
2509
|
data.kickoffLabel,
|
|
2288
2510
|
data.competition ? ` \xB7 ${data.competition}` : ""
|
|
2289
2511
|
] })
|
|
@@ -2291,11 +2513,11 @@ function PostMatchResultCard({ card }) {
|
|
|
2291
2513
|
}
|
|
2292
2514
|
|
|
2293
2515
|
// src/components/dashboard/PostMatchGoalsCard.tsx
|
|
2294
|
-
import { jsx as jsx28, jsxs as
|
|
2516
|
+
import { jsx as jsx28, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
2295
2517
|
function PostMatchGoalsCard({ card, onTap }) {
|
|
2296
|
-
return /* @__PURE__ */
|
|
2518
|
+
return /* @__PURE__ */ jsxs24("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-postmatch-goals", onClick: () => onTap(card), children: [
|
|
2297
2519
|
card.title ? /* @__PURE__ */ jsx28("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2298
|
-
/* @__PURE__ */ jsx28("ul", { className: "ss-w-fandash-postmatch-goal-list", children: card.data.goals.map((g, i) => /* @__PURE__ */
|
|
2520
|
+
/* @__PURE__ */ jsx28("ul", { className: "ss-w-fandash-postmatch-goal-list", children: card.data.goals.map((g, i) => /* @__PURE__ */ jsxs24("li", { className: g.scoredByClub ? "ss-w-fandash-postmatch-goal ss-w-fandash-postmatch-goal--club" : "ss-w-fandash-postmatch-goal", children: [
|
|
2299
2521
|
/* @__PURE__ */ jsx28("span", { className: "ss-w-fandash-postmatch-goal-ball" }),
|
|
2300
2522
|
/* @__PURE__ */ jsx28("span", { children: g.text })
|
|
2301
2523
|
] }, `${g.text}-${i}`)) }),
|
|
@@ -2304,7 +2526,7 @@ function PostMatchGoalsCard({ card, onTap }) {
|
|
|
2304
2526
|
}
|
|
2305
2527
|
|
|
2306
2528
|
// src/components/dashboard/PostMatchStatsCard.tsx
|
|
2307
|
-
import { jsx as jsx29, jsxs as
|
|
2529
|
+
import { jsx as jsx29, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
2308
2530
|
function splitWidths(homeNum, awayNum) {
|
|
2309
2531
|
const total = homeNum + awayNum;
|
|
2310
2532
|
if (total <= 0) return { home: "50%", away: "50%" };
|
|
@@ -2313,7 +2535,7 @@ function splitWidths(homeNum, awayNum) {
|
|
|
2313
2535
|
}
|
|
2314
2536
|
function PostMatchStatsCard({ card, onTap }) {
|
|
2315
2537
|
const { data } = card;
|
|
2316
|
-
return /* @__PURE__ */
|
|
2538
|
+
return /* @__PURE__ */ jsxs25("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-postmatch-stats", onClick: () => onTap(card), children: [
|
|
2317
2539
|
card.title ? /* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2318
2540
|
/* @__PURE__ */ jsx29("div", { className: "ss-w-fandash-postmatch-stat-rows", children: data.rows.map((r, i) => {
|
|
2319
2541
|
const leftValue = data.clubIsHome ? r.clubValue : r.oppValue;
|
|
@@ -2321,24 +2543,24 @@ function PostMatchStatsCard({ card, onTap }) {
|
|
|
2321
2543
|
const homeNum = data.clubIsHome ? r.clubNum : r.oppNum;
|
|
2322
2544
|
const awayNum = data.clubIsHome ? r.oppNum : r.clubNum;
|
|
2323
2545
|
const { home, away } = splitWidths(homeNum, awayNum);
|
|
2324
|
-
return /* @__PURE__ */
|
|
2325
|
-
/* @__PURE__ */
|
|
2546
|
+
return /* @__PURE__ */ jsxs25("div", { className: "ss-w-fandash-postmatch-stat", children: [
|
|
2547
|
+
/* @__PURE__ */ jsxs25("div", { className: "ss-w-fandash-postmatch-stat-row", children: [
|
|
2326
2548
|
/* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-postmatch-stat-value ss-w-fandash-postmatch-stat-value--home", children: leftValue }),
|
|
2327
2549
|
/* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-postmatch-stat-label", children: r.label }),
|
|
2328
2550
|
/* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-postmatch-stat-value ss-w-fandash-postmatch-stat-value--away", children: rightValue })
|
|
2329
2551
|
] }),
|
|
2330
|
-
/* @__PURE__ */
|
|
2552
|
+
/* @__PURE__ */ jsxs25("div", { className: "ss-w-fandash-postmatch-stat-bar", children: [
|
|
2331
2553
|
/* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-postmatch-stat-bar-home", style: { width: home } }),
|
|
2332
2554
|
/* @__PURE__ */ jsx29("span", { className: "ss-w-fandash-postmatch-stat-bar-away", style: { width: away } })
|
|
2333
2555
|
] })
|
|
2334
2556
|
] }, `${r.label}-${i}`);
|
|
2335
2557
|
}) }),
|
|
2336
|
-
data.rows.length > 0 ? /* @__PURE__ */
|
|
2337
|
-
/* @__PURE__ */
|
|
2558
|
+
data.rows.length > 0 ? /* @__PURE__ */ jsxs25("div", { className: "ss-w-fandash-postmatch-legend", children: [
|
|
2559
|
+
/* @__PURE__ */ jsxs25("span", { className: "ss-w-fandash-postmatch-legend-item", children: [
|
|
2338
2560
|
/* @__PURE__ */ jsx29("i", { className: "ss-w-fandash-postmatch-legend-swatch ss-w-fandash-postmatch-legend-swatch--home" }),
|
|
2339
2561
|
data.homeName
|
|
2340
2562
|
] }),
|
|
2341
|
-
/* @__PURE__ */
|
|
2563
|
+
/* @__PURE__ */ jsxs25("span", { className: "ss-w-fandash-postmatch-legend-item", children: [
|
|
2342
2564
|
/* @__PURE__ */ jsx29("i", { className: "ss-w-fandash-postmatch-legend-swatch ss-w-fandash-postmatch-legend-swatch--away" }),
|
|
2343
2565
|
data.awayName
|
|
2344
2566
|
] })
|
|
@@ -2348,7 +2570,7 @@ function PostMatchStatsCard({ card, onTap }) {
|
|
|
2348
2570
|
}
|
|
2349
2571
|
|
|
2350
2572
|
// src/components/dashboard/PostMatchTopPerformerCard.tsx
|
|
2351
|
-
import { jsx as jsx30, jsxs as
|
|
2573
|
+
import { jsx as jsx30, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
2352
2574
|
function initials4(playerName) {
|
|
2353
2575
|
const words = playerName.trim().split(/\s+/).filter(Boolean);
|
|
2354
2576
|
if (words.length === 0) return "?";
|
|
@@ -2358,9 +2580,9 @@ function initials4(playerName) {
|
|
|
2358
2580
|
}
|
|
2359
2581
|
function PostMatchTopPerformerCard({ card, onTap }) {
|
|
2360
2582
|
const { data } = card;
|
|
2361
|
-
return /* @__PURE__ */
|
|
2583
|
+
return /* @__PURE__ */ jsxs26("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-postmatch-performer", onClick: () => onTap(card), children: [
|
|
2362
2584
|
card.title ? /* @__PURE__ */ jsx30("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2363
|
-
/* @__PURE__ */
|
|
2585
|
+
/* @__PURE__ */ jsxs26("div", { className: "ss-w-fandash-postmatch-perf-row", children: [
|
|
2364
2586
|
/* @__PURE__ */ jsx30("span", { className: "ss-w-fandash-postmatch-perf-avatar", "aria-hidden": "true", children: initials4(data.playerName) }),
|
|
2365
2587
|
/* @__PURE__ */ jsx30("span", { className: "ss-w-fandash-postmatch-perf-name", children: data.playerName }),
|
|
2366
2588
|
/* @__PURE__ */ jsx30("span", { className: "ss-w-fandash-postmatch-perf-rating", children: data.ratingLabel })
|
|
@@ -2370,22 +2592,22 @@ function PostMatchTopPerformerCard({ card, onTap }) {
|
|
|
2370
2592
|
}
|
|
2371
2593
|
|
|
2372
2594
|
// src/components/dashboard/PostMatchNextCard.tsx
|
|
2373
|
-
import { jsx as jsx31, jsxs as
|
|
2595
|
+
import { jsx as jsx31, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
2374
2596
|
function PostMatchNextCard({ card }) {
|
|
2375
2597
|
const { data } = card;
|
|
2376
|
-
return /* @__PURE__ */
|
|
2598
|
+
return /* @__PURE__ */ jsxs27("div", { className: "ss-w-fandash-card ss-w-fandash-postmatch-next", children: [
|
|
2377
2599
|
card.title ? /* @__PURE__ */ jsx31("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2378
2600
|
/* @__PURE__ */ jsx31("div", { className: "ss-w-fandash-postmatch-next-row", children: /* @__PURE__ */ jsx31("span", { className: "ss-w-fandash-postmatch-next-when", children: data.whenLabel }) })
|
|
2379
2601
|
] });
|
|
2380
2602
|
}
|
|
2381
2603
|
|
|
2382
2604
|
// src/components/dashboard/RestingNextCard.tsx
|
|
2383
|
-
import { jsx as jsx32, jsxs as
|
|
2605
|
+
import { jsx as jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
2384
2606
|
function RestingNextCard({ card, onTap }) {
|
|
2385
2607
|
const { data } = card;
|
|
2386
|
-
return /* @__PURE__ */
|
|
2608
|
+
return /* @__PURE__ */ jsxs28("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-resting-next", onClick: () => onTap(card), children: [
|
|
2387
2609
|
card.title ? /* @__PURE__ */ jsx32("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2388
|
-
/* @__PURE__ */
|
|
2610
|
+
/* @__PURE__ */ jsxs28("div", { className: "ss-w-fandash-resting-next-row", children: [
|
|
2389
2611
|
/* @__PURE__ */ jsx32("span", { className: "ss-w-fandash-resting-next-when", children: data.whenLabel }),
|
|
2390
2612
|
data.competition ? /* @__PURE__ */ jsx32("span", { className: "ss-w-fandash-resting-next-competition", children: data.competition }) : null
|
|
2391
2613
|
] }),
|
|
@@ -2394,12 +2616,12 @@ function RestingNextCard({ card, onTap }) {
|
|
|
2394
2616
|
}
|
|
2395
2617
|
|
|
2396
2618
|
// src/components/dashboard/RestingStandingsCard.tsx
|
|
2397
|
-
import { jsx as jsx33, jsxs as
|
|
2619
|
+
import { jsx as jsx33, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
2398
2620
|
function RestingStandingsCard({ card, onTap }) {
|
|
2399
2621
|
const { data } = card;
|
|
2400
|
-
return /* @__PURE__ */
|
|
2622
|
+
return /* @__PURE__ */ jsxs29("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-resting-standings", onClick: () => onTap(card), children: [
|
|
2401
2623
|
card.title ? /* @__PURE__ */ jsx33("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2402
|
-
/* @__PURE__ */
|
|
2624
|
+
/* @__PURE__ */ jsxs29("div", { className: "ss-w-fandash-resting-standings-row", children: [
|
|
2403
2625
|
/* @__PURE__ */ jsx33("span", { className: "ss-w-fandash-resting-standings-position", children: data.positionLabel }),
|
|
2404
2626
|
/* @__PURE__ */ jsx33("span", { className: "ss-w-fandash-resting-standings-record", children: data.recordLabel })
|
|
2405
2627
|
] }),
|
|
@@ -2408,12 +2630,12 @@ function RestingStandingsCard({ card, onTap }) {
|
|
|
2408
2630
|
}
|
|
2409
2631
|
|
|
2410
2632
|
// src/components/dashboard/RestingSeasonCard.tsx
|
|
2411
|
-
import { jsx as jsx34, jsxs as
|
|
2633
|
+
import { jsx as jsx34, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2412
2634
|
function RestingSeasonCard({ card, onTap }) {
|
|
2413
2635
|
const { data } = card;
|
|
2414
|
-
return /* @__PURE__ */
|
|
2636
|
+
return /* @__PURE__ */ jsxs30("button", { type: "button", className: "ss-w-fandash-card ss-w-fandash-card--tap ss-w-fandash-resting-season", onClick: () => onTap(card), children: [
|
|
2415
2637
|
card.title ? /* @__PURE__ */ jsx34("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2416
|
-
/* @__PURE__ */
|
|
2638
|
+
/* @__PURE__ */ jsxs30("div", { className: "ss-w-fandash-resting-season-rows", children: [
|
|
2417
2639
|
data.scorerLabel ? /* @__PURE__ */ jsx34("span", { className: "ss-w-fandash-resting-season-row", children: data.scorerLabel }) : null,
|
|
2418
2640
|
data.playerLabel ? /* @__PURE__ */ jsx34("span", { className: "ss-w-fandash-resting-season-row", children: data.playerLabel }) : null,
|
|
2419
2641
|
/* @__PURE__ */ jsx34("span", { className: "ss-w-fandash-resting-season-row", children: data.tallyLabel })
|
|
@@ -2423,7 +2645,7 @@ function RestingSeasonCard({ card, onTap }) {
|
|
|
2423
2645
|
}
|
|
2424
2646
|
|
|
2425
2647
|
// src/components/dashboard/RestingFormCard.tsx
|
|
2426
|
-
import { jsx as jsx35, jsxs as
|
|
2648
|
+
import { jsx as jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2427
2649
|
function resultClass(result) {
|
|
2428
2650
|
const upper = result.toUpperCase();
|
|
2429
2651
|
if (upper === "W") return "ss-w-fandash-form-pill--win";
|
|
@@ -2432,17 +2654,17 @@ function resultClass(result) {
|
|
|
2432
2654
|
}
|
|
2433
2655
|
function RestingFormCard({ card }) {
|
|
2434
2656
|
const { data } = card;
|
|
2435
|
-
return /* @__PURE__ */
|
|
2657
|
+
return /* @__PURE__ */ jsxs31("div", { className: "ss-w-fandash-card ss-w-fandash-resting-form", children: [
|
|
2436
2658
|
card.title ? /* @__PURE__ */ jsx35("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2437
2659
|
/* @__PURE__ */ jsx35("span", { className: "ss-w-fandash-form", children: data.letters.map((r, i) => /* @__PURE__ */ jsx35("span", { className: `ss-w-fandash-form-pill ${resultClass(r)}`, children: r }, `${r}-${i}`)) })
|
|
2438
2660
|
] });
|
|
2439
2661
|
}
|
|
2440
2662
|
|
|
2441
2663
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
2442
|
-
import { useRef as
|
|
2664
|
+
import { useRef as useRef6, useState as useState15 } from "react";
|
|
2443
2665
|
|
|
2444
2666
|
// src/useLiveClock.ts
|
|
2445
|
-
import { useEffect as
|
|
2667
|
+
import { useEffect as useEffect8, useState as useState14 } from "react";
|
|
2446
2668
|
var TICK_MS = 6e4;
|
|
2447
2669
|
var MAX_LIVE_TICK_MINUTES = 15;
|
|
2448
2670
|
function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
@@ -2451,10 +2673,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
|
2451
2673
|
return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
|
|
2452
2674
|
}
|
|
2453
2675
|
function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
2454
|
-
const [displayMinute, setDisplayMinute] =
|
|
2676
|
+
const [displayMinute, setDisplayMinute] = useState14(
|
|
2455
2677
|
() => computeDisplayMinute(minute, clockRunning, receivedAtMs)
|
|
2456
2678
|
);
|
|
2457
|
-
|
|
2679
|
+
useEffect8(() => {
|
|
2458
2680
|
setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
|
|
2459
2681
|
if (!clockRunning) return;
|
|
2460
2682
|
const id = window.setInterval(() => {
|
|
@@ -2466,12 +2688,12 @@ function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
|
2466
2688
|
}
|
|
2467
2689
|
|
|
2468
2690
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
2469
|
-
import { jsx as jsx36, jsxs as
|
|
2691
|
+
import { jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
2470
2692
|
function initials5(name) {
|
|
2471
2693
|
return name.trim().slice(0, 3).toUpperCase();
|
|
2472
2694
|
}
|
|
2473
2695
|
function LiveCrest({ url, name, side }) {
|
|
2474
|
-
const [failed, setFailed] =
|
|
2696
|
+
const [failed, setFailed] = useState15(false);
|
|
2475
2697
|
const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
|
|
2476
2698
|
if (url && !failed) {
|
|
2477
2699
|
return /* @__PURE__ */ jsx36("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -2490,39 +2712,39 @@ function LiveScoreCard({
|
|
|
2490
2712
|
}) {
|
|
2491
2713
|
const { data } = card;
|
|
2492
2714
|
const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
|
|
2493
|
-
const seedRef =
|
|
2715
|
+
const seedRef = useRef6(null);
|
|
2494
2716
|
if (!seedRef.current || seedRef.current.key !== seedKey) {
|
|
2495
2717
|
seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
|
|
2496
2718
|
}
|
|
2497
2719
|
const displayMinute = useLiveClock(data.minute, data.clockRunning, seedRef.current.receivedAtMs);
|
|
2498
2720
|
const minuteSuffix = data.minuteLabel.replace(/^\d+/, "");
|
|
2499
2721
|
const scorers = scorersLine(goalEvents);
|
|
2500
|
-
return /* @__PURE__ */
|
|
2722
|
+
return /* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-card ss-w-fandash-live-score", children: [
|
|
2501
2723
|
card.title ? /* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2502
|
-
/* @__PURE__ */
|
|
2503
|
-
/* @__PURE__ */
|
|
2724
|
+
/* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-top", children: [
|
|
2725
|
+
/* @__PURE__ */ jsxs32("span", { className: "ss-w-fandash-live-pill", children: [
|
|
2504
2726
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-dot", "aria-hidden": "true" }),
|
|
2505
2727
|
data.statusLabel
|
|
2506
2728
|
] }),
|
|
2507
2729
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-minute", children: `${displayMinute}${minuteSuffix}` }),
|
|
2508
2730
|
data.competition ? /* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-competition", children: data.competition }) : null
|
|
2509
2731
|
] }),
|
|
2510
|
-
/* @__PURE__ */
|
|
2511
|
-
/* @__PURE__ */
|
|
2732
|
+
/* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-main", children: [
|
|
2733
|
+
/* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-side ss-w-fandash-live-side--home", children: [
|
|
2512
2734
|
/* @__PURE__ */ jsx36(LiveCrest, { url: data.homeCrestUrl, name: data.homeName, side: "home" }),
|
|
2513
2735
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-team-name", children: data.homeName })
|
|
2514
2736
|
] }),
|
|
2515
|
-
/* @__PURE__ */
|
|
2737
|
+
/* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-score-main", children: [
|
|
2516
2738
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-score-value", children: data.homeScore }),
|
|
2517
2739
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-score-sep", children: "\u2013" }),
|
|
2518
2740
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-score-value", children: data.awayScore })
|
|
2519
2741
|
] }),
|
|
2520
|
-
/* @__PURE__ */
|
|
2742
|
+
/* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-side ss-w-fandash-live-side--away", children: [
|
|
2521
2743
|
/* @__PURE__ */ jsx36(LiveCrest, { url: data.awayCrestUrl, name: data.awayName, side: "away" }),
|
|
2522
2744
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-team-name", children: data.awayName })
|
|
2523
2745
|
] })
|
|
2524
2746
|
] }),
|
|
2525
|
-
scorers ? /* @__PURE__ */
|
|
2747
|
+
scorers ? /* @__PURE__ */ jsxs32("div", { className: "ss-w-fandash-live-scorers", children: [
|
|
2526
2748
|
/* @__PURE__ */ jsx36("span", { className: "ss-w-fandash-live-scorers-icon", "aria-hidden": "true", children: "\u26BD" }),
|
|
2527
2749
|
scorers
|
|
2528
2750
|
] }) : null
|
|
@@ -2530,8 +2752,8 @@ function LiveScoreCard({
|
|
|
2530
2752
|
}
|
|
2531
2753
|
|
|
2532
2754
|
// src/components/dashboard/LiveTimelineCard.tsx
|
|
2533
|
-
import { useState as
|
|
2534
|
-
import { jsx as jsx37, jsxs as
|
|
2755
|
+
import { useState as useState16 } from "react";
|
|
2756
|
+
import { jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
2535
2757
|
var SHOWN2 = 3;
|
|
2536
2758
|
function EventIcon({ type }) {
|
|
2537
2759
|
if (type === "goal") {
|
|
@@ -2547,9 +2769,9 @@ function EventIcon({ type }) {
|
|
|
2547
2769
|
}
|
|
2548
2770
|
function EventLabel({ e }) {
|
|
2549
2771
|
if (e.type === "sub") {
|
|
2550
|
-
return /* @__PURE__ */
|
|
2772
|
+
return /* @__PURE__ */ jsxs33("span", { className: "ss-w-fandash-live-tl-who", children: [
|
|
2551
2773
|
e.player ?? e.text,
|
|
2552
|
-
e.playerOff ? /* @__PURE__ */
|
|
2774
|
+
e.playerOff ? /* @__PURE__ */ jsxs33("span", { className: "ss-w-fandash-live-tl-off", children: [
|
|
2553
2775
|
" for ",
|
|
2554
2776
|
e.playerOff
|
|
2555
2777
|
] }) : null
|
|
@@ -2563,8 +2785,8 @@ function EventRow({ e }) {
|
|
|
2563
2785
|
e.side === "home" ? "ss-w-fandash-live-tl-ev--home" : "ss-w-fandash-live-tl-ev--away",
|
|
2564
2786
|
e.type === "goal" ? "ss-w-fandash-live-tl-ev--goal" : ""
|
|
2565
2787
|
].filter(Boolean).join(" ");
|
|
2566
|
-
return /* @__PURE__ */
|
|
2567
|
-
/* @__PURE__ */
|
|
2788
|
+
return /* @__PURE__ */ jsxs33("div", { className: cls, children: [
|
|
2789
|
+
/* @__PURE__ */ jsxs33("span", { className: "ss-w-fandash-live-tl-txt", children: [
|
|
2568
2790
|
/* @__PURE__ */ jsx37(EventLabel, { e }),
|
|
2569
2791
|
/* @__PURE__ */ jsx37(EventIcon, { type: e.type })
|
|
2570
2792
|
] }),
|
|
@@ -2572,7 +2794,7 @@ function EventRow({ e }) {
|
|
|
2572
2794
|
] });
|
|
2573
2795
|
}
|
|
2574
2796
|
function LiveTimelineCard({ card, ui }) {
|
|
2575
|
-
const [expanded, setExpanded] =
|
|
2797
|
+
const [expanded, setExpanded] = useState16(false);
|
|
2576
2798
|
const events = card.data.events;
|
|
2577
2799
|
if (!events || events.length === 0) return null;
|
|
2578
2800
|
const sorted = [...events].sort((a, b) => b.minute - a.minute);
|
|
@@ -2580,7 +2802,7 @@ function LiveTimelineCard({ card, ui }) {
|
|
|
2580
2802
|
const shown = expanded ? sorted : sorted.slice(0, SHOWN2);
|
|
2581
2803
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
2582
2804
|
const showLess = ui?.showLess ?? "Show less";
|
|
2583
|
-
return /* @__PURE__ */
|
|
2805
|
+
return /* @__PURE__ */ jsxs33("div", { className: "ss-w-fandash-card ss-w-fandash-live-timeline", children: [
|
|
2584
2806
|
card.title ? /* @__PURE__ */ jsx37("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2585
2807
|
/* @__PURE__ */ jsx37("div", { className: "ss-w-fandash-live-tl", children: shown.map((e, i) => /* @__PURE__ */ jsx37(EventRow, { e }, `${e.minute}-${e.side}-${e.type}-${i}`)) }),
|
|
2586
2808
|
rest > 0 ? /* @__PURE__ */ jsx37(
|
|
@@ -2598,7 +2820,7 @@ function LiveTimelineCard({ card, ui }) {
|
|
|
2598
2820
|
|
|
2599
2821
|
// src/components/dashboard/MomentumWave.tsx
|
|
2600
2822
|
import { useId } from "react";
|
|
2601
|
-
import { jsx as jsx38, jsxs as
|
|
2823
|
+
import { jsx as jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
2602
2824
|
var WIDTH = 270;
|
|
2603
2825
|
var HEIGHT = 56;
|
|
2604
2826
|
var BASELINE = HEIGHT / 2;
|
|
@@ -2626,10 +2848,10 @@ function MomentumWave({
|
|
|
2626
2848
|
const bottomClipId = `${clipId}-bottom`;
|
|
2627
2849
|
const topClass = clubIsHome ? "ss-w-fandash-live-mom-home" : "ss-w-fandash-live-mom-away";
|
|
2628
2850
|
const bottomClass = clubIsHome ? "ss-w-fandash-live-mom-away" : "ss-w-fandash-live-mom-home";
|
|
2629
|
-
return /* @__PURE__ */
|
|
2851
|
+
return /* @__PURE__ */ jsxs34("div", { className: "ss-w-fandash-live-mom", children: [
|
|
2630
2852
|
caption ? /* @__PURE__ */ jsx38("span", { className: "ss-w-fandash-live-mom-caption", children: caption }) : null,
|
|
2631
|
-
/* @__PURE__ */
|
|
2632
|
-
/* @__PURE__ */
|
|
2853
|
+
/* @__PURE__ */ jsxs34("div", { className: "ss-w-fandash-live-mom-plot", children: [
|
|
2854
|
+
/* @__PURE__ */ jsxs34(
|
|
2633
2855
|
"svg",
|
|
2634
2856
|
{
|
|
2635
2857
|
className: "ss-w-fandash-live-mom-svg",
|
|
@@ -2638,7 +2860,7 @@ function MomentumWave({
|
|
|
2638
2860
|
role: "img",
|
|
2639
2861
|
"aria-label": caption ?? "Momentum",
|
|
2640
2862
|
children: [
|
|
2641
|
-
/* @__PURE__ */
|
|
2863
|
+
/* @__PURE__ */ jsxs34("defs", { children: [
|
|
2642
2864
|
/* @__PURE__ */ jsx38("clipPath", { id: topClipId, children: /* @__PURE__ */ jsx38("rect", { x: 0, y: 0, width: WIDTH, height: BASELINE }) }),
|
|
2643
2865
|
/* @__PURE__ */ jsx38("clipPath", { id: bottomClipId, children: /* @__PURE__ */ jsx38("rect", { x: 0, y: BASELINE, width: WIDTH, height: HEIGHT - BASELINE }) })
|
|
2644
2866
|
] }),
|
|
@@ -2662,7 +2884,7 @@ function MomentumWave({
|
|
|
2662
2884
|
}
|
|
2663
2885
|
|
|
2664
2886
|
// src/components/dashboard/LiveStatsCard.tsx
|
|
2665
|
-
import { jsx as jsx39, jsxs as
|
|
2887
|
+
import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
2666
2888
|
function splitWidths2(homeNum, awayNum) {
|
|
2667
2889
|
const total = homeNum + awayNum;
|
|
2668
2890
|
if (total <= 0) return { home: "50%", away: "50%" };
|
|
@@ -2671,7 +2893,7 @@ function splitWidths2(homeNum, awayNum) {
|
|
|
2671
2893
|
}
|
|
2672
2894
|
function LiveStatsCard({ card }) {
|
|
2673
2895
|
const { data } = card;
|
|
2674
|
-
return /* @__PURE__ */
|
|
2896
|
+
return /* @__PURE__ */ jsxs35("div", { className: "ss-w-fandash-card ss-w-fandash-live-stats", children: [
|
|
2675
2897
|
card.title ? /* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-eyebrow", children: card.title }) : null,
|
|
2676
2898
|
/* @__PURE__ */ jsx39("div", { className: "ss-w-fandash-live-stat-rows", children: data.rows.map((r, i) => {
|
|
2677
2899
|
const homeValue = data.clubIsHome ? r.clubValue : r.oppValue;
|
|
@@ -2679,25 +2901,25 @@ function LiveStatsCard({ card }) {
|
|
|
2679
2901
|
const homeNum = data.clubIsHome ? r.clubNum : r.oppNum;
|
|
2680
2902
|
const awayNum = data.clubIsHome ? r.oppNum : r.clubNum;
|
|
2681
2903
|
const { home, away } = splitWidths2(homeNum, awayNum);
|
|
2682
|
-
return /* @__PURE__ */
|
|
2683
|
-
/* @__PURE__ */
|
|
2904
|
+
return /* @__PURE__ */ jsxs35("div", { className: "ss-w-fandash-live-stat", children: [
|
|
2905
|
+
/* @__PURE__ */ jsxs35("div", { className: "ss-w-fandash-live-stat-row", children: [
|
|
2684
2906
|
/* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-stat-value ss-w-fandash-live-stat-value--home", children: homeValue }),
|
|
2685
2907
|
/* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-stat-label", children: r.label }),
|
|
2686
2908
|
/* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-stat-value ss-w-fandash-live-stat-value--away", children: awayValue })
|
|
2687
2909
|
] }),
|
|
2688
|
-
/* @__PURE__ */
|
|
2910
|
+
/* @__PURE__ */ jsxs35("div", { className: "ss-w-fandash-live-bar", children: [
|
|
2689
2911
|
/* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-bar-home", style: { width: home } }),
|
|
2690
2912
|
/* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-bar-away", style: { width: away } })
|
|
2691
2913
|
] })
|
|
2692
2914
|
] }, `${r.label}-${i}`);
|
|
2693
2915
|
}) }),
|
|
2694
2916
|
data.momentum.length > 0 ? /* @__PURE__ */ jsx39(MomentumWave, { points: data.momentum, caption: data.momentumLabel, clubIsHome: data.clubIsHome }) : data.momentumLabel ? /* @__PURE__ */ jsx39("span", { className: "ss-w-fandash-live-momentum", children: data.momentumLabel }) : null,
|
|
2695
|
-
data.rows.length > 0 ? /* @__PURE__ */
|
|
2696
|
-
/* @__PURE__ */
|
|
2917
|
+
data.rows.length > 0 ? /* @__PURE__ */ jsxs35("div", { className: "ss-w-fandash-live-legend", children: [
|
|
2918
|
+
/* @__PURE__ */ jsxs35("span", { className: "ss-w-fandash-live-legend-item", children: [
|
|
2697
2919
|
/* @__PURE__ */ jsx39("i", { className: "ss-w-fandash-live-legend-swatch ss-w-fandash-live-legend-swatch--home" }),
|
|
2698
2920
|
data.homeName
|
|
2699
2921
|
] }),
|
|
2700
|
-
/* @__PURE__ */
|
|
2922
|
+
/* @__PURE__ */ jsxs35("span", { className: "ss-w-fandash-live-legend-item", children: [
|
|
2701
2923
|
/* @__PURE__ */ jsx39("i", { className: "ss-w-fandash-live-legend-swatch ss-w-fandash-live-legend-swatch--away" }),
|
|
2702
2924
|
data.awayName
|
|
2703
2925
|
] })
|
|
@@ -2706,7 +2928,7 @@ function LiveStatsCard({ card }) {
|
|
|
2706
2928
|
}
|
|
2707
2929
|
|
|
2708
2930
|
// src/components/dashboard/ClubFanDashboard.tsx
|
|
2709
|
-
import { jsx as jsx40, jsxs as
|
|
2931
|
+
import { jsx as jsx40, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
2710
2932
|
function ClubFanDashboard({ dashboard, onTap, ui }) {
|
|
2711
2933
|
const orderedCards = [
|
|
2712
2934
|
...dashboard.cards.filter((c) => c.cardType === "countdown"),
|
|
@@ -2716,7 +2938,7 @@ function ClubFanDashboard({ dashboard, onTap, ui }) {
|
|
|
2716
2938
|
(c) => c.cardType === "liveTimeline"
|
|
2717
2939
|
);
|
|
2718
2940
|
const goalEvents = timelineCard?.data.events.filter((e) => e.type === "goal");
|
|
2719
|
-
return /* @__PURE__ */
|
|
2941
|
+
return /* @__PURE__ */ jsxs36("div", { className: "ss-w-fandash", children: [
|
|
2720
2942
|
dashboard.greeting ? /* @__PURE__ */ jsx40("span", { className: dashboard.greetingIsLead ? "ss-w-fandash-greeting ss-w-fandash-greeting--lead" : "ss-w-fandash-greeting", children: dashboard.greeting }) : null,
|
|
2721
2943
|
/* @__PURE__ */ jsx40("div", { className: "ss-w-fandash-cards", children: orderedCards.map((card, i) => /* @__PURE__ */ jsx40(FanDashboardCard, { card, onTap, ui, goalEvents }, `${card.cardType}-${i}`)) })
|
|
2722
2944
|
] });
|
|
@@ -2769,7 +2991,7 @@ function FanDashboardCard({ card, onTap, ui, goalEvents }) {
|
|
|
2769
2991
|
}
|
|
2770
2992
|
|
|
2771
2993
|
// src/components/ChatMessage.tsx
|
|
2772
|
-
import { jsx as jsx41, jsxs as
|
|
2994
|
+
import { jsx as jsx41, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
2773
2995
|
function ChatMessage({ message, disabled, onAct, onTap, ui, slip, monitor }) {
|
|
2774
2996
|
if (message.role === "user") {
|
|
2775
2997
|
return /* @__PURE__ */ jsx41("div", { className: "ss-w-msg ss-w-user", "data-msg-id": message.id, children: /* @__PURE__ */ jsx41("div", { className: "ss-w-bubble", children: message.text }) });
|
|
@@ -2777,7 +2999,7 @@ function ChatMessage({ message, disabled, onAct, onTap, ui, slip, monitor }) {
|
|
|
2777
2999
|
const onFanDashboardTap = (card) => {
|
|
2778
3000
|
onAct({ message: card.actionLabel, actionRef: card.actionRef, label: card.actionLabel || card.title || "" });
|
|
2779
3001
|
};
|
|
2780
|
-
return /* @__PURE__ */
|
|
3002
|
+
return /* @__PURE__ */ jsxs37("div", { className: "ss-w-msg ss-w-bot", "data-msg-id": message.id, children: [
|
|
2781
3003
|
message.text && !message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ jsx41(Markdown, { text: message.text }) : null,
|
|
2782
3004
|
message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ jsx41(GreetingDashboard, { dashboard: message.greetingDashboard, onTap }) : null,
|
|
2783
3005
|
message.clubFanDashboard ? /* @__PURE__ */ jsx41(ClubFanDashboard, { dashboard: message.clubFanDashboard, onTap: onFanDashboardTap, ui }) : null,
|
|
@@ -2803,7 +3025,7 @@ function isPinnedToBottom(el, threshold = PIN_THRESHOLD) {
|
|
|
2803
3025
|
}
|
|
2804
3026
|
|
|
2805
3027
|
// src/components/MessageList.tsx
|
|
2806
|
-
import { jsx as jsx43, jsxs as
|
|
3028
|
+
import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
2807
3029
|
function turnAnchor(messages) {
|
|
2808
3030
|
const last = messages[messages.length - 1];
|
|
2809
3031
|
if (!last || last.role !== "assistant") return null;
|
|
@@ -2812,11 +3034,11 @@ function turnAnchor(messages) {
|
|
|
2812
3034
|
}
|
|
2813
3035
|
function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
2814
3036
|
const { state, send } = controller;
|
|
2815
|
-
const listRef =
|
|
2816
|
-
const endRef =
|
|
2817
|
-
const pinnedRef =
|
|
2818
|
-
const anchoredTurnRef =
|
|
2819
|
-
|
|
3037
|
+
const listRef = useRef7(null);
|
|
3038
|
+
const endRef = useRef7(null);
|
|
3039
|
+
const pinnedRef = useRef7(true);
|
|
3040
|
+
const anchoredTurnRef = useRef7(null);
|
|
3041
|
+
useEffect9(() => {
|
|
2820
3042
|
const anchor = turnAnchor(state.messages);
|
|
2821
3043
|
const list = listRef.current;
|
|
2822
3044
|
if (anchor && anchor.turnId !== anchoredTurnRef.current) {
|
|
@@ -2831,7 +3053,7 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
2831
3053
|
}, [state.messages, state.status, state.isStreaming]);
|
|
2832
3054
|
const hasUserMessage = state.messages.some((m) => m.role === "user");
|
|
2833
3055
|
const hasDashboard = state.messages.some((m) => m.role === "assistant" && (m.greetingDashboard || m.clubFanDashboard));
|
|
2834
|
-
return /* @__PURE__ */
|
|
3056
|
+
return /* @__PURE__ */ jsxs38(
|
|
2835
3057
|
"div",
|
|
2836
3058
|
{
|
|
2837
3059
|
className: "ss-w-list",
|
|
@@ -2860,7 +3082,7 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
2860
3082
|
state.isStreaming && state.actionsLoading ? /* @__PURE__ */ jsx43(ActionButtons, { actions: [], loading: true, onAct: () => {
|
|
2861
3083
|
} }) : null,
|
|
2862
3084
|
state.status ? /* @__PURE__ */ jsx43("div", { className: "ss-w-status", children: state.status }) : null,
|
|
2863
|
-
state.error ? /* @__PURE__ */
|
|
3085
|
+
state.error ? /* @__PURE__ */ jsxs38("div", { className: "ss-w-error", role: "alert", children: [
|
|
2864
3086
|
/* @__PURE__ */ jsx43("span", { children: "message" in state.error ? state.error.message : ui.somethingWentWrong }),
|
|
2865
3087
|
/* @__PURE__ */ jsx43("button", { type: "button", className: "ss-w-retry", onClick: () => controller.retry(), children: ui.retry })
|
|
2866
3088
|
] }) : null,
|
|
@@ -2872,10 +3094,10 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
2872
3094
|
}
|
|
2873
3095
|
|
|
2874
3096
|
// src/components/ChatInput.tsx
|
|
2875
|
-
import { useState as
|
|
2876
|
-
import { jsx as jsx44, jsxs as
|
|
3097
|
+
import { useState as useState17 } from "react";
|
|
3098
|
+
import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
2877
3099
|
function ChatInput({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message" }) {
|
|
2878
|
-
const [value, setValue] =
|
|
3100
|
+
const [value, setValue] = useState17("");
|
|
2879
3101
|
const submit = () => {
|
|
2880
3102
|
const t = value.trim();
|
|
2881
3103
|
if (!t) return;
|
|
@@ -2888,14 +3110,14 @@ function ChatInput({ placeholder, streaming, onSend, onStop, stopLabel = "Stop r
|
|
|
2888
3110
|
submit();
|
|
2889
3111
|
}
|
|
2890
3112
|
};
|
|
2891
|
-
return /* @__PURE__ */
|
|
3113
|
+
return /* @__PURE__ */ jsxs39("div", { className: "ss-w-input", children: [
|
|
2892
3114
|
/* @__PURE__ */ jsx44("textarea", { className: "ss-w-textarea", rows: 1, placeholder, value, disabled: streaming, onChange: (e) => setValue(e.target.value), onKeyDown }),
|
|
2893
3115
|
streaming ? /* @__PURE__ */ jsx44("button", { type: "button", className: "ss-w-send ss-w-stop", "aria-label": stopLabel, onClick: onStop, children: /* @__PURE__ */ jsx44("span", { className: "ss-w-stop-glyph" }) }) : /* @__PURE__ */ jsx44("button", { type: "button", className: "ss-w-send", "aria-label": sendLabel, onClick: submit, children: /* @__PURE__ */ jsx44(SendIcon, {}) })
|
|
2894
3116
|
] });
|
|
2895
3117
|
}
|
|
2896
3118
|
|
|
2897
3119
|
// src/components/TabBar.tsx
|
|
2898
|
-
import { jsx as jsx45, jsxs as
|
|
3120
|
+
import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
2899
3121
|
var TABS = [
|
|
2900
3122
|
{ tab: "chat", labelKey: "tabChat" },
|
|
2901
3123
|
{ tab: "matches", labelKey: "tabMatches" },
|
|
@@ -2912,7 +3134,7 @@ function TabBar({ monitor, ui, matchCount, oddsCount }) {
|
|
|
2912
3134
|
return /* @__PURE__ */ jsx45("div", { className: "ss-w-tabs", role: "tablist", children: TABS.map(({ tab, labelKey }) => {
|
|
2913
3135
|
const active = monitor.activeTab === tab;
|
|
2914
3136
|
const count = counts[tab];
|
|
2915
|
-
return /* @__PURE__ */
|
|
3137
|
+
return /* @__PURE__ */ jsxs40(
|
|
2916
3138
|
"button",
|
|
2917
3139
|
{
|
|
2918
3140
|
type: "button",
|
|
@@ -2933,7 +3155,7 @@ function TabBar({ monitor, ui, matchCount, oddsCount }) {
|
|
|
2933
3155
|
}
|
|
2934
3156
|
|
|
2935
3157
|
// src/components/MarketAccordion.tsx
|
|
2936
|
-
import { jsx as jsx46, jsxs as
|
|
3158
|
+
import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
2937
3159
|
function MarketAccordion({ match, monitor, ui, slip }) {
|
|
2938
3160
|
const markets = match.availableMarkets ?? [];
|
|
2939
3161
|
if (markets.length === 0) return null;
|
|
@@ -2942,9 +3164,9 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
2942
3164
|
const isOpen = open === m.marketDeveloperName;
|
|
2943
3165
|
const key = `${match.matchId}:${m.marketDeveloperName}`;
|
|
2944
3166
|
const entry = monitor.marketOdds[key];
|
|
2945
|
-
return /* @__PURE__ */
|
|
2946
|
-
/* @__PURE__ */
|
|
2947
|
-
/* @__PURE__ */
|
|
3167
|
+
return /* @__PURE__ */ jsxs41("div", { className: isOpen ? "ss-w-acc-row ss-w-acc-row-open" : "ss-w-acc-row", children: [
|
|
3168
|
+
/* @__PURE__ */ jsxs41("div", { className: "ss-w-acc-head", children: [
|
|
3169
|
+
/* @__PURE__ */ jsxs41(
|
|
2948
3170
|
"button",
|
|
2949
3171
|
{
|
|
2950
3172
|
type: "button",
|
|
@@ -2968,7 +3190,7 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
2968
3190
|
}
|
|
2969
3191
|
)
|
|
2970
3192
|
] }),
|
|
2971
|
-
isOpen && /* @__PURE__ */
|
|
3193
|
+
isOpen && /* @__PURE__ */ jsxs41("div", { className: "ss-w-acc-panel", children: [
|
|
2972
3194
|
entry?.error && /* @__PURE__ */ jsx46(
|
|
2973
3195
|
"div",
|
|
2974
3196
|
{
|
|
@@ -2977,7 +3199,7 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
2977
3199
|
children: ui.accordionRetry
|
|
2978
3200
|
}
|
|
2979
3201
|
),
|
|
2980
|
-
entry?.block?.insight?.text && /* @__PURE__ */
|
|
3202
|
+
entry?.block?.insight?.text && /* @__PURE__ */ jsxs41("div", { className: "ss-w-acc-insight", children: [
|
|
2981
3203
|
/* @__PURE__ */ jsx46("span", { className: "ss-w-acc-badge", children: ui.accordionValueLabel }),
|
|
2982
3204
|
" ",
|
|
2983
3205
|
entry.block.insight.text
|
|
@@ -2999,7 +3221,7 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
2999
3221
|
}
|
|
3000
3222
|
|
|
3001
3223
|
// src/components/MonitorMatchCard.tsx
|
|
3002
|
-
import { jsx as jsx47, jsxs as
|
|
3224
|
+
import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
3003
3225
|
function chipSelection(row, matchId, conversationId) {
|
|
3004
3226
|
const chip = row.market;
|
|
3005
3227
|
if (!chip || !chip.addToSlipEnabled || typeof chip.matchOddsId !== "number" || typeof chip.price !== "number") return null;
|
|
@@ -3022,14 +3244,14 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
3022
3244
|
const otherRows = match.statRows.filter((row) => !isPromoted(row, promotedPins));
|
|
3023
3245
|
const orderedRows = [...promotedRows, ...otherRows];
|
|
3024
3246
|
const kickoff = match.phase === "preMatch" && match.kickoffUtc ? ui.bettingKickoff(match.kickoffUtc) : void 0;
|
|
3025
|
-
return /* @__PURE__ */
|
|
3026
|
-
/* @__PURE__ */
|
|
3027
|
-
live && /* @__PURE__ */
|
|
3247
|
+
return /* @__PURE__ */ jsxs42("div", { className: "ss-w-mon", children: [
|
|
3248
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-top", children: [
|
|
3249
|
+
live && /* @__PURE__ */ jsxs42("span", { className: "ss-w-fandash-live-pill", children: [
|
|
3028
3250
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-fandash-live-dot", "aria-hidden": "true" }),
|
|
3029
3251
|
ui.liveLabel
|
|
3030
3252
|
] }),
|
|
3031
3253
|
match.phase === "fullTime" && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-pill", children: ui.fullTimeLabel }),
|
|
3032
|
-
kickoff && /* @__PURE__ */
|
|
3254
|
+
kickoff && /* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-pill", children: [
|
|
3033
3255
|
kickoff.dayLabel,
|
|
3034
3256
|
" \xB7 ",
|
|
3035
3257
|
kickoff.time
|
|
@@ -3038,17 +3260,17 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
3038
3260
|
match.competitionName && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-comp", children: match.competitionName }),
|
|
3039
3261
|
/* @__PURE__ */ jsx47(PinToggle, { ui, monitor, pin: { kind: "match", matchId: match.matchId } })
|
|
3040
3262
|
] }),
|
|
3041
|
-
/* @__PURE__ */
|
|
3042
|
-
/* @__PURE__ */
|
|
3263
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-main", children: [
|
|
3264
|
+
/* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-side", children: [
|
|
3043
3265
|
/* @__PURE__ */ jsx47(Crest2, { kind: "team", url: match.homeCrestUrl ?? void 0, name: match.homeTeamName ?? void 0 }),
|
|
3044
3266
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-name", children: match.homeTeamName })
|
|
3045
3267
|
] }),
|
|
3046
|
-
match.phase === "preMatch" ? /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-vs", children: "vs" }) : /* @__PURE__ */
|
|
3268
|
+
match.phase === "preMatch" ? /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-vs", children: "vs" }) : /* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-score", children: [
|
|
3047
3269
|
match.homeScore,
|
|
3048
3270
|
/* @__PURE__ */ jsx47("i", { children: "\u2013" }),
|
|
3049
3271
|
match.awayScore
|
|
3050
3272
|
] }),
|
|
3051
|
-
/* @__PURE__ */
|
|
3273
|
+
/* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-side ss-w-mon-side--away", children: [
|
|
3052
3274
|
/* @__PURE__ */ jsx47(Crest2, { kind: "team", url: match.awayCrestUrl ?? void 0, name: match.awayTeamName ?? void 0 }),
|
|
3053
3275
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-name", children: match.awayTeamName })
|
|
3054
3276
|
] })
|
|
@@ -3060,23 +3282,23 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
3060
3282
|
const awayPct = total > 0 ? row.awayNum / total * 75 : 0;
|
|
3061
3283
|
const promoted = isPromoted(row, promotedPins);
|
|
3062
3284
|
const selection = chipSelection(row, match.matchId, slip.conversationId);
|
|
3063
|
-
return /* @__PURE__ */
|
|
3064
|
-
/* @__PURE__ */
|
|
3285
|
+
return /* @__PURE__ */ jsxs42("div", { className: promoted ? "ss-w-mon-stat ss-w-mon-pstrip" : "ss-w-mon-stat", children: [
|
|
3286
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-stat-row", children: [
|
|
3065
3287
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--home", children: row.homeValue }),
|
|
3066
3288
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-l", children: row.label }),
|
|
3067
3289
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--away", children: row.awayValue })
|
|
3068
3290
|
] }),
|
|
3069
|
-
/* @__PURE__ */
|
|
3291
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-bar", children: [
|
|
3070
3292
|
/* @__PURE__ */ jsx47("b", { className: "ss-w-mon-bar-home", style: { width: `${homePct}%` } }),
|
|
3071
3293
|
/* @__PURE__ */ jsx47("i", { className: "ss-w-mon-bar-away", style: { width: `${awayPct}%` } })
|
|
3072
3294
|
] }),
|
|
3073
|
-
row.market && /* @__PURE__ */
|
|
3074
|
-
/* @__PURE__ */
|
|
3295
|
+
row.market && /* @__PURE__ */ jsxs42("div", { className: promoted ? "ss-w-mon-stat-mkt ss-w-mon-mkt" : "ss-w-mon-stat-mkt", children: [
|
|
3296
|
+
/* @__PURE__ */ jsxs42("span", { children: [
|
|
3075
3297
|
row.market.marketLabel,
|
|
3076
3298
|
" \xB7 ",
|
|
3077
3299
|
row.market.selectionLabel
|
|
3078
3300
|
] }),
|
|
3079
|
-
/* @__PURE__ */
|
|
3301
|
+
/* @__PURE__ */ jsxs42("span", { className: "ss-w-mon-stat-mkt-right", children: [
|
|
3080
3302
|
row.market.isSuspended ? /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-susp", children: ui.suspendedLabel }) : typeof row.market.price === "number" && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-price", children: row.market.price.toFixed(2) }),
|
|
3081
3303
|
/* @__PURE__ */ jsx47(
|
|
3082
3304
|
SlipButton,
|
|
@@ -3093,8 +3315,8 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
3093
3315
|
] }, row.label);
|
|
3094
3316
|
}) }),
|
|
3095
3317
|
match.status === "stale" && /* @__PURE__ */ jsx47("span", { className: "ss-w-mon-asof", children: ui.asOf(formatTime(match.asOfUtc)) }),
|
|
3096
|
-
match.momentum.length > 0 && /* @__PURE__ */
|
|
3097
|
-
/* @__PURE__ */
|
|
3318
|
+
match.momentum.length > 0 && /* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-mom", children: [
|
|
3319
|
+
/* @__PURE__ */ jsxs42("div", { className: "ss-w-mon-stat-row", children: [
|
|
3098
3320
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--home", children: typeof match.momentumHomePct === "number" ? `${match.momentumHomePct}%` : "" }),
|
|
3099
3321
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-l", children: ui.momentumLabel }),
|
|
3100
3322
|
/* @__PURE__ */ jsx47("span", { className: "ss-w-mon-stat-v ss-w-mon-stat-v--away", children: typeof match.momentumHomePct === "number" ? `${100 - match.momentumHomePct}%` : "" })
|
|
@@ -3106,13 +3328,13 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
3106
3328
|
}
|
|
3107
3329
|
|
|
3108
3330
|
// src/components/MonitorTabs.tsx
|
|
3109
|
-
import { jsx as jsx48, jsxs as
|
|
3331
|
+
import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
3110
3332
|
function OddsLiveStrip({ m, ui }) {
|
|
3111
3333
|
const showScore = m.phase !== "preMatch" && typeof m.homeScore === "number";
|
|
3112
3334
|
const stale = m.status === "stale";
|
|
3113
3335
|
if (!showScore && !m.minuteLabel && !(m.isSuspended && !m.isSettled) && !m.isSettled && !stale) return null;
|
|
3114
|
-
return /* @__PURE__ */
|
|
3115
|
-
showScore && /* @__PURE__ */
|
|
3336
|
+
return /* @__PURE__ */ jsxs43("div", { className: "ss-w-mk-live", children: [
|
|
3337
|
+
showScore && /* @__PURE__ */ jsxs43("b", { className: "ss-w-mk-live-score", children: [
|
|
3116
3338
|
m.homeTeamName,
|
|
3117
3339
|
" ",
|
|
3118
3340
|
m.homeScore,
|
|
@@ -3130,7 +3352,7 @@ function OddsLiveStrip({ m, ui }) {
|
|
|
3130
3352
|
function MatchesPanel({ monitor, ui, slip }) {
|
|
3131
3353
|
const matches = (monitor.snapshot?.matches ?? []).filter((m) => monitor.pins.some((p) => p.kind === "match" && p.matchId === m.matchId));
|
|
3132
3354
|
if (matches.length === 0) return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-empty", children: ui.emptyMatchesTab });
|
|
3133
|
-
return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-list", children: matches.map((m) => /* @__PURE__ */
|
|
3355
|
+
return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-list", children: matches.map((m) => /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-item", children: [
|
|
3134
3356
|
/* @__PURE__ */ jsx48(
|
|
3135
3357
|
MonitorMatchCard,
|
|
3136
3358
|
{
|
|
@@ -3159,7 +3381,7 @@ function OddsPanel({ monitor, ui, slip }) {
|
|
|
3159
3381
|
if (markets.length === 0) return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-empty", children: ui.emptyOddsTab });
|
|
3160
3382
|
return /* @__PURE__ */ jsx48("div", { className: "ss-w-mon-list", children: markets.map((m) => {
|
|
3161
3383
|
const pin = monitor.pins.find((p) => p.key === m.key);
|
|
3162
|
-
return /* @__PURE__ */
|
|
3384
|
+
return /* @__PURE__ */ jsxs43("div", { className: "ss-w-mon-oddspin", "data-settled": m.isSettled || void 0, children: [
|
|
3163
3385
|
/* @__PURE__ */ jsx48(OddsLiveStrip, { m, ui }),
|
|
3164
3386
|
m.card && /* @__PURE__ */ jsx48(
|
|
3165
3387
|
MarketOddsCardList,
|
|
@@ -3179,11 +3401,11 @@ function OddsPanel({ monitor, ui, slip }) {
|
|
|
3179
3401
|
}
|
|
3180
3402
|
|
|
3181
3403
|
// src/components/ChatPanel.tsx
|
|
3182
|
-
import { jsx as jsx49, jsxs as
|
|
3404
|
+
import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
3183
3405
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
3184
3406
|
function useIsModal() {
|
|
3185
|
-
const [modal, setModal] =
|
|
3186
|
-
|
|
3407
|
+
const [modal, setModal] = useState18(false);
|
|
3408
|
+
useEffect10(() => {
|
|
3187
3409
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
3188
3410
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
3189
3411
|
const sync = () => setModal(mql.matches);
|
|
@@ -3194,9 +3416,9 @@ function useIsModal() {
|
|
|
3194
3416
|
return modal;
|
|
3195
3417
|
}
|
|
3196
3418
|
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
3197
|
-
const { state, close, stop, send } = controller;
|
|
3419
|
+
const { state, close, stop, send, reset } = controller;
|
|
3198
3420
|
const isModal = useIsModal();
|
|
3199
|
-
|
|
3421
|
+
useEffect10(() => {
|
|
3200
3422
|
const onKey = (e) => {
|
|
3201
3423
|
if (e.key === "Escape") close();
|
|
3202
3424
|
};
|
|
@@ -3207,11 +3429,23 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
3207
3429
|
monitor?.setActiveTab("chat");
|
|
3208
3430
|
send(text);
|
|
3209
3431
|
};
|
|
3210
|
-
|
|
3432
|
+
useEffect10(() => {
|
|
3211
3433
|
if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
|
|
3212
3434
|
}, [monitor, state.isStreaming, state.messages.length]);
|
|
3213
|
-
return /* @__PURE__ */
|
|
3214
|
-
/* @__PURE__ */ jsx49(
|
|
3435
|
+
return /* @__PURE__ */ jsxs44("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
|
|
3436
|
+
/* @__PURE__ */ jsx49(
|
|
3437
|
+
ChatHeader,
|
|
3438
|
+
{
|
|
3439
|
+
onClose: close,
|
|
3440
|
+
closeLabel: ui.closeChat,
|
|
3441
|
+
logoUrl: ui.logoUrl,
|
|
3442
|
+
headerTitle: ui.headerTitle,
|
|
3443
|
+
onNewConversation: reset,
|
|
3444
|
+
canReset: state.messages.length > 0,
|
|
3445
|
+
newConversationLabel: ui.newConversation,
|
|
3446
|
+
moreOptionsLabel: ui.moreOptions
|
|
3447
|
+
}
|
|
3448
|
+
),
|
|
3215
3449
|
monitor && /* @__PURE__ */ jsx49(
|
|
3216
3450
|
TabBar,
|
|
3217
3451
|
{
|
|
@@ -3326,8 +3560,14 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
3326
3560
|
}
|
|
3327
3561
|
.ss-w-header { display: flex; align-items: center; gap: 8px; padding: 12px 14px; border-bottom: 1px solid var(--ss-w-line); }
|
|
3328
3562
|
.ss-w-header-mark { width: 18px; height: 18px; display: block; object-fit: contain; }
|
|
3329
|
-
.ss-w-header-title { font-weight: 660; }
|
|
3330
|
-
.ss-w-close {
|
|
3563
|
+
.ss-w-header-title { font-weight: 660; flex: 1; }
|
|
3564
|
+
.ss-w-close { background: none; border: none; color: var(--ss-w-faint); cursor: pointer; font-size: 16px; display: grid; place-items: center; }
|
|
3565
|
+
.ss-w-menu-wrap { position: relative; display: grid; place-items: center; }
|
|
3566
|
+
.ss-w-kebab { background: none; border: none; color: var(--ss-w-faint); cursor: pointer; font-size: 16px; display: grid; place-items: center; }
|
|
3567
|
+
.ss-w-menu { position: absolute; top: calc(100% + 6px); right: 0; z-index: 5; min-width: 184px; padding: 6px; background: var(--ss-w-panel); border: 1px solid var(--ss-w-line); border-radius: 12px; box-shadow: 0 8px 24px rgba(0,0,0,.18); }
|
|
3568
|
+
.ss-w-menu-item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 10px; background: none; border: none; border-radius: 8px; color: var(--ss-w-ink); font: inherit; font-size: 13px; text-align: left; cursor: pointer; }
|
|
3569
|
+
.ss-w-menu-item:hover, .ss-w-menu-item:focus-visible { background: var(--ss-w-bubble); }
|
|
3570
|
+
.ss-w-menu-item svg { color: var(--ss-w-faint); font-size: 15px; flex: none; }
|
|
3331
3571
|
|
|
3332
3572
|
/* messages */
|
|
3333
3573
|
/* .ss-w-mon-list (Matches/Odds tab scrollers) shares .ss-w-list's box/scroll rules by design --
|
|
@@ -4069,12 +4309,13 @@ function StatsWidget(props) {
|
|
|
4069
4309
|
const cfg = props.config;
|
|
4070
4310
|
const built = useMemo2(() => buildClient(props), [injectedClient, cfg?.operatorId, cfg?.publicKey, cfg?.baseUrl]);
|
|
4071
4311
|
const ui = useMemo2(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
|
|
4072
|
-
const rootRef =
|
|
4073
|
-
const introDoneRef =
|
|
4312
|
+
const rootRef = useRef8(null);
|
|
4313
|
+
const introDoneRef = useRef8(false);
|
|
4074
4314
|
const markIntroDone = useCallback5(() => {
|
|
4075
4315
|
introDoneRef.current = true;
|
|
4076
4316
|
}, []);
|
|
4077
|
-
const
|
|
4317
|
+
const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
|
|
4318
|
+
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
|
|
4078
4319
|
const monitor = useLiveMonitor({
|
|
4079
4320
|
getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
|
|
4080
4321
|
getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
|
|
@@ -4108,7 +4349,7 @@ function StatsWidget(props) {
|
|
|
4108
4349
|
() => built ? createDashboardTapSignal((input) => built.conversation.sendSignal(input)) : void 0,
|
|
4109
4350
|
[built]
|
|
4110
4351
|
);
|
|
4111
|
-
|
|
4352
|
+
useEffect11(() => {
|
|
4112
4353
|
if (!built || !ui.injectStyles) return;
|
|
4113
4354
|
const node = rootRef.current?.getRootNode();
|
|
4114
4355
|
if (node) injectStyles(node);
|