@burdenoff/microfe-proserviceworld 2026.525.1 → 2026.625.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/proserviceworld/pages/AdminReportsPage.js +368 -335
- package/dist/proserviceworld/pages/AdminReportsPage.js.map +1 -1
- package/dist/proserviceworld/pages/AdminUsersPage.js +262 -242
- package/dist/proserviceworld/pages/AdminUsersPage.js.map +1 -1
- package/dist/proserviceworld/pages/AnalyticsPage.js +346 -318
- package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -1
- package/dist/proserviceworld/pages/BookingsPage.js +202 -185
- package/dist/proserviceworld/pages/BookingsPage.js.map +1 -1
- package/dist/proserviceworld/pages/DashboardPage.js +400 -363
- package/dist/proserviceworld/pages/DashboardPage.js.map +1 -1
- package/dist/proserviceworld/pages/DocumentsPage.js +389 -324
- package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -1
- package/dist/proserviceworld/pages/MessagesPage.js +77 -82
- package/dist/proserviceworld/pages/MessagesPage.js.map +1 -1
- package/dist/proserviceworld/pages/PaymentsPage.js +373 -346
- package/dist/proserviceworld/pages/PaymentsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProjectsPage.js +432 -385
- package/dist/proserviceworld/pages/ProjectsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProviderDetailPage.js +396 -352
- package/dist/proserviceworld/pages/ProviderDetailPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProvidersPage.js +245 -244
- package/dist/proserviceworld/pages/ProvidersPage.js.map +1 -1
- package/dist/proserviceworld/pages/ReviewsPage.js +31 -31
- package/dist/proserviceworld/pages/ReviewsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ServiceDetailsPage.js +349 -316
- package/dist/proserviceworld/pages/ServiceDetailsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ServicesPage.js +163 -160
- package/dist/proserviceworld/pages/ServicesPage.js.map +1 -1
- package/dist/proserviceworld/pages/VerificationPage.js +265 -256
- 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 } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/proserviceworld/pages/AnalyticsPage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { analyticsMetrics:
|
|
7
|
+
function E() {
|
|
8
|
+
let { analyticsMetrics: E, revenueData: D, clientData: O, servicePerformance: k, geographicData: A } = e(), [j, M] = t("overview"), [N, P] = t("6m"), F = [
|
|
9
9
|
{
|
|
10
10
|
key: "overview",
|
|
11
11
|
label: "Overview",
|
|
@@ -31,102 +31,109 @@ function S() {
|
|
|
31
31
|
label: "Performance",
|
|
32
32
|
icon: f
|
|
33
33
|
}
|
|
34
|
-
],
|
|
34
|
+
], I = (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" }), L = Math.max(...D.map((e) => e.value)), R = Math.max(...O.map((e) => e.value)), z = Math.max(...k.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: () => P(e),
|
|
59
|
+
"aria-pressed": N === 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 ${N === 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
|
}),
|
|
67
71
|
/* @__PURE__ */ m("div", {
|
|
68
|
-
className: "flex gap-1 border-b",
|
|
69
|
-
children:
|
|
70
|
-
onClick: () =>
|
|
71
|
-
|
|
72
|
+
className: "flex flex-wrap gap-1 border-b border-border-seam",
|
|
73
|
+
children: F.map(({ key: e, label: t, icon: n }) => /* @__PURE__ */ h("button", {
|
|
74
|
+
onClick: () => M(e),
|
|
75
|
+
"aria-pressed": j === e,
|
|
76
|
+
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 ${j === e ? "border-action-primary-bg text-text-primary" : "border-transparent text-text-secondary hover:text-text-primary"}`,
|
|
72
77
|
children: [/* @__PURE__ */ m(n, { className: "h-4 w-4" }), t]
|
|
73
78
|
}, e))
|
|
74
79
|
}),
|
|
75
80
|
/* @__PURE__ */ m("div", {
|
|
76
81
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-5",
|
|
77
|
-
children:
|
|
78
|
-
|
|
82
|
+
children: E.map((e, t) => /* @__PURE__ */ h(w, {
|
|
83
|
+
treatment: t === 0 ? "glass" : "metric",
|
|
84
|
+
glow: t === 0,
|
|
85
|
+
className: "border-border-seam",
|
|
79
86
|
children: [
|
|
80
87
|
/* @__PURE__ */ h("div", {
|
|
81
88
|
className: "flex items-center justify-between",
|
|
82
89
|
children: [/* @__PURE__ */ m("p", {
|
|
83
|
-
className: "text-xs font-medium text-
|
|
90
|
+
className: "text-xs font-medium text-text-secondary",
|
|
84
91
|
children: e.label
|
|
85
|
-
}),
|
|
92
|
+
}), I(e.changeType)]
|
|
86
93
|
}),
|
|
87
94
|
/* @__PURE__ */ m("p", {
|
|
88
|
-
className: "mt-1 text-2xl font-bold",
|
|
95
|
+
className: "mt-1 text-2xl font-bold tabular-nums",
|
|
89
96
|
children: e.value
|
|
90
97
|
}),
|
|
91
98
|
/* @__PURE__ */ h("p", {
|
|
92
|
-
className: `mt-0.5 text-xs ${e.changeType === "positive" ? "text-
|
|
99
|
+
className: `mt-0.5 text-xs ${e.changeType === "positive" ? "text-status-success-text" : e.changeType === "negative" ? "text-status-error-text" : "text-text-muted"}`,
|
|
93
100
|
children: [e.change, " from last period"]
|
|
94
101
|
})
|
|
95
102
|
]
|
|
96
|
-
}
|
|
103
|
+
}, t))
|
|
97
104
|
}),
|
|
98
|
-
|
|
105
|
+
j === "overview" && /* @__PURE__ */ h("div", {
|
|
99
106
|
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",
|
|
107
|
+
children: [/* @__PURE__ */ h(C, { children: [/* @__PURE__ */ h("div", {
|
|
108
|
+
className: "flex items-center justify-between mb-4",
|
|
109
|
+
children: [/* @__PURE__ */ m("h2", {
|
|
110
|
+
className: "text-base font-semibold tracking-tight",
|
|
104
111
|
children: "Revenue Trend"
|
|
105
|
-
}), /* @__PURE__ */ m(
|
|
112
|
+
}), /* @__PURE__ */ m(_, {
|
|
106
113
|
variant: "secondary",
|
|
107
114
|
children: "Last 6 months"
|
|
108
115
|
})]
|
|
109
|
-
})
|
|
116
|
+
}), /* @__PURE__ */ m("div", {
|
|
110
117
|
className: "space-y-3",
|
|
111
|
-
children:
|
|
118
|
+
children: D.map((e) => /* @__PURE__ */ h("div", {
|
|
112
119
|
className: "flex items-center gap-3",
|
|
113
120
|
children: [
|
|
114
121
|
/* @__PURE__ */ m("span", {
|
|
115
|
-
className: "w-10 text-xs text-
|
|
122
|
+
className: "w-10 text-xs text-text-secondary",
|
|
116
123
|
children: e.name
|
|
117
124
|
}),
|
|
118
125
|
/* @__PURE__ */ h("div", {
|
|
119
|
-
className: "relative flex-1 h-6 bg-
|
|
126
|
+
className: "relative flex-1 h-6 bg-bg-sunken rounded overflow-hidden",
|
|
120
127
|
children: [e.prev !== void 0 && /* @__PURE__ */ m("div", {
|
|
121
|
-
className: "absolute h-6 bg-muted
|
|
122
|
-
style: { width: `${e.prev /
|
|
128
|
+
className: "absolute h-6 bg-text-muted/15 rounded",
|
|
129
|
+
style: { width: `${e.prev / L * 100}%` }
|
|
123
130
|
}), /* @__PURE__ */ m("div", {
|
|
124
|
-
className: "relative h-6 bg-primary rounded",
|
|
125
|
-
style: { width: `${e.value /
|
|
131
|
+
className: "relative h-6 bg-action-primary-bg rounded shadow-[var(--shadow-glow)]",
|
|
132
|
+
style: { width: `${e.value / L * 100}%` }
|
|
126
133
|
})]
|
|
127
134
|
}),
|
|
128
135
|
/* @__PURE__ */ h("span", {
|
|
129
|
-
className: "w-20 text-right text-xs font-medium",
|
|
136
|
+
className: "w-20 text-right text-xs font-medium tabular-nums",
|
|
130
137
|
children: [
|
|
131
138
|
"$",
|
|
132
139
|
(e.value / 1e3).toFixed(1),
|
|
@@ -135,299 +142,320 @@ function S() {
|
|
|
135
142
|
})
|
|
136
143
|
]
|
|
137
144
|
}, 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
|
-
|
|
145
|
+
})] }), /* @__PURE__ */ h(y, {
|
|
146
|
+
className: "border-border-seam",
|
|
147
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ h("div", {
|
|
148
|
+
className: "flex items-center justify-between",
|
|
149
|
+
children: [/* @__PURE__ */ m(S, {
|
|
150
|
+
className: "text-base",
|
|
151
|
+
children: "Client Growth"
|
|
152
|
+
}), /* @__PURE__ */ m(_, {
|
|
153
|
+
variant: "secondary",
|
|
154
|
+
children: "Monthly"
|
|
155
|
+
})]
|
|
156
|
+
}) }), /* @__PURE__ */ m(b, {
|
|
157
|
+
className: "space-y-3",
|
|
158
|
+
children: O.map((e) => /* @__PURE__ */ h("div", {
|
|
159
|
+
className: "flex items-center gap-3",
|
|
160
|
+
children: [
|
|
161
|
+
/* @__PURE__ */ m("span", {
|
|
162
|
+
className: "w-10 text-xs text-text-secondary",
|
|
163
|
+
children: e.name
|
|
164
|
+
}),
|
|
165
|
+
/* @__PURE__ */ m("div", {
|
|
166
|
+
className: "flex-1 h-6 bg-bg-sunken rounded overflow-hidden",
|
|
167
|
+
children: /* @__PURE__ */ m("div", {
|
|
168
|
+
className: "h-6 bg-accent-blue rounded",
|
|
169
|
+
style: { width: `${e.value / R * 100}%` }
|
|
170
|
+
})
|
|
171
|
+
}),
|
|
172
|
+
/* @__PURE__ */ m("span", {
|
|
173
|
+
className: "w-12 text-right text-xs font-medium tabular-nums",
|
|
174
|
+
children: e.value
|
|
161
175
|
})
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
})
|
|
167
|
-
]
|
|
168
|
-
}, e.name))
|
|
169
|
-
})] })]
|
|
176
|
+
]
|
|
177
|
+
}, e.name))
|
|
178
|
+
})]
|
|
179
|
+
})]
|
|
170
180
|
}),
|
|
171
|
-
|
|
181
|
+
j === "revenue" && /* @__PURE__ */ m("div", {
|
|
172
182
|
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
|
-
|
|
183
|
+
children: /* @__PURE__ */ h(y, {
|
|
184
|
+
className: "border-border-seam",
|
|
185
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, {
|
|
186
|
+
className: "text-base",
|
|
187
|
+
children: "Revenue Breakdown"
|
|
188
|
+
}) }), /* @__PURE__ */ m(b, { children: /* @__PURE__ */ m("div", {
|
|
189
|
+
className: "space-y-4",
|
|
190
|
+
children: D.map((e) => {
|
|
191
|
+
let t = e.prev ? ((e.value - e.prev) / e.prev * 100).toFixed(1) : "0", n = e.prev ? e.value >= e.prev : !0;
|
|
192
|
+
return /* @__PURE__ */ h("div", {
|
|
193
|
+
className: "flex items-center justify-between rounded-lg border border-border-seam p-4 transition-shadow hover:shadow-pop",
|
|
194
|
+
children: [/* @__PURE__ */ h("div", {
|
|
195
|
+
className: "flex items-center gap-4",
|
|
196
|
+
children: [/* @__PURE__ */ m("div", {
|
|
197
|
+
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-accent-soft",
|
|
198
|
+
children: /* @__PURE__ */ m(o, { className: "h-5 w-5 text-text-primary" })
|
|
199
|
+
}), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("p", {
|
|
200
|
+
className: "font-medium",
|
|
201
|
+
children: [e.name, " 2025"]
|
|
202
|
+
}), /* @__PURE__ */ h("p", {
|
|
203
|
+
className: "text-sm text-text-secondary tabular-nums",
|
|
204
|
+
children: [
|
|
205
|
+
"Previous: $",
|
|
206
|
+
((e.prev ?? 0) / 1e3).toFixed(1),
|
|
207
|
+
"k"
|
|
208
|
+
]
|
|
209
|
+
})] })]
|
|
210
|
+
}), /* @__PURE__ */ h("div", {
|
|
211
|
+
className: "text-right",
|
|
212
|
+
children: [/* @__PURE__ */ h("p", {
|
|
213
|
+
className: "text-lg font-bold tabular-nums",
|
|
214
|
+
children: [
|
|
215
|
+
"$",
|
|
216
|
+
(e.value / 1e3).toFixed(1),
|
|
217
|
+
"k"
|
|
218
|
+
]
|
|
219
|
+
}), /* @__PURE__ */ h("p", {
|
|
220
|
+
className: `flex items-center justify-end gap-1 text-xs tabular-nums ${n ? "text-status-success-text" : "text-status-error-text"}`,
|
|
221
|
+
children: [
|
|
222
|
+
m(n ? i : r, { className: "h-3 w-3" }),
|
|
223
|
+
t,
|
|
224
|
+
"%"
|
|
225
|
+
]
|
|
226
|
+
})]
|
|
214
227
|
})]
|
|
215
|
-
})
|
|
216
|
-
}
|
|
217
|
-
})
|
|
218
|
-
})
|
|
228
|
+
}, e.name);
|
|
229
|
+
})
|
|
230
|
+
}) })]
|
|
231
|
+
})
|
|
219
232
|
}),
|
|
220
|
-
|
|
233
|
+
j === "clients" && /* @__PURE__ */ h("div", {
|
|
221
234
|
className: "space-y-6",
|
|
222
|
-
children: [/* @__PURE__ */ h(
|
|
223
|
-
className: "
|
|
224
|
-
children:
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
className: "flex-
|
|
235
|
+
children: [/* @__PURE__ */ h(y, {
|
|
236
|
+
className: "border-border-seam",
|
|
237
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, {
|
|
238
|
+
className: "text-base",
|
|
239
|
+
children: "Client Acquisition"
|
|
240
|
+
}) }), /* @__PURE__ */ m(b, {
|
|
241
|
+
className: "space-y-3",
|
|
242
|
+
children: O.map((e, t) => {
|
|
243
|
+
let n = t > 0 ? O[t - 1]?.value ?? 0 : 0, r = n > 0 ? ((e.value - n) / n * 100).toFixed(0) : "N/A";
|
|
244
|
+
return /* @__PURE__ */ h("div", {
|
|
245
|
+
className: "flex items-center gap-4 rounded-lg border border-border-seam p-3",
|
|
233
246
|
children: [/* @__PURE__ */ h("div", {
|
|
234
|
-
className: "flex
|
|
235
|
-
children: [/* @__PURE__ */
|
|
236
|
-
className: "
|
|
237
|
-
children:
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
247
|
+
className: "flex-1",
|
|
248
|
+
children: [/* @__PURE__ */ h("div", {
|
|
249
|
+
className: "flex items-center justify-between",
|
|
250
|
+
children: [/* @__PURE__ */ m("span", {
|
|
251
|
+
className: "font-medium",
|
|
252
|
+
children: e.name
|
|
253
|
+
}), /* @__PURE__ */ h("span", {
|
|
254
|
+
className: "text-lg font-bold tabular-nums",
|
|
255
|
+
children: [e.value, " clients"]
|
|
256
|
+
})]
|
|
257
|
+
}), /* @__PURE__ */ m("div", {
|
|
258
|
+
className: "mt-2 h-2 overflow-hidden rounded-full bg-bg-sunken",
|
|
259
|
+
children: /* @__PURE__ */ m("div", {
|
|
260
|
+
className: "h-2 rounded-full bg-accent-blue",
|
|
261
|
+
style: { width: `${e.value / R * 100}%` }
|
|
262
|
+
})
|
|
241
263
|
})]
|
|
242
|
-
}), /* @__PURE__ */ m(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
style: { width: `${e.value / P * 100}%` }
|
|
247
|
-
})
|
|
264
|
+
}), /* @__PURE__ */ m(_, {
|
|
265
|
+
variant: "secondary",
|
|
266
|
+
className: "text-xs tabular-nums",
|
|
267
|
+
children: typeof r == "string" ? r : `+${r}%`
|
|
248
268
|
})]
|
|
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-muted-foreground" }), /* @__PURE__ */ m(x, {
|
|
259
|
-
className: "text-base",
|
|
260
|
-
children: "Geographic Distribution"
|
|
269
|
+
}, e.name);
|
|
270
|
+
})
|
|
261
271
|
})]
|
|
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-muted/50",
|
|
272
|
+
}), /* @__PURE__ */ h(y, {
|
|
273
|
+
className: "border-border-seam",
|
|
274
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ h("div", {
|
|
275
|
+
className: "flex items-center gap-2",
|
|
276
|
+
children: [/* @__PURE__ */ m(l, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ m(S, {
|
|
277
|
+
className: "text-base",
|
|
278
|
+
children: "Geographic Distribution"
|
|
279
|
+
})]
|
|
280
|
+
}) }), /* @__PURE__ */ m(b, { children: /* @__PURE__ */ m("div", {
|
|
281
|
+
className: "overflow-x-auto",
|
|
282
|
+
children: /* @__PURE__ */ h("table", {
|
|
283
|
+
className: "w-full text-sm",
|
|
284
|
+
children: [/* @__PURE__ */ m("thead", { children: /* @__PURE__ */ h("tr", {
|
|
285
|
+
className: "border-b border-border-seam text-left text-text-secondary",
|
|
290
286
|
children: [
|
|
291
|
-
/* @__PURE__ */ m("
|
|
287
|
+
/* @__PURE__ */ m("th", {
|
|
292
288
|
className: "p-3 font-medium",
|
|
293
|
-
children:
|
|
289
|
+
children: "Country"
|
|
294
290
|
}),
|
|
295
|
-
/* @__PURE__ */ m("
|
|
296
|
-
className: "p-3 text-right",
|
|
297
|
-
children:
|
|
291
|
+
/* @__PURE__ */ m("th", {
|
|
292
|
+
className: "p-3 text-right font-medium",
|
|
293
|
+
children: "Clients"
|
|
298
294
|
}),
|
|
299
|
-
/* @__PURE__ */
|
|
300
|
-
className: "p-3 text-right",
|
|
301
|
-
children:
|
|
302
|
-
"$",
|
|
303
|
-
(e.revenue / 1e3).toFixed(0),
|
|
304
|
-
"k"
|
|
305
|
-
]
|
|
295
|
+
/* @__PURE__ */ m("th", {
|
|
296
|
+
className: "p-3 text-right font-medium",
|
|
297
|
+
children: "Revenue"
|
|
306
298
|
}),
|
|
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-muted",
|
|
313
|
-
children: /* @__PURE__ */ m("div", {
|
|
314
|
-
className: "h-2 rounded-full bg-primary",
|
|
315
|
-
style: { width: `${n}%` }
|
|
316
|
-
})
|
|
317
|
-
}), /* @__PURE__ */ h("span", {
|
|
318
|
-
className: "w-10 text-right text-xs text-muted-foreground",
|
|
319
|
-
children: [n, "%"]
|
|
320
|
-
})]
|
|
321
|
-
})
|
|
299
|
+
/* @__PURE__ */ m("th", {
|
|
300
|
+
className: "p-3 font-medium",
|
|
301
|
+
children: "Distribution"
|
|
322
302
|
})
|
|
323
303
|
]
|
|
324
|
-
}, e
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
304
|
+
}) }), /* @__PURE__ */ m("tbody", { children: A.map((e) => {
|
|
305
|
+
let t = A.reduce((e, t) => e + t.clients, 0), n = Math.round(e.clients / t * 100);
|
|
306
|
+
return /* @__PURE__ */ h("tr", {
|
|
307
|
+
className: "border-b border-border-seam transition-colors hover:bg-bg-sunken/50",
|
|
308
|
+
children: [
|
|
309
|
+
/* @__PURE__ */ m("td", {
|
|
310
|
+
className: "p-3 font-medium",
|
|
311
|
+
children: e.country
|
|
312
|
+
}),
|
|
313
|
+
/* @__PURE__ */ m("td", {
|
|
314
|
+
className: "p-3 text-right tabular-nums",
|
|
315
|
+
children: e.clients
|
|
316
|
+
}),
|
|
317
|
+
/* @__PURE__ */ h("td", {
|
|
318
|
+
className: "p-3 text-right tabular-nums",
|
|
319
|
+
children: [
|
|
320
|
+
"$",
|
|
321
|
+
(e.revenue / 1e3).toFixed(0),
|
|
322
|
+
"k"
|
|
323
|
+
]
|
|
324
|
+
}),
|
|
325
|
+
/* @__PURE__ */ m("td", {
|
|
326
|
+
className: "p-3",
|
|
327
|
+
children: /* @__PURE__ */ h("div", {
|
|
328
|
+
className: "flex items-center gap-2",
|
|
329
|
+
children: [/* @__PURE__ */ m("div", {
|
|
330
|
+
className: "h-2 flex-1 overflow-hidden rounded-full bg-bg-sunken",
|
|
331
|
+
children: /* @__PURE__ */ m("div", {
|
|
332
|
+
className: "h-2 rounded-full bg-action-primary-bg",
|
|
333
|
+
style: { width: `${n}%` }
|
|
334
|
+
})
|
|
335
|
+
}), /* @__PURE__ */ h("span", {
|
|
336
|
+
className: "w-10 text-right text-xs text-text-secondary tabular-nums",
|
|
337
|
+
children: [n, "%"]
|
|
338
|
+
})]
|
|
339
|
+
})
|
|
340
|
+
})
|
|
341
|
+
]
|
|
342
|
+
}, e.country);
|
|
343
|
+
}) })]
|
|
344
|
+
})
|
|
345
|
+
}) })]
|
|
346
|
+
})]
|
|
328
347
|
}),
|
|
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-muted-foreground",
|
|
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-muted",
|
|
352
|
-
children: /* @__PURE__ */ m("div", {
|
|
353
|
-
className: "h-3 rounded-full bg-primary 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, {
|
|
348
|
+
j === "services" && /* @__PURE__ */ h(y, {
|
|
349
|
+
className: "border-border-seam",
|
|
350
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, {
|
|
363
351
|
className: "text-base",
|
|
364
|
-
children: "
|
|
365
|
-
}) }), /* @__PURE__ */
|
|
352
|
+
children: "Service Performance (Total Bookings)"
|
|
353
|
+
}) }), /* @__PURE__ */ m(b, {
|
|
366
354
|
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-muted-foreground",
|
|
376
|
-
children: [
|
|
377
|
-
"$",
|
|
378
|
-
(e.value / 1e3).toFixed(1),
|
|
379
|
-
"k vs $",
|
|
380
|
-
((e.prev ?? 0) / 1e3).toFixed(1),
|
|
381
|
-
"k"
|
|
382
|
-
]
|
|
383
|
-
})]
|
|
355
|
+
children: [...k].sort((e, t) => t.value - e.value).map((e, t) => /* @__PURE__ */ h("div", {
|
|
356
|
+
className: "flex items-center gap-4",
|
|
357
|
+
children: [/* @__PURE__ */ h("span", {
|
|
358
|
+
className: "w-6 text-sm font-medium text-text-secondary tabular-nums",
|
|
359
|
+
children: ["#", t + 1]
|
|
384
360
|
}), /* @__PURE__ */ h("div", {
|
|
385
|
-
className: "flex
|
|
386
|
-
children: [/* @__PURE__ */
|
|
387
|
-
className: "
|
|
388
|
-
|
|
361
|
+
className: "flex-1",
|
|
362
|
+
children: [/* @__PURE__ */ h("div", {
|
|
363
|
+
className: "flex items-center justify-between",
|
|
364
|
+
children: [/* @__PURE__ */ m("span", {
|
|
365
|
+
className: "text-sm font-medium",
|
|
366
|
+
children: e.name
|
|
367
|
+
}), /* @__PURE__ */ m("span", {
|
|
368
|
+
className: "text-sm font-bold tabular-nums",
|
|
369
|
+
children: e.value
|
|
370
|
+
})]
|
|
389
371
|
}), /* @__PURE__ */ m("div", {
|
|
390
|
-
className: "h-
|
|
391
|
-
|
|
372
|
+
className: "mt-1 h-3 overflow-hidden rounded-full bg-bg-sunken",
|
|
373
|
+
children: /* @__PURE__ */ m("div", {
|
|
374
|
+
className: "h-3 rounded-full bg-action-primary-bg transition-all",
|
|
375
|
+
style: { width: `${e.value / z * 100}%` }
|
|
376
|
+
})
|
|
392
377
|
})]
|
|
393
378
|
})]
|
|
394
|
-
}, e.name))
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
379
|
+
}, e.name))
|
|
380
|
+
})]
|
|
381
|
+
}),
|
|
382
|
+
j === "performance" && /* @__PURE__ */ h("div", {
|
|
383
|
+
className: "grid gap-6 lg:grid-cols-2",
|
|
384
|
+
children: [/* @__PURE__ */ h(y, {
|
|
385
|
+
className: "border-border-seam",
|
|
386
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, {
|
|
387
|
+
className: "text-base",
|
|
388
|
+
children: "Monthly Revenue vs Previous"
|
|
389
|
+
}) }), /* @__PURE__ */ h(b, {
|
|
390
|
+
className: "space-y-3",
|
|
391
|
+
children: [D.map((e) => /* @__PURE__ */ h("div", {
|
|
392
|
+
className: "space-y-1",
|
|
393
|
+
children: [/* @__PURE__ */ h("div", {
|
|
394
|
+
className: "flex items-center justify-between text-xs",
|
|
395
|
+
children: [/* @__PURE__ */ m("span", {
|
|
396
|
+
className: "font-medium",
|
|
397
|
+
children: e.name
|
|
398
|
+
}), /* @__PURE__ */ h("span", {
|
|
399
|
+
className: "text-text-secondary tabular-nums",
|
|
400
|
+
children: [
|
|
401
|
+
"$",
|
|
402
|
+
(e.value / 1e3).toFixed(1),
|
|
403
|
+
"k vs $",
|
|
404
|
+
((e.prev ?? 0) / 1e3).toFixed(1),
|
|
405
|
+
"k"
|
|
406
|
+
]
|
|
407
|
+
})]
|
|
408
|
+
}), /* @__PURE__ */ h("div", {
|
|
409
|
+
className: "flex gap-1",
|
|
410
|
+
children: [/* @__PURE__ */ m("div", {
|
|
411
|
+
className: "h-4 rounded bg-action-primary-bg/30",
|
|
412
|
+
style: { width: `${(e.prev ?? 0) / L * 100}%` }
|
|
413
|
+
}), /* @__PURE__ */ m("div", {
|
|
414
|
+
className: "h-4 rounded bg-action-primary-bg",
|
|
415
|
+
style: { width: `${e.value / L * 100 - (e.prev ?? 0) / L * 100}%` }
|
|
416
|
+
})]
|
|
417
|
+
})]
|
|
418
|
+
}, e.name)), /* @__PURE__ */ h("div", {
|
|
419
|
+
className: "mt-4 flex items-center gap-4 text-xs",
|
|
420
|
+
children: [/* @__PURE__ */ h("span", {
|
|
421
|
+
className: "flex items-center gap-1",
|
|
422
|
+
children: [/* @__PURE__ */ m("div", { className: "h-3 w-3 rounded bg-action-primary-bg/30" }), " Previous"]
|
|
423
|
+
}), /* @__PURE__ */ h("span", {
|
|
424
|
+
className: "flex items-center gap-1",
|
|
425
|
+
children: [/* @__PURE__ */ m("div", { className: "h-3 w-3 rounded bg-action-primary-bg" }), " Current"]
|
|
426
|
+
})]
|
|
402
427
|
})]
|
|
403
428
|
})]
|
|
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
|
-
|
|
429
|
+
}), /* @__PURE__ */ h(y, {
|
|
430
|
+
className: "border-border-seam",
|
|
431
|
+
children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, {
|
|
432
|
+
className: "text-base",
|
|
433
|
+
children: "Top Performing Services"
|
|
434
|
+
}) }), /* @__PURE__ */ m(b, { children: /* @__PURE__ */ m("div", {
|
|
435
|
+
className: "space-y-3",
|
|
436
|
+
children: [...k].sort((e, t) => t.value - e.value).slice(0, 5).map((e, t) => /* @__PURE__ */ h("div", {
|
|
437
|
+
className: "flex items-center justify-between rounded-lg border border-border-seam p-3",
|
|
438
|
+
children: [/* @__PURE__ */ h("div", {
|
|
439
|
+
className: "flex items-center gap-3",
|
|
440
|
+
children: [/* @__PURE__ */ m("div", {
|
|
441
|
+
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"}`,
|
|
442
|
+
children: t + 1
|
|
443
|
+
}), /* @__PURE__ */ m("span", {
|
|
444
|
+
className: "font-medium text-sm",
|
|
445
|
+
children: e.name
|
|
446
|
+
})]
|
|
447
|
+
}), /* @__PURE__ */ h(_, {
|
|
448
|
+
variant: "secondary",
|
|
449
|
+
children: [e.value, " bookings"]
|
|
419
450
|
})]
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
})]
|
|
424
|
-
}, e.name))
|
|
425
|
-
}) })] })]
|
|
451
|
+
}, e.name))
|
|
452
|
+
}) })]
|
|
453
|
+
})]
|
|
426
454
|
})
|
|
427
455
|
]
|
|
428
456
|
});
|
|
429
457
|
}
|
|
430
458
|
//#endregion
|
|
431
|
-
export {
|
|
459
|
+
export { E as AnalyticsPage };
|
|
432
460
|
|
|
433
461
|
//# sourceMappingURL=AnalyticsPage.js.map
|