@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.
Files changed (103) hide show
  1. package/dist/atheletebridge/AthleteBridgeRoot.js +55 -39
  2. package/dist/atheletebridge/AthleteBridgeRoot.js.map +1 -1
  3. package/dist/atheletebridge/AthleteBridgeRoutes.js +18 -6
  4. package/dist/atheletebridge/AthleteBridgeRoutes.js.map +1 -1
  5. package/dist/atheletebridge/components/Crest.js +70 -0
  6. package/dist/atheletebridge/components/Crest.js.map +1 -0
  7. package/dist/atheletebridge/components/FixtureCard.js +8 -72
  8. package/dist/atheletebridge/components/FixtureCard.js.map +1 -1
  9. package/dist/atheletebridge/components/MatchupRow.js +74 -0
  10. package/dist/atheletebridge/components/MatchupRow.js.map +1 -0
  11. package/dist/atheletebridge/components/MetricsCard.js +61 -21
  12. package/dist/atheletebridge/components/MetricsCard.js.map +1 -1
  13. package/dist/atheletebridge/components/ProgramCard.js +75 -43
  14. package/dist/atheletebridge/components/ProgramCard.js.map +1 -1
  15. package/dist/atheletebridge/components/Scoreboard.js +163 -0
  16. package/dist/atheletebridge/components/Scoreboard.js.map +1 -0
  17. package/dist/atheletebridge/components/SessionCard.js +64 -41
  18. package/dist/atheletebridge/components/SessionCard.js.map +1 -1
  19. package/dist/atheletebridge/components/SessionStatusTimeline.js +80 -0
  20. package/dist/atheletebridge/components/SessionStatusTimeline.js.map +1 -0
  21. package/dist/atheletebridge/components/StatusBadge.js +5 -5
  22. package/dist/atheletebridge/components/StatusBadge.js.map +1 -1
  23. package/dist/atheletebridge/components/TeamCard.js +65 -35
  24. package/dist/atheletebridge/components/TeamCard.js.map +1 -1
  25. package/dist/atheletebridge/components/UserAvatar.js +33 -0
  26. package/dist/atheletebridge/components/UserAvatar.js.map +1 -0
  27. package/dist/atheletebridge/components/domain.js +5 -2
  28. package/dist/atheletebridge/components/domain.js.map +1 -1
  29. package/dist/atheletebridge/components/viz/AvatarStack.js +2 -0
  30. package/dist/atheletebridge/components/viz/BarChart.js +83 -0
  31. package/dist/atheletebridge/components/viz/BarChart.js.map +1 -0
  32. package/dist/atheletebridge/components/viz/DonutChart.js +109 -0
  33. package/dist/atheletebridge/components/viz/DonutChart.js.map +1 -0
  34. package/dist/atheletebridge/components/viz/LineChart.js +123 -0
  35. package/dist/atheletebridge/components/viz/LineChart.js.map +1 -0
  36. package/dist/atheletebridge/components/viz/ProgressRing.js +6 -0
  37. package/dist/atheletebridge/components/viz/ProgressRing.js.map +1 -0
  38. package/dist/atheletebridge/components/viz/RatingStars.js +92 -0
  39. package/dist/atheletebridge/components/viz/RatingStars.js.map +1 -0
  40. package/dist/atheletebridge/components/viz/Sparkline.js +74 -0
  41. package/dist/atheletebridge/components/viz/Sparkline.js.map +1 -0
  42. package/dist/atheletebridge/components/viz/StatCard.js +60 -0
  43. package/dist/atheletebridge/components/viz/StatCard.js.map +1 -0
  44. package/dist/atheletebridge/components/viz/StepProgress.js +3 -0
  45. package/dist/atheletebridge/components/viz/Timeline.js +66 -0
  46. package/dist/atheletebridge/components/viz/Timeline.js.map +1 -0
  47. package/dist/atheletebridge/components/viz/index.js +13 -0
  48. package/dist/atheletebridge/components/viz/lib/Avatar.js +1 -0
  49. package/dist/atheletebridge/components/viz/lib/CartesianFrame.js +119 -0
  50. package/dist/atheletebridge/components/viz/lib/CartesianFrame.js.map +1 -0
  51. package/dist/atheletebridge/components/viz/lib/ResponsiveSvg.js +35 -0
  52. package/dist/atheletebridge/components/viz/lib/ResponsiveSvg.js.map +1 -0
  53. package/dist/atheletebridge/components/viz/lib/format.js +17 -0
  54. package/dist/atheletebridge/components/viz/lib/format.js.map +1 -0
  55. package/dist/atheletebridge/components/viz/lib/geometry.js +61 -0
  56. package/dist/atheletebridge/components/viz/lib/geometry.js.map +1 -0
  57. package/dist/atheletebridge/components/viz/lib/hooks.js +39 -0
  58. package/dist/atheletebridge/components/viz/lib/hooks.js.map +1 -0
  59. package/dist/atheletebridge/components/viz/lib/palette.js +27 -0
  60. package/dist/atheletebridge/components/viz/lib/palette.js.map +1 -0
  61. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +369 -163
  62. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
  63. package/dist/atheletebridge/pages/DashboardPage.js +182 -117
  64. package/dist/atheletebridge/pages/DashboardPage.js.map +1 -1
  65. package/dist/atheletebridge/pages/StandingsPage.js +119 -95
  66. package/dist/atheletebridge/pages/StandingsPage.js.map +1 -1
  67. package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.js +372 -0
  68. package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.js.map +1 -0
  69. package/dist/atheletebridge/pages/athletes/AthleteProfilePage.js +511 -0
  70. package/dist/atheletebridge/pages/athletes/AthleteProfilePage.js.map +1 -0
  71. package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js +120 -131
  72. package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js.map +1 -1
  73. package/dist/atheletebridge/pages/fixtures/FixtureFormPage.js +264 -176
  74. package/dist/atheletebridge/pages/fixtures/FixtureFormPage.js.map +1 -1
  75. package/dist/atheletebridge/pages/fixtures/FixturesListPage.js +84 -47
  76. package/dist/atheletebridge/pages/fixtures/FixturesListPage.js.map +1 -1
  77. package/dist/atheletebridge/pages/performance/PerformancePage.js +435 -284
  78. package/dist/atheletebridge/pages/performance/PerformancePage.js.map +1 -1
  79. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +188 -124
  80. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -1
  81. package/dist/atheletebridge/pages/programs/ProgramsListPage.js +56 -39
  82. package/dist/atheletebridge/pages/programs/ProgramsListPage.js.map +1 -1
  83. package/dist/atheletebridge/pages/sessions/SessionDetailPage.js +268 -139
  84. package/dist/atheletebridge/pages/sessions/SessionDetailPage.js.map +1 -1
  85. package/dist/atheletebridge/pages/sessions/SessionFormPage.js +254 -162
  86. package/dist/atheletebridge/pages/sessions/SessionFormPage.js.map +1 -1
  87. package/dist/atheletebridge/pages/sessions/SessionsListPage.js +38 -36
  88. package/dist/atheletebridge/pages/sessions/SessionsListPage.js.map +1 -1
  89. package/dist/atheletebridge/pages/teams/TeamDetailPage.js +437 -189
  90. package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -1
  91. package/dist/atheletebridge/pages/teams/TeamFormPage.js +368 -177
  92. package/dist/atheletebridge/pages/teams/TeamFormPage.js.map +1 -1
  93. package/dist/atheletebridge/pages/teams/TeamsListPage.js +3 -0
  94. package/dist/atheletebridge/pages/teams/TeamsListPage.js.map +1 -1
  95. package/dist/atheletebridge/pages/tournaments/TournamentBracketPage.js +298 -0
  96. package/dist/atheletebridge/pages/tournaments/TournamentBracketPage.js.map +1 -0
  97. package/dist/atheletebridge/utils/identity.js +31 -0
  98. package/dist/atheletebridge/utils/identity.js.map +1 -0
  99. package/dist/atheletebridge/utils/timeAgo.js +20 -0
  100. package/dist/atheletebridge/utils/timeAgo.js.map +1 -0
  101. package/dist/atheletebridge/utils/url.js +17 -0
  102. package/dist/atheletebridge/utils/url.js.map +1 -0
  103. package/package.json +1 -1
@@ -1,166 +1,190 @@
1
- import { PageLayout as e } from "../components/PageLayout.js";
2
- import { EmptyState as t } from "../components/EmptyState.js";
3
- import { ErrorState as n, LoadingState as r } from "../components/LoadingState.js";
4
- import { useFixtures as i, useStandings as a } from "../hooks/useAthleteBridgeApi.js";
5
- import { fieldInputClass as o } from "../components/form.js";
6
- import { useEffect as s, useMemo as c, useState as l } from "react";
7
- import { Search as u, Trophy as d } from "lucide-react";
8
- import { useSearchParams as f } from "react-router-dom";
9
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
10
- import { EmphasisPanel as h } from "@burdenoff/fe-libs/ui";
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 g() {
13
- let [g] = f(), _ = g.get("competition") ?? "", [v, y] = l(_), [b, x] = l(_), S = i({ pagination: { limit: 100 } }), C = c(() => {
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 S.data?.items ?? []) t.competition && e.add(t.competition);
17
+ for (let t of w.data?.items ?? []) t.competition && e.add(t.competition);
16
18
  return Array.from(e).sort();
17
- }, [S.data]);
18
- s(() => {
19
- !b && C.length > 0 && (y(C[0]), x(C[0]));
20
- }, [b, C]);
21
- let w = a(b || void 0), T = c(() => [...w.data ?? []].sort((e, t) => t.points === e.points ? t.goalsFor - e.goalsFor : t.points - e.points), [w.data]);
22
- return /* @__PURE__ */ m(e, {
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__ */ m("form", {
27
+ children: [/* @__PURE__ */ g("form", {
26
28
  onSubmit: (e) => {
27
- e.preventDefault(), x(v.trim());
29
+ e.preventDefault(), C(b.trim());
28
30
  },
29
31
  className: "mb-6 flex flex-wrap items-end gap-3",
30
- children: [/* @__PURE__ */ m("div", {
32
+ children: [/* @__PURE__ */ g("div", {
31
33
  className: "flex-1 min-w-[220px]",
32
34
  children: [
33
- /* @__PURE__ */ p("label", {
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__ */ p("input", {
40
+ /* @__PURE__ */ h("input", {
39
41
  id: "competition",
40
42
  list: "ath-competitions",
41
- className: o,
42
- value: v,
43
- onChange: (e) => y(e.target.value),
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__ */ p("datalist", {
48
+ /* @__PURE__ */ h("datalist", {
47
49
  id: "ath-competitions",
48
- children: C.map((e) => /* @__PURE__ */ p("option", { value: e }, e))
50
+ children: T.map((e) => /* @__PURE__ */ h("option", { value: e }, e))
49
51
  })
50
52
  ]
51
- }), /* @__PURE__ */ m("button", {
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__ */ p(u, { className: "h-4 w-4" }), " View table"]
56
+ children: [/* @__PURE__ */ h(f, { className: "h-4 w-4" }), " View table"]
55
57
  })]
56
- }), b ? w.isLoading ? /* @__PURE__ */ p(r, { label: "Loading standings…" }) : w.isError ? /* @__PURE__ */ p(n, { onRetry: () => void w.refetch() }) : T.length === 0 ? /* @__PURE__ */ p(t, {
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(d, { className: "h-10 w-10" }),
60
+ icon: /* @__PURE__ */ h(p, { className: "h-10 w-10" }),
59
61
  title: "No standings yet",
60
- description: `No results have been recorded for "${b}". Record a fixture result to build the table.`
61
- }) : /* @__PURE__ */ p(h, {
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__ */ m("table", {
65
+ children: /* @__PURE__ */ g("table", {
64
66
  className: "w-full min-w-[640px] text-sm",
65
- children: [/* @__PURE__ */ p("thead", { children: /* @__PURE__ */ m("tr", {
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__ */ p("th", {
70
+ /* @__PURE__ */ h("th", {
69
71
  className: "px-3 py-2 font-medium",
70
72
  children: "#"
71
73
  }),
72
- /* @__PURE__ */ p("th", {
74
+ /* @__PURE__ */ h("th", {
73
75
  className: "px-3 py-2 font-medium",
74
76
  children: "Team"
75
77
  }),
76
- /* @__PURE__ */ p("th", {
78
+ /* @__PURE__ */ h("th", {
77
79
  className: "px-3 py-2 text-center font-medium",
78
80
  children: "P"
79
81
  }),
80
- /* @__PURE__ */ p("th", {
82
+ /* @__PURE__ */ h("th", {
81
83
  className: "px-3 py-2 text-center font-medium",
82
84
  children: "W"
83
85
  }),
84
- /* @__PURE__ */ p("th", {
86
+ /* @__PURE__ */ h("th", {
85
87
  className: "px-3 py-2 text-center font-medium",
86
88
  children: "D"
87
89
  }),
88
- /* @__PURE__ */ p("th", {
90
+ /* @__PURE__ */ h("th", {
89
91
  className: "px-3 py-2 text-center font-medium",
90
92
  children: "L"
91
93
  }),
92
- /* @__PURE__ */ p("th", {
94
+ /* @__PURE__ */ h("th", {
93
95
  className: "px-3 py-2 text-center font-medium",
94
96
  children: "GF"
95
97
  }),
96
- /* @__PURE__ */ p("th", {
98
+ /* @__PURE__ */ h("th", {
97
99
  className: "px-3 py-2 text-center font-medium",
98
100
  children: "GA"
99
101
  }),
100
- /* @__PURE__ */ p("th", {
102
+ /* @__PURE__ */ h("th", {
101
103
  className: "px-3 py-2 text-center font-medium",
102
104
  children: "GD"
103
105
  }),
104
- /* @__PURE__ */ p("th", {
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__ */ p("tbody", { children: T.map((e, t) => /* @__PURE__ */ m("tr", {
110
- className: "border-b border-border-seam/60 last:border-0 hover:bg-bg-sunken/50",
111
- children: [
112
- /* @__PURE__ */ p("td", {
113
- className: "px-3 py-2.5 tabular-nums text-text-secondary",
114
- children: e.rank ?? t + 1
115
- }),
116
- /* @__PURE__ */ p("td", {
117
- className: "px-3 py-2.5 font-medium text-text-primary",
118
- children: e.team?.name ?? "Unknown team"
119
- }),
120
- /* @__PURE__ */ p("td", {
121
- className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
122
- children: e.played
123
- }),
124
- /* @__PURE__ */ p("td", {
125
- className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
126
- children: e.won
127
- }),
128
- /* @__PURE__ */ p("td", {
129
- className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
130
- children: e.drawn
131
- }),
132
- /* @__PURE__ */ p("td", {
133
- className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
134
- children: e.lost
135
- }),
136
- /* @__PURE__ */ p("td", {
137
- className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
138
- children: e.goalsFor
139
- }),
140
- /* @__PURE__ */ p("td", {
141
- className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
142
- children: e.goalsAgainst
143
- }),
144
- /* @__PURE__ */ p("td", {
145
- className: "px-3 py-2.5 text-center tabular-nums text-text-secondary",
146
- children: e.goalsFor - e.goalsAgainst
147
- }),
148
- /* @__PURE__ */ p("td", {
149
- className: "px-3 py-2.5 text-center font-bold tabular-nums text-text-primary",
150
- children: e.points
151
- })
152
- ]
153
- }, e.id)) })]
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__ */ p(t, {
179
+ }) : /* @__PURE__ */ h(r, {
156
180
  illustration: "empty-data",
157
- icon: /* @__PURE__ */ p(d, { className: "h-10 w-10" }),
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 { g as StandingsPage };
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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"}