@burdenoff/microfe-ggnomad 2026.801.1 → 2026.827.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.
- package/dist/ggnomad/components/AvailabilityPanel.d.ts +15 -0
- package/dist/ggnomad/components/AvailabilityPanel.d.ts.map +1 -0
- package/dist/ggnomad/components/AvailabilityPanel.js +91 -0
- package/dist/ggnomad/components/AvailabilityPanel.js.map +1 -0
- package/dist/ggnomad/components/BookingPanel.d.ts +1 -3
- package/dist/ggnomad/components/BookingPanel.d.ts.map +1 -1
- package/dist/ggnomad/components/BookingPanel.js +91 -82
- package/dist/ggnomad/components/BookingPanel.js.map +1 -1
- package/dist/ggnomad/components/EcoAccessPanel.d.ts +17 -0
- package/dist/ggnomad/components/EcoAccessPanel.d.ts.map +1 -0
- package/dist/ggnomad/components/EcoAccessPanel.js +68 -0
- package/dist/ggnomad/components/EcoAccessPanel.js.map +1 -0
- package/dist/ggnomad/components/FactGrid.d.ts +18 -0
- package/dist/ggnomad/components/FactGrid.d.ts.map +1 -0
- package/dist/ggnomad/components/FactGrid.js +29 -0
- package/dist/ggnomad/components/FactGrid.js.map +1 -0
- package/dist/ggnomad/components/GroupTripPanel.d.ts +22 -0
- package/dist/ggnomad/components/GroupTripPanel.d.ts.map +1 -0
- package/dist/ggnomad/components/GroupTripPanel.js +350 -0
- package/dist/ggnomad/components/GroupTripPanel.js.map +1 -0
- package/dist/ggnomad/components/ListingFilters.d.ts +29 -0
- package/dist/ggnomad/components/ListingFilters.d.ts.map +1 -0
- package/dist/ggnomad/components/ListingFilters.js +164 -0
- package/dist/ggnomad/components/ListingFilters.js.map +1 -0
- package/dist/ggnomad/components/PhotoGallery.d.ts +15 -0
- package/dist/ggnomad/components/PhotoGallery.d.ts.map +1 -0
- package/dist/ggnomad/components/PhotoGallery.js +54 -0
- package/dist/ggnomad/components/PhotoGallery.js.map +1 -0
- package/dist/ggnomad/components/ProviderCard.d.ts +19 -0
- package/dist/ggnomad/components/ProviderCard.d.ts.map +1 -0
- package/dist/ggnomad/components/ProviderCard.js +66 -0
- package/dist/ggnomad/components/ProviderCard.js.map +1 -0
- package/dist/ggnomad/components/RatingSummary.d.ts +14 -0
- package/dist/ggnomad/components/RatingSummary.d.ts.map +1 -0
- package/dist/ggnomad/components/RatingSummary.js +32 -0
- package/dist/ggnomad/components/RatingSummary.js.map +1 -0
- package/dist/ggnomad/components/TagChips.d.ts +16 -0
- package/dist/ggnomad/components/TagChips.d.ts.map +1 -0
- package/dist/ggnomad/components/TagChips.js +20 -0
- package/dist/ggnomad/components/TagChips.js.map +1 -0
- package/dist/ggnomad/components/index.d.ts +13 -0
- package/dist/ggnomad/components/index.d.ts.map +1 -1
- package/dist/ggnomad/components/index.js +9 -0
- package/dist/ggnomad/graphql.d.ts +10 -0
- package/dist/ggnomad/graphql.d.ts.map +1 -1
- package/dist/ggnomad/graphql.js +308 -20
- package/dist/ggnomad/graphql.js.map +1 -1
- package/dist/ggnomad/pages/ActivityDetailsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/ActivityDetailsPage.js +174 -86
- package/dist/ggnomad/pages/ActivityDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/AnalyticsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/AnalyticsPage.js +109 -77
- package/dist/ggnomad/pages/AnalyticsPage.js.map +1 -1
- package/dist/ggnomad/pages/BookingsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/BookingsPage.js +188 -137
- package/dist/ggnomad/pages/BookingsPage.js.map +1 -1
- package/dist/ggnomad/pages/DashboardPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/DashboardPage.js +245 -128
- package/dist/ggnomad/pages/DashboardPage.js.map +1 -1
- package/dist/ggnomad/pages/EntertainmentPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/EntertainmentPage.js +115 -53
- package/dist/ggnomad/pages/EntertainmentPage.js.map +1 -1
- package/dist/ggnomad/pages/EventDetailsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/EventDetailsPage.js +170 -87
- package/dist/ggnomad/pages/EventDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/FavoritesPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/FavoritesPage.js +201 -84
- package/dist/ggnomad/pages/FavoritesPage.js.map +1 -1
- package/dist/ggnomad/pages/HospitalityPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/HospitalityPage.js +99 -56
- package/dist/ggnomad/pages/HospitalityPage.js.map +1 -1
- package/dist/ggnomad/pages/PropertyDetailsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/PropertyDetailsPage.js +177 -93
- package/dist/ggnomad/pages/PropertyDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/ProviderPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/ProviderPage.js +112 -63
- package/dist/ggnomad/pages/ProviderPage.js.map +1 -1
- package/dist/ggnomad/pages/SearchPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/SearchPage.js +236 -65
- package/dist/ggnomad/pages/SearchPage.js.map +1 -1
- package/dist/ggnomad/pages/TourDetailsPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/TourDetailsPage.js +171 -86
- package/dist/ggnomad/pages/TourDetailsPage.js.map +1 -1
- package/dist/ggnomad/pages/TourismPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/TourismPage.js +108 -54
- package/dist/ggnomad/pages/TourismPage.js.map +1 -1
- package/dist/ggnomad/pages/TravelPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/TravelPage.js +406 -43
- package/dist/ggnomad/pages/TravelPage.js.map +1 -1
- package/dist/ggnomad/pages/TripPlanDetailPage.d.ts.map +1 -1
- package/dist/ggnomad/pages/TripPlanDetailPage.js +93 -70
- package/dist/ggnomad/pages/TripPlanDetailPage.js.map +1 -1
- package/dist/ggnomad/utils/format.d.ts +47 -0
- package/dist/ggnomad/utils/format.d.ts.map +1 -0
- package/dist/ggnomad/utils/format.js +125 -0
- package/dist/ggnomad/utils/format.js.map +1 -0
- package/dist/stories/BookingPanel.stories.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1,31 +1,32 @@
|
|
|
1
1
|
import { GGNOMAD_OVERVIEW_QUERY as e } from "../graphql.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { parseNamedCounts as t } from "../utils/format.js";
|
|
3
|
+
import { PageShell as n } from "./PageShell.js";
|
|
4
|
+
import { StatCard as r } from "../components/StatCard.js";
|
|
5
|
+
import { SectionCard as i } from "../components/SectionCard.js";
|
|
5
6
|
import "../components/index.js";
|
|
6
|
-
import { useMemo as
|
|
7
|
-
import { BarChart3 as
|
|
8
|
-
import { useI18n as
|
|
9
|
-
import { useQuery as
|
|
10
|
-
import { EmphasisPanel as
|
|
11
|
-
import { jsx as
|
|
7
|
+
import { useMemo as a } from "react";
|
|
8
|
+
import { BarChart3 as o, CalendarCheck as s, DollarSign as c, MapPin as l, Percent as u, Users as d } from "lucide-react";
|
|
9
|
+
import { useI18n as f } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
10
|
+
import { useQuery as p } from "@apollo/client/react";
|
|
11
|
+
import { EmphasisPanel as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
|
|
12
|
+
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
12
13
|
//#region src/ggnomad/pages/AnalyticsPage.tsx
|
|
13
|
-
var
|
|
14
|
+
var v = [
|
|
14
15
|
"var(--color-chart-1)",
|
|
15
16
|
"var(--color-chart-2)",
|
|
16
17
|
"var(--color-chart-3)",
|
|
17
18
|
"var(--color-chart-4)",
|
|
18
19
|
"var(--color-chart-5)"
|
|
19
|
-
],
|
|
20
|
-
function
|
|
21
|
-
let { t:
|
|
22
|
-
let e =
|
|
20
|
+
], y = (e) => e.replace(/[_-]+/g, " ").trim().replace(/\b\w/g, (e) => e.toUpperCase()) || e;
|
|
21
|
+
function b() {
|
|
22
|
+
let { t: b } = f(), { data: x } = p(e), S = x?.ggnomadAnalytics, C = a(() => {
|
|
23
|
+
let e = S?.revenueByCategory ?? {};
|
|
23
24
|
return Object.entries(e).map(([e, t]) => ({
|
|
24
|
-
label:
|
|
25
|
+
label: y(e),
|
|
25
26
|
value: Number(t)
|
|
26
27
|
})).filter((e) => Number.isFinite(e.value) && e.value > 0).sort((e, t) => t.value - e.value);
|
|
27
|
-
}, [
|
|
28
|
-
let e =
|
|
28
|
+
}, [S?.revenueByCategory]), w = C.length > 0 ? C[0].value : 0, T = a(() => {
|
|
29
|
+
let e = S?.monthlyTrends;
|
|
29
30
|
return e ? Array.isArray(e) ? e.map((e) => ({
|
|
30
31
|
label: e.month || "",
|
|
31
32
|
value: Number(e.revenue || 0)
|
|
@@ -33,119 +34,150 @@ function v() {
|
|
|
33
34
|
label: e,
|
|
34
35
|
value: Number(t)
|
|
35
36
|
})).filter((e) => Number.isFinite(e.value)) : [];
|
|
36
|
-
}, [
|
|
37
|
-
return /* @__PURE__ */
|
|
38
|
-
title:
|
|
39
|
-
titleAccent:
|
|
40
|
-
subtitle:
|
|
37
|
+
}, [S?.monthlyTrends]), E = T.length > 0 ? Math.max(...T.map((e) => e.value)) : 0, D = a(() => t(S?.topDestinations).sort((e, t) => t.value - e.value).slice(0, 10), [S?.topDestinations]), O = D.length > 0 ? D[0].value : 0;
|
|
38
|
+
return /* @__PURE__ */ _(n, {
|
|
39
|
+
title: b("ggnomad.analytics.title", "Analytics"),
|
|
40
|
+
titleAccent: b("ggnomad.analytics.title.accent", "Analytics"),
|
|
41
|
+
subtitle: b("ggnomad.analytics.subtitle", "GGNomad performance and growth analytics"),
|
|
41
42
|
children: [
|
|
42
|
-
/* @__PURE__ */
|
|
43
|
-
icon: /* @__PURE__ */
|
|
44
|
-
children:
|
|
43
|
+
/* @__PURE__ */ g(h, {
|
|
44
|
+
icon: /* @__PURE__ */ g(o, { className: "size-4" }),
|
|
45
|
+
children: b("ggnomad.analytics.purpose", "Understand how the marketplace is performing — total revenue, bookings, active users and conversion rate at a glance, with a category breakdown to see which domains (stays, tours, events) are driving growth.")
|
|
45
46
|
}),
|
|
46
|
-
/* @__PURE__ */
|
|
47
|
+
/* @__PURE__ */ _(m, { children: [/* @__PURE__ */ g("p", {
|
|
47
48
|
className: "text-sm text-text-secondary",
|
|
48
|
-
children:
|
|
49
|
-
}), /* @__PURE__ */
|
|
49
|
+
children: b("ggnomad.analytics.totalRevenue", "Total revenue")
|
|
50
|
+
}), /* @__PURE__ */ _("p", {
|
|
50
51
|
className: "mt-1 text-3xl font-semibold tabular-nums text-text-primary",
|
|
51
|
-
children: ["$", Number(
|
|
52
|
+
children: ["$", Number(S?.totalRevenue ?? 0).toLocaleString()]
|
|
52
53
|
})] }),
|
|
53
|
-
/* @__PURE__ */
|
|
54
|
+
/* @__PURE__ */ _("section", {
|
|
54
55
|
className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-4",
|
|
55
56
|
children: [
|
|
56
|
-
/* @__PURE__ */
|
|
57
|
+
/* @__PURE__ */ g(r, {
|
|
57
58
|
hero: !0,
|
|
58
|
-
label:
|
|
59
|
-
value: `${Number(
|
|
60
|
-
icon: /* @__PURE__ */
|
|
59
|
+
label: b("ggnomad.analytics.conversion", "Conversion"),
|
|
60
|
+
value: `${Number(S?.conversionRate ?? 0).toFixed(2)}%`,
|
|
61
|
+
icon: /* @__PURE__ */ g(u, {})
|
|
61
62
|
}),
|
|
62
|
-
/* @__PURE__ */
|
|
63
|
-
label:
|
|
64
|
-
value: `$${Number(
|
|
65
|
-
icon: /* @__PURE__ */
|
|
63
|
+
/* @__PURE__ */ g(r, {
|
|
64
|
+
label: b("ggnomad.analytics.revenue", "Revenue"),
|
|
65
|
+
value: `$${Number(S?.totalRevenue ?? 0).toLocaleString()}`,
|
|
66
|
+
icon: /* @__PURE__ */ g(c, {})
|
|
66
67
|
}),
|
|
67
|
-
/* @__PURE__ */
|
|
68
|
-
label:
|
|
69
|
-
value: Number(
|
|
70
|
-
icon: /* @__PURE__ */
|
|
68
|
+
/* @__PURE__ */ g(r, {
|
|
69
|
+
label: b("ggnomad.analytics.bookings", "Bookings"),
|
|
70
|
+
value: Number(S?.totalBookings ?? 0).toLocaleString(),
|
|
71
|
+
icon: /* @__PURE__ */ g(s, {})
|
|
71
72
|
}),
|
|
72
|
-
/* @__PURE__ */
|
|
73
|
-
label:
|
|
74
|
-
value: Number(
|
|
75
|
-
icon: /* @__PURE__ */
|
|
73
|
+
/* @__PURE__ */ g(r, {
|
|
74
|
+
label: b("ggnomad.analytics.users", "Users"),
|
|
75
|
+
value: Number(S?.totalUsers ?? 0).toLocaleString(),
|
|
76
|
+
icon: /* @__PURE__ */ g(d, {})
|
|
76
77
|
})
|
|
77
78
|
]
|
|
78
79
|
}),
|
|
79
|
-
/* @__PURE__ */
|
|
80
|
-
title:
|
|
81
|
-
children:
|
|
80
|
+
/* @__PURE__ */ g(i, {
|
|
81
|
+
title: b("ggnomad.analytics.revenueByCategory", "Revenue by category"),
|
|
82
|
+
children: C.length === 0 ? /* @__PURE__ */ _("div", {
|
|
82
83
|
className: "flex flex-col items-center gap-2 py-8 text-center",
|
|
83
84
|
children: [
|
|
84
|
-
/* @__PURE__ */
|
|
85
|
+
/* @__PURE__ */ g("span", {
|
|
85
86
|
className: "flex size-10 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-text-secondary",
|
|
86
|
-
children: /* @__PURE__ */
|
|
87
|
+
children: /* @__PURE__ */ g(o, { className: "size-5" })
|
|
87
88
|
}),
|
|
88
|
-
/* @__PURE__ */
|
|
89
|
+
/* @__PURE__ */ g("p", {
|
|
89
90
|
className: "text-sm font-medium text-text-primary",
|
|
90
|
-
children:
|
|
91
|
+
children: b("ggnomad.analytics.empty.title", "No analytics yet")
|
|
91
92
|
}),
|
|
92
|
-
/* @__PURE__ */
|
|
93
|
+
/* @__PURE__ */ g("p", {
|
|
93
94
|
className: "max-w-sm text-sm text-text-secondary",
|
|
94
|
-
children:
|
|
95
|
+
children: b("ggnomad.analytics.empty.description", "Revenue by category appears here as bookings come in across stays, tours and events.")
|
|
95
96
|
})
|
|
96
97
|
]
|
|
97
|
-
}) : /* @__PURE__ */
|
|
98
|
+
}) : /* @__PURE__ */ g("ul", {
|
|
98
99
|
className: "flex flex-col gap-4",
|
|
99
|
-
children:
|
|
100
|
-
let n =
|
|
101
|
-
return /* @__PURE__ */
|
|
100
|
+
children: C.map((e, t) => {
|
|
101
|
+
let n = w > 0 ? Math.max(e.value / w * 100, 2) : 0;
|
|
102
|
+
return /* @__PURE__ */ _("li", { children: [/* @__PURE__ */ _("div", {
|
|
102
103
|
className: "flex items-baseline justify-between gap-3",
|
|
103
|
-
children: [/* @__PURE__ */
|
|
104
|
+
children: [/* @__PURE__ */ g("span", {
|
|
104
105
|
className: "truncate text-sm font-medium text-text-primary",
|
|
105
106
|
children: e.label
|
|
106
|
-
}), /* @__PURE__ */
|
|
107
|
+
}), /* @__PURE__ */ _("span", {
|
|
107
108
|
className: "flex-shrink-0 text-sm tabular-nums text-text-secondary",
|
|
108
109
|
children: ["$", e.value.toLocaleString()]
|
|
109
110
|
})]
|
|
110
|
-
}), /* @__PURE__ */
|
|
111
|
+
}), /* @__PURE__ */ g("div", {
|
|
111
112
|
className: "mt-1.5 h-2.5 w-full overflow-hidden rounded-full bg-bg-sunken",
|
|
112
|
-
children: /* @__PURE__ */
|
|
113
|
+
children: /* @__PURE__ */ g("div", {
|
|
113
114
|
className: "h-full rounded-full transition-[width] duration-500 ease-out",
|
|
114
115
|
style: {
|
|
115
116
|
width: `${n}%`,
|
|
116
|
-
backgroundColor:
|
|
117
|
+
backgroundColor: v[t % v.length]
|
|
117
118
|
}
|
|
118
119
|
})
|
|
119
120
|
})] }, e.label);
|
|
120
121
|
})
|
|
121
122
|
})
|
|
122
123
|
}),
|
|
123
|
-
|
|
124
|
-
title:
|
|
125
|
-
children: /* @__PURE__ */
|
|
124
|
+
D.length > 0 && /* @__PURE__ */ g(i, {
|
|
125
|
+
title: b("ggnomad.analytics.topDestinations", "Top destinations"),
|
|
126
|
+
children: /* @__PURE__ */ g("ul", {
|
|
126
127
|
className: "flex flex-col gap-4",
|
|
127
|
-
children:
|
|
128
|
+
children: D.map((e, t) => {
|
|
129
|
+
let n = O > 0 ? Math.max(e.value / O * 100, 2) : 0;
|
|
130
|
+
return /* @__PURE__ */ _("li", { children: [/* @__PURE__ */ _("div", {
|
|
131
|
+
className: "flex items-baseline justify-between gap-3",
|
|
132
|
+
children: [/* @__PURE__ */ _("span", {
|
|
133
|
+
className: "inline-flex min-w-0 items-center gap-1.5 truncate text-sm font-medium text-text-primary",
|
|
134
|
+
children: [/* @__PURE__ */ g(l, {
|
|
135
|
+
className: "size-3.5 flex-shrink-0 text-text-secondary",
|
|
136
|
+
"aria-hidden": "true"
|
|
137
|
+
}), e.label]
|
|
138
|
+
}), /* @__PURE__ */ g("span", {
|
|
139
|
+
className: "flex-shrink-0 text-sm tabular-nums text-text-secondary",
|
|
140
|
+
children: e.value.toLocaleString()
|
|
141
|
+
})]
|
|
142
|
+
}), /* @__PURE__ */ g("div", {
|
|
143
|
+
className: "mt-1.5 h-2.5 w-full overflow-hidden rounded-full bg-bg-sunken",
|
|
144
|
+
children: /* @__PURE__ */ g("div", {
|
|
145
|
+
className: "h-full rounded-full transition-[width] duration-500 ease-out",
|
|
146
|
+
style: {
|
|
147
|
+
width: `${n}%`,
|
|
148
|
+
backgroundColor: v[t % v.length]
|
|
149
|
+
}
|
|
150
|
+
})
|
|
151
|
+
})] }, e.label);
|
|
152
|
+
})
|
|
153
|
+
})
|
|
154
|
+
}),
|
|
155
|
+
T.length > 0 && /* @__PURE__ */ g(i, {
|
|
156
|
+
title: b("ggnomad.analytics.revenueTrend", "Revenue trend"),
|
|
157
|
+
children: /* @__PURE__ */ _("div", {
|
|
158
|
+
className: "flex flex-col gap-4",
|
|
159
|
+
children: [/* @__PURE__ */ g("div", {
|
|
128
160
|
className: "flex items-end gap-2 overflow-x-auto pb-2",
|
|
129
|
-
children:
|
|
161
|
+
children: T.map((e, t) => /* @__PURE__ */ _("div", {
|
|
130
162
|
className: "flex flex-col items-center gap-1",
|
|
131
|
-
children: [/* @__PURE__ */
|
|
163
|
+
children: [/* @__PURE__ */ g("div", {
|
|
132
164
|
className: "flex h-24 items-end",
|
|
133
|
-
children: /* @__PURE__ */
|
|
165
|
+
children: /* @__PURE__ */ g("div", {
|
|
134
166
|
className: "w-8 rounded-t transition-all duration-500 ease-out",
|
|
135
167
|
style: {
|
|
136
|
-
height: `${
|
|
137
|
-
backgroundColor:
|
|
168
|
+
height: `${E > 0 ? Math.max(e.value / E * 100, 5) : 5}%`,
|
|
169
|
+
backgroundColor: v[t % v.length]
|
|
138
170
|
},
|
|
139
171
|
title: `${e.label}: $${e.value.toLocaleString()}`
|
|
140
172
|
})
|
|
141
|
-
}), /* @__PURE__ */
|
|
173
|
+
}), /* @__PURE__ */ g("p", {
|
|
142
174
|
className: "truncate text-xs text-text-secondary",
|
|
143
175
|
children: e.label
|
|
144
176
|
})]
|
|
145
177
|
}, e.label))
|
|
146
|
-
}), /* @__PURE__ */
|
|
178
|
+
}), /* @__PURE__ */ g("p", {
|
|
147
179
|
className: "text-xs text-text-secondary",
|
|
148
|
-
children:
|
|
180
|
+
children: b("ggnomad.analytics.trendNote", "Revenue trends over time showing performance across all domains.")
|
|
149
181
|
})]
|
|
150
182
|
})
|
|
151
183
|
})
|
|
@@ -153,6 +185,6 @@ function v() {
|
|
|
153
185
|
});
|
|
154
186
|
}
|
|
155
187
|
//#endregion
|
|
156
|
-
export {
|
|
188
|
+
export { b as AnalyticsPage };
|
|
157
189
|
|
|
158
190
|
//# sourceMappingURL=AnalyticsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsPage.js","names":[],"sources":["../../../src/ggnomad/pages/AnalyticsPage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { BarChart3, CalendarCheck, DollarSign, Percent, Users } from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_OVERVIEW_QUERY } from '../graphql';\nimport { PageShell } from './PageShell';\nimport { SectionCard, StatCard } from '../components';\n\nconst CHART_COLORS = [\n 'var(--color-chart-1)',\n 'var(--color-chart-2)',\n 'var(--color-chart-3)',\n 'var(--color-chart-4)',\n 'var(--color-chart-5)',\n];\n\nconst humanizeCategory = (key: string): string =>\n key\n .replace(/[_-]+/g, ' ')\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase()) || key;\n\nexport function AnalyticsPage() {\n const { t } = useI18n();\n const { data } = useQuery(\n GGNOMAD_OVERVIEW_QUERY as TypedDocumentNode<\n {\n ggnomadAnalytics: {\n totalRevenue: number;\n totalBookings: number;\n totalUsers: number;\n conversionRate: number;\n revenueByCategory: Record<string, unknown>;\n monthlyTrends?: Array<{ month: string; revenue: number }> | Record<string, number>;\n };\n },\n Record<string, never>\n >\n );\n const analytics = data?.ggnomadAnalytics;\n\n const categories = useMemo(() => {\n const raw = analytics?.revenueByCategory ?? {};\n return Object.entries(raw)\n .map(([key, value]) => ({ label: humanizeCategory(key), value: Number(value) }))\n .filter((entry) => Number.isFinite(entry.value) && entry.value > 0)\n .sort((a, b) => b.value - a.value);\n }, [analytics?.revenueByCategory]);\n\n const maxCategory = categories.length > 0 ? categories[0].value : 0;\n\n const trends = useMemo(() => {\n const raw = analytics?.monthlyTrends;\n if (!raw) return [];\n if (Array.isArray(raw)) {\n return raw\n .map((entry) => ({\n label: entry.month || '',\n value: Number(entry.revenue || 0),\n }))\n .filter((entry) => Number.isFinite(entry.value) && entry.label);\n }\n return Object.entries(raw)\n .map(([key, value]) => ({\n label: key,\n value: Number(value),\n }))\n .filter((entry) => Number.isFinite(entry.value));\n }, [analytics?.monthlyTrends]);\n\n const maxTrend = trends.length > 0 ? Math.max(...trends.map((t) => t.value)) : 0;\n\n return (\n <PageShell\n title={t('ggnomad.analytics.title', 'Analytics')}\n titleAccent={t('ggnomad.analytics.title.accent', 'Analytics')}\n subtitle={t('ggnomad.analytics.subtitle', 'GGNomad performance and growth analytics')}\n >\n <PagePurpose icon={<BarChart3 className=\"size-4\" />}>\n {t(\n 'ggnomad.analytics.purpose',\n 'Understand how the marketplace is performing — total revenue, bookings, active users and conversion rate at a glance, with a category breakdown to see which domains (stays, tours, events) are driving growth.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <p className=\"text-sm text-text-secondary\">\n {t('ggnomad.analytics.totalRevenue', 'Total revenue')}\n </p>\n <p className=\"mt-1 text-3xl font-semibold tabular-nums text-text-primary\">\n ${Number(analytics?.totalRevenue ?? 0).toLocaleString()}\n </p>\n </EmphasisPanel>\n\n <section className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatCard\n hero\n label={t('ggnomad.analytics.conversion', 'Conversion')}\n value={`${Number(analytics?.conversionRate ?? 0).toFixed(2)}%`}\n icon={<Percent />}\n />\n <StatCard\n label={t('ggnomad.analytics.revenue', 'Revenue')}\n value={`$${Number(analytics?.totalRevenue ?? 0).toLocaleString()}`}\n icon={<DollarSign />}\n />\n <StatCard\n label={t('ggnomad.analytics.bookings', 'Bookings')}\n value={Number(analytics?.totalBookings ?? 0).toLocaleString()}\n icon={<CalendarCheck />}\n />\n <StatCard\n label={t('ggnomad.analytics.users', 'Users')}\n value={Number(analytics?.totalUsers ?? 0).toLocaleString()}\n icon={<Users />}\n />\n </section>\n\n <SectionCard title={t('ggnomad.analytics.revenueByCategory', 'Revenue by category')}>\n {categories.length === 0 ? (\n <div className=\"flex flex-col items-center gap-2 py-8 text-center\">\n <span className=\"flex size-10 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-text-secondary\">\n <BarChart3 className=\"size-5\" />\n </span>\n <p className=\"text-sm font-medium text-text-primary\">\n {t('ggnomad.analytics.empty.title', 'No analytics yet')}\n </p>\n <p className=\"max-w-sm text-sm text-text-secondary\">\n {t(\n 'ggnomad.analytics.empty.description',\n 'Revenue by category appears here as bookings come in across stays, tours and events.'\n )}\n </p>\n </div>\n ) : (\n <ul className=\"flex flex-col gap-4\">\n {categories.map((category, index) => {\n const pct = maxCategory > 0 ? Math.max((category.value / maxCategory) * 100, 2) : 0;\n return (\n <li key={category.label}>\n <div className=\"flex items-baseline justify-between gap-3\">\n <span className=\"truncate text-sm font-medium text-text-primary\">\n {category.label}\n </span>\n <span className=\"flex-shrink-0 text-sm tabular-nums text-text-secondary\">\n ${category.value.toLocaleString()}\n </span>\n </div>\n <div className=\"mt-1.5 h-2.5 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full transition-[width] duration-500 ease-out\"\n style={{\n width: `${pct}%`,\n backgroundColor: CHART_COLORS[index % CHART_COLORS.length],\n }}\n />\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </SectionCard>\n\n {trends.length > 0 && (\n <SectionCard title={t('ggnomad.analytics.revenueTrend', 'Revenue trend')}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-end gap-2 overflow-x-auto pb-2\">\n {trends.map((trend, index) => {\n const pct = maxTrend > 0 ? Math.max((trend.value / maxTrend) * 100, 5) : 5;\n return (\n <div key={trend.label} className=\"flex flex-col items-center gap-1\">\n <div className=\"flex h-24 items-end\">\n <div\n className=\"w-8 rounded-t transition-all duration-500 ease-out\"\n style={{\n height: `${pct}%`,\n backgroundColor: CHART_COLORS[index % CHART_COLORS.length],\n }}\n title={`${trend.label}: $${trend.value.toLocaleString()}`}\n />\n </div>\n <p className=\"truncate text-xs text-text-secondary\">{trend.label}</p>\n </div>\n );\n })}\n </div>\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'ggnomad.analytics.trendNote',\n 'Revenue trends over time showing performance across all domains.'\n )}\n </p>\n </div>\n </SectionCard>\n )}\n </PageShell>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AnalyticsPage.js","names":[],"sources":["../../../src/ggnomad/pages/AnalyticsPage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useQuery } from '@apollo/client/react';\nimport type { TypedDocumentNode } from '@apollo/client';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { BarChart3, CalendarCheck, DollarSign, MapPin, Percent, Users } from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\n\nimport { GGNOMAD_OVERVIEW_QUERY } from '../graphql';\nimport { parseNamedCounts } from '../utils/format';\nimport { PageShell } from './PageShell';\nimport { SectionCard, StatCard } from '../components';\n\nconst CHART_COLORS = [\n 'var(--color-chart-1)',\n 'var(--color-chart-2)',\n 'var(--color-chart-3)',\n 'var(--color-chart-4)',\n 'var(--color-chart-5)',\n];\n\nconst humanizeCategory = (key: string): string =>\n key\n .replace(/[_-]+/g, ' ')\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase()) || key;\n\nexport function AnalyticsPage() {\n const { t } = useI18n();\n const { data } = useQuery(\n GGNOMAD_OVERVIEW_QUERY as TypedDocumentNode<\n {\n ggnomadAnalytics: {\n totalRevenue: number;\n totalBookings: number;\n totalUsers: number;\n conversionRate: number;\n revenueByCategory: Record<string, unknown>;\n monthlyTrends?: Array<{ month: string; revenue: number }> | Record<string, number>;\n topDestinations?: unknown;\n };\n },\n Record<string, never>\n >\n );\n const analytics = data?.ggnomadAnalytics;\n\n const categories = useMemo(() => {\n const raw = analytics?.revenueByCategory ?? {};\n return Object.entries(raw)\n .map(([key, value]) => ({ label: humanizeCategory(key), value: Number(value) }))\n .filter((entry) => Number.isFinite(entry.value) && entry.value > 0)\n .sort((a, b) => b.value - a.value);\n }, [analytics?.revenueByCategory]);\n\n const maxCategory = categories.length > 0 ? categories[0].value : 0;\n\n const trends = useMemo(() => {\n const raw = analytics?.monthlyTrends;\n if (!raw) return [];\n if (Array.isArray(raw)) {\n return raw\n .map((entry) => ({\n label: entry.month || '',\n value: Number(entry.revenue || 0),\n }))\n .filter((entry) => Number.isFinite(entry.value) && entry.label);\n }\n return Object.entries(raw)\n .map(([key, value]) => ({\n label: key,\n value: Number(value),\n }))\n .filter((entry) => Number.isFinite(entry.value));\n }, [analytics?.monthlyTrends]);\n\n const maxTrend = trends.length > 0 ? Math.max(...trends.map((t) => t.value)) : 0;\n\n const destinations = useMemo(\n () =>\n parseNamedCounts(analytics?.topDestinations)\n .sort((a, b) => b.value - a.value)\n .slice(0, 10),\n [analytics?.topDestinations]\n );\n const maxDestination = destinations.length > 0 ? destinations[0].value : 0;\n\n return (\n <PageShell\n title={t('ggnomad.analytics.title', 'Analytics')}\n titleAccent={t('ggnomad.analytics.title.accent', 'Analytics')}\n subtitle={t('ggnomad.analytics.subtitle', 'GGNomad performance and growth analytics')}\n >\n <PagePurpose icon={<BarChart3 className=\"size-4\" />}>\n {t(\n 'ggnomad.analytics.purpose',\n 'Understand how the marketplace is performing — total revenue, bookings, active users and conversion rate at a glance, with a category breakdown to see which domains (stays, tours, events) are driving growth.'\n )}\n </PagePurpose>\n\n <EmphasisPanel>\n <p className=\"text-sm text-text-secondary\">\n {t('ggnomad.analytics.totalRevenue', 'Total revenue')}\n </p>\n <p className=\"mt-1 text-3xl font-semibold tabular-nums text-text-primary\">\n ${Number(analytics?.totalRevenue ?? 0).toLocaleString()}\n </p>\n </EmphasisPanel>\n\n <section className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatCard\n hero\n label={t('ggnomad.analytics.conversion', 'Conversion')}\n value={`${Number(analytics?.conversionRate ?? 0).toFixed(2)}%`}\n icon={<Percent />}\n />\n <StatCard\n label={t('ggnomad.analytics.revenue', 'Revenue')}\n value={`$${Number(analytics?.totalRevenue ?? 0).toLocaleString()}`}\n icon={<DollarSign />}\n />\n <StatCard\n label={t('ggnomad.analytics.bookings', 'Bookings')}\n value={Number(analytics?.totalBookings ?? 0).toLocaleString()}\n icon={<CalendarCheck />}\n />\n <StatCard\n label={t('ggnomad.analytics.users', 'Users')}\n value={Number(analytics?.totalUsers ?? 0).toLocaleString()}\n icon={<Users />}\n />\n </section>\n\n <SectionCard title={t('ggnomad.analytics.revenueByCategory', 'Revenue by category')}>\n {categories.length === 0 ? (\n <div className=\"flex flex-col items-center gap-2 py-8 text-center\">\n <span className=\"flex size-10 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-text-secondary\">\n <BarChart3 className=\"size-5\" />\n </span>\n <p className=\"text-sm font-medium text-text-primary\">\n {t('ggnomad.analytics.empty.title', 'No analytics yet')}\n </p>\n <p className=\"max-w-sm text-sm text-text-secondary\">\n {t(\n 'ggnomad.analytics.empty.description',\n 'Revenue by category appears here as bookings come in across stays, tours and events.'\n )}\n </p>\n </div>\n ) : (\n <ul className=\"flex flex-col gap-4\">\n {categories.map((category, index) => {\n const pct = maxCategory > 0 ? Math.max((category.value / maxCategory) * 100, 2) : 0;\n return (\n <li key={category.label}>\n <div className=\"flex items-baseline justify-between gap-3\">\n <span className=\"truncate text-sm font-medium text-text-primary\">\n {category.label}\n </span>\n <span className=\"flex-shrink-0 text-sm tabular-nums text-text-secondary\">\n ${category.value.toLocaleString()}\n </span>\n </div>\n <div className=\"mt-1.5 h-2.5 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full transition-[width] duration-500 ease-out\"\n style={{\n width: `${pct}%`,\n backgroundColor: CHART_COLORS[index % CHART_COLORS.length],\n }}\n />\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </SectionCard>\n\n {destinations.length > 0 && (\n <SectionCard title={t('ggnomad.analytics.topDestinations', 'Top destinations')}>\n <ul className=\"flex flex-col gap-4\">\n {destinations.map((destination, index) => {\n const pct =\n maxDestination > 0 ? Math.max((destination.value / maxDestination) * 100, 2) : 0;\n return (\n <li key={destination.label}>\n <div className=\"flex items-baseline justify-between gap-3\">\n <span className=\"inline-flex min-w-0 items-center gap-1.5 truncate text-sm font-medium text-text-primary\">\n <MapPin\n className=\"size-3.5 flex-shrink-0 text-text-secondary\"\n aria-hidden=\"true\"\n />\n {destination.label}\n </span>\n <span className=\"flex-shrink-0 text-sm tabular-nums text-text-secondary\">\n {destination.value.toLocaleString()}\n </span>\n </div>\n <div className=\"mt-1.5 h-2.5 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full transition-[width] duration-500 ease-out\"\n style={{\n width: `${pct}%`,\n backgroundColor: CHART_COLORS[index % CHART_COLORS.length],\n }}\n />\n </div>\n </li>\n );\n })}\n </ul>\n </SectionCard>\n )}\n\n {trends.length > 0 && (\n <SectionCard title={t('ggnomad.analytics.revenueTrend', 'Revenue trend')}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-end gap-2 overflow-x-auto pb-2\">\n {trends.map((trend, index) => {\n const pct = maxTrend > 0 ? Math.max((trend.value / maxTrend) * 100, 5) : 5;\n return (\n <div key={trend.label} className=\"flex flex-col items-center gap-1\">\n <div className=\"flex h-24 items-end\">\n <div\n className=\"w-8 rounded-t transition-all duration-500 ease-out\"\n style={{\n height: `${pct}%`,\n backgroundColor: CHART_COLORS[index % CHART_COLORS.length],\n }}\n title={`${trend.label}: $${trend.value.toLocaleString()}`}\n />\n </div>\n <p className=\"truncate text-xs text-text-secondary\">{trend.label}</p>\n </div>\n );\n })}\n </div>\n <p className=\"text-xs text-text-secondary\">\n {t(\n 'ggnomad.analytics.trendNote',\n 'Revenue trends over time showing performance across all domains.'\n )}\n </p>\n </div>\n </SectionCard>\n )}\n </PageShell>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookingsPage.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/pages/BookingsPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BookingsPage.d.ts","sourceRoot":"","sources":["../../../src/ggnomad/pages/BookingsPage.tsx"],"names":[],"mappings":"AA2EA,wBAAgB,YAAY,gCA4e3B"}
|