@burdenoff/microfe-atheletebridge 2026.705.2 → 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 +432 -281
- package/dist/atheletebridge/pages/performance/PerformancePage.js.map +1 -1
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +187 -123
- 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 +267 -139
- package/dist/atheletebridge/pages/sessions/SessionDetailPage.js.map +1 -1
- package/dist/atheletebridge/pages/sessions/SessionFormPage.js +253 -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/package.json +1 -1
|
@@ -1,166 +1,190 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { PageLayout as t } from "../components/PageLayout.js";
|
|
3
|
+
import { Crest as n } from "../components/Crest.js";
|
|
4
|
+
import { EmptyState as r } from "../components/EmptyState.js";
|
|
5
|
+
import { ErrorState as i, LoadingState as a } from "../components/LoadingState.js";
|
|
6
|
+
import { useFixtures as o, useStandings as s } from "../hooks/useAthleteBridgeApi.js";
|
|
7
|
+
import { fieldInputClass as c } from "../components/form.js";
|
|
8
|
+
import { useEffect as l, useMemo as u, useState as d } from "react";
|
|
9
|
+
import { Search as f, Trophy as p } from "lucide-react";
|
|
10
|
+
import { useSearchParams as m } from "react-router-dom";
|
|
11
|
+
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
12
|
+
import { EmphasisPanel as _ } from "@burdenoff/fe-libs/ui";
|
|
11
13
|
//#region src/atheletebridge/pages/StandingsPage.tsx
|
|
12
|
-
function
|
|
13
|
-
let [
|
|
14
|
+
function v() {
|
|
15
|
+
let [v] = m(), y = v.get("competition") ?? "", [b, x] = d(y), [S, C] = d(y), w = o({ pagination: { limit: 100 } }), T = u(() => {
|
|
14
16
|
let e = /* @__PURE__ */ new Set();
|
|
15
|
-
for (let t of
|
|
17
|
+
for (let t of w.data?.items ?? []) t.competition && e.add(t.competition);
|
|
16
18
|
return Array.from(e).sort();
|
|
17
|
-
}, [
|
|
18
|
-
|
|
19
|
-
!
|
|
20
|
-
}, [
|
|
21
|
-
let
|
|
22
|
-
return /* @__PURE__ */
|
|
19
|
+
}, [w.data]);
|
|
20
|
+
l(() => {
|
|
21
|
+
!S && T.length > 0 && (x(T[0]), C(T[0]));
|
|
22
|
+
}, [S, T]);
|
|
23
|
+
let E = s(S || void 0), D = u(() => [...E.data ?? []].sort((e, t) => t.points === e.points ? t.goalsFor - e.goalsFor : t.points - e.points), [E.data]);
|
|
24
|
+
return /* @__PURE__ */ g(t, {
|
|
23
25
|
title: "Standings",
|
|
24
26
|
description: "Live competition tables — recomputed automatically from results.",
|
|
25
|
-
children: [/* @__PURE__ */
|
|
27
|
+
children: [/* @__PURE__ */ g("form", {
|
|
26
28
|
onSubmit: (e) => {
|
|
27
|
-
e.preventDefault(),
|
|
29
|
+
e.preventDefault(), C(b.trim());
|
|
28
30
|
},
|
|
29
31
|
className: "mb-6 flex flex-wrap items-end gap-3",
|
|
30
|
-
children: [/* @__PURE__ */
|
|
32
|
+
children: [/* @__PURE__ */ g("div", {
|
|
31
33
|
className: "flex-1 min-w-[220px]",
|
|
32
34
|
children: [
|
|
33
|
-
/* @__PURE__ */
|
|
35
|
+
/* @__PURE__ */ h("label", {
|
|
34
36
|
htmlFor: "competition",
|
|
35
37
|
className: "mb-1.5 block text-sm font-medium text-text-primary",
|
|
36
38
|
children: "Competition"
|
|
37
39
|
}),
|
|
38
|
-
/* @__PURE__ */
|
|
40
|
+
/* @__PURE__ */ h("input", {
|
|
39
41
|
id: "competition",
|
|
40
42
|
list: "ath-competitions",
|
|
41
|
-
className:
|
|
42
|
-
value:
|
|
43
|
-
onChange: (e) =>
|
|
43
|
+
className: c,
|
|
44
|
+
value: b,
|
|
45
|
+
onChange: (e) => x(e.target.value),
|
|
44
46
|
placeholder: "e.g. Spring League 2026"
|
|
45
47
|
}),
|
|
46
|
-
/* @__PURE__ */
|
|
48
|
+
/* @__PURE__ */ h("datalist", {
|
|
47
49
|
id: "ath-competitions",
|
|
48
|
-
children:
|
|
50
|
+
children: T.map((e) => /* @__PURE__ */ h("option", { value: e }, e))
|
|
49
51
|
})
|
|
50
52
|
]
|
|
51
|
-
}), /* @__PURE__ */
|
|
53
|
+
}), /* @__PURE__ */ g("button", {
|
|
52
54
|
type: "submit",
|
|
53
55
|
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",
|
|
54
|
-
children: [/* @__PURE__ */
|
|
56
|
+
children: [/* @__PURE__ */ h(f, { className: "h-4 w-4" }), " View table"]
|
|
55
57
|
})]
|
|
56
|
-
}),
|
|
58
|
+
}), S ? E.isLoading ? /* @__PURE__ */ h(a, { label: "Loading standings…" }) : E.isError ? /* @__PURE__ */ h(i, { onRetry: () => void E.refetch() }) : D.length === 0 ? /* @__PURE__ */ h(r, {
|
|
57
59
|
illustration: "empty-data",
|
|
58
|
-
icon: /* @__PURE__ */ p
|
|
60
|
+
icon: /* @__PURE__ */ h(p, { className: "h-10 w-10" }),
|
|
59
61
|
title: "No standings yet",
|
|
60
|
-
description: `No results have been recorded for "${
|
|
61
|
-
}) : /* @__PURE__ */
|
|
62
|
+
description: `No results have been recorded for "${S}". Record a fixture result to build the table.`
|
|
63
|
+
}) : /* @__PURE__ */ h(_, {
|
|
62
64
|
className: "overflow-x-auto",
|
|
63
|
-
children: /* @__PURE__ */
|
|
65
|
+
children: /* @__PURE__ */ g("table", {
|
|
64
66
|
className: "w-full min-w-[640px] text-sm",
|
|
65
|
-
children: [/* @__PURE__ */
|
|
67
|
+
children: [/* @__PURE__ */ h("thead", { children: /* @__PURE__ */ g("tr", {
|
|
66
68
|
className: "border-b border-border-seam text-left text-xs uppercase tracking-wide text-text-secondary",
|
|
67
69
|
children: [
|
|
68
|
-
/* @__PURE__ */
|
|
70
|
+
/* @__PURE__ */ h("th", {
|
|
69
71
|
className: "px-3 py-2 font-medium",
|
|
70
72
|
children: "#"
|
|
71
73
|
}),
|
|
72
|
-
/* @__PURE__ */
|
|
74
|
+
/* @__PURE__ */ h("th", {
|
|
73
75
|
className: "px-3 py-2 font-medium",
|
|
74
76
|
children: "Team"
|
|
75
77
|
}),
|
|
76
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ h("th", {
|
|
77
79
|
className: "px-3 py-2 text-center font-medium",
|
|
78
80
|
children: "P"
|
|
79
81
|
}),
|
|
80
|
-
/* @__PURE__ */
|
|
82
|
+
/* @__PURE__ */ h("th", {
|
|
81
83
|
className: "px-3 py-2 text-center font-medium",
|
|
82
84
|
children: "W"
|
|
83
85
|
}),
|
|
84
|
-
/* @__PURE__ */
|
|
86
|
+
/* @__PURE__ */ h("th", {
|
|
85
87
|
className: "px-3 py-2 text-center font-medium",
|
|
86
88
|
children: "D"
|
|
87
89
|
}),
|
|
88
|
-
/* @__PURE__ */
|
|
90
|
+
/* @__PURE__ */ h("th", {
|
|
89
91
|
className: "px-3 py-2 text-center font-medium",
|
|
90
92
|
children: "L"
|
|
91
93
|
}),
|
|
92
|
-
/* @__PURE__ */
|
|
94
|
+
/* @__PURE__ */ h("th", {
|
|
93
95
|
className: "px-3 py-2 text-center font-medium",
|
|
94
96
|
children: "GF"
|
|
95
97
|
}),
|
|
96
|
-
/* @__PURE__ */
|
|
98
|
+
/* @__PURE__ */ h("th", {
|
|
97
99
|
className: "px-3 py-2 text-center font-medium",
|
|
98
100
|
children: "GA"
|
|
99
101
|
}),
|
|
100
|
-
/* @__PURE__ */
|
|
102
|
+
/* @__PURE__ */ h("th", {
|
|
101
103
|
className: "px-3 py-2 text-center font-medium",
|
|
102
104
|
children: "GD"
|
|
103
105
|
}),
|
|
104
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ h("th", {
|
|
105
107
|
className: "px-3 py-2 text-center font-semibold text-text-primary",
|
|
106
108
|
children: "Pts"
|
|
107
109
|
})
|
|
108
110
|
]
|
|
109
|
-
}) }), /* @__PURE__ */
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
111
|
+
}) }), /* @__PURE__ */ h("tbody", { children: D.map((t, r) => {
|
|
112
|
+
let i = t.rank ?? r + 1, a = i === 1, o = t.goalsFor - t.goalsAgainst, s = t.team?.name ?? "Unknown team";
|
|
113
|
+
return /* @__PURE__ */ g("tr", {
|
|
114
|
+
className: e("border-b border-border-seam/60 last:border-0 hover:bg-bg-sunken/50", a && "bg-[var(--color-accent-soft)]/40"),
|
|
115
|
+
children: [
|
|
116
|
+
/* @__PURE__ */ h("td", {
|
|
117
|
+
className: "py-2.5 pl-0 pr-3",
|
|
118
|
+
children: /* @__PURE__ */ g("span", {
|
|
119
|
+
className: "flex items-center",
|
|
120
|
+
children: [/* @__PURE__ */ h("span", {
|
|
121
|
+
"aria-hidden": "true",
|
|
122
|
+
className: e("mr-2 h-6 w-1 rounded-full", a ? "bg-action-primary-bg" : "bg-transparent")
|
|
123
|
+
}), /* @__PURE__ */ h("span", {
|
|
124
|
+
className: e("tabular-nums", a ? "font-bold text-primary" : "text-text-secondary"),
|
|
125
|
+
children: i
|
|
126
|
+
})]
|
|
127
|
+
})
|
|
128
|
+
}),
|
|
129
|
+
/* @__PURE__ */ h("td", {
|
|
130
|
+
className: "px-3 py-2.5",
|
|
131
|
+
children: /* @__PURE__ */ g("span", {
|
|
132
|
+
className: "flex min-w-0 items-center gap-2.5",
|
|
133
|
+
children: [/* @__PURE__ */ h(n, {
|
|
134
|
+
name: s,
|
|
135
|
+
sport: t.team?.sport,
|
|
136
|
+
size: 26
|
|
137
|
+
}), /* @__PURE__ */ h("span", {
|
|
138
|
+
className: "truncate font-medium text-text-primary",
|
|
139
|
+
children: s
|
|
140
|
+
})]
|
|
141
|
+
})
|
|
142
|
+
}),
|
|
143
|
+
/* @__PURE__ */ h("td", {
|
|
144
|
+
className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
|
|
145
|
+
children: t.played
|
|
146
|
+
}),
|
|
147
|
+
/* @__PURE__ */ h("td", {
|
|
148
|
+
className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
|
|
149
|
+
children: t.won
|
|
150
|
+
}),
|
|
151
|
+
/* @__PURE__ */ h("td", {
|
|
152
|
+
className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
|
|
153
|
+
children: t.drawn
|
|
154
|
+
}),
|
|
155
|
+
/* @__PURE__ */ h("td", {
|
|
156
|
+
className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
|
|
157
|
+
children: t.lost
|
|
158
|
+
}),
|
|
159
|
+
/* @__PURE__ */ h("td", {
|
|
160
|
+
className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
|
|
161
|
+
children: t.goalsFor
|
|
162
|
+
}),
|
|
163
|
+
/* @__PURE__ */ h("td", {
|
|
164
|
+
className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
|
|
165
|
+
children: t.goalsAgainst
|
|
166
|
+
}),
|
|
167
|
+
/* @__PURE__ */ h("td", {
|
|
168
|
+
className: e("px-3 py-2.5 text-center font-medium tabular-nums", o > 0 ? "text-status-success-text" : o < 0 ? "text-status-error-text" : "text-text-secondary"),
|
|
169
|
+
children: o > 0 ? `+${o}` : o
|
|
170
|
+
}),
|
|
171
|
+
/* @__PURE__ */ h("td", {
|
|
172
|
+
className: e("px-3 py-2.5 text-center font-bold tabular-nums", a ? "text-primary" : "text-text-primary"),
|
|
173
|
+
children: t.points
|
|
174
|
+
})
|
|
175
|
+
]
|
|
176
|
+
}, t.id);
|
|
177
|
+
}) })]
|
|
154
178
|
})
|
|
155
|
-
}) : /* @__PURE__ */
|
|
179
|
+
}) : /* @__PURE__ */ h(r, {
|
|
156
180
|
illustration: "empty-data",
|
|
157
|
-
icon: /* @__PURE__ */ p
|
|
181
|
+
icon: /* @__PURE__ */ h(p, { className: "h-10 w-10" }),
|
|
158
182
|
title: "Pick a competition",
|
|
159
183
|
description: "Enter a competition name to see its live standings. Standings are computed from recorded fixture results on a 3-1-0 model."
|
|
160
184
|
})]
|
|
161
185
|
});
|
|
162
186
|
}
|
|
163
187
|
//#endregion
|
|
164
|
-
export {
|
|
188
|
+
export { v as StandingsPage };
|
|
165
189
|
|
|
166
190
|
//# sourceMappingURL=StandingsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StandingsPage.js","names":[],"sources":["../../../src/atheletebridge/pages/StandingsPage.tsx"],"sourcesContent":["/**\n * Standings\n * @module atheletebridge/pages\n *\n * Reads the live competition table (athStandings) for a chosen competition.\n * The svc requires a competition name, so the user picks one (seeded from\n * fixtures that carry a competition, or typed directly).\n */\n\nimport { useEffect, useMemo, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Search, Trophy } from 'lucide-react';\nimport { EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { EmptyState } from '../components/EmptyState';\nimport { LoadingState, ErrorState } from '../components/LoadingState';\nimport { fieldInputClass } from '../components/form';\nimport { useFixtures, useStandings } from '../hooks/useAthleteBridgeApi';\n\nexport function StandingsPage() {\n const [searchParams] = useSearchParams();\n const initialCompetition = searchParams.get('competition') ?? '';\n\n const [competition, setCompetition] = useState(initialCompetition);\n const [activeCompetition, setActiveCompetition] = useState(initialCompetition);\n\n // Suggest competitions that appear on existing fixtures.\n const fixtures = useFixtures({ pagination: { limit: 100 } });\n const competitions = useMemo(() => {\n const set = new Set<string>();\n for (const f of fixtures.data?.items ?? []) {\n if (f.competition) set.add(f.competition);\n }\n return Array.from(set).sort();\n }, [fixtures.data]);\n\n // If no competition selected yet but fixtures have one, default to the first.\n useEffect(() => {\n if (!activeCompetition && competitions.length > 0) {\n setCompetition(competitions[0]);\n setActiveCompetition(competitions[0]);\n }\n }, [activeCompetition, competitions]);\n\n const standings = useStandings(activeCompetition || undefined);\n const rows = useMemo(() => {\n const items = standings.data ?? [];\n return [...items].sort((a, b) => {\n if (b.points !== a.points) return b.points - a.points;\n return b.goalsFor - a.goalsFor;\n });\n }, [standings.data]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n setActiveCompetition(competition.trim());\n };\n\n return (\n <PageLayout\n title=\"Standings\"\n description=\"Live competition tables — recomputed automatically from results.\"\n >\n <form onSubmit={handleSubmit} className=\"mb-6 flex flex-wrap items-end gap-3\">\n <div className=\"flex-1 min-w-[220px]\">\n <label\n htmlFor=\"competition\"\n className=\"mb-1.5 block text-sm font-medium text-text-primary\"\n >\n Competition\n </label>\n <input\n id=\"competition\"\n list=\"ath-competitions\"\n className={fieldInputClass}\n value={competition}\n onChange={(e) => setCompetition(e.target.value)}\n placeholder=\"e.g. Spring League 2026\"\n />\n <datalist id=\"ath-competitions\">\n {competitions.map((c) => (\n <option key={c} value={c} />\n ))}\n </datalist>\n </div>\n <button\n type=\"submit\"\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\"\n >\n <Search className=\"h-4 w-4\" /> View table\n </button>\n </form>\n\n {!activeCompetition ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Trophy className=\"h-10 w-10\" />}\n title=\"Pick a competition\"\n description=\"Enter a competition name to see its live standings. Standings are computed from recorded fixture results on a 3-1-0 model.\"\n />\n ) : standings.isLoading ? (\n <LoadingState label=\"Loading standings…\" />\n ) : standings.isError ? (\n <ErrorState onRetry={() => void standings.refetch()} />\n ) : rows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Trophy className=\"h-10 w-10\" />}\n title=\"No standings yet\"\n description={`No results have been recorded for \"${activeCompetition}\". Record a fixture result to build the table.`}\n />\n ) : (\n <EmphasisPanel className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[640px] text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam text-left text-xs uppercase tracking-wide text-text-secondary\">\n <th className=\"px-3 py-2 font-medium\">#</th>\n <th className=\"px-3 py-2 font-medium\">Team</th>\n <th className=\"px-3 py-2 text-center font-medium\">P</th>\n <th className=\"px-3 py-2 text-center font-medium\">W</th>\n <th className=\"px-3 py-2 text-center font-medium\">D</th>\n <th className=\"px-3 py-2 text-center font-medium\">L</th>\n <th className=\"px-3 py-2 text-center font-medium\">GF</th>\n <th className=\"px-3 py-2 text-center font-medium\">GA</th>\n <th className=\"px-3 py-2 text-center font-medium\">GD</th>\n <th className=\"px-3 py-2 text-center font-semibold text-text-primary\">Pts</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row, idx) => (\n <tr\n key={row.id}\n className=\"border-b border-border-seam/60 last:border-0 hover:bg-bg-sunken/50\"\n >\n <td className=\"px-3 py-2.5 tabular-nums text-text-secondary\">\n {row.rank ?? idx + 1}\n </td>\n <td className=\"px-3 py-2.5 font-medium text-text-primary\">\n {row.team?.name ?? 'Unknown team'}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.played}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.won}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.drawn}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.lost}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.goalsFor}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.goalsAgainst}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.goalsFor - row.goalsAgainst}\n </td>\n <td className=\"px-3 py-2.5 text-center font-bold tabular-nums text-text-primary\">\n {row.points}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </EmphasisPanel>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StandingsPage.js","names":[],"sources":["../../../src/atheletebridge/pages/StandingsPage.tsx"],"sourcesContent":["/**\n * Standings\n * @module atheletebridge/pages\n *\n * Reads the live competition table (athStandings) for a chosen competition.\n * The svc requires a competition name, so the user picks one (seeded from\n * fixtures that carry a competition, or typed directly).\n */\n\nimport { useEffect, useMemo, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Search, Trophy } from 'lucide-react';\nimport { EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { EmptyState } from '../components/EmptyState';\nimport { LoadingState, ErrorState } from '../components/LoadingState';\nimport { Crest } from '../components/Crest';\nimport { fieldInputClass } from '../components/form';\nimport { cn } from '../utils/cn';\nimport { useFixtures, useStandings } from '../hooks/useAthleteBridgeApi';\n\nexport function StandingsPage() {\n const [searchParams] = useSearchParams();\n const initialCompetition = searchParams.get('competition') ?? '';\n\n const [competition, setCompetition] = useState(initialCompetition);\n const [activeCompetition, setActiveCompetition] = useState(initialCompetition);\n\n // Suggest competitions that appear on existing fixtures.\n const fixtures = useFixtures({ pagination: { limit: 100 } });\n const competitions = useMemo(() => {\n const set = new Set<string>();\n for (const f of fixtures.data?.items ?? []) {\n if (f.competition) set.add(f.competition);\n }\n return Array.from(set).sort();\n }, [fixtures.data]);\n\n // If no competition selected yet but fixtures have one, default to the first.\n useEffect(() => {\n if (!activeCompetition && competitions.length > 0) {\n setCompetition(competitions[0]);\n setActiveCompetition(competitions[0]);\n }\n }, [activeCompetition, competitions]);\n\n const standings = useStandings(activeCompetition || undefined);\n const rows = useMemo(() => {\n const items = standings.data ?? [];\n return [...items].sort((a, b) => {\n if (b.points !== a.points) return b.points - a.points;\n return b.goalsFor - a.goalsFor;\n });\n }, [standings.data]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n setActiveCompetition(competition.trim());\n };\n\n return (\n <PageLayout\n title=\"Standings\"\n description=\"Live competition tables — recomputed automatically from results.\"\n >\n <form onSubmit={handleSubmit} className=\"mb-6 flex flex-wrap items-end gap-3\">\n <div className=\"flex-1 min-w-[220px]\">\n <label\n htmlFor=\"competition\"\n className=\"mb-1.5 block text-sm font-medium text-text-primary\"\n >\n Competition\n </label>\n <input\n id=\"competition\"\n list=\"ath-competitions\"\n className={fieldInputClass}\n value={competition}\n onChange={(e) => setCompetition(e.target.value)}\n placeholder=\"e.g. Spring League 2026\"\n />\n <datalist id=\"ath-competitions\">\n {competitions.map((c) => (\n <option key={c} value={c} />\n ))}\n </datalist>\n </div>\n <button\n type=\"submit\"\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\"\n >\n <Search className=\"h-4 w-4\" /> View table\n </button>\n </form>\n\n {!activeCompetition ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Trophy className=\"h-10 w-10\" />}\n title=\"Pick a competition\"\n description=\"Enter a competition name to see its live standings. Standings are computed from recorded fixture results on a 3-1-0 model.\"\n />\n ) : standings.isLoading ? (\n <LoadingState label=\"Loading standings…\" />\n ) : standings.isError ? (\n <ErrorState onRetry={() => void standings.refetch()} />\n ) : rows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Trophy className=\"h-10 w-10\" />}\n title=\"No standings yet\"\n description={`No results have been recorded for \"${activeCompetition}\". Record a fixture result to build the table.`}\n />\n ) : (\n <EmphasisPanel className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[640px] text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam text-left text-xs uppercase tracking-wide text-text-secondary\">\n <th className=\"px-3 py-2 font-medium\">#</th>\n <th className=\"px-3 py-2 font-medium\">Team</th>\n <th className=\"px-3 py-2 text-center font-medium\">P</th>\n <th className=\"px-3 py-2 text-center font-medium\">W</th>\n <th className=\"px-3 py-2 text-center font-medium\">D</th>\n <th className=\"px-3 py-2 text-center font-medium\">L</th>\n <th className=\"px-3 py-2 text-center font-medium\">GF</th>\n <th className=\"px-3 py-2 text-center font-medium\">GA</th>\n <th className=\"px-3 py-2 text-center font-medium\">GD</th>\n <th className=\"px-3 py-2 text-center font-semibold text-text-primary\">Pts</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row, idx) => {\n const rank = row.rank ?? idx + 1;\n const isLeader = rank === 1;\n const gd = row.goalsFor - row.goalsAgainst;\n const teamName = row.team?.name ?? 'Unknown team';\n return (\n <tr\n key={row.id}\n className={cn(\n 'border-b border-border-seam/60 last:border-0 hover:bg-bg-sunken/50',\n isLeader && 'bg-[var(--color-accent-soft)]/40'\n )}\n >\n <td className=\"py-2.5 pl-0 pr-3\">\n <span className=\"flex items-center\">\n <span\n aria-hidden=\"true\"\n className={cn(\n 'mr-2 h-6 w-1 rounded-full',\n isLeader ? 'bg-action-primary-bg' : 'bg-transparent'\n )}\n />\n <span\n className={cn(\n 'tabular-nums',\n isLeader ? 'font-bold text-primary' : 'text-text-secondary'\n )}\n >\n {rank}\n </span>\n </span>\n </td>\n <td className=\"px-3 py-2.5\">\n <span className=\"flex min-w-0 items-center gap-2.5\">\n <Crest name={teamName} sport={row.team?.sport} size={26} />\n <span className=\"truncate font-medium text-text-primary\">{teamName}</span>\n </span>\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.played}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.won}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.drawn}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.lost}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.goalsFor}\n </td>\n <td className=\"px-3 py-2.5 text-center tabular-nums text-text-secondary\">\n {row.goalsAgainst}\n </td>\n <td\n className={cn(\n 'px-3 py-2.5 text-center font-medium tabular-nums',\n gd > 0\n ? 'text-status-success-text'\n : gd < 0\n ? 'text-status-error-text'\n : 'text-text-secondary'\n )}\n >\n {gd > 0 ? `+${gd}` : gd}\n </td>\n <td\n className={cn(\n 'px-3 py-2.5 text-center font-bold tabular-nums',\n isLeader ? 'text-primary' : 'text-text-primary'\n )}\n >\n {row.points}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </EmphasisPanel>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|