@burdenoff/microfe-crewfoundry 2026.624.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.
Files changed (131) hide show
  1. package/dist/crewfoundry/pages/AdminAdminPagePage.js +86 -70
  2. package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
  3. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +104 -88
  4. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  5. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +91 -75
  6. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
  7. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +119 -103
  8. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +107 -91
  10. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +10 -10
  12. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +60 -48
  14. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +10 -10
  16. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +20 -20
  18. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +22 -22
  20. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
  21. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +7 -7
  22. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
  23. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +67 -55
  24. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
  25. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +54 -42
  26. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +68 -52
  28. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
  29. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +30 -30
  30. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
  31. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +9 -9
  32. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  33. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +90 -74
  34. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
  35. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +166 -132
  36. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  37. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +43 -43
  38. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  39. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +107 -91
  40. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
  41. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +35 -35
  42. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +78 -62
  44. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  45. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +17 -17
  46. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  47. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +39 -39
  48. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  49. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +53 -41
  50. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  51. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +41 -37
  52. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/HiringJobsPagePage.js +25 -20
  54. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +54 -42
  56. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +76 -60
  58. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +83 -67
  60. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/HrPayrollPagePage.js +86 -70
  62. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +79 -63
  64. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +51 -39
  66. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
  67. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +14 -14
  68. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +29 -25
  70. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +17 -17
  72. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +11 -11
  74. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +76 -60
  76. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/LearningLearningPagePage.js +67 -51
  78. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  79. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +17 -17
  80. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +7 -7
  82. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  83. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +69 -53
  84. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +54 -42
  86. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  87. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +66 -54
  88. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
  89. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +37 -37
  90. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  91. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +33 -32
  92. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +54 -42
  94. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  95. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +11 -11
  96. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  97. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +18 -18
  98. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
  99. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +7 -7
  100. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  101. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +29 -25
  102. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  103. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +22 -18
  104. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  105. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +55 -43
  106. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
  107. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +7 -7
  108. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  109. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +62 -46
  110. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  111. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +14 -14
  112. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
  113. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +71 -59
  114. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
  115. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +20 -20
  116. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  117. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +33 -29
  118. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  119. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +16 -16
  120. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  121. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +53 -41
  122. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  123. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +25 -21
  124. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  125. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +9 -9
  126. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  127. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +48 -48
  128. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  129. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +13 -13
  130. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  131. 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, Separator as h } from "@burdenoff/fe-libs/ui";
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 g() {
8
- let { employees: g, departments: _, projects: v, jobPostings: y } = e(), b = t(() => {
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 = v.reduce((e, t) => e + t.budget, 0) || 1e6;
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, g.length - (3 - n) * 4);
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
- }, [g.length, v]), x = t(() => [
24
+ }, [v.length, b]), C = t(() => [
25
25
  {
26
26
  metric: "Flight Risk Employees",
27
- value: g.filter((e) => e.performanceScore < 3.6).length,
27
+ value: v.filter((e) => e.performanceScore < 3.6).length,
28
28
  severity: "warning",
29
- detail: `${Math.round(g.filter((e) => e.performanceScore < 3.6).length / Math.max(g.length, 1) * 100)}% of workforce`
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: g.filter((e) => e.status === "on_leave").length,
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: y.filter((e) => e.status === "active" && e.experienceLevel === "lead").length,
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: g.filter((e) => e.type === "contract").length,
45
+ value: v.filter((e) => e.type === "contract").length,
46
46
  severity: "info",
47
47
  detail: "Contract renewals in focus"
48
48
  }
49
- ], [g, y]), S = t(() => [{
49
+ ], [v, x]), w = t(() => [{
50
50
  category: "Company",
51
51
  male: 52,
52
52
  female: 43,
53
53
  other: 5
54
- }, ..._.map((e) => {
55
- let t = g.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);
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)], [_, g]), C = g.reduce((e, t) => e + t.salary, 0), w = _.reduce((e, t) => e + t.budget, 0), T = v.reduce((e, t) => e + t.budget, 0), E = v.reduce((e, t) => e + t.spent, 0), D = Math.round(E / T * 100);
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,7 +67,7 @@ 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
72
  className: "text-sm text-text-secondary",
73
73
  children: "Strategic workforce insights for leadership"
@@ -79,68 +79,84 @@ 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(u, { children: [/* @__PURE__ */ c(p, {
83
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
84
- children: [/* @__PURE__ */ s(m, {
85
- className: "text-sm font-medium",
86
- children: "Revenue per Employee"
87
- }), /* @__PURE__ */ s(i, { className: "h-4 w-4 text-text-secondary" })]
88
- }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s("div", {
89
- className: "text-2xl font-bold",
90
- children: "$21,862"
91
- }), /* @__PURE__ */ c("div", {
92
- className: "flex items-center text-xs text-green-600",
93
- children: [/* @__PURE__ */ s(n, { className: "h-3 w-3 mr-1" }), "+2.0% from Q3"]
94
- })] })] }),
95
- /* @__PURE__ */ c(u, { children: [/* @__PURE__ */ c(p, {
96
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
97
- children: [/* @__PURE__ */ s(m, {
98
- className: "text-sm font-medium",
99
- children: "Total Workforce Cost"
100
- }), /* @__PURE__ */ s(r, { className: "h-4 w-4 text-text-secondary" })]
101
- }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c("div", {
102
- className: "text-2xl font-bold",
103
- children: [
104
- "$",
105
- (C / 1e6).toFixed(1),
106
- "M"
107
- ]
108
- }), /* @__PURE__ */ s("p", {
109
- className: "text-xs text-text-secondary",
110
- children: "Annual salary expenditure"
111
- })] })] }),
112
- /* @__PURE__ */ c(u, { children: [/* @__PURE__ */ c(p, {
113
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
114
- children: [/* @__PURE__ */ s(m, {
115
- className: "text-sm font-medium",
116
- children: "Budget Utilization"
117
- }), /* @__PURE__ */ s(a, { className: "h-4 w-4 text-text-secondary" })]
118
- }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c("div", {
119
- className: "text-2xl font-bold",
120
- children: [D, "%"]
121
- }), /* @__PURE__ */ c("p", {
122
- className: "text-xs text-text-secondary",
123
- children: [
124
- "$",
125
- (E / 1e6).toFixed(1),
126
- "M of $",
127
- (T / 1e6).toFixed(1),
128
- "M"
129
- ]
130
- })] })] }),
131
- /* @__PURE__ */ c(u, { children: [/* @__PURE__ */ c(p, {
132
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
133
- children: [/* @__PURE__ */ s(m, {
134
- className: "text-sm font-medium",
135
- children: "Retention Rate"
136
- }), /* @__PURE__ */ s(o, { className: "h-4 w-4 text-text-secondary" })]
137
- }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s("div", {
138
- className: "text-2xl font-bold",
139
- children: "95.8%"
140
- }), /* @__PURE__ */ c("div", {
141
- className: "flex items-center text-xs text-green-600",
142
- children: [/* @__PURE__ */ s(n, { className: "h-3 w-3 mr-1" }), "+1.1% improvement"]
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", {
@@ -162,7 +178,7 @@ function g() {
162
178
  children: "Rev/Head"
163
179
  })
164
180
  ]
165
- }), b.map((e) => /* @__PURE__ */ c("div", {
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,11 +204,11 @@ 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: x.map((e) => /* @__PURE__ */ c("div", {
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-red-500" : e.severity === "warning" ? "bg-yellow-500" : "bg-blue-500"}` }), /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
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", {
@@ -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: S.map((e) => /* @__PURE__ */ c("div", {
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",
@@ -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-blue-500",
250
+ className: "bg-status-info-text",
235
251
  style: { width: `${e.male}%` }
236
252
  }),
237
253
  /* @__PURE__ */ s("div", {
238
- className: "bg-purple-500",
254
+ className: "bg-action-primary-bg",
239
255
  style: { width: `${e.female}%` }
240
256
  }),
241
257
  /* @__PURE__ */ s("div", {
242
- className: "bg-green-500",
258
+ className: "bg-status-success-text",
243
259
  style: { width: `${e.other}%` }
244
260
  })
245
261
  ]
@@ -266,7 +282,7 @@ function g() {
266
282
  })
267
283
  ]
268
284
  }),
269
- _.map((e) => {
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",
@@ -302,7 +318,7 @@ function g() {
302
318
  ]
303
319
  }, e.id);
304
320
  }),
305
- /* @__PURE__ */ s(h, { className: "my-2" }),
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: _.reduce((e, t) => e + t.employeeCount, 0)
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
- (w / 1e6).toFixed(1),
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
- (w / _.reduce((e, t) => e + t.employeeCount, 0) / 1e3).toFixed(0),
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 { g as DashboardExecutiveDashboardPage };
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-text-secondary\">\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-text-secondary\" />\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-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${(totalSalaryBudget / 1000000).toFixed(1)}M</div>\n <p className=\"text-xs text-text-secondary\">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-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{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 </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-text-secondary\" />\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-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-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-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-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-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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"}
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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"}
@@ -2,16 +2,16 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { useMemo as t, useState as n } from "react";
3
3
  import { BookOpen as r, ChevronRight as i, Code2 as a, Copy as o, ExternalLink as s, Lock as c, Search as l, Server as u, Zap as d } from "lucide-react";
4
4
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
5
- import { Badge as m, Button as h, Card as g, CardContent as _, CardDescription as v, CardHeader as y, CardTitle as b, Input as x } from "@burdenoff/fe-libs/ui";
5
+ import { Badge as m, Button as h, Card as g, CardContent as _, CardDescription as v, CardHeader as y, CardTitle as b, GradientText as x, Input as S } from "@burdenoff/fe-libs/ui";
6
6
  //#region src/crewfoundry/pages/HelpApiDocumentationPagePage.tsx
7
- var S = {
8
- GET: "bg-green-100 text-green-700",
9
- POST: "bg-blue-100 text-blue-700",
10
- PATCH: "bg-yellow-100 text-yellow-700",
11
- DELETE: "bg-red-100 text-red-700"
7
+ var C = {
8
+ GET: "bg-status-success-bg text-status-success-text",
9
+ POST: "bg-status-info-bg text-status-info-text",
10
+ PATCH: "bg-status-warning-bg text-status-warning-text",
11
+ DELETE: "bg-status-error-bg text-status-error-text"
12
12
  };
13
- function C() {
14
- let { employees: C, jobPostings: w, candidates: T, payrollRecords: E, leaveRequests: D } = e(), [O, k] = n(""), [A, j] = n(null), M = t(() => [
13
+ function w() {
14
+ let { employees: w, jobPostings: T, candidates: E, payrollRecords: D, leaveRequests: O } = e(), [k, A] = n(""), [j, M] = n(null), N = t(() => [
15
15
  {
16
16
  name: "Employees",
17
17
  version: "v2",
@@ -19,7 +19,7 @@ function C() {
19
19
  {
20
20
  method: "GET",
21
21
  path: "/api/v2/employees",
22
- description: `List all employees (${C.length} records) with pagination and filters`
22
+ description: `List all employees (${w.length} records) with pagination and filters`
23
23
  },
24
24
  {
25
25
  method: "POST",
@@ -50,7 +50,7 @@ function C() {
50
50
  {
51
51
  method: "GET",
52
52
  path: "/api/v2/jobs",
53
- description: `List all job postings (${w.length} total)`
53
+ description: `List all job postings (${T.length} total)`
54
54
  },
55
55
  {
56
56
  method: "POST",
@@ -60,7 +60,7 @@ function C() {
60
60
  {
61
61
  method: "GET",
62
62
  path: "/api/v2/candidates",
63
- description: `List candidates (${T.length}) with pipeline filters`
63
+ description: `List candidates (${E.length}) with pipeline filters`
64
64
  },
65
65
  {
66
66
  method: "POST",
@@ -76,7 +76,7 @@ function C() {
76
76
  {
77
77
  method: "GET",
78
78
  path: "/api/v1/payroll/records",
79
- description: `List payroll records by period (${E.length} loaded)`
79
+ description: `List payroll records by period (${D.length} loaded)`
80
80
  },
81
81
  {
82
82
  method: "POST",
@@ -97,7 +97,7 @@ function C() {
97
97
  {
98
98
  method: "GET",
99
99
  path: "/api/v2/leave/requests",
100
- description: `List leave requests with status filters (${D.length} total)`
100
+ description: `List leave requests with status filters (${O.length} total)`
101
101
  },
102
102
  {
103
103
  method: "POST",
@@ -112,16 +112,16 @@ function C() {
112
112
  ]
113
113
  }
114
114
  ], [
115
- T.length,
116
- C.length,
115
+ E.length,
117
116
  w.length,
118
- D.length,
119
- E.length
120
- ]), N = (e) => {
121
- j(e), setTimeout(() => j(null), 1500);
122
- }, P = M.map((e) => ({
117
+ T.length,
118
+ O.length,
119
+ D.length
120
+ ]), P = (e) => {
121
+ M(e), setTimeout(() => M(null), 1500);
122
+ }, F = N.map((e) => ({
123
123
  ...e,
124
- endpoints: e.endpoints.filter((e) => e.path.toLowerCase().includes(O.toLowerCase()) || e.description.toLowerCase().includes(O.toLowerCase()))
124
+ endpoints: e.endpoints.filter((e) => e.path.toLowerCase().includes(k.toLowerCase()) || e.description.toLowerCase().includes(k.toLowerCase()))
125
125
  })).filter((e) => e.endpoints.length > 0);
126
126
  return /* @__PURE__ */ p("div", {
127
127
  className: "space-y-6 p-6",
@@ -130,7 +130,7 @@ function C() {
130
130
  className: "flex items-center justify-between",
131
131
  children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h1", {
132
132
  className: "text-2xl font-semibold",
133
- children: "API Documentation"
133
+ children: /* @__PURE__ */ f(x, { children: "API Documentation" })
134
134
  }), /* @__PURE__ */ f("p", {
135
135
  className: "text-sm text-text-secondary",
136
136
  children: "CrewFoundry REST API reference for integrations"
@@ -153,25 +153,25 @@ function C() {
153
153
  icon: u,
154
154
  label: "REST API",
155
155
  value: "v2.1.0",
156
- color: "text-blue-500"
156
+ color: "text-status-info-text"
157
157
  },
158
158
  {
159
159
  icon: a,
160
160
  label: "GraphQL",
161
161
  value: "Federation v2",
162
- color: "text-purple-500"
162
+ color: "text-action-primary-bg"
163
163
  },
164
164
  {
165
165
  icon: c,
166
166
  label: "Auth",
167
167
  value: "OAuth 2.0 + JWT",
168
- color: "text-green-500"
168
+ color: "text-status-success-text"
169
169
  },
170
170
  {
171
171
  icon: d,
172
172
  label: "Rate Limit",
173
173
  value: "1,000 req/min",
174
- color: "text-yellow-500"
174
+ color: "text-status-warning-text"
175
175
  }
176
176
  ].map((e) => /* @__PURE__ */ f(g, { children: /* @__PURE__ */ p(_, {
177
177
  className: "flex items-center gap-3 pt-6",
@@ -239,14 +239,14 @@ function C() {
239
239
  children: [
240
240
  /* @__PURE__ */ p("div", {
241
241
  className: "relative max-w-md",
242
- children: [/* @__PURE__ */ f(l, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ f(x, {
242
+ children: [/* @__PURE__ */ f(l, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ f(S, {
243
243
  placeholder: "Search endpoints...",
244
244
  className: "pl-9",
245
- value: O,
246
- onChange: (e) => k(e.target.value)
245
+ value: k,
246
+ onChange: (e) => A(e.target.value)
247
247
  })]
248
248
  }),
249
- P.map((e) => /* @__PURE__ */ p(g, { children: [/* @__PURE__ */ p(y, { children: [/* @__PURE__ */ p("div", {
249
+ F.map((e) => /* @__PURE__ */ p(g, { children: [/* @__PURE__ */ p(y, { children: [/* @__PURE__ */ p("div", {
250
250
  className: "flex items-center gap-2",
251
251
  children: [/* @__PURE__ */ f(b, {
252
252
  className: "text-base",
@@ -262,7 +262,7 @@ function C() {
262
262
  className: `flex items-center gap-3 px-6 py-3 hover:bg-bg-sunken/50 cursor-pointer ${n < e.endpoints.length - 1 ? "border-b" : ""}`,
263
263
  children: [
264
264
  /* @__PURE__ */ f(m, {
265
- className: `${S[t.method]} text-[10px] font-mono border-0 min-w-[50px] justify-center`,
265
+ className: `${C[t.method]} text-[10px] font-mono border-0 min-w-[50px] justify-center`,
266
266
  children: t.method
267
267
  }),
268
268
  /* @__PURE__ */ f("code", {
@@ -277,13 +277,13 @@ function C() {
277
277
  variant: "ghost",
278
278
  size: "sm",
279
279
  className: "h-6 w-6 p-0",
280
- onClick: () => N(t.path),
281
- children: /* @__PURE__ */ f(o, { className: `h-3 w-3 ${A === t.path ? "text-green-500" : "text-text-secondary"}` })
280
+ onClick: () => P(t.path),
281
+ children: /* @__PURE__ */ f(o, { className: `h-3 w-3 ${j === t.path ? "text-status-success-text" : "text-text-secondary"}` })
282
282
  })
283
283
  ]
284
284
  }, t.path + t.method))
285
285
  })] }, e.name)),
286
- P.length === 0 && /* @__PURE__ */ f("div", {
286
+ F.length === 0 && /* @__PURE__ */ f("div", {
287
287
  className: "rounded-lg border p-8 text-center text-sm text-text-secondary",
288
288
  children: "No endpoints match your search criteria."
289
289
  })
@@ -294,6 +294,6 @@ function C() {
294
294
  });
295
295
  }
296
296
  //#endregion
297
- export { C as HelpApiDocumentationPagePage };
297
+ export { w as HelpApiDocumentationPagePage };
298
298
 
299
299
  //# sourceMappingURL=HelpApiDocumentationPagePage.js.map