@burdenoff/microfe-atheletebridge 2026.805.1 → 2026.829.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 (54) hide show
  1. package/dist/atheletebridge/components/LoadingState.d.ts.map +1 -1
  2. package/dist/atheletebridge/components/LoadingState.js +39 -32
  3. package/dist/atheletebridge/components/LoadingState.js.map +1 -1
  4. package/dist/atheletebridge/components/TeamCard.d.ts.map +1 -1
  5. package/dist/atheletebridge/components/TeamCard.js +45 -49
  6. package/dist/atheletebridge/components/TeamCard.js.map +1 -1
  7. package/dist/atheletebridge/hooks/index.d.ts +1 -1
  8. package/dist/atheletebridge/hooks/index.d.ts.map +1 -1
  9. package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts +41 -1
  10. package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts.map +1 -1
  11. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +58 -28
  12. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
  13. package/dist/atheletebridge/pages/DashboardPage.d.ts.map +1 -1
  14. package/dist/atheletebridge/pages/DashboardPage.js +56 -24
  15. package/dist/atheletebridge/pages/DashboardPage.js.map +1 -1
  16. package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.d.ts +6 -2
  17. package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.d.ts.map +1 -1
  18. package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.js +330 -174
  19. package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.js.map +1 -1
  20. package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.d.ts.map +1 -1
  21. package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js +110 -106
  22. package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js.map +1 -1
  23. package/dist/atheletebridge/pages/fixtures/FixturesListPage.d.ts.map +1 -1
  24. package/dist/atheletebridge/pages/fixtures/FixturesListPage.js +80 -71
  25. package/dist/atheletebridge/pages/fixtures/FixturesListPage.js.map +1 -1
  26. package/dist/atheletebridge/pages/onboarding/OnboardingPage.d.ts.map +1 -1
  27. package/dist/atheletebridge/pages/onboarding/OnboardingPage.js +244 -210
  28. package/dist/atheletebridge/pages/onboarding/OnboardingPage.js.map +1 -1
  29. package/dist/atheletebridge/pages/performance/PerformancePage.d.ts +7 -0
  30. package/dist/atheletebridge/pages/performance/PerformancePage.d.ts.map +1 -1
  31. package/dist/atheletebridge/pages/performance/PerformancePage.js +526 -362
  32. package/dist/atheletebridge/pages/performance/PerformancePage.js.map +1 -1
  33. package/dist/atheletebridge/pages/programs/ProgramDetailPage.d.ts.map +1 -1
  34. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +169 -143
  35. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -1
  36. package/dist/atheletebridge/pages/programs/ProgramsListPage.d.ts.map +1 -1
  37. package/dist/atheletebridge/pages/programs/ProgramsListPage.js +77 -72
  38. package/dist/atheletebridge/pages/programs/ProgramsListPage.js.map +1 -1
  39. package/dist/atheletebridge/pages/sessions/SessionDetailPage.d.ts.map +1 -1
  40. package/dist/atheletebridge/pages/sessions/SessionDetailPage.js +104 -86
  41. package/dist/atheletebridge/pages/sessions/SessionDetailPage.js.map +1 -1
  42. package/dist/atheletebridge/pages/sessions/SessionsListPage.d.ts.map +1 -1
  43. package/dist/atheletebridge/pages/sessions/SessionsListPage.js +54 -49
  44. package/dist/atheletebridge/pages/sessions/SessionsListPage.js.map +1 -1
  45. package/dist/atheletebridge/pages/teams/TeamDetailPage.d.ts.map +1 -1
  46. package/dist/atheletebridge/pages/teams/TeamDetailPage.js +286 -267
  47. package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -1
  48. package/dist/atheletebridge/pages/teams/TeamFormPage.d.ts.map +1 -1
  49. package/dist/atheletebridge/pages/teams/TeamFormPage.js +185 -180
  50. package/dist/atheletebridge/pages/teams/TeamFormPage.js.map +1 -1
  51. package/dist/atheletebridge/pages/teams/TeamsListPage.d.ts.map +1 -1
  52. package/dist/atheletebridge/pages/teams/TeamsListPage.js +70 -74
  53. package/dist/atheletebridge/pages/teams/TeamsListPage.js.map +1 -1
  54. package/package.json +1 -1
@@ -1,17 +1,18 @@
1
- import { useAthleteBridge as e } from "../../context/AthleteBridgeContext.js";
2
- import { PageLayout as t } from "../../components/PageLayout.js";
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 { CursorPager as l } from "../../components/CursorPager.js";
8
- import { FilterSelect as u } from "../../components/FilterSelect.js";
9
- import { FixtureCard as d } from "../../components/FixtureCard.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";
1
+ import { useAbTranslate as e } from "../../i18n.js";
2
+ import { useAthleteBridge as t } from "../../context/AthleteBridgeContext.js";
3
+ import { PageLayout as n } from "../../components/PageLayout.js";
4
+ import { FIXTURE_TYPE_LABELS as r, FIXTURE_TYPE_OPTIONS as i } from "../../components/domain.js";
5
+ import { EmptyState as a } from "../../components/EmptyState.js";
6
+ import { ErrorState as o, LoadingState as s } from "../../components/LoadingState.js";
7
+ import { useFixtures as c, useTeams as l } from "../../hooks/useAthleteBridgeApi.js";
8
+ import { CursorPager as u } from "../../components/CursorPager.js";
9
+ import { FilterSelect as d } from "../../components/FilterSelect.js";
10
+ import { FixtureCard as f } from "../../components/FixtureCard.js";
11
+ import { useMemo as p, useState as m } from "react";
12
+ import { CalendarDays as h, Plus as g, Trophy as _ } from "lucide-react";
13
+ import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
13
14
  //#region src/atheletebridge/pages/fixtures/FixturesListPage.tsx
14
- var b = 12, x = [
15
+ var x = 12, S = [
15
16
  {
16
17
  value: "SCHEDULED",
17
18
  label: "Scheduled"
@@ -32,100 +33,108 @@ var b = 12, x = [
32
33
  value: "CANCELLED",
33
34
  label: "Cancelled"
34
35
  }
35
- ], S = r.map((e) => ({
36
+ ], C = i.map((e) => ({
36
37
  value: e,
37
- label: n[e]
38
+ label: r[e]
38
39
  }));
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) => ({
40
+ function w() {
41
+ let r = e(), { navigateTo: i } = t(), [w, T] = m(""), [E, D] = m(""), [O, k] = m(""), [A, j] = m(0), M = l({ pagination: { limit: 100 } }), N = p(() => (M.data?.items ?? []).map((e) => ({
41
42
  value: e.id,
42
43
  label: e.name
43
- })), [A.data]), M = s({
44
- status: r || void 0,
45
- teamId: w || void 0,
44
+ })), [M.data]), P = c({
45
+ status: w || void 0,
46
+ teamId: E || void 0,
46
47
  pagination: {
47
- limit: b,
48
- offset: O * b
48
+ limit: x,
49
+ offset: A * x
49
50
  }
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, {
55
- title: "Fixtures",
56
- description: "Matches across friendlies, league games, cups, tournaments and scrimmages.",
57
- actions: /* @__PURE__ */ y("div", {
51
+ }), F = p(() => {
52
+ let e = P.data?.items ?? [];
53
+ return O ? e.filter((e) => e.type === O) : e;
54
+ }, [P.data, O]), I = P.data?.pageInfo.hasMore ?? !1, L = !!(w || E || O), R = () => j(0);
55
+ return /* @__PURE__ */ b(n, {
56
+ title: r("atheletebridge.pages.fixtures.title", "Fixtures"),
57
+ description: r("atheletebridge.pages.fixtures.description", "Matches across friendlies, league games, cups, tournaments and scrimmages."),
58
+ actions: /* @__PURE__ */ b("div", {
58
59
  className: "flex flex-wrap items-center gap-2",
59
- children: [/* @__PURE__ */ y("button", {
60
+ children: [/* @__PURE__ */ b("button", {
60
61
  type: "button",
61
- onClick: () => n("/tournaments"),
62
+ onClick: () => i("/tournaments"),
62
63
  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", {
64
+ children: [
65
+ /* @__PURE__ */ y(_, { className: "h-4 w-4" }),
66
+ " ",
67
+ r("atheletebridge.pages.fixtures.tournamentBracket", "Tournament bracket")
68
+ ]
69
+ }), /* @__PURE__ */ b("button", {
65
70
  type: "button",
66
71
  "data-tour": "fixtures-create",
67
- onClick: () => n("/fixtures/new"),
72
+ onClick: () => i("/fixtures/new"),
68
73
  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",
69
- children: [/* @__PURE__ */ v(h, { className: "h-4 w-4" }), " Schedule fixture"]
74
+ children: [
75
+ /* @__PURE__ */ y(g, { className: "h-4 w-4" }),
76
+ " ",
77
+ r("atheletebridge.pages.fixtures.scheduleFixture", "Schedule fixture")
78
+ ]
70
79
  })]
71
80
  }),
72
- children: [/* @__PURE__ */ y("div", {
81
+ children: [/* @__PURE__ */ b("div", {
73
82
  "data-tour": "fixtures-filters",
74
83
  className: "mb-6 flex flex-wrap items-center gap-3",
75
84
  children: [
76
- /* @__PURE__ */ v(u, {
77
- ariaLabel: "Filter by status",
78
- allLabel: "All statuses",
79
- value: r,
85
+ /* @__PURE__ */ y(d, {
86
+ ariaLabel: r("atheletebridge.pages.fixtures.filterStatus", "Filter by status"),
87
+ allLabel: r("atheletebridge.pages.fixtures.allStatuses", "All statuses"),
88
+ value: w,
80
89
  onChange: (e) => {
81
- C(e), I();
90
+ T(e), R();
82
91
  },
83
- options: x
92
+ options: S
84
93
  }),
85
- /* @__PURE__ */ v(u, {
86
- ariaLabel: "Filter by team",
87
- allLabel: "All teams",
88
- value: w,
94
+ /* @__PURE__ */ y(d, {
95
+ ariaLabel: r("atheletebridge.pages.fixtures.filterTeam", "Filter by team"),
96
+ allLabel: r("atheletebridge.pages.fixtures.allTeams", "All teams"),
97
+ value: E,
89
98
  onChange: (e) => {
90
- T(e), I();
99
+ D(e), R();
91
100
  },
92
- options: j
101
+ options: N
93
102
  }),
94
- /* @__PURE__ */ v(u, {
95
- ariaLabel: "Filter by type",
96
- allLabel: "All types",
97
- value: E,
98
- onChange: (e) => D(e),
99
- options: S
103
+ /* @__PURE__ */ y(d, {
104
+ ariaLabel: r("atheletebridge.pages.fixtures.filterType", "Filter by type"),
105
+ allLabel: r("atheletebridge.pages.fixtures.allTypes", "All types"),
106
+ value: O,
107
+ onChange: (e) => k(e),
108
+ options: C
100
109
  })
101
110
  ]
102
- }), M.isLoading ? /* @__PURE__ */ v(o, { label: "Loading fixtures…" }) : M.isError ? /* @__PURE__ */ v(a, { onRetry: () => void M.refetch() }) : N.length === 0 ? /* @__PURE__ */ v(i, {
111
+ }), P.isLoading ? /* @__PURE__ */ y(s, { label: r("atheletebridge.pages.fixtures.loading", "Loading fixtures…") }) : P.isError ? /* @__PURE__ */ y(o, { onRetry: () => void P.refetch() }) : F.length === 0 ? /* @__PURE__ */ y(a, {
103
112
  illustration: "empty-calendar",
104
- icon: /* @__PURE__ */ v(m, { className: "h-10 w-10" }),
105
- title: "No fixtures found",
106
- description: F ? "Try clearing your filters to see all fixtures." : "Schedule a match to start tracking results and standings.",
107
- action: /* @__PURE__ */ v("button", {
113
+ icon: /* @__PURE__ */ y(h, { className: "h-10 w-10" }),
114
+ title: r("atheletebridge.pages.fixtures.noFixtures", "No fixtures found"),
115
+ description: L ? r("atheletebridge.pages.fixtures.noFixturesFilterHint", "Try clearing your filters to see all fixtures.") : r("atheletebridge.pages.fixtures.noFixturesHint", "Schedule a match to start tracking results and standings."),
116
+ action: /* @__PURE__ */ y("button", {
108
117
  type: "button",
109
- onClick: () => n("/fixtures/new"),
118
+ onClick: () => i("/fixtures/new"),
110
119
  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",
111
- children: "Schedule fixture"
120
+ children: r("atheletebridge.pages.fixtures.scheduleFixtureAction", "Schedule fixture")
112
121
  })
113
- }) : /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v("div", {
122
+ }) : /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y("div", {
114
123
  className: "grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",
115
- children: N.map((e) => /* @__PURE__ */ v(d, {
124
+ children: F.map((e) => /* @__PURE__ */ y(f, {
116
125
  fixture: e,
117
- onClick: () => n(`/fixtures/${e.id}`)
126
+ onClick: () => i(`/fixtures/${e.id}`)
118
127
  }, e.id))
119
- }), /* @__PURE__ */ v(l, {
128
+ }), /* @__PURE__ */ y(u, {
120
129
  className: "mt-6",
121
- page: O,
122
- hasMore: P,
123
- onPrev: () => k((e) => Math.max(0, e - 1)),
124
- onNext: () => k((e) => e + 1)
130
+ page: A,
131
+ hasMore: I,
132
+ onPrev: () => j((e) => Math.max(0, e - 1)),
133
+ onNext: () => j((e) => e + 1)
125
134
  })] })]
126
135
  });
127
136
  }
128
137
  //#endregion
129
- export { C as FixturesListPage };
138
+ export { w as FixturesListPage };
130
139
 
131
140
  //# 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 * 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 data-tour=\"fixtures-create\"\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 data-tour=\"fixtures-filters\" 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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"}
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 { useAbTranslate } from '../../i18n';\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 tr = useAbTranslate();\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={tr('atheletebridge.pages.fixtures.title', 'Fixtures')}\n description={tr(\n 'atheletebridge.pages.fixtures.description',\n 'Matches across friendlies, league games, cups, tournaments and scrimmages.'\n )}\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\" /> {tr('atheletebridge.pages.fixtures.tournamentBracket', 'Tournament bracket')}\n </button>\n <button\n type=\"button\"\n data-tour=\"fixtures-create\"\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\" /> {tr('atheletebridge.pages.fixtures.scheduleFixture', 'Schedule fixture')}\n </button>\n </div>\n }\n >\n <div data-tour=\"fixtures-filters\" className=\"mb-6 flex flex-wrap items-center gap-3\">\n <FilterSelect\n ariaLabel={tr('atheletebridge.pages.fixtures.filterStatus', 'Filter by status')}\n allLabel={tr('atheletebridge.pages.fixtures.allStatuses', 'All statuses')}\n value={status}\n onChange={(v) => {\n setStatus(v);\n resetPage();\n }}\n options={STATUS_OPTS}\n />\n <FilterSelect\n ariaLabel={tr('atheletebridge.pages.fixtures.filterTeam', 'Filter by team')}\n allLabel={tr('atheletebridge.pages.fixtures.allTeams', 'All teams')}\n value={teamId}\n onChange={(v) => {\n setTeamId(v);\n resetPage();\n }}\n options={teamOpts}\n />\n <FilterSelect\n ariaLabel={tr('atheletebridge.pages.fixtures.filterType', 'Filter by type')}\n allLabel={tr('atheletebridge.pages.fixtures.allTypes', 'All types')}\n value={type}\n onChange={(v) => setType(v)}\n options={TYPE_OPTS}\n />\n </div>\n\n {fixtures.isLoading ? (\n <LoadingState label={tr('atheletebridge.pages.fixtures.loading', '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={tr('atheletebridge.pages.fixtures.noFixtures', 'No fixtures found')}\n description={\n hasFilters\n ? tr(\n 'atheletebridge.pages.fixtures.noFixturesFilterHint',\n 'Try clearing your filters to see all fixtures.'\n )\n : tr(\n 'atheletebridge.pages.fixtures.noFixturesHint',\n 'Schedule a match to start tracking results and standings.'\n )\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 {tr('atheletebridge.pages.fixtures.scheduleFixtureAction', '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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"OnboardingPage.d.ts","sourceRoot":"","sources":["../../../../src/atheletebridge/pages/onboarding/OnboardingPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAkC,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAwNhF,eAAO,MAAM,cAAc,EAAE,EAoT5B,CAAC"}
1
+ {"version":3,"file":"OnboardingPage.d.ts","sourceRoot":"","sources":["../../../../src/atheletebridge/pages/onboarding/OnboardingPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAkC,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAmOhF,eAAO,MAAM,cAAc,EAAE,EAuX5B,CAAC"}