@burdenoff/microfe-eventfullymanaged 2026.608.1 → 2026.625.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +93 -40
  4. package/dist/eventfullymanaged/pages/dashboard/DashboardPage.js.map +1 -1
  5. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +32 -29
  6. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  7. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js +85 -50
  8. package/dist/eventfullymanaged/pages/modules/AttendeeProfilePage.js.map +1 -1
  9. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +49 -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 +93 -66
  14. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  15. package/dist/eventfullymanaged/pages/modules/KioskPage.js +18 -19
  16. package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
  17. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +60 -30
  18. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
  19. package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js +146 -108
  20. package/dist/eventfullymanaged/pages/modules/OperationsHubPage.js.map +1 -1
  21. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +67 -38
  22. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
  23. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +84 -49
  24. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
  25. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +57 -28
  26. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
  27. package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js +106 -72
  28. package/dist/eventfullymanaged/pages/modules/VenueResourcesPage.js.map +1 -1
  29. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js +84 -68
  30. package/dist/eventfullymanaged/pages/modules/WorkflowsPage.js.map +1 -1
  31. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +202 -204
  32. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
  33. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +58 -39
  34. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
  35. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js +53 -46
  36. package/dist/eventfullymanaged/pages/venues/FloorPlansPage.js.map +1 -1
  37. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +109 -63
  38. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
  39. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +193 -197
  40. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
  41. package/dist/eventfullymanaged/pages/venues/VenueListPage.js +65 -36
  42. package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
  43. package/package.json +2 -2
@@ -3,16 +3,18 @@ import { useSponsorsQuery as t } from "../../api/eventApi.js";
3
3
  import { useMemo as n, useState as r } from "react";
4
4
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
5
  import { Building2 as o, Mail as s, Phone as c, Plus as l, Search as u } from "lucide-react";
6
+ import { Badge as d, Button as f, GlassCard as p, IllustratedEmptyState as m, Input as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
6
7
  //#region src/eventfullymanaged/pages/sponsors/SponsorsListPage.tsx
7
- function d() {
8
- let { navigate: d } = e(), [f, p] = r(""), { data: m, loading: h } = t({
9
- search: f,
8
+ function _() {
9
+ let { navigate: _ } = e(), [v, y] = r(""), { data: b, loading: x } = t({
10
+ search: v,
10
11
  limit: 100,
11
12
  offset: 0
12
- }), g = n(() => m?.sponsors?.items ?? [], [m]), _ = g.reduce((e, t) => e + Number(t.metrics?.value ?? 0), 0), v = g.reduce((e, t) => e + Number(t.metrics?.leads ?? 0), 0);
13
+ }), S = n(() => b?.sponsors?.items ?? [], [b]), C = S.reduce((e, t) => e + Number(t.metrics?.value ?? 0), 0), w = S.reduce((e, t) => e + Number(t.metrics?.leads ?? 0), 0);
13
14
  return /* @__PURE__ */ a("div", {
14
15
  className: "space-y-6 p-6",
15
16
  children: [
17
+ /* @__PURE__ */ i(g, { children: "Sponsors fund your event in exchange for visibility and leads. Track each one here — their tier, the contract value they bring, and the leads they generate — so you can prove ROI and keep the relationship warm for next time. The highlighted cards summarize your sponsor portfolio at a glance." }),
16
18
  /* @__PURE__ */ a("div", {
17
19
  className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
18
20
  children: [/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("h1", {
@@ -21,80 +23,100 @@ function d() {
21
23
  }), /* @__PURE__ */ i("p", {
22
24
  className: "mt-1 text-sm text-text-secondary",
23
25
  children: "Manage event sponsors with live API data."
24
- })] }), /* @__PURE__ */ a("button", {
26
+ })] }), /* @__PURE__ */ a(f, {
25
27
  type: "button",
26
- onClick: () => d("/sponsors/create"),
27
- 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",
28
- children: [/* @__PURE__ */ i(l, { className: "mr-2 h-4 w-4" }), "Add Sponsor"]
28
+ onClick: () => _("/sponsors/create"),
29
+ children: [/* @__PURE__ */ i(l, { className: "h-4 w-4" }), "Add Sponsor"]
29
30
  })]
30
31
  }),
31
32
  /* @__PURE__ */ a("div", {
32
33
  className: "grid grid-cols-1 gap-4 md:grid-cols-3",
33
34
  children: [
34
- /* @__PURE__ */ a("div", {
35
- className: "rounded-lg border border-border-default bg-bg-surface p-4",
35
+ /* @__PURE__ */ a(p, {
36
+ treatment: "glass",
37
+ glow: !0,
38
+ className: "p-4",
36
39
  children: [/* @__PURE__ */ i("p", {
37
40
  className: "text-sm text-text-secondary",
38
41
  children: "Total Sponsors"
39
42
  }), /* @__PURE__ */ i("p", {
40
- className: "mt-1 text-2xl font-bold text-text-primary",
41
- children: g.length
43
+ className: "mt-1 text-2xl font-bold tabular-nums text-text-primary",
44
+ children: S.length
42
45
  })]
43
46
  }),
44
- /* @__PURE__ */ a("div", {
45
- className: "rounded-lg border border-border-default bg-bg-surface p-4",
47
+ /* @__PURE__ */ a(p, {
48
+ treatment: "metric",
49
+ className: "p-4",
46
50
  children: [/* @__PURE__ */ i("p", {
47
51
  className: "text-sm text-text-secondary",
48
52
  children: "Total Contract Value"
49
53
  }), /* @__PURE__ */ a("p", {
50
- className: "mt-1 text-2xl font-bold text-text-primary",
51
- children: ["$", _.toLocaleString()]
54
+ className: "mt-1 text-2xl font-bold tabular-nums text-text-primary",
55
+ children: ["$", C.toLocaleString()]
52
56
  })]
53
57
  }),
54
- /* @__PURE__ */ a("div", {
55
- className: "rounded-lg border border-border-default bg-bg-surface p-4",
58
+ /* @__PURE__ */ a(p, {
59
+ treatment: "metric",
60
+ className: "p-4",
56
61
  children: [/* @__PURE__ */ i("p", {
57
62
  className: "text-sm text-text-secondary",
58
63
  children: "Total Leads"
59
64
  }), /* @__PURE__ */ i("p", {
60
- className: "mt-1 text-2xl font-bold text-text-primary",
61
- children: v.toLocaleString()
65
+ className: "mt-1 text-2xl font-bold tabular-nums text-text-primary",
66
+ children: w.toLocaleString()
62
67
  })]
63
68
  })
64
69
  ]
65
70
  }),
66
71
  /* @__PURE__ */ a("div", {
67
72
  className: "relative",
68
- children: [/* @__PURE__ */ i(u, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted" }), /* @__PURE__ */ i("input", {
73
+ children: [/* @__PURE__ */ i(u, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted" }), /* @__PURE__ */ i(h, {
69
74
  type: "text",
70
- value: f,
71
- onChange: (e) => p(e.target.value),
75
+ value: v,
76
+ onChange: (e) => y(e.target.value),
72
77
  placeholder: "Search sponsors",
73
- className: "w-full rounded-md border border-border-default bg-bg-surface py-2 pl-10 pr-4 text-sm text-text-primary placeholder:text-text-muted focus:outline-none focus:ring-2 focus:ring-action-primary-bg"
78
+ "aria-label": "Search sponsors",
79
+ className: "pl-10"
74
80
  })]
75
81
  }),
76
- h ? /* @__PURE__ */ i("div", {
77
- className: "rounded-md border border-border-default bg-bg-surface p-8 text-center text-sm text-text-secondary",
82
+ x ? /* @__PURE__ */ i(p, {
83
+ treatment: "plain",
84
+ className: "border-border-seam p-8 text-center text-sm text-text-secondary",
78
85
  children: "Loading sponsors..."
79
- }) : /* @__PURE__ */ a("div", {
86
+ }) : S.length === 0 ? /* @__PURE__ */ i(p, {
87
+ treatment: "plain",
88
+ className: "border-border-seam",
89
+ children: /* @__PURE__ */ i(m, {
90
+ illustration: v ? "empty-search" : "empty-people",
91
+ title: v ? "No sponsors match your search." : "No sponsors yet.",
92
+ description: v ? "Try a different name." : "Add your first sponsor to start tracking value and leads.",
93
+ action: v ? void 0 : /* @__PURE__ */ a(f, {
94
+ type: "button",
95
+ onClick: () => _("/sponsors/create"),
96
+ children: [/* @__PURE__ */ i(l, { className: "h-4 w-4" }), "Add Sponsor"]
97
+ })
98
+ })
99
+ }) : /* @__PURE__ */ i("div", {
80
100
  className: "space-y-4",
81
- children: [g.map((e) => /* @__PURE__ */ a("div", {
82
- className: "rounded-lg border border-border-default bg-bg-surface p-5",
101
+ children: S.map((e) => /* @__PURE__ */ a(p, {
102
+ treatment: "plain",
103
+ className: "border-border-seam p-5",
83
104
  children: [/* @__PURE__ */ a("div", {
84
105
  className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
85
106
  children: [/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("button", {
86
107
  type: "button",
87
- onClick: () => d(`/sponsors/${e.id}/edit`),
88
- className: "text-left text-lg font-semibold text-text-primary hover:text-blue-600",
108
+ onClick: () => _(`/sponsors/${e.id}/edit`),
109
+ className: "rounded-button text-left text-lg font-semibold text-text-primary transition-colors hover:text-text-link focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
89
110
  children: e.name
90
111
  }), /* @__PURE__ */ a("div", {
91
112
  className: "mt-1 flex items-center gap-2 text-sm text-text-secondary",
92
- children: [/* @__PURE__ */ i(o, { className: "h-4 w-4" }), /* @__PURE__ */ i("span", {
113
+ children: [/* @__PURE__ */ i(o, { className: "h-4 w-4" }), /* @__PURE__ */ i(d, {
114
+ variant: "secondary",
93
115
  className: "uppercase",
94
116
  children: e.level
95
117
  })]
96
118
  })] }), /* @__PURE__ */ a("div", {
97
- className: "text-sm text-text-secondary",
119
+ className: "text-sm tabular-nums text-text-secondary",
98
120
  children: [/* @__PURE__ */ a("p", { children: ["Value: $", Number(e.metrics?.value ?? 0).toLocaleString()] }), /* @__PURE__ */ a("p", { children: ["Leads: ", Number(e.metrics?.leads ?? 0).toLocaleString()] })]
99
121
  })]
100
122
  }), /* @__PURE__ */ a("div", {
@@ -112,20 +134,17 @@ function d() {
112
134
  href: e.website,
113
135
  target: "_blank",
114
136
  rel: "noreferrer",
115
- className: "text-blue-600 hover:underline",
137
+ className: "text-text-link hover:underline",
116
138
  children: e.website
117
139
  }) : "No website" })
118
140
  ]
119
141
  })]
120
- }, e.id)), g.length === 0 && /* @__PURE__ */ i("div", {
121
- className: "rounded-md border border-border-default bg-bg-surface p-8 text-center text-sm text-text-secondary",
122
- children: "No sponsors found."
123
- })]
142
+ }, e.id))
124
143
  })
125
144
  ]
126
145
  });
127
146
  }
128
147
  //#endregion
129
- export { d as default };
148
+ export { _ as default };
130
149
 
131
150
  //# sourceMappingURL=SponsorsListPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SponsorsListPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/sponsors/SponsorsListPage.tsx"],"sourcesContent":["import { Building2, Mail, Phone, Plus, Search } from 'lucide-react';\nimport { useMemo, useState } from 'react';\n\nimport { useSponsorsQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype SponsorItem = {\n id: string;\n eventId: string;\n name: string;\n level: string;\n website?: string | null;\n contactName?: string | null;\n contactEmail?: string | null;\n contactPhone?: string | null;\n metrics?: { value?: number; leads?: number } | null;\n};\n\nexport default function SponsorsListPage() {\n const { navigate } = useEventfullyManaged();\n const [search, setSearch] = useState('');\n const { data, loading } = useSponsorsQuery({ search, limit: 100, offset: 0 });\n\n const sponsors = useMemo(() => (data?.sponsors?.items ?? []) as SponsorItem[], [data]);\n\n const totalValue = sponsors.reduce((sum, sponsor) => sum + Number(sponsor.metrics?.value ?? 0), 0);\n const totalLeads = sponsors.reduce((sum, sponsor) => sum + Number(sponsor.metrics?.leads ?? 0), 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">Sponsors</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">Manage event sponsors with live API data.</p>\n </div>\n <button\n type=\"button\"\n onClick={() => navigate('/sponsors/create')}\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\"\n >\n <Plus className=\"mr-2 h-4 w-4\" />\n Add Sponsor\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-4\">\n <p className=\"text-sm text-text-secondary\">Total Sponsors</p>\n <p className=\"mt-1 text-2xl font-bold text-text-primary\">{sponsors.length}</p>\n </div>\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-4\">\n <p className=\"text-sm text-text-secondary\">Total Contract Value</p>\n <p className=\"mt-1 text-2xl font-bold text-text-primary\">${totalValue.toLocaleString()}</p>\n </div>\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-4\">\n <p className=\"text-sm text-text-secondary\">Total Leads</p>\n <p className=\"mt-1 text-2xl font-bold text-text-primary\">{totalLeads.toLocaleString()}</p>\n </div>\n </div>\n\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted\" />\n <input\n type=\"text\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder=\"Search sponsors\"\n className=\"w-full rounded-md border border-border-default bg-bg-surface py-2 pl-10 pr-4 text-sm text-text-primary placeholder:text-text-muted focus:outline-none focus:ring-2 focus:ring-action-primary-bg\"\n />\n </div>\n\n {loading ? (\n <div className=\"rounded-md border border-border-default bg-bg-surface p-8 text-center text-sm text-text-secondary\">\n Loading sponsors...\n </div>\n ) : (\n <div className=\"space-y-4\">\n {sponsors.map((sponsor) => (\n <div key={sponsor.id} className=\"rounded-lg border border-border-default bg-bg-surface p-5\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <button\n type=\"button\"\n onClick={() => navigate(`/sponsors/${sponsor.id}/edit`)}\n className=\"text-left text-lg font-semibold text-text-primary hover:text-blue-600\"\n >\n {sponsor.name}\n </button>\n <div className=\"mt-1 flex items-center gap-2 text-sm text-text-secondary\">\n <Building2 className=\"h-4 w-4\" />\n <span className=\"uppercase\">{sponsor.level}</span>\n </div>\n </div>\n <div className=\"text-sm text-text-secondary\">\n <p>Value: ${Number(sponsor.metrics?.value ?? 0).toLocaleString()}</p>\n <p>Leads: {Number(sponsor.metrics?.leads ?? 0).toLocaleString()}</p>\n </div>\n </div>\n\n <div className=\"mt-4 grid grid-cols-1 gap-2 text-sm text-text-secondary sm:grid-cols-3\">\n <div className=\"flex items-center gap-2\">\n <Mail className=\"h-4 w-4\" />\n <span>{sponsor.contactEmail ?? 'No email'}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Phone className=\"h-4 w-4\" />\n <span>{sponsor.contactPhone ?? 'No phone'}</span>\n </div>\n <div>\n {sponsor.website ? (\n <a\n href={sponsor.website}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-blue-600 hover:underline\"\n >\n {sponsor.website}\n </a>\n ) : (\n 'No website'\n )}\n </div>\n </div>\n </div>\n ))}\n {sponsors.length === 0 && (\n <div className=\"rounded-md border border-border-default bg-bg-surface p-8 text-center text-sm text-text-secondary\">\n No sponsors found.\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SponsorsListPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/sponsors/SponsorsListPage.tsx"],"sourcesContent":["import { Building2, Mail, Phone, Plus, Search } from 'lucide-react';\nimport { Badge, Button, GlassCard, IllustratedEmptyState, Input, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useMemo, useState } from 'react';\n\nimport { useSponsorsQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype SponsorItem = {\n id: string;\n eventId: string;\n name: string;\n level: string;\n website?: string | null;\n contactName?: string | null;\n contactEmail?: string | null;\n contactPhone?: string | null;\n metrics?: { value?: number; leads?: number } | null;\n};\n\nexport default function SponsorsListPage() {\n const { navigate } = useEventfullyManaged();\n const [search, setSearch] = useState('');\n const { data, loading } = useSponsorsQuery({ search, limit: 100, offset: 0 });\n\n const sponsors = useMemo(() => (data?.sponsors?.items ?? []) as SponsorItem[], [data]);\n\n const totalValue = sponsors.reduce((sum, sponsor) => sum + Number(sponsor.metrics?.value ?? 0), 0);\n const totalLeads = sponsors.reduce((sum, sponsor) => sum + Number(sponsor.metrics?.leads ?? 0), 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <PagePurpose>\n Sponsors fund your event in exchange for visibility and leads. Track each one here — their tier, the contract\n value they bring, and the leads they generate — so you can prove ROI and keep the relationship warm for next\n time. The highlighted cards summarize your sponsor portfolio at a glance.\n </PagePurpose>\n\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">Sponsors</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">Manage event sponsors with live API data.</p>\n </div>\n <Button type=\"button\" onClick={() => navigate('/sponsors/create')}>\n <Plus className=\"h-4 w-4\" />\n Add Sponsor\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Total Sponsors</p>\n <p className=\"mt-1 text-2xl font-bold tabular-nums text-text-primary\">{sponsors.length}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Total Contract Value</p>\n <p className=\"mt-1 text-2xl font-bold tabular-nums text-text-primary\">${totalValue.toLocaleString()}</p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Total Leads</p>\n <p className=\"mt-1 text-2xl font-bold tabular-nums text-text-primary\">{totalLeads.toLocaleString()}</p>\n </GlassCard>\n </div>\n\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted\" />\n <Input\n type=\"text\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder=\"Search sponsors\"\n aria-label=\"Search sponsors\"\n className=\"pl-10\"\n />\n </div>\n\n {loading ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-8 text-center text-sm text-text-secondary\">\n Loading sponsors...\n </GlassCard>\n ) : sponsors.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration={search ? 'empty-search' : 'empty-people'}\n title={search ? 'No sponsors match your search.' : 'No sponsors yet.'}\n description={search ? 'Try a different name.' : 'Add your first sponsor to start tracking value and leads.'}\n action={\n !search ? (\n <Button type=\"button\" onClick={() => navigate('/sponsors/create')}>\n <Plus className=\"h-4 w-4\" />\n Add Sponsor\n </Button>\n ) : undefined\n }\n />\n </GlassCard>\n ) : (\n <div className=\"space-y-4\">\n {sponsors.map((sponsor) => (\n <GlassCard key={sponsor.id} treatment=\"plain\" className=\"border-border-seam p-5\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <button\n type=\"button\"\n onClick={() => navigate(`/sponsors/${sponsor.id}/edit`)}\n className=\"rounded-button text-left text-lg font-semibold text-text-primary transition-colors hover:text-text-link focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n {sponsor.name}\n </button>\n <div className=\"mt-1 flex items-center gap-2 text-sm text-text-secondary\">\n <Building2 className=\"h-4 w-4\" />\n <Badge variant=\"secondary\" className=\"uppercase\">\n {sponsor.level}\n </Badge>\n </div>\n </div>\n <div className=\"text-sm tabular-nums text-text-secondary\">\n <p>Value: ${Number(sponsor.metrics?.value ?? 0).toLocaleString()}</p>\n <p>Leads: {Number(sponsor.metrics?.leads ?? 0).toLocaleString()}</p>\n </div>\n </div>\n\n <div className=\"mt-4 grid grid-cols-1 gap-2 text-sm text-text-secondary sm:grid-cols-3\">\n <div className=\"flex items-center gap-2\">\n <Mail className=\"h-4 w-4\" />\n <span>{sponsor.contactEmail ?? 'No email'}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Phone className=\"h-4 w-4\" />\n <span>{sponsor.contactPhone ?? 'No phone'}</span>\n </div>\n <div>\n {sponsor.website ? (\n <a\n href={sponsor.website}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-text-link hover:underline\"\n >\n {sponsor.website}\n </a>\n ) : (\n 'No website'\n )}\n </div>\n </div>\n </GlassCard>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -4,67 +4,77 @@ import { useState 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
6
  import { ArrowLeft as s, Plus as c, SquareStack as l } from "lucide-react";
7
+ import { Button as u, EmphasisPanel as d, GlassCard as f, IllustratedEmptyState as p, Input as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
7
8
  //#region src/eventfullymanaged/pages/venues/FloorPlansPage.tsx
8
- function u() {
9
- let { id: u = "" } = i(), { navigate: d } = e(), { data: f, loading: p, refetch: m } = n(u), [h, { loading: g }] = t(), [_, v] = r(""), y = f?.venue, b = f?.floorPlans?.items ?? [];
9
+ function g() {
10
+ let { id: g = "" } = i(), { navigate: _ } = e(), { data: v, loading: y, refetch: b } = n(g), [x, { loading: S }] = t(), [C, w] = r(""), T = v?.venue, E = v?.floorPlans?.items ?? [];
10
11
  return /* @__PURE__ */ o("div", {
11
12
  className: "space-y-6 p-6",
12
13
  children: [
13
14
  /* @__PURE__ */ o("div", {
14
15
  className: "space-y-3",
15
- children: [/* @__PURE__ */ o("button", {
16
+ children: [/* @__PURE__ */ o(u, {
16
17
  type: "button",
17
- onClick: () => d(`/venues/${u}`),
18
- className: "inline-flex items-center gap-2 text-sm text-text-secondary hover:text-text-primary",
18
+ variant: "ghost",
19
+ size: "sm",
20
+ onClick: () => _(`/venues/${g}`),
19
21
  children: [/* @__PURE__ */ a(s, { className: "h-4 w-4" }), "Back to Venue"]
20
22
  }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
21
23
  className: "text-2xl font-bold text-text-primary",
22
24
  children: "Floor Plans"
23
25
  }), /* @__PURE__ */ a("p", {
24
26
  className: "mt-1 text-sm text-text-secondary",
25
- children: y?.name ?? "Venue"
27
+ children: T?.name ?? "Venue"
26
28
  })] })]
27
29
  }),
28
- /* @__PURE__ */ o("div", {
29
- className: "rounded-lg border border-border-default bg-bg-surface p-4",
30
- children: [/* @__PURE__ */ a("h2", {
31
- className: "mb-3 text-sm font-semibold text-text-primary",
32
- children: "Create floor plan"
33
- }), /* @__PURE__ */ o("div", {
34
- className: "flex flex-col gap-3 sm:flex-row",
35
- children: [/* @__PURE__ */ a("input", {
36
- type: "text",
37
- value: _,
38
- onChange: (e) => v(e.target.value),
39
- placeholder: "Main Hall Layout",
40
- className: "flex-1 rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-muted focus:outline-none focus:ring-2 focus:ring-action-primary-bg"
41
- }), /* @__PURE__ */ o("button", {
42
- type: "button",
43
- onClick: async () => {
44
- !_.trim() || !u || (await h({ variables: { input: {
45
- venueId: u,
46
- name: _.trim(),
47
- imageUrl: "",
48
- dimensions: {},
49
- interactiveAreas: {}
50
- } } }), v(""), await m());
51
- },
52
- disabled: g,
53
- 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",
54
- children: [/* @__PURE__ */ a(c, { className: "mr-2 h-4 w-4" }), g ? "Creating..." : "Create"]
55
- })]
30
+ /* @__PURE__ */ a(h, { children: "Floor plans are the maps of your venue — the hall layout, booth positions, stage and entrances. Add one per space so you can lay out exhibitors, plan attendee flow, and give everyone a clear picture of the room on the day." }),
31
+ /* @__PURE__ */ o(d, { children: [/* @__PURE__ */ a("h2", {
32
+ className: "mb-3 text-sm font-semibold text-text-primary",
33
+ children: "Create floor plan"
34
+ }), /* @__PURE__ */ o("div", {
35
+ className: "flex flex-col gap-3 sm:flex-row",
36
+ children: [/* @__PURE__ */ a(m, {
37
+ type: "text",
38
+ value: C,
39
+ onChange: (e) => w(e.target.value),
40
+ placeholder: "Main Hall Layout",
41
+ "aria-label": "Floor plan name",
42
+ className: "flex-1"
43
+ }), /* @__PURE__ */ o(u, {
44
+ type: "button",
45
+ onClick: async () => {
46
+ !C.trim() || !g || (await x({ variables: { input: {
47
+ venueId: g,
48
+ name: C.trim(),
49
+ imageUrl: "",
50
+ dimensions: {},
51
+ interactiveAreas: {}
52
+ } } }), w(""), await b());
53
+ },
54
+ disabled: S,
55
+ children: [/* @__PURE__ */ a(c, { className: "h-4 w-4" }), S ? "Creating..." : "Create"]
56
56
  })]
57
- }),
58
- p ? /* @__PURE__ */ a("div", {
59
- className: "rounded-md border border-border-default bg-bg-surface p-8 text-center text-sm text-text-secondary",
57
+ })] }),
58
+ y ? /* @__PURE__ */ a(f, {
59
+ treatment: "plain",
60
+ className: "border-border-seam p-8 text-center text-sm text-text-secondary",
60
61
  children: "Loading floor plans..."
61
- }) : /* @__PURE__ */ o("div", {
62
+ }) : E.length === 0 ? /* @__PURE__ */ a(f, {
63
+ treatment: "plain",
64
+ className: "border-border-seam",
65
+ children: /* @__PURE__ */ a(p, {
66
+ illustration: "empty-files",
67
+ title: "No floor plans found.",
68
+ description: "Create one to start mapping your venue."
69
+ })
70
+ }) : /* @__PURE__ */ a("div", {
62
71
  className: "grid grid-cols-1 gap-4 md:grid-cols-2",
63
- children: [b.map((e) => /* @__PURE__ */ o("div", {
64
- className: "rounded-lg border border-border-default bg-bg-surface p-4",
72
+ children: E.map((e) => /* @__PURE__ */ o(f, {
73
+ treatment: "metric",
74
+ className: "p-4",
65
75
  children: [/* @__PURE__ */ o("div", {
66
76
  className: "flex items-center gap-2 text-text-primary",
67
- children: [/* @__PURE__ */ a(l, { className: "h-4 w-4" }), /* @__PURE__ */ a("h3", {
77
+ children: [/* @__PURE__ */ a(l, { className: "h-4 w-4 text-action-primary-bg" }), /* @__PURE__ */ a("h3", {
68
78
  className: "font-semibold",
69
79
  children: e.name
70
80
  })]
@@ -77,15 +87,12 @@ function u() {
77
87
  e.dimensions ? "Dimensions configured" : "No dimensions configured"
78
88
  ]
79
89
  })]
80
- }, e.id)), b.length === 0 && /* @__PURE__ */ a("div", {
81
- className: "rounded-md border border-border-default bg-bg-surface p-8 text-center text-sm text-text-secondary",
82
- children: "No floor plans found. Create one to start mapping your venue."
83
- })]
90
+ }, e.id))
84
91
  })
85
92
  ]
86
93
  });
87
94
  }
88
95
  //#endregion
89
- export { u as default };
96
+ export { g as default };
90
97
 
91
98
  //# sourceMappingURL=FloorPlansPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloorPlansPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/FloorPlansPage.tsx"],"sourcesContent":["import { ArrowLeft, Plus, SquareStack } from 'lucide-react';\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useCreateFloorPlanMutation, useVenueQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype FloorPlan = {\n id: string;\n venueId: string;\n name: string;\n imageUrl?: string | null;\n dimensions?: Record<string, unknown> | null;\n interactiveAreas?: Record<string, unknown> | null;\n};\n\nexport default function FloorPlansPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading, refetch } = useVenueQuery(id);\n const [createFloorPlan, { loading: creating }] = useCreateFloorPlanMutation();\n const [name, setName] = useState('');\n\n const venue = data?.venue;\n const floorPlans = (data?.floorPlans?.items ?? []) as FloorPlan[];\n\n const handleCreate = async () => {\n if (!name.trim() || !id) {\n return;\n }\n await createFloorPlan({\n variables: {\n input: {\n venueId: id,\n name: name.trim(),\n imageUrl: '',\n dimensions: {},\n interactiveAreas: {},\n },\n },\n });\n setName('');\n await refetch();\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"space-y-3\">\n <button\n type=\"button\"\n onClick={() => navigate(`/venues/${id}`)}\n className=\"inline-flex items-center gap-2 text-sm text-text-secondary hover:text-text-primary\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venue\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">Floor Plans</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">{venue?.name ?? 'Venue'}</p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-4\">\n <h2 className=\"mb-3 text-sm font-semibold text-text-primary\">Create floor plan</h2>\n <div className=\"flex flex-col gap-3 sm:flex-row\">\n <input\n type=\"text\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder=\"Main Hall Layout\"\n className=\"flex-1 rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-muted focus:outline-none focus:ring-2 focus:ring-action-primary-bg\"\n />\n <button\n type=\"button\"\n onClick={handleCreate}\n disabled={creating}\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 <Plus className=\"mr-2 h-4 w-4\" />\n {creating ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n\n {loading ? (\n <div className=\"rounded-md border border-border-default bg-bg-surface p-8 text-center text-sm text-text-secondary\">\n Loading floor plans...\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n {floorPlans.map((plan) => (\n <div key={plan.id} className=\"rounded-lg border border-border-default bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <SquareStack className=\"h-4 w-4\" />\n <h3 className=\"font-semibold\">{plan.name}</h3>\n </div>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {plan.imageUrl ? 'Image available' : 'No image uploaded'} |{' '}\n {plan.dimensions ? 'Dimensions configured' : 'No dimensions configured'}\n </p>\n </div>\n ))}\n {floorPlans.length === 0 && (\n <div className=\"rounded-md border border-border-default bg-bg-surface p-8 text-center text-sm text-text-secondary\">\n No floor plans found. Create one to start mapping your venue.\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;AAgBA,SAAwB,IAAiB;CACvC,IAAM,EAAE,QAAK,OAAO,GAA2B,EACzC,EAAE,gBAAa,GAAsB,EACrC,EAAE,SAAM,YAAS,eAAY,EAAc,EAAG,EAC9C,CAAC,GAAiB,EAAE,SAAS,OAAc,GAA4B,EACvE,CAAC,GAAM,KAAW,EAAS,GAAG,EAE9B,IAAQ,GAAM,OACd,IAAc,GAAM,YAAY,SAAS,EAAE;AAqBjD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAS,WAAW,IAAK;KACxC,WAAU;eAHZ,CAKE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,gBAE1B;QACT,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eAAuC;KAAgB,CAAA,EACrE,kBAAC,KAAD;KAAG,WAAU;eAAoC,GAAO,QAAQ;KAAY,CAAA,CACxE,EAAA,CAAA,CACF;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA+C;KAAsB,CAAA,EACnF,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,SAAD;MACE,MAAK;MACL,OAAO;MACP,WAAW,MAAU,EAAQ,EAAM,OAAO,MAAM;MAChD,aAAY;MACZ,WAAU;MACV,CAAA,EACF,kBAAC,UAAD;MACE,MAAK;MACL,SAhDW,YAAY;AAC3B,QAAC,EAAK,MAAM,IAAI,CAAC,MAGrB,MAAM,EAAgB,EACpB,WAAW,EACT,OAAO;QACL,SAAS;QACT,MAAM,EAAK,MAAM;QACjB,UAAU;QACV,YAAY,EAAE;QACd,kBAAkB,EAAE;QACrB,EACF,EACF,CAAC,EACF,EAAQ,GAAG,EACX,MAAM,GAAS;;MAiCP,UAAU;MACV,WAAU;gBAJZ,CAME,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAChC,IAAW,gBAAgB,SACrB;QACL;OACF;;GAEL,IACC,kBAAC,OAAD;IAAK,WAAU;cAAoG;IAE7G,CAAA,GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EAAW,KAAK,MACf,kBAAC,OAAD;KAAmB,WAAU;eAA7B,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA,EACnC,kBAAC,MAAD;OAAI,WAAU;iBAAiB,EAAK;OAAU,CAAA,CAC1C;SACN,kBAAC,KAAD;MAAG,WAAU;gBAAb;OACG,EAAK,WAAW,oBAAoB;OAAoB;OAAG;OAC3D,EAAK,aAAa,0BAA0B;OAC3C;QACA;OATI,EAAK,GAST,CACN,EACD,EAAW,WAAW,KACrB,kBAAC,OAAD;KAAK,WAAU;eAAoG;KAE7G,CAAA,CAEJ;;GAEJ"}
1
+ {"version":3,"file":"FloorPlansPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/venues/FloorPlansPage.tsx"],"sourcesContent":["import { ArrowLeft, Plus, SquareStack } from 'lucide-react';\nimport { Button, EmphasisPanel, GlassCard, IllustratedEmptyState, Input, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { useCreateFloorPlanMutation, useVenueQuery } from '../../api/eventApi';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\n\ntype FloorPlan = {\n id: string;\n venueId: string;\n name: string;\n imageUrl?: string | null;\n dimensions?: Record<string, unknown> | null;\n interactiveAreas?: Record<string, unknown> | null;\n};\n\nexport default function FloorPlansPage() {\n const { id = '' } = useParams<{ id: string }>();\n const { navigate } = useEventfullyManaged();\n const { data, loading, refetch } = useVenueQuery(id);\n const [createFloorPlan, { loading: creating }] = useCreateFloorPlanMutation();\n const [name, setName] = useState('');\n\n const venue = data?.venue;\n const floorPlans = (data?.floorPlans?.items ?? []) as FloorPlan[];\n\n const handleCreate = async () => {\n if (!name.trim() || !id) {\n return;\n }\n await createFloorPlan({\n variables: {\n input: {\n venueId: id,\n name: name.trim(),\n imageUrl: '',\n dimensions: {},\n interactiveAreas: {},\n },\n },\n });\n setName('');\n await refetch();\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"space-y-3\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => navigate(`/venues/${id}`)}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Venue\n </Button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">Floor Plans</h1>\n <p className=\"mt-1 text-sm text-text-secondary\">{venue?.name ?? 'Venue'}</p>\n </div>\n </div>\n\n <PagePurpose>\n Floor plans are the maps of your venue — the hall layout, booth positions, stage and entrances. Add one per\n space so you can lay out exhibitors, plan attendee flow, and give everyone a clear picture of the room on the\n day.\n </PagePurpose>\n\n <EmphasisPanel>\n <h2 className=\"mb-3 text-sm font-semibold text-text-primary\">Create floor plan</h2>\n <div className=\"flex flex-col gap-3 sm:flex-row\">\n <Input\n type=\"text\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder=\"Main Hall Layout\"\n aria-label=\"Floor plan name\"\n className=\"flex-1\"\n />\n <Button type=\"button\" onClick={handleCreate} disabled={creating}>\n <Plus className=\"h-4 w-4\" />\n {creating ? 'Creating...' : 'Create'}\n </Button>\n </div>\n </EmphasisPanel>\n\n {loading ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-8 text-center text-sm text-text-secondary\">\n Loading floor plans...\n </GlassCard>\n ) : floorPlans.length === 0 ? (\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No floor plans found.\"\n description=\"Create one to start mapping your venue.\"\n />\n </GlassCard>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n {floorPlans.map((plan) => (\n <GlassCard key={plan.id} treatment=\"metric\" className=\"p-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <SquareStack className=\"h-4 w-4 text-action-primary-bg\" />\n <h3 className=\"font-semibold\">{plan.name}</h3>\n </div>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {plan.imageUrl ? 'Image available' : 'No image uploaded'} |{' '}\n {plan.dimensions ? 'Dimensions configured' : 'No dimensions configured'}\n </p>\n </GlassCard>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAiBA,SAAwB,IAAiB;CACvC,IAAM,EAAE,QAAK,OAAO,GAA2B,EACzC,EAAE,gBAAa,GAAsB,EACrC,EAAE,SAAM,YAAS,eAAY,EAAc,EAAG,EAC9C,CAAC,GAAiB,EAAE,SAAS,OAAc,GAA4B,EACvE,CAAC,GAAM,KAAW,EAAS,GAAG,EAE9B,IAAQ,GAAM,OACd,IAAc,GAAM,YAAY,SAAS,EAAE;AAqBjD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAAQ;KAAQ,MAAK;KAAK,eAAe,EAAS,WAAW,IAAK;eAAxF,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,gBAE1B;QACT,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eAAuC;KAAgB,CAAA,EACrE,kBAAC,KAAD;KAAG,WAAU;eAAoC,GAAO,QAAQ;KAAY,CAAA,CACxE,EAAA,CAAA,CACF;;GAEN,kBAAC,GAAD,EAAA,UAAa,kOAIC,CAAA;GAEd,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAA+C;IAAsB,CAAA,EACnF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,MAAK;KACL,OAAO;KACP,WAAW,MAAU,EAAQ,EAAM,OAAO,MAAM;KAChD,aAAY;KACZ,cAAW;KACX,WAAU;KACV,CAAA,EACF,kBAAC,GAAD;KAAQ,MAAK;KAAS,SAjDT,YAAY;AAC3B,OAAC,EAAK,MAAM,IAAI,CAAC,MAGrB,MAAM,EAAgB,EACpB,WAAW,EACT,OAAO;OACL,SAAS;OACT,MAAM,EAAK,MAAM;OACjB,UAAU;OACV,YAAY,EAAE;OACd,kBAAkB,EAAE;OACrB,EACF,EACF,CAAC,EACF,EAAQ,GAAG,EACX,MAAM,GAAS;;KAiCoC,UAAU;eAAvD,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,IAAW,gBAAgB,SACrB;OACL;MACQ,EAAA,CAAA;GAEf,IACC,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;cAAiE;IAE5F,CAAA,GACV,EAAW,WAAW,IACxB,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;cACrC,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aAAY;KACZ,CAAA;IACQ,CAAA,GAEZ,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAW,KAAK,MACf,kBAAC,GAAD;KAAyB,WAAU;KAAS,WAAU;eAAtD,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAa,WAAU,kCAAmC,CAAA,EAC1D,kBAAC,MAAD;OAAI,WAAU;iBAAiB,EAAK;OAAU,CAAA,CAC1C;SACN,kBAAC,KAAD;MAAG,WAAU;gBAAb;OACG,EAAK,WAAW,oBAAoB;OAAoB;OAAG;OAC3D,EAAK,aAAa,0BAA0B;OAC3C;QACM;OATI,EAAK,GAST,CACZ;IACE,CAAA;GAEJ"}