@burdenoff/microfe-atheletebridge 2026.713.1 → 2026.716.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 (72) hide show
  1. package/dist/atheletebridge/AthleteBridgeRoot.js +50 -53
  2. package/dist/atheletebridge/AthleteBridgeRoot.js.map +1 -1
  3. package/dist/atheletebridge/AthleteBridgeRoutes.d.ts.map +1 -1
  4. package/dist/atheletebridge/AthleteBridgeRoutes.js +29 -25
  5. package/dist/atheletebridge/AthleteBridgeRoutes.js.map +1 -1
  6. package/dist/atheletebridge/admin/AdminDashboardPage.d.ts +4 -0
  7. package/dist/atheletebridge/admin/AdminDashboardPage.d.ts.map +1 -0
  8. package/dist/atheletebridge/admin/AdminDashboardPage.js +553 -0
  9. package/dist/atheletebridge/admin/AdminDashboardPage.js.map +1 -0
  10. package/dist/atheletebridge/admin/AdminRoot.d.ts +9 -0
  11. package/dist/atheletebridge/admin/AdminRoot.d.ts.map +1 -0
  12. package/dist/atheletebridge/admin/AdminRoot.js +23 -0
  13. package/dist/atheletebridge/admin/AdminRoot.js.map +1 -0
  14. package/dist/atheletebridge/admin/index.d.ts +11 -0
  15. package/dist/atheletebridge/admin/index.d.ts.map +1 -0
  16. package/dist/atheletebridge/admin/index.js +2 -0
  17. package/dist/atheletebridge/components/DrillVideoLink.js +1 -1
  18. package/dist/atheletebridge/components/DrillVideoLink.js.map +1 -1
  19. package/dist/atheletebridge/components/ProgramCard.js +1 -1
  20. package/dist/atheletebridge/components/ProgramCard.js.map +1 -1
  21. package/dist/atheletebridge/components/TeamCard.js +1 -1
  22. package/dist/atheletebridge/components/TeamCard.js.map +1 -1
  23. package/dist/atheletebridge/components/UserSearchSelect.js +2 -2
  24. package/dist/atheletebridge/components/UserSearchSelect.js.map +1 -1
  25. package/dist/atheletebridge/components/domain.js +3 -3
  26. package/dist/atheletebridge/components/domain.js.map +1 -1
  27. package/dist/atheletebridge/hooks/index.js +1 -0
  28. package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts.map +1 -1
  29. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +39 -39
  30. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
  31. package/dist/atheletebridge/i18n.d.ts +26 -0
  32. package/dist/atheletebridge/i18n.d.ts.map +1 -0
  33. package/dist/atheletebridge/i18n.js +14 -0
  34. package/dist/atheletebridge/i18n.js.map +1 -0
  35. package/dist/atheletebridge/index.d.ts +1 -0
  36. package/dist/atheletebridge/index.d.ts.map +1 -1
  37. package/dist/atheletebridge/index.js +3 -0
  38. package/dist/atheletebridge/pages/DashboardPage.d.ts.map +1 -1
  39. package/dist/atheletebridge/pages/DashboardPage.js +166 -144
  40. package/dist/atheletebridge/pages/DashboardPage.js.map +1 -1
  41. package/dist/atheletebridge/pages/StandingsPage.d.ts.map +1 -1
  42. package/dist/atheletebridge/pages/StandingsPage.js +98 -92
  43. package/dist/atheletebridge/pages/StandingsPage.js.map +1 -1
  44. package/dist/atheletebridge/pages/fixtures/FixturesListPage.d.ts.map +1 -1
  45. package/dist/atheletebridge/pages/fixtures/FixturesListPage.js +6 -4
  46. package/dist/atheletebridge/pages/fixtures/FixturesListPage.js.map +1 -1
  47. package/dist/atheletebridge/pages/onboarding/OnboardingPage.d.ts +4 -0
  48. package/dist/atheletebridge/pages/onboarding/OnboardingPage.d.ts.map +1 -0
  49. package/dist/atheletebridge/pages/onboarding/OnboardingPage.js +371 -0
  50. package/dist/atheletebridge/pages/onboarding/OnboardingPage.js.map +1 -0
  51. package/dist/atheletebridge/pages/performance/PerformancePage.d.ts.map +1 -1
  52. package/dist/atheletebridge/pages/performance/PerformancePage.js +42 -41
  53. package/dist/atheletebridge/pages/performance/PerformancePage.js.map +1 -1
  54. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +3 -3
  55. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -1
  56. package/dist/atheletebridge/pages/programs/ProgramsListPage.d.ts.map +1 -1
  57. package/dist/atheletebridge/pages/programs/ProgramsListPage.js +9 -7
  58. package/dist/atheletebridge/pages/programs/ProgramsListPage.js.map +1 -1
  59. package/dist/atheletebridge/pages/sessions/SessionDetailPage.js +1 -1
  60. package/dist/atheletebridge/pages/sessions/SessionDetailPage.js.map +1 -1
  61. package/dist/atheletebridge/pages/sessions/SessionsListPage.d.ts.map +1 -1
  62. package/dist/atheletebridge/pages/sessions/SessionsListPage.js +6 -4
  63. package/dist/atheletebridge/pages/sessions/SessionsListPage.js.map +1 -1
  64. package/dist/atheletebridge/pages/teams/TeamDetailPage.js +1 -1
  65. package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -1
  66. package/dist/atheletebridge/pages/teams/TeamsListPage.d.ts.map +1 -1
  67. package/dist/atheletebridge/pages/teams/TeamsListPage.js +8 -6
  68. package/dist/atheletebridge/pages/teams/TeamsListPage.js.map +1 -1
  69. package/dist/atheletebridge/types/index.d.ts +19 -3
  70. package/dist/atheletebridge/types/index.d.ts.map +1 -1
  71. package/dist/index.js +5 -3
  72. package/package.json +13 -2
@@ -0,0 +1,23 @@
1
+ import { AthleteBridgeProvider as e } from "../context/AthleteBridgeContext.js";
2
+ import "../context/index.js";
3
+ import { AdminDashboardPage as t } from "./AdminDashboardPage.js";
4
+ import { QueryClient as n, QueryClientProvider as r } from "@tanstack/react-query";
5
+ import { jsx as i } from "react/jsx-runtime";
6
+ //#region src/atheletebridge/admin/AdminRoot.tsx
7
+ var a = new n({ defaultOptions: { queries: {
8
+ staleTime: 60 * 1e3,
9
+ retry: 1
10
+ } } }), o = (n) => {
11
+ let { workspaceToken: o, ...s } = n;
12
+ return /* @__PURE__ */ i(r, {
13
+ client: a,
14
+ children: /* @__PURE__ */ i(e, {
15
+ ...s,
16
+ children: /* @__PURE__ */ i(t, {})
17
+ })
18
+ });
19
+ };
20
+ //#endregion
21
+ export { o as AdminRoot };
22
+
23
+ //# sourceMappingURL=AdminRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminRoot.js","names":[],"sources":["../../../src/atheletebridge/admin/AdminRoot.tsx"],"sourcesContent":["/**\n * AthleteBridge Admin Root\n * @module atheletebridge/admin\n *\n * Host-contract entry point for the AthleteBridge admin surface inside\n * `admin-app` (BOFF-3258). It mirrors the provider/query-client setup of\n * `AthleteBridgeRoot` but deliberately differs in two ways:\n *\n * 1. It does NOT register product-shell nav/footer items — `admin-app` owns\n * its own sidebar via `NavRegistration.tsx`.\n * 2. It does NOT mount `FeatureFlagProvider`. The admin surface is an\n * operations/support view over AthleteBridge's own nouns; per-workspace\n * product gates must not hide rows from an operator investigating them.\n * (No `FeatureGate` is used below this root, so no provider is required.)\n *\n * SCOPE (BOFF-3258 RULINGS R4): this surface covers AthleteBridge's OWN domain\n * entities only — teams, programs, fixtures/standings and sessions. Tenant and\n * workspace administration is product-agnostic, owned by `global-tenant-svc`,\n * and already served generically by `microfe-admin` at the `/admin/*` route.\n * Re-implementing it per product would fork that surface 39 ways.\n */\n\nimport type { FC } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nimport { AthleteBridgeProvider } from '../context';\nimport type { AthleteBridgeRootProps } from '../types';\nimport { AdminDashboardPage } from './AdminDashboardPage';\n\nconst adminQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60 * 1000,\n retry: 1,\n },\n },\n});\n\nexport interface AthleteBridgeAdminRootProps extends AthleteBridgeRootProps {\n /** Workspace-scoped token supplied by `admin-app` for workspace gateway calls. */\n workspaceToken?: string;\n}\n\nexport const AdminRoot: FC<AthleteBridgeAdminRootProps> = (props) => {\n // `workspaceToken` is consumed by the host shell's `GatewayRoute` / fe-libs\n // graphql transport (`graphqlFetch({ gateway: 'workspace', workspaceToken: true })`\n // reads it from the shared store, not from props). It is intentionally not\n // forwarded to the product context, which only accepts the standard\n // microfrontend root props.\n const { workspaceToken, ...providerProps } = props;\n void workspaceToken;\n\n return (\n <QueryClientProvider client={adminQueryClient}>\n <AthleteBridgeProvider {...providerProps}>\n <AdminDashboardPage />\n </AthleteBridgeProvider>\n </QueryClientProvider>\n );\n};\n"],"mappings":";;;;;;AA6BA,IAAM,IAAmB,IAAI,EAAY,EACvC,gBAAgB,EACd,SAAS;CACP,WAAW,KAAK;CAChB,OAAO;CACR,EACF,EACF,CAAC,EAOW,KAA8C,MAAU;CAMnE,IAAM,EAAE,mBAAgB,GAAG,MAAkB;AAG7C,QACE,kBAAC,GAAD;EAAqB,QAAQ;YAC3B,kBAAC,GAAD;GAAuB,GAAI;aACzB,kBAAC,GAAD,EAAsB,CAAA;GACA,CAAA;EACJ,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * AthleteBridge Admin Exports
3
+ * @module atheletebridge/admin
4
+ *
5
+ * The admin surface consumed by `admin-app` at `/admin/atheletebridge` (BOFF-3258).
6
+ * `AdminRoot` is the host-contract entry point; the export name matches the
7
+ * convention already used by `microfe-subscriberbot` and `microfe-bigconsole`.
8
+ */
9
+ export { AdminRoot, type AthleteBridgeAdminRootProps } from './AdminRoot';
10
+ export { AdminDashboardPage } from './AdminDashboardPage';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import "./AdminDashboardPage.js";
2
+ import "./AdminRoot.js";
@@ -8,7 +8,7 @@ function o({ fileId: o }) {
8
8
  href: c,
9
9
  target: "_blank",
10
10
  rel: "noreferrer",
11
- className: "mt-1.5 inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline",
11
+ className: "mt-1.5 inline-flex items-center gap-1 text-xs font-medium text-text-link hover:underline",
12
12
  children: [
13
13
  /* @__PURE__ */ i(n, { className: "h-3.5 w-3.5" }),
14
14
  /* @__PURE__ */ i("span", {
@@ -1 +1 @@
1
- {"version":3,"file":"DrillVideoLink.js","names":[],"sources":["../../../src/atheletebridge/components/DrillVideoLink.tsx"],"sourcesContent":["/**\n * Drill demo-video reference\n * @module atheletebridge/components\n *\n * A drill's `video` is a reference into wspace-files-svc (blobs live there). We\n * resolve the playable URL lazily and in isolation, so a missing/expired blob\n * degrades to a quiet badge instead of ever breaking the program page.\n */\n\nimport { ExternalLink, FileVideo, Loader2 } from 'lucide-react';\nimport { useFile } from '../hooks/useAthleteBridgeApi';\n\nexport function DrillVideoLink({ fileId }: { fileId: string }) {\n const file = useFile(fileId);\n const url = file.data?.downloadUrl ?? undefined;\n const label = file.data?.name ?? 'Demo video';\n\n if (url) {\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-1.5 inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline\"\n >\n <FileVideo className=\"h-3.5 w-3.5\" />\n <span className=\"max-w-[16rem] truncate\">{label}</span>\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n );\n }\n\n return (\n <span className=\"mt-1.5 inline-flex items-center gap-1 text-xs text-text-secondary\">\n {file.isLoading ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <FileVideo className=\"h-3.5 w-3.5\" />\n )}\n Demo video\n </span>\n );\n}\n"],"mappings":";;;;AAYA,SAAgB,EAAe,EAAE,aAA8B;CAC7D,IAAM,IAAO,EAAQ,EAAO,EACtB,IAAM,EAAK,MAAM,eAAe,KAAA,GAChC,IAAQ,EAAK,MAAM,QAAQ;AAiBjC,QAfI,IAEA,kBAAC,KAAD;EACE,MAAM;EACN,QAAO;EACP,KAAI;EACJ,WAAU;YAJZ;GAME,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA;GACrC,kBAAC,QAAD;IAAM,WAAU;cAA0B;IAAa,CAAA;GACvD,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;GAClC;MAKN,kBAAC,QAAD;EAAM,WAAU;YAAhB,CACG,EAAK,YACJ,kBAAC,GAAD,EAAS,WAAU,4BAA6B,CAAA,GAEhD,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA,EACrC,aAEG"}
1
+ {"version":3,"file":"DrillVideoLink.js","names":[],"sources":["../../../src/atheletebridge/components/DrillVideoLink.tsx"],"sourcesContent":["/**\n * Drill demo-video reference\n * @module atheletebridge/components\n *\n * A drill's `video` is a reference into wspace-files-svc (blobs live there). We\n * resolve the playable URL lazily and in isolation, so a missing/expired blob\n * degrades to a quiet badge instead of ever breaking the program page.\n */\n\nimport { ExternalLink, FileVideo, Loader2 } from 'lucide-react';\nimport { useFile } from '../hooks/useAthleteBridgeApi';\n\nexport function DrillVideoLink({ fileId }: { fileId: string }) {\n const file = useFile(fileId);\n const url = file.data?.downloadUrl ?? undefined;\n const label = file.data?.name ?? 'Demo video';\n\n if (url) {\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-1.5 inline-flex items-center gap-1 text-xs font-medium text-text-link hover:underline\"\n >\n <FileVideo className=\"h-3.5 w-3.5\" />\n <span className=\"max-w-[16rem] truncate\">{label}</span>\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n );\n }\n\n return (\n <span className=\"mt-1.5 inline-flex items-center gap-1 text-xs text-text-secondary\">\n {file.isLoading ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <FileVideo className=\"h-3.5 w-3.5\" />\n )}\n Demo video\n </span>\n );\n}\n"],"mappings":";;;;AAYA,SAAgB,EAAe,EAAE,aAA8B;CAC7D,IAAM,IAAO,EAAQ,EAAO,EACtB,IAAM,EAAK,MAAM,eAAe,KAAA,GAChC,IAAQ,EAAK,MAAM,QAAQ;AAiBjC,QAfI,IAEA,kBAAC,KAAD;EACE,MAAM;EACN,QAAO;EACP,KAAI;EACJ,WAAU;YAJZ;GAME,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA;GACrC,kBAAC,QAAD;IAAM,WAAU;cAA0B;IAAa,CAAA;GACvD,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;GAClC;MAKN,kBAAC,QAAD;EAAM,WAAU;YAAhB,CACG,EAAK,YACJ,kBAAC,GAAD,EAAS,WAAU,4BAA6B,CAAA,GAEhD,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA,EACrC,aAEG"}
@@ -11,7 +11,7 @@ var f = {
11
11
  ADVANCED: "warning",
12
12
  ELITE: "default"
13
13
  }, p = ({ program: p, onClick: m, drillCount: h }) => {
14
- let g = r[p.sport], _ = h ?? p.drills?.length;
14
+ let g = r[p.sport], _ = h ?? p.drills?.items.length;
15
15
  return /* @__PURE__ */ l(d, {
16
16
  treatment: "metric",
17
17
  role: "button",
@@ -1 +1 @@
1
- {"version":3,"file":"ProgramCard.js","names":[],"sources":["../../../src/atheletebridge/components/ProgramCard.tsx"],"sourcesContent":["/**\n * Program Card\n * @module atheletebridge/components\n *\n * A training-program tile with a sport-icon tile, a level Badge tinted per tier\n * (green Beginner / blue Intermediate / amber Advanced / brand Elite), a status\n * pill, and a footer stat row of weeks + drill counts. Semantic tokens only.\n */\n\nimport type { FC } from 'react';\nimport { CalendarRange, Copy, Dumbbell } from 'lucide-react';\nimport { GlassCard, Badge, type BadgeProps } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { SPORT_ICONS, SPORT_LABELS, PROGRAM_LEVEL_LABELS } from './domain';\nimport { cn } from '../utils/cn';\nimport type { AthProgram, AthProgramLevel } from '../types';\n\ninterface ProgramCardProps {\n program: AthProgram;\n onClick?: () => void;\n /**\n * Drill count for the footer chip. Falls back to `program.drills?.length`\n * when the query selected drills; omit the chip if neither is available.\n */\n drillCount?: number;\n}\n\nconst LEVEL_VARIANT: Record<AthProgramLevel, BadgeProps['variant']> = {\n BEGINNER: 'success',\n INTERMEDIATE: 'info',\n ADVANCED: 'warning',\n ELITE: 'default',\n};\n\nexport const ProgramCard: FC<ProgramCardProps> = ({ program, onClick, drillCount }) => {\n const SportIcon = SPORT_ICONS[program.sport];\n const drills = drillCount ?? program.drills?.length;\n\n return (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 transition-transform duration-200 hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-[var(--color-accent-soft)] text-text-primary\">\n <SportIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{program.name}</h3>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5\">\n <Badge variant={LEVEL_VARIANT[program.level]}>\n {PROGRAM_LEVEL_LABELS[program.level]}\n </Badge>\n <span className=\"text-xs text-text-secondary\">{SPORT_LABELS[program.sport]}</span>\n </div>\n </div>\n </div>\n <StatusBadge status={program.status} />\n </div>\n\n {program.summary && (\n <p className=\"mt-3 line-clamp-2 text-sm text-text-secondary\">{program.summary}</p>\n )}\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <CalendarRange className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {program.weeks}{' '}\n {program.weeks === 1 ? 'week' : 'weeks'}\n </span>\n {drills !== undefined && (\n <span className=\"flex items-center gap-1\">\n <Dumbbell className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {drills}{' '}\n {drills === 1 ? 'drill' : 'drills'}\n </span>\n )}\n {program.isTemplate && (\n <span className=\"flex items-center gap-1\">\n <Copy className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> Template\n </span>\n )}\n </div>\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;AA2BA,IAAM,IAAgE;CACpE,UAAU;CACV,cAAc;CACd,UAAU;CACV,OAAO;CACR,EAEY,KAAqC,EAAE,YAAS,YAAS,oBAAiB;CACrF,IAAM,IAAY,EAAY,EAAQ,QAChC,IAAS,KAAc,EAAQ,QAAQ;AAE7C,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAK;EACL,UAAU;EACD;EACT,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,KAAW;;EAGf,WAAW,EACT,2KACD;YAbH;GAeE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OAAW,WAAU;OAAU,eAAY;OAAS,CAAA;MAChD,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAsD,EAAQ;OAAU,CAAA,EACtF,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QAAO,SAAS,EAAc,EAAQ;kBACnC,EAAqB,EAAQ;QACxB,CAAA,EACR,kBAAC,QAAD;QAAM,WAAU;kBAA+B,EAAa,EAAQ;QAAc,CAAA,CAC9E;SACF;QACF;QACN,kBAAC,GAAD,EAAa,QAAQ,EAAQ,QAAU,CAAA,CACnC;;GAEL,EAAQ,WACP,kBAAC,KAAD;IAAG,WAAU;cAAiD,EAAQ;IAAY,CAAA;GAGpF,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAe,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE,EAAQ;OAAO;OAC5E,EAAQ,UAAU,IAAI,SAAS;OAC3B;;KACN,MAAW,KAAA,KACV,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAU,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE;OAAQ;OAChE,MAAW,IAAI,UAAU;OACrB;;KAER,EAAQ,cACP,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD;OAAM,WAAU;OAAc,eAAY;OAAS,CAAA,EAAA,YAC9C;;KAEL;;GACI"}
1
+ {"version":3,"file":"ProgramCard.js","names":[],"sources":["../../../src/atheletebridge/components/ProgramCard.tsx"],"sourcesContent":["/**\n * Program Card\n * @module atheletebridge/components\n *\n * A training-program tile with a sport-icon tile, a level Badge tinted per tier\n * (green Beginner / blue Intermediate / amber Advanced / brand Elite), a status\n * pill, and a footer stat row of weeks + drill counts. Semantic tokens only.\n */\n\nimport type { FC } from 'react';\nimport { CalendarRange, Copy, Dumbbell } from 'lucide-react';\nimport { GlassCard, Badge, type BadgeProps } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { SPORT_ICONS, SPORT_LABELS, PROGRAM_LEVEL_LABELS } from './domain';\nimport { cn } from '../utils/cn';\nimport type { AthProgram, AthProgramLevel } from '../types';\n\ninterface ProgramCardProps {\n program: AthProgram;\n onClick?: () => void;\n /**\n * Drill count for the footer chip. Falls back to `program.drills?.length`\n * when the query selected drills; omit the chip if neither is available.\n */\n drillCount?: number;\n}\n\nconst LEVEL_VARIANT: Record<AthProgramLevel, BadgeProps['variant']> = {\n BEGINNER: 'success',\n INTERMEDIATE: 'info',\n ADVANCED: 'warning',\n ELITE: 'default',\n};\n\nexport const ProgramCard: FC<ProgramCardProps> = ({ program, onClick, drillCount }) => {\n const SportIcon = SPORT_ICONS[program.sport];\n const drills = drillCount ?? program.drills?.items.length;\n\n return (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 transition-transform duration-200 hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-[var(--color-accent-soft)] text-text-primary\">\n <SportIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{program.name}</h3>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5\">\n <Badge variant={LEVEL_VARIANT[program.level]}>\n {PROGRAM_LEVEL_LABELS[program.level]}\n </Badge>\n <span className=\"text-xs text-text-secondary\">{SPORT_LABELS[program.sport]}</span>\n </div>\n </div>\n </div>\n <StatusBadge status={program.status} />\n </div>\n\n {program.summary && (\n <p className=\"mt-3 line-clamp-2 text-sm text-text-secondary\">{program.summary}</p>\n )}\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <CalendarRange className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {program.weeks}{' '}\n {program.weeks === 1 ? 'week' : 'weeks'}\n </span>\n {drills !== undefined && (\n <span className=\"flex items-center gap-1\">\n <Dumbbell className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {drills}{' '}\n {drills === 1 ? 'drill' : 'drills'}\n </span>\n )}\n {program.isTemplate && (\n <span className=\"flex items-center gap-1\">\n <Copy className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> Template\n </span>\n )}\n </div>\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;AA2BA,IAAM,IAAgE;CACpE,UAAU;CACV,cAAc;CACd,UAAU;CACV,OAAO;CACR,EAEY,KAAqC,EAAE,YAAS,YAAS,oBAAiB;CACrF,IAAM,IAAY,EAAY,EAAQ,QAChC,IAAS,KAAc,EAAQ,QAAQ,MAAM;AAEnD,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAK;EACL,UAAU;EACD;EACT,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,KAAW;;EAGf,WAAW,EACT,2KACD;YAbH;GAeE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OAAW,WAAU;OAAU,eAAY;OAAS,CAAA;MAChD,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAsD,EAAQ;OAAU,CAAA,EACtF,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QAAO,SAAS,EAAc,EAAQ;kBACnC,EAAqB,EAAQ;QACxB,CAAA,EACR,kBAAC,QAAD;QAAM,WAAU;kBAA+B,EAAa,EAAQ;QAAc,CAAA,CAC9E;SACF;QACF;QACN,kBAAC,GAAD,EAAa,QAAQ,EAAQ,QAAU,CAAA,CACnC;;GAEL,EAAQ,WACP,kBAAC,KAAD;IAAG,WAAU;cAAiD,EAAQ;IAAY,CAAA;GAGpF,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAe,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE,EAAQ;OAAO;OAC5E,EAAQ,UAAU,IAAI,SAAS;OAC3B;;KACN,MAAW,KAAA,KACV,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAU,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE;OAAQ;OAChE,MAAW,IAAI,UAAU;OACrB;;KAER,EAAQ,cACP,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD;OAAM,WAAU;OAAc,eAAY;OAAS,CAAA,EAAA,YAC9C;;KAEL;;GACI"}
@@ -7,7 +7,7 @@ import { jsx as c, jsxs as l } from "react/jsx-runtime";
7
7
  import { Badge as u, GlassCard as d } from "@burdenoff/fe-libs/ui";
8
8
  //#region src/atheletebridge/components/TeamCard.tsx
9
9
  var f = ({ team: f, onClick: p, memberCount: m }) => {
10
- let h = n[f.sport], g = m ?? f.members?.length;
10
+ let h = n[f.sport], g = m ?? f.members?.items.length;
11
11
  return /* @__PURE__ */ l(d, {
12
12
  treatment: "metric",
13
13
  role: "button",
@@ -1 +1 @@
1
- {"version":3,"file":"TeamCard.js","names":[],"sources":["../../../src/atheletebridge/components/TeamCard.tsx"],"sourcesContent":["/**\n * Team Card\n * @module atheletebridge/components\n *\n * A team tile fronted by a deterministic gradient monogram crest, with a sport\n * Badge, a StatusBadge (green Active / amber Forming / grey Inactive·Archived),\n * a member-count chip and a hover lift. Semantic tokens only.\n */\n\nimport type { FC } from 'react';\nimport { Users, MapPin, CalendarDays } from 'lucide-react';\nimport { GlassCard, Badge } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { Crest } from './Crest';\nimport { SPORT_ICONS, SPORT_LABELS } from './domain';\nimport { cn } from '../utils/cn';\nimport type { AthTeam } from '../types';\n\ninterface TeamCardProps {\n team: AthTeam;\n onClick?: () => void;\n /**\n * Member count for the footer chip. Falls back to `team.members?.length`\n * when the list query selected members; omit the chip entirely if neither is\n * available (never guess).\n */\n memberCount?: number;\n}\n\nexport const TeamCard: FC<TeamCardProps> = ({ team, onClick, memberCount }) => {\n const SportIcon = SPORT_ICONS[team.sport];\n const count = memberCount ?? team.members?.length;\n\n return (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 transition-transform duration-200 hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <Crest name={team.name} sport={team.sport} size={44} />\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{team.name}</h3>\n <div className=\"mt-1\">\n <Badge variant=\"secondary\" className=\"gap-1\">\n <SportIcon className=\"h-3 w-3\" aria-hidden=\"true\" />\n {SPORT_LABELS[team.sport]}\n </Badge>\n </div>\n </div>\n </div>\n <StatusBadge status={team.status} />\n </div>\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n {team.ageGroup && (\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {team.ageGroup}\n </span>\n )}\n {team.season && (\n <span className=\"flex items-center gap-1\">\n <CalendarDays className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {team.season}\n </span>\n )}\n {team.homeVenue && (\n <span className=\"flex items-center gap-1 truncate\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\" /> {team.homeVenue}\n </span>\n )}\n </div>\n\n {team.tags.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {team.tags.slice(0, 4).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n\n {count !== undefined && (\n <div className=\"mt-4 flex items-center gap-1.5 border-t border-border-seam pt-3 text-xs font-medium text-text-secondary\">\n <Users className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {count} {count === 1 ? 'member' : 'members'}\n </div>\n )}\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;;AA6BA,IAAa,KAA+B,EAAE,SAAM,YAAS,qBAAkB;CAC7E,IAAM,IAAY,EAAY,EAAK,QAC7B,IAAQ,KAAe,EAAK,SAAS;AAE3C,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAK;EACL,UAAU;EACD;EACT,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,KAAW;;EAGf,WAAW,EACT,2KACD;YAbH;GAeE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAO,MAAM,EAAK;MAAM,OAAO,EAAK;MAAO,MAAM;MAAM,CAAA,EACvD,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAsD,EAAK;OAAU,CAAA,EACnF,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD;QAAO,SAAQ;QAAY,WAAU;kBAArC,CACE,kBAAC,GAAD;SAAW,WAAU;SAAU,eAAY;SAAS,CAAA,EACnD,EAAa,EAAK,OACb;;OACJ,CAAA,CACF;QACF;QACN,kBAAC,GAAD,EAAa,QAAQ,EAAK,QAAU,CAAA,CAChC;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,EAAK,YACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAO,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE,EAAK;OACtD;;KAER,EAAK,UACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAc,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE,EAAK;OAC7D;;KAER,EAAK,aACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAQ,WAAU;QAAuB,eAAY;QAAS,CAAA;;OAAE,EAAK;OAChE;;KAEL;;GAEL,EAAK,KAAK,SAAS,KAClB,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAK,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MAC1B,kBAAC,QAAD;KAEE,WAAU;eAET;KACI,EAJA,EAIA,CACP;IACE,CAAA;GAGP,MAAU,KAAA,KACT,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAO,WAAU;MAAc,eAAY;MAAS,CAAA;KACnD;KAAM;KAAE,MAAU,IAAI,WAAW;KAC9B;;GAEE"}
1
+ {"version":3,"file":"TeamCard.js","names":[],"sources":["../../../src/atheletebridge/components/TeamCard.tsx"],"sourcesContent":["/**\n * Team Card\n * @module atheletebridge/components\n *\n * A team tile fronted by a deterministic gradient monogram crest, with a sport\n * Badge, a StatusBadge (green Active / amber Forming / grey Inactive·Archived),\n * a member-count chip and a hover lift. Semantic tokens only.\n */\n\nimport type { FC } from 'react';\nimport { Users, MapPin, CalendarDays } from 'lucide-react';\nimport { GlassCard, Badge } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from './StatusBadge';\nimport { Crest } from './Crest';\nimport { SPORT_ICONS, SPORT_LABELS } from './domain';\nimport { cn } from '../utils/cn';\nimport type { AthTeam } from '../types';\n\ninterface TeamCardProps {\n team: AthTeam;\n onClick?: () => void;\n /**\n * Member count for the footer chip. Falls back to `team.members?.length`\n * when the list query selected members; omit the chip entirely if neither is\n * available (never guess).\n */\n memberCount?: number;\n}\n\nexport const TeamCard: FC<TeamCardProps> = ({ team, onClick, memberCount }) => {\n const SportIcon = SPORT_ICONS[team.sport];\n const count = memberCount ?? team.members?.items.length;\n\n return (\n <GlassCard\n treatment=\"metric\"\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }}\n className={cn(\n 'cursor-pointer p-5 transition-transform duration-200 hover:-translate-y-0.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <Crest name={team.name} sport={team.sport} size={44} />\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{team.name}</h3>\n <div className=\"mt-1\">\n <Badge variant=\"secondary\" className=\"gap-1\">\n <SportIcon className=\"h-3 w-3\" aria-hidden=\"true\" />\n {SPORT_LABELS[team.sport]}\n </Badge>\n </div>\n </div>\n </div>\n <StatusBadge status={team.status} />\n </div>\n\n <div className=\"mt-4 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-text-secondary\">\n {team.ageGroup && (\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {team.ageGroup}\n </span>\n )}\n {team.season && (\n <span className=\"flex items-center gap-1\">\n <CalendarDays className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {team.season}\n </span>\n )}\n {team.homeVenue && (\n <span className=\"flex items-center gap-1 truncate\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\" /> {team.homeVenue}\n </span>\n )}\n </div>\n\n {team.tags.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {team.tags.slice(0, 4).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n\n {count !== undefined && (\n <div className=\"mt-4 flex items-center gap-1.5 border-t border-border-seam pt-3 text-xs font-medium text-text-secondary\">\n <Users className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {count} {count === 1 ? 'member' : 'members'}\n </div>\n )}\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;;AA6BA,IAAa,KAA+B,EAAE,SAAM,YAAS,qBAAkB;CAC7E,IAAM,IAAY,EAAY,EAAK,QAC7B,IAAQ,KAAe,EAAK,SAAS,MAAM;AAEjD,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAK;EACL,UAAU;EACD;EACT,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,KAAW;;EAGf,WAAW,EACT,2KACD;YAbH;GAeE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAO,MAAM,EAAK;MAAM,OAAO,EAAK;MAAO,MAAM;MAAM,CAAA,EACvD,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAsD,EAAK;OAAU,CAAA,EACnF,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD;QAAO,SAAQ;QAAY,WAAU;kBAArC,CACE,kBAAC,GAAD;SAAW,WAAU;SAAU,eAAY;SAAS,CAAA,EACnD,EAAa,EAAK,OACb;;OACJ,CAAA,CACF;QACF;QACN,kBAAC,GAAD,EAAa,QAAQ,EAAK,QAAU,CAAA,CAChC;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,EAAK,YACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAO,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE,EAAK;OACtD;;KAER,EAAK,UACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAc,WAAU;QAAc,eAAY;QAAS,CAAA;;OAAE,EAAK;OAC7D;;KAER,EAAK,aACJ,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD;QAAQ,WAAU;QAAuB,eAAY;QAAS,CAAA;;OAAE,EAAK;OAChE;;KAEL;;GAEL,EAAK,KAAK,SAAS,KAClB,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAK,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MAC1B,kBAAC,QAAD;KAEE,WAAU;eAET;KACI,EAJA,EAIA,CACP;IACE,CAAA;GAGP,MAAU,KAAA,KACT,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAO,WAAU;MAAc,eAAY;MAAS,CAAA;KACnD;KAAM;KAAE,MAAU,IAAI,WAAW;KAC9B;;GAEE"}
@@ -29,7 +29,7 @@ function p({ userId: p, displayName: m, onSelect: h, required: g = !1 }) {
29
29
  }), !T && /* @__PURE__ */ d("button", {
30
30
  type: "button",
31
31
  onClick: () => b(!1),
32
- className: "mt-1 self-start text-xs font-medium text-primary hover:underline",
32
+ className: "mt-1 self-start text-xs font-medium text-text-link hover:underline",
33
33
  children: "Search the directory instead"
34
34
  })]
35
35
  }) : /* @__PURE__ */ d(r, {
@@ -116,7 +116,7 @@ function p({ userId: p, displayName: m, onSelect: h, required: g = !1 }) {
116
116
  /* @__PURE__ */ d("button", {
117
117
  type: "button",
118
118
  onClick: () => b(!0),
119
- className: "text-xs font-medium text-primary hover:underline",
119
+ className: "text-xs font-medium text-text-link hover:underline",
120
120
  children: "Enter a user ID manually"
121
121
  })
122
122
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"UserSearchSelect.js","names":[],"sources":["../../../src/atheletebridge/components/UserSearchSelect.tsx"],"sourcesContent":["/**\n * User picker\n * @module atheletebridge/components\n *\n * Resolves a real workspace/tenant user by name or email (global user\n * directory) so a coach can add a team member without knowing a raw UUID.\n * Degrades gracefully: if the directory is unavailable the coach can still paste\n * a user id manually. Semantic tokens only.\n */\n\nimport { useState } from 'react';\nimport { Check, Loader2, Search, User as UserIcon, X } from 'lucide-react';\nimport { FormField, fieldInputClass } from './form';\nimport { cn } from '../utils/cn';\nimport { directoryUserName, useUserSearch, type DirectoryUser } from '../hooks/useAthleteBridgeApi';\n\nexport interface UserSelectValue {\n userId: string;\n displayName: string;\n}\n\ninterface UserSearchSelectProps {\n /** Currently selected user id. */\n userId: string;\n /** Display name currently chosen (echoed back so the parent can prefill). */\n displayName: string;\n onSelect: (value: UserSelectValue) => void;\n required?: boolean;\n}\n\nexport function UserSearchSelect({\n userId,\n displayName,\n onSelect,\n required = false,\n}: UserSearchSelectProps) {\n const [term, setTerm] = useState('');\n const [manual, setManual] = useState(false);\n\n const search = useUserSearch(term);\n const results = search.data ?? [];\n const active = term.trim().length >= 2;\n\n const pick = (user: DirectoryUser) => {\n onSelect({ userId: user.id, displayName: directoryUserName(user) });\n setTerm('');\n };\n\n // If the directory query fails (e.g. RBAC), offer manual entry automatically.\n const searchUnavailable = search.isError;\n\n if (manual || searchUnavailable) {\n return (\n <FormField\n label=\"User ID\"\n htmlFor=\"member-user-id\"\n required={required}\n hint={\n searchUnavailable\n ? 'User search is unavailable here — paste the auth-svc user id.'\n : 'Paste the auth-svc user id.'\n }\n >\n <input\n id=\"member-user-id\"\n className={fieldInputClass}\n value={userId}\n onChange={(e) => onSelect({ userId: e.target.value, displayName })}\n placeholder=\"user-uuid\"\n />\n {!searchUnavailable && (\n <button\n type=\"button\"\n onClick={() => setManual(false)}\n className=\"mt-1 self-start text-xs font-medium text-primary hover:underline\"\n >\n Search the directory instead\n </button>\n )}\n </FormField>\n );\n }\n\n return (\n <FormField label=\"Athlete / user\" required={required}>\n {userId ? (\n <div className=\"flex items-center gap-2 rounded-lg border border-border-seam bg-bg-surface px-3 py-2\">\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <UserIcon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {displayName || 'Selected user'}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">{userId}</p>\n </div>\n <button\n type=\"button\"\n aria-label=\"Clear selected user\"\n onClick={() => onSelect({ userId: '', displayName: '' })}\n className=\"rounded-md p-1 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n className={cn(fieldInputClass, 'pl-9')}\n value={term}\n onChange={(e) => setTerm(e.target.value)}\n placeholder=\"Search by name or email…\"\n aria-label=\"Search users by name or email\"\n />\n {search.isFetching && (\n <Loader2 className=\"absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 animate-spin text-text-secondary\" />\n )}\n </div>\n\n {active && !search.isFetching && results.length === 0 && (\n <p className=\"text-xs text-text-secondary\">No users match “{term.trim()}”.</p>\n )}\n\n {results.length > 0 && (\n <ul className=\"max-h-56 divide-y divide-border-seam overflow-auto rounded-lg border border-border-seam bg-bg-surface\">\n {results.map((user) => (\n <li key={user.id}>\n <button\n type=\"button\"\n onClick={() => pick(user)}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left transition-colors hover:bg-bg-sunken\"\n >\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <UserIcon className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium text-text-primary\">\n {directoryUserName(user)}\n </span>\n <span className=\"block truncate text-xs text-text-secondary\">\n {user.email}\n </span>\n </span>\n <Check className=\"h-4 w-4 shrink-0 text-text-secondary opacity-0\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n\n <button\n type=\"button\"\n onClick={() => setManual(true)}\n className=\"text-xs font-medium text-primary hover:underline\"\n >\n Enter a user ID manually\n </button>\n </div>\n )}\n </FormField>\n );\n}\n"],"mappings":";;;;;;;AA8BA,SAAgB,EAAiB,EAC/B,WACA,gBACA,aACA,cAAW,MACa;CACxB,IAAM,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAQ,KAAa,EAAS,GAAM,EAErC,IAAS,EAAc,EAAK,EAC5B,IAAU,EAAO,QAAQ,EAAE,EAC3B,IAAS,EAAK,MAAM,CAAC,UAAU,GAE/B,KAAQ,MAAwB;AAEpC,EADA,EAAS;GAAE,QAAQ,EAAK;GAAI,aAAa,EAAkB,EAAK;GAAE,CAAC,EACnE,EAAQ,GAAG;IAIP,IAAoB,EAAO;AAkCjC,QAhCI,KAAU,IAEV,kBAAC,GAAD;EACE,OAAM;EACN,SAAQ;EACE;EACV,MACE,IACI,kEACA;YAPR,CAUE,kBAAC,SAAD;GACE,IAAG;GACH,WAAW;GACX,OAAO;GACP,WAAW,MAAM,EAAS;IAAE,QAAQ,EAAE,OAAO;IAAO;IAAa,CAAC;GAClE,aAAY;GACZ,CAAA,EACD,CAAC,KACA,kBAAC,UAAD;GACE,MAAK;GACL,eAAe,EAAU,GAAM;GAC/B,WAAU;aACX;GAEQ,CAAA,CAED;MAKd,kBAAC,GAAD;EAAW,OAAM;EAA2B;YACzC,IACC,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,QAAD;KAAM,WAAU;eACd,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;KAC3B,CAAA;IACP,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBACV,KAAe;MACd,CAAA,EACJ,kBAAC,KAAD;MAAG,WAAU;gBAAwC;MAAW,CAAA,CAC5D;;IACN,kBAAC,UAAD;KACE,MAAK;KACL,cAAW;KACX,eAAe,EAAS;MAAE,QAAQ;MAAI,aAAa;MAAI,CAAC;KACxD,WAAU;eAEV,kBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;KAClB,CAAA;IACL;OAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD,EAAQ,WAAU,4FAA6F,CAAA;MAC/G,kBAAC,SAAD;OACE,WAAW,EAAG,GAAiB,OAAO;OACtC,OAAO;OACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;OACxC,aAAY;OACZ,cAAW;OACX,CAAA;MACD,EAAO,cACN,kBAAC,GAAD,EAAS,WAAU,sFAAuF,CAAA;MAExG;;IAEL,KAAU,CAAC,EAAO,cAAc,EAAQ,WAAW,KAClD,kBAAC,KAAD;KAAG,WAAU;eAAb;MAA2C;MAAiB,EAAK,MAAM;MAAC;MAAM;;IAG/E,EAAQ,SAAS,KAChB,kBAAC,MAAD;KAAI,WAAU;eACX,EAAQ,KAAK,MACZ,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAK,EAAK;MACzB,WAAU;gBAHZ;OAKE,kBAAC,QAAD;QAAM,WAAU;kBACd,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;QAC3B,CAAA;OACP,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CACE,kBAAC,QAAD;SAAM,WAAU;mBACb,EAAkB,EAAK;SACnB,CAAA,EACP,kBAAC,QAAD;SAAM,WAAU;mBACb,EAAK;SACD,CAAA,CACF;;OACP,kBAAC,GAAD,EAAO,WAAU,kDAAmD,CAAA;OAC7D;SACN,EAnBI,EAAK,GAmBT,CACL;KACC,CAAA;IAGP,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAU,GAAK;KAC9B,WAAU;eACX;KAEQ,CAAA;IACL;;EAEE,CAAA"}
1
+ {"version":3,"file":"UserSearchSelect.js","names":[],"sources":["../../../src/atheletebridge/components/UserSearchSelect.tsx"],"sourcesContent":["/**\n * User picker\n * @module atheletebridge/components\n *\n * Resolves a real workspace/tenant user by name or email (global user\n * directory) so a coach can add a team member without knowing a raw UUID.\n * Degrades gracefully: if the directory is unavailable the coach can still paste\n * a user id manually. Semantic tokens only.\n */\n\nimport { useState } from 'react';\nimport { Check, Loader2, Search, User as UserIcon, X } from 'lucide-react';\nimport { FormField, fieldInputClass } from './form';\nimport { cn } from '../utils/cn';\nimport { directoryUserName, useUserSearch, type DirectoryUser } from '../hooks/useAthleteBridgeApi';\n\nexport interface UserSelectValue {\n userId: string;\n displayName: string;\n}\n\ninterface UserSearchSelectProps {\n /** Currently selected user id. */\n userId: string;\n /** Display name currently chosen (echoed back so the parent can prefill). */\n displayName: string;\n onSelect: (value: UserSelectValue) => void;\n required?: boolean;\n}\n\nexport function UserSearchSelect({\n userId,\n displayName,\n onSelect,\n required = false,\n}: UserSearchSelectProps) {\n const [term, setTerm] = useState('');\n const [manual, setManual] = useState(false);\n\n const search = useUserSearch(term);\n const results = search.data ?? [];\n const active = term.trim().length >= 2;\n\n const pick = (user: DirectoryUser) => {\n onSelect({ userId: user.id, displayName: directoryUserName(user) });\n setTerm('');\n };\n\n // If the directory query fails (e.g. RBAC), offer manual entry automatically.\n const searchUnavailable = search.isError;\n\n if (manual || searchUnavailable) {\n return (\n <FormField\n label=\"User ID\"\n htmlFor=\"member-user-id\"\n required={required}\n hint={\n searchUnavailable\n ? 'User search is unavailable here — paste the auth-svc user id.'\n : 'Paste the auth-svc user id.'\n }\n >\n <input\n id=\"member-user-id\"\n className={fieldInputClass}\n value={userId}\n onChange={(e) => onSelect({ userId: e.target.value, displayName })}\n placeholder=\"user-uuid\"\n />\n {!searchUnavailable && (\n <button\n type=\"button\"\n onClick={() => setManual(false)}\n className=\"mt-1 self-start text-xs font-medium text-text-link hover:underline\"\n >\n Search the directory instead\n </button>\n )}\n </FormField>\n );\n }\n\n return (\n <FormField label=\"Athlete / user\" required={required}>\n {userId ? (\n <div className=\"flex items-center gap-2 rounded-lg border border-border-seam bg-bg-surface px-3 py-2\">\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <UserIcon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {displayName || 'Selected user'}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">{userId}</p>\n </div>\n <button\n type=\"button\"\n aria-label=\"Clear selected user\"\n onClick={() => onSelect({ userId: '', displayName: '' })}\n className=\"rounded-md p-1 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n className={cn(fieldInputClass, 'pl-9')}\n value={term}\n onChange={(e) => setTerm(e.target.value)}\n placeholder=\"Search by name or email…\"\n aria-label=\"Search users by name or email\"\n />\n {search.isFetching && (\n <Loader2 className=\"absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 animate-spin text-text-secondary\" />\n )}\n </div>\n\n {active && !search.isFetching && results.length === 0 && (\n <p className=\"text-xs text-text-secondary\">No users match “{term.trim()}”.</p>\n )}\n\n {results.length > 0 && (\n <ul className=\"max-h-56 divide-y divide-border-seam overflow-auto rounded-lg border border-border-seam bg-bg-surface\">\n {results.map((user) => (\n <li key={user.id}>\n <button\n type=\"button\"\n onClick={() => pick(user)}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left transition-colors hover:bg-bg-sunken\"\n >\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <UserIcon className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium text-text-primary\">\n {directoryUserName(user)}\n </span>\n <span className=\"block truncate text-xs text-text-secondary\">\n {user.email}\n </span>\n </span>\n <Check className=\"h-4 w-4 shrink-0 text-text-secondary opacity-0\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n\n <button\n type=\"button\"\n onClick={() => setManual(true)}\n className=\"text-xs font-medium text-text-link hover:underline\"\n >\n Enter a user ID manually\n </button>\n </div>\n )}\n </FormField>\n );\n}\n"],"mappings":";;;;;;;AA8BA,SAAgB,EAAiB,EAC/B,WACA,gBACA,aACA,cAAW,MACa;CACxB,IAAM,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAQ,KAAa,EAAS,GAAM,EAErC,IAAS,EAAc,EAAK,EAC5B,IAAU,EAAO,QAAQ,EAAE,EAC3B,IAAS,EAAK,MAAM,CAAC,UAAU,GAE/B,KAAQ,MAAwB;AAEpC,EADA,EAAS;GAAE,QAAQ,EAAK;GAAI,aAAa,EAAkB,EAAK;GAAE,CAAC,EACnE,EAAQ,GAAG;IAIP,IAAoB,EAAO;AAkCjC,QAhCI,KAAU,IAEV,kBAAC,GAAD;EACE,OAAM;EACN,SAAQ;EACE;EACV,MACE,IACI,kEACA;YAPR,CAUE,kBAAC,SAAD;GACE,IAAG;GACH,WAAW;GACX,OAAO;GACP,WAAW,MAAM,EAAS;IAAE,QAAQ,EAAE,OAAO;IAAO;IAAa,CAAC;GAClE,aAAY;GACZ,CAAA,EACD,CAAC,KACA,kBAAC,UAAD;GACE,MAAK;GACL,eAAe,EAAU,GAAM;GAC/B,WAAU;aACX;GAEQ,CAAA,CAED;MAKd,kBAAC,GAAD;EAAW,OAAM;EAA2B;YACzC,IACC,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,QAAD;KAAM,WAAU;eACd,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;KAC3B,CAAA;IACP,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBACV,KAAe;MACd,CAAA,EACJ,kBAAC,KAAD;MAAG,WAAU;gBAAwC;MAAW,CAAA,CAC5D;;IACN,kBAAC,UAAD;KACE,MAAK;KACL,cAAW;KACX,eAAe,EAAS;MAAE,QAAQ;MAAI,aAAa;MAAI,CAAC;KACxD,WAAU;eAEV,kBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;KAClB,CAAA;IACL;OAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD,EAAQ,WAAU,4FAA6F,CAAA;MAC/G,kBAAC,SAAD;OACE,WAAW,EAAG,GAAiB,OAAO;OACtC,OAAO;OACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;OACxC,aAAY;OACZ,cAAW;OACX,CAAA;MACD,EAAO,cACN,kBAAC,GAAD,EAAS,WAAU,sFAAuF,CAAA;MAExG;;IAEL,KAAU,CAAC,EAAO,cAAc,EAAQ,WAAW,KAClD,kBAAC,KAAD;KAAG,WAAU;eAAb;MAA2C;MAAiB,EAAK,MAAM;MAAC;MAAM;;IAG/E,EAAQ,SAAS,KAChB,kBAAC,MAAD;KAAI,WAAU;eACX,EAAQ,KAAK,MACZ,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAK,EAAK;MACzB,WAAU;gBAHZ;OAKE,kBAAC,QAAD;QAAM,WAAU;kBACd,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;QAC3B,CAAA;OACP,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CACE,kBAAC,QAAD;SAAM,WAAU;mBACb,EAAkB,EAAK;SACnB,CAAA,EACP,kBAAC,QAAD;SAAM,WAAU;mBACb,EAAK;SACD,CAAA,CACF;;OACP,kBAAC,GAAD,EAAO,WAAU,kDAAmD,CAAA;OAC7D;SACN,EAnBI,EAAK,GAmBT,CACL;KACC,CAAA;IAGP,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAU,GAAK;KAC9B,WAAU;eACX;KAEQ,CAAA;IACL;;EAEE,CAAA"}
@@ -49,11 +49,11 @@ var s = {
49
49
  WEIGHT: "Weight",
50
50
  HEART_RATE: "Heart Rate",
51
51
  CUSTOM: "Custom"
52
- }, m = Object.keys(d);
53
- function h(e) {
52
+ }, m = Object.keys(c), h = Object.keys(u), g = Object.keys(d);
53
+ function _(e) {
54
54
  return e.replace(/_/g, " ").toLowerCase().replace(/\b\w/g, (e) => e.toUpperCase());
55
55
  }
56
56
  //#endregion
57
- export { d as FIXTURE_TYPE_LABELS, m as FIXTURE_TYPE_OPTIONS, u as MEMBER_ROLE_LABELS, p as METRIC_TYPE_LABELS, l as PROGRAM_LEVEL_LABELS, f as SESSION_TYPE_LABELS, s as SPORT_ICONS, c as SPORT_LABELS, h as humanizeEnum };
57
+ export { d as FIXTURE_TYPE_LABELS, g as FIXTURE_TYPE_OPTIONS, u as MEMBER_ROLE_LABELS, h as MEMBER_ROLE_OPTIONS, p as METRIC_TYPE_LABELS, l as PROGRAM_LEVEL_LABELS, f as SESSION_TYPE_LABELS, s as SPORT_ICONS, c as SPORT_LABELS, m as SPORT_OPTIONS, _ as humanizeEnum };
58
58
 
59
59
  //# sourceMappingURL=domain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"domain.js","names":[],"sources":["../../../src/atheletebridge/components/domain.ts"],"sourcesContent":["/**\n * Domain display helpers\n * @module atheletebridge/components\n *\n * Centralized, type-safe labels and icon mappings for the AthleteBridge\n * enums so list/detail/form pages render them consistently.\n */\n\nimport {\n Activity,\n Dumbbell,\n Trophy,\n Volleyball,\n Waves,\n Gamepad2,\n Footprints,\n type LucideIcon,\n} from 'lucide-react';\nimport type {\n AthFixtureType,\n AthMemberRole,\n AthMetricType,\n AthProgramLevel,\n AthSessionType,\n AthSport,\n} from '../types';\n\nexport const SPORT_ICONS: Record<AthSport, LucideIcon> = {\n ATHLETICS: Footprints,\n BASKETBALL: Volleyball,\n CRICKET: Trophy,\n ESPORTS: Gamepad2,\n FOOTBALL: Volleyball,\n OTHER: Activity,\n SWIMMING: Waves,\n TENNIS: Dumbbell,\n};\n\nexport const SPORT_LABELS: Record<AthSport, string> = {\n ATHLETICS: 'Athletics',\n BASKETBALL: 'Basketball',\n CRICKET: 'Cricket',\n ESPORTS: 'Esports',\n FOOTBALL: 'Football',\n OTHER: 'Other',\n SWIMMING: 'Swimming',\n TENNIS: 'Tennis',\n};\n\nexport const PROGRAM_LEVEL_LABELS: Record<AthProgramLevel, string> = {\n BEGINNER: 'Beginner',\n INTERMEDIATE: 'Intermediate',\n ADVANCED: 'Advanced',\n ELITE: 'Elite',\n};\n\nexport const MEMBER_ROLE_LABELS: Record<AthMemberRole, string> = {\n PLAYER: 'Player',\n CAPTAIN: 'Captain',\n COACH: 'Coach',\n ASSISTANT_COACH: 'Assistant Coach',\n PHYSIO: 'Physio',\n MANAGER: 'Manager',\n};\n\nexport const FIXTURE_TYPE_LABELS: Record<AthFixtureType, string> = {\n FRIENDLY: 'Friendly',\n LEAGUE: 'League',\n CUP: 'Cup',\n TOURNAMENT: 'Tournament',\n SCRIMMAGE: 'Scrimmage',\n};\n\nexport const SESSION_TYPE_LABELS: Record<AthSessionType, string> = {\n IN_PERSON: 'In Person',\n ONLINE: 'Online',\n HYBRID: 'Hybrid',\n};\n\nexport const METRIC_TYPE_LABELS: Record<AthMetricType, string> = {\n SPEED: 'Speed',\n ENDURANCE: 'Endurance',\n STRENGTH: 'Strength',\n AGILITY: 'Agility',\n ACCURACY: 'Accuracy',\n WEIGHT: 'Weight',\n HEART_RATE: 'Heart Rate',\n CUSTOM: 'Custom',\n};\n\nexport const SPORT_OPTIONS = Object.keys(SPORT_LABELS) as AthSport[];\nexport const PROGRAM_LEVEL_OPTIONS = Object.keys(PROGRAM_LEVEL_LABELS) as AthProgramLevel[];\nexport const MEMBER_ROLE_OPTIONS = Object.keys(MEMBER_ROLE_LABELS) as AthMemberRole[];\nexport const FIXTURE_TYPE_OPTIONS = Object.keys(FIXTURE_TYPE_LABELS) as AthFixtureType[];\nexport const SESSION_TYPE_OPTIONS = Object.keys(SESSION_TYPE_LABELS) as AthSessionType[];\n\n/** Humanize an enum value for display (fallback when no explicit label exists). */\nexport function humanizeEnum(value: string): string {\n return value\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n"],"mappings":";;AA2BA,IAAa,IAA4C;CACvD,WAAW;CACX,YAAY;CACZ,SAAS;CACT,SAAS;CACT,UAAU;CACV,OAAO;CACP,UAAU;CACV,QAAQ;CACT,EAEY,IAAyC;CACpD,WAAW;CACX,YAAY;CACZ,SAAS;CACT,SAAS;CACT,UAAU;CACV,OAAO;CACP,UAAU;CACV,QAAQ;CACT,EAEY,IAAwD;CACnE,UAAU;CACV,cAAc;CACd,UAAU;CACV,OAAO;CACR,EAEY,IAAoD;CAC/D,QAAQ;CACR,SAAS;CACT,OAAO;CACP,iBAAiB;CACjB,QAAQ;CACR,SAAS;CACV,EAEY,IAAsD;CACjE,UAAU;CACV,QAAQ;CACR,KAAK;CACL,YAAY;CACZ,WAAW;CACZ,EAEY,IAAsD;CACjE,WAAW;CACX,QAAQ;CACR,QAAQ;CACT,EAEY,IAAoD;CAC/D,OAAO;CACP,WAAW;CACX,UAAU;CACV,SAAS;CACT,UAAU;CACV,QAAQ;CACR,YAAY;CACZ,QAAQ;CACT,EAKY,IAAuB,OAAO,KAAK,EAAoB;AAIpE,SAAgB,EAAa,GAAuB;AAClD,QAAO,EACJ,QAAQ,MAAM,IAAI,CAClB,aAAa,CACb,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC"}
1
+ {"version":3,"file":"domain.js","names":[],"sources":["../../../src/atheletebridge/components/domain.ts"],"sourcesContent":["/**\n * Domain display helpers\n * @module atheletebridge/components\n *\n * Centralized, type-safe labels and icon mappings for the AthleteBridge\n * enums so list/detail/form pages render them consistently.\n */\n\nimport {\n Activity,\n Dumbbell,\n Trophy,\n Volleyball,\n Waves,\n Gamepad2,\n Footprints,\n type LucideIcon,\n} from 'lucide-react';\nimport type {\n AthFixtureType,\n AthMemberRole,\n AthMetricType,\n AthProgramLevel,\n AthSessionType,\n AthSport,\n} from '../types';\n\nexport const SPORT_ICONS: Record<AthSport, LucideIcon> = {\n ATHLETICS: Footprints,\n BASKETBALL: Volleyball,\n CRICKET: Trophy,\n ESPORTS: Gamepad2,\n FOOTBALL: Volleyball,\n OTHER: Activity,\n SWIMMING: Waves,\n TENNIS: Dumbbell,\n};\n\nexport const SPORT_LABELS: Record<AthSport, string> = {\n ATHLETICS: 'Athletics',\n BASKETBALL: 'Basketball',\n CRICKET: 'Cricket',\n ESPORTS: 'Esports',\n FOOTBALL: 'Football',\n OTHER: 'Other',\n SWIMMING: 'Swimming',\n TENNIS: 'Tennis',\n};\n\nexport const PROGRAM_LEVEL_LABELS: Record<AthProgramLevel, string> = {\n BEGINNER: 'Beginner',\n INTERMEDIATE: 'Intermediate',\n ADVANCED: 'Advanced',\n ELITE: 'Elite',\n};\n\nexport const MEMBER_ROLE_LABELS: Record<AthMemberRole, string> = {\n PLAYER: 'Player',\n CAPTAIN: 'Captain',\n COACH: 'Coach',\n ASSISTANT_COACH: 'Assistant Coach',\n PHYSIO: 'Physio',\n MANAGER: 'Manager',\n};\n\nexport const FIXTURE_TYPE_LABELS: Record<AthFixtureType, string> = {\n FRIENDLY: 'Friendly',\n LEAGUE: 'League',\n CUP: 'Cup',\n TOURNAMENT: 'Tournament',\n SCRIMMAGE: 'Scrimmage',\n};\n\nexport const SESSION_TYPE_LABELS: Record<AthSessionType, string> = {\n IN_PERSON: 'In Person',\n ONLINE: 'Online',\n HYBRID: 'Hybrid',\n};\n\nexport const METRIC_TYPE_LABELS: Record<AthMetricType, string> = {\n SPEED: 'Speed',\n ENDURANCE: 'Endurance',\n STRENGTH: 'Strength',\n AGILITY: 'Agility',\n ACCURACY: 'Accuracy',\n WEIGHT: 'Weight',\n HEART_RATE: 'Heart Rate',\n CUSTOM: 'Custom',\n};\n\nexport const SPORT_OPTIONS = Object.keys(SPORT_LABELS) as AthSport[];\nexport const PROGRAM_LEVEL_OPTIONS = Object.keys(PROGRAM_LEVEL_LABELS) as AthProgramLevel[];\nexport const MEMBER_ROLE_OPTIONS = Object.keys(MEMBER_ROLE_LABELS) as AthMemberRole[];\nexport const FIXTURE_TYPE_OPTIONS = Object.keys(FIXTURE_TYPE_LABELS) as AthFixtureType[];\nexport const SESSION_TYPE_OPTIONS = Object.keys(SESSION_TYPE_LABELS) as AthSessionType[];\n\n/** Humanize an enum value for display (fallback when no explicit label exists). */\nexport function humanizeEnum(value: string): string {\n return value\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n"],"mappings":";;AA2BA,IAAa,IAA4C;CACvD,WAAW;CACX,YAAY;CACZ,SAAS;CACT,SAAS;CACT,UAAU;CACV,OAAO;CACP,UAAU;CACV,QAAQ;CACT,EAEY,IAAyC;CACpD,WAAW;CACX,YAAY;CACZ,SAAS;CACT,SAAS;CACT,UAAU;CACV,OAAO;CACP,UAAU;CACV,QAAQ;CACT,EAEY,IAAwD;CACnE,UAAU;CACV,cAAc;CACd,UAAU;CACV,OAAO;CACR,EAEY,IAAoD;CAC/D,QAAQ;CACR,SAAS;CACT,OAAO;CACP,iBAAiB;CACjB,QAAQ;CACR,SAAS;CACV,EAEY,IAAsD;CACjE,UAAU;CACV,QAAQ;CACR,KAAK;CACL,YAAY;CACZ,WAAW;CACZ,EAEY,IAAsD;CACjE,WAAW;CACX,QAAQ;CACR,QAAQ;CACT,EAEY,IAAoD;CAC/D,OAAO;CACP,WAAW;CACX,UAAU;CACV,SAAS;CACT,UAAU;CACV,QAAQ;CACR,YAAY;CACZ,QAAQ;CACT,EAEY,IAAgB,OAAO,KAAK,EAAa,EAEzC,IAAsB,OAAO,KAAK,EAAmB,EACrD,IAAuB,OAAO,KAAK,EAAoB;AAIpE,SAAgB,EAAa,GAAuB;AAClD,QAAO,EACJ,QAAQ,MAAM,IAAI,CAClB,aAAa,CACb,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ import "./useAthleteBridgeApi.js";
@@ -1 +1 @@
1
- {"version":3,"file":"useAthleteBridgeApi.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/hooks/useAthleteBridgeApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAthleteBridgeApi.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/hooks/useAthleteBridgeApi.ts"],"names":[],"mappings":"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"}
@@ -35,7 +35,7 @@ var c = async (e, t, n) => {
35
35
  ],
36
36
  queryFn: async () => (await c(`query AthListTeams($sport: AthSport, $status: AthTeamStatus, $pagination: PaginationInput) {
37
37
  athListTeams(sport: $sport, status: $status, pagination: $pagination) {
38
- items { ${u} members { id } }
38
+ items { ${u} members { items { id } } }
39
39
  pageInfo { cursor hasMore }
40
40
  }
41
41
  }`, {
@@ -55,8 +55,8 @@ var c = async (e, t, n) => {
55
55
  queryFn: async () => (await c(`query AthTeam($id: ID!) {
56
56
  athTeam(id: $id) {
57
57
  ${u}
58
- members { ${d} }
59
- fixtures { ${f} }
58
+ members { items { ${d} } }
59
+ fixtures { items { ${f} } }
60
60
  }
61
61
  }`, { id: t }, n)).athTeam,
62
62
  enabled: !!t
@@ -71,11 +71,11 @@ var c = async (e, t, n) => {
71
71
  n
72
72
  ],
73
73
  queryFn: async () => (await c(`query AthListMembers($teamId: ID!, $status: AthMemberStatus) {
74
- athListMembers(teamId: $teamId, status: $status) { ${d} }
74
+ athListMembers(teamId: $teamId, status: $status) { items { ${d} } }
75
75
  }`, {
76
76
  teamId: t,
77
77
  status: n
78
- }, r)).athListMembers,
78
+ }, r)).athListMembers.items,
79
79
  enabled: !!t
80
80
  });
81
81
  }, S = () => {
@@ -188,8 +188,8 @@ var c = async (e, t, n) => {
188
188
  t
189
189
  ],
190
190
  queryFn: async () => (await c(`query AthStandings($competition: String!) {
191
- athStandings(competition: $competition) { ${p} }
192
- }`, { competition: t }, n)).athStandings,
191
+ athStandings(competition: $competition) { items { ${p} } }
192
+ }`, { competition: t }, n)).athStandings.items,
193
193
  enabled: !!t
194
194
  });
195
195
  }, A = () => {
@@ -229,7 +229,7 @@ var c = async (e, t, n) => {
229
229
  ],
230
230
  queryFn: async () => (await c(`query AthListPrograms($sport: AthSport, $level: AthProgramLevel, $status: AthProgramStatus, $pagination: PaginationInput) {
231
231
  athListPrograms(sport: $sport, level: $level, status: $status, pagination: $pagination) {
232
- items { ${h} drills { id } }
232
+ items { ${h} drills { items { id } } }
233
233
  pageInfo { cursor hasMore }
234
234
  }
235
235
  }`, {
@@ -250,7 +250,7 @@ var c = async (e, t, n) => {
250
250
  queryFn: async () => (await c(`query AthProgram($id: ID!) {
251
251
  athProgram(id: $id) {
252
252
  ${h}
253
- drills { ${m} }
253
+ drills { items { ${m} } }
254
254
  }
255
255
  }`, { id: t }, n)).athProgram,
256
256
  enabled: !!t
@@ -265,7 +265,7 @@ var c = async (e, t, n) => {
265
265
  t.invalidateQueries({ queryKey: ["atheletebridge", "programs"] });
266
266
  }
267
267
  });
268
- }, P = () => {
268
+ }, te = () => {
269
269
  let t = a(), { apiGatewayUrl: n } = e();
270
270
  return r({
271
271
  mutationFn: async ({ id: e, input: t }) => (await c(`mutation AthUpdateProgram($id: ID!, $input: AthUpdateProgramInput!) {
@@ -282,7 +282,7 @@ var c = async (e, t, n) => {
282
282
  ] });
283
283
  }
284
284
  });
285
- }, F = () => {
285
+ }, P = () => {
286
286
  let t = a(), { apiGatewayUrl: n } = e();
287
287
  return r({
288
288
  mutationFn: async ({ id: e, status: t }) => (await c(`mutation AthTransitionProgram($id: ID!, $status: AthProgramStatus!) {
@@ -299,7 +299,7 @@ var c = async (e, t, n) => {
299
299
  ] });
300
300
  }
301
301
  });
302
- }, I = () => {
302
+ }, F = () => {
303
303
  let t = a(), { apiGatewayUrl: n } = e();
304
304
  return r({
305
305
  mutationFn: async (e) => (await c("mutation AthArchiveProgram($id: ID!) { athArchiveProgram(id: $id) }", { id: e }, n)).athArchiveProgram,
@@ -307,7 +307,7 @@ var c = async (e, t, n) => {
307
307
  t.invalidateQueries({ queryKey: ["atheletebridge", "programs"] });
308
308
  }
309
309
  });
310
- }, L = () => {
310
+ }, I = () => {
311
311
  let t = a(), { apiGatewayUrl: n } = e();
312
312
  return r({
313
313
  mutationFn: async (e) => (await c(`mutation AthAddDrill($input: AthAddDrillInput!) {
@@ -321,7 +321,7 @@ var c = async (e, t, n) => {
321
321
  ] });
322
322
  }
323
323
  });
324
- }, R = (t) => {
324
+ }, L = (t) => {
325
325
  let n = a(), { apiGatewayUrl: i } = e();
326
326
  return r({
327
327
  mutationFn: async (e) => (await c("mutation AthRemoveDrill($id: ID!) { athRemoveDrill(id: $id) }", { id: e }, i)).athRemoveDrill,
@@ -333,7 +333,7 @@ var c = async (e, t, n) => {
333
333
  ] });
334
334
  }
335
335
  });
336
- }, z = (t = {}) => {
336
+ }, R = (t = {}) => {
337
337
  let { apiGatewayUrl: n } = e();
338
338
  return i({
339
339
  queryKey: [
@@ -353,7 +353,7 @@ var c = async (e, t, n) => {
353
353
  pagination: t.pagination
354
354
  }, n)).athListSessions
355
355
  });
356
- }, B = (t) => {
356
+ }, z = (t) => {
357
357
  let { apiGatewayUrl: n } = e();
358
358
  return i({
359
359
  queryKey: [
@@ -366,7 +366,7 @@ var c = async (e, t, n) => {
366
366
  }`, { id: t }, n)).athSession,
367
367
  enabled: !!t
368
368
  });
369
- }, V = () => {
369
+ }, B = () => {
370
370
  let t = a(), { apiGatewayUrl: n } = e();
371
371
  return r({
372
372
  mutationFn: async (e) => (await c(`mutation AthBookSession($input: AthBookSessionInput!) {
@@ -376,7 +376,7 @@ var c = async (e, t, n) => {
376
376
  t.invalidateQueries({ queryKey: ["atheletebridge", "sessions"] });
377
377
  }
378
378
  });
379
- }, H = () => {
379
+ }, V = () => {
380
380
  let t = a(), { apiGatewayUrl: n } = e();
381
381
  return r({
382
382
  mutationFn: async (e) => (await c(`mutation AthConfirmSession($id: ID!) {
@@ -390,7 +390,7 @@ var c = async (e, t, n) => {
390
390
  ] });
391
391
  }
392
392
  });
393
- }, U = () => {
393
+ }, H = () => {
394
394
  let t = a(), { apiGatewayUrl: n } = e();
395
395
  return r({
396
396
  mutationFn: async ({ id: e, input: t }) => (await c(`mutation AthCompleteSession($id: ID!, $input: AthCompleteSessionInput) {
@@ -407,7 +407,7 @@ var c = async (e, t, n) => {
407
407
  ] });
408
408
  }
409
409
  });
410
- }, W = () => {
410
+ }, U = () => {
411
411
  let t = a(), { apiGatewayUrl: n } = e();
412
412
  return r({
413
413
  mutationFn: async (e) => (await c(`mutation AthCancelSession($id: ID!) {
@@ -421,7 +421,7 @@ var c = async (e, t, n) => {
421
421
  ] });
422
422
  }
423
423
  });
424
- }, G = (t = {}) => {
424
+ }, W = (t = {}) => {
425
425
  let { apiGatewayUrl: n } = e();
426
426
  return i({
427
427
  queryKey: [
@@ -440,7 +440,7 @@ var c = async (e, t, n) => {
440
440
  pagination: t.pagination
441
441
  }, n)).athListWorkoutLogs
442
442
  });
443
- }, K = (t) => {
443
+ }, G = (t) => {
444
444
  let { apiGatewayUrl: n } = e();
445
445
  return i({
446
446
  queryKey: [
@@ -449,11 +449,11 @@ var c = async (e, t, n) => {
449
449
  t
450
450
  ],
451
451
  queryFn: async () => (await c(`query AthPerformanceMetrics($athleteId: ID!) {
452
- athPerformanceMetrics(athleteId: $athleteId) { ${v} }
453
- }`, { athleteId: t }, n)).athPerformanceMetrics,
452
+ athPerformanceMetrics(athleteId: $athleteId) { items { ${v} } }
453
+ }`, { athleteId: t }, n)).athPerformanceMetrics.items,
454
454
  enabled: !!t
455
455
  });
456
- }, q = () => {
456
+ }, K = () => {
457
457
  let t = a(), { apiGatewayUrl: n } = e();
458
458
  return r({
459
459
  mutationFn: async (e) => (await c(`mutation AthLogWorkout($input: AthLogWorkoutInput!) {
@@ -463,7 +463,7 @@ var c = async (e, t, n) => {
463
463
  t.invalidateQueries({ queryKey: ["atheletebridge", "workout-logs"] });
464
464
  }
465
465
  });
466
- }, J = () => {
466
+ }, q = () => {
467
467
  let t = a(), { apiGatewayUrl: n } = e();
468
468
  return r({
469
469
  mutationFn: async (e) => (await c(`mutation AthRecordMetric($input: AthRecordMetricInput!) {
@@ -473,15 +473,15 @@ var c = async (e, t, n) => {
473
473
  t.invalidateQueries({ queryKey: ["atheletebridge", "metrics"] });
474
474
  }
475
475
  });
476
- }, Y = (e) => {
476
+ }, J = (e) => {
477
477
  let t = e.lastIndexOf(".");
478
478
  return t >= 0 ? e.slice(t + 1).toLowerCase() : "bin";
479
- }, X = () => {
479
+ }, Y = () => {
480
480
  let { apiGatewayUrl: n } = e();
481
481
  return t(async (e) => {
482
482
  let t = await c("mutation AthInitiateUpload($input: InitiateUploadInput!) {\n initiateUpload(input: $input) { uploadUrl session { id } }\n }", { input: {
483
483
  fileName: e.name,
484
- extension: Y(e.name),
484
+ extension: J(e.name),
485
485
  fileSize: e.size,
486
486
  mimeType: e.type || "application/octet-stream",
487
487
  visibility: "WORKSPACE"
@@ -495,7 +495,7 @@ var c = async (e, t, n) => {
495
495
  if (!a.ok) throw Error(`Storage rejected the upload (HTTP ${a.status}).`);
496
496
  return (await c("mutation AthCompleteUpload($input: CompleteUploadInput!) {\n completeUpload(input: $input) { fileId }\n }", { input: { sessionId: i } }, n)).completeUpload.fileId;
497
497
  }, [n]);
498
- }, Z = (t) => {
498
+ }, X = (t) => {
499
499
  let { apiGatewayUrl: n } = e();
500
500
  return i({
501
501
  queryKey: [
@@ -507,7 +507,7 @@ var c = async (e, t, n) => {
507
507
  enabled: !!t,
508
508
  staleTime: 6e4
509
509
  });
510
- }, Q = (e) => e.name?.trim() ? e.name.trim() : [e.firstName, e.lastName].filter(Boolean).join(" ").trim() || (e.username?.trim() ? e.username.trim() : e.email), te = (e) => {
510
+ }, Z = (e) => e.name?.trim() ? e.name.trim() : [e.firstName, e.lastName].filter(Boolean).join(" ").trim() || (e.username?.trim() ? e.username.trim() : e.email), ne = (e) => {
511
511
  let t = e.trim();
512
512
  return i({
513
513
  queryKey: [
@@ -526,7 +526,7 @@ var c = async (e, t, n) => {
526
526
  staleTime: 3e4,
527
527
  retry: !1
528
528
  });
529
- }, ne = (e) => {
529
+ }, Q = (e) => {
530
530
  let t = n(() => Array.from(new Set(e.filter((e) => !!(e && e.trim())))).sort(), [e]);
531
531
  return i({
532
532
  queryKey: [
@@ -548,7 +548,7 @@ var c = async (e, t, n) => {
548
548
  })).data ?? {}, a = {};
549
549
  for (let e of Object.values(i)) e && e.id && (a[e.id] = {
550
550
  id: e.id,
551
- name: Q(e),
551
+ name: Z(e),
552
552
  email: e.email ?? null
553
553
  });
554
554
  return a;
@@ -558,7 +558,7 @@ var c = async (e, t, n) => {
558
558
  retry: !1
559
559
  });
560
560
  }, re = (e) => {
561
- let t = ne(e), n = t.data ?? {};
561
+ let t = Q(e), n = t.data ?? {};
562
562
  return {
563
563
  byId: n,
564
564
  isLoading: t.isLoading,
@@ -577,7 +577,7 @@ var c = async (e, t, n) => {
577
577
  entityId: t.id,
578
578
  entityKind: "team"
579
579
  });
580
- for (let e of t.members ?? []) n.push({
580
+ for (let e of t.members?.items ?? []) n.push({
581
581
  id: `member-${e.id}`,
582
582
  type: "member-added",
583
583
  title: `${e.displayName} added to ${t.name}`,
@@ -623,10 +623,10 @@ var c = async (e, t, n) => {
623
623
  i,
624
624
  a
625
625
  ]), ae = (e, t) => {
626
- let r = x(e), i = n(() => (r.data ?? []).find((e) => e.id === t) ?? null, [r.data, t]), a = i?.userId, o = K(a), s = G({
626
+ let r = x(e), i = n(() => (r.data ?? []).find((e) => e.id === t) ?? null, [r.data, t]), a = i?.userId, o = G(a), s = W({
627
627
  athleteId: a,
628
628
  pagination: { limit: 100 }
629
- }), c = z({
629
+ }), c = R({
630
630
  athleteId: a,
631
631
  pagination: { limit: 100 }
632
632
  });
@@ -659,7 +659,7 @@ function $(e, t, n, r = 8) {
659
659
  });
660
660
  }
661
661
  var oe = (e = {}) => {
662
- let { competition: t, sampleLimit: r = 200 } = e, i = z({ pagination: { limit: r } }), a = G({ pagination: { limit: r } }), o = D({ pagination: { limit: r } }), s = n(() => i.data?.items ?? [], [i.data]), c = n(() => a.data?.items ?? [], [a.data]), l = n(() => o.data?.items ?? [], [o.data]), u = n(() => {
662
+ let { competition: t, sampleLimit: r = 200 } = e, i = R({ pagination: { limit: r } }), a = W({ pagination: { limit: r } }), o = D({ pagination: { limit: r } }), s = n(() => i.data?.items ?? [], [i.data]), c = n(() => a.data?.items ?? [], [a.data]), l = n(() => o.data?.items ?? [], [o.data]), u = n(() => {
663
663
  if (t) return t;
664
664
  let e = /* @__PURE__ */ new Map();
665
665
  for (let t of l) t.competition && e.set(t.competition, (e.get(t.competition) ?? 0) + 1);
@@ -734,6 +734,6 @@ var oe = (e = {}) => {
734
734
  ]);
735
735
  };
736
736
  //#endregion
737
- export { Q as directoryUserName, L as useAddDrill, T as useAddMember, I as useArchiveProgram, w as useArchiveTeam, ae as useAthleteProfile, V as useBookSession, W as useCancelSession, oe as useCoachAnalytics, U as useCompleteSession, H as useConfirmSession, ee as useCreateProgram, S as useCreateTeam, Z as useFile, O as useFixture, D as useFixtures, q as useLogWorkout, K as usePerformanceMetrics, N as useProgram, M as usePrograms, ie as useRecentActivity, j as useRecordFixtureResult, J as useRecordMetric, R as useRemoveDrill, E as useRemoveMember, A as useScheduleFixture, B as useSession, z as useSessions, k as useStandings, b as useTeam, x as useTeamMembers, y as useTeams, F as useTransitionProgram, P as useUpdateProgram, C as useUpdateTeam, X as useUploadFile, re as useUserDirectory, te as useUserSearch, G as useWorkoutLogs };
737
+ export { Z as directoryUserName, I as useAddDrill, T as useAddMember, F as useArchiveProgram, w as useArchiveTeam, ae as useAthleteProfile, B as useBookSession, U as useCancelSession, oe as useCoachAnalytics, H as useCompleteSession, V as useConfirmSession, ee as useCreateProgram, S as useCreateTeam, X as useFile, O as useFixture, D as useFixtures, K as useLogWorkout, G as usePerformanceMetrics, N as useProgram, M as usePrograms, ie as useRecentActivity, j as useRecordFixtureResult, q as useRecordMetric, L as useRemoveDrill, E as useRemoveMember, A as useScheduleFixture, z as useSession, R as useSessions, k as useStandings, b as useTeam, x as useTeamMembers, y as useTeams, P as useTransitionProgram, te as useUpdateProgram, C as useUpdateTeam, Y as useUploadFile, re as useUserDirectory, ne as useUserSearch, Q as useUsersByIds, W as useWorkoutLogs };
738
738
 
739
739
  //# sourceMappingURL=useAthleteBridgeApi.js.map