@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,16 +1,17 @@
|
|
|
1
1
|
import { useAthleteBridge as e } from "../../context/AthleteBridgeContext.js";
|
|
2
2
|
import { PageLayout as t } from "../../components/PageLayout.js";
|
|
3
|
-
import {
|
|
4
|
-
import { EmptyState as
|
|
5
|
-
import { ErrorState as
|
|
6
|
-
import { useFixtures as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
3
|
+
import { FIXTURE_TYPE_LABELS as n, FIXTURE_TYPE_OPTIONS as r } from "../../components/domain.js";
|
|
4
|
+
import { EmptyState as i } from "../../components/EmptyState.js";
|
|
5
|
+
import { ErrorState as a, LoadingState as o } from "../../components/LoadingState.js";
|
|
6
|
+
import { useFixtures as s, useTeams as c } from "../../hooks/useAthleteBridgeApi.js";
|
|
7
|
+
import { FixtureCard as l } from "../../components/FixtureCard.js";
|
|
8
|
+
import { FilterSelect as u } from "../../components/FilterSelect.js";
|
|
9
|
+
import { CursorPager as d } from "../../components/CursorPager.js";
|
|
10
|
+
import { useMemo as f, useState as p } from "react";
|
|
11
|
+
import { CalendarDays as m, Plus as h, Trophy as g } from "lucide-react";
|
|
12
|
+
import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
12
13
|
//#region src/atheletebridge/pages/fixtures/FixturesListPage.tsx
|
|
13
|
-
var
|
|
14
|
+
var b = 12, x = [
|
|
14
15
|
{
|
|
15
16
|
value: "SCHEDULED",
|
|
16
17
|
label: "Scheduled"
|
|
@@ -31,62 +32,98 @@ var h = 12, g = [
|
|
|
31
32
|
value: "CANCELLED",
|
|
32
33
|
label: "Cancelled"
|
|
33
34
|
}
|
|
34
|
-
]
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
], S = r.map((e) => ({
|
|
36
|
+
value: e,
|
|
37
|
+
label: n[e]
|
|
38
|
+
}));
|
|
39
|
+
function C() {
|
|
40
|
+
let { navigateTo: n } = e(), [r, C] = p(""), [w, T] = p(""), [E, D] = p(""), [O, k] = p(0), A = c({ pagination: { limit: 100 } }), j = f(() => (A.data?.items ?? []).map((e) => ({
|
|
41
|
+
value: e.id,
|
|
42
|
+
label: e.name
|
|
43
|
+
})), [A.data]), M = s({
|
|
44
|
+
status: r || void 0,
|
|
45
|
+
teamId: w || void 0,
|
|
38
46
|
pagination: {
|
|
39
|
-
limit:
|
|
40
|
-
offset:
|
|
47
|
+
limit: b,
|
|
48
|
+
offset: O * b
|
|
41
49
|
}
|
|
42
|
-
}),
|
|
43
|
-
|
|
50
|
+
}), N = f(() => {
|
|
51
|
+
let e = M.data?.items ?? [];
|
|
52
|
+
return E ? e.filter((e) => e.type === E) : e;
|
|
53
|
+
}, [M.data, E]), P = M.data?.pageInfo.hasMore ?? !1, F = !!(r || w || E), I = () => k(0);
|
|
54
|
+
return /* @__PURE__ */ y(t, {
|
|
44
55
|
title: "Fixtures",
|
|
45
56
|
description: "Matches across friendlies, league games, cups, tournaments and scrimmages.",
|
|
46
|
-
actions: /* @__PURE__ */
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
57
|
+
actions: /* @__PURE__ */ y("div", {
|
|
58
|
+
className: "flex flex-wrap items-center gap-2",
|
|
59
|
+
children: [/* @__PURE__ */ y("button", {
|
|
60
|
+
type: "button",
|
|
61
|
+
onClick: () => n("/tournaments"),
|
|
62
|
+
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",
|
|
63
|
+
children: [/* @__PURE__ */ v(g, { className: "h-4 w-4" }), " Tournament bracket"]
|
|
64
|
+
}), /* @__PURE__ */ y("button", {
|
|
65
|
+
type: "button",
|
|
66
|
+
onClick: () => n("/fixtures/new"),
|
|
67
|
+
className: "inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90",
|
|
68
|
+
children: [/* @__PURE__ */ v(h, { className: "h-4 w-4" }), " Schedule fixture"]
|
|
69
|
+
})]
|
|
51
70
|
}),
|
|
52
|
-
children: [/* @__PURE__ */
|
|
71
|
+
children: [/* @__PURE__ */ y("div", {
|
|
53
72
|
className: "mb-6 flex flex-wrap items-center gap-3",
|
|
54
|
-
children:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
73
|
+
children: [
|
|
74
|
+
/* @__PURE__ */ v(u, {
|
|
75
|
+
ariaLabel: "Filter by status",
|
|
76
|
+
allLabel: "All statuses",
|
|
77
|
+
value: r,
|
|
78
|
+
onChange: (e) => {
|
|
79
|
+
C(e), I();
|
|
80
|
+
},
|
|
81
|
+
options: x
|
|
82
|
+
}),
|
|
83
|
+
/* @__PURE__ */ v(u, {
|
|
84
|
+
ariaLabel: "Filter by team",
|
|
85
|
+
allLabel: "All teams",
|
|
86
|
+
value: w,
|
|
87
|
+
onChange: (e) => {
|
|
88
|
+
T(e), I();
|
|
89
|
+
},
|
|
90
|
+
options: j
|
|
91
|
+
}),
|
|
92
|
+
/* @__PURE__ */ v(u, {
|
|
93
|
+
ariaLabel: "Filter by type",
|
|
94
|
+
allLabel: "All types",
|
|
95
|
+
value: E,
|
|
96
|
+
onChange: (e) => D(e),
|
|
97
|
+
options: S
|
|
98
|
+
})
|
|
99
|
+
]
|
|
100
|
+
}), M.isLoading ? /* @__PURE__ */ v(o, { label: "Loading fixtures…" }) : M.isError ? /* @__PURE__ */ v(a, { onRetry: () => void M.refetch() }) : N.length === 0 ? /* @__PURE__ */ v(i, {
|
|
64
101
|
illustration: "empty-calendar",
|
|
65
|
-
icon: /* @__PURE__ */
|
|
102
|
+
icon: /* @__PURE__ */ v(m, { className: "h-10 w-10" }),
|
|
66
103
|
title: "No fixtures found",
|
|
67
|
-
description:
|
|
68
|
-
action: /* @__PURE__ */
|
|
104
|
+
description: F ? "Try clearing your filters to see all fixtures." : "Schedule a match to start tracking results and standings.",
|
|
105
|
+
action: /* @__PURE__ */ v("button", {
|
|
69
106
|
type: "button",
|
|
70
|
-
onClick: () =>
|
|
107
|
+
onClick: () => n("/fixtures/new"),
|
|
71
108
|
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90",
|
|
72
109
|
children: "Schedule fixture"
|
|
73
110
|
})
|
|
74
|
-
}) : /* @__PURE__ */
|
|
111
|
+
}) : /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v("div", {
|
|
75
112
|
className: "grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
76
|
-
children:
|
|
113
|
+
children: N.map((e) => /* @__PURE__ */ v(l, {
|
|
77
114
|
fixture: e,
|
|
78
|
-
onClick: () =>
|
|
115
|
+
onClick: () => n(`/fixtures/${e.id}`)
|
|
79
116
|
}, e.id))
|
|
80
|
-
}), /* @__PURE__ */
|
|
117
|
+
}), /* @__PURE__ */ v(d, {
|
|
81
118
|
className: "mt-6",
|
|
82
|
-
page:
|
|
83
|
-
hasMore:
|
|
84
|
-
onPrev: () =>
|
|
85
|
-
onNext: () =>
|
|
119
|
+
page: O,
|
|
120
|
+
hasMore: P,
|
|
121
|
+
onPrev: () => k((e) => Math.max(0, e - 1)),
|
|
122
|
+
onNext: () => k((e) => e + 1)
|
|
86
123
|
})] })]
|
|
87
124
|
});
|
|
88
125
|
}
|
|
89
126
|
//#endregion
|
|
90
|
-
export {
|
|
127
|
+
export { C as FixturesListPage };
|
|
91
128
|
|
|
92
129
|
//# sourceMappingURL=FixturesListPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FixturesListPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/fixtures/FixturesListPage.tsx"],"sourcesContent":["/**\n * Fixtures List\n * @module atheletebridge/pages/fixtures\n */\n\nimport { useState } from 'react';\nimport { CalendarDays, Plus } from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { FixtureCard } from '../../components/FixtureCard';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingState, ErrorState } from '../../components/LoadingState';\nimport { FilterSelect } from '../../components/FilterSelect';\nimport { CursorPager } from '../../components/CursorPager';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { useFixtures } from '../../hooks/useAthleteBridgeApi';\nimport type { AthFixtureStatus } from '../../types';\n\nconst PAGE_SIZE = 12;\n\nconst STATUS_OPTS: ReadonlyArray<{ value: AthFixtureStatus; label: string }> = [\n { value: 'SCHEDULED', label: 'Scheduled' },\n { value: 'LIVE', label: 'Live' },\n { value: 'COMPLETED', label: 'Completed' },\n { value: 'POSTPONED', label: 'Postponed' },\n { value: 'CANCELLED', label: 'Cancelled' },\n];\n\nexport function FixturesListPage() {\n const { navigateTo } = useAthleteBridge();\n const [status, setStatus] = useState<AthFixtureStatus | ''>('');\n const [page, setPage] = useState(0);\n\n const fixtures = useFixtures({\n status: status || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = fixtures.data?.items ?? [];\n const hasMore = fixtures.data?.pageInfo.hasMore ?? false;\n\n return (\n <PageLayout\n title=\"Fixtures\"\n description=\"Matches across friendlies, league games, cups, tournaments and scrimmages.\"\n actions={\n <button\n type=\"button\"\n
|
|
1
|
+
{"version":3,"file":"FixturesListPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/fixtures/FixturesListPage.tsx"],"sourcesContent":["/**\n * Fixtures List\n * @module atheletebridge/pages/fixtures\n *\n * Crest-vs-crest FixtureCard grid with status, team and type filters. The team\n * filter is server-backed (athListFixtures accepts teamId); the type filter is\n * applied over the loaded page. A \"Tournament bracket\" shortcut links to the\n * tournaments view. Semantic tokens only, responsive.\n */\n\nimport { useMemo, useState } from 'react';\nimport { CalendarDays, Plus, Trophy } from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { FixtureCard } from '../../components/FixtureCard';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingState, ErrorState } from '../../components/LoadingState';\nimport { FilterSelect } from '../../components/FilterSelect';\nimport { CursorPager } from '../../components/CursorPager';\nimport { FIXTURE_TYPE_LABELS, FIXTURE_TYPE_OPTIONS } from '../../components/domain';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { useFixtures, useTeams } from '../../hooks/useAthleteBridgeApi';\nimport type { AthFixtureStatus, AthFixtureType } from '../../types';\n\nconst PAGE_SIZE = 12;\n\nconst STATUS_OPTS: ReadonlyArray<{ value: AthFixtureStatus; label: string }> = [\n { value: 'SCHEDULED', label: 'Scheduled' },\n { value: 'LIVE', label: 'Live' },\n { value: 'COMPLETED', label: 'Completed' },\n { value: 'POSTPONED', label: 'Postponed' },\n { value: 'CANCELLED', label: 'Cancelled' },\n];\n\nconst TYPE_OPTS: ReadonlyArray<{ value: AthFixtureType; label: string }> = FIXTURE_TYPE_OPTIONS.map(\n (t) => ({ value: t, label: FIXTURE_TYPE_LABELS[t] })\n);\n\nexport function FixturesListPage() {\n const { navigateTo } = useAthleteBridge();\n const [status, setStatus] = useState<AthFixtureStatus | ''>('');\n const [teamId, setTeamId] = useState<string>('');\n const [type, setType] = useState<AthFixtureType | ''>('');\n const [page, setPage] = useState(0);\n\n const teams = useTeams({ pagination: { limit: 100 } });\n const teamOpts = useMemo(\n () => (teams.data?.items ?? []).map((t) => ({ value: t.id, label: t.name })),\n [teams.data]\n );\n\n const fixtures = useFixtures({\n status: status || undefined,\n teamId: teamId || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = useMemo(() => {\n const raw = fixtures.data?.items ?? [];\n return type ? raw.filter((f) => f.type === type) : raw;\n }, [fixtures.data, type]);\n const hasMore = fixtures.data?.pageInfo.hasMore ?? false;\n const hasFilters = Boolean(status || teamId || type);\n\n const resetPage = () => setPage(0);\n\n return (\n <PageLayout\n title=\"Fixtures\"\n description=\"Matches across friendlies, league games, cups, tournaments and scrimmages.\"\n actions={\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/tournaments')}\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\" /> Tournament bracket\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/fixtures/new')}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90\"\n >\n <Plus className=\"h-4 w-4\" /> Schedule fixture\n </button>\n </div>\n }\n >\n <div className=\"mb-6 flex flex-wrap items-center gap-3\">\n <FilterSelect\n ariaLabel=\"Filter by status\"\n allLabel=\"All statuses\"\n value={status}\n onChange={(v) => {\n setStatus(v);\n resetPage();\n }}\n options={STATUS_OPTS}\n />\n <FilterSelect\n ariaLabel=\"Filter by team\"\n allLabel=\"All teams\"\n value={teamId}\n onChange={(v) => {\n setTeamId(v);\n resetPage();\n }}\n options={teamOpts}\n />\n <FilterSelect\n ariaLabel=\"Filter by type\"\n allLabel=\"All types\"\n value={type}\n onChange={(v) => setType(v)}\n options={TYPE_OPTS}\n />\n </div>\n\n {fixtures.isLoading ? (\n <LoadingState label=\"Loading fixtures…\" />\n ) : fixtures.isError ? (\n <ErrorState onRetry={() => void fixtures.refetch()} />\n ) : items.length === 0 ? (\n <EmptyState\n illustration=\"empty-calendar\"\n icon={<CalendarDays className=\"h-10 w-10\" />}\n title=\"No fixtures found\"\n description={\n hasFilters\n ? 'Try clearing your filters to see all fixtures.'\n : 'Schedule a match to start tracking results and standings.'\n }\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/fixtures/new')}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg/90\"\n >\n Schedule fixture\n </button>\n }\n />\n ) : (\n <>\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {items.map((fixture) => (\n <FixtureCard\n key={fixture.id}\n fixture={fixture}\n onClick={() => navigateTo(`/fixtures/${fixture.id}`)}\n />\n ))}\n </div>\n <CursorPager\n className=\"mt-6\"\n page={page}\n hasMore={hasMore}\n onPrev={() => setPage((p) => Math.max(0, p - 1))}\n onNext={() => setPage((p) => p + 1)}\n />\n </>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|