@burdenoff/microfe-eventfullymanaged 2026.529.1 → 2026.625.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 (43) hide show
  1. package/dist/eventfullymanaged/components/PageLayout.js +44 -38
  2. package/dist/eventfullymanaged/components/PageLayout.js.map +1 -1
  3. package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js +39 -27
  4. package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
  5. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +40 -41
  6. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  7. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +67 -65
  8. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
  9. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +48 -50
  10. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
  11. package/dist/eventfullymanaged/pages/modules/EntityListSection.js +57 -25
  12. package/dist/eventfullymanaged/pages/modules/EntityListSection.js.map +1 -1
  13. package/dist/eventfullymanaged/pages/modules/EventsPage.js +55 -57
  14. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  15. package/dist/eventfullymanaged/pages/modules/KioskPage.js +17 -19
  16. package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
  17. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +22 -22
  18. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
  19. package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js +90 -82
  20. package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js.map +1 -1
  21. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +28 -29
  22. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
  23. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +67 -65
  24. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
  25. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +18 -20
  26. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
  27. package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js +68 -64
  28. package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js.map +1 -1
  29. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +57 -60
  30. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
  31. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +197 -199
  32. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
  33. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +57 -39
  34. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
  35. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +41 -31
  36. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
  37. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +79 -62
  38. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
  39. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +185 -189
  40. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
  41. package/dist/eventfullymanaged/pages/venues/VenueListPage.js +63 -35
  42. package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
  43. package/package.json +2 -2
@@ -1,53 +1,59 @@
1
1
  import { useEventfullyManaged as e } from "../context/EventfullyManagedContext.js";
2
2
  import { cn as t } from "../utils/cn.js";
3
3
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ import { AuroraBackground as i } from "@burdenoff/fe-libs/ui";
4
5
  //#region src/eventfullymanaged/components/PageLayout.tsx
5
- function i({ title: i, description: a, actions: o, children: s, backPath: c }) {
6
- let { navigate: l } = e();
6
+ function a({ title: a, description: o, actions: s, children: c, backPath: l, hero: u = !1 }) {
7
+ let { navigate: d } = e();
7
8
  return /* @__PURE__ */ r("div", {
8
9
  className: t("flex flex-col h-full bg-bg-surface"),
9
10
  children: [/* @__PURE__ */ r("div", {
10
- className: t("flex items-start justify-between px-6 py-4 border-b border-border-default bg-bg-surface"),
11
- children: [/* @__PURE__ */ r("div", {
12
- className: "flex flex-col gap-1",
13
- children: [
14
- c && /* @__PURE__ */ r("button", {
15
- type: "button",
16
- onClick: () => l(c),
17
- className: t("flex items-center gap-1 text-sm text-text-secondary hover:text-text-primary transition-colors mb-1"),
18
- children: [/* @__PURE__ */ n("svg", {
19
- xmlns: "http://www.w3.org/2000/svg",
20
- width: "16",
21
- height: "16",
22
- viewBox: "0 0 24 24",
23
- fill: "none",
24
- stroke: "currentColor",
25
- strokeWidth: "2",
26
- strokeLinecap: "round",
27
- strokeLinejoin: "round",
28
- children: /* @__PURE__ */ n("path", { d: "m15 18-6-6 6-6" })
29
- }), "Back"]
30
- }),
31
- /* @__PURE__ */ n("h1", {
32
- className: t("text-2xl font-semibold text-text-primary"),
33
- children: i
34
- }),
35
- a && /* @__PURE__ */ n("p", {
36
- className: t("text-sm text-text-secondary mt-0.5"),
37
- children: a
38
- })
39
- ]
40
- }), o && /* @__PURE__ */ n("div", {
41
- className: "flex items-center gap-2",
42
- children: o
43
- })]
11
+ className: t("relative flex items-start justify-between gap-4 overflow-hidden border-b border-border-seam px-6 py-5", u ? "bg-accent-wash" : "bg-bg-surface"),
12
+ children: [
13
+ u ? /* @__PURE__ */ n(i, { intensity: "subtle" }) : null,
14
+ /* @__PURE__ */ r("div", {
15
+ className: "flex min-w-0 flex-col gap-1",
16
+ children: [
17
+ l && /* @__PURE__ */ r("button", {
18
+ type: "button",
19
+ onClick: () => d(l),
20
+ className: t("flex w-fit items-center gap-1 rounded-button text-sm text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]"),
21
+ children: [/* @__PURE__ */ n("svg", {
22
+ xmlns: "http://www.w3.org/2000/svg",
23
+ width: "16",
24
+ height: "16",
25
+ viewBox: "0 0 24 24",
26
+ fill: "none",
27
+ stroke: "currentColor",
28
+ strokeWidth: "2",
29
+ strokeLinecap: "round",
30
+ strokeLinejoin: "round",
31
+ "aria-hidden": "true",
32
+ children: /* @__PURE__ */ n("path", { d: "m15 18-6-6 6-6" })
33
+ }), "Back"]
34
+ }),
35
+ /* @__PURE__ */ n("h1", {
36
+ className: t("text-2xl font-semibold text-text-primary"),
37
+ children: a
38
+ }),
39
+ o && /* @__PURE__ */ n("p", {
40
+ className: t("mt-0.5 text-sm text-text-secondary"),
41
+ children: o
42
+ })
43
+ ]
44
+ }),
45
+ s && /* @__PURE__ */ n("div", {
46
+ className: "relative flex shrink-0 items-center gap-2",
47
+ children: s
48
+ })
49
+ ]
44
50
  }), /* @__PURE__ */ n("div", {
45
51
  className: t("flex-1 overflow-auto p-6"),
46
- children: s
52
+ children: c
47
53
  })]
48
54
  });
49
55
  }
50
56
  //#endregion
51
- export { i as PageLayout };
57
+ export { a as PageLayout };
52
58
 
53
59
  //# sourceMappingURL=PageLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/eventfullymanaged/components/PageLayout.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { useEventfullyManaged } from '../context/EventfullyManagedContext';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: string;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n backPath?: string;\n}\n\nexport function PageLayout({ title, description, actions, children, backPath }: PageLayoutProps) {\n const { navigate } = useEventfullyManaged();\n\n return (\n <div className={cn('flex flex-col h-full bg-bg-surface')}>\n {/* Header */}\n <div className={cn('flex items-start justify-between px-6 py-4 border-b border-border-default bg-bg-surface')}>\n <div className=\"flex flex-col gap-1\">\n {backPath && (\n <button\n type=\"button\"\n onClick={() => navigate(backPath)}\n className={cn(\n 'flex items-center gap-1 text-sm text-text-secondary hover:text-text-primary transition-colors mb-1'\n )}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n Back\n </button>\n )}\n <h1 className={cn('text-2xl font-semibold text-text-primary')}>{title}</h1>\n {description && <p className={cn('text-sm text-text-secondary mt-0.5')}>{description}</p>}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n\n {/* Content */}\n <div className={cn('flex-1 overflow-auto p-6')}>{children}</div>\n </div>\n );\n}\n"],"mappings":";;;;AAYA,SAAgB,EAAW,EAAE,UAAO,gBAAa,YAAS,aAAU,eAA6B;CAC/F,IAAM,EAAE,gBAAa,GAAsB;AAE3C,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,qCAAqC;YAAxD,CAEE,kBAAC,OAAD;GAAK,WAAW,EAAG,0FAA0F;aAA7G,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,KACC,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAS,EAAS;MACjC,WAAW,EACT,qGACD;gBALH,CAOE,kBAAC,OAAD;OACE,OAAM;OACN,OAAM;OACN,QAAO;OACP,SAAQ;OACR,MAAK;OACL,QAAO;OACP,aAAY;OACZ,eAAc;OACd,gBAAe;iBAEf,kBAAC,QAAD,EAAM,GAAE,kBAAmB,CAAA;OACvB,CAAA,EAAA,OAEC;;KAEX,kBAAC,MAAD;MAAI,WAAW,EAAG,2CAA2C;gBAAG;MAAW,CAAA;KAC1E,KAAe,kBAAC,KAAD;MAAG,WAAW,EAAG,qCAAqC;gBAAG;MAAgB,CAAA;KACrF;OACL,KAAW,kBAAC,OAAD;IAAK,WAAU;cAA2B;IAAc,CAAA,CAChE;MAGN,kBAAC,OAAD;GAAK,WAAW,EAAG,2BAA2B;GAAG;GAAe,CAAA,CAC5D"}
1
+ {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/eventfullymanaged/components/PageLayout.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { AuroraBackground } from '@burdenoff/fe-libs/ui';\nimport { useEventfullyManaged } from '../context/EventfullyManagedContext';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n backPath?: string;\n /** Render the page header with the living-glass aurora backdrop (MFE hero). */\n hero?: boolean;\n}\n\nexport function PageLayout({ title, description, actions, children, backPath, hero = false }: PageLayoutProps) {\n const { navigate } = useEventfullyManaged();\n\n return (\n <div className={cn('flex flex-col h-full bg-bg-surface')}>\n {/* Header */}\n <div\n className={cn(\n 'relative flex items-start justify-between gap-4 overflow-hidden border-b border-border-seam px-6 py-5',\n hero ? 'bg-accent-wash' : 'bg-bg-surface'\n )}\n >\n {hero ? <AuroraBackground intensity=\"subtle\" /> : null}\n <div className=\"flex min-w-0 flex-col gap-1\">\n {backPath && (\n <button\n type=\"button\"\n onClick={() => navigate(backPath)}\n className={cn(\n 'flex w-fit items-center gap-1 rounded-button text-sm text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n Back\n </button>\n )}\n <h1 className={cn('text-2xl font-semibold text-text-primary')}>{title}</h1>\n {description && <p className={cn('mt-0.5 text-sm text-text-secondary')}>{description}</p>}\n </div>\n {actions && <div className=\"relative flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n\n {/* Content */}\n <div className={cn('flex-1 overflow-auto p-6')}>{children}</div>\n </div>\n );\n}\n"],"mappings":";;;;;AAeA,SAAgB,EAAW,EAAE,UAAO,gBAAa,YAAS,aAAU,aAAU,UAAO,MAA0B;CAC7G,IAAM,EAAE,gBAAa,GAAsB;AAE3C,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,qCAAqC;YAAxD,CAEE,kBAAC,OAAD;GACE,WAAW,EACT,yGACA,IAAO,mBAAmB,gBAC3B;aAJH;IAMG,IAAO,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA,GAAG;IAClD,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,KACC,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,EAAS,EAAS;OACjC,WAAW,EACT,kNACD;iBALH,CAOE,kBAAC,OAAD;QACE,OAAM;QACN,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,QAAO;QACP,aAAY;QACZ,eAAc;QACd,gBAAe;QACf,eAAY;kBAEZ,kBAAC,QAAD,EAAM,GAAE,kBAAmB,CAAA;QACvB,CAAA,EAAA,OAEC;;MAEX,kBAAC,MAAD;OAAI,WAAW,EAAG,2CAA2C;iBAAG;OAAW,CAAA;MAC1E,KAAe,kBAAC,KAAD;OAAG,WAAW,EAAG,qCAAqC;iBAAG;OAAgB,CAAA;MACrF;;IACL,KAAW,kBAAC,OAAD;KAAK,WAAU;eAA6C;KAAc,CAAA;IAClF;MAGN,kBAAC,OAAD;GAAK,WAAW,EAAG,2BAA2B;GAAG;GAAe,CAAA,CAC5D"}
@@ -4,68 +4,80 @@ import { PageLayout as n } from "../../components/PageLayout.js";
4
4
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
5
  import { BarChart3 as a, Building2 as o, CalendarDays as s, Megaphone as c, Ticket as l, Users as u } from "lucide-react";
6
6
  import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
7
+ import { GlassCard as f, GradientText as p } from "@burdenoff/fe-libs/ui";
7
8
  //#region src/eventfullymanaged/pages/dashboard/DashboardPage.tsx
8
- function f() {
9
- let { t: f } = d(), p = (e, t) => {
10
- let n = f(e);
9
+ function m() {
10
+ let { t: m } = d(), h = (e, t) => {
11
+ let n = m(e);
11
12
  return n === e ? t : n;
12
- }, { navigate: m } = e(), { data: h, loading: g } = t(), _ = h?.dashboardSummary, v = [
13
+ }, { navigate: g } = e(), { data: _, loading: v } = t(), y = _?.dashboardSummary, b = [
13
14
  {
14
- label: p("eventfullymanaged.dashboard.cards.activeEvents", "Active Events"),
15
- value: _?.activeEvents ?? 0,
15
+ label: h("eventfullymanaged.dashboard.cards.activeEvents", "Active Events"),
16
+ value: y?.activeEvents ?? 0,
16
17
  icon: s,
17
18
  path: "/events"
18
19
  },
19
20
  {
20
- label: p("eventfullymanaged.dashboard.cards.venues", "Venues"),
21
- value: _?.totalVenues ?? 0,
21
+ label: h("eventfullymanaged.dashboard.cards.venues", "Venues"),
22
+ value: y?.totalVenues ?? 0,
22
23
  icon: o,
23
24
  path: "/venues"
24
25
  },
25
26
  {
26
- label: p("eventfullymanaged.dashboard.cards.registrations", "Registrations"),
27
- value: _?.totalRegistrations ?? 0,
27
+ label: h("eventfullymanaged.dashboard.cards.registrations", "Registrations"),
28
+ value: y?.totalRegistrations ?? 0,
28
29
  icon: l,
29
30
  path: "/registration"
30
31
  },
31
32
  {
32
- label: p("eventfullymanaged.dashboard.cards.campaigns", "Campaigns"),
33
- value: _?.totalSponsors ?? 0,
33
+ label: h("eventfullymanaged.dashboard.cards.campaigns", "Campaigns"),
34
+ value: y?.totalSponsors ?? 0,
34
35
  icon: c,
35
36
  path: "/communication"
36
37
  },
37
38
  {
38
- label: p("eventfullymanaged.dashboard.cards.analyticsReports", "Analytics Reports"),
39
- value: _?.totalEvents ?? 0,
39
+ label: h("eventfullymanaged.dashboard.cards.analyticsReports", "Analytics Reports"),
40
+ value: y?.totalEvents ?? 0,
40
41
  icon: a,
41
42
  path: "/analytics"
42
43
  },
43
44
  {
44
- label: p("eventfullymanaged.dashboard.cards.networkMatches", "Network Matches"),
45
- value: _?.upcomingSessions ?? 0,
45
+ label: h("eventfullymanaged.dashboard.cards.networkMatches", "Network Matches"),
46
+ value: y?.upcomingSessions ?? 0,
46
47
  icon: u,
47
48
  path: "/networking"
48
49
  }
49
50
  ];
50
51
  return /* @__PURE__ */ r(n, {
51
- title: p("eventfullymanaged.dashboard.title", "EventfullyManaged"),
52
- description: g ? p("eventfullymanaged.dashboard.description.loading", "Loading real-time event operations summary...") : p("eventfullymanaged.dashboard.description.ready", "Unified event operations dashboard."),
52
+ hero: !0,
53
+ title: /* @__PURE__ */ r(p, {
54
+ as: "span",
55
+ children: h("eventfullymanaged.dashboard.title", "EventfullyManaged")
56
+ }),
57
+ description: v ? h("eventfullymanaged.dashboard.description.loading", "Loading real-time event operations summary...") : h("eventfullymanaged.dashboard.description.ready", "Unified event operations dashboard."),
53
58
  children: /* @__PURE__ */ r("div", {
54
59
  className: "grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",
55
- children: v.map((e) => {
56
- let t = e.icon;
57
- return /* @__PURE__ */ i("button", {
58
- type: "button",
59
- onClick: () => m(e.path),
60
- className: "rounded-lg border border-border-default bg-bg-surface p-5 text-left transition hover:bg-bg-elevated",
60
+ children: b.map((e, t) => {
61
+ let n = e.icon, a = t === 0;
62
+ return /* @__PURE__ */ i(f, {
63
+ treatment: a ? "glass" : "metric",
64
+ glow: a,
65
+ role: "button",
66
+ tabIndex: 0,
67
+ "aria-label": `${e.label}: ${e.value.toLocaleString()}`,
68
+ onClick: () => g(e.path),
69
+ onKeyDown: (t) => {
70
+ (t.key === "Enter" || t.key === " ") && (t.preventDefault(), g(e.path));
71
+ },
72
+ className: "cursor-pointer p-5 outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
61
73
  children: [/* @__PURE__ */ i("div", {
62
74
  className: "flex items-center justify-between",
63
75
  children: [/* @__PURE__ */ r("span", {
64
76
  className: "text-sm text-text-secondary",
65
77
  children: e.label
66
- }), /* @__PURE__ */ r(t, { className: "h-5 w-5 text-text-secondary" })]
78
+ }), /* @__PURE__ */ r(n, { className: "h-5 w-5 text-action-primary-bg" })]
67
79
  }), /* @__PURE__ */ r("div", {
68
- className: "mt-3 text-3xl font-semibold text-text-primary",
80
+ className: "mt-3 text-3xl font-semibold tabular-nums text-text-primary",
69
81
  children: e.value.toLocaleString()
70
82
  })]
71
83
  }, e.label);
@@ -74,6 +86,6 @@ function f() {
74
86
  });
75
87
  }
76
88
  //#endregion
77
- export { f as default };
89
+ export { m as default };
78
90
 
79
91
  //# sourceMappingURL=DashboardPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/dashboard/DashboardPage.tsx"],"sourcesContent":["import { BarChart3, Building2, CalendarDays, Megaphone, Ticket, Users } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nimport { useDashboardSummaryQuery } from '../../api/eventApi';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype StatCard = {\n label: string;\n value: number;\n icon: React.ComponentType<{ className?: string }>;\n path: string;\n};\n\nexport default function DashboardPage() {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { navigate } = useEventfullyManaged();\n const { data, loading } = useDashboardSummaryQuery();\n\n const summary = data?.dashboardSummary;\n const cards: StatCard[] = [\n {\n label: t('eventfullymanaged.dashboard.cards.activeEvents', 'Active Events'),\n value: summary?.activeEvents ?? 0,\n icon: CalendarDays,\n path: '/events',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.venues', 'Venues'),\n value: summary?.totalVenues ?? 0,\n icon: Building2,\n path: '/venues',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.registrations', 'Registrations'),\n value: summary?.totalRegistrations ?? 0,\n icon: Ticket,\n path: '/registration',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.campaigns', 'Campaigns'),\n value: summary?.totalSponsors ?? 0,\n icon: Megaphone,\n path: '/communication',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.analyticsReports', 'Analytics Reports'),\n value: summary?.totalEvents ?? 0,\n icon: BarChart3,\n path: '/analytics',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.networkMatches', 'Network Matches'),\n value: summary?.upcomingSessions ?? 0,\n icon: Users,\n path: '/networking',\n },\n ];\n\n return (\n <PageLayout\n title={t('eventfullymanaged.dashboard.title', 'EventfullyManaged')}\n description={\n loading\n ? t('eventfullymanaged.dashboard.description.loading', 'Loading real-time event operations summary...')\n : t('eventfullymanaged.dashboard.description.ready', 'Unified event operations dashboard.')\n }\n >\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {cards.map((card) => {\n const Icon = card.icon;\n return (\n <button\n key={card.label}\n type=\"button\"\n onClick={() => navigate(card.path)}\n className=\"rounded-lg border border-border-default bg-bg-surface p-5 text-left transition hover:bg-bg-elevated\"\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">{card.label}</span>\n <Icon className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div className=\"mt-3 text-3xl font-semibold text-text-primary\">{card.value.toLocaleString()}</div>\n </button>\n );\n })}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AAcA,SAAwB,IAAgB;CACtC,IAAM,EAAE,GAAG,MAAc,GAAS,EAC5B,KAAK,GAAa,MAAqB;EAC3C,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;IAE9B,EAAE,gBAAa,GAAsB,EACrC,EAAE,SAAM,eAAY,GAA0B,EAE9C,IAAU,GAAM,kBAChB,IAAoB;EACxB;GACE,OAAO,EAAE,kDAAkD,gBAAgB;GAC3E,OAAO,GAAS,gBAAgB;GAChC,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,4CAA4C,SAAS;GAC9D,OAAO,GAAS,eAAe;GAC/B,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,mDAAmD,gBAAgB;GAC5E,OAAO,GAAS,sBAAsB;GACtC,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,+CAA+C,YAAY;GACpE,OAAO,GAAS,iBAAiB;GACjC,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,sDAAsD,oBAAoB;GACnF,OAAO,GAAS,eAAe;GAC/B,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,oDAAoD,kBAAkB;GAC/E,OAAO,GAAS,oBAAoB;GACpC,MAAM;GACN,MAAM;GACP;EACF;AAED,QACE,kBAAC,GAAD;EACE,OAAO,EAAE,qCAAqC,oBAAoB;EAClE,aACE,IACI,EAAE,mDAAmD,gDAAgD,GACrG,EAAE,iDAAiD,sCAAsC;YAG/F,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,KAAK,MAAS;IACnB,IAAM,IAAO,EAAK;AAClB,WACE,kBAAC,UAAD;KAEE,MAAK;KACL,eAAe,EAAS,EAAK,KAAK;KAClC,WAAU;eAJZ,CAME,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAA+B,EAAK;OAAa,CAAA,EACjE,kBAAC,GAAD,EAAM,WAAU,+BAAgC,CAAA,CAC5C;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAiD,EAAK,MAAM,gBAAgB;MAAO,CAAA,CAC3F;OAVF,EAAK,MAUH;KAEX;GACE,CAAA;EACK,CAAA"}
1
+ {"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/dashboard/DashboardPage.tsx"],"sourcesContent":["import { BarChart3, Building2, CalendarDays, Megaphone, Ticket, Users } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { GlassCard, GradientText } from '@burdenoff/fe-libs/ui';\n\nimport { useDashboardSummaryQuery } from '../../api/eventApi';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype StatCard = {\n label: string;\n value: number;\n icon: React.ComponentType<{ className?: string }>;\n path: string;\n};\n\nexport default function DashboardPage() {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { navigate } = useEventfullyManaged();\n const { data, loading } = useDashboardSummaryQuery();\n\n const summary = data?.dashboardSummary;\n const cards: StatCard[] = [\n {\n label: t('eventfullymanaged.dashboard.cards.activeEvents', 'Active Events'),\n value: summary?.activeEvents ?? 0,\n icon: CalendarDays,\n path: '/events',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.venues', 'Venues'),\n value: summary?.totalVenues ?? 0,\n icon: Building2,\n path: '/venues',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.registrations', 'Registrations'),\n value: summary?.totalRegistrations ?? 0,\n icon: Ticket,\n path: '/registration',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.campaigns', 'Campaigns'),\n value: summary?.totalSponsors ?? 0,\n icon: Megaphone,\n path: '/communication',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.analyticsReports', 'Analytics Reports'),\n value: summary?.totalEvents ?? 0,\n icon: BarChart3,\n path: '/analytics',\n },\n {\n label: t('eventfullymanaged.dashboard.cards.networkMatches', 'Network Matches'),\n value: summary?.upcomingSessions ?? 0,\n icon: Users,\n path: '/networking',\n },\n ];\n\n return (\n <PageLayout\n hero\n title={<GradientText as=\"span\">{t('eventfullymanaged.dashboard.title', 'EventfullyManaged')}</GradientText>}\n description={\n loading\n ? t('eventfullymanaged.dashboard.description.loading', 'Loading real-time event operations summary...')\n : t('eventfullymanaged.dashboard.description.ready', 'Unified event operations dashboard.')\n }\n >\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {cards.map((card, index) => {\n const Icon = card.icon;\n const featured = index === 0;\n return (\n <GlassCard\n key={card.label}\n treatment={featured ? 'glass' : 'metric'}\n glow={featured}\n role=\"button\"\n tabIndex={0}\n aria-label={`${card.label}: ${card.value.toLocaleString()}`}\n onClick={() => navigate(card.path)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n navigate(card.path);\n }\n }}\n className=\"cursor-pointer p-5 outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">{card.label}</span>\n <Icon className=\"h-5 w-5 text-action-primary-bg\" />\n </div>\n <div className=\"mt-3 text-3xl font-semibold tabular-nums text-text-primary\">\n {card.value.toLocaleString()}\n </div>\n </GlassCard>\n );\n })}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAeA,SAAwB,IAAgB;CACtC,IAAM,EAAE,GAAG,MAAc,GAAS,EAC5B,KAAK,GAAa,MAAqB;EAC3C,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;IAE9B,EAAE,gBAAa,GAAsB,EACrC,EAAE,SAAM,eAAY,GAA0B,EAE9C,IAAU,GAAM,kBAChB,IAAoB;EACxB;GACE,OAAO,EAAE,kDAAkD,gBAAgB;GAC3E,OAAO,GAAS,gBAAgB;GAChC,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,4CAA4C,SAAS;GAC9D,OAAO,GAAS,eAAe;GAC/B,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,mDAAmD,gBAAgB;GAC5E,OAAO,GAAS,sBAAsB;GACtC,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,+CAA+C,YAAY;GACpE,OAAO,GAAS,iBAAiB;GACjC,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,sDAAsD,oBAAoB;GACnF,OAAO,GAAS,eAAe;GAC/B,MAAM;GACN,MAAM;GACP;EACD;GACE,OAAO,EAAE,oDAAoD,kBAAkB;GAC/E,OAAO,GAAS,oBAAoB;GACpC,MAAM;GACN,MAAM;GACP;EACF;AAED,QACE,kBAAC,GAAD;EACE,MAAA;EACA,OAAO,kBAAC,GAAD;GAAc,IAAG;aAAQ,EAAE,qCAAqC,oBAAoB;GAAgB,CAAA;EAC3G,aACE,IACI,EAAE,mDAAmD,gDAAgD,GACrG,EAAE,iDAAiD,sCAAsC;YAG/F,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,KAAK,GAAM,MAAU;IAC1B,IAAM,IAAO,EAAK,MACZ,IAAW,MAAU;AAC3B,WACE,kBAAC,GAAD;KAEE,WAAW,IAAW,UAAU;KAChC,MAAM;KACN,MAAK;KACL,UAAU;KACV,cAAY,GAAG,EAAK,MAAM,IAAI,EAAK,MAAM,gBAAgB;KACzD,eAAe,EAAS,EAAK,KAAK;KAClC,YAAY,MAAU;AACpB,OAAI,EAAM,QAAQ,WAAW,EAAM,QAAQ,SACzC,EAAM,gBAAgB,EACtB,EAAS,EAAK,KAAK;;KAGvB,WAAU;eAdZ,CAgBE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAA+B,EAAK;OAAa,CAAA,EACjE,kBAAC,GAAD,EAAM,WAAU,kCAAmC,CAAA,CAC/C;SACN,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAK,MAAM,gBAAgB;MACxB,CAAA,CACI;OAtBL,EAAK,MAsBA;KAEd;GACE,CAAA;EACK,CAAA"}
@@ -3,52 +3,51 @@ import { EntityListSection as n } from "./EntityListSection.js";
3
3
  import { useMemo as r, useState as i } from "react";
4
4
  import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
5
  import { BarChart3 as s } from "lucide-react";
6
+ import { Button as c, EmphasisPanel as l, GradientText as u, Input as d } from "@burdenoff/fe-libs/ui";
6
7
  //#region src/eventfullymanaged/pages/modules/AnalyticsPage.tsx
7
- function c() {
8
- let c = e({
8
+ function f() {
9
+ let f = e({
9
10
  limit: 100,
10
11
  offset: 0
11
- }), [l, { loading: u }] = t(), [d, f] = i("overview"), p = r(() => c.data?.analyticsSnapshots.items ?? [], [c.data]);
12
+ }), [p, { loading: m }] = t(), [h, g] = i("overview"), _ = r(() => f.data?.analyticsSnapshots.items ?? [], [f.data]);
12
13
  return /* @__PURE__ */ o("div", {
13
14
  className: "space-y-6 p-6",
14
- children: [/* @__PURE__ */ o("section", {
15
- className: "rounded-lg border border-border-default bg-bg-surface p-5",
16
- children: [
17
- /* @__PURE__ */ a("h1", {
18
- className: "text-2xl font-bold text-text-primary",
19
- children: "Analytics"
20
- }),
21
- /* @__PURE__ */ a("p", {
22
- className: "mt-1 text-sm text-text-secondary",
23
- children: "Generate and track analytics snapshots from event operations data."
24
- }),
25
- /* @__PURE__ */ o("div", {
26
- className: "mt-4 flex flex-col gap-3 sm:flex-row",
27
- children: [/* @__PURE__ */ a("input", {
28
- value: d,
29
- onChange: (e) => f(e.target.value),
30
- placeholder: "daily-summary",
31
- className: "flex-1 rounded-md border border-border-default px-3 py-2"
32
- }), /* @__PURE__ */ o("button", {
33
- type: "button",
34
- disabled: u,
35
- onClick: async () => {
36
- d.trim() && await l({ variables: { input: {
37
- name: d,
38
- title: d,
39
- status: "created",
40
- metadata: {}
41
- } } });
42
- },
43
- className: "inline-flex items-center rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-60",
44
- children: [/* @__PURE__ */ a(s, { className: "mr-2 h-4 w-4" }), u ? "Generating..." : "Generate Snapshot"]
45
- })]
46
- })
47
- ]
48
- }), /* @__PURE__ */ a(n, {
49
- heading: c.loading ? "Loading snapshots..." : `Snapshots (${p.length})`,
15
+ children: [/* @__PURE__ */ o(l, { children: [
16
+ /* @__PURE__ */ a("h1", {
17
+ className: "text-2xl font-bold text-text-primary",
18
+ children: /* @__PURE__ */ a(u, { children: "Analytics" })
19
+ }),
20
+ /* @__PURE__ */ a("p", {
21
+ className: "mt-1 text-sm text-text-secondary",
22
+ children: "Generate and track analytics snapshots from event operations data."
23
+ }),
24
+ /* @__PURE__ */ o("div", {
25
+ className: "mt-4 flex flex-col gap-3 sm:flex-row",
26
+ children: [/* @__PURE__ */ a(d, {
27
+ value: h,
28
+ onChange: (e) => g(e.target.value),
29
+ placeholder: "daily-summary",
30
+ "aria-label": "Snapshot name",
31
+ className: "flex-1"
32
+ }), /* @__PURE__ */ o(c, {
33
+ type: "button",
34
+ disabled: m,
35
+ onClick: async () => {
36
+ h.trim() && await p({ variables: { input: {
37
+ name: h,
38
+ title: h,
39
+ status: "created",
40
+ metadata: {}
41
+ } } });
42
+ },
43
+ children: [/* @__PURE__ */ a(s, { className: "h-4 w-4" }), m ? "Generating..." : "Generate Snapshot"]
44
+ })]
45
+ })
46
+ ] }), /* @__PURE__ */ a(n, {
47
+ heading: f.loading ? "Loading snapshots..." : `Snapshots (${_.length})`,
50
48
  emptyLabel: "No analytics snapshots available yet.",
51
- rows: p.map((e) => ({
49
+ emptyIllustration: "empty-data",
50
+ rows: _.map((e) => ({
52
51
  id: e.id,
53
52
  title: e.title ?? e.name ?? `Snapshot ${e.id}`,
54
53
  status: e.status ?? void 0
@@ -57,6 +56,6 @@ function c() {
57
56
  });
58
57
  }
59
58
  //#endregion
60
- export { c as default };
59
+ export { f as default };
61
60
 
62
61
  //# sourceMappingURL=AnalyticsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/AnalyticsPage.tsx"],"sourcesContent":["import { BarChart3 } from 'lucide-react';\nimport { useMemo, useState } from 'react';\n\nimport { useAnalyticsSnapshotsQuery, useUpsertAnalyticsSnapshotMutation } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype SnapshotRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function AnalyticsPage() {\n const snapshotsQuery = useAnalyticsSnapshotsQuery({ limit: 100, offset: 0 });\n const [upsertSnapshot, { loading: creating }] = useUpsertAnalyticsSnapshotMutation();\n const [snapshotName, setSnapshotName] = useState('overview');\n\n const snapshots = useMemo(\n () => (snapshotsQuery.data?.analyticsSnapshots.items ?? []) as SnapshotRow[],\n [snapshotsQuery.data]\n );\n\n const onCreate = async () => {\n if (!snapshotName.trim()) return;\n await upsertSnapshot({\n variables: {\n input: {\n name: snapshotName,\n title: snapshotName,\n status: 'created',\n metadata: {},\n },\n },\n });\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <section className=\"rounded-lg border border-border-default bg-bg-surface p-5\">\n <h1 className=\"text-2xl font-bold text-text-primary\">Analytics</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Generate and track analytics snapshots from event operations data.\n </p>\n <div className=\"mt-4 flex flex-col gap-3 sm:flex-row\">\n <input\n value={snapshotName}\n onChange={(e) => setSnapshotName(e.target.value)}\n placeholder=\"daily-summary\"\n className=\"flex-1 rounded-md border border-border-default px-3 py-2\"\n />\n <button\n type=\"button\"\n disabled={creating}\n onClick={onCreate}\n className=\"inline-flex items-center rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-60\"\n >\n <BarChart3 className=\"mr-2 h-4 w-4\" />\n {creating ? 'Generating...' : 'Generate Snapshot'}\n </button>\n </div>\n </section>\n\n <EntityListSection\n heading={snapshotsQuery.loading ? 'Loading snapshots...' : `Snapshots (${snapshots.length})`}\n emptyLabel=\"No analytics snapshots available yet.\"\n rows={snapshots.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Snapshot ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;AAaA,SAAwB,IAAgB;CACtC,IAAM,IAAiB,EAA2B;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EACtE,CAAC,GAAgB,EAAE,SAAS,OAAc,GAAoC,EAC9E,CAAC,GAAc,KAAmB,EAAS,WAAW,EAEtD,IAAY,QACT,EAAe,MAAM,mBAAmB,SAAS,EAAE,EAC1D,CAAC,EAAe,KAAK,CACtB;AAgBD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,WAAD;GAAS,WAAU;aAAnB;IACE,kBAAC,MAAD;KAAI,WAAU;eAAuC;KAAc,CAAA;IACnE,kBAAC,KAAD;KAAG,WAAU;eAAmC;KAE5C,CAAA;IACJ,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,SAAD;MACE,OAAO;MACP,WAAW,MAAM,EAAgB,EAAE,OAAO,MAAM;MAChD,aAAY;MACZ,WAAU;MACV,CAAA,EACF,kBAAC,UAAD;MACE,MAAK;MACL,UAAU;MACV,SA/BO,YAAY;AACtB,SAAa,MAAM,IACxB,MAAM,EAAe,EACnB,WAAW,EACT,OAAO;QACL,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU,EAAE;QACb,EACF,EACF,CAAC;;MAqBM,WAAU;gBAJZ,CAME,kBAAC,GAAD,EAAW,WAAU,gBAAiB,CAAA,EACrC,IAAW,kBAAkB,oBACvB;QACL;;IACE;MAEV,kBAAC,GAAD;GACE,SAAS,EAAe,UAAU,yBAAyB,cAAc,EAAU,OAAO;GAC1F,YAAW;GACX,MAAM,EAAU,KAAK,OAAS;IAC5B,IAAI,EAAI;IACR,OAAO,EAAI,SAAS,EAAI,QAAQ,YAAY,EAAI;IAChD,QAAQ,EAAI,UAAU,KAAA;IACvB,EAAE;GACH,CAAA,CACE"}
1
+ {"version":3,"file":"AnalyticsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/AnalyticsPage.tsx"],"sourcesContent":["import { BarChart3 } from 'lucide-react';\nimport { Button, EmphasisPanel, GradientText, Input } from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useAnalyticsSnapshotsQuery, useUpsertAnalyticsSnapshotMutation } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype SnapshotRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function AnalyticsPage() {\n const snapshotsQuery = useAnalyticsSnapshotsQuery({ limit: 100, offset: 0 });\n const [upsertSnapshot, { loading: creating }] = useUpsertAnalyticsSnapshotMutation();\n const [snapshotName, setSnapshotName] = useState('overview');\n\n const snapshots = useMemo(\n () => (snapshotsQuery.data?.analyticsSnapshots.items ?? []) as SnapshotRow[],\n [snapshotsQuery.data]\n );\n\n const onCreate = async () => {\n if (!snapshotName.trim()) return;\n await upsertSnapshot({\n variables: {\n input: {\n name: snapshotName,\n title: snapshotName,\n status: 'created',\n metadata: {},\n },\n },\n });\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Analytics</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Generate and track analytics snapshots from event operations data.\n </p>\n <div className=\"mt-4 flex flex-col gap-3 sm:flex-row\">\n <Input\n value={snapshotName}\n onChange={(e) => setSnapshotName(e.target.value)}\n placeholder=\"daily-summary\"\n aria-label=\"Snapshot name\"\n className=\"flex-1\"\n />\n <Button type=\"button\" disabled={creating} onClick={onCreate}>\n <BarChart3 className=\"h-4 w-4\" />\n {creating ? 'Generating...' : 'Generate Snapshot'}\n </Button>\n </div>\n </EmphasisPanel>\n\n <EntityListSection\n heading={snapshotsQuery.loading ? 'Loading snapshots...' : `Snapshots (${snapshots.length})`}\n emptyLabel=\"No analytics snapshots available yet.\"\n emptyIllustration=\"empty-data\"\n rows={snapshots.map((row) => ({\n id: row.id,\n title: row.title ?? row.name ?? `Snapshot ${row.id}`,\n status: row.status ?? undefined,\n }))}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;AAcA,SAAwB,IAAgB;CACtC,IAAM,IAAiB,EAA2B;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EACtE,CAAC,GAAgB,EAAE,SAAS,OAAc,GAAoC,EAC9E,CAAC,GAAc,KAAmB,EAAS,WAAW,EAEtD,IAAY,QACT,EAAe,MAAM,mBAAmB,SAAS,EAAE,EAC1D,CAAC,EAAe,KAAK,CACtB;AAgBD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,MAAD;IAAI,WAAU;cACZ,kBAAC,GAAD,EAAA,UAAc,aAAwB,CAAA;IACnC,CAAA;GACL,kBAAC,KAAD;IAAG,WAAU;cAAmC;IAE5C,CAAA;GACJ,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,OAAO;KACP,WAAW,MAAM,EAAgB,EAAE,OAAO,MAAM;KAChD,aAAY;KACZ,cAAW;KACX,WAAU;KACV,CAAA,EACF,kBAAC,GAAD;KAAQ,MAAK;KAAS,UAAU;KAAU,SA/BjC,YAAY;AACtB,QAAa,MAAM,IACxB,MAAM,EAAe,EACnB,WAAW,EACT,OAAO;OACL,MAAM;OACN,OAAO;OACP,QAAQ;OACR,UAAU,EAAE;OACb,EACF,EACF,CAAC;;eAoBI,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAChC,IAAW,kBAAkB,oBACvB;OACL;;GACQ,EAAA,CAAA,EAEhB,kBAAC,GAAD;GACE,SAAS,EAAe,UAAU,yBAAyB,cAAc,EAAU,OAAO;GAC1F,YAAW;GACX,mBAAkB;GAClB,MAAM,EAAU,KAAK,OAAS;IAC5B,IAAI,EAAI;IACR,OAAO,EAAI,SAAS,EAAI,QAAQ,YAAY,EAAI;IAChD,QAAQ,EAAI,UAAU,KAAA;IACvB,EAAE;GACH,CAAA,CACE"}
@@ -3,78 +3,80 @@ import { EntityListSection as n } from "./EntityListSection.js";
3
3
  import { useMemo as r } from "react";
4
4
  import { useParams as i } from "react-router-dom";
5
5
  import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
+ import { EmphasisPanel as s, GlassCard as c, GradientText as l } from "@burdenoff/fe-libs/ui";
6
7
  //#region src/eventfullymanaged/pages/modules/AttendeeProfilePage.tsx
7
- function s() {
8
- let { id: s = "" } = i(), c = e({
8
+ function u() {
9
+ let { id: u = "" } = i(), d = e({
9
10
  limit: 100,
10
11
  offset: 0
11
- }), l = t({
12
+ }), f = t({
12
13
  limit: 100,
13
14
  offset: 0
14
- }), u = r(() => (c.data?.attendees.items ?? []).find((e) => e.id === s), [s, c.data]), d = r(() => (l.data?.registrations.items ?? []).filter((e) => e.attendeeId === s), [s, l.data]);
15
+ }), p = r(() => (d.data?.attendees.items ?? []).find((e) => e.id === u), [u, d.data]), m = r(() => (f.data?.registrations.items ?? []).filter((e) => e.attendeeId === u), [u, f.data]);
15
16
  return /* @__PURE__ */ o("div", {
16
17
  className: "space-y-6 p-6",
17
- children: [/* @__PURE__ */ o("section", {
18
- className: "rounded-lg border border-border-default bg-bg-surface p-5",
19
- children: [
20
- /* @__PURE__ */ a("h1", {
21
- className: "text-2xl font-bold text-text-primary",
22
- children: "Attendee Profile"
23
- }),
24
- /* @__PURE__ */ a("p", {
25
- className: "mt-1 text-sm text-text-secondary",
26
- children: c.loading ? "Loading attendee profile..." : u ? `${u.fullName ?? u.id} profile from registration and attendee APIs.` : "Attendee not found in current query scope."
27
- }),
28
- u ? /* @__PURE__ */ o("div", {
29
- className: "mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4",
30
- children: [
31
- /* @__PURE__ */ o("div", {
32
- className: "rounded-md border border-border-default p-3",
33
- children: [/* @__PURE__ */ a("p", {
34
- className: "text-xs uppercase tracking-wide text-text-secondary",
35
- children: "Name"
36
- }), /* @__PURE__ */ a("p", {
37
- className: "mt-1 font-medium text-text-primary",
38
- children: u.fullName ?? u.id
39
- })]
40
- }),
41
- /* @__PURE__ */ o("div", {
42
- className: "rounded-md border border-border-default p-3",
43
- children: [/* @__PURE__ */ a("p", {
44
- className: "text-xs uppercase tracking-wide text-text-secondary",
45
- children: "Email"
46
- }), /* @__PURE__ */ a("p", {
47
- className: "mt-1 font-medium text-text-primary",
48
- children: u.email ?? "Unavailable"
49
- })]
50
- }),
51
- /* @__PURE__ */ o("div", {
52
- className: "rounded-md border border-border-default p-3",
53
- children: [/* @__PURE__ */ a("p", {
54
- className: "text-xs uppercase tracking-wide text-text-secondary",
55
- children: "Company"
56
- }), /* @__PURE__ */ a("p", {
57
- className: "mt-1 font-medium text-text-primary",
58
- children: u.company ?? "Unavailable"
59
- })]
60
- }),
61
- /* @__PURE__ */ o("div", {
62
- className: "rounded-md border border-border-default p-3",
63
- children: [/* @__PURE__ */ a("p", {
64
- className: "text-xs uppercase tracking-wide text-text-secondary",
65
- children: "Role"
66
- }), /* @__PURE__ */ a("p", {
67
- className: "mt-1 font-medium text-text-primary",
68
- children: u.role ?? "Unavailable"
69
- })]
70
- })
71
- ]
72
- }) : null
73
- ]
74
- }), /* @__PURE__ */ a(n, {
75
- heading: l.loading ? "Loading attendee registrations..." : `Registrations (${d.length})`,
18
+ children: [/* @__PURE__ */ o(s, { children: [
19
+ /* @__PURE__ */ o("h1", {
20
+ className: "text-2xl font-bold text-text-primary",
21
+ children: [/* @__PURE__ */ a(l, { children: "Attendee" }), " Profile"]
22
+ }),
23
+ /* @__PURE__ */ a("p", {
24
+ className: "mt-1 text-sm text-text-secondary",
25
+ children: d.loading ? "Loading attendee profile..." : p ? `${p.fullName ?? p.id} profile from registration and attendee APIs.` : "Attendee not found in current query scope."
26
+ }),
27
+ p ? /* @__PURE__ */ o("div", {
28
+ className: "mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4",
29
+ children: [
30
+ /* @__PURE__ */ o(c, {
31
+ treatment: "metric",
32
+ className: "p-3",
33
+ children: [/* @__PURE__ */ a("p", {
34
+ className: "text-xs uppercase tracking-wide text-text-secondary",
35
+ children: "Name"
36
+ }), /* @__PURE__ */ a("p", {
37
+ className: "mt-1 font-medium text-text-primary",
38
+ children: p.fullName ?? p.id
39
+ })]
40
+ }),
41
+ /* @__PURE__ */ o(c, {
42
+ treatment: "metric",
43
+ className: "p-3",
44
+ children: [/* @__PURE__ */ a("p", {
45
+ className: "text-xs uppercase tracking-wide text-text-secondary",
46
+ children: "Email"
47
+ }), /* @__PURE__ */ a("p", {
48
+ className: "mt-1 font-medium text-text-primary",
49
+ children: p.email ?? "Unavailable"
50
+ })]
51
+ }),
52
+ /* @__PURE__ */ o(c, {
53
+ treatment: "metric",
54
+ className: "p-3",
55
+ children: [/* @__PURE__ */ a("p", {
56
+ className: "text-xs uppercase tracking-wide text-text-secondary",
57
+ children: "Company"
58
+ }), /* @__PURE__ */ a("p", {
59
+ className: "mt-1 font-medium text-text-primary",
60
+ children: p.company ?? "Unavailable"
61
+ })]
62
+ }),
63
+ /* @__PURE__ */ o(c, {
64
+ treatment: "metric",
65
+ className: "p-3",
66
+ children: [/* @__PURE__ */ a("p", {
67
+ className: "text-xs uppercase tracking-wide text-text-secondary",
68
+ children: "Role"
69
+ }), /* @__PURE__ */ a("p", {
70
+ className: "mt-1 font-medium text-text-primary",
71
+ children: p.role ?? "Unavailable"
72
+ })]
73
+ })
74
+ ]
75
+ }) : null
76
+ ] }), /* @__PURE__ */ a(n, {
77
+ heading: f.loading ? "Loading attendee registrations..." : `Registrations (${m.length})`,
76
78
  emptyLabel: "No registrations linked to this attendee.",
77
- rows: d.map((e) => ({
79
+ rows: m.map((e) => ({
78
80
  id: e.id,
79
81
  title: `Registration ${e.id}`,
80
82
  subtitle: [e.quantity ? `Qty ${e.quantity}` : void 0, e.totalAmount ? `${e.totalAmount} ${e.currency ?? ""}` : void 0].filter(Boolean).join(" • "),
@@ -84,6 +86,6 @@ function s() {
84
86
  });
85
87
  }
86
88
  //#endregion
87
- export { s as default };
89
+ export { u as default };
88
90
 
89
91
  //# sourceMappingURL=AttendeeProfilePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AttendeeProfilePage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/AttendeeProfilePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useAttendeesQuery, useRegistrationsQuery } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype AttendeeRow = {\n id: string;\n fullName?: string;\n email?: string;\n company?: string;\n role?: string;\n};\n\ntype RegistrationRow = {\n id: string;\n attendeeId?: string;\n status?: string;\n quantity?: number;\n currency?: string;\n totalAmount?: string;\n};\n\nexport default function AttendeeProfilePage() {\n const { id = '' } = useParams();\n const attendeesQuery = useAttendeesQuery({ limit: 100, offset: 0 });\n const registrationsQuery = useRegistrationsQuery({ limit: 100, offset: 0 });\n\n const attendee = useMemo(\n () => ((attendeesQuery.data?.attendees.items ?? []) as AttendeeRow[]).find((item) => item.id === id),\n [id, attendeesQuery.data]\n );\n const registrations = useMemo(\n () =>\n ((registrationsQuery.data?.registrations.items ?? []) as RegistrationRow[]).filter(\n (registration) => registration.attendeeId === id\n ),\n [id, registrationsQuery.data]\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <section className=\"rounded-lg border border-border-default bg-bg-surface p-5\">\n <h1 className=\"text-2xl font-bold text-text-primary\">Attendee Profile</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {attendeesQuery.loading\n ? 'Loading attendee profile...'\n : attendee\n ? `${attendee.fullName ?? attendee.id} profile from registration and attendee APIs.`\n : 'Attendee not found in current query scope.'}\n </p>\n {attendee ? (\n <div className=\"mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n <div className=\"rounded-md border border-border-default p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Name</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.fullName ?? attendee.id}</p>\n </div>\n <div className=\"rounded-md border border-border-default p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Email</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.email ?? 'Unavailable'}</p>\n </div>\n <div className=\"rounded-md border border-border-default p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Company</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.company ?? 'Unavailable'}</p>\n </div>\n <div className=\"rounded-md border border-border-default p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Role</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.role ?? 'Unavailable'}</p>\n </div>\n </div>\n ) : null}\n </section>\n\n <EntityListSection\n heading={\n registrationsQuery.loading ? 'Loading attendee registrations...' : `Registrations (${registrations.length})`\n }\n emptyLabel=\"No registrations linked to this attendee.\"\n rows={registrations.map((registration) => ({\n id: registration.id,\n title: `Registration ${registration.id}`,\n subtitle: [\n registration.quantity ? `Qty ${registration.quantity}` : undefined,\n registration.totalAmount ? `${registration.totalAmount} ${registration.currency ?? ''}` : undefined,\n ]\n .filter(Boolean)\n .join(' • '),\n status: registration.status,\n }))}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;AAuBA,SAAwB,IAAsB;CAC5C,IAAM,EAAE,QAAK,OAAO,GAAW,EACzB,IAAiB,EAAkB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAC7D,IAAqB,EAAsB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAErE,IAAW,SACP,EAAe,MAAM,UAAU,SAAS,EAAE,EAAoB,MAAM,MAAS,EAAK,OAAO,EAAG,EACpG,CAAC,GAAI,EAAe,KAAK,CAC1B,EACK,IAAgB,SAEhB,EAAmB,MAAM,cAAc,SAAS,EAAE,EAAwB,QACzE,MAAiB,EAAa,eAAe,EAC/C,EACH,CAAC,GAAI,EAAmB,KAAK,CAC9B;AAED,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,WAAD;GAAS,WAAU;aAAnB;IACE,kBAAC,MAAD;KAAI,WAAU;eAAuC;KAAqB,CAAA;IAC1E,kBAAC,KAAD;KAAG,WAAU;eACV,EAAe,UACZ,gCACA,IACE,GAAG,EAAS,YAAY,EAAS,GAAG,iDACpC;KACJ,CAAA;IACH,IACC,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAQ,CAAA,EAC3E,kBAAC,KAAD;QAAG,WAAU;kBAAsC,EAAS,YAAY,EAAS;QAAO,CAAA,CACpF;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAS,CAAA,EAC5E,kBAAC,KAAD;QAAG,WAAU;kBAAsC,EAAS,SAAS;QAAkB,CAAA,CACnF;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAW,CAAA,EAC9E,kBAAC,KAAD;QAAG,WAAU;kBAAsC,EAAS,WAAW;QAAkB,CAAA,CACrF;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsD;QAAQ,CAAA,EAC3E,kBAAC,KAAD;QAAG,WAAU;kBAAsC,EAAS,QAAQ;QAAkB,CAAA,CAClF;;MACF;SACJ;IACI;MAEV,kBAAC,GAAD;GACE,SACE,EAAmB,UAAU,sCAAsC,kBAAkB,EAAc,OAAO;GAE5G,YAAW;GACX,MAAM,EAAc,KAAK,OAAkB;IACzC,IAAI,EAAa;IACjB,OAAO,gBAAgB,EAAa;IACpC,UAAU,CACR,EAAa,WAAW,OAAO,EAAa,aAAa,KAAA,GACzD,EAAa,cAAc,GAAG,EAAa,YAAY,GAAG,EAAa,YAAY,OAAO,KAAA,EAC3F,CACE,OAAO,QAAQ,CACf,KAAK,MAAM;IACd,QAAQ,EAAa;IACtB,EAAE;GACH,CAAA,CACE"}
1
+ {"version":3,"file":"AttendeeProfilePage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/AttendeeProfilePage.tsx"],"sourcesContent":["import { EmphasisPanel, GlassCard, GradientText } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useAttendeesQuery, useRegistrationsQuery } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype AttendeeRow = {\n id: string;\n fullName?: string;\n email?: string;\n company?: string;\n role?: string;\n};\n\ntype RegistrationRow = {\n id: string;\n attendeeId?: string;\n status?: string;\n quantity?: number;\n currency?: string;\n totalAmount?: string;\n};\n\nexport default function AttendeeProfilePage() {\n const { id = '' } = useParams();\n const attendeesQuery = useAttendeesQuery({ limit: 100, offset: 0 });\n const registrationsQuery = useRegistrationsQuery({ limit: 100, offset: 0 });\n\n const attendee = useMemo(\n () => ((attendeesQuery.data?.attendees.items ?? []) as AttendeeRow[]).find((item) => item.id === id),\n [id, attendeesQuery.data]\n );\n const registrations = useMemo(\n () =>\n ((registrationsQuery.data?.registrations.items ?? []) as RegistrationRow[]).filter(\n (registration) => registration.attendeeId === id\n ),\n [id, registrationsQuery.data]\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Attendee</GradientText> Profile\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {attendeesQuery.loading\n ? 'Loading attendee profile...'\n : attendee\n ? `${attendee.fullName ?? attendee.id} profile from registration and attendee APIs.`\n : 'Attendee not found in current query scope.'}\n </p>\n {attendee ? (\n <div className=\"mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Name</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.fullName ?? attendee.id}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Email</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.email ?? 'Unavailable'}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Company</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.company ?? 'Unavailable'}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Role</p>\n <p className=\"mt-1 font-medium text-text-primary\">{attendee.role ?? 'Unavailable'}</p>\n </GlassCard>\n </div>\n ) : null}\n </EmphasisPanel>\n\n <EntityListSection\n heading={\n registrationsQuery.loading ? 'Loading attendee registrations...' : `Registrations (${registrations.length})`\n }\n emptyLabel=\"No registrations linked to this attendee.\"\n rows={registrations.map((registration) => ({\n id: registration.id,\n title: `Registration ${registration.id}`,\n subtitle: [\n registration.quantity ? `Qty ${registration.quantity}` : undefined,\n registration.totalAmount ? `${registration.totalAmount} ${registration.currency ?? ''}` : undefined,\n ]\n .filter(Boolean)\n .join(' • '),\n status: registration.status,\n }))}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;AAwBA,SAAwB,IAAsB;CAC5C,IAAM,EAAE,QAAK,OAAO,GAAW,EACzB,IAAiB,EAAkB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAC7D,IAAqB,EAAsB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAErE,IAAW,SACP,EAAe,MAAM,UAAU,SAAS,EAAE,EAAoB,MAAM,MAAS,EAAK,OAAO,EAAG,EACpG,CAAC,GAAI,EAAe,KAAK,CAC1B,EACK,IAAgB,SAEhB,EAAmB,MAAM,cAAc,SAAS,EAAE,EAAwB,QACzE,MAAiB,EAAa,eAAe,EAC/C,EACH,CAAC,GAAI,EAAmB,KAAK,CAC9B;AAED,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,MAAD;IAAI,WAAU;cAAd,CACE,kBAAC,GAAD,EAAA,UAAc,YAAuB,CAAA,EAAA,WAClC;;GACL,kBAAC,KAAD;IAAG,WAAU;cACV,EAAe,UACZ,gCACA,IACE,GAAG,EAAS,YAAY,EAAS,GAAG,iDACpC;IACJ,CAAA;GACH,IACC,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAQ,CAAA,EAC3E,kBAAC,KAAD;OAAG,WAAU;iBAAsC,EAAS,YAAY,EAAS;OAAO,CAAA,CAC9E;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAS,CAAA,EAC5E,kBAAC,KAAD;OAAG,WAAU;iBAAsC,EAAS,SAAS;OAAkB,CAAA,CAC7E;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAW,CAAA,EAC9E,kBAAC,KAAD;OAAG,WAAU;iBAAsC,EAAS,WAAW;OAAkB,CAAA,CAC/E;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAQ,CAAA,EAC3E,kBAAC,KAAD;OAAG,WAAU;iBAAsC,EAAS,QAAQ;OAAkB,CAAA,CAC5E;;KACR;QACJ;GACU,EAAA,CAAA,EAEhB,kBAAC,GAAD;GACE,SACE,EAAmB,UAAU,sCAAsC,kBAAkB,EAAc,OAAO;GAE5G,YAAW;GACX,MAAM,EAAc,KAAK,OAAkB;IACzC,IAAI,EAAa;IACjB,OAAO,gBAAgB,EAAa;IACpC,UAAU,CACR,EAAa,WAAW,OAAO,EAAa,aAAa,KAAA,GACzD,EAAa,cAAc,GAAG,EAAa,YAAY,GAAG,EAAa,YAAY,OAAO,KAAA,EAC3F,CACE,OAAO,QAAQ,CACf,KAAK,MAAM;IACd,QAAQ,EAAa;IACtB,EAAE;GACH,CAAA,CACE"}