@burdenoff/microfe-crewfoundry 2026.608.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/crewfoundry/pages/AdminAdminPagePage.js +94 -78
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +112 -96
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +101 -85
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +131 -115
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +116 -100
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +15 -15
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +63 -51
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +16 -16
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +26 -26
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +28 -28
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +10 -10
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +71 -59
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +59 -47
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +77 -61
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +40 -40
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +13 -13
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +102 -86
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +173 -139
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +59 -59
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +113 -97
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +45 -45
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +85 -69
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +23 -23
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +40 -40
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +59 -47
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +52 -48
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +31 -26
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +61 -49
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +83 -67
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +90 -74
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +90 -74
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +83 -67
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +54 -42
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +16 -16
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +39 -35
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +24 -24
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +14 -14
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +81 -65
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +73 -57
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +28 -28
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +12 -12
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +75 -59
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +57 -45
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +71 -59
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +48 -48
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +44 -43
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +58 -46
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +16 -16
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +23 -23
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +9 -9
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +43 -39
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +31 -27
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +59 -47
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +13 -13
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +66 -50
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +18 -18
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +74 -62
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +21 -21
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +47 -43
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +20 -20
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +58 -46
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +38 -34
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +14 -14
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +67 -67
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +16 -16
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/package.json +2 -2
|
@@ -2,98 +2,110 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
|
2
2
|
import { useMemo as t } from "react";
|
|
3
3
|
import { ArrowUp as n, DollarSign as r, TrendingUp as i, Wallet as a } from "lucide-react";
|
|
4
4
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
5
|
-
import { Badge as c, Card as l, CardContent as u, CardHeader as d, CardTitle as f } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
import { Badge as c, Card as l, CardContent as u, CardHeader as d, CardTitle as f, GlassCard as p, GradientText as m } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/MarketplaceEarningsPagePage.tsx
|
|
7
|
-
var
|
|
7
|
+
var h = (e) => {
|
|
8
8
|
let t = new Date(e);
|
|
9
9
|
return Number.isNaN(t.getTime()) ? "N/A" : t.toLocaleString("en-US", { month: "short" });
|
|
10
|
-
},
|
|
10
|
+
}, g = (e) => {
|
|
11
11
|
let t = new Date(e);
|
|
12
12
|
return Number.isNaN(t.getTime()) ? "Unknown" : t.toISOString().split("T")[0];
|
|
13
13
|
};
|
|
14
|
-
function
|
|
15
|
-
let { invoices:
|
|
14
|
+
function _() {
|
|
15
|
+
let { invoices: _, marketplaceServices: v, clients: y } = e(), b = t(() => _.slice(0, 12).map((e, t) => ({
|
|
16
16
|
id: e.id,
|
|
17
17
|
client: e.clientName,
|
|
18
|
-
service:
|
|
18
|
+
service: v[t % Math.max(v.length, 1)]?.title || "Marketplace Service",
|
|
19
19
|
amount: e.amount,
|
|
20
|
-
date:
|
|
20
|
+
date: g(e.issueDate),
|
|
21
21
|
status: e.status === "paid" ? "completed" : "pending"
|
|
22
|
-
})), [
|
|
23
|
-
let n =
|
|
22
|
+
})), [_, v]), x = t(() => b.slice(0, 6).map((e, t) => {
|
|
23
|
+
let n = b.filter((t) => h(t.date) === h(e.date)), r = n.reduce((e, t) => e + t.amount, 0);
|
|
24
24
|
return {
|
|
25
|
-
month:
|
|
25
|
+
month: h(e.date) || `M${t + 1}`,
|
|
26
26
|
amount: r,
|
|
27
27
|
orders: n.length
|
|
28
28
|
};
|
|
29
|
-
}), [
|
|
29
|
+
}), [b]), S = x.reduce((e, t) => e + t.amount, 0), C = Math.max(1, ...x.map((e) => e.amount)), w = x.reduce((e, t) => e + t.orders, 0), T = b.filter((e) => e.status === "pending").reduce((e, t) => e + t.amount, 0), E = y.length > 0 ? Math.round(w / y.length * 100) : 0;
|
|
30
30
|
return /* @__PURE__ */ s("div", {
|
|
31
31
|
className: "space-y-6 p-6",
|
|
32
32
|
children: [
|
|
33
33
|
/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
|
|
34
34
|
className: "text-2xl font-semibold",
|
|
35
|
-
children: "Earnings"
|
|
35
|
+
children: /* @__PURE__ */ o(m, { children: "Earnings" })
|
|
36
36
|
}), /* @__PURE__ */ o("p", {
|
|
37
|
-
className: "text-sm text-
|
|
37
|
+
className: "text-sm text-text-secondary",
|
|
38
38
|
children: "Revenue from marketplace services"
|
|
39
39
|
})] }),
|
|
40
40
|
/* @__PURE__ */ s("div", {
|
|
41
41
|
className: "grid gap-4 md:grid-cols-3",
|
|
42
42
|
children: [
|
|
43
|
-
/* @__PURE__ */ s(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
43
|
+
/* @__PURE__ */ s(p, {
|
|
44
|
+
treatment: "metric",
|
|
45
|
+
className: "border-border-seam",
|
|
46
|
+
children: [/* @__PURE__ */ s(d, {
|
|
47
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
48
|
+
children: [/* @__PURE__ */ o(f, {
|
|
49
|
+
className: "text-sm font-medium",
|
|
50
|
+
children: "Total Earnings"
|
|
51
|
+
}), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
52
|
+
}), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s("div", {
|
|
53
|
+
className: "text-2xl font-bold tabular-nums",
|
|
54
|
+
children: ["$", S.toLocaleString()]
|
|
55
|
+
}), /* @__PURE__ */ s("div", {
|
|
56
|
+
className: "flex items-center text-xs text-status-success-text",
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ o(n, { className: "mr-1 h-3 w-3" }),
|
|
59
|
+
"+",
|
|
60
|
+
E,
|
|
61
|
+
"% from recent cycle"
|
|
62
|
+
]
|
|
63
|
+
})] })]
|
|
64
|
+
}),
|
|
65
|
+
/* @__PURE__ */ s(p, {
|
|
66
|
+
treatment: "metric",
|
|
67
|
+
className: "border-border-seam",
|
|
68
|
+
children: [/* @__PURE__ */ s(d, {
|
|
69
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
70
|
+
children: [/* @__PURE__ */ o(f, {
|
|
71
|
+
className: "text-sm font-medium",
|
|
72
|
+
children: "Avg Order Value"
|
|
73
|
+
}), /* @__PURE__ */ o(i, { className: "h-4 w-4 text-text-secondary" })]
|
|
74
|
+
}), /* @__PURE__ */ o(u, { children: /* @__PURE__ */ s("div", {
|
|
75
|
+
className: "text-2xl font-bold tabular-nums",
|
|
76
|
+
children: ["$", Math.round(S / Math.max(w, 1)).toLocaleString()]
|
|
77
|
+
}) })]
|
|
78
|
+
}),
|
|
79
|
+
/* @__PURE__ */ s(p, {
|
|
80
|
+
treatment: "metric",
|
|
81
|
+
className: "border-border-seam",
|
|
82
|
+
children: [/* @__PURE__ */ s(d, {
|
|
83
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
84
|
+
children: [/* @__PURE__ */ o(f, {
|
|
85
|
+
className: "text-sm font-medium",
|
|
86
|
+
children: "Pending"
|
|
87
|
+
}), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-status-warning-text" })]
|
|
88
|
+
}), /* @__PURE__ */ o(u, { children: /* @__PURE__ */ s("div", {
|
|
89
|
+
className: "text-2xl font-bold tabular-nums",
|
|
90
|
+
children: ["$", T.toLocaleString()]
|
|
91
|
+
}) })]
|
|
92
|
+
})
|
|
81
93
|
]
|
|
82
94
|
}),
|
|
83
95
|
/* @__PURE__ */ s(l, { children: [/* @__PURE__ */ o(d, { children: /* @__PURE__ */ o(f, { children: "Earnings Trend" }) }), /* @__PURE__ */ o(u, {
|
|
84
96
|
className: "space-y-3",
|
|
85
|
-
children:
|
|
97
|
+
children: x.map((e, t) => /* @__PURE__ */ s("div", {
|
|
86
98
|
className: "flex items-center gap-3",
|
|
87
99
|
children: [
|
|
88
100
|
/* @__PURE__ */ o("span", {
|
|
89
|
-
className: "w-10 text-sm text-
|
|
101
|
+
className: "w-10 text-sm text-text-secondary",
|
|
90
102
|
children: e.month
|
|
91
103
|
}),
|
|
92
104
|
/* @__PURE__ */ o("div", {
|
|
93
|
-
className: "h-4 flex-1 overflow-hidden rounded bg-
|
|
105
|
+
className: "h-4 flex-1 overflow-hidden rounded bg-bg-sunken",
|
|
94
106
|
children: /* @__PURE__ */ o("div", {
|
|
95
|
-
className: "h-4 rounded bg-primary",
|
|
96
|
-
style: { width: `${Math.round(e.amount /
|
|
107
|
+
className: "h-4 rounded bg-action-primary-bg",
|
|
108
|
+
style: { width: `${Math.round(e.amount / C * 100)}%` }
|
|
97
109
|
})
|
|
98
110
|
}),
|
|
99
111
|
/* @__PURE__ */ s("span", {
|
|
@@ -114,13 +126,13 @@ function h() {
|
|
|
114
126
|
})] }),
|
|
115
127
|
/* @__PURE__ */ s(l, { children: [/* @__PURE__ */ o(d, { children: /* @__PURE__ */ o(f, { children: "Recent Payments" }) }), /* @__PURE__ */ o(u, {
|
|
116
128
|
className: "space-y-3",
|
|
117
|
-
children:
|
|
129
|
+
children: b.map((e) => /* @__PURE__ */ s("div", {
|
|
118
130
|
className: "flex items-center justify-between rounded border p-3",
|
|
119
131
|
children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
|
|
120
132
|
className: "text-sm font-medium",
|
|
121
133
|
children: e.client
|
|
122
134
|
}), /* @__PURE__ */ s("p", {
|
|
123
|
-
className: "text-xs text-
|
|
135
|
+
className: "text-xs text-text-secondary",
|
|
124
136
|
children: [
|
|
125
137
|
e.service,
|
|
126
138
|
" · ",
|
|
@@ -143,6 +155,6 @@ function h() {
|
|
|
143
155
|
});
|
|
144
156
|
}
|
|
145
157
|
//#endregion
|
|
146
|
-
export {
|
|
158
|
+
export { _ as MarketplaceEarningsPagePage };
|
|
147
159
|
|
|
148
160
|
//# sourceMappingURL=MarketplaceEarningsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceEarningsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceEarningsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Badge, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { ArrowUp, DollarSign, TrendingUp, Wallet } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype EarningPoint = {\n month: string;\n amount: number;\n orders: number;\n};\n\ntype PaymentItem = {\n id: string;\n client: string;\n service: string;\n amount: number;\n date: string;\n status: 'completed' | 'pending';\n};\n\nconst monthLabel = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'N/A';\n }\n return parsed.toLocaleString('en-US', { month: 'short' });\n};\n\nconst isoDate = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'Unknown';\n }\n return parsed.toISOString().split('T')[0];\n};\n\nexport function MarketplaceEarningsPagePage() {\n const { invoices, marketplaceServices, clients } = useCrewFoundryStore();\n\n const recentPayments = useMemo<PaymentItem[]>(() => {\n return invoices.slice(0, 12).map((invoice, index) => ({\n id: invoice.id,\n client: invoice.clientName,\n service:\n marketplaceServices[index % Math.max(marketplaceServices.length, 1)]?.title ||\n 'Marketplace Service',\n amount: invoice.amount,\n date: isoDate(invoice.issueDate),\n status: invoice.status === 'paid' ? 'completed' : 'pending',\n }));\n }, [invoices, marketplaceServices]);\n\n const earningsData = useMemo<EarningPoint[]>(() => {\n return recentPayments.slice(0, 6).map((payment, index) => {\n const sibling = recentPayments.filter(\n (item) => monthLabel(item.date) === monthLabel(payment.date)\n );\n const amount = sibling.reduce((sum, item) => sum + item.amount, 0);\n return {\n month: monthLabel(payment.date) || `M${index + 1}`,\n amount,\n orders: sibling.length,\n };\n });\n }, [recentPayments]);\n\n const totalEarnings = earningsData.reduce((sum, point) => sum + point.amount, 0);\n const maxEarning = Math.max(1, ...earningsData.map((point) => point.amount));\n const totalOrders = earningsData.reduce((sum, point) => sum + point.orders, 0);\n const pendingAmount = recentPayments\n .filter((payment) => payment.status === 'pending')\n .reduce((sum, payment) => sum + payment.amount, 0);\n const growthBase = clients.length > 0 ? Math.round((totalOrders / clients.length) * 100) : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Earnings</h1>\n <p className=\"text-sm text-muted-foreground\">Revenue from marketplace services</p>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Earnings</CardTitle>\n <DollarSign className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${totalEarnings.toLocaleString()}</div>\n <div className=\"flex items-center text-xs text-green-600\">\n <ArrowUp className=\"mr-1 h-3 w-3\" />+{growthBase}% from recent cycle\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Avg Order Value</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n ${Math.round(totalEarnings / Math.max(totalOrders, 1)).toLocaleString()}\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n <Wallet className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${pendingAmount.toLocaleString()}</div>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Earnings Trend</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {earningsData.map((earning, index) => (\n <div key={`${earning.month}-${index}`} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-sm text-muted-foreground\">{earning.month}</span>\n <div className=\"h-4 flex-1 overflow-hidden rounded bg-muted\">\n <div\n className=\"h-4 rounded bg-primary\"\n style={{ width: `${Math.round((earning.amount / maxEarning) * 100)}%` }}\n />\n </div>\n <span className=\"w-16 text-right text-sm font-medium\">\n ${(earning.amount / 1000).toFixed(1)}K\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {earning.orders} orders\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Recent Payments</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {recentPayments.map((payment) => (\n <div key={payment.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{payment.client}</p>\n <p className=\"text-xs text-muted-foreground\">\n {payment.service} · {payment.date}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-bold\">${payment.amount.toLocaleString()}</span>\n <Badge\n variant={payment.status === 'completed' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {payment.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarketplaceEarningsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceEarningsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowUp, DollarSign, TrendingUp, Wallet } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype EarningPoint = {\n month: string;\n amount: number;\n orders: number;\n};\n\ntype PaymentItem = {\n id: string;\n client: string;\n service: string;\n amount: number;\n date: string;\n status: 'completed' | 'pending';\n};\n\nconst monthLabel = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'N/A';\n }\n return parsed.toLocaleString('en-US', { month: 'short' });\n};\n\nconst isoDate = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'Unknown';\n }\n return parsed.toISOString().split('T')[0];\n};\n\nexport function MarketplaceEarningsPagePage() {\n const { invoices, marketplaceServices, clients } = useCrewFoundryStore();\n\n const recentPayments = useMemo<PaymentItem[]>(() => {\n return invoices.slice(0, 12).map((invoice, index) => ({\n id: invoice.id,\n client: invoice.clientName,\n service:\n marketplaceServices[index % Math.max(marketplaceServices.length, 1)]?.title ||\n 'Marketplace Service',\n amount: invoice.amount,\n date: isoDate(invoice.issueDate),\n status: invoice.status === 'paid' ? 'completed' : 'pending',\n }));\n }, [invoices, marketplaceServices]);\n\n const earningsData = useMemo<EarningPoint[]>(() => {\n return recentPayments.slice(0, 6).map((payment, index) => {\n const sibling = recentPayments.filter(\n (item) => monthLabel(item.date) === monthLabel(payment.date)\n );\n const amount = sibling.reduce((sum, item) => sum + item.amount, 0);\n return {\n month: monthLabel(payment.date) || `M${index + 1}`,\n amount,\n orders: sibling.length,\n };\n });\n }, [recentPayments]);\n\n const totalEarnings = earningsData.reduce((sum, point) => sum + point.amount, 0);\n const maxEarning = Math.max(1, ...earningsData.map((point) => point.amount));\n const totalOrders = earningsData.reduce((sum, point) => sum + point.orders, 0);\n const pendingAmount = recentPayments\n .filter((payment) => payment.status === 'pending')\n .reduce((sum, payment) => sum + payment.amount, 0);\n const growthBase = clients.length > 0 ? Math.round((totalOrders / clients.length) * 100) : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Earnings</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Revenue from marketplace services</p>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Earnings</CardTitle>\n <DollarSign className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalEarnings.toLocaleString()}</div>\n <div className=\"flex items-center text-xs text-status-success-text\">\n <ArrowUp className=\"mr-1 h-3 w-3\" />+{growthBase}% from recent cycle\n </div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Avg Order Value</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n ${Math.round(totalEarnings / Math.max(totalOrders, 1)).toLocaleString()}\n </div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n <Wallet className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${pendingAmount.toLocaleString()}</div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Earnings Trend</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {earningsData.map((earning, index) => (\n <div key={`${earning.month}-${index}`} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-sm text-text-secondary\">{earning.month}</span>\n <div className=\"h-4 flex-1 overflow-hidden rounded bg-bg-sunken\">\n <div\n className=\"h-4 rounded bg-action-primary-bg\"\n style={{ width: `${Math.round((earning.amount / maxEarning) * 100)}%` }}\n />\n </div>\n <span className=\"w-16 text-right text-sm font-medium\">\n ${(earning.amount / 1000).toFixed(1)}K\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {earning.orders} orders\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Recent Payments</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {recentPayments.map((payment) => (\n <div key={payment.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{payment.client}</p>\n <p className=\"text-xs text-text-secondary\">\n {payment.service} · {payment.date}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-bold\">${payment.amount.toLocaleString()}</span>\n <Badge\n variant={payment.status === 'completed' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {payment.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -2,10 +2,10 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
|
2
2
|
import { useMemo as t, useState as n } from "react";
|
|
3
3
|
import { BarChart3 as r, Briefcase as i, Calendar as a, CheckCircle as o, Clock as s, DollarSign as c, Globe as l, MapPin as u, MessageSquare as d, Star as f, TrendingUp as p, Users as m, Video as h } from "lucide-react";
|
|
4
4
|
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
5
|
-
import { Badge as v, Button as y, Card as b, CardContent as x, CardDescription as S, CardHeader as C, CardTitle as w,
|
|
5
|
+
import { Badge as v, Button as y, Card as b, CardContent as x, CardDescription as S, CardHeader as C, CardTitle as w, GradientText as T, Separator as E, Tabs as D, TabsContent as O, TabsList as k, TabsTrigger as A } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.tsx
|
|
7
|
-
function
|
|
8
|
-
let [
|
|
7
|
+
function j() {
|
|
8
|
+
let [j, M] = n("overview"), { marketplaceServices: N, clients: P, candidates: F } = e(), I = t(() => [
|
|
9
9
|
{
|
|
10
10
|
day: "Monday",
|
|
11
11
|
slots: [
|
|
@@ -38,34 +38,34 @@ function A() {
|
|
|
38
38
|
day: "Friday",
|
|
39
39
|
slots: ["9:00 AM", "10:00 AM"]
|
|
40
40
|
}
|
|
41
|
-
], []),
|
|
41
|
+
], []), L = t(() => N.slice(0, 6).map((e) => ({
|
|
42
42
|
title: e.title,
|
|
43
43
|
price: e.priceType === "hourly" ? `$${e.price}/hr` : e.priceType === "monthly" ? `$${e.price}/mo` : `$${e.price}`,
|
|
44
44
|
type: e.priceType,
|
|
45
45
|
description: e.description,
|
|
46
46
|
delivery: e.deliveryTime
|
|
47
|
-
})), [
|
|
47
|
+
})), [N]), R = t(() => [
|
|
48
48
|
{
|
|
49
49
|
label: "Avg. Placement Time",
|
|
50
|
-
value: `${Math.max(15, 45 -
|
|
50
|
+
value: `${Math.max(15, 45 - F.filter((e) => e.status === "hired").length)} days`,
|
|
51
51
|
trend: "-3 days vs avg"
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
54
|
label: "Offer Acceptance Rate",
|
|
55
|
-
value: `${Math.round(
|
|
55
|
+
value: `${Math.round(F.filter((e) => e.status === "hired").length / Math.max(F.filter((e) => e.status === "offer").length, 1) * 100)}%`,
|
|
56
56
|
trend: "+8% vs avg"
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
59
|
label: "Client Retention",
|
|
60
|
-
value: `${Math.min(99, Math.max(70, Math.round(
|
|
60
|
+
value: `${Math.min(99, Math.max(70, Math.round(P.filter((e) => e.status === "active").length / Math.max(P.length, 1) * 100)))}%`,
|
|
61
61
|
trend: "repeat clients"
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
label: "Candidates Placed (YTD)",
|
|
65
|
-
value: `${
|
|
65
|
+
value: `${F.filter((e) => e.status === "hired").length}`,
|
|
66
66
|
trend: "+12% YoY"
|
|
67
67
|
}
|
|
68
|
-
], [
|
|
68
|
+
], [F, P]);
|
|
69
69
|
return /* @__PURE__ */ _("div", {
|
|
70
70
|
className: "space-y-6 p-6",
|
|
71
71
|
children: [
|
|
@@ -74,7 +74,7 @@ function A() {
|
|
|
74
74
|
children: /* @__PURE__ */ _("div", {
|
|
75
75
|
className: "flex items-start gap-6",
|
|
76
76
|
children: [/* @__PURE__ */ g("div", {
|
|
77
|
-
className: "flex h-24 w-24 shrink-0 items-center justify-center rounded-2xl bg-gradient-to-br from-primary to-primary/60 text-primary-
|
|
77
|
+
className: "flex h-24 w-24 shrink-0 items-center justify-center rounded-2xl bg-gradient-to-br from-primary to-primary/60 text-action-primary-text text-3xl font-semibold",
|
|
78
78
|
children: "MS"
|
|
79
79
|
}), /* @__PURE__ */ _("div", {
|
|
80
80
|
className: "flex-1 space-y-2",
|
|
@@ -84,7 +84,7 @@ function A() {
|
|
|
84
84
|
children: [
|
|
85
85
|
/* @__PURE__ */ g("h1", {
|
|
86
86
|
className: "text-2xl font-semibold",
|
|
87
|
-
children: "Maria Santos"
|
|
87
|
+
children: /* @__PURE__ */ g(T, { children: "Maria Santos" })
|
|
88
88
|
}),
|
|
89
89
|
/* @__PURE__ */ g(v, { children: "Top Rated Plus" }),
|
|
90
90
|
/* @__PURE__ */ g(v, {
|
|
@@ -93,7 +93,7 @@ function A() {
|
|
|
93
93
|
}),
|
|
94
94
|
/* @__PURE__ */ g(v, {
|
|
95
95
|
variant: "outline",
|
|
96
|
-
className: "text-
|
|
96
|
+
className: "text-status-success-text border-status-success-text/30",
|
|
97
97
|
children: "Available Now"
|
|
98
98
|
})
|
|
99
99
|
]
|
|
@@ -103,11 +103,11 @@ function A() {
|
|
|
103
103
|
children: "Senior HR Consultant & Technical Recruiter"
|
|
104
104
|
}),
|
|
105
105
|
/* @__PURE__ */ g("p", {
|
|
106
|
-
className: "text-xs text-
|
|
106
|
+
className: "text-xs text-text-secondary",
|
|
107
107
|
children: "TalentPro Solutions"
|
|
108
108
|
}),
|
|
109
109
|
/* @__PURE__ */ _("div", {
|
|
110
|
-
className: "flex flex-wrap items-center gap-4 text-xs text-
|
|
110
|
+
className: "flex flex-wrap items-center gap-4 text-xs text-text-secondary",
|
|
111
111
|
children: [
|
|
112
112
|
/* @__PURE__ */ _("span", {
|
|
113
113
|
className: "flex items-center gap-1",
|
|
@@ -119,7 +119,7 @@ function A() {
|
|
|
119
119
|
}),
|
|
120
120
|
/* @__PURE__ */ _("span", {
|
|
121
121
|
className: "flex items-center gap-1",
|
|
122
|
-
children: [/* @__PURE__ */ g(f, { className: "h-3 w-3 text-
|
|
122
|
+
children: [/* @__PURE__ */ g(f, { className: "h-3 w-3 text-status-warning-text fill-yellow-500" }), " 4.9 (47 reviews)"]
|
|
123
123
|
}),
|
|
124
124
|
/* @__PURE__ */ _("span", {
|
|
125
125
|
className: "flex items-center gap-1",
|
|
@@ -156,11 +156,11 @@ function A() {
|
|
|
156
156
|
}) }),
|
|
157
157
|
/* @__PURE__ */ g("div", {
|
|
158
158
|
className: "grid gap-4 md:grid-cols-4",
|
|
159
|
-
children:
|
|
159
|
+
children: R.map((e) => /* @__PURE__ */ g(b, { children: /* @__PURE__ */ _(x, {
|
|
160
160
|
className: "pt-6",
|
|
161
161
|
children: [
|
|
162
162
|
/* @__PURE__ */ g("p", {
|
|
163
|
-
className: "text-xs text-
|
|
163
|
+
className: "text-xs text-text-secondary",
|
|
164
164
|
children: e.label
|
|
165
165
|
}),
|
|
166
166
|
/* @__PURE__ */ g("p", {
|
|
@@ -168,35 +168,35 @@ function A() {
|
|
|
168
168
|
children: e.value
|
|
169
169
|
}),
|
|
170
170
|
/* @__PURE__ */ g("p", {
|
|
171
|
-
className: "text-[10px] text-
|
|
171
|
+
className: "text-[10px] text-status-success-text",
|
|
172
172
|
children: e.trend
|
|
173
173
|
})
|
|
174
174
|
]
|
|
175
175
|
}) }, e.label))
|
|
176
176
|
}),
|
|
177
|
-
/* @__PURE__ */ _(
|
|
178
|
-
value:
|
|
179
|
-
onValueChange:
|
|
177
|
+
/* @__PURE__ */ _(D, {
|
|
178
|
+
value: j,
|
|
179
|
+
onValueChange: M,
|
|
180
180
|
children: [
|
|
181
|
-
/* @__PURE__ */ _(
|
|
182
|
-
/* @__PURE__ */ g(
|
|
181
|
+
/* @__PURE__ */ _(k, { children: [
|
|
182
|
+
/* @__PURE__ */ g(A, {
|
|
183
183
|
value: "overview",
|
|
184
184
|
children: "Overview"
|
|
185
185
|
}),
|
|
186
|
-
/* @__PURE__ */ g(
|
|
186
|
+
/* @__PURE__ */ g(A, {
|
|
187
187
|
value: "services",
|
|
188
188
|
children: "Services"
|
|
189
189
|
}),
|
|
190
|
-
/* @__PURE__ */ g(
|
|
190
|
+
/* @__PURE__ */ g(A, {
|
|
191
191
|
value: "availability",
|
|
192
192
|
children: "Availability"
|
|
193
193
|
}),
|
|
194
|
-
/* @__PURE__ */ g(
|
|
194
|
+
/* @__PURE__ */ g(A, {
|
|
195
195
|
value: "analytics",
|
|
196
196
|
children: "Performance"
|
|
197
197
|
})
|
|
198
198
|
] }),
|
|
199
|
-
/* @__PURE__ */ g(
|
|
199
|
+
/* @__PURE__ */ g(O, {
|
|
200
200
|
value: "overview",
|
|
201
201
|
className: "space-y-6 mt-4",
|
|
202
202
|
children: /* @__PURE__ */ _("div", {
|
|
@@ -207,29 +207,29 @@ function A() {
|
|
|
207
207
|
className: "text-base",
|
|
208
208
|
children: "Professional Summary"
|
|
209
209
|
}) }), /* @__PURE__ */ _(x, {
|
|
210
|
-
className: "text-sm text-
|
|
210
|
+
className: "text-sm text-text-secondary space-y-3",
|
|
211
211
|
children: [
|
|
212
212
|
/* @__PURE__ */ g("p", { children: "Award-winning HR consultant with 12+ years specializing in technical recruitment and talent strategy for high-growth technology companies. Deep expertise in building engineering teams, executive search, and implementing scalable hiring processes." }),
|
|
213
213
|
/* @__PURE__ */ g("p", { children: "Named one of the \"Top 50 HR Influencers\" by HR Tech Magazine in 2025. Regular speaker at HR technology conferences and contributor to industry publications." }),
|
|
214
|
-
/* @__PURE__ */ g(
|
|
214
|
+
/* @__PURE__ */ g(E, {}),
|
|
215
215
|
/* @__PURE__ */ _("div", {
|
|
216
216
|
className: "grid grid-cols-2 gap-3 text-xs",
|
|
217
217
|
children: [
|
|
218
218
|
/* @__PURE__ */ _("div", {
|
|
219
219
|
className: "flex items-center gap-2",
|
|
220
|
-
children: [/* @__PURE__ */ g(o, { className: "h-3 w-3 text-
|
|
220
|
+
children: [/* @__PURE__ */ g(o, { className: "h-3 w-3 text-status-success-text" }), " Background verified"]
|
|
221
221
|
}),
|
|
222
222
|
/* @__PURE__ */ _("div", {
|
|
223
223
|
className: "flex items-center gap-2",
|
|
224
|
-
children: [/* @__PURE__ */ g(o, { className: "h-3 w-3 text-
|
|
224
|
+
children: [/* @__PURE__ */ g(o, { className: "h-3 w-3 text-status-success-text" }), " Identity confirmed"]
|
|
225
225
|
}),
|
|
226
226
|
/* @__PURE__ */ _("div", {
|
|
227
227
|
className: "flex items-center gap-2",
|
|
228
|
-
children: [/* @__PURE__ */ g(o, { className: "h-3 w-3 text-
|
|
228
|
+
children: [/* @__PURE__ */ g(o, { className: "h-3 w-3 text-status-success-text" }), " References checked"]
|
|
229
229
|
}),
|
|
230
230
|
/* @__PURE__ */ _("div", {
|
|
231
231
|
className: "flex items-center gap-2",
|
|
232
|
-
children: [/* @__PURE__ */ g(o, { className: "h-3 w-3 text-
|
|
232
|
+
children: [/* @__PURE__ */ g(o, { className: "h-3 w-3 text-status-success-text" }), " Skills assessed"]
|
|
233
233
|
})
|
|
234
234
|
]
|
|
235
235
|
})
|
|
@@ -265,24 +265,24 @@ function A() {
|
|
|
265
265
|
className: "space-y-2",
|
|
266
266
|
children: [/* @__PURE__ */ _("div", {
|
|
267
267
|
className: "flex items-center gap-2 text-sm",
|
|
268
|
-
children: [/* @__PURE__ */ g(s, { className: "h-4 w-4 text-
|
|
268
|
+
children: [/* @__PURE__ */ g(s, { className: "h-4 w-4 text-status-success-text" }), /* @__PURE__ */ g("span", {
|
|
269
269
|
className: "font-medium",
|
|
270
270
|
children: "Usually responds within 2 hours"
|
|
271
271
|
})]
|
|
272
272
|
}), /* @__PURE__ */ g("p", {
|
|
273
|
-
className: "text-xs text-
|
|
273
|
+
className: "text-xs text-text-secondary",
|
|
274
274
|
children: "Available Mon-Fri, 9 AM - 6 PM PST"
|
|
275
275
|
})]
|
|
276
276
|
})] })]
|
|
277
277
|
})]
|
|
278
278
|
})
|
|
279
279
|
}),
|
|
280
|
-
/* @__PURE__ */ g(
|
|
280
|
+
/* @__PURE__ */ g(O, {
|
|
281
281
|
value: "services",
|
|
282
282
|
className: "mt-4",
|
|
283
283
|
children: /* @__PURE__ */ g("div", {
|
|
284
284
|
className: "grid gap-4 md:grid-cols-2",
|
|
285
|
-
children:
|
|
285
|
+
children: L.map((e) => /* @__PURE__ */ _(b, { children: [/* @__PURE__ */ _(C, { children: [/* @__PURE__ */ _("div", {
|
|
286
286
|
className: "flex items-center justify-between",
|
|
287
287
|
children: [/* @__PURE__ */ g(w, {
|
|
288
288
|
className: "text-sm",
|
|
@@ -297,7 +297,7 @@ function A() {
|
|
|
297
297
|
children: e.description
|
|
298
298
|
})] }), /* @__PURE__ */ _(x, {
|
|
299
299
|
className: "pt-0",
|
|
300
|
-
children: [/* @__PURE__ */ g(
|
|
300
|
+
children: [/* @__PURE__ */ g(E, { className: "mb-3" }), /* @__PURE__ */ _("div", {
|
|
301
301
|
className: "flex items-center justify-between",
|
|
302
302
|
children: [/* @__PURE__ */ _("div", {
|
|
303
303
|
className: "space-y-0.5",
|
|
@@ -305,7 +305,7 @@ function A() {
|
|
|
305
305
|
className: "text-sm font-semibold",
|
|
306
306
|
children: e.price
|
|
307
307
|
}), /* @__PURE__ */ _("p", {
|
|
308
|
-
className: "text-[10px] text-
|
|
308
|
+
className: "text-[10px] text-text-secondary",
|
|
309
309
|
children: ["Delivery: ", e.delivery]
|
|
310
310
|
})]
|
|
311
311
|
}), /* @__PURE__ */ g(y, {
|
|
@@ -316,7 +316,7 @@ function A() {
|
|
|
316
316
|
})] }, e.title))
|
|
317
317
|
})
|
|
318
318
|
}),
|
|
319
|
-
/* @__PURE__ */ g(
|
|
319
|
+
/* @__PURE__ */ g(O, {
|
|
320
320
|
value: "availability",
|
|
321
321
|
className: "mt-4",
|
|
322
322
|
children: /* @__PURE__ */ _(b, { children: [/* @__PURE__ */ _(C, { children: [/* @__PURE__ */ g(w, {
|
|
@@ -324,7 +324,7 @@ function A() {
|
|
|
324
324
|
children: "This Week's Availability"
|
|
325
325
|
}), /* @__PURE__ */ g(S, { children: "Select a time slot to schedule a consultation" })] }), /* @__PURE__ */ g(x, {
|
|
326
326
|
className: "space-y-4",
|
|
327
|
-
children:
|
|
327
|
+
children: I.map((e) => /* @__PURE__ */ _("div", {
|
|
328
328
|
className: "flex items-center gap-4",
|
|
329
329
|
children: [/* @__PURE__ */ g("span", {
|
|
330
330
|
className: "w-24 text-sm font-medium",
|
|
@@ -341,7 +341,7 @@ function A() {
|
|
|
341
341
|
}, e.day))
|
|
342
342
|
})] })
|
|
343
343
|
}),
|
|
344
|
-
/* @__PURE__ */ g(
|
|
344
|
+
/* @__PURE__ */ g(O, {
|
|
345
345
|
value: "analytics",
|
|
346
346
|
className: "mt-4",
|
|
347
347
|
children: /* @__PURE__ */ _("div", {
|
|
@@ -381,7 +381,7 @@ function A() {
|
|
|
381
381
|
className: "flex items-center justify-between",
|
|
382
382
|
children: [/* @__PURE__ */ _("div", {
|
|
383
383
|
className: "flex items-center gap-2 text-sm",
|
|
384
|
-
children: [/* @__PURE__ */ g(e.icon, { className: "h-4 w-4 text-
|
|
384
|
+
children: [/* @__PURE__ */ g(e.icon, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ g("span", { children: e.label })]
|
|
385
385
|
}), /* @__PURE__ */ g("span", {
|
|
386
386
|
className: "font-semibold text-sm",
|
|
387
387
|
children: e.value
|
|
@@ -418,13 +418,13 @@ function A() {
|
|
|
418
418
|
children: [/* @__PURE__ */ _("div", {
|
|
419
419
|
className: "flex items-center justify-between text-sm",
|
|
420
420
|
children: [/* @__PURE__ */ g("span", { children: e.industry }), /* @__PURE__ */ _("span", {
|
|
421
|
-
className: "text-xs text-
|
|
421
|
+
className: "text-xs text-text-secondary",
|
|
422
422
|
children: [e.percentage, "%"]
|
|
423
423
|
})]
|
|
424
424
|
}), /* @__PURE__ */ g("div", {
|
|
425
|
-
className: "h-1.5 rounded-full bg-
|
|
425
|
+
className: "h-1.5 rounded-full bg-bg-sunken overflow-hidden",
|
|
426
426
|
children: /* @__PURE__ */ g("div", {
|
|
427
|
-
className: "h-full rounded-full bg-primary",
|
|
427
|
+
className: "h-full rounded-full bg-action-primary-bg",
|
|
428
428
|
style: { width: `${e.percentage}%` }
|
|
429
429
|
})
|
|
430
430
|
})]
|
|
@@ -438,6 +438,6 @@ function A() {
|
|
|
438
438
|
});
|
|
439
439
|
}
|
|
440
440
|
//#endregion
|
|
441
|
-
export {
|
|
441
|
+
export { j as MarketplaceFreelancerProfilePageEnhancedPage };
|
|
442
442
|
|
|
443
443
|
//# sourceMappingURL=MarketplaceFreelancerProfilePageEnhancedPage.js.map
|