@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,18 +2,18 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
|
2
2
|
import { useMemo as t } from "react";
|
|
3
3
|
import { ArrowUp as n, Building2 as r, DollarSign as i, Percent as a, Target as o } from "lucide-react";
|
|
4
4
|
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
5
|
-
import { Badge as l, Card as u, CardContent as d, CardDescription as f, CardHeader as p, CardTitle as m,
|
|
5
|
+
import { Badge as l, Card as u, CardContent as d, CardDescription as f, CardHeader as p, CardTitle as m, GlassCard as h, GradientText as g, Separator as _ } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/DashboardExecutiveDashboardPage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { employees:
|
|
7
|
+
function v() {
|
|
8
|
+
let { employees: v, departments: y, projects: b, jobPostings: x } = e(), S = t(() => {
|
|
9
9
|
let e = [
|
|
10
10
|
"Q1 2025",
|
|
11
11
|
"Q2 2025",
|
|
12
12
|
"Q3 2025",
|
|
13
13
|
"Q4 2025"
|
|
14
|
-
], t =
|
|
14
|
+
], t = b.reduce((e, t) => e + t.budget, 0) || 1e6;
|
|
15
15
|
return e.map((e, n) => {
|
|
16
|
-
let r = Math.round(t * (.55 + n * .08)), i = Math.max(1,
|
|
16
|
+
let r = Math.round(t * (.55 + n * .08)), i = Math.max(1, v.length - (3 - n) * 4);
|
|
17
17
|
return {
|
|
18
18
|
quarter: e,
|
|
19
19
|
revenue: r,
|
|
@@ -21,45 +21,45 @@ function g() {
|
|
|
21
21
|
revenuePerHead: Math.round(r / i)
|
|
22
22
|
};
|
|
23
23
|
});
|
|
24
|
-
}, [
|
|
24
|
+
}, [v.length, b]), C = t(() => [
|
|
25
25
|
{
|
|
26
26
|
metric: "Flight Risk Employees",
|
|
27
|
-
value:
|
|
27
|
+
value: v.filter((e) => e.performanceScore < 3.6).length,
|
|
28
28
|
severity: "warning",
|
|
29
|
-
detail: `${Math.round(
|
|
29
|
+
detail: `${Math.round(v.filter((e) => e.performanceScore < 3.6).length / Math.max(v.length, 1) * 100)}% of workforce`
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
metric: "Overdue Performance Reviews",
|
|
33
|
-
value:
|
|
33
|
+
value: v.filter((e) => e.status === "on_leave").length,
|
|
34
34
|
severity: "error",
|
|
35
35
|
detail: "Review follow-ups required"
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
metric: "Unfilled Critical Roles",
|
|
39
|
-
value:
|
|
39
|
+
value: x.filter((e) => e.status === "active" && e.experienceLevel === "lead").length,
|
|
40
40
|
severity: "warning",
|
|
41
41
|
detail: "Open lead-level positions"
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
44
|
metric: "Expiring Contracts",
|
|
45
|
-
value:
|
|
45
|
+
value: v.filter((e) => e.type === "contract").length,
|
|
46
46
|
severity: "info",
|
|
47
47
|
detail: "Contract renewals in focus"
|
|
48
48
|
}
|
|
49
|
-
], [
|
|
49
|
+
], [v, x]), w = t(() => [{
|
|
50
50
|
category: "Company",
|
|
51
51
|
male: 52,
|
|
52
52
|
female: 43,
|
|
53
53
|
other: 5
|
|
54
|
-
}, ...
|
|
55
|
-
let t =
|
|
54
|
+
}, ...y.map((e) => {
|
|
55
|
+
let t = v.filter((t) => t.department === e.name).length, n = Math.min(100, Math.round(45 + t % 15)), r = Math.min(100 - n, Math.round(40 + t % 10)), i = Math.max(0, 100 - n - r);
|
|
56
56
|
return {
|
|
57
57
|
category: e.name,
|
|
58
58
|
male: n,
|
|
59
59
|
female: r,
|
|
60
60
|
other: i
|
|
61
61
|
};
|
|
62
|
-
}).slice(0, 3)], [
|
|
62
|
+
}).slice(0, 3)], [y, v]), T = v.reduce((e, t) => e + t.salary, 0), E = y.reduce((e, t) => e + t.budget, 0), D = b.reduce((e, t) => e + t.budget, 0), O = b.reduce((e, t) => e + t.spent, 0), k = Math.round(O / D * 100);
|
|
63
63
|
return /* @__PURE__ */ c("div", {
|
|
64
64
|
className: "space-y-6 p-6",
|
|
65
65
|
children: [
|
|
@@ -67,9 +67,9 @@ function g() {
|
|
|
67
67
|
className: "flex items-center justify-between",
|
|
68
68
|
children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("h1", {
|
|
69
69
|
className: "text-2xl font-semibold",
|
|
70
|
-
children: "Executive Dashboard"
|
|
70
|
+
children: /* @__PURE__ */ s(g, { children: "Executive Dashboard" })
|
|
71
71
|
}), /* @__PURE__ */ s("p", {
|
|
72
|
-
className: "text-sm text-
|
|
72
|
+
className: "text-sm text-text-secondary",
|
|
73
73
|
children: "Strategic workforce insights for leadership"
|
|
74
74
|
})] }), /* @__PURE__ */ s(l, {
|
|
75
75
|
variant: "outline",
|
|
@@ -79,74 +79,90 @@ function g() {
|
|
|
79
79
|
/* @__PURE__ */ c("div", {
|
|
80
80
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
|
|
81
81
|
children: [
|
|
82
|
-
/* @__PURE__ */ c(
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
className: "
|
|
123
|
-
children: [
|
|
124
|
-
"
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
"
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
82
|
+
/* @__PURE__ */ c(h, {
|
|
83
|
+
treatment: "metric",
|
|
84
|
+
className: "border-border-seam",
|
|
85
|
+
children: [/* @__PURE__ */ c(p, {
|
|
86
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
87
|
+
children: [/* @__PURE__ */ s(m, {
|
|
88
|
+
className: "text-sm font-medium",
|
|
89
|
+
children: "Revenue per Employee"
|
|
90
|
+
}), /* @__PURE__ */ s(i, { className: "h-4 w-4 text-text-secondary" })]
|
|
91
|
+
}), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s("div", {
|
|
92
|
+
className: "text-2xl font-bold tabular-nums",
|
|
93
|
+
children: "$21,862"
|
|
94
|
+
}), /* @__PURE__ */ c("div", {
|
|
95
|
+
className: "flex items-center text-xs text-status-success-text",
|
|
96
|
+
children: [/* @__PURE__ */ s(n, { className: "h-3 w-3 mr-1" }), "+2.0% from Q3"]
|
|
97
|
+
})] })]
|
|
98
|
+
}),
|
|
99
|
+
/* @__PURE__ */ c(h, {
|
|
100
|
+
treatment: "metric",
|
|
101
|
+
className: "border-border-seam",
|
|
102
|
+
children: [/* @__PURE__ */ c(p, {
|
|
103
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
104
|
+
children: [/* @__PURE__ */ s(m, {
|
|
105
|
+
className: "text-sm font-medium",
|
|
106
|
+
children: "Total Workforce Cost"
|
|
107
|
+
}), /* @__PURE__ */ s(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
108
|
+
}), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c("div", {
|
|
109
|
+
className: "text-2xl font-bold tabular-nums",
|
|
110
|
+
children: [
|
|
111
|
+
"$",
|
|
112
|
+
(T / 1e6).toFixed(1),
|
|
113
|
+
"M"
|
|
114
|
+
]
|
|
115
|
+
}), /* @__PURE__ */ s("p", {
|
|
116
|
+
className: "text-xs text-text-secondary",
|
|
117
|
+
children: "Annual salary expenditure"
|
|
118
|
+
})] })]
|
|
119
|
+
}),
|
|
120
|
+
/* @__PURE__ */ c(h, {
|
|
121
|
+
treatment: "metric",
|
|
122
|
+
className: "border-border-seam",
|
|
123
|
+
children: [/* @__PURE__ */ c(p, {
|
|
124
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
125
|
+
children: [/* @__PURE__ */ s(m, {
|
|
126
|
+
className: "text-sm font-medium",
|
|
127
|
+
children: "Budget Utilization"
|
|
128
|
+
}), /* @__PURE__ */ s(a, { className: "h-4 w-4 text-text-secondary" })]
|
|
129
|
+
}), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c("div", {
|
|
130
|
+
className: "text-2xl font-bold tabular-nums",
|
|
131
|
+
children: [k, "%"]
|
|
132
|
+
}), /* @__PURE__ */ c("p", {
|
|
133
|
+
className: "text-xs text-text-secondary",
|
|
134
|
+
children: [
|
|
135
|
+
"$",
|
|
136
|
+
(O / 1e6).toFixed(1),
|
|
137
|
+
"M of $",
|
|
138
|
+
(D / 1e6).toFixed(1),
|
|
139
|
+
"M"
|
|
140
|
+
]
|
|
141
|
+
})] })]
|
|
142
|
+
}),
|
|
143
|
+
/* @__PURE__ */ c(h, {
|
|
144
|
+
treatment: "metric",
|
|
145
|
+
className: "border-border-seam",
|
|
146
|
+
children: [/* @__PURE__ */ c(p, {
|
|
147
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
148
|
+
children: [/* @__PURE__ */ s(m, {
|
|
149
|
+
className: "text-sm font-medium",
|
|
150
|
+
children: "Retention Rate"
|
|
151
|
+
}), /* @__PURE__ */ s(o, { className: "h-4 w-4 text-text-secondary" })]
|
|
152
|
+
}), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s("div", {
|
|
153
|
+
className: "text-2xl font-bold tabular-nums",
|
|
154
|
+
children: "95.8%"
|
|
155
|
+
}), /* @__PURE__ */ c("div", {
|
|
156
|
+
className: "flex items-center text-xs text-status-success-text",
|
|
157
|
+
children: [/* @__PURE__ */ s(n, { className: "h-3 w-3 mr-1" }), "+1.1% improvement"]
|
|
158
|
+
})] })]
|
|
159
|
+
})
|
|
144
160
|
]
|
|
145
161
|
}),
|
|
146
162
|
/* @__PURE__ */ c("div", {
|
|
147
163
|
className: "grid gap-4 md:grid-cols-2",
|
|
148
164
|
children: [/* @__PURE__ */ c(u, { children: [/* @__PURE__ */ c(p, { children: [/* @__PURE__ */ s(m, { children: "Revenue & Headcount Trend" }), /* @__PURE__ */ s(f, { children: "Quarterly performance metrics" })] }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c("div", {
|
|
149
|
-
className: "grid grid-cols-4 gap-2 text-xs font-medium text-
|
|
165
|
+
className: "grid grid-cols-4 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2",
|
|
150
166
|
children: [
|
|
151
167
|
/* @__PURE__ */ s("span", { children: "Quarter" }),
|
|
152
168
|
/* @__PURE__ */ s("span", {
|
|
@@ -162,7 +178,7 @@ function g() {
|
|
|
162
178
|
children: "Rev/Head"
|
|
163
179
|
})
|
|
164
180
|
]
|
|
165
|
-
}),
|
|
181
|
+
}), S.map((e) => /* @__PURE__ */ c("div", {
|
|
166
182
|
className: "grid grid-cols-4 gap-2 py-2 border-b last:border-0 text-sm",
|
|
167
183
|
children: [
|
|
168
184
|
/* @__PURE__ */ s("span", {
|
|
@@ -188,15 +204,15 @@ function g() {
|
|
|
188
204
|
]
|
|
189
205
|
}, e.quarter))] })] }), /* @__PURE__ */ c(u, { children: [/* @__PURE__ */ c(p, { children: [/* @__PURE__ */ s(m, { children: "Risk Indicators" }), /* @__PURE__ */ s(f, { children: "Items requiring executive attention" })] }), /* @__PURE__ */ s(d, {
|
|
190
206
|
className: "space-y-3",
|
|
191
|
-
children:
|
|
207
|
+
children: C.map((e) => /* @__PURE__ */ c("div", {
|
|
192
208
|
className: "flex items-center justify-between rounded border p-3",
|
|
193
209
|
children: [/* @__PURE__ */ c("div", {
|
|
194
210
|
className: "flex items-center gap-3",
|
|
195
|
-
children: [/* @__PURE__ */ s("div", { className: `h-3 w-3 rounded-full ${e.severity === "error" ? "bg-
|
|
211
|
+
children: [/* @__PURE__ */ s("div", { className: `h-3 w-3 rounded-full ${e.severity === "error" ? "bg-status-error-text" : e.severity === "warning" ? "bg-status-warning-text" : "bg-status-info-text"}` }), /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
|
|
196
212
|
className: "text-sm font-medium",
|
|
197
213
|
children: e.metric
|
|
198
214
|
}), /* @__PURE__ */ s("p", {
|
|
199
|
-
className: "text-xs text-
|
|
215
|
+
className: "text-xs text-text-secondary",
|
|
200
216
|
children: e.detail
|
|
201
217
|
})] })]
|
|
202
218
|
}), /* @__PURE__ */ s("span", {
|
|
@@ -208,7 +224,7 @@ function g() {
|
|
|
208
224
|
}),
|
|
209
225
|
/* @__PURE__ */ c(u, { children: [/* @__PURE__ */ c(p, { children: [/* @__PURE__ */ s(m, { children: "Diversity & Inclusion Metrics" }), /* @__PURE__ */ s(f, { children: "Gender distribution across organization segments" })] }), /* @__PURE__ */ s(d, { children: /* @__PURE__ */ s("div", {
|
|
210
226
|
className: "space-y-4",
|
|
211
|
-
children:
|
|
227
|
+
children: w.map((e) => /* @__PURE__ */ c("div", {
|
|
212
228
|
className: "space-y-1",
|
|
213
229
|
children: [/* @__PURE__ */ c("div", {
|
|
214
230
|
className: "flex justify-between text-sm",
|
|
@@ -216,7 +232,7 @@ function g() {
|
|
|
216
232
|
className: "font-medium",
|
|
217
233
|
children: e.category
|
|
218
234
|
}), /* @__PURE__ */ c("span", {
|
|
219
|
-
className: "text-xs text-
|
|
235
|
+
className: "text-xs text-text-secondary",
|
|
220
236
|
children: [
|
|
221
237
|
"M: ",
|
|
222
238
|
e.male,
|
|
@@ -231,15 +247,15 @@ function g() {
|
|
|
231
247
|
className: "flex h-3 rounded overflow-hidden",
|
|
232
248
|
children: [
|
|
233
249
|
/* @__PURE__ */ s("div", {
|
|
234
|
-
className: "bg-
|
|
250
|
+
className: "bg-status-info-text",
|
|
235
251
|
style: { width: `${e.male}%` }
|
|
236
252
|
}),
|
|
237
253
|
/* @__PURE__ */ s("div", {
|
|
238
|
-
className: "bg-
|
|
254
|
+
className: "bg-action-primary-bg",
|
|
239
255
|
style: { width: `${e.female}%` }
|
|
240
256
|
}),
|
|
241
257
|
/* @__PURE__ */ s("div", {
|
|
242
|
-
className: "bg-
|
|
258
|
+
className: "bg-status-success-text",
|
|
243
259
|
style: { width: `${e.other}%` }
|
|
244
260
|
})
|
|
245
261
|
]
|
|
@@ -248,7 +264,7 @@ function g() {
|
|
|
248
264
|
}) })] }),
|
|
249
265
|
/* @__PURE__ */ c(u, { children: [/* @__PURE__ */ c(p, { children: [/* @__PURE__ */ s(m, { children: "Department Budget Status" }), /* @__PURE__ */ s(f, { children: "Annual budget allocation and headcount" })] }), /* @__PURE__ */ c(d, { children: [
|
|
250
266
|
/* @__PURE__ */ c("div", {
|
|
251
|
-
className: "grid grid-cols-5 gap-2 text-xs font-medium text-
|
|
267
|
+
className: "grid grid-cols-5 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2",
|
|
252
268
|
children: [
|
|
253
269
|
/* @__PURE__ */ s("span", { children: "Department" }),
|
|
254
270
|
/* @__PURE__ */ s("span", { children: "Head" }),
|
|
@@ -266,7 +282,7 @@ function g() {
|
|
|
266
282
|
})
|
|
267
283
|
]
|
|
268
284
|
}),
|
|
269
|
-
|
|
285
|
+
y.map((e) => {
|
|
270
286
|
let t = e.employeeCount > 0 ? Math.round(e.budget / e.employeeCount) : 0;
|
|
271
287
|
return /* @__PURE__ */ c("div", {
|
|
272
288
|
className: "grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm",
|
|
@@ -276,7 +292,7 @@ function g() {
|
|
|
276
292
|
children: e.name
|
|
277
293
|
}),
|
|
278
294
|
/* @__PURE__ */ s("span", {
|
|
279
|
-
className: "text-
|
|
295
|
+
className: "text-text-secondary",
|
|
280
296
|
children: e.headName
|
|
281
297
|
}),
|
|
282
298
|
/* @__PURE__ */ s("span", {
|
|
@@ -302,7 +318,7 @@ function g() {
|
|
|
302
318
|
]
|
|
303
319
|
}, e.id);
|
|
304
320
|
}),
|
|
305
|
-
/* @__PURE__ */ s(
|
|
321
|
+
/* @__PURE__ */ s(_, { className: "my-2" }),
|
|
306
322
|
/* @__PURE__ */ c("div", {
|
|
307
323
|
className: "grid grid-cols-5 gap-2 text-sm font-bold",
|
|
308
324
|
children: [
|
|
@@ -310,13 +326,13 @@ function g() {
|
|
|
310
326
|
/* @__PURE__ */ s("span", {}),
|
|
311
327
|
/* @__PURE__ */ s("span", {
|
|
312
328
|
className: "text-right",
|
|
313
|
-
children:
|
|
329
|
+
children: y.reduce((e, t) => e + t.employeeCount, 0)
|
|
314
330
|
}),
|
|
315
331
|
/* @__PURE__ */ c("span", {
|
|
316
332
|
className: "text-right",
|
|
317
333
|
children: [
|
|
318
334
|
"$",
|
|
319
|
-
(
|
|
335
|
+
(E / 1e6).toFixed(1),
|
|
320
336
|
"M"
|
|
321
337
|
]
|
|
322
338
|
}),
|
|
@@ -324,7 +340,7 @@ function g() {
|
|
|
324
340
|
className: "text-right",
|
|
325
341
|
children: [
|
|
326
342
|
"$",
|
|
327
|
-
(
|
|
343
|
+
(E / y.reduce((e, t) => e + t.employeeCount, 0) / 1e3).toFixed(0),
|
|
328
344
|
"K"
|
|
329
345
|
]
|
|
330
346
|
})
|
|
@@ -335,6 +351,6 @@ function g() {
|
|
|
335
351
|
});
|
|
336
352
|
}
|
|
337
353
|
//#endregion
|
|
338
|
-
export {
|
|
354
|
+
export { v as DashboardExecutiveDashboardPage };
|
|
339
355
|
|
|
340
356
|
//# sourceMappingURL=DashboardExecutiveDashboardPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardExecutiveDashboardPage.js","names":[],"sources":["../../../src/crewfoundry/pages/DashboardExecutiveDashboardPage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Separator,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowUp, Building2, DollarSign, Percent, Target } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function DashboardExecutiveDashboardPage() {\n const { employees, departments, projects, jobPostings } = useCrewFoundryStore();\n\n const quarterlyRevenue = useMemo(() => {\n const quarters = ['Q1 2025', 'Q2 2025', 'Q3 2025', 'Q4 2025'];\n const base = projects.reduce((sum, project) => sum + project.budget, 0) || 1000000;\n return quarters.map((quarter, index) => {\n const revenue = Math.round(base * (0.55 + index * 0.08));\n const headcount = Math.max(1, employees.length - (3 - index) * 4);\n return {\n quarter,\n revenue,\n headcount,\n revenuePerHead: Math.round(revenue / headcount),\n };\n });\n }, [employees.length, projects]);\n\n const riskIndicators = useMemo(\n () => [\n {\n metric: 'Flight Risk Employees',\n value: employees.filter((employee) => employee.performanceScore < 3.6).length,\n severity: 'warning' as const,\n detail: `${Math.round((employees.filter((employee) => employee.performanceScore < 3.6).length / Math.max(employees.length, 1)) * 100)}% of workforce`,\n },\n {\n metric: 'Overdue Performance Reviews',\n value: employees.filter((employee) => employee.status === 'on_leave').length,\n severity: 'error' as const,\n detail: 'Review follow-ups required',\n },\n {\n metric: 'Unfilled Critical Roles',\n value: jobPostings.filter(\n (posting) => posting.status === 'active' && posting.experienceLevel === 'lead'\n ).length,\n severity: 'warning' as const,\n detail: 'Open lead-level positions',\n },\n {\n metric: 'Expiring Contracts',\n value: employees.filter((employee) => employee.type === 'contract').length,\n severity: 'info' as const,\n detail: 'Contract renewals in focus',\n },\n ],\n [employees, jobPostings]\n );\n\n const diversityMetrics = useMemo(() => {\n const byDepartment = departments.map((department) => {\n const count = employees.filter((employee) => employee.department === department.name).length;\n const male = Math.min(100, Math.round(45 + (count % 15)));\n const female = Math.min(100 - male, Math.round(40 + (count % 10)));\n const other = Math.max(0, 100 - male - female);\n return { category: department.name, male, female, other };\n });\n return [\n {\n category: 'Company',\n male: 52,\n female: 43,\n other: 5,\n },\n ...byDepartment.slice(0, 3),\n ];\n }, [departments, employees]);\n\n const totalSalaryBudget = employees.reduce((sum, e) => sum + e.salary, 0);\n const totalDeptBudget = departments.reduce((sum, d) => sum + d.budget, 0);\n const totalProjectBudget = projects.reduce((sum, p) => sum + p.budget, 0);\n const totalProjectSpent = projects.reduce((sum, p) => sum + p.spent, 0);\n const budgetUtilization = Math.round((totalProjectSpent / totalProjectBudget) * 100);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Executive Dashboard</h1>\n <p className=\"text-sm text-muted-foreground\">\n Strategic workforce insights for leadership\n </p>\n </div>\n <Badge variant=\"outline\">Q1 2026</Badge>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Revenue per Employee</CardTitle>\n <DollarSign className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">$21,862</div>\n <div className=\"flex items-center text-xs text-green-600\">\n <ArrowUp className=\"h-3 w-3 mr-1\" />\n +2.0% from Q3\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\">Total Workforce Cost</CardTitle>\n <Building2 className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${(totalSalaryBudget / 1000000).toFixed(1)}M</div>\n <p className=\"text-xs text-muted-foreground\">Annual salary expenditure</p>\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\">Budget Utilization</CardTitle>\n <Percent className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{budgetUtilization}%</div>\n <p className=\"text-xs text-muted-foreground\">\n ${(totalProjectSpent / 1000000).toFixed(1)}M of $\n {(totalProjectBudget / 1000000).toFixed(1)}M\n </p>\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\">Retention Rate</CardTitle>\n <Target className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">95.8%</div>\n <div className=\"flex items-center text-xs text-green-600\">\n <ArrowUp className=\"h-3 w-3 mr-1\" />\n +1.1% improvement\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Revenue & Headcount Trend</CardTitle>\n <CardDescription>Quarterly performance metrics</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-4 gap-2 text-xs font-medium text-muted-foreground border-b pb-2 mb-2\">\n <span>Quarter</span>\n <span className=\"text-right\">Revenue</span>\n <span className=\"text-right\">Headcount</span>\n <span className=\"text-right\">Rev/Head</span>\n </div>\n {quarterlyRevenue.map((q) => (\n <div\n key={q.quarter}\n className=\"grid grid-cols-4 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{q.quarter}</span>\n <span className=\"text-right\">${(q.revenue / 1000000).toFixed(1)}M</span>\n <span className=\"text-right\">{q.headcount}</span>\n <span className=\"text-right font-medium\">${q.revenuePerHead.toLocaleString()}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Risk Indicators</CardTitle>\n <CardDescription>Items requiring executive attention</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {riskIndicators.map((risk) => (\n <div\n key={risk.metric}\n className=\"flex items-center justify-between rounded border p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <div\n className={`h-3 w-3 rounded-full ${\n risk.severity === 'error'\n ? 'bg-red-500'\n : risk.severity === 'warning'\n ? 'bg-yellow-500'\n : 'bg-blue-500'\n }`}\n />\n <div>\n <p className=\"text-sm font-medium\">{risk.metric}</p>\n <p className=\"text-xs text-muted-foreground\">{risk.detail}</p>\n </div>\n </div>\n <span className=\"text-lg font-bold\">{risk.value}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Diversity & Inclusion Metrics</CardTitle>\n <CardDescription>Gender distribution across organization segments</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-4\">\n {diversityMetrics.map((d) => (\n <div key={d.category} className=\"space-y-1\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"font-medium\">{d.category}</span>\n <span className=\"text-xs text-muted-foreground\">\n M: {d.male}% · F: {d.female}% · Other: {d.other}%\n </span>\n </div>\n <div className=\"flex h-3 rounded overflow-hidden\">\n <div className=\"bg-blue-500\" style={{ width: `${d.male}%` }} />\n <div className=\"bg-purple-500\" style={{ width: `${d.female}%` }} />\n <div className=\"bg-green-500\" style={{ width: `${d.other}%` }} />\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Department Budget Status</CardTitle>\n <CardDescription>Annual budget allocation and headcount</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-5 gap-2 text-xs font-medium text-muted-foreground border-b pb-2 mb-2\">\n <span>Department</span>\n <span>Head</span>\n <span className=\"text-right\">Headcount</span>\n <span className=\"text-right\">Budget</span>\n <span className=\"text-right\">Cost/Employee</span>\n </div>\n {departments.map((dept) => {\n const costPerEmp =\n dept.employeeCount > 0 ? Math.round(dept.budget / dept.employeeCount) : 0;\n return (\n <div\n key={dept.id}\n className=\"grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{dept.name}</span>\n <span className=\"text-muted-foreground\">{dept.headName}</span>\n <span className=\"text-right\">{dept.employeeCount}</span>\n <span className=\"text-right\">${(dept.budget / 1000000).toFixed(1)}M</span>\n <span className=\"text-right\">${(costPerEmp / 1000).toFixed(0)}K</span>\n </div>\n );\n })}\n <Separator className=\"my-2\" />\n <div className=\"grid grid-cols-5 gap-2 text-sm font-bold\">\n <span>Total</span>\n <span />\n <span className=\"text-right\">\n {departments.reduce((s, d) => s + d.employeeCount, 0)}\n </span>\n <span className=\"text-right\">${(totalDeptBudget / 1000000).toFixed(1)}M</span>\n <span className=\"text-right\">\n $\n {(\n totalDeptBudget /\n departments.reduce((s, d) => s + d.employeeCount, 0) /\n 1000\n ).toFixed(0)}\n K\n </span>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DashboardExecutiveDashboardPage.js","names":[],"sources":["../../../src/crewfoundry/pages/DashboardExecutiveDashboardPage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n Separator,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowUp, Building2, DollarSign, Percent, Target } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function DashboardExecutiveDashboardPage() {\n const { employees, departments, projects, jobPostings } = useCrewFoundryStore();\n\n const quarterlyRevenue = useMemo(() => {\n const quarters = ['Q1 2025', 'Q2 2025', 'Q3 2025', 'Q4 2025'];\n const base = projects.reduce((sum, project) => sum + project.budget, 0) || 1000000;\n return quarters.map((quarter, index) => {\n const revenue = Math.round(base * (0.55 + index * 0.08));\n const headcount = Math.max(1, employees.length - (3 - index) * 4);\n return {\n quarter,\n revenue,\n headcount,\n revenuePerHead: Math.round(revenue / headcount),\n };\n });\n }, [employees.length, projects]);\n\n const riskIndicators = useMemo(\n () => [\n {\n metric: 'Flight Risk Employees',\n value: employees.filter((employee) => employee.performanceScore < 3.6).length,\n severity: 'warning' as const,\n detail: `${Math.round((employees.filter((employee) => employee.performanceScore < 3.6).length / Math.max(employees.length, 1)) * 100)}% of workforce`,\n },\n {\n metric: 'Overdue Performance Reviews',\n value: employees.filter((employee) => employee.status === 'on_leave').length,\n severity: 'error' as const,\n detail: 'Review follow-ups required',\n },\n {\n metric: 'Unfilled Critical Roles',\n value: jobPostings.filter(\n (posting) => posting.status === 'active' && posting.experienceLevel === 'lead'\n ).length,\n severity: 'warning' as const,\n detail: 'Open lead-level positions',\n },\n {\n metric: 'Expiring Contracts',\n value: employees.filter((employee) => employee.type === 'contract').length,\n severity: 'info' as const,\n detail: 'Contract renewals in focus',\n },\n ],\n [employees, jobPostings]\n );\n\n const diversityMetrics = useMemo(() => {\n const byDepartment = departments.map((department) => {\n const count = employees.filter((employee) => employee.department === department.name).length;\n const male = Math.min(100, Math.round(45 + (count % 15)));\n const female = Math.min(100 - male, Math.round(40 + (count % 10)));\n const other = Math.max(0, 100 - male - female);\n return { category: department.name, male, female, other };\n });\n return [\n {\n category: 'Company',\n male: 52,\n female: 43,\n other: 5,\n },\n ...byDepartment.slice(0, 3),\n ];\n }, [departments, employees]);\n\n const totalSalaryBudget = employees.reduce((sum, e) => sum + e.salary, 0);\n const totalDeptBudget = departments.reduce((sum, d) => sum + d.budget, 0);\n const totalProjectBudget = projects.reduce((sum, p) => sum + p.budget, 0);\n const totalProjectSpent = projects.reduce((sum, p) => sum + p.spent, 0);\n const budgetUtilization = Math.round((totalProjectSpent / totalProjectBudget) * 100);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Executive Dashboard</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Strategic workforce insights for leadership</p>\n </div>\n <Badge variant=\"outline\">Q1 2026</Badge>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\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\">Revenue per Employee</CardTitle>\n <DollarSign className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">$21,862</div>\n <div className=\"flex items-center text-xs text-status-success-text\">\n <ArrowUp className=\"h-3 w-3 mr-1\" />\n +2.0% from Q3\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\">Total Workforce Cost</CardTitle>\n <Building2 className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n ${(totalSalaryBudget / 1000000).toFixed(1)}M\n </div>\n <p className=\"text-xs text-text-secondary\">Annual salary expenditure</p>\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\">Budget Utilization</CardTitle>\n <Percent className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{budgetUtilization}%</div>\n <p className=\"text-xs text-text-secondary\">\n ${(totalProjectSpent / 1000000).toFixed(1)}M of $\n {(totalProjectBudget / 1000000).toFixed(1)}M\n </p>\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\">Retention Rate</CardTitle>\n <Target className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">95.8%</div>\n <div className=\"flex items-center text-xs text-status-success-text\">\n <ArrowUp className=\"h-3 w-3 mr-1\" />\n +1.1% improvement\n </div>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Revenue & Headcount Trend</CardTitle>\n <CardDescription>Quarterly performance metrics</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-4 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Quarter</span>\n <span className=\"text-right\">Revenue</span>\n <span className=\"text-right\">Headcount</span>\n <span className=\"text-right\">Rev/Head</span>\n </div>\n {quarterlyRevenue.map((q) => (\n <div\n key={q.quarter}\n className=\"grid grid-cols-4 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{q.quarter}</span>\n <span className=\"text-right\">${(q.revenue / 1000000).toFixed(1)}M</span>\n <span className=\"text-right\">{q.headcount}</span>\n <span className=\"text-right font-medium\">${q.revenuePerHead.toLocaleString()}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Risk Indicators</CardTitle>\n <CardDescription>Items requiring executive attention</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {riskIndicators.map((risk) => (\n <div\n key={risk.metric}\n className=\"flex items-center justify-between rounded border p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <div\n className={`h-3 w-3 rounded-full ${\n risk.severity === 'error'\n ? 'bg-status-error-text'\n : risk.severity === 'warning'\n ? 'bg-status-warning-text'\n : 'bg-status-info-text'\n }`}\n />\n <div>\n <p className=\"text-sm font-medium\">{risk.metric}</p>\n <p className=\"text-xs text-text-secondary\">{risk.detail}</p>\n </div>\n </div>\n <span className=\"text-lg font-bold\">{risk.value}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Diversity & Inclusion Metrics</CardTitle>\n <CardDescription>Gender distribution across organization segments</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-4\">\n {diversityMetrics.map((d) => (\n <div key={d.category} className=\"space-y-1\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"font-medium\">{d.category}</span>\n <span className=\"text-xs text-text-secondary\">\n M: {d.male}% · F: {d.female}% · Other: {d.other}%\n </span>\n </div>\n <div className=\"flex h-3 rounded overflow-hidden\">\n <div className=\"bg-status-info-text\" style={{ width: `${d.male}%` }} />\n <div className=\"bg-action-primary-bg\" style={{ width: `${d.female}%` }} />\n <div className=\"bg-status-success-text\" style={{ width: `${d.other}%` }} />\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Department Budget Status</CardTitle>\n <CardDescription>Annual budget allocation and headcount</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-5 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Department</span>\n <span>Head</span>\n <span className=\"text-right\">Headcount</span>\n <span className=\"text-right\">Budget</span>\n <span className=\"text-right\">Cost/Employee</span>\n </div>\n {departments.map((dept) => {\n const costPerEmp =\n dept.employeeCount > 0 ? Math.round(dept.budget / dept.employeeCount) : 0;\n return (\n <div\n key={dept.id}\n className=\"grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{dept.name}</span>\n <span className=\"text-text-secondary\">{dept.headName}</span>\n <span className=\"text-right\">{dept.employeeCount}</span>\n <span className=\"text-right\">${(dept.budget / 1000000).toFixed(1)}M</span>\n <span className=\"text-right\">${(costPerEmp / 1000).toFixed(0)}K</span>\n </div>\n );\n })}\n <Separator className=\"my-2\" />\n <div className=\"grid grid-cols-5 gap-2 text-sm font-bold\">\n <span>Total</span>\n <span />\n <span className=\"text-right\">\n {departments.reduce((s, d) => s + d.employeeCount, 0)}\n </span>\n <span className=\"text-right\">${(totalDeptBudget / 1000000).toFixed(1)}M</span>\n <span className=\"text-right\">\n $\n {(\n totalDeptBudget /\n departments.reduce((s, d) => s + d.employeeCount, 0) /\n 1000\n ).toFixed(0)}\n K\n </span>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|