@burdenoff/microfe-crewfoundry 2026.625.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/crewfoundry/pages/AdminAdminPagePage.js +37 -29
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +50 -42
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +39 -31
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +52 -44
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +46 -38
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +28 -15
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +30 -22
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +87 -69
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +99 -80
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +86 -67
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +31 -15
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +37 -29
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +29 -21
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +25 -17
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +42 -35
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +80 -62
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +41 -33
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +142 -108
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +177 -136
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +44 -36
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +49 -38
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +26 -18
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +112 -93
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +53 -46
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +31 -23
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +129 -90
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +96 -85
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +26 -18
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +47 -35
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +33 -25
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +36 -28
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +27 -19
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +27 -19
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +93 -75
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +111 -70
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +65 -53
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +35 -19
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +33 -25
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +26 -18
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +80 -55
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +33 -17
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +31 -23
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +29 -21
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +35 -27
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +147 -112
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +31 -27
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +31 -23
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +104 -85
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +75 -56
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +78 -60
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +133 -92
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +93 -52
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +28 -20
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +84 -65
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +25 -17
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +58 -40
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +41 -33
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +36 -29
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +103 -72
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +43 -27
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +28 -20
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +103 -62
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +83 -64
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +185 -144
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +40 -24
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/package.json +2 -2
|
@@ -2,29 +2,29 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
|
2
2
|
import { useMemo as t } from "react";
|
|
3
3
|
import { Award as n, Briefcase as r, Calendar as i, Clock as a, DollarSign as o, Globe as s, Mail as c, MapPin as l, MessageSquare as u, Phone as d, Star as f, ThumbsUp as p } from "lucide-react";
|
|
4
4
|
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
5
|
-
import { Badge as g, Button as _, Card as v, CardContent as y, CardDescription as b, CardHeader as x, CardTitle as S,
|
|
5
|
+
import { Badge as g, Button as _, Card as v, CardContent as y, CardDescription as b, CardHeader as x, CardTitle as S, EmphasisPanel as C, GradientText as w, PagePurpose as T, Separator as E } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { marketplaceServices:
|
|
7
|
+
function D() {
|
|
8
|
+
let { marketplaceServices: D, clients: O, announcements: k } = e(), A = t(() => Array.from(new Set(D.flatMap((e) => e.skills))).slice(0, 12), [D]), j = t(() => D.slice(0, 3).map((e, t) => ({
|
|
9
9
|
title: e.title,
|
|
10
|
-
client:
|
|
10
|
+
client: O[t % Math.max(O.length, 1)]?.name || e.provider,
|
|
11
11
|
duration: e.deliveryTime,
|
|
12
12
|
description: e.description,
|
|
13
13
|
outcome: `${Math.round(e.rating * 20)}% satisfaction`
|
|
14
|
-
})), [
|
|
14
|
+
})), [O, D]), M = t(() => k.slice(0, 3).map((e, t) => ({
|
|
15
15
|
author: e.author,
|
|
16
|
-
company:
|
|
17
|
-
rating: Math.min(5, Math.max(4, Math.round(
|
|
16
|
+
company: O[t % Math.max(O.length, 1)]?.name || "CrewFoundry Client",
|
|
17
|
+
rating: Math.min(5, Math.max(4, Math.round(D[t % Math.max(D.length, 1)]?.rating || 4.5))),
|
|
18
18
|
date: new Date(e.createdAt).toLocaleString("en-US", {
|
|
19
19
|
month: "short",
|
|
20
20
|
year: "numeric"
|
|
21
21
|
}),
|
|
22
22
|
text: e.content
|
|
23
23
|
})), [
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
]),
|
|
24
|
+
k,
|
|
25
|
+
O,
|
|
26
|
+
D
|
|
27
|
+
]), N = D.length > 0 ? (D.reduce((e, t) => e + t.rating, 0) / D.length).toFixed(1) : "4.8", P = D.reduce((e, t) => e + t.reviews, 0);
|
|
28
28
|
return /* @__PURE__ */ h("div", {
|
|
29
29
|
className: "space-y-6 p-6",
|
|
30
30
|
children: [
|
|
@@ -41,7 +41,7 @@ function T() {
|
|
|
41
41
|
children: [
|
|
42
42
|
/* @__PURE__ */ m("h1", {
|
|
43
43
|
className: "text-2xl font-semibold",
|
|
44
|
-
children: /* @__PURE__ */ m(
|
|
44
|
+
children: /* @__PURE__ */ m(w, { children: "Maria Santos" })
|
|
45
45
|
}),
|
|
46
46
|
/* @__PURE__ */ m(g, { children: "Top Rated" }),
|
|
47
47
|
/* @__PURE__ */ m(g, {
|
|
@@ -54,6 +54,10 @@ function T() {
|
|
|
54
54
|
className: "text-sm text-text-secondary",
|
|
55
55
|
children: "Senior HR Consultant & Technical Recruiter"
|
|
56
56
|
}),
|
|
57
|
+
/* @__PURE__ */ m(T, {
|
|
58
|
+
className: "mt-1",
|
|
59
|
+
children: "Review a freelancer's full profile — skills, history, and ratings — to decide if they're the right fit before you hire."
|
|
60
|
+
}),
|
|
57
61
|
/* @__PURE__ */ h("div", {
|
|
58
62
|
className: "flex flex-wrap items-center gap-4 text-xs text-text-secondary",
|
|
59
63
|
children: [
|
|
@@ -74,9 +78,9 @@ function T() {
|
|
|
74
78
|
children: [
|
|
75
79
|
/* @__PURE__ */ m(f, { className: "h-3 w-3 text-status-warning-text" }),
|
|
76
80
|
" ",
|
|
77
|
-
|
|
81
|
+
N,
|
|
78
82
|
" (",
|
|
79
|
-
|
|
83
|
+
P,
|
|
80
84
|
" ",
|
|
81
85
|
"reviews)"
|
|
82
86
|
]
|
|
@@ -103,25 +107,25 @@ function T() {
|
|
|
103
107
|
{
|
|
104
108
|
icon: r,
|
|
105
109
|
label: "Projects",
|
|
106
|
-
value: `${
|
|
110
|
+
value: `${P}`,
|
|
107
111
|
color: "text-status-info-text"
|
|
108
112
|
},
|
|
109
113
|
{
|
|
110
114
|
icon: p,
|
|
111
115
|
label: "Success Rate",
|
|
112
|
-
value: `${Math.min(99, Math.max(80, Math.round(Number(
|
|
116
|
+
value: `${Math.min(99, Math.max(80, Math.round(Number(N) * 20)))}%`,
|
|
113
117
|
color: "text-status-success-text"
|
|
114
118
|
},
|
|
115
119
|
{
|
|
116
120
|
icon: o,
|
|
117
121
|
label: "Hourly Rate",
|
|
118
|
-
value: `$${Math.round((
|
|
122
|
+
value: `$${Math.round((D[0]?.price || 150) / 10)}`,
|
|
119
123
|
color: "text-action-primary-bg"
|
|
120
124
|
},
|
|
121
125
|
{
|
|
122
126
|
icon: n,
|
|
123
127
|
label: "Certifications",
|
|
124
|
-
value: `${Math.max(3, Math.round(
|
|
128
|
+
value: `${Math.max(3, Math.round(A.length / 2))}`,
|
|
125
129
|
color: "text-status-warning-text"
|
|
126
130
|
}
|
|
127
131
|
].map((e) => /* @__PURE__ */ m(v, { children: /* @__PURE__ */ h(y, {
|
|
@@ -140,11 +144,11 @@ function T() {
|
|
|
140
144
|
children: [/* @__PURE__ */ h("div", {
|
|
141
145
|
className: "lg:col-span-2 space-y-6",
|
|
142
146
|
children: [
|
|
143
|
-
/* @__PURE__ */ h(
|
|
144
|
-
className: "text-base",
|
|
147
|
+
/* @__PURE__ */ h(C, { children: [/* @__PURE__ */ m("div", {
|
|
148
|
+
className: "mb-2 text-base font-semibold",
|
|
145
149
|
children: "About"
|
|
146
|
-
})
|
|
147
|
-
className: "text-sm text-text-secondary
|
|
150
|
+
}), /* @__PURE__ */ h("div", {
|
|
151
|
+
className: "space-y-3 text-sm text-text-secondary",
|
|
148
152
|
children: [/* @__PURE__ */ m("p", { children: "With 12+ years of experience in HR consulting and technical recruitment, I specialize in helping companies build world-class teams. My focus areas include executive search, engineering team buildouts, and designing scalable hiring processes for high-growth companies." }), /* @__PURE__ */ m("p", { children: "I've placed 300+ candidates across startups and Fortune 500 companies, with a 98% client satisfaction rate and 95% offer acceptance rate." })]
|
|
149
153
|
})] }),
|
|
150
154
|
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ h(x, { children: [/* @__PURE__ */ m(S, {
|
|
@@ -152,7 +156,7 @@ function T() {
|
|
|
152
156
|
children: "Portfolio"
|
|
153
157
|
}), /* @__PURE__ */ m(b, { children: "Selected projects and outcomes" })] }), /* @__PURE__ */ m(y, {
|
|
154
158
|
className: "space-y-4",
|
|
155
|
-
children:
|
|
159
|
+
children: j.map((e) => /* @__PURE__ */ h("div", {
|
|
156
160
|
className: "rounded-lg border p-4 space-y-2",
|
|
157
161
|
children: [
|
|
158
162
|
/* @__PURE__ */ h("div", {
|
|
@@ -189,7 +193,7 @@ function T() {
|
|
|
189
193
|
children: "Client Reviews"
|
|
190
194
|
}), /* @__PURE__ */ m(b, { children: "What clients say about working with Maria" })] }), /* @__PURE__ */ m(y, {
|
|
191
195
|
className: "space-y-4",
|
|
192
|
-
children:
|
|
196
|
+
children: M.map((e) => /* @__PURE__ */ h("div", {
|
|
193
197
|
className: "space-y-2",
|
|
194
198
|
children: [
|
|
195
199
|
/* @__PURE__ */ h("div", {
|
|
@@ -213,7 +217,7 @@ function T() {
|
|
|
213
217
|
className: "text-xs text-text-secondary",
|
|
214
218
|
children: e.text
|
|
215
219
|
}),
|
|
216
|
-
/* @__PURE__ */ m(
|
|
220
|
+
/* @__PURE__ */ m(E, {})
|
|
217
221
|
]
|
|
218
222
|
}, e.author))
|
|
219
223
|
})] })
|
|
@@ -226,7 +230,7 @@ function T() {
|
|
|
226
230
|
children: "Skills & Expertise"
|
|
227
231
|
}) }), /* @__PURE__ */ m(y, {
|
|
228
232
|
className: "flex flex-wrap gap-1.5",
|
|
229
|
-
children:
|
|
233
|
+
children: A.map((e) => /* @__PURE__ */ m(g, {
|
|
230
234
|
variant: "secondary",
|
|
231
235
|
className: "text-xs",
|
|
232
236
|
children: e
|
|
@@ -268,6 +272,6 @@ function T() {
|
|
|
268
272
|
});
|
|
269
273
|
}
|
|
270
274
|
//#endregion
|
|
271
|
-
export {
|
|
275
|
+
export { D as MarketplaceFreelancerProfilePagePage };
|
|
272
276
|
|
|
273
277
|
//# sourceMappingURL=MarketplaceFreelancerProfilePagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceFreelancerProfilePagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GradientText,\n Separator,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Award,\n Briefcase,\n Calendar,\n Clock,\n DollarSign,\n Globe,\n Mail,\n MapPin,\n MessageSquare,\n Phone,\n Star,\n ThumbsUp,\n} from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function MarketplaceFreelancerProfilePagePage() {\n const { marketplaceServices, clients, announcements } = useCrewFoundryStore();\n\n const skills = useMemo(\n () =>\n Array.from(new Set(marketplaceServices.flatMap((service) => service.skills))).slice(0, 12),\n [marketplaceServices]\n );\n\n const portfolio = useMemo(\n () =>\n marketplaceServices.slice(0, 3).map((service, index) => ({\n title: service.title,\n client: clients[index % Math.max(clients.length, 1)]?.name || service.provider,\n duration: service.deliveryTime,\n description: service.description,\n outcome: `${Math.round(service.rating * 20)}% satisfaction`,\n })),\n [clients, marketplaceServices]\n );\n\n const reviews = useMemo(\n () =>\n announcements.slice(0, 3).map((announcement, index) => ({\n author: announcement.author,\n company: clients[index % Math.max(clients.length, 1)]?.name || 'CrewFoundry Client',\n rating: Math.min(\n 5,\n Math.max(\n 4,\n Math.round(\n marketplaceServices[index % Math.max(marketplaceServices.length, 1)]?.rating || 4.5\n )\n )\n ),\n date: new Date(announcement.createdAt).toLocaleString('en-US', {\n month: 'short',\n year: 'numeric',\n }),\n text: announcement.content,\n })),\n [announcements, clients, marketplaceServices]\n );\n\n const avgRating =\n marketplaceServices.length > 0\n ? (\n marketplaceServices.reduce((sum, service) => sum + service.rating, 0) /\n marketplaceServices.length\n ).toFixed(1)\n : '4.8';\n\n const totalProjects = marketplaceServices.reduce((sum, service) => sum + service.reviews, 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-start gap-6\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-text text-2xl font-semibold\">\n MS\n </div>\n <div className=\"flex-1 space-y-2\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Maria Santos</GradientText>\n </h1>\n <Badge>Top Rated</Badge>\n <Badge variant=\"secondary\">Pro</Badge>\n </div>\n <p className=\"text-sm text-text-secondary\">Senior HR Consultant & Technical Recruiter</p>\n <div className=\"flex flex-wrap items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> San Francisco, CA\n </span>\n <span className=\"flex items-center gap-1\">\n <Globe className=\"h-3 w-3\" /> crewfoundry.com\n </span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" /> Member since 2022\n </span>\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" /> {avgRating} ({totalProjects}{' '}\n reviews)\n </span>\n </div>\n <div className=\"flex gap-2 pt-1\">\n <Button size=\"sm\">\n <MessageSquare className=\"h-3 w-3 mr-1\" /> Message\n </Button>\n <Button size=\"sm\" variant=\"outline\">\n <Calendar className=\"h-3 w-3 mr-1\" /> Book Consultation\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {[\n {\n icon: Briefcase,\n label: 'Projects',\n value: `${totalProjects}`,\n color: 'text-status-info-text',\n },\n {\n icon: ThumbsUp,\n label: 'Success Rate',\n value: `${Math.min(99, Math.max(80, Math.round(Number(avgRating) * 20)))}%`,\n color: 'text-status-success-text',\n },\n {\n icon: DollarSign,\n label: 'Hourly Rate',\n value: `$${Math.round((marketplaceServices[0]?.price || 150) / 10)}`,\n color: 'text-action-primary-bg',\n },\n {\n icon: Award,\n label: 'Certifications',\n value: `${Math.max(3, Math.round(skills.length / 2))}`,\n color: 'text-status-warning-text',\n },\n ].map((stat) => (\n <Card key={stat.label}>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <stat.icon className={`h-5 w-5 ${stat.color}`} />\n <div>\n <p className=\"text-xs text-text-secondary\">{stat.label}</p>\n <p className=\"text-lg font-bold\">{stat.value}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">About</CardTitle>\n </CardHeader>\n <CardContent className=\"text-sm text-text-secondary space-y-3\">\n <p>\n With 12+ years of experience in HR consulting and technical recruitment, I\n specialize in helping companies build world-class teams. My focus areas include\n executive search, engineering team buildouts, and designing scalable hiring\n processes for high-growth companies.\n </p>\n <p>\n I've placed 300+ candidates across startups and Fortune 500 companies, with a\n 98% client satisfaction rate and 95% offer acceptance rate.\n </p>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Portfolio</CardTitle>\n <CardDescription>Selected projects and outcomes</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {portfolio.map((item) => (\n <div key={item.title} className=\"rounded-lg border p-4 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <p className=\"font-medium text-sm\">{item.title}</p>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {item.duration}\n </Badge>\n </div>\n <p className=\"text-xs text-text-secondary\">{item.client}</p>\n <p className=\"text-xs text-text-secondary\">{item.description}</p>\n <div className=\"flex items-center gap-2 text-xs\">\n <ThumbsUp className=\"h-3 w-3 text-status-success-text\" />\n <span className=\"text-status-success-text font-medium\">{item.outcome}</span>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Client Reviews</CardTitle>\n <CardDescription>What clients say about working with Maria</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {reviews.map((review) => (\n <div key={review.author} className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium\">{review.author}</p>\n <p className=\"text-xs text-text-secondary\">\n {review.company} - {review.date}\n </p>\n </div>\n <div className=\"flex items-center gap-0.5\">\n {Array.from({ length: review.rating }).map((_, i) => (\n <Star\n key={i}\n className=\"h-3 w-3 text-status-warning-text fill-yellow-500\"\n />\n ))}\n </div>\n </div>\n <p className=\"text-xs text-text-secondary\">{review.text}</p>\n <Separator />\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Skills & Expertise</CardTitle>\n </CardHeader>\n <CardContent className=\"flex flex-wrap gap-1.5\">\n {skills.map((skill) => (\n <Badge key={skill} variant=\"secondary\" className=\"text-xs\">\n {skill}\n </Badge>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Certifications</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {[\n 'SHRM-SCP (Senior Certified Professional)',\n 'PHR (Professional in Human Resources)',\n 'LinkedIn Certified Recruiter',\n 'Google Project Management',\n 'DEI in the Workplace - Cornell',\n ].map((cert) => (\n <div key={cert} className=\"flex items-center gap-2 text-xs\">\n <Award className=\"h-3 w-3 text-status-warning-text shrink-0\" />\n <span>{cert}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Contact</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Mail className=\"h-3 w-3 text-text-secondary\" />\n <span>maria@talentpro.com</span>\n </div>\n <div className=\"flex items-center gap-2 text-sm\">\n <Phone className=\"h-3 w-3 text-text-secondary\" />\n <span>+1-555-0301</span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarketplaceFreelancerProfilePagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n PagePurpose,\n Separator,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Award,\n Briefcase,\n Calendar,\n Clock,\n DollarSign,\n Globe,\n Mail,\n MapPin,\n MessageSquare,\n Phone,\n Star,\n ThumbsUp,\n} from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function MarketplaceFreelancerProfilePagePage() {\n const { marketplaceServices, clients, announcements } = useCrewFoundryStore();\n\n const skills = useMemo(\n () =>\n Array.from(new Set(marketplaceServices.flatMap((service) => service.skills))).slice(0, 12),\n [marketplaceServices]\n );\n\n const portfolio = useMemo(\n () =>\n marketplaceServices.slice(0, 3).map((service, index) => ({\n title: service.title,\n client: clients[index % Math.max(clients.length, 1)]?.name || service.provider,\n duration: service.deliveryTime,\n description: service.description,\n outcome: `${Math.round(service.rating * 20)}% satisfaction`,\n })),\n [clients, marketplaceServices]\n );\n\n const reviews = useMemo(\n () =>\n announcements.slice(0, 3).map((announcement, index) => ({\n author: announcement.author,\n company: clients[index % Math.max(clients.length, 1)]?.name || 'CrewFoundry Client',\n rating: Math.min(\n 5,\n Math.max(\n 4,\n Math.round(\n marketplaceServices[index % Math.max(marketplaceServices.length, 1)]?.rating || 4.5\n )\n )\n ),\n date: new Date(announcement.createdAt).toLocaleString('en-US', {\n month: 'short',\n year: 'numeric',\n }),\n text: announcement.content,\n })),\n [announcements, clients, marketplaceServices]\n );\n\n const avgRating =\n marketplaceServices.length > 0\n ? (\n marketplaceServices.reduce((sum, service) => sum + service.rating, 0) /\n marketplaceServices.length\n ).toFixed(1)\n : '4.8';\n\n const totalProjects = marketplaceServices.reduce((sum, service) => sum + service.reviews, 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-start gap-6\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-text text-2xl font-semibold\">\n MS\n </div>\n <div className=\"flex-1 space-y-2\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Maria Santos</GradientText>\n </h1>\n <Badge>Top Rated</Badge>\n <Badge variant=\"secondary\">Pro</Badge>\n </div>\n <p className=\"text-sm text-text-secondary\">Senior HR Consultant & Technical Recruiter</p>\n <PagePurpose className=\"mt-1\">Review a freelancer's full profile — skills, history, and ratings — to decide if they're the right fit before you hire.</PagePurpose>\n <div className=\"flex flex-wrap items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> San Francisco, CA\n </span>\n <span className=\"flex items-center gap-1\">\n <Globe className=\"h-3 w-3\" /> crewfoundry.com\n </span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" /> Member since 2022\n </span>\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" /> {avgRating} ({totalProjects}{' '}\n reviews)\n </span>\n </div>\n <div className=\"flex gap-2 pt-1\">\n <Button size=\"sm\">\n <MessageSquare className=\"h-3 w-3 mr-1\" /> Message\n </Button>\n <Button size=\"sm\" variant=\"outline\">\n <Calendar className=\"h-3 w-3 mr-1\" /> Book Consultation\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {[\n {\n icon: Briefcase,\n label: 'Projects',\n value: `${totalProjects}`,\n color: 'text-status-info-text',\n },\n {\n icon: ThumbsUp,\n label: 'Success Rate',\n value: `${Math.min(99, Math.max(80, Math.round(Number(avgRating) * 20)))}%`,\n color: 'text-status-success-text',\n },\n {\n icon: DollarSign,\n label: 'Hourly Rate',\n value: `$${Math.round((marketplaceServices[0]?.price || 150) / 10)}`,\n color: 'text-action-primary-bg',\n },\n {\n icon: Award,\n label: 'Certifications',\n value: `${Math.max(3, Math.round(skills.length / 2))}`,\n color: 'text-status-warning-text',\n },\n ].map((stat) => (\n <Card key={stat.label}>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <stat.icon className={`h-5 w-5 ${stat.color}`} />\n <div>\n <p className=\"text-xs text-text-secondary\">{stat.label}</p>\n <p className=\"text-lg font-bold\">{stat.value}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2 space-y-6\">\n <EmphasisPanel>\n <div className=\"mb-2 text-base font-semibold\">About</div>\n <div className=\"space-y-3 text-sm text-text-secondary\">\n <p>\n With 12+ years of experience in HR consulting and technical recruitment, I\n specialize in helping companies build world-class teams. My focus areas include\n executive search, engineering team buildouts, and designing scalable hiring\n processes for high-growth companies.\n </p>\n <p>\n I've placed 300+ candidates across startups and Fortune 500 companies, with a\n 98% client satisfaction rate and 95% offer acceptance rate.\n </p>\n </div>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Portfolio</CardTitle>\n <CardDescription>Selected projects and outcomes</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {portfolio.map((item) => (\n <div key={item.title} className=\"rounded-lg border p-4 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <p className=\"font-medium text-sm\">{item.title}</p>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {item.duration}\n </Badge>\n </div>\n <p className=\"text-xs text-text-secondary\">{item.client}</p>\n <p className=\"text-xs text-text-secondary\">{item.description}</p>\n <div className=\"flex items-center gap-2 text-xs\">\n <ThumbsUp className=\"h-3 w-3 text-status-success-text\" />\n <span className=\"text-status-success-text font-medium\">{item.outcome}</span>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Client Reviews</CardTitle>\n <CardDescription>What clients say about working with Maria</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {reviews.map((review) => (\n <div key={review.author} className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium\">{review.author}</p>\n <p className=\"text-xs text-text-secondary\">\n {review.company} - {review.date}\n </p>\n </div>\n <div className=\"flex items-center gap-0.5\">\n {Array.from({ length: review.rating }).map((_, i) => (\n <Star\n key={i}\n className=\"h-3 w-3 text-status-warning-text fill-yellow-500\"\n />\n ))}\n </div>\n </div>\n <p className=\"text-xs text-text-secondary\">{review.text}</p>\n <Separator />\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Skills & Expertise</CardTitle>\n </CardHeader>\n <CardContent className=\"flex flex-wrap gap-1.5\">\n {skills.map((skill) => (\n <Badge key={skill} variant=\"secondary\" className=\"text-xs\">\n {skill}\n </Badge>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Certifications</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {[\n 'SHRM-SCP (Senior Certified Professional)',\n 'PHR (Professional in Human Resources)',\n 'LinkedIn Certified Recruiter',\n 'Google Project Management',\n 'DEI in the Workplace - Cornell',\n ].map((cert) => (\n <div key={cert} className=\"flex items-center gap-2 text-xs\">\n <Award className=\"h-3 w-3 text-status-warning-text shrink-0\" />\n <span>{cert}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Contact</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Mail className=\"h-3 w-3 text-text-secondary\" />\n <span>maria@talentpro.com</span>\n </div>\n <div className=\"flex items-center gap-2 text-sm\">\n <Phone className=\"h-3 w-3 text-text-secondary\" />\n <span>+1-555-0301</span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,39 +1,47 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { ShoppingBag as t, Star as n, Users as r } from "lucide-react";
|
|
3
3
|
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
4
|
-
import { Badge as o, Card as s, CardContent as c, CardDescription as l, CardHeader as u, CardTitle as d, GlassCard as f, GradientText as p } from "@burdenoff/fe-libs/ui";
|
|
5
|
-
import { useI18n as
|
|
4
|
+
import { Badge as o, Card as s, CardContent as c, CardDescription as l, CardHeader as u, CardTitle as d, GlassCard as f, GradientText as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
import { useI18n as h } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
6
|
//#region src/crewfoundry/pages/MarketplaceMarketplacePagePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { t:
|
|
9
|
-
let n =
|
|
7
|
+
function g() {
|
|
8
|
+
let { t: g } = h(), { marketplaceServices: _ } = e(), v = (e, t) => {
|
|
9
|
+
let n = g(e);
|
|
10
10
|
return n === e ? t : n;
|
|
11
11
|
};
|
|
12
12
|
return /* @__PURE__ */ a("div", {
|
|
13
13
|
className: "space-y-6 p-6",
|
|
14
14
|
children: [
|
|
15
|
-
/* @__PURE__ */ a("div", { children: [
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
/* @__PURE__ */ a("div", { children: [
|
|
16
|
+
/* @__PURE__ */ i("h1", {
|
|
17
|
+
className: "text-2xl font-semibold",
|
|
18
|
+
children: /* @__PURE__ */ i(p, { children: v("crewfoundry.marketplace.title", "HR Services Marketplace") })
|
|
19
|
+
}),
|
|
20
|
+
/* @__PURE__ */ i("p", {
|
|
21
|
+
className: "text-sm text-text-secondary",
|
|
22
|
+
children: v("crewfoundry.marketplace.subtitle", "Find and hire professional HR service providers")
|
|
23
|
+
}),
|
|
24
|
+
/* @__PURE__ */ i(m, {
|
|
25
|
+
className: "mt-1",
|
|
26
|
+
children: "Discover freelancers and services for your projects — browse the marketplace to find and hire the right talent on demand."
|
|
27
|
+
})
|
|
28
|
+
] }),
|
|
22
29
|
/* @__PURE__ */ a("div", {
|
|
23
30
|
className: "grid gap-4 md:grid-cols-3",
|
|
24
31
|
children: [
|
|
25
32
|
/* @__PURE__ */ a(f, {
|
|
26
|
-
treatment: "
|
|
33
|
+
treatment: "glass",
|
|
34
|
+
glow: !0,
|
|
27
35
|
className: "border-border-seam",
|
|
28
36
|
children: [/* @__PURE__ */ a(u, {
|
|
29
37
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
30
38
|
children: [/* @__PURE__ */ i(d, {
|
|
31
39
|
className: "text-sm font-medium",
|
|
32
|
-
children:
|
|
40
|
+
children: v("crewfoundry.marketplace.stats.services", "Services")
|
|
33
41
|
}), /* @__PURE__ */ i(t, { className: "h-4 w-4 text-text-secondary" })]
|
|
34
42
|
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
35
43
|
className: "text-2xl font-bold tabular-nums",
|
|
36
|
-
children:
|
|
44
|
+
children: _.length
|
|
37
45
|
}) })]
|
|
38
46
|
}),
|
|
39
47
|
/* @__PURE__ */ a(f, {
|
|
@@ -43,11 +51,11 @@ function h() {
|
|
|
43
51
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
44
52
|
children: [/* @__PURE__ */ i(d, {
|
|
45
53
|
className: "text-sm font-medium",
|
|
46
|
-
children:
|
|
54
|
+
children: v("crewfoundry.marketplace.stats.avgRating", "Avg Rating")
|
|
47
55
|
}), /* @__PURE__ */ i(n, { className: "h-4 w-4 text-status-warning-text" })]
|
|
48
56
|
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
49
57
|
className: "text-2xl font-bold tabular-nums",
|
|
50
|
-
children: (
|
|
58
|
+
children: (_.reduce((e, t) => e + t.rating, 0) / _.length).toFixed(1)
|
|
51
59
|
}) })]
|
|
52
60
|
}),
|
|
53
61
|
/* @__PURE__ */ a(f, {
|
|
@@ -57,22 +65,22 @@ function h() {
|
|
|
57
65
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
58
66
|
children: [/* @__PURE__ */ i(d, {
|
|
59
67
|
className: "text-sm font-medium",
|
|
60
|
-
children:
|
|
68
|
+
children: v("crewfoundry.marketplace.stats.totalReviews", "Total Reviews")
|
|
61
69
|
}), /* @__PURE__ */ i(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
62
70
|
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
63
71
|
className: "text-2xl font-bold tabular-nums",
|
|
64
|
-
children:
|
|
72
|
+
children: _.reduce((e, t) => e + t.reviews, 0)
|
|
65
73
|
}) })]
|
|
66
74
|
})
|
|
67
75
|
]
|
|
68
76
|
}),
|
|
69
77
|
/* @__PURE__ */ i("h2", {
|
|
70
78
|
className: "text-lg font-medium",
|
|
71
|
-
children:
|
|
79
|
+
children: v("crewfoundry.marketplace.featured.title", "Featured Services")
|
|
72
80
|
}),
|
|
73
81
|
/* @__PURE__ */ i("div", {
|
|
74
82
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
75
|
-
children:
|
|
83
|
+
children: _.map((e) => /* @__PURE__ */ a(s, {
|
|
76
84
|
className: "hover:shadow-md transition-shadow cursor-pointer",
|
|
77
85
|
children: [/* @__PURE__ */ a(u, { children: [
|
|
78
86
|
/* @__PURE__ */ a("div", {
|
|
@@ -131,7 +139,7 @@ function h() {
|
|
|
131
139
|
/* @__PURE__ */ a("p", {
|
|
132
140
|
className: "text-xs text-text-secondary mt-1",
|
|
133
141
|
children: [
|
|
134
|
-
|
|
142
|
+
v("crewfoundry.marketplace.card.delivery", "Delivery"),
|
|
135
143
|
": ",
|
|
136
144
|
e.deliveryTime
|
|
137
145
|
]
|
|
@@ -143,6 +151,6 @@ function h() {
|
|
|
143
151
|
});
|
|
144
152
|
}
|
|
145
153
|
//#endregion
|
|
146
|
-
export {
|
|
154
|
+
export { g as MarketplaceMarketplacePagePage };
|
|
147
155
|
|
|
148
156
|
//# sourceMappingURL=MarketplaceMarketplacePagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceMarketplacePagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMarketplacePagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { DollarSign, ShoppingBag, Star, TrendingUp, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function MarketplaceMarketplacePagePage() {\n const { t: translate } = useI18n();\n const { marketplaceServices } = useCrewFoundryStore();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>\n {t('crewfoundry.marketplace.title', 'HR Services Marketplace')}\n </GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {t('crewfoundry.marketplace.subtitle', 'Find and hire professional HR service providers')}\n </p>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"
|
|
1
|
+
{"version":3,"file":"MarketplaceMarketplacePagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMarketplacePagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { DollarSign, ShoppingBag, Star, TrendingUp, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function MarketplaceMarketplacePagePage() {\n const { t: translate } = useI18n();\n const { marketplaceServices } = useCrewFoundryStore();\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>\n {t('crewfoundry.marketplace.title', 'HR Services Marketplace')}\n </GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {t('crewfoundry.marketplace.subtitle', 'Find and hire professional HR service providers')}\n </p>\n <PagePurpose className=\"mt-1\">Discover freelancers and services for your projects — browse the marketplace to find and hire the right talent on demand.</PagePurpose>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow 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\">\n {t('crewfoundry.marketplace.stats.services', 'Services')}\n </CardTitle>\n <ShoppingBag className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{marketplaceServices.length}</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\">\n {t('crewfoundry.marketplace.stats.avgRating', 'Avg Rating')}\n </CardTitle>\n <Star className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {(\n marketplaceServices.reduce((s, m) => s + m.rating, 0) / marketplaceServices.length\n ).toFixed(1)}\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\">\n {t('crewfoundry.marketplace.stats.totalReviews', 'Total Reviews')}\n </CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {marketplaceServices.reduce((s, m) => s + m.reviews, 0)}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n <h2 className=\"text-lg font-medium\">\n {t('crewfoundry.marketplace.featured.title', 'Featured Services')}\n </h2>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {marketplaceServices.map((svc) => (\n <Card key={svc.id} className=\"hover:shadow-md transition-shadow cursor-pointer\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {svc.category}\n </Badge>\n <Badge\n variant={svc.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {svc.status}\n </Badge>\n </div>\n <CardTitle className=\"text-base mt-2\">{svc.title}</CardTitle>\n <CardDescription>{svc.provider}</CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary mb-3\">{svc.description}</p>\n <div className=\"flex flex-wrap gap-1 mb-3\">\n {svc.skills.map((s) => (\n <Badge key={s} variant=\"outline\" className=\"text-[9px]\">\n {s}\n </Badge>\n ))}\n </div>\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"font-bold\">\n ${svc.price.toLocaleString()}\n <span className=\"text-xs font-normal text-text-secondary\">/{svc.priceType}</span>\n </span>\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {svc.rating} ({svc.reviews})\n </span>\n </div>\n <p className=\"text-xs text-text-secondary mt-1\">\n {t('crewfoundry.marketplace.card.delivery', 'Delivery')}: {svc.deliveryTime}\n </p>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,104 +1,123 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { useState as t } from "react";
|
|
3
3
|
import { Search as n, Star as r } from "lucide-react";
|
|
4
|
-
import {
|
|
5
|
-
import { Badge as
|
|
4
|
+
import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as s, CardContent as c, GlassCard as l, GradientText as u, IllustratedEmptyState as d, Input as f, PagePurpose as p } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { marketplaceServices:
|
|
9
|
-
return /* @__PURE__ */
|
|
7
|
+
function m() {
|
|
8
|
+
let { marketplaceServices: m } = e(), [h, g] = t(""), _ = m.filter((e) => `${e.title} ${e.provider} ${e.category}`.toLowerCase().includes(h.toLowerCase()));
|
|
9
|
+
return /* @__PURE__ */ o("div", {
|
|
10
10
|
className: "space-y-6 p-6",
|
|
11
11
|
children: [
|
|
12
|
-
/* @__PURE__ */
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
/* @__PURE__ */ o("div", { children: [
|
|
13
|
+
/* @__PURE__ */ a("h1", {
|
|
14
|
+
className: "text-2xl font-semibold",
|
|
15
|
+
children: /* @__PURE__ */ a(u, { children: "Browse Services" })
|
|
16
|
+
}),
|
|
17
|
+
/* @__PURE__ */ o("p", {
|
|
18
|
+
className: "text-sm text-text-secondary",
|
|
19
|
+
children: [m.length, " services available"]
|
|
20
|
+
}),
|
|
21
|
+
/* @__PURE__ */ a(p, {
|
|
22
|
+
className: "mt-1",
|
|
23
|
+
children: "Explore services offered on the marketplace — search and compare offerings to find exactly the help your project needs."
|
|
24
|
+
})
|
|
25
|
+
] }),
|
|
26
|
+
/* @__PURE__ */ o("div", {
|
|
20
27
|
className: "relative max-w-sm",
|
|
21
|
-
children: [/* @__PURE__ */
|
|
28
|
+
children: [/* @__PURE__ */ a(n, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ a(f, {
|
|
22
29
|
placeholder: "Search services...",
|
|
23
30
|
className: "pl-9",
|
|
24
|
-
value:
|
|
25
|
-
onChange: (e) =>
|
|
31
|
+
value: h,
|
|
32
|
+
onChange: (e) => g(e.target.value)
|
|
26
33
|
})]
|
|
27
34
|
}),
|
|
28
|
-
/* @__PURE__ */
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
/* @__PURE__ */
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
/* @__PURE__ */ i("span", {
|
|
41
|
-
className: "text-center",
|
|
42
|
-
children: "Rating"
|
|
43
|
-
}),
|
|
44
|
-
/* @__PURE__ */ i("span", {
|
|
45
|
-
className: "text-center",
|
|
46
|
-
children: "Status"
|
|
35
|
+
/* @__PURE__ */ a(l, {
|
|
36
|
+
treatment: "glass",
|
|
37
|
+
glow: !0,
|
|
38
|
+
className: "border-border-seam",
|
|
39
|
+
children: /* @__PURE__ */ a(c, {
|
|
40
|
+
className: "p-0",
|
|
41
|
+
children: _.length === 0 ? /* @__PURE__ */ a("div", {
|
|
42
|
+
className: "p-6",
|
|
43
|
+
children: /* @__PURE__ */ a(d, {
|
|
44
|
+
illustration: "empty-search",
|
|
45
|
+
title: "No services found",
|
|
46
|
+
description: "Try a different search term to find the help you need."
|
|
47
47
|
})
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
className: "w-fit h-fit text-[10px]",
|
|
66
|
-
children: e.category
|
|
67
|
-
}),
|
|
68
|
-
/* @__PURE__ */ a("span", {
|
|
69
|
-
className: "text-right font-medium",
|
|
70
|
-
children: [
|
|
71
|
-
"$",
|
|
72
|
-
e.price.toLocaleString(),
|
|
73
|
-
"/",
|
|
74
|
-
e.priceType
|
|
75
|
-
]
|
|
76
|
-
}),
|
|
77
|
-
/* @__PURE__ */ a("div", {
|
|
78
|
-
className: "flex items-center justify-center gap-1",
|
|
79
|
-
children: [
|
|
80
|
-
/* @__PURE__ */ i(r, { className: "h-3 w-3 text-status-warning-text" }),
|
|
81
|
-
e.rating,
|
|
82
|
-
" (",
|
|
83
|
-
e.reviews,
|
|
84
|
-
")"
|
|
85
|
-
]
|
|
86
|
-
}),
|
|
87
|
-
/* @__PURE__ */ i("div", {
|
|
88
|
-
className: "text-center",
|
|
89
|
-
children: /* @__PURE__ */ i(o, {
|
|
90
|
-
variant: e.status === "active" ? "default" : "secondary",
|
|
91
|
-
className: "text-[10px]",
|
|
92
|
-
children: e.status
|
|
48
|
+
}) : /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ o("div", {
|
|
49
|
+
className: "grid grid-cols-6 gap-2 text-xs font-medium text-text-secondary p-4 border-b",
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ a("span", { children: "Service" }),
|
|
52
|
+
/* @__PURE__ */ a("span", { children: "Provider" }),
|
|
53
|
+
/* @__PURE__ */ a("span", { children: "Category" }),
|
|
54
|
+
/* @__PURE__ */ a("span", {
|
|
55
|
+
className: "text-right",
|
|
56
|
+
children: "Price"
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ a("span", {
|
|
59
|
+
className: "text-center",
|
|
60
|
+
children: "Rating"
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ a("span", {
|
|
63
|
+
className: "text-center",
|
|
64
|
+
children: "Status"
|
|
93
65
|
})
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
66
|
+
]
|
|
67
|
+
}), _.map((e) => /* @__PURE__ */ o("div", {
|
|
68
|
+
className: "grid grid-cols-6 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50",
|
|
69
|
+
children: [
|
|
70
|
+
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
|
|
71
|
+
className: "font-medium",
|
|
72
|
+
children: e.title
|
|
73
|
+
}), /* @__PURE__ */ o("p", {
|
|
74
|
+
className: "text-xs text-text-secondary truncate",
|
|
75
|
+
children: [e.description.slice(0, 60), "..."]
|
|
76
|
+
})] }),
|
|
77
|
+
/* @__PURE__ */ a("span", {
|
|
78
|
+
className: "text-text-secondary",
|
|
79
|
+
children: e.provider
|
|
80
|
+
}),
|
|
81
|
+
/* @__PURE__ */ a(s, {
|
|
82
|
+
variant: "outline",
|
|
83
|
+
className: "w-fit h-fit text-[10px]",
|
|
84
|
+
children: e.category
|
|
85
|
+
}),
|
|
86
|
+
/* @__PURE__ */ o("span", {
|
|
87
|
+
className: "text-right font-medium",
|
|
88
|
+
children: [
|
|
89
|
+
"$",
|
|
90
|
+
e.price.toLocaleString(),
|
|
91
|
+
"/",
|
|
92
|
+
e.priceType
|
|
93
|
+
]
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ o("div", {
|
|
96
|
+
className: "flex items-center justify-center gap-1",
|
|
97
|
+
children: [
|
|
98
|
+
/* @__PURE__ */ a(r, { className: "h-3 w-3 text-status-warning-text" }),
|
|
99
|
+
e.rating,
|
|
100
|
+
" (",
|
|
101
|
+
e.reviews,
|
|
102
|
+
")"
|
|
103
|
+
]
|
|
104
|
+
}),
|
|
105
|
+
/* @__PURE__ */ a("div", {
|
|
106
|
+
className: "text-center",
|
|
107
|
+
children: /* @__PURE__ */ a(s, {
|
|
108
|
+
variant: e.status === "active" ? "default" : "secondary",
|
|
109
|
+
className: "text-[10px]",
|
|
110
|
+
children: e.status
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
]
|
|
114
|
+
}, e.id))] })
|
|
115
|
+
})
|
|
116
|
+
})
|
|
98
117
|
]
|
|
99
118
|
});
|
|
100
119
|
}
|
|
101
120
|
//#endregion
|
|
102
|
-
export {
|
|
121
|
+
export { m as MarketplaceMarketplaceServicesPagePage };
|
|
103
122
|
|
|
104
123
|
//# sourceMappingURL=MarketplaceMarketplaceServicesPagePage.js.map
|