@burdenoff/microfe-atheletebridge 2026.716.1 → 2026.720.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dist/atheletebridge/admin/AdminDashboardPage.js +2 -2
  2. package/dist/atheletebridge/admin/AdminDashboardPage.js.map +1 -1
  3. package/dist/atheletebridge/components/ProgramCard.js +1 -1
  4. package/dist/atheletebridge/components/ProgramCard.js.map +1 -1
  5. package/dist/atheletebridge/components/TeamCard.js +1 -1
  6. package/dist/atheletebridge/components/TeamCard.js.map +1 -1
  7. package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts.map +1 -1
  8. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +12 -12
  9. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
  10. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +3 -3
  11. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -1
  12. package/dist/atheletebridge/pages/programs/ProgramsListPage.js +1 -1
  13. package/dist/atheletebridge/pages/programs/ProgramsListPage.js.map +1 -1
  14. package/dist/atheletebridge/pages/teams/TeamDetailPage.js +1 -1
  15. package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -1
  16. package/dist/atheletebridge/pages/teams/TeamsListPage.js +1 -1
  17. package/dist/atheletebridge/pages/teams/TeamsListPage.js.map +1 -1
  18. package/dist/atheletebridge/types/index.d.ts +19 -3
  19. package/dist/atheletebridge/types/index.d.ts.map +1 -1
  20. package/dist/atheletebridge/utils/pageContext.d.ts +16 -7
  21. package/dist/atheletebridge/utils/pageContext.d.ts.map +1 -1
  22. package/dist/atheletebridge/utils/pageContext.js +111 -35
  23. package/dist/atheletebridge/utils/pageContext.js.map +1 -1
  24. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"TeamDetailPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/teams/TeamDetailPage.tsx"],"sourcesContent":["/**\n * Team Detail\n * @module atheletebridge/pages/teams\n *\n * Reads a single team (with members + fixtures) from `athTeam`, supports adding,\n * editing (athUpdateMember — role/position/jersey/status inline per roster row)\n * and removing members (athAddMember / athRemoveMember), editing and archiving\n * the team (athUpdateTeam via the form / athArchiveTeam), links each roster row\n * to the athlete profile, and renders the team's fixtures as crest-vs-crest\n * matchup rows.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n CalendarDays,\n Check,\n Edit,\n Archive,\n MapPin,\n Pencil,\n Plus,\n Trash2,\n UserPlus,\n Loader2,\n X,\n} from 'lucide-react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch, clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql';\nimport {\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { Crest } from '../../components/Crest';\nimport { UserAvatar } from '../../components/UserAvatar';\nimport { MatchupRow } from '../../components/MatchupRow';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingState, ErrorState } from '../../components/LoadingState';\nimport { FormField, fieldInputClass } from '../../components/form';\nimport { UserSearchSelect } from '../../components/UserSearchSelect';\nimport { SPORT_LABELS, MEMBER_ROLE_LABELS } from '../../components/domain';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport {\n useTeam,\n useArchiveTeam,\n useAddMember,\n useRemoveMember,\n} from '../../hooks/useAthleteBridgeApi';\nimport type { AthMember, AthMemberRole, AthMemberStatus, AthUpdateMemberInput } from '../../types';\n\nconst ROLES = Object.keys(MEMBER_ROLE_LABELS) as AthMemberRole[];\nconst MEMBER_STATUSES: AthMemberStatus[] = ['TRIAL', 'ACTIVE', 'INJURED', 'SUSPENDED', 'RELEASED'];\n\nconst memberStatusLabel = (s: AthMemberStatus): string => s.charAt(0) + s.slice(1).toLowerCase();\n\ninterface AddMemberForm {\n userId: string;\n displayName: string;\n role: AthMemberRole;\n status: AthMemberStatus;\n position: string;\n jerseyNumber: string;\n}\n\nconst EMPTY_MEMBER: AddMemberForm = {\n userId: '',\n displayName: '',\n role: 'PLAYER',\n status: 'ACTIVE',\n position: '',\n jerseyNumber: '',\n};\n\ninterface RowDraft {\n role: AthMemberRole;\n status: AthMemberStatus;\n position: string;\n jerseyNumber: string;\n}\n\n/**\n * Inline roster-member update wired directly to the shipped `athUpdateMember`\n * mutation (the shared kit has add/remove hooks but no update hook). Uses the\n * same workspace-token graphqlFetch primitive as the rest of the MFE and clears\n * the short-lived read cache so the team refetch is fresh.\n */\nconst useUpdateMemberInline = (teamId: string | undefined) => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAthleteBridge();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AthUpdateMemberInput }) => {\n const res = await graphqlFetch<{ athUpdateMember: AthMember }>({\n gateway: 'workspace',\n baseUrl: apiGatewayUrl,\n query: `mutation AthUpdateMember($id: ID!, $input: AthUpdateMemberInput!) {\n athUpdateMember(id: $id, input: $input) {\n id teamId displayName role status position jerseyNumber\n }\n }`,\n variables: { id, input },\n workspaceToken: true,\n });\n if (res.errors?.length) {\n throw new Error(res.errors[0]?.message ?? 'Failed to update member.');\n }\n clearGraphqlFetchResponseCache();\n if (!res.data) throw new Error('Update did not return data.');\n return res.data.athUpdateMember;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['atheletebridge', 'team', teamId] });\n void queryClient.invalidateQueries({ queryKey: ['atheletebridge', 'members', teamId] });\n },\n });\n};\n\nexport function TeamDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useAthleteBridge();\n\n const team = useTeam(id);\n const archiveTeam = useArchiveTeam();\n const addMember = useAddMember();\n const removeMember = useRemoveMember(id);\n const updateMember = useUpdateMemberInline(id);\n\n const [addOpen, setAddOpen] = useState(false);\n const [memberForm, setMemberForm] = useState<AddMemberForm>(EMPTY_MEMBER);\n const [memberError, setMemberError] = useState<string | null>(null);\n\n const [editingId, setEditingId] = useState<string | null>(null);\n const [draft, setDraft] = useState<RowDraft | null>(null);\n const [rowError, setRowError] = useState<string | null>(null);\n\n if (team.isLoading) {\n return (\n <PageLayout title=\"Team\">\n <LoadingState label=\"Loading team…\" />\n </PageLayout>\n );\n }\n\n if (team.isError || !team.data) {\n return (\n <PageLayout title=\"Team\">\n <ErrorState\n title=\"Team not found\"\n message=\"This team does not exist or you do not have access to it.\"\n onRetry={() => navigateTo('/teams')}\n />\n </PageLayout>\n );\n }\n\n const t = team.data;\n const members = t.members ?? [];\n const fixtures = t.fixtures ?? [];\n\n const metaParts = [\n SPORT_LABELS[t.sport],\n t.ageGroup ?? undefined,\n t.season ?? undefined,\n t.homeVenue ?? undefined,\n ].filter(Boolean) as string[];\n\n const handleArchive = async () => {\n if (!id) return;\n await archiveTeam.mutateAsync(id);\n navigateTo('/teams');\n };\n\n const startEdit = (m: AthMember) => {\n setRowError(null);\n setEditingId(m.id);\n setDraft({\n role: m.role,\n status: m.status,\n position: m.position ?? '',\n jerseyNumber: m.jerseyNumber != null ? String(m.jerseyNumber) : '',\n });\n };\n\n const cancelEdit = () => {\n setEditingId(null);\n setDraft(null);\n setRowError(null);\n };\n\n const saveEdit = async (memberId: string) => {\n if (!draft) return;\n setRowError(null);\n const trimmedJersey = draft.jerseyNumber.trim();\n let jersey: number | undefined;\n if (trimmedJersey) {\n jersey = Number.parseInt(trimmedJersey, 10);\n if (Number.isNaN(jersey)) {\n setRowError('Jersey number must be a number.');\n return;\n }\n }\n try {\n await updateMember.mutateAsync({\n id: memberId,\n input: {\n role: draft.role,\n status: draft.status,\n position: draft.position.trim() || undefined,\n jerseyNumber: jersey,\n },\n });\n cancelEdit();\n } catch (err) {\n setRowError(err instanceof Error ? err.message : 'Failed to update member.');\n }\n };\n\n const handleAddMember = async (e: React.FormEvent) => {\n e.preventDefault();\n setMemberError(null);\n if (!id) return;\n if (!memberForm.userId.trim() || !memberForm.displayName.trim()) {\n setMemberError('User ID and display name are required.');\n return;\n }\n const jersey = memberForm.jerseyNumber.trim()\n ? Number.parseInt(memberForm.jerseyNumber, 10)\n : undefined;\n if (jersey !== undefined && Number.isNaN(jersey)) {\n setMemberError('Jersey number must be a number.');\n return;\n }\n try {\n await addMember.mutateAsync({\n teamId: id,\n userId: memberForm.userId.trim(),\n displayName: memberForm.displayName.trim(),\n role: memberForm.role,\n status: memberForm.status,\n position: memberForm.position.trim() || undefined,\n jerseyNumber: jersey,\n });\n setMemberForm(EMPTY_MEMBER);\n setAddOpen(false);\n } catch (err) {\n setMemberError(err instanceof Error ? err.message : 'Failed to add member.');\n }\n };\n\n const openProfile = (memberId: string) => navigateTo(`/teams/${t.id}/athletes/${memberId}`);\n\n return (\n <PageLayout\n title={t.name}\n gradientTitle\n description={metaParts.join(' · ')}\n actions={\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/teams')}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/teams/${t.id}/edit`)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text transition-colors hover:bg-action-primary-bg/90\"\n >\n <Edit className=\"h-4 w-4\" /> Edit\n </button>\n {t.status !== 'ARCHIVED' && (\n <button\n type=\"button\"\n onClick={handleArchive}\n disabled={archiveTeam.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-60\"\n >\n {archiveTeam.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Archive className=\"h-4 w-4\" />\n )}{' '}\n Archive\n </button>\n )}\n </div>\n }\n >\n {/* Hero: crest + meta strip */}\n <GlassCard treatment=\"insight\" className=\"mb-8 p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n <Crest name={t.name} sport={t.sport} size={64} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h2 className=\"text-xl font-semibold text-text-primary\">{t.name}</h2>\n <StatusBadge status={t.status} />\n </div>\n <div className=\"mt-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-text-secondary\">\n {metaParts.map((part, i) => (\n <span key={part} className=\"flex items-center gap-2\">\n {i > 0 && (\n <span aria-hidden=\"true\" className=\"text-text-muted\">\n ·\n </span>\n )}\n {part === t.homeVenue ? (\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {part}\n </span>\n ) : (\n part\n )}\n </span>\n ))}\n </div>\n </div>\n </div>\n {t.description && <p className=\"mt-4 text-sm text-text-secondary\">{t.description}</p>}\n {t.tags.length > 0 && (\n <div className=\"mt-4 flex flex-wrap gap-1.5\">\n {t.tags.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 </GlassCard>\n\n {/* Roster */}\n <section className=\"mb-8\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Roster ({members.length})</h2>\n <button\n type=\"button\"\n onClick={() => {\n setMemberError(null);\n setAddOpen(true);\n }}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-3 py-1.5 text-sm font-semibold text-action-primary-text transition-colors hover:bg-action-primary-bg/90\"\n >\n <UserPlus className=\"h-4 w-4\" /> Add member\n </button>\n </div>\n\n {members.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<UserPlus className=\"h-10 w-10\" />}\n title=\"No members yet\"\n description=\"Add players, coaches and staff to build the roster.\"\n />\n ) : (\n <GlassCard treatment=\"insight\" className=\"overflow-hidden p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[720px] border-collapse text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam text-left text-xs uppercase tracking-wide text-text-secondary\">\n <th className=\"px-4 py-3 font-medium\">Player</th>\n <th className=\"px-4 py-3 font-medium\">Role</th>\n <th className=\"px-4 py-3 font-medium\">Position</th>\n <th className=\"px-4 py-3 font-medium\">Jersey #</th>\n <th className=\"px-4 py-3 font-medium\">Status</th>\n <th className=\"px-4 py-3 text-right font-medium\">Actions</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border-seam\">\n {members.map((m) => {\n const isEditing = editingId === m.id;\n const busy = updateMember.isPending && isEditing;\n return (\n <tr\n key={m.id}\n className=\"align-middle transition-colors hover:bg-bg-sunken/60\"\n >\n {/* Player */}\n <td className=\"px-4 py-3\">\n <button\n type=\"button\"\n onClick={() => openProfile(m.id)}\n className=\"group flex items-center gap-3 text-left focus-visible:outline-none\"\n title={`View ${m.displayName}'s profile`}\n >\n <UserAvatar\n name={m.displayName}\n id={m.userId}\n jersey={m.jerseyNumber}\n size=\"sm\"\n />\n <span className=\"min-w-0\">\n <span className=\"block truncate font-medium text-text-primary group-hover:text-text-link\">\n {m.displayName}\n </span>\n <span className=\"block truncate text-xs text-text-secondary group-hover:text-text-link\">\n View profile\n </span>\n </span>\n </button>\n </td>\n\n {/* Role */}\n <td className=\"px-4 py-3\">\n {isEditing && draft ? (\n <select\n aria-label=\"Role\"\n className={fieldInputClass}\n value={draft.role}\n onChange={(e) =>\n setDraft((d) =>\n d ? { ...d, role: e.target.value as AthMemberRole } : d\n )\n }\n >\n {ROLES.map((r) => (\n <option key={r} value={r}>\n {MEMBER_ROLE_LABELS[r]}\n </option>\n ))}\n </select>\n ) : (\n <span className=\"text-text-secondary\">\n {MEMBER_ROLE_LABELS[m.role]}\n </span>\n )}\n </td>\n\n {/* Position */}\n <td className=\"px-4 py-3\">\n {isEditing && draft ? (\n <input\n aria-label=\"Position\"\n className={fieldInputClass}\n value={draft.position}\n onChange={(e) =>\n setDraft((d) => (d ? { ...d, position: e.target.value } : d))\n }\n placeholder=\"e.g. Striker\"\n />\n ) : (\n <span className=\"text-text-secondary\">{m.position || '—'}</span>\n )}\n </td>\n\n {/* Jersey # */}\n <td className=\"px-4 py-3\">\n {isEditing && draft ? (\n <input\n aria-label=\"Jersey number\"\n inputMode=\"numeric\"\n className={`${fieldInputClass} w-20`}\n value={draft.jerseyNumber}\n onChange={(e) =>\n setDraft((d) => (d ? { ...d, jerseyNumber: e.target.value } : d))\n }\n placeholder=\"9\"\n />\n ) : (\n <span className=\"tabular-nums text-text-primary\">\n {m.jerseyNumber ?? '—'}\n </span>\n )}\n </td>\n\n {/* Status */}\n <td className=\"px-4 py-3\">\n {isEditing && draft ? (\n <select\n aria-label=\"Status\"\n className={fieldInputClass}\n value={draft.status}\n onChange={(e) =>\n setDraft((d) =>\n d ? { ...d, status: e.target.value as AthMemberStatus } : d\n )\n }\n >\n {MEMBER_STATUSES.map((s) => (\n <option key={s} value={s}>\n {memberStatusLabel(s)}\n </option>\n ))}\n </select>\n ) : (\n <StatusBadge status={m.status} />\n )}\n </td>\n\n {/* Actions */}\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center justify-end gap-1\">\n {isEditing ? (\n <>\n <button\n type=\"button\"\n onClick={() => void saveEdit(m.id)}\n disabled={busy}\n aria-label=\"Save changes\"\n className=\"rounded-lg p-2 text-status-success-text transition-colors hover:bg-status-success-bg-subtle disabled:opacity-60\"\n >\n {busy ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"h-4 w-4\" />\n )}\n </button>\n <button\n type=\"button\"\n onClick={cancelEdit}\n disabled={busy}\n aria-label=\"Cancel editing\"\n className=\"rounded-lg p-2 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary disabled:opacity-60\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={() => startEdit(m)}\n aria-label={`Edit ${m.displayName}`}\n className=\"rounded-lg p-2 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => void removeMember.mutate(m.id)}\n disabled={removeMember.isPending}\n aria-label={`Remove ${m.displayName}`}\n className=\"rounded-lg p-2 text-text-secondary transition-colors hover:bg-status-error-bg-subtle hover:text-status-error-text disabled:opacity-60\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </>\n )}\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n {rowError && (\n <p className=\"border-t border-border-seam px-4 py-2 text-sm text-status-error-text\">\n {rowError}\n </p>\n )}\n </GlassCard>\n )}\n </section>\n\n {/* Fixtures */}\n <section>\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Fixtures ({fixtures.length})</h2>\n <div className=\"flex items-center gap-2\">\n {fixtures.length > 0 && (\n <button\n type=\"button\"\n onClick={() => navigateTo('/fixtures')}\n className=\"text-sm font-medium text-text-link transition-colors hover:underline\"\n >\n View all\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => navigateTo(`/fixtures/new?homeTeamId=${t.id}`)}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <Plus className=\"h-4 w-4\" /> Schedule\n </button>\n </div>\n </div>\n {fixtures.length === 0 ? (\n <EmptyState\n illustration=\"empty-calendar\"\n icon={<CalendarDays className=\"h-10 w-10\" />}\n title=\"No fixtures scheduled\"\n description=\"Schedule a match for this team to start tracking results.\"\n />\n ) : (\n <GlassCard treatment=\"insight\" className=\"px-4 py-1\">\n <div className=\"divide-y divide-border-seam\">\n {fixtures.map((f) => (\n <MatchupRow\n key={f.id}\n fixture={f}\n onClick={() => navigateTo(`/fixtures/${f.id}`)}\n />\n ))}\n </div>\n </GlassCard>\n )}\n </section>\n\n {/* Add member dialog */}\n <ResponsiveDialog open={addOpen} onOpenChange={setAddOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Add member</ResponsiveDialogTitle>\n </ResponsiveDialogHeader>\n <form onSubmit={handleAddMember} className=\"space-y-4 px-1\">\n <UserSearchSelect\n userId={memberForm.userId}\n displayName={memberForm.displayName}\n onSelect={({ userId, displayName }) =>\n setMemberForm((p) => ({ ...p, userId, displayName: displayName || p.displayName }))\n }\n required\n />\n <FormField label=\"Display name\" htmlFor=\"displayName\" required>\n <input\n id=\"displayName\"\n className={fieldInputClass}\n value={memberForm.displayName}\n onChange={(e) => setMemberForm((p) => ({ ...p, displayName: e.target.value }))}\n placeholder=\"e.g. Alex Morgan\"\n />\n </FormField>\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Role\" htmlFor=\"role\">\n <select\n id=\"role\"\n className={fieldInputClass}\n value={memberForm.role}\n onChange={(e) =>\n setMemberForm((p) => ({ ...p, role: e.target.value as AthMemberRole }))\n }\n >\n {ROLES.map((r) => (\n <option key={r} value={r}>\n {MEMBER_ROLE_LABELS[r]}\n </option>\n ))}\n </select>\n </FormField>\n <FormField label=\"Status\" htmlFor=\"memberStatus\">\n <select\n id=\"memberStatus\"\n className={fieldInputClass}\n value={memberForm.status}\n onChange={(e) =>\n setMemberForm((p) => ({ ...p, status: e.target.value as AthMemberStatus }))\n }\n >\n {MEMBER_STATUSES.map((s) => (\n <option key={s} value={s}>\n {memberStatusLabel(s)}\n </option>\n ))}\n </select>\n </FormField>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Position\" htmlFor=\"position\">\n <input\n id=\"position\"\n className={fieldInputClass}\n value={memberForm.position}\n onChange={(e) => setMemberForm((p) => ({ ...p, position: e.target.value }))}\n placeholder=\"e.g. Striker\"\n />\n </FormField>\n <FormField label=\"Jersey #\" htmlFor=\"jersey\">\n <input\n id=\"jersey\"\n className={fieldInputClass}\n inputMode=\"numeric\"\n value={memberForm.jerseyNumber}\n onChange={(e) => setMemberForm((p) => ({ ...p, jerseyNumber: e.target.value }))}\n placeholder=\"9\"\n />\n </FormField>\n </div>\n {memberError && <p className=\"text-sm text-status-error-text\">{memberError}</p>}\n <ResponsiveDialogFooter>\n <button\n type=\"button\"\n onClick={() => setAddOpen(false)}\n className=\"rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={addMember.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text transition-colors hover:bg-action-primary-bg/90 disabled:opacity-60\"\n >\n {addMember.isPending && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n Add member\n </button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TeamDetailPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/teams/TeamDetailPage.tsx"],"sourcesContent":["/**\n * Team Detail\n * @module atheletebridge/pages/teams\n *\n * Reads a single team (with members + fixtures) from `athTeam`, supports adding,\n * editing (athUpdateMember — role/position/jersey/status inline per roster row)\n * and removing members (athAddMember / athRemoveMember), editing and archiving\n * the team (athUpdateTeam via the form / athArchiveTeam), links each roster row\n * to the athlete profile, and renders the team's fixtures as crest-vs-crest\n * matchup rows.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n CalendarDays,\n Check,\n Edit,\n Archive,\n MapPin,\n Pencil,\n Plus,\n Trash2,\n UserPlus,\n Loader2,\n X,\n} from 'lucide-react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch, clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql';\nimport {\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { Crest } from '../../components/Crest';\nimport { UserAvatar } from '../../components/UserAvatar';\nimport { MatchupRow } from '../../components/MatchupRow';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingState, ErrorState } from '../../components/LoadingState';\nimport { FormField, fieldInputClass } from '../../components/form';\nimport { UserSearchSelect } from '../../components/UserSearchSelect';\nimport { SPORT_LABELS, MEMBER_ROLE_LABELS } from '../../components/domain';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport {\n useTeam,\n useArchiveTeam,\n useAddMember,\n useRemoveMember,\n} from '../../hooks/useAthleteBridgeApi';\nimport type { AthMember, AthMemberRole, AthMemberStatus, AthUpdateMemberInput } from '../../types';\n\nconst ROLES = Object.keys(MEMBER_ROLE_LABELS) as AthMemberRole[];\nconst MEMBER_STATUSES: AthMemberStatus[] = ['TRIAL', 'ACTIVE', 'INJURED', 'SUSPENDED', 'RELEASED'];\n\nconst memberStatusLabel = (s: AthMemberStatus): string => s.charAt(0) + s.slice(1).toLowerCase();\n\ninterface AddMemberForm {\n userId: string;\n displayName: string;\n role: AthMemberRole;\n status: AthMemberStatus;\n position: string;\n jerseyNumber: string;\n}\n\nconst EMPTY_MEMBER: AddMemberForm = {\n userId: '',\n displayName: '',\n role: 'PLAYER',\n status: 'ACTIVE',\n position: '',\n jerseyNumber: '',\n};\n\ninterface RowDraft {\n role: AthMemberRole;\n status: AthMemberStatus;\n position: string;\n jerseyNumber: string;\n}\n\n/**\n * Inline roster-member update wired directly to the shipped `athUpdateMember`\n * mutation (the shared kit has add/remove hooks but no update hook). Uses the\n * same workspace-token graphqlFetch primitive as the rest of the MFE and clears\n * the short-lived read cache so the team refetch is fresh.\n */\nconst useUpdateMemberInline = (teamId: string | undefined) => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAthleteBridge();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AthUpdateMemberInput }) => {\n const res = await graphqlFetch<{ athUpdateMember: AthMember }>({\n gateway: 'workspace',\n baseUrl: apiGatewayUrl,\n query: `mutation AthUpdateMember($id: ID!, $input: AthUpdateMemberInput!) {\n athUpdateMember(id: $id, input: $input) {\n id teamId displayName role status position jerseyNumber\n }\n }`,\n variables: { id, input },\n workspaceToken: true,\n });\n if (res.errors?.length) {\n throw new Error(res.errors[0]?.message ?? 'Failed to update member.');\n }\n clearGraphqlFetchResponseCache();\n if (!res.data) throw new Error('Update did not return data.');\n return res.data.athUpdateMember;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['atheletebridge', 'team', teamId] });\n void queryClient.invalidateQueries({ queryKey: ['atheletebridge', 'members', teamId] });\n },\n });\n};\n\nexport function TeamDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useAthleteBridge();\n\n const team = useTeam(id);\n const archiveTeam = useArchiveTeam();\n const addMember = useAddMember();\n const removeMember = useRemoveMember(id);\n const updateMember = useUpdateMemberInline(id);\n\n const [addOpen, setAddOpen] = useState(false);\n const [memberForm, setMemberForm] = useState<AddMemberForm>(EMPTY_MEMBER);\n const [memberError, setMemberError] = useState<string | null>(null);\n\n const [editingId, setEditingId] = useState<string | null>(null);\n const [draft, setDraft] = useState<RowDraft | null>(null);\n const [rowError, setRowError] = useState<string | null>(null);\n\n if (team.isLoading) {\n return (\n <PageLayout title=\"Team\">\n <LoadingState label=\"Loading team…\" />\n </PageLayout>\n );\n }\n\n if (team.isError || !team.data) {\n return (\n <PageLayout title=\"Team\">\n <ErrorState\n title=\"Team not found\"\n message=\"This team does not exist or you do not have access to it.\"\n onRetry={() => navigateTo('/teams')}\n />\n </PageLayout>\n );\n }\n\n const t = team.data;\n const members = t.members?.items ?? [];\n const fixtures = t.fixtures?.items ?? [];\n\n const metaParts = [\n SPORT_LABELS[t.sport],\n t.ageGroup ?? undefined,\n t.season ?? undefined,\n t.homeVenue ?? undefined,\n ].filter(Boolean) as string[];\n\n const handleArchive = async () => {\n if (!id) return;\n await archiveTeam.mutateAsync(id);\n navigateTo('/teams');\n };\n\n const startEdit = (m: AthMember) => {\n setRowError(null);\n setEditingId(m.id);\n setDraft({\n role: m.role,\n status: m.status,\n position: m.position ?? '',\n jerseyNumber: m.jerseyNumber != null ? String(m.jerseyNumber) : '',\n });\n };\n\n const cancelEdit = () => {\n setEditingId(null);\n setDraft(null);\n setRowError(null);\n };\n\n const saveEdit = async (memberId: string) => {\n if (!draft) return;\n setRowError(null);\n const trimmedJersey = draft.jerseyNumber.trim();\n let jersey: number | undefined;\n if (trimmedJersey) {\n jersey = Number.parseInt(trimmedJersey, 10);\n if (Number.isNaN(jersey)) {\n setRowError('Jersey number must be a number.');\n return;\n }\n }\n try {\n await updateMember.mutateAsync({\n id: memberId,\n input: {\n role: draft.role,\n status: draft.status,\n position: draft.position.trim() || undefined,\n jerseyNumber: jersey,\n },\n });\n cancelEdit();\n } catch (err) {\n setRowError(err instanceof Error ? err.message : 'Failed to update member.');\n }\n };\n\n const handleAddMember = async (e: React.FormEvent) => {\n e.preventDefault();\n setMemberError(null);\n if (!id) return;\n if (!memberForm.userId.trim() || !memberForm.displayName.trim()) {\n setMemberError('User ID and display name are required.');\n return;\n }\n const jersey = memberForm.jerseyNumber.trim()\n ? Number.parseInt(memberForm.jerseyNumber, 10)\n : undefined;\n if (jersey !== undefined && Number.isNaN(jersey)) {\n setMemberError('Jersey number must be a number.');\n return;\n }\n try {\n await addMember.mutateAsync({\n teamId: id,\n userId: memberForm.userId.trim(),\n displayName: memberForm.displayName.trim(),\n role: memberForm.role,\n status: memberForm.status,\n position: memberForm.position.trim() || undefined,\n jerseyNumber: jersey,\n });\n setMemberForm(EMPTY_MEMBER);\n setAddOpen(false);\n } catch (err) {\n setMemberError(err instanceof Error ? err.message : 'Failed to add member.');\n }\n };\n\n const openProfile = (memberId: string) => navigateTo(`/teams/${t.id}/athletes/${memberId}`);\n\n return (\n <PageLayout\n title={t.name}\n gradientTitle\n description={metaParts.join(' · ')}\n actions={\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/teams')}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/teams/${t.id}/edit`)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text transition-colors hover:bg-action-primary-bg/90\"\n >\n <Edit className=\"h-4 w-4\" /> Edit\n </button>\n {t.status !== 'ARCHIVED' && (\n <button\n type=\"button\"\n onClick={handleArchive}\n disabled={archiveTeam.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-60\"\n >\n {archiveTeam.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Archive className=\"h-4 w-4\" />\n )}{' '}\n Archive\n </button>\n )}\n </div>\n }\n >\n {/* Hero: crest + meta strip */}\n <GlassCard treatment=\"insight\" className=\"mb-8 p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n <Crest name={t.name} sport={t.sport} size={64} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h2 className=\"text-xl font-semibold text-text-primary\">{t.name}</h2>\n <StatusBadge status={t.status} />\n </div>\n <div className=\"mt-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-text-secondary\">\n {metaParts.map((part, i) => (\n <span key={part} className=\"flex items-center gap-2\">\n {i > 0 && (\n <span aria-hidden=\"true\" className=\"text-text-muted\">\n ·\n </span>\n )}\n {part === t.homeVenue ? (\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3.5 w-3.5\" aria-hidden=\"true\" /> {part}\n </span>\n ) : (\n part\n )}\n </span>\n ))}\n </div>\n </div>\n </div>\n {t.description && <p className=\"mt-4 text-sm text-text-secondary\">{t.description}</p>}\n {t.tags.length > 0 && (\n <div className=\"mt-4 flex flex-wrap gap-1.5\">\n {t.tags.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 </GlassCard>\n\n {/* Roster */}\n <section className=\"mb-8\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Roster ({members.length})</h2>\n <button\n type=\"button\"\n onClick={() => {\n setMemberError(null);\n setAddOpen(true);\n }}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-3 py-1.5 text-sm font-semibold text-action-primary-text transition-colors hover:bg-action-primary-bg/90\"\n >\n <UserPlus className=\"h-4 w-4\" /> Add member\n </button>\n </div>\n\n {members.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<UserPlus className=\"h-10 w-10\" />}\n title=\"No members yet\"\n description=\"Add players, coaches and staff to build the roster.\"\n />\n ) : (\n <GlassCard treatment=\"insight\" className=\"overflow-hidden p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[720px] border-collapse text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam text-left text-xs uppercase tracking-wide text-text-secondary\">\n <th className=\"px-4 py-3 font-medium\">Player</th>\n <th className=\"px-4 py-3 font-medium\">Role</th>\n <th className=\"px-4 py-3 font-medium\">Position</th>\n <th className=\"px-4 py-3 font-medium\">Jersey #</th>\n <th className=\"px-4 py-3 font-medium\">Status</th>\n <th className=\"px-4 py-3 text-right font-medium\">Actions</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border-seam\">\n {members.map((m) => {\n const isEditing = editingId === m.id;\n const busy = updateMember.isPending && isEditing;\n return (\n <tr\n key={m.id}\n className=\"align-middle transition-colors hover:bg-bg-sunken/60\"\n >\n {/* Player */}\n <td className=\"px-4 py-3\">\n <button\n type=\"button\"\n onClick={() => openProfile(m.id)}\n className=\"group flex items-center gap-3 text-left focus-visible:outline-none\"\n title={`View ${m.displayName}'s profile`}\n >\n <UserAvatar\n name={m.displayName}\n id={m.userId}\n jersey={m.jerseyNumber}\n size=\"sm\"\n />\n <span className=\"min-w-0\">\n <span className=\"block truncate font-medium text-text-primary group-hover:text-text-link\">\n {m.displayName}\n </span>\n <span className=\"block truncate text-xs text-text-secondary group-hover:text-text-link\">\n View profile\n </span>\n </span>\n </button>\n </td>\n\n {/* Role */}\n <td className=\"px-4 py-3\">\n {isEditing && draft ? (\n <select\n aria-label=\"Role\"\n className={fieldInputClass}\n value={draft.role}\n onChange={(e) =>\n setDraft((d) =>\n d ? { ...d, role: e.target.value as AthMemberRole } : d\n )\n }\n >\n {ROLES.map((r) => (\n <option key={r} value={r}>\n {MEMBER_ROLE_LABELS[r]}\n </option>\n ))}\n </select>\n ) : (\n <span className=\"text-text-secondary\">\n {MEMBER_ROLE_LABELS[m.role]}\n </span>\n )}\n </td>\n\n {/* Position */}\n <td className=\"px-4 py-3\">\n {isEditing && draft ? (\n <input\n aria-label=\"Position\"\n className={fieldInputClass}\n value={draft.position}\n onChange={(e) =>\n setDraft((d) => (d ? { ...d, position: e.target.value } : d))\n }\n placeholder=\"e.g. Striker\"\n />\n ) : (\n <span className=\"text-text-secondary\">{m.position || '—'}</span>\n )}\n </td>\n\n {/* Jersey # */}\n <td className=\"px-4 py-3\">\n {isEditing && draft ? (\n <input\n aria-label=\"Jersey number\"\n inputMode=\"numeric\"\n className={`${fieldInputClass} w-20`}\n value={draft.jerseyNumber}\n onChange={(e) =>\n setDraft((d) => (d ? { ...d, jerseyNumber: e.target.value } : d))\n }\n placeholder=\"9\"\n />\n ) : (\n <span className=\"tabular-nums text-text-primary\">\n {m.jerseyNumber ?? '—'}\n </span>\n )}\n </td>\n\n {/* Status */}\n <td className=\"px-4 py-3\">\n {isEditing && draft ? (\n <select\n aria-label=\"Status\"\n className={fieldInputClass}\n value={draft.status}\n onChange={(e) =>\n setDraft((d) =>\n d ? { ...d, status: e.target.value as AthMemberStatus } : d\n )\n }\n >\n {MEMBER_STATUSES.map((s) => (\n <option key={s} value={s}>\n {memberStatusLabel(s)}\n </option>\n ))}\n </select>\n ) : (\n <StatusBadge status={m.status} />\n )}\n </td>\n\n {/* Actions */}\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center justify-end gap-1\">\n {isEditing ? (\n <>\n <button\n type=\"button\"\n onClick={() => void saveEdit(m.id)}\n disabled={busy}\n aria-label=\"Save changes\"\n className=\"rounded-lg p-2 text-status-success-text transition-colors hover:bg-status-success-bg-subtle disabled:opacity-60\"\n >\n {busy ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"h-4 w-4\" />\n )}\n </button>\n <button\n type=\"button\"\n onClick={cancelEdit}\n disabled={busy}\n aria-label=\"Cancel editing\"\n className=\"rounded-lg p-2 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary disabled:opacity-60\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n onClick={() => startEdit(m)}\n aria-label={`Edit ${m.displayName}`}\n className=\"rounded-lg p-2 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => void removeMember.mutate(m.id)}\n disabled={removeMember.isPending}\n aria-label={`Remove ${m.displayName}`}\n className=\"rounded-lg p-2 text-text-secondary transition-colors hover:bg-status-error-bg-subtle hover:text-status-error-text disabled:opacity-60\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </>\n )}\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n {rowError && (\n <p className=\"border-t border-border-seam px-4 py-2 text-sm text-status-error-text\">\n {rowError}\n </p>\n )}\n </GlassCard>\n )}\n </section>\n\n {/* Fixtures */}\n <section>\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Fixtures ({fixtures.length})</h2>\n <div className=\"flex items-center gap-2\">\n {fixtures.length > 0 && (\n <button\n type=\"button\"\n onClick={() => navigateTo('/fixtures')}\n className=\"text-sm font-medium text-text-link transition-colors hover:underline\"\n >\n View all\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => navigateTo(`/fixtures/new?homeTeamId=${t.id}`)}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <Plus className=\"h-4 w-4\" /> Schedule\n </button>\n </div>\n </div>\n {fixtures.length === 0 ? (\n <EmptyState\n illustration=\"empty-calendar\"\n icon={<CalendarDays className=\"h-10 w-10\" />}\n title=\"No fixtures scheduled\"\n description=\"Schedule a match for this team to start tracking results.\"\n />\n ) : (\n <GlassCard treatment=\"insight\" className=\"px-4 py-1\">\n <div className=\"divide-y divide-border-seam\">\n {fixtures.map((f) => (\n <MatchupRow\n key={f.id}\n fixture={f}\n onClick={() => navigateTo(`/fixtures/${f.id}`)}\n />\n ))}\n </div>\n </GlassCard>\n )}\n </section>\n\n {/* Add member dialog */}\n <ResponsiveDialog open={addOpen} onOpenChange={setAddOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Add member</ResponsiveDialogTitle>\n </ResponsiveDialogHeader>\n <form onSubmit={handleAddMember} className=\"space-y-4 px-1\">\n <UserSearchSelect\n userId={memberForm.userId}\n displayName={memberForm.displayName}\n onSelect={({ userId, displayName }) =>\n setMemberForm((p) => ({ ...p, userId, displayName: displayName || p.displayName }))\n }\n required\n />\n <FormField label=\"Display name\" htmlFor=\"displayName\" required>\n <input\n id=\"displayName\"\n className={fieldInputClass}\n value={memberForm.displayName}\n onChange={(e) => setMemberForm((p) => ({ ...p, displayName: e.target.value }))}\n placeholder=\"e.g. Alex Morgan\"\n />\n </FormField>\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Role\" htmlFor=\"role\">\n <select\n id=\"role\"\n className={fieldInputClass}\n value={memberForm.role}\n onChange={(e) =>\n setMemberForm((p) => ({ ...p, role: e.target.value as AthMemberRole }))\n }\n >\n {ROLES.map((r) => (\n <option key={r} value={r}>\n {MEMBER_ROLE_LABELS[r]}\n </option>\n ))}\n </select>\n </FormField>\n <FormField label=\"Status\" htmlFor=\"memberStatus\">\n <select\n id=\"memberStatus\"\n className={fieldInputClass}\n value={memberForm.status}\n onChange={(e) =>\n setMemberForm((p) => ({ ...p, status: e.target.value as AthMemberStatus }))\n }\n >\n {MEMBER_STATUSES.map((s) => (\n <option key={s} value={s}>\n {memberStatusLabel(s)}\n </option>\n ))}\n </select>\n </FormField>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Position\" htmlFor=\"position\">\n <input\n id=\"position\"\n className={fieldInputClass}\n value={memberForm.position}\n onChange={(e) => setMemberForm((p) => ({ ...p, position: e.target.value }))}\n placeholder=\"e.g. Striker\"\n />\n </FormField>\n <FormField label=\"Jersey #\" htmlFor=\"jersey\">\n <input\n id=\"jersey\"\n className={fieldInputClass}\n inputMode=\"numeric\"\n value={memberForm.jerseyNumber}\n onChange={(e) => setMemberForm((p) => ({ ...p, jerseyNumber: e.target.value }))}\n placeholder=\"9\"\n />\n </FormField>\n </div>\n {memberError && <p className=\"text-sm text-status-error-text\">{memberError}</p>}\n <ResponsiveDialogFooter>\n <button\n type=\"button\"\n onClick={() => setAddOpen(false)}\n className=\"rounded-lg border border-border-seam px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={addMember.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text transition-colors hover:bg-action-primary-bg/90 disabled:opacity-60\"\n >\n {addMember.isPending && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n Add member\n </button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -88,7 +88,7 @@ function y() {
88
88
  className: "grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",
89
89
  children: E.map((e) => /* @__PURE__ */ m(r, {
90
90
  team: e,
91
- memberCount: e.members?.length,
91
+ memberCount: e.members?.items.length,
92
92
  onClick: () => n(`/teams/${e.id}`)
93
93
  }, e.id))
94
94
  }), /* @__PURE__ */ m(c, {
@@ -1 +1 @@
1
- {"version":3,"file":"TeamsListPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/teams/TeamsListPage.tsx"],"sourcesContent":["/**\n * Teams List\n * @module atheletebridge/pages/teams\n */\n\nimport { useState } from 'react';\nimport { Plus, Users } from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { TeamCard } from '../../components/TeamCard';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingState, ErrorState } from '../../components/LoadingState';\nimport { FilterSelect } from '../../components/FilterSelect';\nimport { CursorPager } from '../../components/CursorPager';\nimport { SPORT_LABELS } from '../../components/domain';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { useTeams } from '../../hooks/useAthleteBridgeApi';\nimport type { AthSport, AthTeamStatus } from '../../types';\n\nconst PAGE_SIZE = 12;\n\nconst SPORT_OPTS = (Object.keys(SPORT_LABELS) as AthSport[]).map((value) => ({\n value,\n label: SPORT_LABELS[value],\n}));\n\nconst STATUS_OPTS: ReadonlyArray<{ value: AthTeamStatus; label: string }> = [\n { value: 'FORMING', label: 'Forming' },\n { value: 'ACTIVE', label: 'Active' },\n { value: 'INACTIVE', label: 'Inactive' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nexport function TeamsListPage() {\n const { navigateTo } = useAthleteBridge();\n const [sport, setSport] = useState<AthSport | ''>('');\n const [status, setStatus] = useState<AthTeamStatus | ''>('');\n const [page, setPage] = useState(0);\n\n const teams = useTeams({\n sport: sport || undefined,\n status: status || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = teams.data?.items ?? [];\n const hasMore = teams.data?.pageInfo.hasMore ?? false;\n\n return (\n <PageLayout\n title=\"Teams\"\n description=\"Squads, club sides, academy groups and esports rosters.\"\n hero\n gradientTitle\n actions={\n <button\n type=\"button\"\n data-tour=\"teams-create\"\n onClick={() => navigateTo('/teams/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\" /> New team\n </button>\n }\n >\n <div data-tour=\"teams-filters\" className=\"mb-6 flex flex-wrap items-center gap-3\">\n <FilterSelect\n ariaLabel=\"Filter by sport\"\n allLabel=\"All sports\"\n value={sport}\n onChange={(v) => {\n setSport(v);\n setPage(0);\n }}\n options={SPORT_OPTS}\n />\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 {teams.isLoading ? (\n <LoadingState label=\"Loading teams…\" />\n ) : teams.isError ? (\n <ErrorState onRetry={() => void teams.refetch()} />\n ) : items.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Users className=\"h-10 w-10\" />}\n title=\"No teams found\"\n description={\n sport || status\n ? 'Try clearing your filters to see all teams.'\n : 'Create your first team to build a roster and start scheduling fixtures.'\n }\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/teams/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 Create team\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((team) => (\n <TeamCard\n key={team.id}\n team={team}\n memberCount={team.members?.length}\n onClick={() => navigateTo(`/teams/${team.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,IAAc,OAAO,KAAK,EAAa,CAAgB,KAAK,OAAW;CAC3E;CACA,OAAO,EAAa;CACrB,EAAE,EAEG,IAAsE;CAC1E;EAAE,OAAO;EAAW,OAAO;EAAW;CACtC;EAAE,OAAO;EAAU,OAAO;EAAU;CACpC;EAAE,OAAO;EAAY,OAAO;EAAY;CACxC;EAAE,OAAO;EAAY,OAAO;EAAY;CACzC;AAED,SAAgB,IAAgB;CAC9B,IAAM,EAAE,kBAAe,GAAkB,EACnC,CAAC,GAAO,KAAY,EAAwB,GAAG,EAC/C,CAAC,GAAQ,KAAa,EAA6B,GAAG,EACtD,CAAC,GAAM,KAAW,EAAS,EAAE,EAE7B,IAAQ,EAAS;EACrB,OAAO,KAAS,KAAA;EAChB,QAAQ,KAAU,KAAA;EAClB,YAAY;GAAE,OAAO;GAAW,QAAQ,IAAO;GAAW;EAC3D,CAAC,EAEI,IAAQ,EAAM,MAAM,SAAS,EAAE,EAC/B,IAAU,EAAM,MAAM,SAAS,WAAW;AAEhD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,MAAA;EACA,eAAA;EACA,SACE,kBAAC,UAAD;GACE,MAAK;GACL,aAAU;GACV,eAAe,EAAW,aAAa;GACvC,WAAU;aAJZ,CAME,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,YACrB;;YAbb,CAgBE,kBAAC,OAAD;GAAK,aAAU;GAAgB,WAAU;aAAzC,CACE,kBAAC,GAAD;IACE,WAAU;IACV,UAAS;IACT,OAAO;IACP,WAAW,MAAM;AAEf,KADA,EAAS,EAAE,EACX,EAAQ,EAAE;;IAEZ,SAAS;IACT,CAAA,EACF,kBAAC,GAAD;IACE,WAAU;IACV,UAAS;IACT,OAAO;IACP,WAAW,MAAM;AAEf,KADA,EAAU,EAAE,EACZ,EAAQ,EAAE;;IAEZ,SAAS;IACT,CAAA,CACE;MAEL,EAAM,YACL,kBAAC,GAAD,EAAc,OAAM,kBAAmB,CAAA,GACrC,EAAM,UACR,kBAAC,GAAD,EAAY,eAAe,KAAK,EAAM,SAAS,EAAI,CAAA,GACjD,EAAM,WAAW,IACnB,kBAAC,GAAD;GACE,cAAa;GACb,MAAM,kBAAC,GAAD,EAAO,WAAU,aAAc,CAAA;GACrC,OAAM;GACN,aACE,KAAS,IACL,gDACA;GAEN,QACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAW,aAAa;IACvC,WAAU;cACX;IAEQ,CAAA;GAEX,CAAA,GAEF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,KAAK,MACV,kBAAC,GAAD;IAEQ;IACN,aAAa,EAAK,SAAS;IAC3B,eAAe,EAAW,UAAU,EAAK,KAAK;IAC9C,EAJK,EAAK,GAIV,CACF;GACE,CAAA,EACN,kBAAC,GAAD;GACE,WAAU;GACJ;GACG;GACT,cAAc,GAAS,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC;GAChD,cAAc,GAAS,MAAM,IAAI,EAAE;GACnC,CAAA,CACD,EAAA,CAAA,CAEM"}
1
+ {"version":3,"file":"TeamsListPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/teams/TeamsListPage.tsx"],"sourcesContent":["/**\n * Teams List\n * @module atheletebridge/pages/teams\n */\n\nimport { useState } from 'react';\nimport { Plus, Users } from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { TeamCard } from '../../components/TeamCard';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingState, ErrorState } from '../../components/LoadingState';\nimport { FilterSelect } from '../../components/FilterSelect';\nimport { CursorPager } from '../../components/CursorPager';\nimport { SPORT_LABELS } from '../../components/domain';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { useTeams } from '../../hooks/useAthleteBridgeApi';\nimport type { AthSport, AthTeamStatus } from '../../types';\n\nconst PAGE_SIZE = 12;\n\nconst SPORT_OPTS = (Object.keys(SPORT_LABELS) as AthSport[]).map((value) => ({\n value,\n label: SPORT_LABELS[value],\n}));\n\nconst STATUS_OPTS: ReadonlyArray<{ value: AthTeamStatus; label: string }> = [\n { value: 'FORMING', label: 'Forming' },\n { value: 'ACTIVE', label: 'Active' },\n { value: 'INACTIVE', label: 'Inactive' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nexport function TeamsListPage() {\n const { navigateTo } = useAthleteBridge();\n const [sport, setSport] = useState<AthSport | ''>('');\n const [status, setStatus] = useState<AthTeamStatus | ''>('');\n const [page, setPage] = useState(0);\n\n const teams = useTeams({\n sport: sport || undefined,\n status: status || undefined,\n pagination: { limit: PAGE_SIZE, offset: page * PAGE_SIZE },\n });\n\n const items = teams.data?.items ?? [];\n const hasMore = teams.data?.pageInfo.hasMore ?? false;\n\n return (\n <PageLayout\n title=\"Teams\"\n description=\"Squads, club sides, academy groups and esports rosters.\"\n hero\n gradientTitle\n actions={\n <button\n type=\"button\"\n data-tour=\"teams-create\"\n onClick={() => navigateTo('/teams/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\" /> New team\n </button>\n }\n >\n <div data-tour=\"teams-filters\" className=\"mb-6 flex flex-wrap items-center gap-3\">\n <FilterSelect\n ariaLabel=\"Filter by sport\"\n allLabel=\"All sports\"\n value={sport}\n onChange={(v) => {\n setSport(v);\n setPage(0);\n }}\n options={SPORT_OPTS}\n />\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 {teams.isLoading ? (\n <LoadingState label=\"Loading teams…\" />\n ) : teams.isError ? (\n <ErrorState onRetry={() => void teams.refetch()} />\n ) : items.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Users className=\"h-10 w-10\" />}\n title=\"No teams found\"\n description={\n sport || status\n ? 'Try clearing your filters to see all teams.'\n : 'Create your first team to build a roster and start scheduling fixtures.'\n }\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/teams/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 Create team\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((team) => (\n <TeamCard\n key={team.id}\n team={team}\n memberCount={team.members?.items.length}\n onClick={() => navigateTo(`/teams/${team.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,IAAc,OAAO,KAAK,EAAa,CAAgB,KAAK,OAAW;CAC3E;CACA,OAAO,EAAa;CACrB,EAAE,EAEG,IAAsE;CAC1E;EAAE,OAAO;EAAW,OAAO;EAAW;CACtC;EAAE,OAAO;EAAU,OAAO;EAAU;CACpC;EAAE,OAAO;EAAY,OAAO;EAAY;CACxC;EAAE,OAAO;EAAY,OAAO;EAAY;CACzC;AAED,SAAgB,IAAgB;CAC9B,IAAM,EAAE,kBAAe,GAAkB,EACnC,CAAC,GAAO,KAAY,EAAwB,GAAG,EAC/C,CAAC,GAAQ,KAAa,EAA6B,GAAG,EACtD,CAAC,GAAM,KAAW,EAAS,EAAE,EAE7B,IAAQ,EAAS;EACrB,OAAO,KAAS,KAAA;EAChB,QAAQ,KAAU,KAAA;EAClB,YAAY;GAAE,OAAO;GAAW,QAAQ,IAAO;GAAW;EAC3D,CAAC,EAEI,IAAQ,EAAM,MAAM,SAAS,EAAE,EAC/B,IAAU,EAAM,MAAM,SAAS,WAAW;AAEhD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,MAAA;EACA,eAAA;EACA,SACE,kBAAC,UAAD;GACE,MAAK;GACL,aAAU;GACV,eAAe,EAAW,aAAa;GACvC,WAAU;aAJZ,CAME,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,YACrB;;YAbb,CAgBE,kBAAC,OAAD;GAAK,aAAU;GAAgB,WAAU;aAAzC,CACE,kBAAC,GAAD;IACE,WAAU;IACV,UAAS;IACT,OAAO;IACP,WAAW,MAAM;AAEf,KADA,EAAS,EAAE,EACX,EAAQ,EAAE;;IAEZ,SAAS;IACT,CAAA,EACF,kBAAC,GAAD;IACE,WAAU;IACV,UAAS;IACT,OAAO;IACP,WAAW,MAAM;AAEf,KADA,EAAU,EAAE,EACZ,EAAQ,EAAE;;IAEZ,SAAS;IACT,CAAA,CACE;MAEL,EAAM,YACL,kBAAC,GAAD,EAAc,OAAM,kBAAmB,CAAA,GACrC,EAAM,UACR,kBAAC,GAAD,EAAY,eAAe,KAAK,EAAM,SAAS,EAAI,CAAA,GACjD,EAAM,WAAW,IACnB,kBAAC,GAAD;GACE,cAAa;GACb,MAAM,kBAAC,GAAD,EAAO,WAAU,aAAc,CAAA;GACrC,OAAM;GACN,aACE,KAAS,IACL,gDACA;GAEN,QACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAW,aAAa;IACvC,WAAU;cACX;IAEQ,CAAA;GAEX,CAAA,GAEF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,KAAK,MACV,kBAAC,GAAD;IAEQ;IACN,aAAa,EAAK,SAAS,MAAM;IACjC,eAAe,EAAW,UAAU,EAAK,KAAK;IAC9C,EAJK,EAAK,GAIV,CACF;GACE,CAAA,EACN,kBAAC,GAAD;GACE,WAAU;GACJ;GACG;GACT,cAAc,GAAS,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC;GAChD,cAAc,GAAS,MAAM,IAAI,EAAE;GACnC,CAAA,CACD,EAAA,CAAA,CAEM"}
@@ -109,8 +109,8 @@ export interface AthTeam {
109
109
  tags: string[];
110
110
  createdAt: string;
111
111
  updatedAt: string;
112
- members?: AthMember[];
113
- fixtures?: AthFixture[];
112
+ members?: AthMemberConnection;
113
+ fixtures?: AthFixtureConnection;
114
114
  }
115
115
  export interface AthMember {
116
116
  id: string;
@@ -197,7 +197,7 @@ export interface AthProgram {
197
197
  weeks: number;
198
198
  isTemplate: boolean;
199
199
  tags: string[];
200
- drills?: AthDrill[];
200
+ drills?: AthDrillConnection;
201
201
  createdAt: string;
202
202
  updatedAt: string;
203
203
  }
@@ -268,6 +268,14 @@ export interface AthFixtureConnection {
268
268
  items: AthFixture[];
269
269
  pageInfo: AthPageInfo;
270
270
  }
271
+ export interface AthMemberConnection {
272
+ items: AthMember[];
273
+ pageInfo: AthPageInfo;
274
+ }
275
+ export interface AthDrillConnection {
276
+ items: AthDrill[];
277
+ pageInfo: AthPageInfo;
278
+ }
271
279
  export interface AthProgramConnection {
272
280
  items: AthProgram[];
273
281
  pageInfo: AthPageInfo;
@@ -280,6 +288,14 @@ export interface AthWorkoutLogConnection {
280
288
  items: AthWorkoutLog[];
281
289
  pageInfo: AthPageInfo;
282
290
  }
291
+ export interface AthStandingConnection {
292
+ items: AthStanding[];
293
+ pageInfo: AthPageInfo;
294
+ }
295
+ export interface AthPerformanceMetricConnection {
296
+ items: AthPerformanceMetric[];
297
+ pageInfo: AthPageInfo;
298
+ }
283
299
  export interface AthCreateTeamInput {
284
300
  name: string;
285
301
  sport?: AthSport;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/types/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,19 @@
1
1
  /**
2
- * Page context gathering — captures the user's current browser context
3
- * to be sent alongside every assistant prompt for better AI awareness.
2
+ * Page context gathering — captures the user's current route context so the
3
+ * assistant can resolve "this / current / here" without asking for an id.
4
+ *
5
+ * Two rules govern this file:
6
+ *
7
+ * 1. The capture index is declared PER ROUTE (`idGroup`), never assumed to be
8
+ * `match[1]`. The athlete route (`/teams/:teamId/athletes/:memberId`) has two
9
+ * captures, and a shared `match[1]` read handed the assistant an
10
+ * `ATHLETEBRIDGE_ATHLETE` entityType paired with a TEAM id — a
11
+ * confidently-wrong context. Declaring the group per row makes that class of
12
+ * bug unrepresentable.
13
+ * 2. Only ids and types cross the wire. No athlete names, emails or metric
14
+ * values are ever forwarded, and only keys the agent actually accepts
15
+ * (`ALLOWED_CONTEXT_KEYS` in wspace/sandbox/ai-assistant/src/context-loader.ts)
16
+ * are emitted — `userAgent`/`timestamp` used to be sent and silently dropped.
4
17
  */
5
18
  interface ConversationContextShape {
6
19
  entityType?: string;
@@ -13,11 +26,7 @@ export interface PageContext {
13
26
  currentPage: string;
14
27
  entityType?: string;
15
28
  entityId?: string;
16
- platform: string;
17
- version: string;
18
- viewportSize: string;
19
- userAgent: string;
20
- timestamp: string;
29
+ activeTab?: string;
21
30
  }
22
31
  export declare function gatherPageContext(): PageContext;
23
32
  export declare function resolveAthleteBridgeConversationContext(pathname: string, search: string): ConversationContextShape;
@@ -1 +1 @@
1
- {"version":3,"file":"pageContext.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/utils/pageContext.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,wBAAwB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAG1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAoB/C;AAMD,wBAAgB,uCAAuC,CACrD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,wBAAwB,CAsC1B"}
1
+ {"version":3,"file":"pageContext.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/utils/pageContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,UAAU,wBAAwB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAG1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IAEpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuFD,wBAAgB,iBAAiB,IAAI,WAAW,CAe/C;AAED,wBAAgB,uCAAuC,CACrD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,wBAAwB,CAkC1B"}
@@ -1,48 +1,124 @@
1
1
  //#region src/atheletebridge/utils/pageContext.ts
2
- function e() {
3
- let e = window.location.href, t = window.location.pathname.split("/").filter(Boolean).slice(0, 3).join("/") || "home", r = n(window.location.pathname, window.location.search);
2
+ var e = new Set(["new", "edit"]), t = [
3
+ {
4
+ pattern: /^\/atheletebridge\/teams\/([^/]+)\/athletes\/([^/]+)$/,
5
+ entityType: "ATHLETEBRIDGE_ATHLETE",
6
+ idGroup: 2,
7
+ metadata: (e) => ({ teamId: e[1] })
8
+ },
9
+ {
10
+ pattern: /^\/atheletebridge\/teams\/([^/]+)\/edit$/,
11
+ entityType: "ATHLETEBRIDGE_TEAM",
12
+ idGroup: 1,
13
+ metadata: () => ({ mode: "edit" })
14
+ },
15
+ {
16
+ pattern: /^\/atheletebridge\/teams\/([^/]+)$/,
17
+ entityType: "ATHLETEBRIDGE_TEAM",
18
+ idGroup: 1
19
+ },
20
+ {
21
+ pattern: /^\/atheletebridge\/teams$/,
22
+ entityType: "ATHLETEBRIDGE_TEAMS",
23
+ idGroup: 0
24
+ },
25
+ {
26
+ pattern: /^\/atheletebridge\/fixtures\/([^/]+)$/,
27
+ entityType: "ATHLETEBRIDGE_FIXTURE",
28
+ idGroup: 1
29
+ },
30
+ {
31
+ pattern: /^\/atheletebridge\/fixtures$/,
32
+ entityType: "ATHLETEBRIDGE_FIXTURES",
33
+ idGroup: 0
34
+ },
35
+ {
36
+ pattern: /^\/atheletebridge\/programs\/([^/]+)\/edit$/,
37
+ entityType: "ATHLETEBRIDGE_PROGRAM",
38
+ idGroup: 1,
39
+ metadata: () => ({ mode: "edit" })
40
+ },
41
+ {
42
+ pattern: /^\/atheletebridge\/programs\/([^/]+)$/,
43
+ entityType: "ATHLETEBRIDGE_PROGRAM",
44
+ idGroup: 1
45
+ },
46
+ {
47
+ pattern: /^\/atheletebridge\/programs$/,
48
+ entityType: "ATHLETEBRIDGE_PROGRAMS",
49
+ idGroup: 0
50
+ },
51
+ {
52
+ pattern: /^\/atheletebridge\/sessions\/([^/]+)$/,
53
+ entityType: "ATHLETEBRIDGE_SESSION",
54
+ idGroup: 1
55
+ },
56
+ {
57
+ pattern: /^\/atheletebridge\/sessions$/,
58
+ entityType: "ATHLETEBRIDGE_SESSIONS",
59
+ idGroup: 0
60
+ },
61
+ {
62
+ pattern: /^\/atheletebridge\/standings$/,
63
+ entityType: "ATHLETEBRIDGE_STANDINGS",
64
+ idGroup: 0
65
+ },
66
+ {
67
+ pattern: /^\/atheletebridge\/performance$/,
68
+ entityType: "ATHLETEBRIDGE_PERFORMANCE",
69
+ idGroup: 0
70
+ },
71
+ {
72
+ pattern: /^\/atheletebridge\/analytics$/,
73
+ entityType: "ATHLETEBRIDGE_ANALYTICS",
74
+ idGroup: 0
75
+ },
76
+ {
77
+ pattern: /^\/atheletebridge\/tournaments$/,
78
+ entityType: "ATHLETEBRIDGE_TOURNAMENTS",
79
+ idGroup: 0
80
+ },
81
+ {
82
+ pattern: /^\/atheletebridge\/onboarding$/,
83
+ entityType: "ATHLETEBRIDGE_ONBOARDING",
84
+ idGroup: 0
85
+ }
86
+ ];
87
+ function n() {
88
+ let e = window.location.pathname.split("/").filter(Boolean).slice(0, 3).join("/") || "home", t = r(window.location.pathname, window.location.search);
4
89
  return {
5
- currentUrl: e,
6
- currentPage: t,
7
- entityType: r.entityType,
8
- entityId: r.entityId,
9
- platform: "atheletebridge",
10
- version: "2026.706.1",
11
- viewportSize: `${window.innerWidth}x${window.innerHeight}`,
12
- userAgent: navigator.userAgent,
13
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
90
+ currentUrl: window.location.href,
91
+ currentPage: e,
92
+ entityType: t.entityType,
93
+ entityId: t.entityId,
94
+ activeTab: t.activeTab
14
95
  };
15
96
  }
16
- function t(e, t) {
17
- return t.match(e);
18
- }
19
- function n(e, n) {
20
- let r = new URLSearchParams(n);
21
- for (let [n, r] of [
22
- [/^\/atheletebridge\/teams\/([^/]+)$/, "ATHLETEBRIDGE_TEAM"],
23
- [/^\/atheletebridge\/teams\/([^/]+)\/athletes\/([^/]+)$/, "ATHLETEBRIDGE_ATHLETE"],
24
- [/^\/atheletebridge\/fixtures\/([^/]+)$/, "ATHLETEBRIDGE_FIXTURE"],
25
- [/^\/atheletebridge\/programs\/([^/]+)$/, "ATHLETEBRIDGE_PROGRAM"],
26
- [/^\/atheletebridge\/sessions\/([^/]+)$/, "ATHLETEBRIDGE_SESSION"],
27
- [/^\/atheletebridge\/tournaments\/([^/]+)$/, "ATHLETEBRIDGE_TOURNAMENT"]
28
- ]) {
29
- let i = t(n, e);
30
- if (i) return {
31
- entityType: r,
32
- entityId: i[1],
33
- metadata: { routePattern: n.source }
97
+ function r(n, r) {
98
+ let i = new URLSearchParams(r);
99
+ for (let r of t) {
100
+ let t = n.match(r.pattern);
101
+ if (!t) continue;
102
+ let i = r.idGroup > 0 ? t[r.idGroup] : void 0;
103
+ if (!(i !== void 0 && e.has(i))) return {
104
+ entityType: r.entityType,
105
+ ...i ? { entityId: i } : {},
106
+ metadata: {
107
+ routePattern: r.pattern.source,
108
+ ...r.metadata ? r.metadata(t) : {}
109
+ }
34
110
  };
35
111
  }
36
- let i = r.get("tab") ?? (() => {
37
- let t = e.split("/").filter(Boolean);
38
- return t.length > 2 ? t[t.length - 1] : void 0;
112
+ let a = i.get("tab") ?? (() => {
113
+ let e = n.split("/").filter(Boolean);
114
+ return e.length > 2 ? e[e.length - 1] : void 0;
39
115
  })();
40
116
  return {
41
- activeTab: i ?? void 0,
42
- metadata: { ...i ? { activeTab: i } : {} }
117
+ activeTab: a ?? void 0,
118
+ metadata: { ...a ? { activeTab: a } : {} }
43
119
  };
44
120
  }
45
121
  //#endregion
46
- export { e as gatherPageContext };
122
+ export { n as gatherPageContext };
47
123
 
48
124
  //# sourceMappingURL=pageContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pageContext.js","names":[],"sources":["../../../src/atheletebridge/utils/pageContext.ts"],"sourcesContent":["/**\n * Page context gathering — captures the user's current browser context\n * to be sent alongside every assistant prompt for better AI awareness.\n */\n\ninterface ConversationContextShape {\n entityType?: string;\n entityId?: string;\n activeTab?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PageContext {\n // `currentUrl` (NOT `activeUrl`) — must match the agent's allowed-context-key\n // contract, otherwise the agent filters it out.\n currentUrl: string;\n currentPage: string;\n entityType?: string;\n entityId?: string;\n platform: string;\n version: string;\n viewportSize: string;\n userAgent: string;\n timestamp: string;\n}\n\nexport function gatherPageContext(): PageContext {\n const url = window.location.href;\n const pathSegments = window.location.pathname.split('/').filter(Boolean);\n const currentPage = pathSegments.slice(0, 3).join('/') || 'home';\n const entity = resolveAthleteBridgeConversationContext(\n window.location.pathname,\n window.location.search\n );\n\n return {\n currentUrl: url,\n currentPage,\n entityType: entity.entityType,\n entityId: entity.entityId,\n platform: 'atheletebridge',\n version: import.meta.env.VITE_APP_VERSION ?? '2026.706.1',\n viewportSize: `${window.innerWidth}x${window.innerHeight}`,\n userAgent: navigator.userAgent,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction matchPath(pattern: RegExp, pathname: string): RegExpMatchArray | null {\n return pathname.match(pattern);\n}\n\nexport function resolveAthleteBridgeConversationContext(\n pathname: string,\n search: string\n): ConversationContextShape {\n const params = new URLSearchParams(search);\n\n const directMatches: Array<[RegExp, string]> = [\n [/^\\/atheletebridge\\/teams\\/([^/]+)$/, 'ATHLETEBRIDGE_TEAM'],\n [/^\\/atheletebridge\\/teams\\/([^/]+)\\/athletes\\/([^/]+)$/, 'ATHLETEBRIDGE_ATHLETE'],\n [/^\\/atheletebridge\\/fixtures\\/([^/]+)$/, 'ATHLETEBRIDGE_FIXTURE'],\n [/^\\/atheletebridge\\/programs\\/([^/]+)$/, 'ATHLETEBRIDGE_PROGRAM'],\n [/^\\/atheletebridge\\/sessions\\/([^/]+)$/, 'ATHLETEBRIDGE_SESSION'],\n [/^\\/atheletebridge\\/tournaments\\/([^/]+)$/, 'ATHLETEBRIDGE_TOURNAMENT'],\n ];\n\n for (const [pattern, entityType] of directMatches) {\n const match = matchPath(pattern, pathname);\n if (match) {\n return {\n entityType,\n entityId: match[1],\n metadata: {\n routePattern: pattern.source,\n },\n };\n }\n }\n\n const activeTab =\n params.get('tab') ??\n (() => {\n const segments = pathname.split('/').filter(Boolean);\n return segments.length > 2 ? segments[segments.length - 1] : undefined;\n })();\n\n return {\n activeTab: activeTab ?? undefined,\n metadata: {\n ...(activeTab ? { activeTab } : {}),\n },\n };\n}\n"],"mappings":";AA0BA,SAAgB,IAAiC;CAC/C,IAAM,IAAM,OAAO,SAAS,MAEtB,IADe,OAAO,SAAS,SAAS,MAAM,IAAI,CAAC,OAAO,QAAQ,CACvC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,QACpD,IAAS,EACb,OAAO,SAAS,UAChB,OAAO,SAAS,OACjB;AAED,QAAO;EACL,YAAY;EACZ;EACA,YAAY,EAAO;EACnB,UAAU,EAAO;EACjB,UAAU;EACV,SAA6C;EAC7C,cAAc,GAAG,OAAO,WAAW,GAAG,OAAO;EAC7C,WAAW,UAAU;EACrB,4BAAW,IAAI,MAAM,EAAC,aAAa;EACpC;;AAGH,SAAS,EAAU,GAAiB,GAA2C;AAC7E,QAAO,EAAS,MAAM,EAAQ;;AAGhC,SAAgB,EACd,GACA,GAC0B;CAC1B,IAAM,IAAS,IAAI,gBAAgB,EAAO;AAW1C,MAAK,IAAM,CAAC,GAAS,MAT0B;EAC7C,CAAC,sCAAsC,qBAAqB;EAC5D,CAAC,yDAAyD,wBAAwB;EAClF,CAAC,yCAAyC,wBAAwB;EAClE,CAAC,yCAAyC,wBAAwB;EAClE,CAAC,yCAAyC,wBAAwB;EAClE,CAAC,4CAA4C,2BAA2B;EACzE,EAEkD;EACjD,IAAM,IAAQ,EAAU,GAAS,EAAS;AAC1C,MAAI,EACF,QAAO;GACL;GACA,UAAU,EAAM;GAChB,UAAU,EACR,cAAc,EAAQ,QACvB;GACF;;CAIL,IAAM,IACJ,EAAO,IAAI,MAAM,WACV;EACL,IAAM,IAAW,EAAS,MAAM,IAAI,CAAC,OAAO,QAAQ;AACpD,SAAO,EAAS,SAAS,IAAI,EAAS,EAAS,SAAS,KAAK,KAAA;KAC3D;AAEN,QAAO;EACL,WAAW,KAAa,KAAA;EACxB,UAAU,EACR,GAAI,IAAY,EAAE,cAAW,GAAG,EAAE,EACnC;EACF"}
1
+ {"version":3,"file":"pageContext.js","names":[],"sources":["../../../src/atheletebridge/utils/pageContext.ts"],"sourcesContent":["/**\n * Page context gathering — captures the user's current route context so the\n * assistant can resolve \"this / current / here\" without asking for an id.\n *\n * Two rules govern this file:\n *\n * 1. The capture index is declared PER ROUTE (`idGroup`), never assumed to be\n * `match[1]`. The athlete route (`/teams/:teamId/athletes/:memberId`) has two\n * captures, and a shared `match[1]` read handed the assistant an\n * `ATHLETEBRIDGE_ATHLETE` entityType paired with a TEAM id — a\n * confidently-wrong context. Declaring the group per row makes that class of\n * bug unrepresentable.\n * 2. Only ids and types cross the wire. No athlete names, emails or metric\n * values are ever forwarded, and only keys the agent actually accepts\n * (`ALLOWED_CONTEXT_KEYS` in wspace/sandbox/ai-assistant/src/context-loader.ts)\n * are emitted — `userAgent`/`timestamp` used to be sent and silently dropped.\n */\n\ninterface ConversationContextShape {\n entityType?: string;\n entityId?: string;\n activeTab?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PageContext {\n // `currentUrl` (NOT `activeUrl`) — must match the agent's allowed-context-key\n // contract, otherwise the agent filters it out.\n currentUrl: string;\n currentPage: string;\n // The entity the user is currently looking at, resolved from the route.\n entityType?: string;\n entityId?: string;\n activeTab?: string;\n}\n\n/**\n * Route segments that are literals in the router, not entity ids. Without this\n * guard `/atheletebridge/teams/new` resolves to `entityId: 'new'`.\n */\nconst RESERVED_ID_SEGMENTS = new Set(['new', 'edit']);\n\ninterface RouteDescriptor {\n pattern: RegExp;\n entityType: string;\n /**\n * 1-based capture group holding the entity id, or 0 for index routes that\n * name a surface rather than a single record.\n */\n idGroup: number;\n /** Extra ids/flags derived from the match. Ids and types only — never names. */\n metadata?: (match: RegExpMatchArray) => Record<string, unknown>;\n}\n\n/**\n * Mirrors the routes registered in AthleteBridgeRoutes.tsx. Every shipped route\n * that names something the assistant can act on has a row here; anything absent\n * falls through to the generic `activeTab` branch and binds to nothing.\n */\nconst ROUTE_DESCRIPTORS: RouteDescriptor[] = [\n // Athlete detail is matched BEFORE team detail: its path is a strict\n // extension of the team path and the more specific pattern must win.\n {\n pattern: /^\\/atheletebridge\\/teams\\/([^/]+)\\/athletes\\/([^/]+)$/,\n entityType: 'ATHLETEBRIDGE_ATHLETE',\n idGroup: 2,\n metadata: (match) => ({ teamId: match[1] }),\n },\n {\n pattern: /^\\/atheletebridge\\/teams\\/([^/]+)\\/edit$/,\n entityType: 'ATHLETEBRIDGE_TEAM',\n idGroup: 1,\n metadata: () => ({ mode: 'edit' }),\n },\n {\n pattern: /^\\/atheletebridge\\/teams\\/([^/]+)$/,\n entityType: 'ATHLETEBRIDGE_TEAM',\n idGroup: 1,\n },\n { pattern: /^\\/atheletebridge\\/teams$/, entityType: 'ATHLETEBRIDGE_TEAMS', idGroup: 0 },\n {\n pattern: /^\\/atheletebridge\\/fixtures\\/([^/]+)$/,\n entityType: 'ATHLETEBRIDGE_FIXTURE',\n idGroup: 1,\n },\n { pattern: /^\\/atheletebridge\\/fixtures$/, entityType: 'ATHLETEBRIDGE_FIXTURES', idGroup: 0 },\n {\n pattern: /^\\/atheletebridge\\/programs\\/([^/]+)\\/edit$/,\n entityType: 'ATHLETEBRIDGE_PROGRAM',\n idGroup: 1,\n metadata: () => ({ mode: 'edit' }),\n },\n {\n pattern: /^\\/atheletebridge\\/programs\\/([^/]+)$/,\n entityType: 'ATHLETEBRIDGE_PROGRAM',\n idGroup: 1,\n },\n { pattern: /^\\/atheletebridge\\/programs$/, entityType: 'ATHLETEBRIDGE_PROGRAMS', idGroup: 0 },\n {\n pattern: /^\\/atheletebridge\\/sessions\\/([^/]+)$/,\n entityType: 'ATHLETEBRIDGE_SESSION',\n idGroup: 1,\n },\n { pattern: /^\\/atheletebridge\\/sessions$/, entityType: 'ATHLETEBRIDGE_SESSIONS', idGroup: 0 },\n // Index-only surfaces. AthleteBridgeRoutes.tsx registers no detail route for\n // these, so an id-capturing pattern here could never match anything real.\n { pattern: /^\\/atheletebridge\\/standings$/, entityType: 'ATHLETEBRIDGE_STANDINGS', idGroup: 0 },\n {\n pattern: /^\\/atheletebridge\\/performance$/,\n entityType: 'ATHLETEBRIDGE_PERFORMANCE',\n idGroup: 0,\n },\n { pattern: /^\\/atheletebridge\\/analytics$/, entityType: 'ATHLETEBRIDGE_ANALYTICS', idGroup: 0 },\n {\n pattern: /^\\/atheletebridge\\/tournaments$/,\n entityType: 'ATHLETEBRIDGE_TOURNAMENTS',\n idGroup: 0,\n },\n { pattern: /^\\/atheletebridge\\/onboarding$/, entityType: 'ATHLETEBRIDGE_ONBOARDING', idGroup: 0 },\n];\n\nexport function gatherPageContext(): PageContext {\n const pathSegments = window.location.pathname.split('/').filter(Boolean);\n const currentPage = pathSegments.slice(0, 3).join('/') || 'home';\n const entity = resolveAthleteBridgeConversationContext(\n window.location.pathname,\n window.location.search\n );\n\n return {\n currentUrl: window.location.href,\n currentPage,\n entityType: entity.entityType,\n entityId: entity.entityId,\n activeTab: entity.activeTab,\n };\n}\n\nexport function resolveAthleteBridgeConversationContext(\n pathname: string,\n search: string\n): ConversationContextShape {\n const params = new URLSearchParams(search);\n\n for (const descriptor of ROUTE_DESCRIPTORS) {\n const match = pathname.match(descriptor.pattern);\n if (!match) continue;\n\n const entityId = descriptor.idGroup > 0 ? match[descriptor.idGroup] : undefined;\n // `/teams/new` shape-matches `/teams/:id` — a router literal is not an id.\n if (entityId !== undefined && RESERVED_ID_SEGMENTS.has(entityId)) continue;\n\n return {\n entityType: descriptor.entityType,\n ...(entityId ? { entityId } : {}),\n metadata: {\n routePattern: descriptor.pattern.source,\n ...(descriptor.metadata ? descriptor.metadata(match) : {}),\n },\n };\n }\n\n const activeTab =\n params.get('tab') ??\n (() => {\n const segments = pathname.split('/').filter(Boolean);\n return segments.length > 2 ? segments[segments.length - 1] : undefined;\n })();\n\n return {\n activeTab: activeTab ?? undefined,\n metadata: {\n ...(activeTab ? { activeTab } : {}),\n },\n };\n}\n"],"mappings":";AAwCA,IAAM,IAAuB,IAAI,IAAI,CAAC,OAAO,OAAO,CAAC,EAmB/C,IAAuC;CAG3C;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACT,WAAW,OAAW,EAAE,QAAQ,EAAM,IAAI;EAC3C;CACD;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACT,iBAAiB,EAAE,MAAM,QAAQ;EAClC;CACD;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACV;CACD;EAAE,SAAS;EAA6B,YAAY;EAAuB,SAAS;EAAG;CACvF;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACV;CACD;EAAE,SAAS;EAAgC,YAAY;EAA0B,SAAS;EAAG;CAC7F;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACT,iBAAiB,EAAE,MAAM,QAAQ;EAClC;CACD;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACV;CACD;EAAE,SAAS;EAAgC,YAAY;EAA0B,SAAS;EAAG;CAC7F;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACV;CACD;EAAE,SAAS;EAAgC,YAAY;EAA0B,SAAS;EAAG;CAG7F;EAAE,SAAS;EAAiC,YAAY;EAA2B,SAAS;EAAG;CAC/F;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACV;CACD;EAAE,SAAS;EAAiC,YAAY;EAA2B,SAAS;EAAG;CAC/F;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACV;CACD;EAAE,SAAS;EAAkC,YAAY;EAA4B,SAAS;EAAG;CAClG;AAED,SAAgB,IAAiC;CAE/C,IAAM,IADe,OAAO,SAAS,SAAS,MAAM,IAAI,CAAC,OAAO,QAAQ,CACvC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,QACpD,IAAS,EACb,OAAO,SAAS,UAChB,OAAO,SAAS,OACjB;AAED,QAAO;EACL,YAAY,OAAO,SAAS;EAC5B;EACA,YAAY,EAAO;EACnB,UAAU,EAAO;EACjB,WAAW,EAAO;EACnB;;AAGH,SAAgB,EACd,GACA,GAC0B;CAC1B,IAAM,IAAS,IAAI,gBAAgB,EAAO;AAE1C,MAAK,IAAM,KAAc,GAAmB;EAC1C,IAAM,IAAQ,EAAS,MAAM,EAAW,QAAQ;AAChD,MAAI,CAAC,EAAO;EAEZ,IAAM,IAAW,EAAW,UAAU,IAAI,EAAM,EAAW,WAAW,KAAA;AAElE,cAAa,KAAA,KAAa,EAAqB,IAAI,EAAS,EAEhE,QAAO;GACL,YAAY,EAAW;GACvB,GAAI,IAAW,EAAE,aAAU,GAAG,EAAE;GAChC,UAAU;IACR,cAAc,EAAW,QAAQ;IACjC,GAAI,EAAW,WAAW,EAAW,SAAS,EAAM,GAAG,EAAE;IAC1D;GACF;;CAGH,IAAM,IACJ,EAAO,IAAI,MAAM,WACV;EACL,IAAM,IAAW,EAAS,MAAM,IAAI,CAAC,OAAO,QAAQ;AACpD,SAAO,EAAS,SAAS,IAAI,EAAS,EAAS,SAAS,KAAK,KAAA;KAC3D;AAEN,QAAO;EACL,WAAW,KAAa,KAAA;EACxB,UAAU,EACR,GAAI,IAAY,EAAE,cAAW,GAAG,EAAE,EACnC;EACF"}