@burdenoff/microfe-atheletebridge 2026.716.2 → 2026.720.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 (94) hide show
  1. package/dist/atheletebridge/AthleteBridgeRoot.js.map +1 -1
  2. package/dist/atheletebridge/AthleteBridgeRoutes.js.map +1 -1
  3. package/dist/atheletebridge/admin/AdminDashboardPage.js.map +1 -1
  4. package/dist/atheletebridge/admin/AdminRoot.js.map +1 -1
  5. package/dist/atheletebridge/components/AthleteSelect.js.map +1 -1
  6. package/dist/atheletebridge/components/Crest.js.map +1 -1
  7. package/dist/atheletebridge/components/CursorPager.js.map +1 -1
  8. package/dist/atheletebridge/components/DrillVideoLink.js.map +1 -1
  9. package/dist/atheletebridge/components/EmptyState.js.map +1 -1
  10. package/dist/atheletebridge/components/FilterSelect.js.map +1 -1
  11. package/dist/atheletebridge/components/FixtureCard.js.map +1 -1
  12. package/dist/atheletebridge/components/LoadingState.js.map +1 -1
  13. package/dist/atheletebridge/components/MatchupRow.js.map +1 -1
  14. package/dist/atheletebridge/components/MetricsCard.js.map +1 -1
  15. package/dist/atheletebridge/components/PageLayout.js.map +1 -1
  16. package/dist/atheletebridge/components/ProgramCard.js.map +1 -1
  17. package/dist/atheletebridge/components/RouteAnalytics.js.map +1 -1
  18. package/dist/atheletebridge/components/Scoreboard.js.map +1 -1
  19. package/dist/atheletebridge/components/SessionCard.js.map +1 -1
  20. package/dist/atheletebridge/components/SessionStatusTimeline.js.map +1 -1
  21. package/dist/atheletebridge/components/StatusBadge.js.map +1 -1
  22. package/dist/atheletebridge/components/TeamCard.js.map +1 -1
  23. package/dist/atheletebridge/components/UserAvatar.js.map +1 -1
  24. package/dist/atheletebridge/components/UserSearchSelect.js.map +1 -1
  25. package/dist/atheletebridge/components/availability/AvailabilityRosterPanel.d.ts +9 -0
  26. package/dist/atheletebridge/components/availability/AvailabilityRosterPanel.d.ts.map +1 -0
  27. package/dist/atheletebridge/components/availability/AvailabilityRosterPanel.js +118 -0
  28. package/dist/atheletebridge/components/availability/AvailabilityRosterPanel.js.map +1 -0
  29. package/dist/atheletebridge/components/availability/AvailabilityRsvpControl.d.ts +9 -0
  30. package/dist/atheletebridge/components/availability/AvailabilityRsvpControl.d.ts.map +1 -0
  31. package/dist/atheletebridge/components/availability/AvailabilityRsvpControl.js +88 -0
  32. package/dist/atheletebridge/components/availability/AvailabilityRsvpControl.js.map +1 -0
  33. package/dist/atheletebridge/components/domain.js.map +1 -1
  34. package/dist/atheletebridge/components/form.js.map +1 -1
  35. package/dist/atheletebridge/components/viz/BarChart.js.map +1 -1
  36. package/dist/atheletebridge/components/viz/DonutChart.js +1 -1
  37. package/dist/atheletebridge/components/viz/DonutChart.js.map +1 -1
  38. package/dist/atheletebridge/components/viz/LineChart.js.map +1 -1
  39. package/dist/atheletebridge/components/viz/RatingStars.js.map +1 -1
  40. package/dist/atheletebridge/components/viz/Sparkline.js.map +1 -1
  41. package/dist/atheletebridge/components/viz/StatCard.js.map +1 -1
  42. package/dist/atheletebridge/components/viz/Timeline.js.map +1 -1
  43. package/dist/atheletebridge/components/viz/lib/CartesianFrame.js.map +1 -1
  44. package/dist/atheletebridge/components/viz/lib/ResponsiveSvg.js.map +1 -1
  45. package/dist/atheletebridge/components/viz/lib/format.js.map +1 -1
  46. package/dist/atheletebridge/components/viz/lib/geometry.js.map +1 -1
  47. package/dist/atheletebridge/components/viz/lib/hooks.js.map +1 -1
  48. package/dist/atheletebridge/components/viz/lib/palette.js.map +1 -1
  49. package/dist/atheletebridge/context/AthleteBridgeContext.js.map +1 -1
  50. package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts +18 -1
  51. package/dist/atheletebridge/hooks/useAthleteBridgeApi.d.ts.map +1 -1
  52. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +71 -33
  53. package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
  54. package/dist/atheletebridge/i18n.js.map +1 -1
  55. package/dist/atheletebridge/pages/DashboardPage.js.map +1 -1
  56. package/dist/atheletebridge/pages/StandingsPage.js.map +1 -1
  57. package/dist/atheletebridge/pages/analytics/CoachAnalyticsPage.js.map +1 -1
  58. package/dist/atheletebridge/pages/athletes/AthleteProfilePage.js.map +1 -1
  59. package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.d.ts.map +1 -1
  60. package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js +87 -75
  61. package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js.map +1 -1
  62. package/dist/atheletebridge/pages/fixtures/FixtureFormPage.js.map +1 -1
  63. package/dist/atheletebridge/pages/fixtures/FixturesListPage.js.map +1 -1
  64. package/dist/atheletebridge/pages/onboarding/OnboardingPage.js.map +1 -1
  65. package/dist/atheletebridge/pages/performance/PerformancePage.js.map +1 -1
  66. package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -1
  67. package/dist/atheletebridge/pages/programs/ProgramFormPage.js.map +1 -1
  68. package/dist/atheletebridge/pages/programs/ProgramsListPage.js.map +1 -1
  69. package/dist/atheletebridge/pages/sessions/SessionDetailPage.js.map +1 -1
  70. package/dist/atheletebridge/pages/sessions/SessionFormPage.js.map +1 -1
  71. package/dist/atheletebridge/pages/sessions/SessionsListPage.js.map +1 -1
  72. package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -1
  73. package/dist/atheletebridge/pages/teams/TeamFormPage.js.map +1 -1
  74. package/dist/atheletebridge/pages/teams/TeamsListPage.js.map +1 -1
  75. package/dist/atheletebridge/pages/tournaments/TournamentBracketPage.js.map +1 -1
  76. package/dist/atheletebridge/store/atheletebridgeStore.js.map +1 -1
  77. package/dist/atheletebridge/types/index.d.ts +27 -0
  78. package/dist/atheletebridge/types/index.d.ts.map +1 -1
  79. package/dist/atheletebridge/utils/cn.js.map +1 -1
  80. package/dist/atheletebridge/utils/datetime.js.map +1 -1
  81. package/dist/atheletebridge/utils/formatters.js.map +1 -1
  82. package/dist/atheletebridge/utils/identity.js.map +1 -1
  83. package/dist/atheletebridge/utils/navigation.js.map +1 -1
  84. package/dist/atheletebridge/utils/pageContext.d.ts +16 -7
  85. package/dist/atheletebridge/utils/pageContext.d.ts.map +1 -1
  86. package/dist/atheletebridge/utils/pageContext.js +111 -35
  87. package/dist/atheletebridge/utils/pageContext.js.map +1 -1
  88. package/dist/atheletebridge/utils/timeAgo.js.map +1 -1
  89. package/dist/atheletebridge/utils/url.js.map +1 -1
  90. package/dist/node_modules/clsx/dist/clsx.js.map +1 -1
  91. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1 -1
  92. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
  93. package/dist/services/createSandboxAssistantTransport.js.map +1 -1
  94. package/package.json +6 -5
@@ -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,MAAM,CAAC,GAmB9C,IAAuC;CAG3C;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACT,WAAW,OAAW,EAAE,QAAQ,EAAM,GAAG;CAC3C;CACA;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACT,iBAAiB,EAAE,MAAM,OAAO;CAClC;CACA;EACE,SAAS;EACT,YAAY;EACZ,SAAS;CACX;CACA;EAAE,SAAS;EAA6B,YAAY;EAAuB,SAAS;CAAE;CACtF;EACE,SAAS;EACT,YAAY;EACZ,SAAS;CACX;CACA;EAAE,SAAS;EAAgC,YAAY;EAA0B,SAAS;CAAE;CAC5F;EACE,SAAS;EACT,YAAY;EACZ,SAAS;EACT,iBAAiB,EAAE,MAAM,OAAO;CAClC;CACA;EACE,SAAS;EACT,YAAY;EACZ,SAAS;CACX;CACA;EAAE,SAAS;EAAgC,YAAY;EAA0B,SAAS;CAAE;CAC5F;EACE,SAAS;EACT,YAAY;EACZ,SAAS;CACX;CACA;EAAE,SAAS;EAAgC,YAAY;EAA0B,SAAS;CAAE;CAG5F;EAAE,SAAS;EAAiC,YAAY;EAA2B,SAAS;CAAE;CAC9F;EACE,SAAS;EACT,YAAY;EACZ,SAAS;CACX;CACA;EAAE,SAAS;EAAiC,YAAY;EAA2B,SAAS;CAAE;CAC9F;EACE,SAAS;EACT,YAAY;EACZ,SAAS;CACX;CACA;EAAE,SAAS;EAAkC,YAAY;EAA4B,SAAS;CAAE;AAClG;AAEA,SAAgB,IAAiC;CAE/C,IAAM,IADe,OAAO,SAAS,SAAS,MAAM,GAAG,EAAE,OAAO,OAC5C,EAAa,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,QACpD,IAAS,EACb,OAAO,SAAS,UAChB,OAAO,SAAS,MAClB;CAEA,OAAO;EACL,YAAY,OAAO,SAAS;EAC5B;EACA,YAAY,EAAO;EACnB,UAAU,EAAO;EACjB,WAAW,EAAO;CACpB;AACF;AAEA,SAAgB,EACd,GACA,GAC0B;CAC1B,IAAM,IAAS,IAAI,gBAAgB,CAAM;CAEzC,KAAK,IAAM,KAAc,GAAmB;EAC1C,IAAM,IAAQ,EAAS,MAAM,EAAW,OAAO;EAC/C,IAAI,CAAC,GAAO;EAEZ,IAAM,IAAW,EAAW,UAAU,IAAI,EAAM,EAAW,WAAW,KAAA;EAElE,YAAa,KAAA,KAAa,EAAqB,IAAI,CAAQ,IAE/D,OAAO;GACL,YAAY,EAAW;GACvB,GAAI,IAAW,EAAE,YAAS,IAAI,CAAC;GAC/B,UAAU;IACR,cAAc,EAAW,QAAQ;IACjC,GAAI,EAAW,WAAW,EAAW,SAAS,CAAK,IAAI,CAAC;GAC1D;EACF;CACF;CAEA,IAAM,IACJ,EAAO,IAAI,KAAK,YACT;EACL,IAAM,IAAW,EAAS,MAAM,GAAG,EAAE,OAAO,OAAO;EACnD,OAAO,EAAS,SAAS,IAAI,EAAS,EAAS,SAAS,KAAK,KAAA;CAC/D,GAAG;CAEL,OAAO;EACL,WAAW,KAAa,KAAA;EACxB,UAAU,EACR,GAAI,IAAY,EAAE,aAAU,IAAI,CAAC,EACnC;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"timeAgo.js","names":[],"sources":["../../../src/atheletebridge/utils/timeAgo.ts"],"sourcesContent":["/**\n * Relative-time formatter\n * @module atheletebridge/utils/timeAgo\n *\n * Compact \"2h ago\" / \"3d ago\" strings for the activity feed and record\n * timestamps. Falls back to an absolute short date beyond ~4 weeks so old items\n * stay legible.\n */\n\nconst MINUTE = 60;\nconst HOUR = MINUTE * 60;\nconst DAY = HOUR * 24;\nconst WEEK = DAY * 7;\n\n/**\n * Format an ISO timestamp (or Date) as a short relative string from `now`.\n *\n * @example\n * timeAgo('2026-07-06T10:00:00Z') // => \"2h ago\" (2h earlier)\n */\nexport function timeAgo(input: string | Date | null | undefined, now: Date = new Date()): string {\n if (!input) {\n return '';\n }\n const then = typeof input === 'string' ? new Date(input) : input;\n if (Number.isNaN(then.getTime())) {\n return '';\n }\n const diffSec = Math.round((now.getTime() - then.getTime()) / 1000);\n\n if (diffSec < 0) {\n // Future timestamp — mirror the past phrasing (\"in 2h\").\n return `in ${relativeUnit(-diffSec)}`;\n }\n if (diffSec < 45) {\n return 'just now';\n }\n if (diffSec >= WEEK * 4) {\n return new Intl.DateTimeFormat('en-IN', {\n day: 'numeric',\n month: 'short',\n year: then.getFullYear() === now.getFullYear() ? undefined : 'numeric',\n }).format(then);\n }\n return `${relativeUnit(diffSec)} ago`;\n}\n\nfunction relativeUnit(seconds: number): string {\n if (seconds < MINUTE) {\n return `${Math.max(1, Math.round(seconds))}s`;\n }\n if (seconds < HOUR) {\n return `${Math.round(seconds / MINUTE)}m`;\n }\n if (seconds < DAY) {\n return `${Math.round(seconds / HOUR)}h`;\n }\n if (seconds < WEEK) {\n return `${Math.round(seconds / DAY)}d`;\n }\n return `${Math.round(seconds / WEEK)}w`;\n}\n"],"mappings":";AASA,IAAM,IAAS,IACT,IAAO,IAAS,IAChB,IAAM,IAAO,IACb,IAAO,IAAM;AAQnB,SAAgB,EAAQ,GAAyC,oBAAY,IAAI,MAAM,EAAU;AAC/F,KAAI,CAAC,EACH,QAAO;CAET,IAAM,IAAO,OAAO,KAAU,WAAW,IAAI,KAAK,EAAM,GAAG;AAC3D,KAAI,OAAO,MAAM,EAAK,SAAS,CAAC,CAC9B,QAAO;CAET,IAAM,IAAU,KAAK,OAAO,EAAI,SAAS,GAAG,EAAK,SAAS,IAAI,IAAK;AAgBnE,QAdI,IAAU,IAEL,MAAM,EAAa,CAAC,EAAQ,KAEjC,IAAU,KACL,aAEL,KAAW,IAAO,IACb,IAAI,KAAK,eAAe,SAAS;EACtC,KAAK;EACL,OAAO;EACP,MAAM,EAAK,aAAa,KAAK,EAAI,aAAa,GAAG,KAAA,IAAY;EAC9D,CAAC,CAAC,OAAO,EAAK,GAEV,GAAG,EAAa,EAAQ,CAAC;;AAGlC,SAAS,EAAa,GAAyB;AAa7C,QAZI,IAAU,IACL,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,EAAQ,CAAC,CAAC,KAEzC,IAAU,IACL,GAAG,KAAK,MAAM,IAAU,EAAO,CAAC,KAErC,IAAU,IACL,GAAG,KAAK,MAAM,IAAU,EAAK,CAAC,KAEnC,IAAU,IACL,GAAG,KAAK,MAAM,IAAU,EAAI,CAAC,KAE/B,GAAG,KAAK,MAAM,IAAU,EAAK,CAAC"}
1
+ {"version":3,"file":"timeAgo.js","names":[],"sources":["../../../src/atheletebridge/utils/timeAgo.ts"],"sourcesContent":["/**\n * Relative-time formatter\n * @module atheletebridge/utils/timeAgo\n *\n * Compact \"2h ago\" / \"3d ago\" strings for the activity feed and record\n * timestamps. Falls back to an absolute short date beyond ~4 weeks so old items\n * stay legible.\n */\n\nconst MINUTE = 60;\nconst HOUR = MINUTE * 60;\nconst DAY = HOUR * 24;\nconst WEEK = DAY * 7;\n\n/**\n * Format an ISO timestamp (or Date) as a short relative string from `now`.\n *\n * @example\n * timeAgo('2026-07-06T10:00:00Z') // => \"2h ago\" (2h earlier)\n */\nexport function timeAgo(input: string | Date | null | undefined, now: Date = new Date()): string {\n if (!input) {\n return '';\n }\n const then = typeof input === 'string' ? new Date(input) : input;\n if (Number.isNaN(then.getTime())) {\n return '';\n }\n const diffSec = Math.round((now.getTime() - then.getTime()) / 1000);\n\n if (diffSec < 0) {\n // Future timestamp — mirror the past phrasing (\"in 2h\").\n return `in ${relativeUnit(-diffSec)}`;\n }\n if (diffSec < 45) {\n return 'just now';\n }\n if (diffSec >= WEEK * 4) {\n return new Intl.DateTimeFormat('en-IN', {\n day: 'numeric',\n month: 'short',\n year: then.getFullYear() === now.getFullYear() ? undefined : 'numeric',\n }).format(then);\n }\n return `${relativeUnit(diffSec)} ago`;\n}\n\nfunction relativeUnit(seconds: number): string {\n if (seconds < MINUTE) {\n return `${Math.max(1, Math.round(seconds))}s`;\n }\n if (seconds < HOUR) {\n return `${Math.round(seconds / MINUTE)}m`;\n }\n if (seconds < DAY) {\n return `${Math.round(seconds / HOUR)}h`;\n }\n if (seconds < WEEK) {\n return `${Math.round(seconds / DAY)}d`;\n }\n return `${Math.round(seconds / WEEK)}w`;\n}\n"],"mappings":";AASA,IAAM,IAAS,IACT,IAAO,IAAS,IAChB,IAAM,IAAO,IACb,IAAO,IAAM;AAQnB,SAAgB,EAAQ,GAAyC,oBAAY,IAAI,KAAK,GAAW;CAC/F,IAAI,CAAC,GACH,OAAO;CAET,IAAM,IAAO,OAAO,KAAU,WAAW,IAAI,KAAK,CAAK,IAAI;CAC3D,IAAI,OAAO,MAAM,EAAK,QAAQ,CAAC,GAC7B,OAAO;CAET,IAAM,IAAU,KAAK,OAAO,EAAI,QAAQ,IAAI,EAAK,QAAQ,KAAK,GAAI;CAgBlE,OAdI,IAAU,IAEL,MAAM,EAAa,CAAC,CAAO,MAEhC,IAAU,KACL,aAEL,KAAW,IAAO,IACb,IAAI,KAAK,eAAe,SAAS;EACtC,KAAK;EACL,OAAO;EACP,MAAM,EAAK,YAAY,MAAM,EAAI,YAAY,IAAI,KAAA,IAAY;CAC/D,CAAC,EAAE,OAAO,CAAI,IAET,GAAG,EAAa,CAAO,EAAE;AAClC;AAEA,SAAS,EAAa,GAAyB;CAa7C,OAZI,IAAU,IACL,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,CAAO,CAAC,EAAE,KAEzC,IAAU,IACL,GAAG,KAAK,MAAM,IAAU,CAAM,EAAE,KAErC,IAAU,IACL,GAAG,KAAK,MAAM,IAAU,CAAI,EAAE,KAEnC,IAAU,IACL,GAAG,KAAK,MAAM,IAAU,CAAG,EAAE,KAE/B,GAAG,KAAK,MAAM,IAAU,CAAI,EAAE;AACvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","names":[],"sources":["../../../src/atheletebridge/utils/url.ts"],"sourcesContent":["/**\n * URL safety helpers\n * @module atheletebridge/utils/url\n *\n * `safeExternalHref` is defense-in-depth against DOM-XSS from user-controlled\n * URLs (e.g. a session `meetingUrl`) that get rendered as clickable anchors.\n * A stored `javascript:` / `data:` / `vbscript:` URL in an `<a href>` executes\n * on click, so we only ever hand back a URL that parses as an absolute URL and\n * uses an `http:` or `https:` scheme. Anything else (bad scheme, relative,\n * unparseable) returns `null` and the caller must decline to render a link.\n */\n\n/**\n * Returns the URL only if it is a safe, absolute http(s) link; otherwise `null`.\n *\n * @example\n * safeExternalHref('https://meet.example.com/x') // => 'https://meet.example.com/x'\n * safeExternalHref('javascript:alert(1)') // => null\n * safeExternalHref('data:text/html,<script>') // => null\n * safeExternalHref('meet.example.com') // => null (not absolute)\n */\nexport function safeExternalHref(url: string | null | undefined): string | null {\n if (!url) return null;\n const trimmed = url.trim();\n if (!trimmed) return null;\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n return null;\n }\n\n if (parsed.protocol === 'http:' || parsed.protocol === 'https:') {\n return parsed.href;\n }\n return null;\n}\n"],"mappings":";AAqBA,SAAgB,EAAiB,GAA+C;AAC9E,KAAI,CAAC,EAAK,QAAO;CACjB,IAAM,IAAU,EAAI,MAAM;AAC1B,KAAI,CAAC,EAAS,QAAO;CAErB,IAAI;AACJ,KAAI;AACF,MAAS,IAAI,IAAI,EAAQ;SACnB;AACN,SAAO;;AAMT,QAHI,EAAO,aAAa,WAAW,EAAO,aAAa,WAC9C,EAAO,OAET"}
1
+ {"version":3,"file":"url.js","names":[],"sources":["../../../src/atheletebridge/utils/url.ts"],"sourcesContent":["/**\n * URL safety helpers\n * @module atheletebridge/utils/url\n *\n * `safeExternalHref` is defense-in-depth against DOM-XSS from user-controlled\n * URLs (e.g. a session `meetingUrl`) that get rendered as clickable anchors.\n * A stored `javascript:` / `data:` / `vbscript:` URL in an `<a href>` executes\n * on click, so we only ever hand back a URL that parses as an absolute URL and\n * uses an `http:` or `https:` scheme. Anything else (bad scheme, relative,\n * unparseable) returns `null` and the caller must decline to render a link.\n */\n\n/**\n * Returns the URL only if it is a safe, absolute http(s) link; otherwise `null`.\n *\n * @example\n * safeExternalHref('https://meet.example.com/x') // => 'https://meet.example.com/x'\n * safeExternalHref('javascript:alert(1)') // => null\n * safeExternalHref('data:text/html,<script>') // => null\n * safeExternalHref('meet.example.com') // => null (not absolute)\n */\nexport function safeExternalHref(url: string | null | undefined): string | null {\n if (!url) return null;\n const trimmed = url.trim();\n if (!trimmed) return null;\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n return null;\n }\n\n if (parsed.protocol === 'http:' || parsed.protocol === 'https:') {\n return parsed.href;\n }\n return null;\n}\n"],"mappings":";AAqBA,SAAgB,EAAiB,GAA+C;CAC9E,IAAI,CAAC,GAAK,OAAO;CACjB,IAAM,IAAU,EAAI,KAAK;CACzB,IAAI,CAAC,GAAS,OAAO;CAErB,IAAI;CACJ,IAAI;EACF,IAAS,IAAI,IAAI,CAAO;CAC1B,QAAQ;EACN,OAAO;CACT;CAKA,OAHI,EAAO,aAAa,WAAW,EAAO,aAAa,WAC9C,EAAO,OAET;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"clsx.js","names":[],"sources":["../../../../node_modules/clsx/dist/clsx.mjs"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAS,EAAE,GAAE;CAAC,IAAI,GAAE,GAAE,IAAE;AAAG,KAAa,OAAO,KAAjB,YAA8B,OAAO,KAAjB,SAAmB,MAAG;UAAoB,OAAO,KAAjB,SAAmB,KAAG,MAAM,QAAQ,EAAE,EAAC;EAAC,IAAI,IAAE,EAAE;AAAO,OAAI,IAAE,GAAE,IAAE,GAAE,IAAI,GAAE,OAAK,IAAE,EAAE,EAAE,GAAG,MAAI,MAAI,KAAG,MAAK,KAAG;OAAQ,MAAI,KAAK,EAAE,GAAE,OAAK,MAAI,KAAG,MAAK,KAAG;AAAG,QAAO;;AAAE,SAAgB,IAAM;AAAC,MAAI,IAAI,GAAE,GAAE,IAAE,GAAE,IAAE,IAAG,IAAE,UAAU,QAAO,IAAE,GAAE,IAAI,EAAC,IAAE,UAAU,QAAM,IAAE,EAAE,EAAE,MAAI,MAAI,KAAG,MAAK,KAAG;AAAG,QAAO"}
1
+ {"version":3,"file":"clsx.js","names":[],"sources":["../../../../node_modules/clsx/dist/clsx.mjs"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAS,EAAE,GAAE;CAAC,IAAI,GAAE,GAAE,IAAE;CAAG,IAAa,OAAO,KAAjB,YAA8B,OAAO,KAAjB,UAAmB,KAAG;MAAO,IAAa,OAAO,KAAjB,UAAmB,IAAG,MAAM,QAAQ,CAAC,GAAE;EAAC,IAAI,IAAE,EAAE;EAAO,KAAI,IAAE,GAAE,IAAE,GAAE,KAAI,EAAE,OAAK,IAAE,EAAE,EAAE,EAAE,OAAK,MAAI,KAAG,MAAK,KAAG;CAAE,OAAM,KAAI,KAAK,GAAE,EAAE,OAAK,MAAI,KAAG,MAAK,KAAG;CAAG,OAAO;AAAC;AAAC,SAAgB,IAAM;CAAC,KAAI,IAAI,GAAE,GAAE,IAAE,GAAE,IAAE,IAAG,IAAE,UAAU,QAAO,IAAE,GAAE,KAAI,CAAC,IAAE,UAAU,QAAM,IAAE,EAAE,CAAC,OAAK,MAAI,KAAG,MAAK,KAAG;CAAG,OAAO;AAAC"}
@@ -234,7 +234,7 @@ var e = (e, t) => {
234
234
  }, Y = (e, t, n = !1) => {
235
235
  let r = j.exec(e);
236
236
  return r ? r[1] ? t(r[1]) : n : !1;
237
- }, X = (e) => e === "position" || e === "percentage", Z = (e) => e === "image" || e === "url", Q = (e) => e === "length" || e === "size" || e === "bg-size", $ = (e) => e === "length", Ce = (e) => e === "number", we = (e) => e === "family-name", Te = (e) => e === "number" || e === "weight", Ee = (e) => e === "shadow", De = /* @__PURE__ */ D(() => {
237
+ }, X = (e) => e === "position" || e === "percentage", Z = (e) => e === "image" || e === "url", Q = (e) => e === "length" || e === "size" || e === "bg-size", $ = (e) => e === "length", Ce = (e) => e === "number", we = (e) => e === "family-name", Te = (e) => e === "number" || e === "weight", Ee = (e) => e === "shadow", De = /*#__PURE__*/ D(() => {
238
238
  let e = k("color"), t = k("font"), n = k("text"), r = k("font-weight"), i = k("tracking"), a = k("leading"), o = k("breakpoint"), s = k("container"), c = k("spacing"), l = k("radius"), u = k("shadow"), d = k("inset-shadow"), ee = k("text-shadow"), f = k("drop-shadow"), p = k("blur"), m = k("perspective"), h = k("aspect"), g = k("ease"), _ = k("animate"), v = () => [
239
239
  "auto",
240
240
  "avoid",