@burdenoff/microfe-atheletebridge 2026.705.1 → 2026.706.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/atheletebridge/AthleteBridgeRoot.js +55 -39
- package/dist/atheletebridge/AthleteBridgeRoot.js.map +1 -1
- package/dist/atheletebridge/AthleteBridgeRoutes.js +18 -6
- package/dist/atheletebridge/AthleteBridgeRoutes.js.map +1 -1
- package/dist/atheletebridge/components/Crest.js +70 -0
- package/dist/atheletebridge/components/Crest.js.map +1 -0
- package/dist/atheletebridge/components/FixtureCard.js +8 -72
- package/dist/atheletebridge/components/FixtureCard.js.map +1 -1
- package/dist/atheletebridge/components/MatchupRow.js +74 -0
- package/dist/atheletebridge/components/MatchupRow.js.map +1 -0
- package/dist/atheletebridge/components/MetricsCard.js +61 -21
- package/dist/atheletebridge/components/MetricsCard.js.map +1 -1
- package/dist/atheletebridge/components/ProgramCard.js +75 -43
- package/dist/atheletebridge/components/ProgramCard.js.map +1 -1
- package/dist/atheletebridge/components/Scoreboard.js +163 -0
- package/dist/atheletebridge/components/Scoreboard.js.map +1 -0
- package/dist/atheletebridge/components/SessionCard.js +64 -41
- package/dist/atheletebridge/components/SessionCard.js.map +1 -1
- package/dist/atheletebridge/components/SessionStatusTimeline.js +80 -0
- package/dist/atheletebridge/components/SessionStatusTimeline.js.map +1 -0
- package/dist/atheletebridge/components/StatusBadge.js +5 -5
- package/dist/atheletebridge/components/StatusBadge.js.map +1 -1
- package/dist/atheletebridge/components/TeamCard.js +65 -35
- package/dist/atheletebridge/components/TeamCard.js.map +1 -1
- package/dist/atheletebridge/components/UserAvatar.js +33 -0
- package/dist/atheletebridge/components/UserAvatar.js.map +1 -0
- package/dist/atheletebridge/components/domain.js +5 -2
- package/dist/atheletebridge/components/domain.js.map +1 -1
- package/dist/atheletebridge/components/viz/AvatarStack.js +2 -0
- package/dist/atheletebridge/components/viz/BarChart.js +83 -0
- package/dist/atheletebridge/components/viz/BarChart.js.map +1 -0
- package/dist/atheletebridge/components/viz/DonutChart.js +109 -0
- package/dist/atheletebridge/components/viz/DonutChart.js.map +1 -0
- package/dist/atheletebridge/components/viz/LineChart.js +123 -0
- package/dist/atheletebridge/components/viz/LineChart.js.map +1 -0
- package/dist/atheletebridge/components/viz/ProgressRing.js +6 -0
- package/dist/atheletebridge/components/viz/ProgressRing.js.map +1 -0
- package/dist/atheletebridge/components/viz/RatingStars.js +92 -0
- package/dist/atheletebridge/components/viz/RatingStars.js.map +1 -0
- package/dist/atheletebridge/components/viz/Sparkline.js +74 -0
- package/dist/atheletebridge/components/viz/Sparkline.js.map +1 -0
- package/dist/atheletebridge/components/viz/StatCard.js +60 -0
- package/dist/atheletebridge/components/viz/StatCard.js.map +1 -0
- package/dist/atheletebridge/components/viz/StepProgress.js +3 -0
- package/dist/atheletebridge/components/viz/Timeline.js +66 -0
- package/dist/atheletebridge/components/viz/Timeline.js.map +1 -0
- package/dist/atheletebridge/components/viz/index.js +13 -0
- package/dist/atheletebridge/components/viz/lib/Avatar.js +1 -0
- package/dist/atheletebridge/components/viz/lib/CartesianFrame.js +119 -0
- package/dist/atheletebridge/components/viz/lib/CartesianFrame.js.map +1 -0
- package/dist/atheletebridge/components/viz/lib/ResponsiveSvg.js +35 -0
- package/dist/atheletebridge/components/viz/lib/ResponsiveSvg.js.map +1 -0
- package/dist/atheletebridge/components/viz/lib/format.js +17 -0
- package/dist/atheletebridge/components/viz/lib/format.js.map +1 -0
- package/dist/atheletebridge/components/viz/lib/geometry.js +61 -0
- package/dist/atheletebridge/components/viz/lib/geometry.js.map +1 -0
- package/dist/atheletebridge/components/viz/lib/hooks.js +39 -0
- package/dist/atheletebridge/components/viz/lib/hooks.js.map +1 -0
- package/dist/atheletebridge/components/viz/lib/palette.js +27 -0
- package/dist/atheletebridge/components/viz/lib/palette.js.map +1 -0
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +369 -163
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
- package/dist/atheletebridge/pages/DashboardPage.js +182 -117
- package/dist/atheletebridge/pages/DashboardPage.js.map +1 -1
- package/dist/atheletebridge/pages/StandingsPage.js +119 -95
- package/dist/atheletebridge/pages/StandingsPage.js.map +1 -1
- package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.js +372 -0
- package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.js.map +1 -0
- package/dist/atheletebridge/pages/athletes/AthleteProfilePage.js +511 -0
- package/dist/atheletebridge/pages/athletes/AthleteProfilePage.js.map +1 -0
- package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js +120 -131
- package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js.map +1 -1
- package/dist/atheletebridge/pages/fixtures/FixtureFormPage.js +264 -176
- package/dist/atheletebridge/pages/fixtures/FixtureFormPage.js.map +1 -1
- package/dist/atheletebridge/pages/fixtures/FixturesListPage.js +84 -47
- package/dist/atheletebridge/pages/fixtures/FixturesListPage.js.map +1 -1
- package/dist/atheletebridge/pages/performance/PerformancePage.js +435 -284
- package/dist/atheletebridge/pages/performance/PerformancePage.js.map +1 -1
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +188 -124
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -1
- package/dist/atheletebridge/pages/programs/ProgramsListPage.js +56 -39
- package/dist/atheletebridge/pages/programs/ProgramsListPage.js.map +1 -1
- package/dist/atheletebridge/pages/sessions/SessionDetailPage.js +268 -139
- package/dist/atheletebridge/pages/sessions/SessionDetailPage.js.map +1 -1
- package/dist/atheletebridge/pages/sessions/SessionFormPage.js +254 -162
- package/dist/atheletebridge/pages/sessions/SessionFormPage.js.map +1 -1
- package/dist/atheletebridge/pages/sessions/SessionsListPage.js +38 -36
- package/dist/atheletebridge/pages/sessions/SessionsListPage.js.map +1 -1
- package/dist/atheletebridge/pages/teams/TeamDetailPage.js +437 -189
- package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -1
- package/dist/atheletebridge/pages/teams/TeamFormPage.js +368 -177
- package/dist/atheletebridge/pages/teams/TeamFormPage.js.map +1 -1
- package/dist/atheletebridge/pages/teams/TeamsListPage.js +3 -0
- package/dist/atheletebridge/pages/teams/TeamsListPage.js.map +1 -1
- package/dist/atheletebridge/pages/tournaments/TournamentBracketPage.js +298 -0
- package/dist/atheletebridge/pages/tournaments/TournamentBracketPage.js.map +1 -0
- package/dist/atheletebridge/utils/identity.js +31 -0
- package/dist/atheletebridge/utils/identity.js.map +1 -0
- package/dist/atheletebridge/utils/timeAgo.js +20 -0
- package/dist/atheletebridge/utils/timeAgo.js.map +1 -0
- package/dist/atheletebridge/utils/url.js +17 -0
- package/dist/atheletebridge/utils/url.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,194 +1,183 @@
|
|
|
1
1
|
import { useAthleteBridge as e } from "../../context/AthleteBridgeContext.js";
|
|
2
2
|
import { PageLayout as t } from "../../components/PageLayout.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { FIXTURE_TYPE_LABELS as n } from "../../components/domain.js";
|
|
4
|
+
import { Crest as r } from "../../components/Crest.js";
|
|
5
|
+
import { Scoreboard as i } from "../../components/Scoreboard.js";
|
|
6
6
|
import { ErrorState as a, LoadingState as o } from "../../components/LoadingState.js";
|
|
7
7
|
import { useFixture as s, useRecordFixtureResult as c } from "../../hooks/useAthleteBridgeApi.js";
|
|
8
8
|
import { FormField as l, fieldInputClass as u } from "../../components/form.js";
|
|
9
9
|
import { useState as d } from "react";
|
|
10
|
-
import { ArrowLeft as f,
|
|
11
|
-
import { useParams as
|
|
12
|
-
import { jsx as
|
|
13
|
-
import { EmphasisPanel as
|
|
10
|
+
import { ArrowLeft as f, Flag as p, Loader2 as m, Minus as h, Trophy as g } from "lucide-react";
|
|
11
|
+
import { useParams as _ } from "react-router-dom";
|
|
12
|
+
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
13
|
+
import { EmphasisPanel as b, GlassCard as x } from "@burdenoff/fe-libs/ui";
|
|
14
14
|
//#region src/atheletebridge/pages/fixtures/FixtureDetailPage.tsx
|
|
15
|
-
function
|
|
16
|
-
let { id:
|
|
17
|
-
if (
|
|
15
|
+
function S() {
|
|
16
|
+
let { id: S } = _(), { navigateTo: C } = e(), w = s(S), T = c(), [E, D] = d(""), [O, k] = d(""), [A, j] = d(null);
|
|
17
|
+
if (w.isLoading) return /* @__PURE__ */ v(t, {
|
|
18
18
|
title: "Fixture",
|
|
19
|
-
children: /* @__PURE__ */
|
|
19
|
+
children: /* @__PURE__ */ v(o, { label: "Loading fixture…" })
|
|
20
20
|
});
|
|
21
|
-
if (
|
|
21
|
+
if (w.isError || !w.data) return /* @__PURE__ */ v(t, {
|
|
22
22
|
title: "Fixture",
|
|
23
|
-
children: /* @__PURE__ */
|
|
23
|
+
children: /* @__PURE__ */ v(a, {
|
|
24
24
|
title: "Fixture not found",
|
|
25
25
|
message: "This fixture does not exist or you do not have access to it.",
|
|
26
|
-
onRetry: () =>
|
|
26
|
+
onRetry: () => C("/fixtures")
|
|
27
27
|
})
|
|
28
28
|
});
|
|
29
|
-
let
|
|
30
|
-
return /* @__PURE__ */
|
|
31
|
-
title: `${
|
|
32
|
-
description: `${
|
|
33
|
-
actions: /* @__PURE__ */
|
|
29
|
+
let M = w.data, N = M.homeTeam?.name ?? "Home", P = M.awayTeam?.name ?? (M.awayTeamId ? "Away" : "TBD"), F = !!M.awayTeamId && (M.status === "SCHEDULED" || M.status === "LIVE");
|
|
30
|
+
return /* @__PURE__ */ y(t, {
|
|
31
|
+
title: `${N} vs ${P}`,
|
|
32
|
+
description: `${n[M.type]}${M.competition ? ` · ${M.competition}` : ""}`,
|
|
33
|
+
actions: /* @__PURE__ */ y("button", {
|
|
34
34
|
type: "button",
|
|
35
|
-
onClick: () =>
|
|
35
|
+
onClick: () => C("/fixtures"),
|
|
36
36
|
className: "inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken",
|
|
37
|
-
children: [/* @__PURE__ */
|
|
37
|
+
children: [/* @__PURE__ */ v(f, { className: "h-4 w-4" }), " Back"]
|
|
38
38
|
}),
|
|
39
39
|
children: [
|
|
40
|
-
/* @__PURE__ */
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
className: "mb-8
|
|
44
|
-
children: [
|
|
45
|
-
/* @__PURE__ */ y("div", {
|
|
46
|
-
className: "mb-4 flex items-center justify-center",
|
|
47
|
-
children: /* @__PURE__ */ y(n, { status: N.status })
|
|
48
|
-
}),
|
|
49
|
-
/* @__PURE__ */ b("div", {
|
|
50
|
-
className: "flex items-center justify-center gap-6",
|
|
51
|
-
children: [
|
|
52
|
-
/* @__PURE__ */ y("span", {
|
|
53
|
-
className: "flex-1 text-right text-lg font-semibold text-text-primary",
|
|
54
|
-
children: F
|
|
55
|
-
}),
|
|
56
|
-
/* @__PURE__ */ y("span", {
|
|
57
|
-
className: "rounded-xl bg-bg-sunken px-5 py-2 text-3xl font-bold tabular-nums text-text-primary",
|
|
58
|
-
children: P ? `${N.homeScore} : ${N.awayScore}` : "vs"
|
|
59
|
-
}),
|
|
60
|
-
/* @__PURE__ */ y("span", {
|
|
61
|
-
className: "flex-1 text-left text-lg font-semibold text-text-primary",
|
|
62
|
-
children: I
|
|
63
|
-
})
|
|
64
|
-
]
|
|
65
|
-
}),
|
|
66
|
-
/* @__PURE__ */ b("div", {
|
|
67
|
-
className: "mt-6 flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm text-text-secondary",
|
|
68
|
-
children: [
|
|
69
|
-
/* @__PURE__ */ b("span", {
|
|
70
|
-
className: "flex items-center gap-1.5",
|
|
71
|
-
children: [
|
|
72
|
-
/* @__PURE__ */ y(p, { className: "h-4 w-4" }),
|
|
73
|
-
" ",
|
|
74
|
-
i(N.scheduledAt)
|
|
75
|
-
]
|
|
76
|
-
}),
|
|
77
|
-
N.venue && /* @__PURE__ */ b("span", {
|
|
78
|
-
className: "flex items-center gap-1.5",
|
|
79
|
-
children: [
|
|
80
|
-
/* @__PURE__ */ y(g, { className: "h-4 w-4" }),
|
|
81
|
-
" ",
|
|
82
|
-
N.venue
|
|
83
|
-
]
|
|
84
|
-
}),
|
|
85
|
-
N.round && /* @__PURE__ */ y("span", { children: N.round })
|
|
86
|
-
]
|
|
87
|
-
})
|
|
88
|
-
]
|
|
40
|
+
/* @__PURE__ */ v(i, {
|
|
41
|
+
fixture: M,
|
|
42
|
+
variant: "hero",
|
|
43
|
+
className: "mb-8"
|
|
89
44
|
}),
|
|
90
|
-
|
|
45
|
+
M.notes && /* @__PURE__ */ y(b, {
|
|
91
46
|
className: "mb-8",
|
|
92
|
-
children: [/* @__PURE__ */
|
|
47
|
+
children: [/* @__PURE__ */ v("h2", {
|
|
93
48
|
className: "mb-2 text-sm font-semibold text-text-primary",
|
|
94
49
|
children: "Notes"
|
|
95
|
-
}), /* @__PURE__ */
|
|
50
|
+
}), /* @__PURE__ */ v("p", {
|
|
96
51
|
className: "text-sm text-text-secondary",
|
|
97
|
-
children:
|
|
52
|
+
children: M.notes
|
|
98
53
|
})]
|
|
99
54
|
}),
|
|
100
|
-
|
|
55
|
+
F && /* @__PURE__ */ y("section", {
|
|
101
56
|
className: "mb-8",
|
|
102
|
-
children: [/* @__PURE__ */
|
|
57
|
+
children: [/* @__PURE__ */ y("h2", {
|
|
103
58
|
className: "mb-4 flex items-center gap-2 text-lg font-semibold text-text-primary",
|
|
104
|
-
children: [/* @__PURE__ */
|
|
105
|
-
}), /* @__PURE__ */
|
|
59
|
+
children: [/* @__PURE__ */ v(p, { className: "h-5 w-5" }), " Record result"]
|
|
60
|
+
}), /* @__PURE__ */ y(x, {
|
|
106
61
|
treatment: "insight",
|
|
107
|
-
className: "p-6",
|
|
62
|
+
className: "p-5 sm:p-6",
|
|
108
63
|
children: [
|
|
109
|
-
/* @__PURE__ */
|
|
110
|
-
className: "mb-
|
|
64
|
+
/* @__PURE__ */ y("p", {
|
|
65
|
+
className: "mb-5 text-sm text-text-secondary",
|
|
111
66
|
children: [
|
|
112
67
|
"Recording a final score marks this fixture ",
|
|
113
|
-
/* @__PURE__ */
|
|
68
|
+
/* @__PURE__ */ v("strong", { children: "Completed" }),
|
|
114
69
|
" and recomputes the competition standings for both teams."
|
|
115
70
|
]
|
|
116
71
|
}),
|
|
117
|
-
/* @__PURE__ */
|
|
72
|
+
/* @__PURE__ */ y("form", {
|
|
118
73
|
onSubmit: async (e) => {
|
|
119
|
-
if (e.preventDefault(),
|
|
120
|
-
let t = Number.parseInt(
|
|
74
|
+
if (e.preventDefault(), j(null), !S) return;
|
|
75
|
+
let t = Number.parseInt(E, 10), n = Number.parseInt(O, 10);
|
|
121
76
|
if (Number.isNaN(t) || Number.isNaN(n)) {
|
|
122
|
-
|
|
77
|
+
j("Both scores are required and must be numbers.");
|
|
123
78
|
return;
|
|
124
79
|
}
|
|
125
80
|
if (t < 0 || n < 0) {
|
|
126
|
-
|
|
81
|
+
j("Scores cannot be negative.");
|
|
127
82
|
return;
|
|
128
83
|
}
|
|
129
84
|
try {
|
|
130
|
-
await
|
|
131
|
-
id:
|
|
85
|
+
await T.mutateAsync({
|
|
86
|
+
id: S,
|
|
132
87
|
input: {
|
|
133
88
|
homeScore: t,
|
|
134
89
|
awayScore: n
|
|
135
90
|
}
|
|
136
|
-
}),
|
|
91
|
+
}), D(""), k("");
|
|
137
92
|
} catch (e) {
|
|
138
|
-
|
|
93
|
+
j(e instanceof Error ? e.message : "Failed to record result.");
|
|
139
94
|
}
|
|
140
95
|
},
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
96
|
+
children: [/* @__PURE__ */ y("div", {
|
|
97
|
+
className: "flex flex-wrap items-end justify-center gap-4 sm:gap-6",
|
|
98
|
+
children: [
|
|
99
|
+
/* @__PURE__ */ y("div", {
|
|
100
|
+
className: "flex items-end gap-3",
|
|
101
|
+
children: [/* @__PURE__ */ y("div", {
|
|
102
|
+
className: "flex flex-col items-center gap-2",
|
|
103
|
+
children: [/* @__PURE__ */ v(r, {
|
|
104
|
+
name: N,
|
|
105
|
+
sport: M.homeTeam?.sport,
|
|
106
|
+
size: 40
|
|
107
|
+
}), /* @__PURE__ */ v("span", {
|
|
108
|
+
className: "max-w-[8rem] truncate text-center text-xs font-medium text-text-secondary",
|
|
109
|
+
children: N
|
|
110
|
+
})]
|
|
111
|
+
}), /* @__PURE__ */ v(l, {
|
|
112
|
+
label: "Home",
|
|
113
|
+
htmlFor: "homeScore",
|
|
114
|
+
className: "w-24",
|
|
115
|
+
children: /* @__PURE__ */ v("input", {
|
|
116
|
+
id: "homeScore",
|
|
117
|
+
inputMode: "numeric",
|
|
118
|
+
className: `${u} text-center text-lg font-bold tabular-nums`,
|
|
119
|
+
value: E,
|
|
120
|
+
onChange: (e) => D(e.target.value),
|
|
121
|
+
placeholder: "0"
|
|
122
|
+
})
|
|
123
|
+
})]
|
|
124
|
+
}),
|
|
125
|
+
/* @__PURE__ */ v(h, {
|
|
126
|
+
className: "mb-3 h-5 w-5 shrink-0 text-text-muted",
|
|
127
|
+
"aria-hidden": "true"
|
|
128
|
+
}),
|
|
129
|
+
/* @__PURE__ */ y("div", {
|
|
130
|
+
className: "flex items-end gap-3",
|
|
131
|
+
children: [/* @__PURE__ */ v(l, {
|
|
132
|
+
label: "Away",
|
|
133
|
+
htmlFor: "awayScore",
|
|
134
|
+
className: "w-24",
|
|
135
|
+
children: /* @__PURE__ */ v("input", {
|
|
136
|
+
id: "awayScore",
|
|
137
|
+
inputMode: "numeric",
|
|
138
|
+
className: `${u} text-center text-lg font-bold tabular-nums`,
|
|
139
|
+
value: O,
|
|
140
|
+
onChange: (e) => k(e.target.value),
|
|
141
|
+
placeholder: "0"
|
|
142
|
+
})
|
|
143
|
+
}), /* @__PURE__ */ y("div", {
|
|
144
|
+
className: "flex flex-col items-center gap-2",
|
|
145
|
+
children: [/* @__PURE__ */ v(r, {
|
|
146
|
+
name: P,
|
|
147
|
+
sport: M.awayTeam?.sport,
|
|
148
|
+
size: 40
|
|
149
|
+
}), /* @__PURE__ */ v("span", {
|
|
150
|
+
className: "max-w-[8rem] truncate text-center text-xs font-medium text-text-secondary",
|
|
151
|
+
children: P
|
|
152
|
+
})]
|
|
153
|
+
})]
|
|
167
154
|
})
|
|
168
|
-
|
|
169
|
-
|
|
155
|
+
]
|
|
156
|
+
}), /* @__PURE__ */ v("div", {
|
|
157
|
+
className: "mt-6 flex justify-center",
|
|
158
|
+
children: /* @__PURE__ */ y("button", {
|
|
170
159
|
type: "submit",
|
|
171
|
-
disabled:
|
|
172
|
-
className: "inline-flex
|
|
173
|
-
children: [
|
|
160
|
+
disabled: T.isPending,
|
|
161
|
+
className: "inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-6 py-2.5 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90 disabled:opacity-60",
|
|
162
|
+
children: [T.isPending ? /* @__PURE__ */ v(m, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ v(g, { className: "h-4 w-4" }), "Record result"]
|
|
174
163
|
})
|
|
175
|
-
]
|
|
164
|
+
})]
|
|
176
165
|
}),
|
|
177
|
-
|
|
178
|
-
className: "mt-3 text-sm text-status-error-text",
|
|
179
|
-
children:
|
|
166
|
+
A && /* @__PURE__ */ v("p", {
|
|
167
|
+
className: "mt-3 text-center text-sm text-status-error-text",
|
|
168
|
+
children: A
|
|
180
169
|
})
|
|
181
170
|
]
|
|
182
171
|
})]
|
|
183
172
|
}),
|
|
184
|
-
|
|
173
|
+
M.competition && /* @__PURE__ */ y("button", {
|
|
185
174
|
type: "button",
|
|
186
|
-
onClick: () =>
|
|
175
|
+
onClick: () => C(`/standings?competition=${encodeURIComponent(M.competition ?? "")}`),
|
|
187
176
|
className: "inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken",
|
|
188
177
|
children: [
|
|
189
|
-
/* @__PURE__ */
|
|
178
|
+
/* @__PURE__ */ v(g, { className: "h-4 w-4" }),
|
|
190
179
|
" View ",
|
|
191
|
-
|
|
180
|
+
M.competition,
|
|
192
181
|
" standings"
|
|
193
182
|
]
|
|
194
183
|
})
|
|
@@ -196,6 +185,6 @@ function C() {
|
|
|
196
185
|
});
|
|
197
186
|
}
|
|
198
187
|
//#endregion
|
|
199
|
-
export {
|
|
188
|
+
export { S as FixtureDetailPage };
|
|
200
189
|
|
|
201
190
|
//# sourceMappingURL=FixtureDetailPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FixtureDetailPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/fixtures/FixtureDetailPage.tsx"],"sourcesContent":["/**\n * Fixture Detail\n * @module atheletebridge/pages/fixtures\n *\n * Reads a single fixture (athFixture) and lets the user record a final result\n * (athRecordFixtureResult) which marks it COMPLETED and recomputes standings.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { ArrowLeft, CalendarClock, MapPin, Trophy, Loader2, Flag } from 'lucide-react';\nimport { GlassCard, EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { LoadingState, ErrorState } from '../../components/LoadingState';\nimport { FormField, fieldInputClass } from '../../components/form';\nimport { FIXTURE_TYPE_LABELS } from '../../components/domain';\nimport { formatDate } from '../../utils/formatters';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { useFixture, useRecordFixtureResult } from '../../hooks/useAthleteBridgeApi';\n\nexport function FixtureDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useAthleteBridge();\n\n const fixture = useFixture(id);\n const recordResult = useRecordFixtureResult();\n\n const [homeScore, setHomeScore] = useState('');\n const [awayScore, setAwayScore] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n if (fixture.isLoading) {\n return (\n <PageLayout title=\"Fixture\">\n <LoadingState label=\"Loading fixture…\" />\n </PageLayout>\n );\n }\n\n if (fixture.isError || !fixture.data) {\n return (\n <PageLayout title=\"Fixture\">\n <ErrorState\n title=\"Fixture not found\"\n message=\"This fixture does not exist or you do not have access to it.\"\n onRetry={() => navigateTo('/fixtures')}\n />\n </PageLayout>\n );\n }\n\n const f = fixture.data;\n const hasScore = f.homeScore !== null && f.awayScore !== null;\n const homeName = f.homeTeam?.name ?? 'Home';\n const awayName = f.awayTeam?.name ?? (f.awayTeamId ? 'Away' : 'TBD');\n const canRecordResult =\n Boolean(f.awayTeamId) && (f.status === 'SCHEDULED' || f.status === 'LIVE');\n\n const handleRecord = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n if (!id) return;\n const home = Number.parseInt(homeScore, 10);\n const away = Number.parseInt(awayScore, 10);\n if (Number.isNaN(home) || Number.isNaN(away)) {\n setError('Both scores are required and must be numbers.');\n return;\n }\n if (home < 0 || away < 0) {\n setError('Scores cannot be negative.');\n return;\n }\n try {\n await recordResult.mutateAsync({ id, input: { homeScore: home, awayScore: away } });\n setHomeScore('');\n setAwayScore('');\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to record result.');\n }\n };\n\n return (\n <PageLayout\n title={`${homeName} vs ${awayName}`}\n description={`${FIXTURE_TYPE_LABELS[f.type]}${f.competition ? ` · ${f.competition}` : ''}`}\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/fixtures')}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n }\n >\n {/* Scoreboard */}\n <GlassCard treatment=\"glass\" glow className=\"mb-8 p-8\">\n <div className=\"mb-4 flex items-center justify-center\">\n <StatusBadge status={f.status} />\n </div>\n <div className=\"flex items-center justify-center gap-6\">\n <span className=\"flex-1 text-right text-lg font-semibold text-text-primary\">\n {homeName}\n </span>\n <span className=\"rounded-xl bg-bg-sunken px-5 py-2 text-3xl font-bold tabular-nums text-text-primary\">\n {hasScore ? `${f.homeScore} : ${f.awayScore}` : 'vs'}\n </span>\n <span className=\"flex-1 text-left text-lg font-semibold text-text-primary\">\n {awayName}\n </span>\n </div>\n <div className=\"mt-6 flex flex-wrap items-center justify-center gap-x-6 gap-y-2 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1.5\">\n <CalendarClock className=\"h-4 w-4\" /> {formatDate(f.scheduledAt)}\n </span>\n {f.venue && (\n <span className=\"flex items-center gap-1.5\">\n <MapPin className=\"h-4 w-4\" /> {f.venue}\n </span>\n )}\n {f.round && <span>{f.round}</span>}\n </div>\n </GlassCard>\n\n {f.notes && (\n <EmphasisPanel className=\"mb-8\">\n <h2 className=\"mb-2 text-sm font-semibold text-text-primary\">Notes</h2>\n <p className=\"text-sm text-text-secondary\">{f.notes}</p>\n </EmphasisPanel>\n )}\n\n {/* Record result */}\n {canRecordResult && (\n <section className=\"mb-8\">\n <h2 className=\"mb-4 flex items-center gap-2 text-lg font-semibold text-text-primary\">\n <Flag className=\"h-5 w-5\" /> Record result\n </h2>\n <GlassCard treatment=\"insight\" className=\"p-6\">\n <p className=\"mb-4 text-sm text-text-secondary\">\n Recording a final score marks this fixture <strong>Completed</strong> and recomputes\n the competition standings for both teams.\n </p>\n <form onSubmit={handleRecord} className=\"flex flex-wrap items-end gap-4\">\n <FormField label={`${homeName} score`} htmlFor=\"homeScore\" className=\"w-32\">\n <input\n id=\"homeScore\"\n inputMode=\"numeric\"\n className={fieldInputClass}\n value={homeScore}\n onChange={(e) => setHomeScore(e.target.value)}\n placeholder=\"0\"\n />\n </FormField>\n <FormField label={`${awayName} score`} htmlFor=\"awayScore\" className=\"w-32\">\n <input\n id=\"awayScore\"\n inputMode=\"numeric\"\n className={fieldInputClass}\n value={awayScore}\n onChange={(e) => setAwayScore(e.target.value)}\n placeholder=\"0\"\n />\n </FormField>\n <button\n type=\"submit\"\n disabled={recordResult.isPending}\n className=\"inline-flex h-[38px] items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90 disabled:opacity-60\"\n >\n {recordResult.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trophy className=\"h-4 w-4\" />\n )}\n Record\n </button>\n </form>\n {error && <p className=\"mt-3 text-sm text-status-error-text\">{error}</p>}\n </GlassCard>\n </section>\n )}\n\n {f.competition && (\n <button\n type=\"button\"\n onClick={() =>\n navigateTo(`/standings?competition=${encodeURIComponent(f.competition ?? '')}`)\n }\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <Trophy className=\"h-4 w-4\" /> View {f.competition} standings\n </button>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FixtureDetailPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/fixtures/FixtureDetailPage.tsx"],"sourcesContent":["/**\n * Fixture Detail\n * @module atheletebridge/pages/fixtures\n *\n * Reads a single fixture (athFixture) and lets the user record a final result\n * (athRecordFixtureResult) which marks it COMPLETED and recomputes standings.\n *\n * The header is a crest-vs-crest Scoreboard hero; the record-result panel shows\n * each team's crest beside its score input. Semantic tokens only, responsive.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { ArrowLeft, Trophy, Loader2, Flag, Minus } from 'lucide-react';\nimport { GlassCard, EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { Scoreboard } from '../../components/Scoreboard';\nimport { Crest } from '../../components/Crest';\nimport { LoadingState, ErrorState } from '../../components/LoadingState';\nimport { FormField, fieldInputClass } from '../../components/form';\nimport { FIXTURE_TYPE_LABELS } from '../../components/domain';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { useFixture, useRecordFixtureResult } from '../../hooks/useAthleteBridgeApi';\n\nexport function FixtureDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useAthleteBridge();\n\n const fixture = useFixture(id);\n const recordResult = useRecordFixtureResult();\n\n const [homeScore, setHomeScore] = useState('');\n const [awayScore, setAwayScore] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n if (fixture.isLoading) {\n return (\n <PageLayout title=\"Fixture\">\n <LoadingState label=\"Loading fixture…\" />\n </PageLayout>\n );\n }\n\n if (fixture.isError || !fixture.data) {\n return (\n <PageLayout title=\"Fixture\">\n <ErrorState\n title=\"Fixture not found\"\n message=\"This fixture does not exist or you do not have access to it.\"\n onRetry={() => navigateTo('/fixtures')}\n />\n </PageLayout>\n );\n }\n\n const f = fixture.data;\n const homeName = f.homeTeam?.name ?? 'Home';\n const awayName = f.awayTeam?.name ?? (f.awayTeamId ? 'Away' : 'TBD');\n const canRecordResult =\n Boolean(f.awayTeamId) && (f.status === 'SCHEDULED' || f.status === 'LIVE');\n\n const handleRecord = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n if (!id) return;\n const home = Number.parseInt(homeScore, 10);\n const away = Number.parseInt(awayScore, 10);\n if (Number.isNaN(home) || Number.isNaN(away)) {\n setError('Both scores are required and must be numbers.');\n return;\n }\n if (home < 0 || away < 0) {\n setError('Scores cannot be negative.');\n return;\n }\n try {\n await recordResult.mutateAsync({ id, input: { homeScore: home, awayScore: away } });\n setHomeScore('');\n setAwayScore('');\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to record result.');\n }\n };\n\n return (\n <PageLayout\n title={`${homeName} vs ${awayName}`}\n description={`${FIXTURE_TYPE_LABELS[f.type]}${f.competition ? ` · ${f.competition}` : ''}`}\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/fixtures')}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n }\n >\n {/* Crest-vs-crest hero scoreboard */}\n <Scoreboard fixture={f} variant=\"hero\" className=\"mb-8\" />\n\n {f.notes && (\n <EmphasisPanel className=\"mb-8\">\n <h2 className=\"mb-2 text-sm font-semibold text-text-primary\">Notes</h2>\n <p className=\"text-sm text-text-secondary\">{f.notes}</p>\n </EmphasisPanel>\n )}\n\n {/* Record result */}\n {canRecordResult && (\n <section className=\"mb-8\">\n <h2 className=\"mb-4 flex items-center gap-2 text-lg font-semibold text-text-primary\">\n <Flag className=\"h-5 w-5\" /> Record result\n </h2>\n <GlassCard treatment=\"insight\" className=\"p-5 sm:p-6\">\n <p className=\"mb-5 text-sm text-text-secondary\">\n Recording a final score marks this fixture <strong>Completed</strong> and recomputes\n the competition standings for both teams.\n </p>\n <form onSubmit={handleRecord}>\n <div className=\"flex flex-wrap items-end justify-center gap-4 sm:gap-6\">\n <div className=\"flex items-end gap-3\">\n <div className=\"flex flex-col items-center gap-2\">\n <Crest name={homeName} sport={f.homeTeam?.sport} size={40} />\n <span className=\"max-w-[8rem] truncate text-center text-xs font-medium text-text-secondary\">\n {homeName}\n </span>\n </div>\n <FormField label=\"Home\" htmlFor=\"homeScore\" className=\"w-24\">\n <input\n id=\"homeScore\"\n inputMode=\"numeric\"\n className={`${fieldInputClass} text-center text-lg font-bold tabular-nums`}\n value={homeScore}\n onChange={(e) => setHomeScore(e.target.value)}\n placeholder=\"0\"\n />\n </FormField>\n </div>\n\n <Minus className=\"mb-3 h-5 w-5 shrink-0 text-text-muted\" aria-hidden=\"true\" />\n\n <div className=\"flex items-end gap-3\">\n <FormField label=\"Away\" htmlFor=\"awayScore\" className=\"w-24\">\n <input\n id=\"awayScore\"\n inputMode=\"numeric\"\n className={`${fieldInputClass} text-center text-lg font-bold tabular-nums`}\n value={awayScore}\n onChange={(e) => setAwayScore(e.target.value)}\n placeholder=\"0\"\n />\n </FormField>\n <div className=\"flex flex-col items-center gap-2\">\n <Crest name={awayName} sport={f.awayTeam?.sport} size={40} />\n <span className=\"max-w-[8rem] truncate text-center text-xs font-medium text-text-secondary\">\n {awayName}\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"mt-6 flex justify-center\">\n <button\n type=\"submit\"\n disabled={recordResult.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-6 py-2.5 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90 disabled:opacity-60\"\n >\n {recordResult.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Trophy className=\"h-4 w-4\" />\n )}\n Record result\n </button>\n </div>\n </form>\n {error && <p className=\"mt-3 text-center text-sm text-status-error-text\">{error}</p>}\n </GlassCard>\n </section>\n )}\n\n {f.competition && (\n <button\n type=\"button\"\n onClick={() =>\n navigateTo(`/standings?competition=${encodeURIComponent(f.competition ?? '')}`)\n }\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <Trophy className=\"h-4 w-4\" /> View {f.competition} standings\n </button>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAwBA,SAAgB,IAAoB;CAClC,IAAM,EAAE,UAAO,GAA2B,EACpC,EAAE,kBAAe,GAAkB,EAEnC,IAAU,EAAW,EAAG,EACxB,IAAe,GAAwB,EAEvC,CAAC,GAAW,KAAgB,EAAS,GAAG,EACxC,CAAC,GAAW,KAAgB,EAAS,GAAG,EACxC,CAAC,GAAO,KAAY,EAAwB,KAAK;AAEvD,KAAI,EAAQ,UACV,QACE,kBAAC,GAAD;EAAY,OAAM;YAChB,kBAAC,GAAD,EAAc,OAAM,oBAAqB,CAAA;EAC9B,CAAA;AAIjB,KAAI,EAAQ,WAAW,CAAC,EAAQ,KAC9B,QACE,kBAAC,GAAD;EAAY,OAAM;YAChB,kBAAC,GAAD;GACE,OAAM;GACN,SAAQ;GACR,eAAe,EAAW,YAAY;GACtC,CAAA;EACS,CAAA;CAIjB,IAAM,IAAI,EAAQ,MACZ,IAAW,EAAE,UAAU,QAAQ,QAC/B,IAAW,EAAE,UAAU,SAAS,EAAE,aAAa,SAAS,QACxD,IACJ,EAAQ,EAAE,eAAgB,EAAE,WAAW,eAAe,EAAE,WAAW;AAyBrE,QACE,kBAAC,GAAD;EACE,OAAO,GAAG,EAAS,MAAM;EACzB,aAAa,GAAG,EAAoB,EAAE,QAAQ,EAAE,cAAc,MAAM,EAAE,gBAAgB;EACtF,SACE,kBAAC,UAAD;GACE,MAAK;GACL,eAAe,EAAW,YAAY;GACtC,WAAU;aAHZ,CAKE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,QAC1B;;YAVb;GAcE,kBAAC,GAAD;IAAY,SAAS;IAAG,SAAQ;IAAO,WAAU;IAAS,CAAA;GAEzD,EAAE,SACD,kBAAC,GAAD;IAAe,WAAU;cAAzB,CACE,kBAAC,MAAD;KAAI,WAAU;eAA+C;KAAU,CAAA,EACvE,kBAAC,KAAD;KAAG,WAAU;eAA+B,EAAE;KAAU,CAAA,CAC1C;;GAIjB,KACC,kBAAC,WAAD;IAAS,WAAU;cAAnB,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,iBACzB;QACL,kBAAC,GAAD;KAAW,WAAU;KAAU,WAAU;eAAzC;MACE,kBAAC,KAAD;OAAG,WAAU;iBAAb;QAAgD;QACH,kBAAC,UAAD,EAAA,UAAQ,aAAkB,CAAA;;QAEnE;;MACJ,kBAAC,QAAD;OAAM,UA1DK,OAAO,MAAuB;AAGjD,YAFA,EAAE,gBAAgB,EAClB,EAAS,KAAK,EACV,CAAC,EAAI;QACT,IAAM,IAAO,OAAO,SAAS,GAAW,GAAG,EACrC,IAAO,OAAO,SAAS,GAAW,GAAG;AAC3C,YAAI,OAAO,MAAM,EAAK,IAAI,OAAO,MAAM,EAAK,EAAE;AAC5C,WAAS,gDAAgD;AACzD;;AAEF,YAAI,IAAO,KAAK,IAAO,GAAG;AACxB,WAAS,6BAA6B;AACtC;;AAEF,YAAI;AAGF,SAFA,MAAM,EAAa,YAAY;UAAE;UAAI,OAAO;WAAE,WAAW;WAAM,WAAW;WAAM;UAAE,CAAC,EACnF,EAAa,GAAG,EAChB,EAAa,GAAG;iBACT,GAAK;AACZ,WAAS,aAAe,QAAQ,EAAI,UAAU,2BAA2B;;;iBAuCnE,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,GAAD;YAAO,MAAM;YAAU,OAAO,EAAE,UAAU;YAAO,MAAM;YAAM,CAAA,EAC7D,kBAAC,QAAD;YAAM,WAAU;sBACb;YACI,CAAA,CACH;cACN,kBAAC,GAAD;WAAW,OAAM;WAAO,SAAQ;WAAY,WAAU;qBACpD,kBAAC,SAAD;YACE,IAAG;YACH,WAAU;YACV,WAAW,GAAG,EAAgB;YAC9B,OAAO;YACP,WAAW,MAAM,EAAa,EAAE,OAAO,MAAM;YAC7C,aAAY;YACZ,CAAA;WACQ,CAAA,CACR;;SAEN,kBAAC,GAAD;UAAO,WAAU;UAAwC,eAAY;UAAS,CAAA;SAE9E,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WAAW,OAAM;WAAO,SAAQ;WAAY,WAAU;qBACpD,kBAAC,SAAD;YACE,IAAG;YACH,WAAU;YACV,WAAW,GAAG,EAAgB;YAC9B,OAAO;YACP,WAAW,MAAM,EAAa,EAAE,OAAO,MAAM;YAC7C,aAAY;YACZ,CAAA;WACQ,CAAA,EACZ,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,GAAD;YAAO,MAAM;YAAU,OAAO,EAAE,UAAU;YAAO,MAAM;YAAM,CAAA,EAC7D,kBAAC,QAAD;YAAM,WAAU;sBACb;YACI,CAAA,CACH;aACF;;SACF;WAEN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,UAAD;SACE,MAAK;SACL,UAAU,EAAa;SACvB,WAAU;mBAHZ,CAKG,EAAa,YACZ,kBAAC,GAAD,EAAS,WAAU,wBAAyB,CAAA,GAE5C,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAC9B,gBAEK;;QACL,CAAA,CACD;;MACN,KAAS,kBAAC,KAAD;OAAG,WAAU;iBAAmD;OAAU,CAAA;MAC1E;OACJ;;GAGX,EAAE,eACD,kBAAC,UAAD;IACE,MAAK;IACL,eACE,EAAW,0BAA0B,mBAAmB,EAAE,eAAe,GAAG,GAAG;IAEjF,WAAU;cALZ;KAOE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;;KAAO,EAAE;KAAY;KAC5C;;GAEA"}
|