@burdenoff/microfe-atheletebridge 2026.827.1 → 2026.829.2

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 (46) 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/pages/DashboardPage.d.ts.map +1 -1
  8. package/dist/atheletebridge/pages/DashboardPage.js +56 -24
  9. package/dist/atheletebridge/pages/DashboardPage.js.map +1 -1
  10. package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.d.ts.map +1 -1
  11. package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.js +58 -56
  12. package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.js.map +1 -1
  13. package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.d.ts.map +1 -1
  14. package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js +110 -106
  15. package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js.map +1 -1
  16. package/dist/atheletebridge/pages/fixtures/FixturesListPage.d.ts.map +1 -1
  17. package/dist/atheletebridge/pages/fixtures/FixturesListPage.js +80 -71
  18. package/dist/atheletebridge/pages/fixtures/FixturesListPage.js.map +1 -1
  19. package/dist/atheletebridge/pages/onboarding/OnboardingPage.d.ts.map +1 -1
  20. package/dist/atheletebridge/pages/onboarding/OnboardingPage.js +244 -210
  21. package/dist/atheletebridge/pages/onboarding/OnboardingPage.js.map +1 -1
  22. package/dist/atheletebridge/pages/performance/PerformancePage.d.ts.map +1 -1
  23. package/dist/atheletebridge/pages/performance/PerformancePage.js +197 -148
  24. package/dist/atheletebridge/pages/performance/PerformancePage.js.map +1 -1
  25. package/dist/atheletebridge/pages/programs/ProgramDetailPage.d.ts.map +1 -1
  26. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +169 -143
  27. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -1
  28. package/dist/atheletebridge/pages/programs/ProgramsListPage.d.ts.map +1 -1
  29. package/dist/atheletebridge/pages/programs/ProgramsListPage.js +77 -72
  30. package/dist/atheletebridge/pages/programs/ProgramsListPage.js.map +1 -1
  31. package/dist/atheletebridge/pages/sessions/SessionDetailPage.d.ts.map +1 -1
  32. package/dist/atheletebridge/pages/sessions/SessionDetailPage.js +104 -86
  33. package/dist/atheletebridge/pages/sessions/SessionDetailPage.js.map +1 -1
  34. package/dist/atheletebridge/pages/sessions/SessionsListPage.d.ts.map +1 -1
  35. package/dist/atheletebridge/pages/sessions/SessionsListPage.js +54 -49
  36. package/dist/atheletebridge/pages/sessions/SessionsListPage.js.map +1 -1
  37. package/dist/atheletebridge/pages/teams/TeamDetailPage.d.ts.map +1 -1
  38. package/dist/atheletebridge/pages/teams/TeamDetailPage.js +286 -267
  39. package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -1
  40. package/dist/atheletebridge/pages/teams/TeamFormPage.d.ts.map +1 -1
  41. package/dist/atheletebridge/pages/teams/TeamFormPage.js +185 -180
  42. package/dist/atheletebridge/pages/teams/TeamFormPage.js.map +1 -1
  43. package/dist/atheletebridge/pages/teams/TeamsListPage.d.ts.map +1 -1
  44. package/dist/atheletebridge/pages/teams/TeamsListPage.js +70 -74
  45. package/dist/atheletebridge/pages/teams/TeamsListPage.js.map +1 -1
  46. package/package.json +1 -1
@@ -1,16 +1,17 @@
1
- import { useAthleteBridge as e } from "../../context/AthleteBridgeContext.js";
2
- import { PageLayout as t } from "../../components/PageLayout.js";
3
- import { SessionCard as n } from "../../components/SessionCard.js";
4
- import { EmptyState as r } from "../../components/EmptyState.js";
5
- import { ErrorState as i, LoadingState as a } from "../../components/LoadingState.js";
6
- import { useSessions as o, useUserDirectory as s } from "../../hooks/useAthleteBridgeApi.js";
7
- import { CursorPager as c } from "../../components/CursorPager.js";
8
- import { FilterSelect as l } from "../../components/FilterSelect.js";
9
- import { useMemo as u, useState as d } from "react";
10
- import { ClipboardCheck as f, Plus as p } from "lucide-react";
11
- import { Fragment as m, jsx as h, jsxs as g } 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 { SessionCard as r } from "../../components/SessionCard.js";
5
+ import { EmptyState as i } from "../../components/EmptyState.js";
6
+ import { ErrorState as a, LoadingState as o } from "../../components/LoadingState.js";
7
+ import { useSessions as s, useUserDirectory as c } from "../../hooks/useAthleteBridgeApi.js";
8
+ import { CursorPager as l } from "../../components/CursorPager.js";
9
+ import { FilterSelect as u } from "../../components/FilterSelect.js";
10
+ import { useMemo as d, useState as f } from "react";
11
+ import { ClipboardCheck as p, Plus as m } from "lucide-react";
12
+ import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
12
13
  //#region src/atheletebridge/pages/sessions/SessionsListPage.tsx
13
- var _ = 12, v = [
14
+ var v = 12, y = [
14
15
  {
15
16
  value: "REQUESTED",
16
17
  label: "Requested"
@@ -32,65 +33,69 @@ var _ = 12, v = [
32
33
  label: "No show"
33
34
  }
34
35
  ];
35
- function y() {
36
- let { navigateTo: y } = e(), [b, x] = d(""), [S, C] = d(0), w = o({
37
- status: b || void 0,
36
+ function b() {
37
+ let b = e(), { navigateTo: x } = t(), [S, C] = f(""), [w, T] = f(0), E = s({
38
+ status: S || void 0,
38
39
  pagination: {
39
- limit: _,
40
- offset: S * _
40
+ limit: v,
41
+ offset: w * v
41
42
  }
42
- }), T = w.data?.items ?? [], E = w.data?.pageInfo.hasMore ?? !1, D = s(u(() => (w.data?.items ?? []).flatMap((e) => [e.athleteId, e.coachId]), [w.data]));
43
- return /* @__PURE__ */ g(t, {
44
- title: "Sessions",
45
- description: "One-to-one coaching sessions with a request → confirm → complete flow.",
46
- actions: /* @__PURE__ */ g("button", {
43
+ }), D = E.data?.items ?? [], O = E.data?.pageInfo.hasMore ?? !1, k = c(d(() => (E.data?.items ?? []).flatMap((e) => [e.athleteId, e.coachId]), [E.data]));
44
+ return /* @__PURE__ */ _(n, {
45
+ title: b("atheletebridge.pages.sessions.title", "Sessions"),
46
+ description: b("atheletebridge.pages.sessions.description", "One-to-one coaching sessions with a request → confirm → complete flow."),
47
+ actions: /* @__PURE__ */ _("button", {
47
48
  type: "button",
48
49
  "data-tour": "sessions-create",
49
- onClick: () => y("/sessions/new"),
50
+ onClick: () => x("/sessions/new"),
50
51
  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",
51
- children: [/* @__PURE__ */ h(p, { className: "h-4 w-4" }), " Book session"]
52
+ children: [
53
+ /* @__PURE__ */ g(m, { className: "h-4 w-4" }),
54
+ " ",
55
+ b("atheletebridge.pages.sessions.bookSession", "Book session")
56
+ ]
52
57
  }),
53
- children: [/* @__PURE__ */ h("div", {
58
+ children: [/* @__PURE__ */ g("div", {
54
59
  "data-tour": "sessions-filters",
55
60
  className: "mb-6 flex flex-wrap items-center gap-3",
56
- children: /* @__PURE__ */ h(l, {
57
- ariaLabel: "Filter by status",
58
- allLabel: "All statuses",
59
- value: b,
61
+ children: /* @__PURE__ */ g(u, {
62
+ ariaLabel: b("atheletebridge.pages.sessions.filterStatus", "Filter by status"),
63
+ allLabel: b("atheletebridge.pages.sessions.allStatuses", "All statuses"),
64
+ value: S,
60
65
  onChange: (e) => {
61
- x(e), C(0);
66
+ C(e), T(0);
62
67
  },
63
- options: v
68
+ options: y
64
69
  })
65
- }), w.isLoading ? /* @__PURE__ */ h(a, { label: "Loading sessions…" }) : w.isError ? /* @__PURE__ */ h(i, { onRetry: () => void w.refetch() }) : T.length === 0 ? /* @__PURE__ */ h(r, {
70
+ }), E.isLoading ? /* @__PURE__ */ g(o, { label: b("atheletebridge.pages.sessions.loading", "Loading sessions…") }) : E.isError ? /* @__PURE__ */ g(a, { onRetry: () => void E.refetch() }) : D.length === 0 ? /* @__PURE__ */ g(i, {
66
71
  illustration: "empty-calendar",
67
- icon: /* @__PURE__ */ h(f, { className: "h-10 w-10" }),
68
- title: "No sessions found",
69
- description: b ? "Try clearing your filter to see all sessions." : "Book a coaching session with an athlete to get started.",
70
- action: /* @__PURE__ */ h("button", {
72
+ icon: /* @__PURE__ */ g(p, { className: "h-10 w-10" }),
73
+ title: b("atheletebridge.pages.sessions.noSessions", "No sessions found"),
74
+ description: S ? b("atheletebridge.pages.sessions.noSessionsFilterHint", "Try clearing your filter to see all sessions.") : b("atheletebridge.pages.sessions.noSessionsHint", "Book a coaching session with an athlete to get started."),
75
+ action: /* @__PURE__ */ g("button", {
71
76
  type: "button",
72
- onClick: () => y("/sessions/new"),
77
+ onClick: () => x("/sessions/new"),
73
78
  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",
74
- children: "Book session"
79
+ children: b("atheletebridge.pages.sessions.bookSessionAction", "Book session")
75
80
  })
76
- }) : /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h("div", {
81
+ }) : /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("div", {
77
82
  className: "grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",
78
- children: T.map((e) => /* @__PURE__ */ h(n, {
83
+ children: D.map((e) => /* @__PURE__ */ g(r, {
79
84
  session: e,
80
- athleteName: D.nameOf(e.athleteId),
81
- coachName: D.nameOf(e.coachId),
82
- onClick: () => y(`/sessions/${e.id}`)
85
+ athleteName: k.nameOf(e.athleteId),
86
+ coachName: k.nameOf(e.coachId),
87
+ onClick: () => x(`/sessions/${e.id}`)
83
88
  }, e.id))
84
- }), /* @__PURE__ */ h(c, {
89
+ }), /* @__PURE__ */ g(l, {
85
90
  className: "mt-6",
86
- page: S,
87
- hasMore: E,
88
- onPrev: () => C((e) => Math.max(0, e - 1)),
89
- onNext: () => C((e) => e + 1)
91
+ page: w,
92
+ hasMore: O,
93
+ onPrev: () => T((e) => Math.max(0, e - 1)),
94
+ onNext: () => T((e) => e + 1)
90
95
  })] })]
91
96
  });
92
97
  }
93
98
  //#endregion
94
- export { y as SessionsListPage };
99
+ export { b as SessionsListPage };
95
100
 
96
101
  //# sourceMappingURL=SessionsListPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SessionsListPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/sessions/SessionsListPage.tsx"],"sourcesContent":["/**\n * Sessions List\n * @module atheletebridge/pages/sessions\n */\n\nimport { useMemo, useState } from 'react';\nimport { ClipboardCheck, Plus } from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { SessionCard } from '../../components/SessionCard';\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 { useSessions, useUserDirectory } from '../../hooks/useAthleteBridgeApi';\nimport type { AthSessionStatus } from '../../types';\n\nconst PAGE_SIZE = 12;\n\nconst STATUS_OPTS: ReadonlyArray<{ value: AthSessionStatus; label: string }> = [\n { value: 'REQUESTED', label: 'Requested' },\n { value: 'CONFIRMED', label: 'Confirmed' },\n { value: 'COMPLETED', label: 'Completed' },\n { value: 'CANCELLED', label: 'Cancelled' },\n { value: 'NO_SHOW', label: 'No show' },\n];\n\nexport function SessionsListPage() {\n const { navigateTo } = useAthleteBridge();\n const [status, setStatus] = useState<AthSessionStatus | ''>('');\n const [page, setPage] = useState(0);\n\n const sessions = useSessions({\n status: status || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = sessions.data?.items ?? [];\n const hasMore = sessions.data?.pageInfo.hasMore ?? false;\n\n // Resolve the athlete + coach behind each session so cards read like the mock\n // (name + monogram avatar) rather than a bare id. One batched federation call.\n const directoryIds = useMemo(\n () => (sessions.data?.items ?? []).flatMap((s) => [s.athleteId, s.coachId]),\n [sessions.data]\n );\n const directory = useUserDirectory(directoryIds);\n\n return (\n <PageLayout\n title=\"Sessions\"\n description=\"One-to-one coaching sessions with a request → confirm → complete flow.\"\n actions={\n <button\n type=\"button\"\n data-tour=\"sessions-create\"\n onClick={() => navigateTo('/sessions/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\" /> Book session\n </button>\n }\n >\n <div data-tour=\"sessions-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 setPage(0);\n }}\n options={STATUS_OPTS}\n />\n </div>\n\n {sessions.isLoading ? (\n <LoadingState label=\"Loading sessions…\" />\n ) : sessions.isError ? (\n <ErrorState onRetry={() => void sessions.refetch()} />\n ) : items.length === 0 ? (\n <EmptyState\n illustration=\"empty-calendar\"\n icon={<ClipboardCheck className=\"h-10 w-10\" />}\n title=\"No sessions found\"\n description={\n status\n ? 'Try clearing your filter to see all sessions.'\n : 'Book a coaching session with an athlete to get started.'\n }\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/sessions/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 Book session\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((session) => (\n <SessionCard\n key={session.id}\n session={session}\n athleteName={directory.nameOf(session.athleteId)}\n coachName={directory.nameOf(session.coachId)}\n onClick={() => navigateTo(`/sessions/${session.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":";;;;;;;;;;;;AAiBA,IAAM,IAAY,IAEZ,IAAyE;CAC7E;EAAE,OAAO;EAAa,OAAO;CAAY;CACzC;EAAE,OAAO;EAAa,OAAO;CAAY;CACzC;EAAE,OAAO;EAAa,OAAO;CAAY;CACzC;EAAE,OAAO;EAAa,OAAO;CAAY;CACzC;EAAE,OAAO;EAAW,OAAO;CAAU;AACvC;AAEA,SAAgB,IAAmB;CACjC,IAAM,EAAE,kBAAe,EAAiB,GAClC,CAAC,GAAQ,KAAa,EAAgC,EAAE,GACxD,CAAC,GAAM,KAAW,EAAS,CAAC,GAE5B,IAAW,EAAY;EAC3B,QAAQ,KAAU,KAAA;EAClB,YAAY;GAAE,OAAO;GAAW,QAAQ,IAAO;EAAU;CAC3D,CAAC,GAEK,IAAQ,EAAS,MAAM,SAAS,CAAC,GACjC,IAAU,EAAS,MAAM,SAAS,WAAW,IAQ7C,IAAY,EAJG,SACZ,EAAS,MAAM,SAAS,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,GAC1E,CAAC,EAAS,IAAI,CAEmB,CAAY;CAE/C,OACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GACE,MAAK;GACL,aAAU;GACV,eAAe,EAAW,eAAe;GACzC,WAAU;aAJZ,CAME,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,GAAC,eACtB;;YAXZ,CAcE,kBAAC,OAAD;GAAK,aAAU;GAAmB,WAAU;aAC1C,kBAAC,GAAD;IACE,WAAU;IACV,UAAS;IACT,OAAO;IACP,WAAW,MAAM;KAEf,AADA,EAAU,CAAC,GACX,EAAQ,CAAC;IACX;IACA,SAAS;GACV,CAAA;EACE,CAAA,GAEJ,EAAS,YACR,kBAAC,GAAD,EAAc,OAAM,oBAAqB,CAAA,IACvC,EAAS,UACX,kBAAC,GAAD,EAAY,eAAe,KAAK,EAAS,QAAQ,EAAI,CAAA,IACnD,EAAM,WAAW,IACnB,kBAAC,GAAD;GACE,cAAa;GACb,MAAM,kBAAC,GAAD,EAAgB,WAAU,YAAa,CAAA;GAC7C,OAAM;GACN,aACE,IACI,kDACA;GAEN,QACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAW,eAAe;IACzC,WAAU;cACX;GAEO,CAAA;EAEX,CAAA,IAED,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,KAAK,MACV,kBAAC,GAAD;IAEW;IACT,aAAa,EAAU,OAAO,EAAQ,SAAS;IAC/C,WAAW,EAAU,OAAO,EAAQ,OAAO;IAC3C,eAAe,EAAW,aAAa,EAAQ,IAAI;GACpD,GALM,EAAQ,EAKd,CACF;EACE,CAAA,GACL,kBAAC,GAAD;GACE,WAAU;GACJ;GACG;GACT,cAAc,GAAS,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;GAC/C,cAAc,GAAS,MAAM,IAAI,CAAC;EACnC,CAAA,CACD,EAAA,CAAA,CAEM;;AAEhB"}
1
+ {"version":3,"file":"SessionsListPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/sessions/SessionsListPage.tsx"],"sourcesContent":["/**\n * Sessions List\n * @module atheletebridge/pages/sessions\n */\n\nimport { useMemo, useState } from 'react';\nimport { ClipboardCheck, Plus } from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { SessionCard } from '../../components/SessionCard';\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 { useSessions, useUserDirectory } from '../../hooks/useAthleteBridgeApi';\nimport { useAbTranslate } from '../../i18n';\nimport type { AthSessionStatus } from '../../types';\n\nconst PAGE_SIZE = 12;\n\nconst STATUS_OPTS: ReadonlyArray<{ value: AthSessionStatus; label: string }> = [\n { value: 'REQUESTED', label: 'Requested' },\n { value: 'CONFIRMED', label: 'Confirmed' },\n { value: 'COMPLETED', label: 'Completed' },\n { value: 'CANCELLED', label: 'Cancelled' },\n { value: 'NO_SHOW', label: 'No show' },\n];\n\nexport function SessionsListPage() {\n const tr = useAbTranslate();\n const { navigateTo } = useAthleteBridge();\n const [status, setStatus] = useState<AthSessionStatus | ''>('');\n const [page, setPage] = useState(0);\n\n const sessions = useSessions({\n status: status || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = sessions.data?.items ?? [];\n const hasMore = sessions.data?.pageInfo.hasMore ?? false;\n\n // Resolve the athlete + coach behind each session so cards read like the mock\n // (name + monogram avatar) rather than a bare id. One batched federation call.\n const directoryIds = useMemo(\n () => (sessions.data?.items ?? []).flatMap((s) => [s.athleteId, s.coachId]),\n [sessions.data]\n );\n const directory = useUserDirectory(directoryIds);\n\n return (\n <PageLayout\n title={tr('atheletebridge.pages.sessions.title', 'Sessions')}\n description={tr(\n 'atheletebridge.pages.sessions.description',\n 'One-to-one coaching sessions with a request → confirm → complete flow.'\n )}\n actions={\n <button\n type=\"button\"\n data-tour=\"sessions-create\"\n onClick={() => navigateTo('/sessions/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\" />{' '}\n {tr('atheletebridge.pages.sessions.bookSession', 'Book session')}\n </button>\n }\n >\n <div data-tour=\"sessions-filters\" className=\"mb-6 flex flex-wrap items-center gap-3\">\n <FilterSelect\n ariaLabel={tr('atheletebridge.pages.sessions.filterStatus', 'Filter by status')}\n allLabel={tr('atheletebridge.pages.sessions.allStatuses', 'All statuses')}\n value={status}\n onChange={(v) => {\n setStatus(v);\n setPage(0);\n }}\n options={STATUS_OPTS}\n />\n </div>\n\n {sessions.isLoading ? (\n <LoadingState label={tr('atheletebridge.pages.sessions.loading', 'Loading sessions…')} />\n ) : sessions.isError ? (\n <ErrorState onRetry={() => void sessions.refetch()} />\n ) : items.length === 0 ? (\n <EmptyState\n illustration=\"empty-calendar\"\n icon={<ClipboardCheck className=\"h-10 w-10\" />}\n title={tr('atheletebridge.pages.sessions.noSessions', 'No sessions found')}\n description={\n status\n ? tr(\n 'atheletebridge.pages.sessions.noSessionsFilterHint',\n 'Try clearing your filter to see all sessions.'\n )\n : tr(\n 'atheletebridge.pages.sessions.noSessionsHint',\n 'Book a coaching session with an athlete to get started.'\n )\n }\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/sessions/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.sessions.bookSessionAction', 'Book session')}\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((session) => (\n <SessionCard\n key={session.id}\n session={session}\n athleteName={directory.nameOf(session.athleteId)}\n coachName={directory.nameOf(session.coachId)}\n onClick={() => navigateTo(`/sessions/${session.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":";;;;;;;;;;;;;AAkBA,IAAM,IAAY,IAEZ,IAAyE;CAC7E;EAAE,OAAO;EAAa,OAAO;CAAY;CACzC;EAAE,OAAO;EAAa,OAAO;CAAY;CACzC;EAAE,OAAO;EAAa,OAAO;CAAY;CACzC;EAAE,OAAO;EAAa,OAAO;CAAY;CACzC;EAAE,OAAO;EAAW,OAAO;CAAU;AACvC;AAEA,SAAgB,IAAmB;CACjC,IAAM,IAAK,EAAe,GACpB,EAAE,kBAAe,EAAiB,GAClC,CAAC,GAAQ,KAAa,EAAgC,EAAE,GACxD,CAAC,GAAM,KAAW,EAAS,CAAC,GAE5B,IAAW,EAAY;EAC3B,QAAQ,KAAU,KAAA;EAClB,YAAY;GAAE,OAAO;GAAW,QAAQ,IAAO;EAAU;CAC3D,CAAC,GAEK,IAAQ,EAAS,MAAM,SAAS,CAAC,GACjC,IAAU,EAAS,MAAM,SAAS,WAAW,IAQ7C,IAAY,EAJG,SACZ,EAAS,MAAM,SAAS,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,GAC1E,CAAC,EAAS,IAAI,CAEmB,CAAY;CAE/C,OACE,kBAAC,GAAD;EACE,OAAO,EAAG,uCAAuC,UAAU;EAC3D,aAAa,EACX,6CACA,wEACF;EACA,SACE,kBAAC,UAAD;GACE,MAAK;GACL,aAAU;GACV,eAAe,EAAW,eAAe;GACzC,WAAU;aAJZ;IAME,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA;IAAE;IAC5B,EAAG,6CAA6C,cAAc;GACzD;;YAfZ,CAkBE,kBAAC,OAAD;GAAK,aAAU;GAAmB,WAAU;aAC1C,kBAAC,GAAD;IACE,WAAW,EAAG,8CAA8C,kBAAkB;IAC9E,UAAU,EAAG,6CAA6C,cAAc;IACxE,OAAO;IACP,WAAW,MAAM;KAEf,AADA,EAAU,CAAC,GACX,EAAQ,CAAC;IACX;IACA,SAAS;GACV,CAAA;EACE,CAAA,GAEJ,EAAS,YACR,kBAAC,GAAD,EAAc,OAAO,EAAG,yCAAyC,mBAAmB,EAAI,CAAA,IACtF,EAAS,UACX,kBAAC,GAAD,EAAY,eAAe,KAAK,EAAS,QAAQ,EAAI,CAAA,IACnD,EAAM,WAAW,IACnB,kBAAC,GAAD;GACE,cAAa;GACb,MAAM,kBAAC,GAAD,EAAgB,WAAU,YAAa,CAAA;GAC7C,OAAO,EAAG,4CAA4C,mBAAmB;GACzE,aACE,IACI,EACE,sDACA,+CACF,IACA,EACE,gDACA,yDACF;GAEN,QACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAW,eAAe;IACzC,WAAU;cAET,EAAG,mDAAmD,cAAc;GAC/D,CAAA;EAEX,CAAA,IAED,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,KAAK,MACV,kBAAC,GAAD;IAEW;IACT,aAAa,EAAU,OAAO,EAAQ,SAAS;IAC/C,WAAW,EAAU,OAAO,EAAQ,OAAO;IAC3C,eAAe,EAAW,aAAa,EAAQ,IAAI;GACpD,GALM,EAAQ,EAKd,CACF;EACE,CAAA,GACL,kBAAC,GAAD;GACE,WAAU;GACJ;GACG;GACT,cAAc,GAAS,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;GAC/C,cAAc,GAAS,MAAM,IAAI,CAAC;EACnC,CAAA,CACD,EAAA,CAAA,CAEM;;AAEhB"}
@@ -1 +1 @@
1
- {"version":3,"file":"TeamDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/atheletebridge/pages/teams/TeamDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiHH,wBAAgB,cAAc,gCA4kB7B"}
1
+ {"version":3,"file":"TeamDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/atheletebridge/pages/teams/TeamDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAkHH,wBAAgB,cAAc,gCAmnB7B"}