@burdenoff/microfe-atheletebridge 2026.830.1 → 2026.1013.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.
@@ -1 +1 @@
1
- {"version":3,"file":"AthleteBridgeRoot.d.ts","sourceRoot":"","sources":["../../src/atheletebridge/AthleteBridgeRoot.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAmBhC,OAAO,KAAK,EAAE,sBAAsB,EAAW,MAAM,SAAS,CAAC;AAY/D,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAwIxD,CAAC"}
1
+ {"version":3,"file":"AthleteBridgeRoot.d.ts","sourceRoot":"","sources":["../../src/atheletebridge/AthleteBridgeRoot.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAoBhC,OAAO,KAAK,EAAE,sBAAsB,EAAW,MAAM,SAAS,CAAC;AAY/D,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAyIxD,CAAC"}
@@ -1,126 +1,127 @@
1
1
  import { useAbTranslate as e } from "./i18n.js";
2
2
  import { AthleteBridgeProvider as t } from "./context/AthleteBridgeContext.js";
3
3
  import { AthleteBridgeRoutes as n } from "./AthleteBridgeRoutes.js";
4
- import { useEffect as r } from "react";
5
- import { QueryClient as i, QueryClientProvider as a } from "@tanstack/react-query";
6
- import { FeatureFlagProvider as o } from "@burdenoff/fe-libs/shared/feature-flags";
7
- import { BarChart3 as s, CalendarDays as c, ClipboardCheck as l, Cpu as u, Dumbbell as d, Gauge as f, LayoutDashboard as p, Swords as m, Trophy as h, Users as g } from "lucide-react";
8
- import { jsx as _ } from "react/jsx-runtime";
4
+ import { ToastViewport as r } from "./components/ToastViewport.js";
5
+ import { useEffect as i } from "react";
6
+ import { QueryClient as a, QueryClientProvider as o } from "@tanstack/react-query";
7
+ import { FeatureFlagProvider as s } from "@burdenoff/fe-libs/shared/feature-flags";
8
+ import { BarChart3 as c, CalendarDays as l, ClipboardCheck as u, Cpu as d, Dumbbell as f, Gauge as p, LayoutDashboard as m, Swords as h, Trophy as g, Users as _ } from "lucide-react";
9
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
9
10
  //#region src/atheletebridge/AthleteBridgeRoot.tsx
10
- var v = new i({ defaultOptions: { queries: {
11
+ var b = new a({ defaultOptions: { queries: {
11
12
  staleTime: 300 * 1e3,
12
13
  retry: 1
13
- } } }), y = (i) => {
14
- let { registerNavItems: y, registerFooterItems: b, basePath: x = "/", workspaceId: S } = i, C = e(), w = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
15
- return r(() => {
16
- if (y) return y([
14
+ } } }), x = (a) => {
15
+ let { registerNavItems: x, registerFooterItems: S, basePath: C = "/", workspaceId: w } = a, T = e(), E = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
16
+ return i(() => {
17
+ if (x) return x([
17
18
  {
18
19
  id: "atheletebridge-dashboard",
19
- label: C("atheletebridge.nav.dashboard", "Dashboard"),
20
- path: w(x, ""),
21
- icon: /* @__PURE__ */ _(p, { size: 20 }),
20
+ label: T("atheletebridge.nav.dashboard", "Dashboard"),
21
+ path: E(C, ""),
22
+ icon: /* @__PURE__ */ v(m, { size: 20 }),
22
23
  order: 1,
23
24
  group: "main"
24
25
  },
25
26
  {
26
27
  id: "atheletebridge-teams",
27
- label: C("atheletebridge.nav.teams", "Teams"),
28
- path: w(x, "teams"),
29
- icon: /* @__PURE__ */ _(g, { size: 20 }),
28
+ label: T("atheletebridge.nav.teams", "Teams"),
29
+ path: E(C, "teams"),
30
+ icon: /* @__PURE__ */ v(_, { size: 20 }),
30
31
  order: 10,
31
32
  group: "roster"
32
33
  },
33
34
  {
34
35
  id: "atheletebridge-fixtures",
35
- label: C("atheletebridge.nav.fixtures", "Fixtures"),
36
- path: w(x, "fixtures"),
37
- icon: /* @__PURE__ */ _(c, { size: 20 }),
36
+ label: T("atheletebridge.nav.fixtures", "Fixtures"),
37
+ path: E(C, "fixtures"),
38
+ icon: /* @__PURE__ */ v(l, { size: 20 }),
38
39
  order: 11,
39
40
  group: "roster"
40
41
  },
41
42
  {
42
43
  id: "atheletebridge-standings",
43
- label: C("atheletebridge.nav.standings", "Standings"),
44
- path: w(x, "standings"),
45
- icon: /* @__PURE__ */ _(h, { size: 20 }),
44
+ label: T("atheletebridge.nav.standings", "Standings"),
45
+ path: E(C, "standings"),
46
+ icon: /* @__PURE__ */ v(g, { size: 20 }),
46
47
  order: 12,
47
48
  group: "roster"
48
49
  },
49
50
  {
50
51
  id: "atheletebridge-tournaments",
51
- label: C("atheletebridge.nav.tournaments", "Tournaments"),
52
- path: w(x, "tournaments"),
53
- icon: /* @__PURE__ */ _(m, { size: 20 }),
52
+ label: T("atheletebridge.nav.tournaments", "Tournaments"),
53
+ path: E(C, "tournaments"),
54
+ icon: /* @__PURE__ */ v(h, { size: 20 }),
54
55
  order: 13,
55
56
  group: "roster"
56
57
  },
57
58
  {
58
59
  id: "atheletebridge-programs",
59
- label: C("atheletebridge.nav.programs", "Programs"),
60
- path: w(x, "programs"),
61
- icon: /* @__PURE__ */ _(d, { size: 20 }),
60
+ label: T("atheletebridge.nav.programs", "Programs"),
61
+ path: E(C, "programs"),
62
+ icon: /* @__PURE__ */ v(f, { size: 20 }),
62
63
  order: 20,
63
64
  group: "training"
64
65
  },
65
66
  {
66
67
  id: "atheletebridge-sessions",
67
- label: C("atheletebridge.nav.sessions", "Sessions"),
68
- path: w(x, "sessions"),
69
- icon: /* @__PURE__ */ _(l, { size: 20 }),
68
+ label: T("atheletebridge.nav.sessions", "Sessions"),
69
+ path: E(C, "sessions"),
70
+ icon: /* @__PURE__ */ v(u, { size: 20 }),
70
71
  order: 21,
71
72
  group: "training"
72
73
  },
73
74
  {
74
75
  id: "atheletebridge-performance",
75
- label: C("atheletebridge.nav.performance", "Performance"),
76
- path: w(x, "performance"),
77
- icon: /* @__PURE__ */ _(f, { size: 20 }),
76
+ label: T("atheletebridge.nav.performance", "Performance"),
77
+ path: E(C, "performance"),
78
+ icon: /* @__PURE__ */ v(p, { size: 20 }),
78
79
  order: 22,
79
80
  group: "training"
80
81
  },
81
82
  {
82
83
  id: "atheletebridge-analytics",
83
- label: C("atheletebridge.nav.analytics", "Analytics"),
84
- path: w(x, "analytics"),
85
- icon: /* @__PURE__ */ _(s, { size: 20 }),
84
+ label: T("atheletebridge.nav.analytics", "Analytics"),
85
+ path: E(C, "analytics"),
86
+ icon: /* @__PURE__ */ v(c, { size: 20 }),
86
87
  order: 23,
87
88
  group: "training"
88
89
  },
89
90
  {
90
91
  id: "atheletebridge-ai",
91
- label: C("atheletebridge.nav.ai", "AI Operations"),
92
- path: w(x, "ai"),
93
- icon: /* @__PURE__ */ _(u, { size: 20 }),
92
+ label: T("atheletebridge.nav.ai", "AI Operations"),
93
+ path: E(C, "ai"),
94
+ icon: /* @__PURE__ */ v(d, { size: 20 }),
94
95
  order: 24,
95
96
  group: "training"
96
97
  }
97
98
  ]);
98
99
  }, [
99
- y,
100
100
  x,
101
- C
102
- ]), r(() => {
103
- if (b) return b([{
101
+ C,
102
+ T
103
+ ]), i(() => {
104
+ if (S) return S([{
104
105
  id: "atheletebridge-status",
105
- label: C("atheletebridge.footer.ready", "AthleteBridge Ready"),
106
+ label: T("atheletebridge.footer.ready", "AthleteBridge Ready"),
106
107
  type: "status",
107
108
  order: 10,
108
109
  section: "left"
109
110
  }]);
110
- }, [b, C]), /* @__PURE__ */ _(a, {
111
- client: v,
112
- children: /* @__PURE__ */ _(o, {
113
- workspaceId: S ?? null,
111
+ }, [S, T]), /* @__PURE__ */ v(o, {
112
+ client: b,
113
+ children: /* @__PURE__ */ v(s, {
114
+ workspaceId: w ?? null,
114
115
  gateway: "global",
115
116
  defaultEnabled: !0,
116
- children: /* @__PURE__ */ _(t, {
117
- ...i,
118
- children: /* @__PURE__ */ _(n, {})
117
+ children: /* @__PURE__ */ y(t, {
118
+ ...a,
119
+ children: [/* @__PURE__ */ v(n, {}), /* @__PURE__ */ v(r, {})]
119
120
  })
120
121
  })
121
122
  });
122
123
  };
123
124
  //#endregion
124
- export { y as AthleteBridgeRoot };
125
+ export { x as AthleteBridgeRoot };
125
126
 
126
127
  //# sourceMappingURL=AthleteBridgeRoot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AthleteBridgeRoot.js","names":[],"sources":["../../src/atheletebridge/AthleteBridgeRoot.tsx"],"sourcesContent":["/**\n * AthleteBridge Root Component\n * @module atheletebridge\n *\n * The single Root export consumed by the host app shell. The export name and\n * props (AthleteBridgeRootProps) are the host contract and must not change —\n * only the internal nav config, provider tree, and routes are product-specific.\n */\n\nimport type { FC } from 'react';\nimport { useEffect } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useAbTranslate } from './i18n';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport {\n LayoutDashboard,\n Users,\n CalendarDays,\n Trophy,\n Dumbbell,\n ClipboardCheck,\n Gauge,\n BarChart3,\n Swords,\n Cpu,\n} from 'lucide-react';\nimport { AthleteBridgeProvider } from './context/AthleteBridgeContext';\nimport { AthleteBridgeRoutes } from './AthleteBridgeRoutes';\nimport type { AthleteBridgeRootProps, NavItem } from './types';\n\n// Create a query client for this microfrontend\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\nexport const AthleteBridgeRoot: FC<AthleteBridgeRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/', workspaceId } = props;\n const t = useAbTranslate();\n\n // Helper to join paths correctly\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with shell on mount\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'atheletebridge-dashboard',\n label: t('atheletebridge.nav.dashboard', 'Dashboard'),\n path: joinPath(basePath, ''),\n icon: <LayoutDashboard size={20} />,\n order: 1,\n group: 'main',\n },\n {\n id: 'atheletebridge-teams',\n label: t('atheletebridge.nav.teams', 'Teams'),\n path: joinPath(basePath, 'teams'),\n icon: <Users size={20} />,\n order: 10,\n group: 'roster',\n },\n {\n id: 'atheletebridge-fixtures',\n label: t('atheletebridge.nav.fixtures', 'Fixtures'),\n path: joinPath(basePath, 'fixtures'),\n icon: <CalendarDays size={20} />,\n order: 11,\n group: 'roster',\n },\n {\n id: 'atheletebridge-standings',\n label: t('atheletebridge.nav.standings', 'Standings'),\n path: joinPath(basePath, 'standings'),\n icon: <Trophy size={20} />,\n order: 12,\n group: 'roster',\n },\n {\n id: 'atheletebridge-tournaments',\n label: t('atheletebridge.nav.tournaments', 'Tournaments'),\n path: joinPath(basePath, 'tournaments'),\n icon: <Swords size={20} />,\n order: 13,\n group: 'roster',\n },\n {\n id: 'atheletebridge-programs',\n label: t('atheletebridge.nav.programs', 'Programs'),\n path: joinPath(basePath, 'programs'),\n icon: <Dumbbell size={20} />,\n order: 20,\n group: 'training',\n },\n {\n id: 'atheletebridge-sessions',\n label: t('atheletebridge.nav.sessions', 'Sessions'),\n path: joinPath(basePath, 'sessions'),\n icon: <ClipboardCheck size={20} />,\n order: 21,\n group: 'training',\n },\n {\n id: 'atheletebridge-performance',\n label: t('atheletebridge.nav.performance', 'Performance'),\n path: joinPath(basePath, 'performance'),\n icon: <Gauge size={20} />,\n order: 22,\n group: 'training',\n },\n {\n id: 'atheletebridge-analytics',\n label: t('atheletebridge.nav.analytics', 'Analytics'),\n path: joinPath(basePath, 'analytics'),\n icon: <BarChart3 size={20} />,\n order: 23,\n group: 'training',\n },\n {\n id: 'atheletebridge-ai',\n label: t('atheletebridge.nav.ai', 'AI Operations'),\n path: joinPath(basePath, 'ai'),\n icon: <Cpu size={20} />,\n order: 24,\n group: 'training',\n },\n ];\n\n const cleanup = registerNavItems(navItems);\n return cleanup;\n }, [registerNavItems, basePath, t]);\n\n // Register footer items\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'atheletebridge-status',\n label: t('atheletebridge.footer.ready', 'AthleteBridge Ready'),\n type: 'status' as const,\n order: 10,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems, t]);\n\n return (\n <QueryClientProvider client={queryClient}>\n {/*\n * The host-supplied workspaceId MUST be forwarded: FeatureFlagProvider\n * skips the evaluation fetch entirely when it is null, which collapses\n * every gate onto its defaultValue and makes per-workspace/per-tenant\n * overrides unresolvable. defaultEnabled stays true so an outage of the\n * flag service degrades open rather than hiding shipped modules.\n */}\n <FeatureFlagProvider workspaceId={workspaceId ?? null} gateway=\"global\" defaultEnabled={true}>\n <AthleteBridgeProvider {...props}>\n <AthleteBridgeRoutes />\n </AthleteBridgeProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"AthleteBridgeRoot.js","names":[],"sources":["../../src/atheletebridge/AthleteBridgeRoot.tsx"],"sourcesContent":["/**\n * AthleteBridge Root Component\n * @module atheletebridge\n *\n * The single Root export consumed by the host app shell. The export name and\n * props (AthleteBridgeRootProps) are the host contract and must not change —\n * only the internal nav config, provider tree, and routes are product-specific.\n */\n\nimport type { FC } from 'react';\nimport { useEffect } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useAbTranslate } from './i18n';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport {\n LayoutDashboard,\n Users,\n CalendarDays,\n Trophy,\n Dumbbell,\n ClipboardCheck,\n Gauge,\n BarChart3,\n Swords,\n Cpu,\n} from 'lucide-react';\nimport { AthleteBridgeProvider } from './context/AthleteBridgeContext';\nimport { AthleteBridgeRoutes } from './AthleteBridgeRoutes';\nimport { ToastViewport } from './components/ToastViewport';\nimport type { AthleteBridgeRootProps, NavItem } from './types';\n\n// Create a query client for this microfrontend\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\nexport const AthleteBridgeRoot: FC<AthleteBridgeRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/', workspaceId } = props;\n const t = useAbTranslate();\n\n // Helper to join paths correctly\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with shell on mount\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'atheletebridge-dashboard',\n label: t('atheletebridge.nav.dashboard', 'Dashboard'),\n path: joinPath(basePath, ''),\n icon: <LayoutDashboard size={20} />,\n order: 1,\n group: 'main',\n },\n {\n id: 'atheletebridge-teams',\n label: t('atheletebridge.nav.teams', 'Teams'),\n path: joinPath(basePath, 'teams'),\n icon: <Users size={20} />,\n order: 10,\n group: 'roster',\n },\n {\n id: 'atheletebridge-fixtures',\n label: t('atheletebridge.nav.fixtures', 'Fixtures'),\n path: joinPath(basePath, 'fixtures'),\n icon: <CalendarDays size={20} />,\n order: 11,\n group: 'roster',\n },\n {\n id: 'atheletebridge-standings',\n label: t('atheletebridge.nav.standings', 'Standings'),\n path: joinPath(basePath, 'standings'),\n icon: <Trophy size={20} />,\n order: 12,\n group: 'roster',\n },\n {\n id: 'atheletebridge-tournaments',\n label: t('atheletebridge.nav.tournaments', 'Tournaments'),\n path: joinPath(basePath, 'tournaments'),\n icon: <Swords size={20} />,\n order: 13,\n group: 'roster',\n },\n {\n id: 'atheletebridge-programs',\n label: t('atheletebridge.nav.programs', 'Programs'),\n path: joinPath(basePath, 'programs'),\n icon: <Dumbbell size={20} />,\n order: 20,\n group: 'training',\n },\n {\n id: 'atheletebridge-sessions',\n label: t('atheletebridge.nav.sessions', 'Sessions'),\n path: joinPath(basePath, 'sessions'),\n icon: <ClipboardCheck size={20} />,\n order: 21,\n group: 'training',\n },\n {\n id: 'atheletebridge-performance',\n label: t('atheletebridge.nav.performance', 'Performance'),\n path: joinPath(basePath, 'performance'),\n icon: <Gauge size={20} />,\n order: 22,\n group: 'training',\n },\n {\n id: 'atheletebridge-analytics',\n label: t('atheletebridge.nav.analytics', 'Analytics'),\n path: joinPath(basePath, 'analytics'),\n icon: <BarChart3 size={20} />,\n order: 23,\n group: 'training',\n },\n {\n id: 'atheletebridge-ai',\n label: t('atheletebridge.nav.ai', 'AI Operations'),\n path: joinPath(basePath, 'ai'),\n icon: <Cpu size={20} />,\n order: 24,\n group: 'training',\n },\n ];\n\n const cleanup = registerNavItems(navItems);\n return cleanup;\n }, [registerNavItems, basePath, t]);\n\n // Register footer items\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'atheletebridge-status',\n label: t('atheletebridge.footer.ready', 'AthleteBridge Ready'),\n type: 'status' as const,\n order: 10,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems, t]);\n\n return (\n <QueryClientProvider client={queryClient}>\n {/*\n * The host-supplied workspaceId MUST be forwarded: FeatureFlagProvider\n * skips the evaluation fetch entirely when it is null, which collapses\n * every gate onto its defaultValue and makes per-workspace/per-tenant\n * overrides unresolvable. defaultEnabled stays true so an outage of the\n * flag service degrades open rather than hiding shipped modules.\n */}\n <FeatureFlagProvider workspaceId={workspaceId ?? null} gateway=\"global\" defaultEnabled={true}>\n <AthleteBridgeProvider {...props}>\n <AthleteBridgeRoutes />\n <ToastViewport />\n </AthleteBridgeProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ToastViewport(): import("react").JSX.Element | null;
2
+ //# sourceMappingURL=ToastViewport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToastViewport.d.ts","sourceRoot":"","sources":["../../../src/atheletebridge/components/ToastViewport.tsx"],"names":[],"mappings":"AAuCA,wBAAgB,aAAa,uCAmC5B"}
@@ -0,0 +1,62 @@
1
+ import { AlertCircle as e, AlertTriangle as t, CheckCircle2 as n, Info as r, X as i } from "lucide-react";
2
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
3
+ import { useGlobalUi as s } from "@burdenoff/fe-libs/shared/providers/shell";
4
+ //#region src/atheletebridge/components/ToastViewport.tsx
5
+ var c = {
6
+ success: {
7
+ Icon: n,
8
+ border: "border-status-success-border",
9
+ accent: "text-status-success-text"
10
+ },
11
+ error: {
12
+ Icon: e,
13
+ border: "border-status-error-border",
14
+ accent: "text-status-error-text"
15
+ },
16
+ warning: {
17
+ Icon: t,
18
+ border: "border-status-warning-border",
19
+ accent: "text-status-warning-text"
20
+ },
21
+ info: {
22
+ Icon: r,
23
+ border: "border-status-info-border",
24
+ accent: "text-status-info-text"
25
+ }
26
+ };
27
+ function l() {
28
+ let { toasts: e, dismissToast: t } = s();
29
+ return !e || e.length === 0 ? null : /* @__PURE__ */ a("div", {
30
+ className: "pointer-events-none fixed bottom-4 right-4 z-[10000] flex w-80 max-w-[calc(100vw-2rem)] flex-col gap-2",
31
+ role: "region",
32
+ "aria-label": "Notifications",
33
+ children: e.map((e) => {
34
+ let n = c[e.type] ?? c.info, { Icon: r } = n;
35
+ return /* @__PURE__ */ o("div", {
36
+ role: "alert",
37
+ className: `pointer-events-auto flex items-start gap-3 rounded-lg border ${n.border} bg-bg-surface p-3 shadow-lg`,
38
+ children: [
39
+ /* @__PURE__ */ a(r, {
40
+ className: `mt-0.5 size-4 shrink-0 ${n.accent}`,
41
+ "aria-hidden": "true"
42
+ }),
43
+ /* @__PURE__ */ a("p", {
44
+ className: "flex-1 break-words text-sm text-text-primary",
45
+ children: e.message
46
+ }),
47
+ /* @__PURE__ */ a("button", {
48
+ type: "button",
49
+ onClick: () => t(e.id),
50
+ "aria-label": "Dismiss notification",
51
+ className: "shrink-0 rounded p-0.5 text-text-muted transition hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent-primary",
52
+ children: /* @__PURE__ */ a(i, { className: "size-4" })
53
+ })
54
+ ]
55
+ }, e.id);
56
+ })
57
+ });
58
+ }
59
+ //#endregion
60
+ export { l as ToastViewport };
61
+
62
+ //# sourceMappingURL=ToastViewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToastViewport.js","names":[],"sources":["../../../src/atheletebridge/components/ToastViewport.tsx"],"sourcesContent":["/**\n * Toast viewport\n * @module atheletebridge/components\n *\n * Renders the transient toasts pushed via the shared `useGlobalUi().showToast(...)`\n * API (used by destructive-action feedback such as the roster delete flow,\n * BOFF-7617).\n *\n * The fe-libs GlobalUiProvider stores toasts in a context array but ships no\n * default renderer for it, so without this viewport every `showToast(...)` call\n * is a silent no-op. Mounted once inside the MFE Root. Tokenized, accessible,\n * auto-dismiss handled by the provider itself.\n */\nimport { AlertCircle, AlertTriangle, CheckCircle2, Info, X } from 'lucide-react';\nimport { useGlobalUi, type ToastType } from '@burdenoff/fe-libs/shared/providers/shell';\n\nconst TOAST_STYLES: Record<ToastType, { Icon: typeof Info; border: string; accent: string }> = {\n success: {\n Icon: CheckCircle2,\n border: 'border-status-success-border',\n accent: 'text-status-success-text',\n },\n error: {\n Icon: AlertCircle,\n border: 'border-status-error-border',\n accent: 'text-status-error-text',\n },\n warning: {\n Icon: AlertTriangle,\n border: 'border-status-warning-border',\n accent: 'text-status-warning-text',\n },\n info: {\n Icon: Info,\n border: 'border-status-info-border',\n accent: 'text-status-info-text',\n },\n};\n\nexport function ToastViewport() {\n const { toasts, dismissToast } = useGlobalUi();\n\n if (!toasts || toasts.length === 0) return null;\n\n return (\n <div\n className=\"pointer-events-none fixed bottom-4 right-4 z-[10000] flex w-80 max-w-[calc(100vw-2rem)] flex-col gap-2\"\n role=\"region\"\n aria-label=\"Notifications\"\n >\n {toasts.map((toast) => {\n const style = TOAST_STYLES[toast.type] ?? TOAST_STYLES.info;\n const { Icon } = style;\n return (\n <div\n key={toast.id}\n role=\"alert\"\n className={`pointer-events-auto flex items-start gap-3 rounded-lg border ${style.border} bg-bg-surface p-3 shadow-lg`}\n >\n <Icon className={`mt-0.5 size-4 shrink-0 ${style.accent}`} aria-hidden=\"true\" />\n <p className=\"flex-1 break-words text-sm text-text-primary\">{toast.message}</p>\n <button\n type=\"button\"\n onClick={() => dismissToast(toast.id)}\n aria-label=\"Dismiss notification\"\n className=\"shrink-0 rounded p-0.5 text-text-muted transition hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent-primary\"\n >\n <X className=\"size-4\" />\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;AAgBA,IAAM,IAAyF;CAC7F,SAAS;EACP,MAAM;EACN,QAAQ;EACR,QAAQ;CACV;CACA,OAAO;EACL,MAAM;EACN,QAAQ;EACR,QAAQ;CACV;CACA,SAAS;EACP,MAAM;EACN,QAAQ;EACR,QAAQ;CACV;CACA,MAAM;EACJ,MAAM;EACN,QAAQ;EACR,QAAQ;CACV;AACF;AAEA,SAAgB,IAAgB;CAC9B,IAAM,EAAE,WAAQ,oBAAiB,EAAY;CAI7C,OAFI,CAAC,KAAU,EAAO,WAAW,IAAU,OAGzC,kBAAC,OAAD;EACE,WAAU;EACV,MAAK;EACL,cAAW;YAEV,EAAO,KAAK,MAAU;GACrB,IAAM,IAAQ,EAAa,EAAM,SAAS,EAAa,MACjD,EAAE,YAAS;GACjB,OACE,kBAAC,OAAD;IAEE,MAAK;IACL,WAAW,gEAAgE,EAAM,OAAO;cAH1F;KAKE,kBAAC,GAAD;MAAM,WAAW,0BAA0B,EAAM;MAAU,eAAY;KAAQ,CAAA;KAC/E,kBAAC,KAAD;MAAG,WAAU;gBAAgD,EAAM;KAAW,CAAA;KAC9E,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAa,EAAM,EAAE;MACpC,cAAW;MACX,WAAU;gBAEV,kBAAC,GAAD,EAAG,WAAU,SAAU,CAAA;KACjB,CAAA;IACL;MAdE,EAAM,EAcR;EAET,CAAC;CACE,CAAA;AAET"}
@@ -1 +1 @@
1
- {"version":3,"file":"TeamDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/atheletebridge/pages/teams/TeamDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAkHH,wBAAgB,cAAc,gCAmnB7B"}
1
+ {"version":3,"file":"TeamDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/atheletebridge/pages/teams/TeamDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAmHH,wBAAgB,cAAc,gCA+rB7B"}