@burdenoff/microfe-eventfullymanaged 2026.625.1 → 2026.703.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 (57) hide show
  1. package/dist/eventfullymanaged/api/eventApi.js +83 -38
  2. package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
  3. package/dist/eventfullymanaged/components/ImageUploadField.js +98 -0
  4. package/dist/eventfullymanaged/components/ImageUploadField.js.map +1 -0
  5. package/dist/eventfullymanaged/lib/mutationResult.js +12 -0
  6. package/dist/eventfullymanaged/lib/mutationResult.js.map +1 -0
  7. package/dist/eventfullymanaged/lib/toast.js +36 -0
  8. package/dist/eventfullymanaged/lib/toast.js.map +1 -0
  9. package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js +88 -47
  10. package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
  11. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +63 -51
  12. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  13. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +137 -78
  14. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
  15. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +56 -45
  16. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
  17. package/dist/eventfullymanaged/pages/modules/EventsPage.js +89 -52
  18. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  19. package/dist/eventfullymanaged/pages/modules/KioskPage.js +11 -10
  20. package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
  21. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +73 -24
  22. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
  23. package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js +135 -105
  24. package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js.map +1 -1
  25. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +63 -33
  26. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
  27. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +132 -77
  28. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
  29. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +54 -23
  30. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
  31. package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js +67 -37
  32. package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js.map +1 -1
  33. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +81 -48
  34. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
  35. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +161 -133
  36. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
  37. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +22 -21
  38. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
  39. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +103 -61
  40. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
  41. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +67 -38
  42. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
  43. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +156 -147
  44. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
  45. package/dist/eventfullymanaged/pages/venues/VenueListPage.js +23 -22
  46. package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
  47. package/dist/node_modules/@apollo/client/react/context/ApolloContext.js.map +1 -1
  48. package/dist/node_modules/@apollo/client/react/hooks/internal/useDeepMemo.js.map +1 -1
  49. package/dist/node_modules/@apollo/client/react/hooks/internal/useIsomorphicLayoutEffect.js.map +1 -1
  50. package/dist/node_modules/@apollo/client/react/hooks/internal/wrapHook.js.map +1 -1
  51. package/dist/node_modules/@apollo/client/react/hooks/useApolloClient.js.map +1 -1
  52. package/dist/node_modules/@apollo/client/react/hooks/useMutation.js.map +1 -1
  53. package/dist/node_modules/@apollo/client/react/hooks/useQuery.js.map +1 -1
  54. package/dist/node_modules/@apollo/client/react/hooks/useSyncExternalStore.js.map +1 -1
  55. package/dist/node_modules/sonner/dist/index.js +163 -0
  56. package/dist/node_modules/sonner/dist/index.js.map +1 -0
  57. package/package.json +2 -2
@@ -1,49 +1,52 @@
1
- import { useAttendeesQuery as e, usePromoCodesQuery as t, useRegistrationsQuery as n } from "../../api/eventApi.js";
2
- import { EntityListSection as r } from "./EntityListSection.js";
3
- import { useMemo as i } from "react";
4
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
- import { useI18n as s } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
6
- import { EmphasisPanel as c, GradientText as l } from "@burdenoff/fe-libs/ui";
1
+ import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
2
+ import { useAttendeesQuery as t, usePromoCodesQuery as n, useRegistrationsQuery as r } from "../../api/eventApi.js";
3
+ import { EntityListSection as i } from "./EntityListSection.js";
4
+ import { useMemo as a } from "react";
5
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
+ import { Megaphone as c, Tag as l, Users as u } from "lucide-react";
7
+ import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
+ import { EmphasisPanel as f, GradientText as p, NextSteps as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
7
9
  //#region src/eventfullymanaged/pages/modules/RegistrationPage.tsx
8
- function u() {
9
- let { t: u } = s(), d = (e, t) => {
10
- let n = u(e);
10
+ function g() {
11
+ let { t: g } = d(), _ = (e, t) => {
12
+ let n = g(e);
11
13
  return n === e ? t : n;
12
- }, f = n({
14
+ }, { navigate: v } = e(), y = r({
13
15
  limit: 100,
14
16
  offset: 0
15
- }), p = e({
17
+ }), b = t({
16
18
  limit: 100,
17
19
  offset: 0
18
- }), m = t({
20
+ }), x = n({
19
21
  limit: 100,
20
22
  offset: 0
21
- }), h = i(() => f.data?.registrations.items ?? [], [f.data]), g = i(() => p.data?.attendees.items ?? [], [p.data]), _ = i(() => m.data?.promoCodes.items ?? [], [m.data]);
22
- return /* @__PURE__ */ o("div", {
23
+ }), S = a(() => y.data?.registrations.items ?? [], [y.data]), C = a(() => b.data?.attendees.items ?? [], [b.data]), w = a(() => x.data?.promoCodes.items ?? [], [x.data]);
24
+ return /* @__PURE__ */ s("div", {
23
25
  className: "space-y-6 p-6",
24
26
  children: [
25
- /* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a("h1", {
27
+ /* @__PURE__ */ o(h, { children: _("eventfullymanaged.registration.purpose", "This is where you see who is coming. Registrations are the paid or confirmed sign-ups, attendees are the people behind them, and promo codes let you offer discounts. Use this page to monitor sign-up volume, look up an attendee, and check that your discount codes are working.") }),
28
+ /* @__PURE__ */ s(f, { children: [/* @__PURE__ */ o("h1", {
26
29
  className: "text-2xl font-bold text-text-primary",
27
- children: /* @__PURE__ */ a(l, { children: d("eventfullymanaged.registration.title", "Registration") })
28
- }), /* @__PURE__ */ a("p", {
30
+ children: /* @__PURE__ */ o(p, { children: _("eventfullymanaged.registration.title", "Registration") })
31
+ }), /* @__PURE__ */ o("p", {
29
32
  className: "mt-1 text-sm text-text-secondary",
30
- children: d("eventfullymanaged.registration.description", "Track registrations and attendee profiles via backend GraphQL APIs.")
33
+ children: _("eventfullymanaged.registration.description", "Track registrations and attendee profiles via backend GraphQL APIs.")
31
34
  })] }),
32
- /* @__PURE__ */ a(r, {
33
- heading: f.loading ? d("eventfullymanaged.registration.registrations.loading", "Loading registrations...") : `${d("eventfullymanaged.registration.registrations.heading", "Registrations")} (${h.length})`,
34
- emptyLabel: d("eventfullymanaged.registration.registrations.empty", "No registrations found."),
35
- rows: h.map((e) => ({
35
+ /* @__PURE__ */ o(i, {
36
+ heading: y.loading ? _("eventfullymanaged.registration.registrations.loading", "Loading registrations...") : `${_("eventfullymanaged.registration.registrations.heading", "Registrations")} (${S.length})`,
37
+ emptyLabel: _("eventfullymanaged.registration.registrations.empty", "No registrations found."),
38
+ rows: S.map((e) => ({
36
39
  id: e.id,
37
- title: e.attendeeId ? `${d("eventfullymanaged.registration.registrations.attendeePrefix", "Attendee")} ${e.attendeeId}` : `${d("eventfullymanaged.registration.registrations.itemPrefix", "Registration")} ${e.id}`,
38
- subtitle: [e.quantity ? `${d("eventfullymanaged.registration.registrations.quantityPrefix", "Qty")} ${e.quantity}` : void 0, e.totalAmount ? `${e.totalAmount} ${e.currency ?? ""}` : void 0].filter(Boolean).join(" • "),
40
+ title: e.attendeeId ? `${_("eventfullymanaged.registration.registrations.attendeePrefix", "Attendee")} ${e.attendeeId}` : `${_("eventfullymanaged.registration.registrations.itemPrefix", "Registration")} ${e.id}`,
41
+ subtitle: [e.quantity ? `${_("eventfullymanaged.registration.registrations.quantityPrefix", "Qty")} ${e.quantity}` : void 0, e.totalAmount ? `${e.totalAmount} ${e.currency ?? ""}` : void 0].filter(Boolean).join(" • "),
39
42
  status: e.status
40
43
  }))
41
44
  }),
42
- /* @__PURE__ */ a(r, {
43
- heading: p.loading ? d("eventfullymanaged.registration.attendees.loading", "Loading attendees...") : `${d("eventfullymanaged.registration.attendees.heading", "Attendees")} (${g.length})`,
44
- emptyLabel: d("eventfullymanaged.registration.attendees.empty", "No attendees found."),
45
+ /* @__PURE__ */ o(i, {
46
+ heading: b.loading ? _("eventfullymanaged.registration.attendees.loading", "Loading attendees...") : `${_("eventfullymanaged.registration.attendees.heading", "Attendees")} (${C.length})`,
47
+ emptyLabel: _("eventfullymanaged.registration.attendees.empty", "No attendees found."),
45
48
  emptyIllustration: "empty-people",
46
- rows: g.map((e) => ({
49
+ rows: C.map((e) => ({
47
50
  id: e.id,
48
51
  title: e.fullName ?? e.id,
49
52
  subtitle: [
@@ -53,20 +56,47 @@ function u() {
53
56
  ].filter(Boolean).join(" • ")
54
57
  }))
55
58
  }),
56
- /* @__PURE__ */ a(r, {
57
- heading: m.loading ? d("eventfullymanaged.registration.promoCodes.loading", "Loading promo codes...") : `${d("eventfullymanaged.registration.promoCodes.heading", "Promo Codes")} (${_.length})`,
58
- emptyLabel: d("eventfullymanaged.registration.promoCodes.empty", "No promo codes configured."),
59
- rows: _.map((e) => ({
59
+ /* @__PURE__ */ o(i, {
60
+ heading: x.loading ? _("eventfullymanaged.registration.promoCodes.loading", "Loading promo codes...") : `${_("eventfullymanaged.registration.promoCodes.heading", "Promo Codes")} (${w.length})`,
61
+ emptyLabel: _("eventfullymanaged.registration.promoCodes.empty", "No promo codes configured."),
62
+ rows: w.map((e) => ({
60
63
  id: e.id,
61
64
  title: e.code,
62
65
  subtitle: `${e.discountType} ${e.discountValue}`,
63
66
  status: e.isActive ? "active" : "inactive"
64
67
  }))
68
+ }),
69
+ /* @__PURE__ */ o(m, {
70
+ storageKey: "eventfullymanaged-registration",
71
+ title: _("eventfullymanaged.registration.nextSteps.title", "Grow your registrations"),
72
+ steps: [
73
+ {
74
+ id: "view-networking",
75
+ label: _("eventfullymanaged.registration.nextSteps.networking", "Set up attendee networking"),
76
+ description: _("eventfullymanaged.registration.nextSteps.networkingDesc", "Turn registered attendees into connections with matchmaking."),
77
+ icon: /* @__PURE__ */ o(u, { className: "h-4 w-4" }),
78
+ onClick: () => v("/networking")
79
+ },
80
+ {
81
+ id: "promote",
82
+ label: _("eventfullymanaged.registration.nextSteps.promote", "Promote with a campaign"),
83
+ description: _("eventfullymanaged.registration.nextSteps.promoteDesc", "Send reminders and offers to drive more sign-ups."),
84
+ icon: /* @__PURE__ */ o(c, { className: "h-4 w-4" }),
85
+ onClick: () => v("/communication")
86
+ },
87
+ {
88
+ id: "analyze",
89
+ label: _("eventfullymanaged.registration.nextSteps.analyze", "Snapshot your numbers"),
90
+ description: _("eventfullymanaged.registration.nextSteps.analyzeDesc", "Capture an analytics snapshot to track registration trends."),
91
+ icon: /* @__PURE__ */ o(l, { className: "h-4 w-4" }),
92
+ onClick: () => v("/analytics")
93
+ }
94
+ ]
65
95
  })
66
96
  ]
67
97
  });
68
98
  }
69
99
  //#endregion
70
- export { u as default };
100
+ export { g as default };
71
101
 
72
102
  //# sourceMappingURL=RegistrationPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RegistrationPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/RegistrationPage.tsx"],"sourcesContent":["import { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { EmphasisPanel, GradientText } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\n\nimport { useAttendeesQuery, usePromoCodesQuery, useRegistrationsQuery } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype RegistrationRow = {\n id: string;\n attendeeId?: string;\n status?: string;\n quantity?: number;\n currency?: string;\n totalAmount?: string;\n};\n\ntype AttendeeRow = {\n id: string;\n fullName?: string;\n email?: string;\n company?: string;\n role?: string;\n};\n\nexport default function RegistrationPage() {\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 registrationsQuery = useRegistrationsQuery({ limit: 100, offset: 0 });\n const attendeesQuery = useAttendeesQuery({ limit: 100, offset: 0 });\n const promoCodesQuery = usePromoCodesQuery({ limit: 100, offset: 0 });\n\n const registrations = useMemo(\n () => (registrationsQuery.data?.registrations.items ?? []) as RegistrationRow[],\n [registrationsQuery.data]\n );\n const attendees = useMemo(() => (attendeesQuery.data?.attendees.items ?? []) as AttendeeRow[], [attendeesQuery.data]);\n const promoCodes = useMemo(() => promoCodesQuery.data?.promoCodes.items ?? [], [promoCodesQuery.data]);\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>{t('eventfullymanaged.registration.title', 'Registration')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t(\n 'eventfullymanaged.registration.description',\n 'Track registrations and attendee profiles via backend GraphQL APIs.'\n )}\n </p>\n </EmphasisPanel>\n\n <EntityListSection\n heading={\n registrationsQuery.loading\n ? t('eventfullymanaged.registration.registrations.loading', 'Loading registrations...')\n : `${t('eventfullymanaged.registration.registrations.heading', 'Registrations')} (${registrations.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.registrations.empty', 'No registrations found.')}\n rows={registrations.map((row) => ({\n id: row.id,\n title: row.attendeeId\n ? `${t('eventfullymanaged.registration.registrations.attendeePrefix', 'Attendee')} ${row.attendeeId}`\n : `${t('eventfullymanaged.registration.registrations.itemPrefix', 'Registration')} ${row.id}`,\n subtitle: [\n row.quantity\n ? `${t('eventfullymanaged.registration.registrations.quantityPrefix', 'Qty')} ${row.quantity}`\n : undefined,\n row.totalAmount ? `${row.totalAmount} ${row.currency ?? ''}` : undefined,\n ]\n .filter(Boolean)\n .join(' • '),\n status: row.status,\n }))}\n />\n\n <EntityListSection\n heading={\n attendeesQuery.loading\n ? t('eventfullymanaged.registration.attendees.loading', 'Loading attendees...')\n : `${t('eventfullymanaged.registration.attendees.heading', 'Attendees')} (${attendees.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.attendees.empty', 'No attendees found.')}\n emptyIllustration=\"empty-people\"\n rows={attendees.map((row) => ({\n id: row.id,\n title: row.fullName ?? row.id,\n subtitle: [row.email, row.company, row.role].filter(Boolean).join(' • '),\n }))}\n />\n\n <EntityListSection\n heading={\n promoCodesQuery.loading\n ? t('eventfullymanaged.registration.promoCodes.loading', 'Loading promo codes...')\n : `${t('eventfullymanaged.registration.promoCodes.heading', 'Promo Codes')} (${promoCodes.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.promoCodes.empty', 'No promo codes configured.')}\n rows={promoCodes.map((row) => ({\n id: row.id,\n title: row.code,\n subtitle: `${row.discountType} ${row.discountValue}`,\n status: row.isActive ? 'active' : 'inactive',\n }))}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;AAwBA,SAAwB,IAAmB;CACzC,IAAM,EAAE,GAAG,MAAc,GAAS,EAC5B,KAAK,GAAa,MAAqB;EAC3C,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;IAE9B,IAAqB,EAAsB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EACrE,IAAiB,EAAkB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAC7D,IAAkB,EAAmB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAE/D,IAAgB,QACb,EAAmB,MAAM,cAAc,SAAS,EAAE,EACzD,CAAC,EAAmB,KAAK,CAC1B,EACK,IAAY,QAAe,EAAe,MAAM,UAAU,SAAS,EAAE,EAAoB,CAAC,EAAe,KAAK,CAAC,EAC/G,IAAa,QAAc,EAAgB,MAAM,WAAW,SAAS,EAAE,EAAE,CAAC,EAAgB,KAAK,CAAC;AAEtG,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cACZ,kBAAC,GAAD,EAAA,UAAe,EAAE,wCAAwC,eAAe,EAAgB,CAAA;IACrF,CAAA,EACL,kBAAC,KAAD;IAAG,WAAU;cACV,EACC,8CACA,sEACD;IACC,CAAA,CACU,EAAA,CAAA;GAEhB,kBAAC,GAAD;IACE,SACE,EAAmB,UACf,EAAE,wDAAwD,2BAA2B,GACrF,GAAG,EAAE,wDAAwD,gBAAgB,CAAC,IAAI,EAAc,OAAO;IAE7G,YAAY,EAAE,sDAAsD,0BAA0B;IAC9F,MAAM,EAAc,KAAK,OAAS;KAChC,IAAI,EAAI;KACR,OAAO,EAAI,aACP,GAAG,EAAE,+DAA+D,WAAW,CAAC,GAAG,EAAI,eACvF,GAAG,EAAE,2DAA2D,eAAe,CAAC,GAAG,EAAI;KAC3F,UAAU,CACR,EAAI,WACA,GAAG,EAAE,+DAA+D,MAAM,CAAC,GAAG,EAAI,aAClF,KAAA,GACJ,EAAI,cAAc,GAAG,EAAI,YAAY,GAAG,EAAI,YAAY,OAAO,KAAA,EAChE,CACE,OAAO,QAAQ,CACf,KAAK,MAAM;KACd,QAAQ,EAAI;KACb,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,SACE,EAAe,UACX,EAAE,oDAAoD,uBAAuB,GAC7E,GAAG,EAAE,oDAAoD,YAAY,CAAC,IAAI,EAAU,OAAO;IAEjG,YAAY,EAAE,kDAAkD,sBAAsB;IACtF,mBAAkB;IAClB,MAAM,EAAU,KAAK,OAAS;KAC5B,IAAI,EAAI;KACR,OAAO,EAAI,YAAY,EAAI;KAC3B,UAAU;MAAC,EAAI;MAAO,EAAI;MAAS,EAAI;MAAK,CAAC,OAAO,QAAQ,CAAC,KAAK,MAAM;KACzE,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,SACE,EAAgB,UACZ,EAAE,qDAAqD,yBAAyB,GAChF,GAAG,EAAE,qDAAqD,cAAc,CAAC,IAAI,EAAW,OAAO;IAErG,YAAY,EAAE,mDAAmD,6BAA6B;IAC9F,MAAM,EAAW,KAAK,OAAS;KAC7B,IAAI,EAAI;KACR,OAAO,EAAI;KACX,UAAU,GAAG,EAAI,aAAa,GAAG,EAAI;KACrC,QAAQ,EAAI,WAAW,WAAW;KACnC,EAAE;IACH,CAAA;GACE"}
1
+ {"version":3,"file":"RegistrationPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/RegistrationPage.tsx"],"sourcesContent":["import { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Megaphone, Tag, Users } from 'lucide-react';\nimport { EmphasisPanel, GradientText, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\n\nimport { useAttendeesQuery, usePromoCodesQuery, useRegistrationsQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { EntityListSection } from './EntityListSection';\n\ntype RegistrationRow = {\n id: string;\n attendeeId?: string;\n status?: string;\n quantity?: number;\n currency?: string;\n totalAmount?: string;\n};\n\ntype AttendeeRow = {\n id: string;\n fullName?: string;\n email?: string;\n company?: string;\n role?: string;\n};\n\nexport default function RegistrationPage() {\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 registrationsQuery = useRegistrationsQuery({ limit: 100, offset: 0 });\n const attendeesQuery = useAttendeesQuery({ limit: 100, offset: 0 });\n const promoCodesQuery = usePromoCodesQuery({ limit: 100, offset: 0 });\n\n const registrations = useMemo(\n () => (registrationsQuery.data?.registrations.items ?? []) as RegistrationRow[],\n [registrationsQuery.data]\n );\n const attendees = useMemo(() => (attendeesQuery.data?.attendees.items ?? []) as AttendeeRow[], [attendeesQuery.data]);\n const promoCodes = useMemo(() => promoCodesQuery.data?.promoCodes.items ?? [], [promoCodesQuery.data]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n {t(\n 'eventfullymanaged.registration.purpose',\n 'This is where you see who is coming. Registrations are the paid or confirmed sign-ups, attendees are the people behind them, and promo codes let you offer discounts. Use this page to monitor sign-up volume, look up an attendee, and check that your discount codes are working.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>{t('eventfullymanaged.registration.title', 'Registration')}</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t(\n 'eventfullymanaged.registration.description',\n 'Track registrations and attendee profiles via backend GraphQL APIs.'\n )}\n </p>\n </EmphasisPanel>\n\n <EntityListSection\n heading={\n registrationsQuery.loading\n ? t('eventfullymanaged.registration.registrations.loading', 'Loading registrations...')\n : `${t('eventfullymanaged.registration.registrations.heading', 'Registrations')} (${registrations.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.registrations.empty', 'No registrations found.')}\n rows={registrations.map((row) => ({\n id: row.id,\n title: row.attendeeId\n ? `${t('eventfullymanaged.registration.registrations.attendeePrefix', 'Attendee')} ${row.attendeeId}`\n : `${t('eventfullymanaged.registration.registrations.itemPrefix', 'Registration')} ${row.id}`,\n subtitle: [\n row.quantity\n ? `${t('eventfullymanaged.registration.registrations.quantityPrefix', 'Qty')} ${row.quantity}`\n : undefined,\n row.totalAmount ? `${row.totalAmount} ${row.currency ?? ''}` : undefined,\n ]\n .filter(Boolean)\n .join(' • '),\n status: row.status,\n }))}\n />\n\n <EntityListSection\n heading={\n attendeesQuery.loading\n ? t('eventfullymanaged.registration.attendees.loading', 'Loading attendees...')\n : `${t('eventfullymanaged.registration.attendees.heading', 'Attendees')} (${attendees.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.attendees.empty', 'No attendees found.')}\n emptyIllustration=\"empty-people\"\n rows={attendees.map((row) => ({\n id: row.id,\n title: row.fullName ?? row.id,\n subtitle: [row.email, row.company, row.role].filter(Boolean).join(' • '),\n }))}\n />\n\n <EntityListSection\n heading={\n promoCodesQuery.loading\n ? t('eventfullymanaged.registration.promoCodes.loading', 'Loading promo codes...')\n : `${t('eventfullymanaged.registration.promoCodes.heading', 'Promo Codes')} (${promoCodes.length})`\n }\n emptyLabel={t('eventfullymanaged.registration.promoCodes.empty', 'No promo codes configured.')}\n rows={promoCodes.map((row) => ({\n id: row.id,\n title: row.code,\n subtitle: `${row.discountType} ${row.discountValue}`,\n status: row.isActive ? 'active' : 'inactive',\n }))}\n />\n\n <NextSteps\n storageKey=\"eventfullymanaged-registration\"\n title={t('eventfullymanaged.registration.nextSteps.title', 'Grow your registrations')}\n steps={[\n {\n id: 'view-networking',\n label: t('eventfullymanaged.registration.nextSteps.networking', 'Set up attendee networking'),\n description: t(\n 'eventfullymanaged.registration.nextSteps.networkingDesc',\n 'Turn registered attendees into connections with matchmaking.'\n ),\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('/networking'),\n },\n {\n id: 'promote',\n label: t('eventfullymanaged.registration.nextSteps.promote', 'Promote with a campaign'),\n description: t(\n 'eventfullymanaged.registration.nextSteps.promoteDesc',\n 'Send reminders and offers to drive more sign-ups.'\n ),\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n {\n id: 'analyze',\n label: t('eventfullymanaged.registration.nextSteps.analyze', 'Snapshot your numbers'),\n description: t(\n 'eventfullymanaged.registration.nextSteps.analyzeDesc',\n 'Capture an analytics snapshot to track registration trends.'\n ),\n icon: <Tag className=\"h-4 w-4\" />,\n onClick: () => navigate('/analytics'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,90 +1,145 @@
1
- import { useCommunicationCampaignsQuery as e, useSponsorsQuery as t } from "../../api/eventApi.js";
2
- import { EntityListSection as n } from "./EntityListSection.js";
3
- import { useMemo as r } from "react";
4
- import { useParams as i } from "react-router-dom";
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";
1
+ import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
2
+ import { useCommunicationCampaignsQuery as t, useSponsorsQuery as n } from "../../api/eventApi.js";
3
+ import { EntityListSection as r } from "./EntityListSection.js";
4
+ import { useMemo as i } from "react";
5
+ import { useParams as a } from "react-router-dom";
6
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
7
+ import { Megaphone as c, Pencil as l, TrendingUp as u } from "lucide-react";
8
+ import { EmphasisPanel as d, GlassCard as f, GradientText as p, NextSteps as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
9
+ import { ContextConversationWidget as g } from "@burdenoff/fe-libs/shared";
10
+ import { useRegisterPageConversationContext as _ } from "@burdenoff/fe-libs/shared/providers/shell";
7
11
  //#region src/eventfullymanaged/pages/modules/SponsorDetailsPage.tsx
8
- function u() {
9
- let { id: u = "" } = i(), d = t({
12
+ function v({ sponsorId: e, sponsorName: t }) {
13
+ return _({
14
+ entityType: "EVENTFULLYMANAGED_SPONSOR",
15
+ entityId: e,
16
+ contextTitle: `Sponsor · ${t}`
17
+ }), /* @__PURE__ */ o(g, { widgetKey: "sponsor-message" });
18
+ }
19
+ function y() {
20
+ let { id: g = "" } = a(), { navigate: _ } = e(), y = n({
10
21
  limit: 100,
11
22
  offset: 0
12
- }), f = e({
23
+ }), b = t({
13
24
  limit: 100,
14
25
  offset: 0
15
- }), p = r(() => (d.data?.sponsors.items ?? []).find((e) => e.id === u), [u, d.data]), m = r(() => f.data?.communicationCampaigns.items ?? [], [f.data]);
16
- return /* @__PURE__ */ o("div", {
26
+ }), x = i(() => (y.data?.sponsors.items ?? []).find((e) => e.id === g), [g, y.data]), S = i(() => b.data?.communicationCampaigns.items ?? [], [b.data]);
27
+ return /* @__PURE__ */ s("div", {
17
28
  className: "space-y-6 p-6",
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: "Sponsor" }), " Details"]
22
- }),
23
- /* @__PURE__ */ a("p", {
24
- className: "mt-1 text-sm text-text-secondary",
25
- children: d.loading ? "Loading sponsor details..." : p ? `Live sponsor profile for ${p.name}.` : "Sponsor not found in current query scope."
29
+ children: [
30
+ /* @__PURE__ */ o(h, { children: "Everything about one sponsor in one place — their tier, contacts, and the campaigns they appear in. Use this to prep for a sponsor conversation, confirm their contact details, or check how their branded campaigns are performing." }),
31
+ /* @__PURE__ */ s(d, { children: [
32
+ /* @__PURE__ */ s("h1", {
33
+ className: "text-2xl font-bold text-text-primary",
34
+ children: [/* @__PURE__ */ o(p, { children: "Sponsor" }), " Details"]
35
+ }),
36
+ /* @__PURE__ */ o("p", {
37
+ className: "mt-1 text-sm text-text-secondary",
38
+ children: y.loading ? "Loading sponsor details..." : x ? `Live sponsor profile for ${x.name}.` : "Sponsor not found in current query scope."
39
+ }),
40
+ x ? /* @__PURE__ */ s("div", {
41
+ className: "mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4",
42
+ children: [
43
+ /* @__PURE__ */ s(f, {
44
+ treatment: "metric",
45
+ className: "p-3",
46
+ children: [/* @__PURE__ */ o("p", {
47
+ className: "text-xs uppercase tracking-wide text-text-secondary",
48
+ children: "Level"
49
+ }), /* @__PURE__ */ o("p", {
50
+ className: "mt-1 font-medium text-text-primary",
51
+ children: x.level
52
+ })]
53
+ }),
54
+ /* @__PURE__ */ s(f, {
55
+ treatment: "metric",
56
+ className: "p-3",
57
+ children: [/* @__PURE__ */ o("p", {
58
+ className: "text-xs uppercase tracking-wide text-text-secondary",
59
+ children: "Contact"
60
+ }), /* @__PURE__ */ o("p", {
61
+ className: "mt-1 font-medium text-text-primary",
62
+ children: x.contactName ?? "Unassigned"
63
+ })]
64
+ }),
65
+ /* @__PURE__ */ s(f, {
66
+ treatment: "metric",
67
+ className: "p-3",
68
+ children: [/* @__PURE__ */ o("p", {
69
+ className: "text-xs uppercase tracking-wide text-text-secondary",
70
+ children: "Email"
71
+ }), /* @__PURE__ */ o("p", {
72
+ className: "mt-1 font-medium text-text-primary",
73
+ children: x.contactEmail ?? "Unavailable"
74
+ })]
75
+ }),
76
+ /* @__PURE__ */ s(f, {
77
+ treatment: "metric",
78
+ className: "p-3",
79
+ children: [/* @__PURE__ */ o("p", {
80
+ className: "text-xs uppercase tracking-wide text-text-secondary",
81
+ children: "Website"
82
+ }), /* @__PURE__ */ o("p", {
83
+ className: "mt-1 truncate font-medium text-text-primary",
84
+ children: x.website ?? "Unavailable"
85
+ })]
86
+ })
87
+ ]
88
+ }) : null
89
+ ] }),
90
+ /* @__PURE__ */ o(r, {
91
+ heading: b.loading ? "Loading campaigns..." : `Campaign Activity (${S.length})`,
92
+ emptyLabel: "No communication campaigns available for sponsor tracking.",
93
+ rows: S.map((e) => ({
94
+ id: e.id,
95
+ title: e.title ?? e.name ?? `Campaign ${e.id}`,
96
+ status: e.status
97
+ }))
26
98
  }),
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: "Level"
36
- }), /* @__PURE__ */ a("p", {
37
- className: "mt-1 font-medium text-text-primary",
38
- children: p.level
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: "Contact"
47
- }), /* @__PURE__ */ a("p", {
48
- className: "mt-1 font-medium text-text-primary",
49
- children: p.contactName ?? "Unassigned"
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: "Email"
58
- }), /* @__PURE__ */ a("p", {
59
- className: "mt-1 font-medium text-text-primary",
60
- children: p.contactEmail ?? "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: "Website"
69
- }), /* @__PURE__ */ a("p", {
70
- className: "mt-1 truncate font-medium text-text-primary",
71
- children: p.website ?? "Unavailable"
72
- })]
73
- })
99
+ x ? /* @__PURE__ */ s("div", {
100
+ className: "space-y-3",
101
+ children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h2", {
102
+ className: "text-lg font-semibold text-text-primary",
103
+ children: "Sponsor messages"
104
+ }), /* @__PURE__ */ o("p", {
105
+ className: "mt-1 text-sm text-text-secondary",
106
+ children: "Coordinate with this sponsor in a dedicated thread, backed by the conversations service."
107
+ })] }), /* @__PURE__ */ o(v, {
108
+ sponsorId: x.id,
109
+ sponsorName: x.name
110
+ })]
111
+ }) : null,
112
+ /* @__PURE__ */ o(m, {
113
+ storageKey: "eventfullymanaged-sponsor-details",
114
+ title: "Grow this partnership",
115
+ steps: [
116
+ {
117
+ id: "edit-sponsor",
118
+ label: "Update sponsor details",
119
+ description: "Keep tier, contacts and contract value current.",
120
+ icon: /* @__PURE__ */ o(l, { className: "h-4 w-4" }),
121
+ onClick: () => _(g ? `/sponsors/${g}/edit` : "/sponsors")
122
+ },
123
+ {
124
+ id: "track-leads",
125
+ label: "Track sponsor leads",
126
+ description: "See the leads this sponsor is generating at the event.",
127
+ icon: /* @__PURE__ */ o(u, { className: "h-4 w-4" }),
128
+ onClick: () => _(g ? `/sponsors/${g}/leads` : "/sponsors")
129
+ },
130
+ {
131
+ id: "run-campaign",
132
+ label: "Run a co-branded campaign",
133
+ description: "Promote this sponsor through a communication campaign.",
134
+ icon: /* @__PURE__ */ o(c, { className: "h-4 w-4" }),
135
+ onClick: () => _("/communication")
136
+ }
74
137
  ]
75
- }) : null
76
- ] }), /* @__PURE__ */ a(n, {
77
- heading: f.loading ? "Loading campaigns..." : `Campaign Activity (${m.length})`,
78
- emptyLabel: "No communication campaigns available for sponsor tracking.",
79
- rows: m.map((e) => ({
80
- id: e.id,
81
- title: e.title ?? e.name ?? `Campaign ${e.id}`,
82
- status: e.status
83
- }))
84
- })]
138
+ })
139
+ ]
85
140
  });
86
141
  }
87
142
  //#endregion
88
- export { u as default };
143
+ export { y as default };
89
144
 
90
145
  //# sourceMappingURL=SponsorDetailsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SponsorDetailsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/SponsorDetailsPage.tsx"],"sourcesContent":["import { EmphasisPanel, GlassCard, GradientText } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useCommunicationCampaignsQuery, useSponsorsQuery } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype SponsorRow = {\n id: string;\n name: string;\n level: string;\n website?: string | null;\n contactName?: string | null;\n contactEmail?: string | null;\n};\n\ntype CampaignRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function SponsorDetailsPage() {\n const { id = '' } = useParams();\n const sponsorsQuery = useSponsorsQuery({ limit: 100, offset: 0 });\n const campaignsQuery = useCommunicationCampaignsQuery({ limit: 100, offset: 0 });\n\n const sponsor = useMemo(\n () => ((sponsorsQuery.data?.sponsors.items ?? []) as SponsorRow[]).find((item) => item.id === id),\n [id, sponsorsQuery.data]\n );\n const campaigns = useMemo(\n () => (campaignsQuery.data?.communicationCampaigns.items ?? []) as CampaignRow[],\n [campaignsQuery.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>Sponsor</GradientText> Details\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {sponsorsQuery.loading\n ? 'Loading sponsor details...'\n : sponsor\n ? `Live sponsor profile for ${sponsor.name}.`\n : 'Sponsor not found in current query scope.'}\n </p>\n {sponsor ? (\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\">Level</p>\n <p className=\"mt-1 font-medium text-text-primary\">{sponsor.level}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Contact</p>\n <p className=\"mt-1 font-medium text-text-primary\">{sponsor.contactName ?? 'Unassigned'}</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\">{sponsor.contactEmail ?? 'Unavailable'}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Website</p>\n <p className=\"mt-1 truncate font-medium text-text-primary\">{sponsor.website ?? 'Unavailable'}</p>\n </GlassCard>\n </div>\n ) : null}\n </EmphasisPanel>\n\n <EntityListSection\n heading={campaignsQuery.loading ? 'Loading campaigns...' : `Campaign Activity (${campaigns.length})`}\n emptyLabel=\"No communication campaigns available for sponsor tracking.\"\n rows={campaigns.map((campaign) => ({\n id: campaign.id,\n title: campaign.title ?? campaign.name ?? `Campaign ${campaign.id}`,\n status: campaign.status,\n }))}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;AAuBA,SAAwB,IAAqB;CAC3C,IAAM,EAAE,QAAK,OAAO,GAAW,EACzB,IAAgB,EAAiB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAC3D,IAAiB,EAA+B;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAE1E,IAAU,SACN,EAAc,MAAM,SAAS,SAAS,EAAE,EAAmB,MAAM,MAAS,EAAK,OAAO,EAAG,EACjG,CAAC,GAAI,EAAc,KAAK,CACzB,EACK,IAAY,QACT,EAAe,MAAM,uBAAuB,SAAS,EAAE,EAC9D,CAAC,EAAe,KAAK,CACtB;AAED,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,MAAD;IAAI,WAAU;cAAd,CACE,kBAAC,GAAD,EAAA,UAAc,WAAsB,CAAA,EAAA,WACjC;;GACL,kBAAC,KAAD;IAAG,WAAU;cACV,EAAc,UACX,+BACA,IACE,4BAA4B,EAAQ,KAAK,KACzC;IACJ,CAAA;GACH,IACC,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAS,CAAA,EAC5E,kBAAC,KAAD;OAAG,WAAU;iBAAsC,EAAQ;OAAU,CAAA,CAC3D;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAW,CAAA,EAC9E,kBAAC,KAAD;OAAG,WAAU;iBAAsC,EAAQ,eAAe;OAAiB,CAAA,CACjF;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAS,CAAA,EAC5E,kBAAC,KAAD;OAAG,WAAU;iBAAsC,EAAQ,gBAAgB;OAAkB,CAAA,CACnF;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsD;OAAW,CAAA,EAC9E,kBAAC,KAAD;OAAG,WAAU;iBAA+C,EAAQ,WAAW;OAAkB,CAAA,CACvF;;KACR;QACJ;GACU,EAAA,CAAA,EAEhB,kBAAC,GAAD;GACE,SAAS,EAAe,UAAU,yBAAyB,sBAAsB,EAAU,OAAO;GAClG,YAAW;GACX,MAAM,EAAU,KAAK,OAAc;IACjC,IAAI,EAAS;IACb,OAAO,EAAS,SAAS,EAAS,QAAQ,YAAY,EAAS;IAC/D,QAAQ,EAAS;IAClB,EAAE;GACH,CAAA,CACE"}
1
+ {"version":3,"file":"SponsorDetailsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/SponsorDetailsPage.tsx"],"sourcesContent":["import { Megaphone, Pencil, TrendingUp } from 'lucide-react';\nimport { ContextConversationWidget } from '@burdenoff/fe-libs/shared';\nimport { useRegisterPageConversationContext } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { EmphasisPanel, GlassCard, GradientText, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useCommunicationCampaignsQuery, useSponsorsQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { EntityListSection } from './EntityListSection';\n\n/**\n * Sponsor ↔ organizer message thread, backed by wspace-conversations-svc and\n * scoped to this sponsor so the conversation follows the partnership.\n */\nfunction SponsorConversation({ sponsorId, sponsorName }: { sponsorId: string; sponsorName: string }) {\n useRegisterPageConversationContext({\n entityType: 'EVENTFULLYMANAGED_SPONSOR',\n entityId: sponsorId,\n contextTitle: `Sponsor · ${sponsorName}`,\n });\n return <ContextConversationWidget widgetKey=\"sponsor-message\" />;\n}\n\ntype SponsorRow = {\n id: string;\n name: string;\n level: string;\n website?: string | null;\n contactName?: string | null;\n contactEmail?: string | null;\n};\n\ntype CampaignRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function SponsorDetailsPage() {\n const { id = '' } = useParams();\n const { navigate } = useEventfullyManaged();\n const sponsorsQuery = useSponsorsQuery({ limit: 100, offset: 0 });\n const campaignsQuery = useCommunicationCampaignsQuery({ limit: 100, offset: 0 });\n\n const sponsor = useMemo(\n () => ((sponsorsQuery.data?.sponsors.items ?? []) as SponsorRow[]).find((item) => item.id === id),\n [id, sponsorsQuery.data]\n );\n const campaigns = useMemo(\n () => (campaignsQuery.data?.communicationCampaigns.items ?? []) as CampaignRow[],\n [campaignsQuery.data]\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n Everything about one sponsor in one place — their tier, contacts, and the campaigns they appear in. Use this to\n prep for a sponsor conversation, confirm their contact details, or check how their branded campaigns are\n performing.\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Sponsor</GradientText> Details\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {sponsorsQuery.loading\n ? 'Loading sponsor details...'\n : sponsor\n ? `Live sponsor profile for ${sponsor.name}.`\n : 'Sponsor not found in current query scope.'}\n </p>\n {sponsor ? (\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\">Level</p>\n <p className=\"mt-1 font-medium text-text-primary\">{sponsor.level}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Contact</p>\n <p className=\"mt-1 font-medium text-text-primary\">{sponsor.contactName ?? 'Unassigned'}</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\">{sponsor.contactEmail ?? 'Unavailable'}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-3\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">Website</p>\n <p className=\"mt-1 truncate font-medium text-text-primary\">{sponsor.website ?? 'Unavailable'}</p>\n </GlassCard>\n </div>\n ) : null}\n </EmphasisPanel>\n\n <EntityListSection\n heading={campaignsQuery.loading ? 'Loading campaigns...' : `Campaign Activity (${campaigns.length})`}\n emptyLabel=\"No communication campaigns available for sponsor tracking.\"\n rows={campaigns.map((campaign) => ({\n id: campaign.id,\n title: campaign.title ?? campaign.name ?? `Campaign ${campaign.id}`,\n status: campaign.status,\n }))}\n />\n\n {sponsor ? (\n <div className=\"space-y-3\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">Sponsor messages</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Coordinate with this sponsor in a dedicated thread, backed by the conversations service.\n </p>\n </div>\n <SponsorConversation sponsorId={sponsor.id} sponsorName={sponsor.name} />\n </div>\n ) : null}\n\n <NextSteps\n storageKey=\"eventfullymanaged-sponsor-details\"\n title=\"Grow this partnership\"\n steps={[\n {\n id: 'edit-sponsor',\n label: 'Update sponsor details',\n description: 'Keep tier, contacts and contract value current.',\n icon: <Pencil className=\"h-4 w-4\" />,\n onClick: () => navigate(id ? `/sponsors/${id}/edit` : '/sponsors'),\n },\n {\n id: 'track-leads',\n label: 'Track sponsor leads',\n description: 'See the leads this sponsor is generating at the event.',\n icon: <TrendingUp className=\"h-4 w-4\" />,\n onClick: () => navigate(id ? `/sponsors/${id}/leads` : '/sponsors'),\n },\n {\n id: 'run-campaign',\n label: 'Run a co-branded campaign',\n description: 'Promote this sponsor through a communication campaign.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,53 +1,84 @@
1
- import { useMeetingsQuery as e, useNetworkingMatchesQuery as t, useSponsorsQuery as n } from "../../api/eventApi.js";
2
- import { EntityListSection as r } from "./EntityListSection.js";
3
- import { useMemo as i } from "react";
4
- import { useParams as a } from "react-router-dom";
5
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
- import { EmphasisPanel as c, GradientText as l } from "@burdenoff/fe-libs/ui";
1
+ import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
2
+ import { useMeetingsQuery as t, useNetworkingMatchesQuery as n, useSponsorsQuery as r } from "../../api/eventApi.js";
3
+ import { EntityListSection as i } from "./EntityListSection.js";
4
+ import { useMemo as a } from "react";
5
+ import { useParams as o } from "react-router-dom";
6
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
+ import { Megaphone as l, User as u, Users as d } from "lucide-react";
8
+ import { EmphasisPanel as f, GradientText as p, NextSteps as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
7
9
  //#region src/eventfullymanaged/pages/modules/SponsorLeadsPage.tsx
8
- function u() {
9
- let { id: u = "" } = a(), d = n({
10
+ function g() {
11
+ let { id: g = "" } = o(), { navigate: _ } = e(), v = r({
10
12
  limit: 100,
11
13
  offset: 0
12
- }), f = t({
14
+ }), y = n({
13
15
  limit: 100,
14
16
  offset: 0
15
- }), p = e({
17
+ }), b = t({
16
18
  limit: 100,
17
19
  offset: 0
18
- }), m = i(() => (d.data?.sponsors.items ?? []).find((e) => e.id === u), [u, d.data]), h = i(() => f.data?.networkingMatches.items ?? [], [f.data]), g = i(() => p.data?.meetings.items ?? [], [p.data]);
19
- return /* @__PURE__ */ s("div", {
20
+ }), x = a(() => (v.data?.sponsors.items ?? []).find((e) => e.id === g), [g, v.data]), S = a(() => y.data?.networkingMatches.items ?? [], [y.data]), C = a(() => b.data?.meetings.items ?? [], [b.data]);
21
+ return /* @__PURE__ */ c("div", {
20
22
  className: "space-y-6 p-6",
21
23
  children: [
22
- /* @__PURE__ */ s(c, { children: [/* @__PURE__ */ s("h1", {
24
+ /* @__PURE__ */ s(h, { children: "The return on a sponsorship is the people it puts in front of the sponsor. This page pulls together the potential leads (from networking matches) and the booked sponsor meetings for one sponsor, so you can show them exactly who they met and why their investment paid off." }),
25
+ /* @__PURE__ */ c(f, { children: [/* @__PURE__ */ c("h1", {
23
26
  className: "text-2xl font-bold text-text-primary",
24
- children: [/* @__PURE__ */ o(l, { children: "Sponsor" }), " Leads"]
25
- }), /* @__PURE__ */ o("p", {
27
+ children: [/* @__PURE__ */ s(p, { children: "Sponsor" }), " Leads"]
28
+ }), /* @__PURE__ */ s("p", {
26
29
  className: "mt-1 text-sm text-text-secondary",
27
- children: m ? `${m.name} lead funnel sourced from networking and meeting streams.` : "Lead funnel sourced from networking and meeting streams."
30
+ children: x ? `${x.name} lead funnel sourced from networking and meeting streams.` : "Lead funnel sourced from networking and meeting streams."
28
31
  })] }),
29
- /* @__PURE__ */ o(r, {
30
- heading: f.loading ? "Loading networking matches..." : `Potential Leads (${h.length})`,
32
+ /* @__PURE__ */ s(i, {
33
+ heading: y.loading ? "Loading networking matches..." : `Potential Leads (${S.length})`,
31
34
  emptyLabel: "No networking leads found.",
32
- rows: h.map((e) => ({
35
+ emptyIllustration: "empty-people",
36
+ rows: S.map((e) => ({
33
37
  id: e.id,
34
38
  title: e.title ?? e.name ?? `Lead ${e.id}`,
35
39
  status: e.status
36
40
  }))
37
41
  }),
38
- /* @__PURE__ */ o(r, {
39
- heading: p.loading ? "Loading meetings..." : `Sponsor Meetings (${g.length})`,
42
+ /* @__PURE__ */ s(i, {
43
+ heading: b.loading ? "Loading meetings..." : `Sponsor Meetings (${C.length})`,
40
44
  emptyLabel: "No sponsor meetings recorded.",
41
- rows: g.map((e) => ({
45
+ rows: C.map((e) => ({
42
46
  id: e.id,
43
47
  title: e.title ?? e.name ?? `Meeting ${e.id}`,
44
48
  status: e.status
45
49
  }))
50
+ }),
51
+ /* @__PURE__ */ s(m, {
52
+ storageKey: "eventfullymanaged-sponsor-leads",
53
+ title: "Turn leads into wins",
54
+ steps: [
55
+ {
56
+ id: "sponsor-profile",
57
+ label: "Back to sponsor profile",
58
+ description: "Review this sponsor’s tier, contacts and contract value.",
59
+ icon: /* @__PURE__ */ s(u, { className: "h-4 w-4" }),
60
+ onClick: () => _(g ? `/sponsors/${g}` : "/sponsors")
61
+ },
62
+ {
63
+ id: "boost-networking",
64
+ label: "Boost networking",
65
+ description: "Improve matchmaking so sponsors meet more of the right people.",
66
+ icon: /* @__PURE__ */ s(d, { className: "h-4 w-4" }),
67
+ onClick: () => _("/networking")
68
+ },
69
+ {
70
+ id: "follow-up",
71
+ label: "Follow up with attendees",
72
+ description: "Send a campaign to nurture the leads after the event.",
73
+ icon: /* @__PURE__ */ s(l, { className: "h-4 w-4" }),
74
+ onClick: () => _("/communication")
75
+ }
76
+ ]
46
77
  })
47
78
  ]
48
79
  });
49
80
  }
50
81
  //#endregion
51
- export { u as default };
82
+ export { g as default };
52
83
 
53
84
  //# sourceMappingURL=SponsorLeadsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SponsorLeadsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/SponsorLeadsPage.tsx"],"sourcesContent":["import { EmphasisPanel, GradientText } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useMeetingsQuery, useNetworkingMatchesQuery, useSponsorsQuery } from '../../api/eventApi';\nimport { EntityListSection } from './EntityListSection';\n\ntype SponsorRow = {\n id: string;\n name: string;\n level: string;\n};\n\ntype SimpleRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function SponsorLeadsPage() {\n const { id = '' } = useParams();\n const sponsorsQuery = useSponsorsQuery({ limit: 100, offset: 0 });\n const matchesQuery = useNetworkingMatchesQuery({ limit: 100, offset: 0 });\n const meetingsQuery = useMeetingsQuery({ limit: 100, offset: 0 });\n\n const sponsor = useMemo(\n () => ((sponsorsQuery.data?.sponsors.items ?? []) as SponsorRow[]).find((item) => item.id === id),\n [id, sponsorsQuery.data]\n );\n const matches = useMemo(() => (matchesQuery.data?.networkingMatches.items ?? []) as SimpleRow[], [matchesQuery.data]);\n const meetings = useMemo(() => (meetingsQuery.data?.meetings.items ?? []) as SimpleRow[], [meetingsQuery.data]);\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>Sponsor</GradientText> Leads\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {sponsor\n ? `${sponsor.name} lead funnel sourced from networking and meeting streams.`\n : 'Lead funnel sourced from networking and meeting streams.'}\n </p>\n </EmphasisPanel>\n\n <EntityListSection\n heading={matchesQuery.loading ? 'Loading networking matches...' : `Potential Leads (${matches.length})`}\n emptyLabel=\"No networking leads found.\"\n rows={matches.map((match) => ({\n id: match.id,\n title: match.title ?? match.name ?? `Lead ${match.id}`,\n status: match.status,\n }))}\n />\n\n <EntityListSection\n heading={meetingsQuery.loading ? 'Loading meetings...' : `Sponsor Meetings (${meetings.length})`}\n emptyLabel=\"No sponsor meetings recorded.\"\n rows={meetings.map((meeting) => ({\n id: meeting.id,\n title: meeting.title ?? meeting.name ?? `Meeting ${meeting.id}`,\n status: meeting.status,\n }))}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;AAoBA,SAAwB,IAAmB;CACzC,IAAM,EAAE,QAAK,OAAO,GAAW,EACzB,IAAgB,EAAiB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAC3D,IAAe,EAA0B;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EACnE,IAAgB,EAAiB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAE3D,IAAU,SACN,EAAc,MAAM,SAAS,SAAS,EAAE,EAAmB,MAAM,MAAS,EAAK,OAAO,EAAG,EACjG,CAAC,GAAI,EAAc,KAAK,CACzB,EACK,IAAU,QAAe,EAAa,MAAM,kBAAkB,SAAS,EAAE,EAAkB,CAAC,EAAa,KAAK,CAAC,EAC/G,IAAW,QAAe,EAAc,MAAM,SAAS,SAAS,EAAE,EAAkB,CAAC,EAAc,KAAK,CAAC;AAE/G,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAd,CACE,kBAAC,GAAD,EAAA,UAAc,WAAsB,CAAA,EAAA,SACjC;OACL,kBAAC,KAAD;IAAG,WAAU;cACV,IACG,GAAG,EAAQ,KAAK,6DAChB;IACF,CAAA,CACU,EAAA,CAAA;GAEhB,kBAAC,GAAD;IACE,SAAS,EAAa,UAAU,kCAAkC,oBAAoB,EAAQ,OAAO;IACrG,YAAW;IACX,MAAM,EAAQ,KAAK,OAAW;KAC5B,IAAI,EAAM;KACV,OAAO,EAAM,SAAS,EAAM,QAAQ,QAAQ,EAAM;KAClD,QAAQ,EAAM;KACf,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,SAAS,EAAc,UAAU,wBAAwB,qBAAqB,EAAS,OAAO;IAC9F,YAAW;IACX,MAAM,EAAS,KAAK,OAAa;KAC/B,IAAI,EAAQ;KACZ,OAAO,EAAQ,SAAS,EAAQ,QAAQ,WAAW,EAAQ;KAC3D,QAAQ,EAAQ;KACjB,EAAE;IACH,CAAA;GACE"}
1
+ {"version":3,"file":"SponsorLeadsPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/modules/SponsorLeadsPage.tsx"],"sourcesContent":["import { Megaphone, User, Users } from 'lucide-react';\nimport { EmphasisPanel, GradientText, NextSteps, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useMeetingsQuery, useNetworkingMatchesQuery, useSponsorsQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { EntityListSection } from './EntityListSection';\n\ntype SponsorRow = {\n id: string;\n name: string;\n level: string;\n};\n\ntype SimpleRow = {\n id: string;\n name?: string;\n title?: string;\n status?: string;\n};\n\nexport default function SponsorLeadsPage() {\n const { id = '' } = useParams();\n const { navigate } = useEventfullyManaged();\n const sponsorsQuery = useSponsorsQuery({ limit: 100, offset: 0 });\n const matchesQuery = useNetworkingMatchesQuery({ limit: 100, offset: 0 });\n const meetingsQuery = useMeetingsQuery({ limit: 100, offset: 0 });\n\n const sponsor = useMemo(\n () => ((sponsorsQuery.data?.sponsors.items ?? []) as SponsorRow[]).find((item) => item.id === id),\n [id, sponsorsQuery.data]\n );\n const matches = useMemo(() => (matchesQuery.data?.networkingMatches.items ?? []) as SimpleRow[], [matchesQuery.data]);\n const meetings = useMemo(() => (meetingsQuery.data?.meetings.items ?? []) as SimpleRow[], [meetingsQuery.data]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n The return on a sponsorship is the people it puts in front of the sponsor. This page pulls together the\n potential leads (from networking matches) and the booked sponsor meetings for one sponsor, so you can show them\n exactly who they met and why their investment paid off.\n </PagePurpose>\n\n <EmphasisPanel>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>Sponsor</GradientText> Leads\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {sponsor\n ? `${sponsor.name} lead funnel sourced from networking and meeting streams.`\n : 'Lead funnel sourced from networking and meeting streams.'}\n </p>\n </EmphasisPanel>\n\n <EntityListSection\n heading={matchesQuery.loading ? 'Loading networking matches...' : `Potential Leads (${matches.length})`}\n emptyLabel=\"No networking leads found.\"\n emptyIllustration=\"empty-people\"\n rows={matches.map((match) => ({\n id: match.id,\n title: match.title ?? match.name ?? `Lead ${match.id}`,\n status: match.status,\n }))}\n />\n\n <EntityListSection\n heading={meetingsQuery.loading ? 'Loading meetings...' : `Sponsor Meetings (${meetings.length})`}\n emptyLabel=\"No sponsor meetings recorded.\"\n rows={meetings.map((meeting) => ({\n id: meeting.id,\n title: meeting.title ?? meeting.name ?? `Meeting ${meeting.id}`,\n status: meeting.status,\n }))}\n />\n\n <NextSteps\n storageKey=\"eventfullymanaged-sponsor-leads\"\n title=\"Turn leads into wins\"\n steps={[\n {\n id: 'sponsor-profile',\n label: 'Back to sponsor profile',\n description: 'Review this sponsor’s tier, contacts and contract value.',\n icon: <User className=\"h-4 w-4\" />,\n onClick: () => navigate(id ? `/sponsors/${id}` : '/sponsors'),\n },\n {\n id: 'boost-networking',\n label: 'Boost networking',\n description: 'Improve matchmaking so sponsors meet more of the right people.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('/networking'),\n },\n {\n id: 'follow-up',\n label: 'Follow up with attendees',\n description: 'Send a campaign to nurture the leads after the event.',\n icon: <Megaphone className=\"h-4 w-4\" />,\n onClick: () => navigate('/communication'),\n },\n ]}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAsBA,SAAwB,IAAmB;CACzC,IAAM,EAAE,QAAK,OAAO,GAAW,EACzB,EAAE,gBAAa,GAAsB,EACrC,IAAgB,EAAiB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAC3D,IAAe,EAA0B;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EACnE,IAAgB,EAAiB;EAAE,OAAO;EAAK,QAAQ;EAAG,CAAC,EAE3D,IAAU,SACN,EAAc,MAAM,SAAS,SAAS,EAAE,EAAmB,MAAM,MAAS,EAAK,OAAO,EAAG,EACjG,CAAC,GAAI,EAAc,KAAK,CACzB,EACK,IAAU,QAAe,EAAa,MAAM,kBAAkB,SAAS,EAAE,EAAkB,CAAC,EAAa,KAAK,CAAC,EAC/G,IAAW,QAAe,EAAc,MAAM,SAAS,SAAS,EAAE,EAAkB,CAAC,EAAc,KAAK,CAAC;AAE/G,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD,EAAA,UAAa,mRAIC,CAAA;GAEd,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAd,CACE,kBAAC,GAAD,EAAA,UAAc,WAAsB,CAAA,EAAA,SACjC;OACL,kBAAC,KAAD;IAAG,WAAU;cACV,IACG,GAAG,EAAQ,KAAK,6DAChB;IACF,CAAA,CACU,EAAA,CAAA;GAEhB,kBAAC,GAAD;IACE,SAAS,EAAa,UAAU,kCAAkC,oBAAoB,EAAQ,OAAO;IACrG,YAAW;IACX,mBAAkB;IAClB,MAAM,EAAQ,KAAK,OAAW;KAC5B,IAAI,EAAM;KACV,OAAO,EAAM,SAAS,EAAM,QAAQ,QAAQ,EAAM;KAClD,QAAQ,EAAM;KACf,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,SAAS,EAAc,UAAU,wBAAwB,qBAAqB,EAAS,OAAO;IAC9F,YAAW;IACX,MAAM,EAAS,KAAK,OAAa;KAC/B,IAAI,EAAQ;KACZ,OAAO,EAAQ,SAAS,EAAQ,QAAQ,WAAW,EAAQ;KAC3D,QAAQ,EAAQ;KACjB,EAAE;IACH,CAAA;GAEF,kBAAC,GAAD;IACE,YAAW;IACX,OAAM;IACN,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;MAClC,eAAe,EAAS,IAAK,aAAa,MAAO,YAAY;MAC9D;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;MACnC,eAAe,EAAS,cAAc;MACvC;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;MACvC,eAAe,EAAS,iBAAiB;MAC1C;KACF;IACD,CAAA;GACE"}