@burdenoff/microfe-proserviceworld 2026.624.1 → 2026.626.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/proserviceworld/pages/AdminReportsPage.js +396 -329
- package/dist/proserviceworld/pages/AdminReportsPage.js.map +1 -1
- package/dist/proserviceworld/pages/AdminUsersPage.js +261 -237
- package/dist/proserviceworld/pages/AdminUsersPage.js.map +1 -1
- package/dist/proserviceworld/pages/AnalyticsPage.js +373 -315
- package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -1
- package/dist/proserviceworld/pages/BookingsPage.js +221 -200
- package/dist/proserviceworld/pages/BookingsPage.js.map +1 -1
- package/dist/proserviceworld/pages/DashboardPage.js +474 -405
- package/dist/proserviceworld/pages/DashboardPage.js.map +1 -1
- package/dist/proserviceworld/pages/DocumentsPage.js +386 -317
- package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -1
- package/dist/proserviceworld/pages/MessagesPage.js +201 -192
- package/dist/proserviceworld/pages/MessagesPage.js.map +1 -1
- package/dist/proserviceworld/pages/PaymentsPage.js +398 -340
- package/dist/proserviceworld/pages/PaymentsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProjectsPage.js +543 -463
- package/dist/proserviceworld/pages/ProjectsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProviderDetailPage.js +420 -346
- package/dist/proserviceworld/pages/ProviderDetailPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProvidersPage.js +249 -244
- package/dist/proserviceworld/pages/ProvidersPage.js.map +1 -1
- package/dist/proserviceworld/pages/ReviewsPage.js +93 -76
- package/dist/proserviceworld/pages/ReviewsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ServiceDetailsPage.js +377 -309
- package/dist/proserviceworld/pages/ServiceDetailsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ServicesPage.js +116 -109
- package/dist/proserviceworld/pages/ServicesPage.js.map +1 -1
- package/dist/proserviceworld/pages/VerificationPage.js +264 -251
- package/dist/proserviceworld/pages/VerificationPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -2,10 +2,10 @@ import { useProServiceWorldStore as e } from "../store/proserviceworldStore.js";
|
|
|
2
2
|
import { useState as t } from "react";
|
|
3
3
|
import { Activity as n, ArrowDownRight as r, ArrowUpRight as i, BarChart3 as a, Calendar as o, DollarSign as s, Download as c, Globe as l, Minus as u, TrendingDown as d, TrendingUp as f, Users as p } from "lucide-react";
|
|
4
4
|
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
5
|
-
import {
|
|
5
|
+
import { AuroraBackground as g, Badge as _, Button as v, Card as y, CardContent as b, CardHeader as x, CardTitle as S, EmphasisPanel as C, GlassCard as w, GradientText as T, NextSteps as E, PagePurpose as D } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/proserviceworld/pages/AnalyticsPage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { analyticsMetrics:
|
|
7
|
+
function O() {
|
|
8
|
+
let { analyticsMetrics: O, revenueData: k, clientData: A, servicePerformance: j, geographicData: M } = e(), [N, P] = t("overview"), [F, I] = t("6m"), L = [
|
|
9
9
|
{
|
|
10
10
|
key: "overview",
|
|
11
11
|
label: "Overview",
|
|
@@ -31,84 +31,121 @@ function S() {
|
|
|
31
31
|
label: "Performance",
|
|
32
32
|
icon: f
|
|
33
33
|
}
|
|
34
|
-
],
|
|
34
|
+
], R = (e) => e === "positive" ? /* @__PURE__ */ m(f, { className: "h-4 w-4 text-status-success-text" }) : e === "negative" ? /* @__PURE__ */ m(d, { className: "h-4 w-4 text-status-error-text" }) : /* @__PURE__ */ m(u, { className: "h-4 w-4 text-text-muted" }), z = Math.max(...k.map((e) => e.value)), B = Math.max(...A.map((e) => e.value)), V = Math.max(...j.map((e) => e.value));
|
|
35
35
|
return /* @__PURE__ */ h("div", {
|
|
36
|
-
className: "space-y-6 p-6",
|
|
36
|
+
className: "space-y-6 p-6 bg-bg-canvas min-h-screen",
|
|
37
37
|
children: [
|
|
38
38
|
/* @__PURE__ */ h("div", {
|
|
39
|
-
className: "
|
|
40
|
-
children: [/* @__PURE__ */
|
|
41
|
-
className: "
|
|
42
|
-
children: "
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
className: "flex
|
|
50
|
-
children: [
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
39
|
+
className: "relative overflow-hidden rounded-card -mx-2 px-2 pt-1",
|
|
40
|
+
children: [/* @__PURE__ */ m(g, { intensity: "subtle" }), /* @__PURE__ */ h("div", {
|
|
41
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
42
|
+
children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h1", {
|
|
43
|
+
className: "text-2xl font-semibold tracking-tight",
|
|
44
|
+
children: /* @__PURE__ */ m(T, { children: "Analytics" })
|
|
45
|
+
}), /* @__PURE__ */ m("p", {
|
|
46
|
+
className: "text-sm text-text-secondary",
|
|
47
|
+
children: "Insights and performance metrics for your professional services."
|
|
48
|
+
})] }), /* @__PURE__ */ h("div", {
|
|
49
|
+
className: "flex items-center gap-2",
|
|
50
|
+
children: [/* @__PURE__ */ m("div", {
|
|
51
|
+
className: "flex rounded border border-border-seam overflow-hidden",
|
|
52
|
+
children: [
|
|
53
|
+
"1m",
|
|
54
|
+
"3m",
|
|
55
|
+
"6m",
|
|
56
|
+
"1y"
|
|
57
|
+
].map((e) => /* @__PURE__ */ m("button", {
|
|
58
|
+
onClick: () => I(e),
|
|
59
|
+
"aria-pressed": F === e,
|
|
60
|
+
className: `px-3 py-1 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus ${F === e ? "bg-action-primary-bg text-action-primary-text" : "text-text-secondary hover:bg-bg-sunken/50"}`,
|
|
61
|
+
children: e.toUpperCase()
|
|
62
|
+
}, e))
|
|
63
|
+
}), /* @__PURE__ */ h(v, {
|
|
64
|
+
variant: "outline",
|
|
65
|
+
size: "sm",
|
|
66
|
+
children: [/* @__PURE__ */ m(c, { className: "mr-2 h-4 w-4" }), " Export"]
|
|
67
|
+
})]
|
|
64
68
|
})]
|
|
65
69
|
})]
|
|
66
70
|
}),
|
|
71
|
+
/* @__PURE__ */ m(D, {
|
|
72
|
+
icon: /* @__PURE__ */ m(a, { className: "h-4 w-4" }),
|
|
73
|
+
children: "Understand how your professional services are performing. Track revenue and client growth over time, see which services and regions drive the most demand, and export the numbers — so you can double down on what works and plan where to grow next."
|
|
74
|
+
}),
|
|
75
|
+
/* @__PURE__ */ m(E, {
|
|
76
|
+
storageKey: "proserviceworld-analytics",
|
|
77
|
+
steps: [
|
|
78
|
+
{
|
|
79
|
+
id: "revenue",
|
|
80
|
+
label: "Inspect revenue performance",
|
|
81
|
+
description: "Open the Revenue tab to see month-over-month growth.",
|
|
82
|
+
icon: /* @__PURE__ */ m(s, { className: "h-4 w-4" }),
|
|
83
|
+
onClick: () => P("revenue")
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "services",
|
|
87
|
+
label: "Find your top services",
|
|
88
|
+
description: "See which services attract the most bookings.",
|
|
89
|
+
icon: /* @__PURE__ */ m(n, { className: "h-4 w-4" }),
|
|
90
|
+
onClick: () => P("services")
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
id: "clients",
|
|
94
|
+
label: "Track client acquisition",
|
|
95
|
+
description: "Review client growth and geographic reach.",
|
|
96
|
+
icon: /* @__PURE__ */ m(p, { className: "h-4 w-4" }),
|
|
97
|
+
onClick: () => P("clients")
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}),
|
|
67
101
|
/* @__PURE__ */ m("div", {
|
|
68
|
-
className: "flex gap-1 border-b",
|
|
69
|
-
children:
|
|
70
|
-
onClick: () =>
|
|
71
|
-
|
|
102
|
+
className: "flex flex-wrap gap-1 border-b border-border-seam",
|
|
103
|
+
children: L.map(({ key: e, label: t, icon: n }) => /* @__PURE__ */ h("button", {
|
|
104
|
+
onClick: () => P(e),
|
|
105
|
+
"aria-pressed": N === e,
|
|
106
|
+
className: `flex items-center gap-2 border-b-2 px-4 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus ${N === e ? "border-action-primary-bg text-text-primary" : "border-transparent text-text-secondary hover:text-text-primary"}`,
|
|
72
107
|
children: [/* @__PURE__ */ m(n, { className: "h-4 w-4" }), t]
|
|
73
108
|
}, e))
|
|
74
109
|
}),
|
|
75
110
|
/* @__PURE__ */ m("div", {
|
|
76
111
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-5",
|
|
77
|
-
children:
|
|
78
|
-
|
|
112
|
+
children: O.map((e, t) => /* @__PURE__ */ h(w, {
|
|
113
|
+
treatment: t === 0 ? "glass" : "metric",
|
|
114
|
+
glow: t === 0,
|
|
115
|
+
className: "border-border-seam",
|
|
79
116
|
children: [
|
|
80
117
|
/* @__PURE__ */ h("div", {
|
|
81
118
|
className: "flex items-center justify-between",
|
|
82
119
|
children: [/* @__PURE__ */ m("p", {
|
|
83
120
|
className: "text-xs font-medium text-text-secondary",
|
|
84
121
|
children: e.label
|
|
85
|
-
}),
|
|
122
|
+
}), R(e.changeType)]
|
|
86
123
|
}),
|
|
87
124
|
/* @__PURE__ */ m("p", {
|
|
88
|
-
className: "mt-1 text-2xl font-bold",
|
|
125
|
+
className: "mt-1 text-2xl font-bold tabular-nums",
|
|
89
126
|
children: e.value
|
|
90
127
|
}),
|
|
91
128
|
/* @__PURE__ */ h("p", {
|
|
92
|
-
className: `mt-0.5 text-xs ${e.changeType === "positive" ? "text-
|
|
129
|
+
className: `mt-0.5 text-xs ${e.changeType === "positive" ? "text-status-success-text" : e.changeType === "negative" ? "text-status-error-text" : "text-text-muted"}`,
|
|
93
130
|
children: [e.change, " from last period"]
|
|
94
131
|
})
|
|
95
132
|
]
|
|
96
|
-
}
|
|
133
|
+
}, t))
|
|
97
134
|
}),
|
|
98
|
-
|
|
135
|
+
N === "overview" && /* @__PURE__ */ h("div", {
|
|
99
136
|
className: "grid gap-6 lg:grid-cols-2",
|
|
100
|
-
children: [/* @__PURE__ */ h(
|
|
101
|
-
className: "flex items-center justify-between",
|
|
102
|
-
children: [/* @__PURE__ */ m(
|
|
103
|
-
className: "text-base",
|
|
137
|
+
children: [/* @__PURE__ */ h(C, { children: [/* @__PURE__ */ h("div", {
|
|
138
|
+
className: "flex items-center justify-between mb-4",
|
|
139
|
+
children: [/* @__PURE__ */ m("h2", {
|
|
140
|
+
className: "text-base font-semibold tracking-tight",
|
|
104
141
|
children: "Revenue Trend"
|
|
105
|
-
}), /* @__PURE__ */ m(
|
|
142
|
+
}), /* @__PURE__ */ m(_, {
|
|
106
143
|
variant: "secondary",
|
|
107
144
|
children: "Last 6 months"
|
|
108
145
|
})]
|
|
109
|
-
})
|
|
146
|
+
}), /* @__PURE__ */ m("div", {
|
|
110
147
|
className: "space-y-3",
|
|
111
|
-
children:
|
|
148
|
+
children: k.map((e) => /* @__PURE__ */ h("div", {
|
|
112
149
|
className: "flex items-center gap-3",
|
|
113
150
|
children: [
|
|
114
151
|
/* @__PURE__ */ m("span", {
|
|
@@ -118,15 +155,15 @@ function S() {
|
|
|
118
155
|
/* @__PURE__ */ h("div", {
|
|
119
156
|
className: "relative flex-1 h-6 bg-bg-sunken rounded overflow-hidden",
|
|
120
157
|
children: [e.prev !== void 0 && /* @__PURE__ */ m("div", {
|
|
121
|
-
className: "absolute h-6 bg-muted
|
|
122
|
-
style: { width: `${e.prev /
|
|
158
|
+
className: "absolute h-6 bg-text-muted/15 rounded",
|
|
159
|
+
style: { width: `${e.prev / z * 100}%` }
|
|
123
160
|
}), /* @__PURE__ */ m("div", {
|
|
124
|
-
className: "relative h-6 bg-action-primary-bg rounded",
|
|
125
|
-
style: { width: `${e.value /
|
|
161
|
+
className: "relative h-6 bg-action-primary-bg rounded shadow-[var(--shadow-glow)]",
|
|
162
|
+
style: { width: `${e.value / z * 100}%` }
|
|
126
163
|
})]
|
|
127
164
|
}),
|
|
128
165
|
/* @__PURE__ */ h("span", {
|
|
129
|
-
className: "w-20 text-right text-xs font-medium",
|
|
166
|
+
className: "w-20 text-right text-xs font-medium tabular-nums",
|
|
130
167
|
children: [
|
|
131
168
|
"$",
|
|
132
169
|
(e.value / 1e3).toFixed(1),
|
|
@@ -135,299 +172,320 @@ function S() {
|
|
|
135
172
|
})
|
|
136
173
|
]
|
|
137
174
|
}, e.name))
|
|
138
|
-
})] }), /* @__PURE__ */ h(
|
|
139
|
-
className: "
|
|
140
|
-
children: [/* @__PURE__ */ m(x, {
|
|
141
|
-
className: "
|
|
142
|
-
children:
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
className: "
|
|
151
|
-
children:
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
className: "h-6 bg-
|
|
160
|
-
|
|
175
|
+
})] }), /* @__PURE__ */ h(y, {
|
|
176
|
+
className: "border-border-seam",
|
|
177
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ h("div", {
|
|
178
|
+
className: "flex items-center justify-between",
|
|
179
|
+
children: [/* @__PURE__ */ m(S, {
|
|
180
|
+
className: "text-base",
|
|
181
|
+
children: "Client Growth"
|
|
182
|
+
}), /* @__PURE__ */ m(_, {
|
|
183
|
+
variant: "secondary",
|
|
184
|
+
children: "Monthly"
|
|
185
|
+
})]
|
|
186
|
+
}) }), /* @__PURE__ */ m(b, {
|
|
187
|
+
className: "space-y-3",
|
|
188
|
+
children: A.map((e) => /* @__PURE__ */ h("div", {
|
|
189
|
+
className: "flex items-center gap-3",
|
|
190
|
+
children: [
|
|
191
|
+
/* @__PURE__ */ m("span", {
|
|
192
|
+
className: "w-10 text-xs text-text-secondary",
|
|
193
|
+
children: e.name
|
|
194
|
+
}),
|
|
195
|
+
/* @__PURE__ */ m("div", {
|
|
196
|
+
className: "flex-1 h-6 bg-bg-sunken rounded overflow-hidden",
|
|
197
|
+
children: /* @__PURE__ */ m("div", {
|
|
198
|
+
className: "h-6 bg-accent-blue rounded",
|
|
199
|
+
style: { width: `${e.value / B * 100}%` }
|
|
200
|
+
})
|
|
201
|
+
}),
|
|
202
|
+
/* @__PURE__ */ m("span", {
|
|
203
|
+
className: "w-12 text-right text-xs font-medium tabular-nums",
|
|
204
|
+
children: e.value
|
|
161
205
|
})
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
})
|
|
167
|
-
]
|
|
168
|
-
}, e.name))
|
|
169
|
-
})] })]
|
|
206
|
+
]
|
|
207
|
+
}, e.name))
|
|
208
|
+
})]
|
|
209
|
+
})]
|
|
170
210
|
}),
|
|
171
|
-
|
|
211
|
+
N === "revenue" && /* @__PURE__ */ m("div", {
|
|
172
212
|
className: "space-y-6",
|
|
173
|
-
children: /* @__PURE__ */ h(
|
|
174
|
-
className: "
|
|
175
|
-
children:
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
children:
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
className: "flex items-center
|
|
184
|
-
children: [/* @__PURE__ */
|
|
185
|
-
className: "flex
|
|
186
|
-
children: /* @__PURE__ */ m(
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
children: [
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
className: "text-
|
|
202
|
-
children: [
|
|
203
|
-
"
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
213
|
+
children: /* @__PURE__ */ h(y, {
|
|
214
|
+
className: "border-border-seam",
|
|
215
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, {
|
|
216
|
+
className: "text-base",
|
|
217
|
+
children: "Revenue Breakdown"
|
|
218
|
+
}) }), /* @__PURE__ */ m(b, { children: /* @__PURE__ */ m("div", {
|
|
219
|
+
className: "space-y-4",
|
|
220
|
+
children: k.map((e) => {
|
|
221
|
+
let t = e.prev ? ((e.value - e.prev) / e.prev * 100).toFixed(1) : "0", n = e.prev ? e.value >= e.prev : !0;
|
|
222
|
+
return /* @__PURE__ */ h("div", {
|
|
223
|
+
className: "flex items-center justify-between rounded-lg border border-border-seam p-4 transition-shadow hover:shadow-pop",
|
|
224
|
+
children: [/* @__PURE__ */ h("div", {
|
|
225
|
+
className: "flex items-center gap-4",
|
|
226
|
+
children: [/* @__PURE__ */ m("div", {
|
|
227
|
+
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-accent-soft",
|
|
228
|
+
children: /* @__PURE__ */ m(o, { className: "h-5 w-5 text-text-primary" })
|
|
229
|
+
}), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("p", {
|
|
230
|
+
className: "font-medium",
|
|
231
|
+
children: [e.name, " 2025"]
|
|
232
|
+
}), /* @__PURE__ */ h("p", {
|
|
233
|
+
className: "text-sm text-text-secondary tabular-nums",
|
|
234
|
+
children: [
|
|
235
|
+
"Previous: $",
|
|
236
|
+
((e.prev ?? 0) / 1e3).toFixed(1),
|
|
237
|
+
"k"
|
|
238
|
+
]
|
|
239
|
+
})] })]
|
|
240
|
+
}), /* @__PURE__ */ h("div", {
|
|
241
|
+
className: "text-right",
|
|
242
|
+
children: [/* @__PURE__ */ h("p", {
|
|
243
|
+
className: "text-lg font-bold tabular-nums",
|
|
244
|
+
children: [
|
|
245
|
+
"$",
|
|
246
|
+
(e.value / 1e3).toFixed(1),
|
|
247
|
+
"k"
|
|
248
|
+
]
|
|
249
|
+
}), /* @__PURE__ */ h("p", {
|
|
250
|
+
className: `flex items-center justify-end gap-1 text-xs tabular-nums ${n ? "text-status-success-text" : "text-status-error-text"}`,
|
|
251
|
+
children: [
|
|
252
|
+
m(n ? i : r, { className: "h-3 w-3" }),
|
|
253
|
+
t,
|
|
254
|
+
"%"
|
|
255
|
+
]
|
|
256
|
+
})]
|
|
214
257
|
})]
|
|
215
|
-
})
|
|
216
|
-
}
|
|
217
|
-
})
|
|
218
|
-
})
|
|
258
|
+
}, e.name);
|
|
259
|
+
})
|
|
260
|
+
}) })]
|
|
261
|
+
})
|
|
219
262
|
}),
|
|
220
|
-
|
|
263
|
+
N === "clients" && /* @__PURE__ */ h("div", {
|
|
221
264
|
className: "space-y-6",
|
|
222
|
-
children: [/* @__PURE__ */ h(
|
|
223
|
-
className: "
|
|
224
|
-
children:
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
className: "flex-
|
|
265
|
+
children: [/* @__PURE__ */ h(y, {
|
|
266
|
+
className: "border-border-seam",
|
|
267
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, {
|
|
268
|
+
className: "text-base",
|
|
269
|
+
children: "Client Acquisition"
|
|
270
|
+
}) }), /* @__PURE__ */ m(b, {
|
|
271
|
+
className: "space-y-3",
|
|
272
|
+
children: A.map((e, t) => {
|
|
273
|
+
let n = t > 0 ? A[t - 1]?.value ?? 0 : 0, r = n > 0 ? ((e.value - n) / n * 100).toFixed(0) : "N/A";
|
|
274
|
+
return /* @__PURE__ */ h("div", {
|
|
275
|
+
className: "flex items-center gap-4 rounded-lg border border-border-seam p-3",
|
|
233
276
|
children: [/* @__PURE__ */ h("div", {
|
|
234
|
-
className: "flex
|
|
235
|
-
children: [/* @__PURE__ */
|
|
236
|
-
className: "
|
|
237
|
-
children:
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
277
|
+
className: "flex-1",
|
|
278
|
+
children: [/* @__PURE__ */ h("div", {
|
|
279
|
+
className: "flex items-center justify-between",
|
|
280
|
+
children: [/* @__PURE__ */ m("span", {
|
|
281
|
+
className: "font-medium",
|
|
282
|
+
children: e.name
|
|
283
|
+
}), /* @__PURE__ */ h("span", {
|
|
284
|
+
className: "text-lg font-bold tabular-nums",
|
|
285
|
+
children: [e.value, " clients"]
|
|
286
|
+
})]
|
|
287
|
+
}), /* @__PURE__ */ m("div", {
|
|
288
|
+
className: "mt-2 h-2 overflow-hidden rounded-full bg-bg-sunken",
|
|
289
|
+
children: /* @__PURE__ */ m("div", {
|
|
290
|
+
className: "h-2 rounded-full bg-accent-blue",
|
|
291
|
+
style: { width: `${e.value / B * 100}%` }
|
|
292
|
+
})
|
|
241
293
|
})]
|
|
242
|
-
}), /* @__PURE__ */ m(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
style: { width: `${e.value / P * 100}%` }
|
|
247
|
-
})
|
|
294
|
+
}), /* @__PURE__ */ m(_, {
|
|
295
|
+
variant: "secondary",
|
|
296
|
+
className: "text-xs tabular-nums",
|
|
297
|
+
children: typeof r == "string" ? r : `+${r}%`
|
|
248
298
|
})]
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
className: "text-xs",
|
|
252
|
-
children: typeof r == "string" ? r : `+${r}%`
|
|
253
|
-
})]
|
|
254
|
-
}, e.name);
|
|
255
|
-
})
|
|
256
|
-
})] }), /* @__PURE__ */ h(v, { children: [/* @__PURE__ */ m(b, { children: /* @__PURE__ */ h("div", {
|
|
257
|
-
className: "flex items-center gap-2",
|
|
258
|
-
children: [/* @__PURE__ */ m(l, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ m(x, {
|
|
259
|
-
className: "text-base",
|
|
260
|
-
children: "Geographic Distribution"
|
|
299
|
+
}, e.name);
|
|
300
|
+
})
|
|
261
301
|
})]
|
|
262
|
-
})
|
|
263
|
-
className: "
|
|
264
|
-
children: /* @__PURE__ */ h("
|
|
265
|
-
className: "
|
|
266
|
-
children: [/* @__PURE__ */ m(
|
|
267
|
-
className: "
|
|
268
|
-
children:
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
}),
|
|
277
|
-
/* @__PURE__ */ m("th", {
|
|
278
|
-
className: "p-3 text-right",
|
|
279
|
-
children: "Revenue"
|
|
280
|
-
}),
|
|
281
|
-
/* @__PURE__ */ m("th", {
|
|
282
|
-
className: "p-3",
|
|
283
|
-
children: "Distribution"
|
|
284
|
-
})
|
|
285
|
-
]
|
|
286
|
-
}) }), /* @__PURE__ */ m("tbody", { children: E.map((e) => {
|
|
287
|
-
let t = E.reduce((e, t) => e + t.clients, 0), n = Math.round(e.clients / t * 100);
|
|
288
|
-
return /* @__PURE__ */ h("tr", {
|
|
289
|
-
className: "border-b hover:bg-bg-sunken/50",
|
|
302
|
+
}), /* @__PURE__ */ h(y, {
|
|
303
|
+
className: "border-border-seam",
|
|
304
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ h("div", {
|
|
305
|
+
className: "flex items-center gap-2",
|
|
306
|
+
children: [/* @__PURE__ */ m(l, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ m(S, {
|
|
307
|
+
className: "text-base",
|
|
308
|
+
children: "Geographic Distribution"
|
|
309
|
+
})]
|
|
310
|
+
}) }), /* @__PURE__ */ m(b, { children: /* @__PURE__ */ m("div", {
|
|
311
|
+
className: "overflow-x-auto",
|
|
312
|
+
children: /* @__PURE__ */ h("table", {
|
|
313
|
+
className: "w-full text-sm",
|
|
314
|
+
children: [/* @__PURE__ */ m("thead", { children: /* @__PURE__ */ h("tr", {
|
|
315
|
+
className: "border-b border-border-seam text-left text-text-secondary",
|
|
290
316
|
children: [
|
|
291
|
-
/* @__PURE__ */ m("
|
|
317
|
+
/* @__PURE__ */ m("th", {
|
|
292
318
|
className: "p-3 font-medium",
|
|
293
|
-
children:
|
|
319
|
+
children: "Country"
|
|
294
320
|
}),
|
|
295
|
-
/* @__PURE__ */ m("
|
|
296
|
-
className: "p-3 text-right",
|
|
297
|
-
children:
|
|
321
|
+
/* @__PURE__ */ m("th", {
|
|
322
|
+
className: "p-3 text-right font-medium",
|
|
323
|
+
children: "Clients"
|
|
298
324
|
}),
|
|
299
|
-
/* @__PURE__ */
|
|
300
|
-
className: "p-3 text-right",
|
|
301
|
-
children:
|
|
302
|
-
"$",
|
|
303
|
-
(e.revenue / 1e3).toFixed(0),
|
|
304
|
-
"k"
|
|
305
|
-
]
|
|
325
|
+
/* @__PURE__ */ m("th", {
|
|
326
|
+
className: "p-3 text-right font-medium",
|
|
327
|
+
children: "Revenue"
|
|
306
328
|
}),
|
|
307
|
-
/* @__PURE__ */ m("
|
|
308
|
-
className: "p-3",
|
|
309
|
-
children:
|
|
310
|
-
className: "flex items-center gap-2",
|
|
311
|
-
children: [/* @__PURE__ */ m("div", {
|
|
312
|
-
className: "h-2 flex-1 overflow-hidden rounded-full bg-bg-sunken",
|
|
313
|
-
children: /* @__PURE__ */ m("div", {
|
|
314
|
-
className: "h-2 rounded-full bg-action-primary-bg",
|
|
315
|
-
style: { width: `${n}%` }
|
|
316
|
-
})
|
|
317
|
-
}), /* @__PURE__ */ h("span", {
|
|
318
|
-
className: "w-10 text-right text-xs text-text-secondary",
|
|
319
|
-
children: [n, "%"]
|
|
320
|
-
})]
|
|
321
|
-
})
|
|
329
|
+
/* @__PURE__ */ m("th", {
|
|
330
|
+
className: "p-3 font-medium",
|
|
331
|
+
children: "Distribution"
|
|
322
332
|
})
|
|
323
333
|
]
|
|
324
|
-
}, e
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
334
|
+
}) }), /* @__PURE__ */ m("tbody", { children: M.map((e) => {
|
|
335
|
+
let t = M.reduce((e, t) => e + t.clients, 0), n = Math.round(e.clients / t * 100);
|
|
336
|
+
return /* @__PURE__ */ h("tr", {
|
|
337
|
+
className: "border-b border-border-seam transition-colors hover:bg-bg-sunken/50",
|
|
338
|
+
children: [
|
|
339
|
+
/* @__PURE__ */ m("td", {
|
|
340
|
+
className: "p-3 font-medium",
|
|
341
|
+
children: e.country
|
|
342
|
+
}),
|
|
343
|
+
/* @__PURE__ */ m("td", {
|
|
344
|
+
className: "p-3 text-right tabular-nums",
|
|
345
|
+
children: e.clients
|
|
346
|
+
}),
|
|
347
|
+
/* @__PURE__ */ h("td", {
|
|
348
|
+
className: "p-3 text-right tabular-nums",
|
|
349
|
+
children: [
|
|
350
|
+
"$",
|
|
351
|
+
(e.revenue / 1e3).toFixed(0),
|
|
352
|
+
"k"
|
|
353
|
+
]
|
|
354
|
+
}),
|
|
355
|
+
/* @__PURE__ */ m("td", {
|
|
356
|
+
className: "p-3",
|
|
357
|
+
children: /* @__PURE__ */ h("div", {
|
|
358
|
+
className: "flex items-center gap-2",
|
|
359
|
+
children: [/* @__PURE__ */ m("div", {
|
|
360
|
+
className: "h-2 flex-1 overflow-hidden rounded-full bg-bg-sunken",
|
|
361
|
+
children: /* @__PURE__ */ m("div", {
|
|
362
|
+
className: "h-2 rounded-full bg-action-primary-bg",
|
|
363
|
+
style: { width: `${n}%` }
|
|
364
|
+
})
|
|
365
|
+
}), /* @__PURE__ */ h("span", {
|
|
366
|
+
className: "w-10 text-right text-xs text-text-secondary tabular-nums",
|
|
367
|
+
children: [n, "%"]
|
|
368
|
+
})]
|
|
369
|
+
})
|
|
370
|
+
})
|
|
371
|
+
]
|
|
372
|
+
}, e.country);
|
|
373
|
+
}) })]
|
|
374
|
+
})
|
|
375
|
+
}) })]
|
|
376
|
+
})]
|
|
328
377
|
}),
|
|
329
|
-
|
|
330
|
-
className: "
|
|
331
|
-
children:
|
|
332
|
-
}) }), /* @__PURE__ */ m(y, {
|
|
333
|
-
className: "space-y-3",
|
|
334
|
-
children: [...T].sort((e, t) => t.value - e.value).map((e, t) => /* @__PURE__ */ h("div", {
|
|
335
|
-
className: "flex items-center gap-4",
|
|
336
|
-
children: [/* @__PURE__ */ h("span", {
|
|
337
|
-
className: "w-6 text-sm font-medium text-text-secondary",
|
|
338
|
-
children: ["#", t + 1]
|
|
339
|
-
}), /* @__PURE__ */ h("div", {
|
|
340
|
-
className: "flex-1",
|
|
341
|
-
children: [/* @__PURE__ */ h("div", {
|
|
342
|
-
className: "flex items-center justify-between",
|
|
343
|
-
children: [/* @__PURE__ */ m("span", {
|
|
344
|
-
className: "text-sm font-medium",
|
|
345
|
-
children: e.name
|
|
346
|
-
}), /* @__PURE__ */ m("span", {
|
|
347
|
-
className: "text-sm font-bold",
|
|
348
|
-
children: e.value
|
|
349
|
-
})]
|
|
350
|
-
}), /* @__PURE__ */ m("div", {
|
|
351
|
-
className: "mt-1 h-3 overflow-hidden rounded-full bg-bg-sunken",
|
|
352
|
-
children: /* @__PURE__ */ m("div", {
|
|
353
|
-
className: "h-3 rounded-full bg-action-primary-bg transition-all",
|
|
354
|
-
style: { width: `${e.value / F * 100}%` }
|
|
355
|
-
})
|
|
356
|
-
})]
|
|
357
|
-
})]
|
|
358
|
-
}, e.name))
|
|
359
|
-
})] }),
|
|
360
|
-
D === "performance" && /* @__PURE__ */ h("div", {
|
|
361
|
-
className: "grid gap-6 lg:grid-cols-2",
|
|
362
|
-
children: [/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ m(b, { children: /* @__PURE__ */ m(x, {
|
|
378
|
+
N === "services" && /* @__PURE__ */ h(y, {
|
|
379
|
+
className: "border-border-seam",
|
|
380
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, {
|
|
363
381
|
className: "text-base",
|
|
364
|
-
children: "
|
|
365
|
-
}) }), /* @__PURE__ */
|
|
382
|
+
children: "Service Performance (Total Bookings)"
|
|
383
|
+
}) }), /* @__PURE__ */ m(b, {
|
|
366
384
|
className: "space-y-3",
|
|
367
|
-
children: [
|
|
368
|
-
className: "
|
|
369
|
-
children: [/* @__PURE__ */ h("
|
|
370
|
-
className: "
|
|
371
|
-
children: [
|
|
372
|
-
className: "font-medium",
|
|
373
|
-
children: e.name
|
|
374
|
-
}), /* @__PURE__ */ h("span", {
|
|
375
|
-
className: "text-text-secondary",
|
|
376
|
-
children: [
|
|
377
|
-
"$",
|
|
378
|
-
(e.value / 1e3).toFixed(1),
|
|
379
|
-
"k vs $",
|
|
380
|
-
((e.prev ?? 0) / 1e3).toFixed(1),
|
|
381
|
-
"k"
|
|
382
|
-
]
|
|
383
|
-
})]
|
|
385
|
+
children: [...j].sort((e, t) => t.value - e.value).map((e, t) => /* @__PURE__ */ h("div", {
|
|
386
|
+
className: "flex items-center gap-4",
|
|
387
|
+
children: [/* @__PURE__ */ h("span", {
|
|
388
|
+
className: "w-6 text-sm font-medium text-text-secondary tabular-nums",
|
|
389
|
+
children: ["#", t + 1]
|
|
384
390
|
}), /* @__PURE__ */ h("div", {
|
|
385
|
-
className: "flex
|
|
386
|
-
children: [/* @__PURE__ */
|
|
387
|
-
className: "
|
|
388
|
-
|
|
391
|
+
className: "flex-1",
|
|
392
|
+
children: [/* @__PURE__ */ h("div", {
|
|
393
|
+
className: "flex items-center justify-between",
|
|
394
|
+
children: [/* @__PURE__ */ m("span", {
|
|
395
|
+
className: "text-sm font-medium",
|
|
396
|
+
children: e.name
|
|
397
|
+
}), /* @__PURE__ */ m("span", {
|
|
398
|
+
className: "text-sm font-bold tabular-nums",
|
|
399
|
+
children: e.value
|
|
400
|
+
})]
|
|
389
401
|
}), /* @__PURE__ */ m("div", {
|
|
390
|
-
className: "h-
|
|
391
|
-
|
|
402
|
+
className: "mt-1 h-3 overflow-hidden rounded-full bg-bg-sunken",
|
|
403
|
+
children: /* @__PURE__ */ m("div", {
|
|
404
|
+
className: "h-3 rounded-full bg-action-primary-bg transition-all",
|
|
405
|
+
style: { width: `${e.value / V * 100}%` }
|
|
406
|
+
})
|
|
392
407
|
})]
|
|
393
408
|
})]
|
|
394
|
-
}, e.name))
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
409
|
+
}, e.name))
|
|
410
|
+
})]
|
|
411
|
+
}),
|
|
412
|
+
N === "performance" && /* @__PURE__ */ h("div", {
|
|
413
|
+
className: "grid gap-6 lg:grid-cols-2",
|
|
414
|
+
children: [/* @__PURE__ */ h(y, {
|
|
415
|
+
className: "border-border-seam",
|
|
416
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, {
|
|
417
|
+
className: "text-base",
|
|
418
|
+
children: "Monthly Revenue vs Previous"
|
|
419
|
+
}) }), /* @__PURE__ */ h(b, {
|
|
420
|
+
className: "space-y-3",
|
|
421
|
+
children: [k.map((e) => /* @__PURE__ */ h("div", {
|
|
422
|
+
className: "space-y-1",
|
|
423
|
+
children: [/* @__PURE__ */ h("div", {
|
|
424
|
+
className: "flex items-center justify-between text-xs",
|
|
425
|
+
children: [/* @__PURE__ */ m("span", {
|
|
426
|
+
className: "font-medium",
|
|
427
|
+
children: e.name
|
|
428
|
+
}), /* @__PURE__ */ h("span", {
|
|
429
|
+
className: "text-text-secondary tabular-nums",
|
|
430
|
+
children: [
|
|
431
|
+
"$",
|
|
432
|
+
(e.value / 1e3).toFixed(1),
|
|
433
|
+
"k vs $",
|
|
434
|
+
((e.prev ?? 0) / 1e3).toFixed(1),
|
|
435
|
+
"k"
|
|
436
|
+
]
|
|
437
|
+
})]
|
|
438
|
+
}), /* @__PURE__ */ h("div", {
|
|
439
|
+
className: "flex gap-1",
|
|
440
|
+
children: [/* @__PURE__ */ m("div", {
|
|
441
|
+
className: "h-4 rounded bg-action-primary-bg/30",
|
|
442
|
+
style: { width: `${(e.prev ?? 0) / z * 100}%` }
|
|
443
|
+
}), /* @__PURE__ */ m("div", {
|
|
444
|
+
className: "h-4 rounded bg-action-primary-bg",
|
|
445
|
+
style: { width: `${e.value / z * 100 - (e.prev ?? 0) / z * 100}%` }
|
|
446
|
+
})]
|
|
447
|
+
})]
|
|
448
|
+
}, e.name)), /* @__PURE__ */ h("div", {
|
|
449
|
+
className: "mt-4 flex items-center gap-4 text-xs",
|
|
450
|
+
children: [/* @__PURE__ */ h("span", {
|
|
451
|
+
className: "flex items-center gap-1",
|
|
452
|
+
children: [/* @__PURE__ */ m("div", { className: "h-3 w-3 rounded bg-action-primary-bg/30" }), " Previous"]
|
|
453
|
+
}), /* @__PURE__ */ h("span", {
|
|
454
|
+
className: "flex items-center gap-1",
|
|
455
|
+
children: [/* @__PURE__ */ m("div", { className: "h-3 w-3 rounded bg-action-primary-bg" }), " Current"]
|
|
456
|
+
})]
|
|
402
457
|
})]
|
|
403
458
|
})]
|
|
404
|
-
})
|
|
405
|
-
className: "
|
|
406
|
-
children:
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
className: "
|
|
411
|
-
children: [/* @__PURE__ */ h("div", {
|
|
412
|
-
className: "flex items-center
|
|
413
|
-
children: [/* @__PURE__ */
|
|
414
|
-
className:
|
|
415
|
-
children:
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
459
|
+
}), /* @__PURE__ */ h(y, {
|
|
460
|
+
className: "border-border-seam",
|
|
461
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, {
|
|
462
|
+
className: "text-base",
|
|
463
|
+
children: "Top Performing Services"
|
|
464
|
+
}) }), /* @__PURE__ */ m(b, { children: /* @__PURE__ */ m("div", {
|
|
465
|
+
className: "space-y-3",
|
|
466
|
+
children: [...j].sort((e, t) => t.value - e.value).slice(0, 5).map((e, t) => /* @__PURE__ */ h("div", {
|
|
467
|
+
className: "flex items-center justify-between rounded-lg border border-border-seam p-3",
|
|
468
|
+
children: [/* @__PURE__ */ h("div", {
|
|
469
|
+
className: "flex items-center gap-3",
|
|
470
|
+
children: [/* @__PURE__ */ m("div", {
|
|
471
|
+
className: `flex h-8 w-8 items-center justify-center rounded-full text-sm font-bold tabular-nums ${t === 0 ? "bg-status-warning-bg-subtle text-status-warning-text" : t === 1 ? "bg-bg-sunken text-text-secondary" : t === 2 ? "bg-accent-soft text-text-primary" : "bg-bg-sunken text-text-secondary"}`,
|
|
472
|
+
children: t + 1
|
|
473
|
+
}), /* @__PURE__ */ m("span", {
|
|
474
|
+
className: "font-medium text-sm",
|
|
475
|
+
children: e.name
|
|
476
|
+
})]
|
|
477
|
+
}), /* @__PURE__ */ h(_, {
|
|
478
|
+
variant: "secondary",
|
|
479
|
+
children: [e.value, " bookings"]
|
|
419
480
|
})]
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
})]
|
|
424
|
-
}, e.name))
|
|
425
|
-
}) })] })]
|
|
481
|
+
}, e.name))
|
|
482
|
+
}) })]
|
|
483
|
+
})]
|
|
426
484
|
})
|
|
427
485
|
]
|
|
428
486
|
});
|
|
429
487
|
}
|
|
430
488
|
//#endregion
|
|
431
|
-
export {
|
|
489
|
+
export { O as AnalyticsPage };
|
|
432
490
|
|
|
433
491
|
//# sourceMappingURL=AnalyticsPage.js.map
|