@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.
Files changed (131) hide show
  1. package/dist/crewfoundry/pages/AdminAdminPagePage.js +94 -78
  2. package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
  3. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +112 -96
  4. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  5. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +101 -85
  6. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
  7. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +131 -115
  8. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +116 -100
  10. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +15 -15
  12. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +63 -51
  14. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +16 -16
  16. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +26 -26
  18. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +28 -28
  20. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
  21. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +10 -10
  22. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
  23. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +71 -59
  24. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
  25. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +59 -47
  26. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +77 -61
  28. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
  29. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +40 -40
  30. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
  31. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +13 -13
  32. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  33. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +102 -86
  34. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
  35. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +173 -139
  36. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  37. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +59 -59
  38. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  39. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +113 -97
  40. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
  41. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +45 -45
  42. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +85 -69
  44. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  45. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +23 -23
  46. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  47. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +40 -40
  48. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  49. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +59 -47
  50. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  51. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +52 -48
  52. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/HiringJobsPagePage.js +31 -26
  54. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +61 -49
  56. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +83 -67
  58. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +90 -74
  60. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/HrPayrollPagePage.js +90 -74
  62. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +83 -67
  64. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +54 -42
  66. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
  67. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +16 -16
  68. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +39 -35
  70. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +24 -24
  72. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +14 -14
  74. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +81 -65
  76. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/LearningLearningPagePage.js +73 -57
  78. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  79. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +28 -28
  80. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +12 -12
  82. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  83. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +75 -59
  84. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +57 -45
  86. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  87. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +71 -59
  88. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
  89. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +48 -48
  90. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  91. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +44 -43
  92. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +58 -46
  94. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  95. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +16 -16
  96. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  97. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +23 -23
  98. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
  99. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +9 -9
  100. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  101. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +43 -39
  102. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  103. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +31 -27
  104. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  105. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +59 -47
  106. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
  107. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +13 -13
  108. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  109. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +66 -50
  110. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  111. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +18 -18
  112. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
  113. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +74 -62
  114. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
  115. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +21 -21
  116. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  117. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +47 -43
  118. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  119. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +20 -20
  120. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  121. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +58 -46
  122. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  123. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +38 -34
  124. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  125. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +14 -14
  126. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  127. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +67 -67
  128. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  129. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +16 -16
  130. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  131. package/package.json +2 -2
@@ -2,11 +2,11 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { useMemo as t } from "react";
3
3
  import { ArrowUp as n, DollarSign as r, FileText as i, Receipt as a, TrendingUp as o, Wallet as s } from "lucide-react";
4
4
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
- import { Badge as u, Card as d, CardContent as f, CardDescription as p, CardHeader as m, CardTitle as h, Separator as g } from "@burdenoff/fe-libs/ui";
5
+ import { Badge as u, Card as d, CardContent as f, CardDescription as p, CardHeader as m, CardTitle as h, GlassCard as g, GradientText as _, Separator as v } from "@burdenoff/fe-libs/ui";
6
6
  //#region src/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.tsx
7
- function _() {
8
- let { employees: _, departments: v, payrollRecords: y, invoices: b, projects: x } = e(), S = t(() => {
9
- let e = y.reduce((e, t) => {
7
+ function y() {
8
+ let { employees: y, departments: b, payrollRecords: x, invoices: S, projects: C } = e(), w = t(() => {
9
+ let e = x.reduce((e, t) => {
10
10
  let n = new Date(t.payDate).toLocaleString("en-US", { month: "short" }), r = e[n] || {
11
11
  gross: 0,
12
12
  net: 0,
@@ -18,38 +18,38 @@ function _() {
18
18
  month: e,
19
19
  ...t
20
20
  })).slice(-6);
21
- }, [y]), C = t(() => [
21
+ }, [x]), T = t(() => [
22
22
  {
23
23
  category: "Payroll",
24
- amount: y.reduce((e, t) => e + t.grossPay, 0),
25
- budget: v.reduce((e, t) => e + t.budget * .7, 0),
24
+ amount: x.reduce((e, t) => e + t.grossPay, 0),
25
+ budget: b.reduce((e, t) => e + t.budget * .7, 0),
26
26
  icon: s
27
27
  },
28
28
  {
29
29
  category: "Benefits",
30
- amount: y.reduce((e, t) => e + t.deductions * .4, 0),
31
- budget: v.reduce((e, t) => e + t.budget * .15, 0),
30
+ amount: x.reduce((e, t) => e + t.deductions * .4, 0),
31
+ budget: b.reduce((e, t) => e + t.budget * .15, 0),
32
32
  icon: a
33
33
  },
34
34
  {
35
35
  category: "Recruitment",
36
- amount: b.reduce((e, t) => e + (t.status === "paid" ? t.amount * .15 : 0), 0),
37
- budget: v.reduce((e, t) => e + t.budget * .1, 0),
36
+ amount: S.reduce((e, t) => e + (t.status === "paid" ? t.amount * .15 : 0), 0),
37
+ budget: b.reduce((e, t) => e + t.budget * .1, 0),
38
38
  icon: i
39
39
  },
40
40
  {
41
41
  category: "Training",
42
- amount: x.reduce((e, t) => e + t.spent * .08, 0),
43
- budget: v.reduce((e, t) => e + t.budget * .08, 0),
42
+ amount: C.reduce((e, t) => e + t.spent * .08, 0),
43
+ budget: b.reduce((e, t) => e + t.budget * .08, 0),
44
44
  icon: o
45
45
  }
46
46
  ], [
47
- v,
48
47
  b,
49
- y,
50
- x
51
- ]), w = _.reduce((e, t) => e + t.salary, 0), T = Math.round(w / 12), E = b.reduce((e, t) => e + t.amount, 0), D = b.filter((e) => e.status === "paid").reduce((e, t) => e + t.amount, 0), O = x.reduce((e, t) => e + t.budget, 0), k = x.reduce((e, t) => e + t.spent, 0), A = Math.max(1, ...S.map((e) => e.gross)), j = v.map((e) => {
52
- let t = _.filter((t) => t.department === e.name), n = t.reduce((e, t) => e + t.salary, 0);
48
+ S,
49
+ x,
50
+ C
51
+ ]), E = y.reduce((e, t) => e + t.salary, 0), D = Math.round(E / 12), O = S.reduce((e, t) => e + t.amount, 0), k = S.filter((e) => e.status === "paid").reduce((e, t) => e + t.amount, 0), A = C.reduce((e, t) => e + t.budget, 0), j = C.reduce((e, t) => e + t.spent, 0), M = Math.max(1, ...w.map((e) => e.gross)), N = b.map((e) => {
52
+ let t = y.filter((t) => t.department === e.name), n = t.reduce((e, t) => e + t.salary, 0);
53
53
  return {
54
54
  name: e.name,
55
55
  salary: n,
@@ -64,106 +64,122 @@ function _() {
64
64
  className: "flex items-center justify-between",
65
65
  children: /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("h1", {
66
66
  className: "text-2xl font-semibold",
67
- children: "Financial Analytics"
67
+ children: /* @__PURE__ */ c(_, { children: "Financial Analytics" })
68
68
  }), /* @__PURE__ */ c("p", {
69
- className: "text-sm text-muted-foreground",
69
+ className: "text-sm text-text-secondary",
70
70
  children: "Workforce financial metrics and cost analysis"
71
71
  })] })
72
72
  }),
73
73
  /* @__PURE__ */ l("div", {
74
74
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
75
75
  children: [
76
- /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ l(m, {
77
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
78
- children: [/* @__PURE__ */ c(h, {
79
- className: "text-sm font-medium",
80
- children: "Monthly Payroll"
81
- }), /* @__PURE__ */ c(r, { className: "h-4 w-4 text-muted-foreground" })]
82
- }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
83
- className: "text-2xl font-bold",
84
- children: [
85
- "$",
86
- (T / 1e3).toFixed(0),
87
- "K"
88
- ]
89
- }), /* @__PURE__ */ l("div", {
90
- className: "flex items-center text-xs text-yellow-600",
91
- children: [/* @__PURE__ */ c(n, { className: "h-3 w-3 mr-1" }), "+2.1% from last month"]
92
- })] })] }),
93
- /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ l(m, {
94
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
95
- children: [/* @__PURE__ */ c(h, {
96
- className: "text-sm font-medium",
97
- children: "Annual Salary Cost"
98
- }), /* @__PURE__ */ c(s, { className: "h-4 w-4 text-muted-foreground" })]
99
- }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
100
- className: "text-2xl font-bold",
101
- children: [
102
- "$",
103
- (w / 1e6).toFixed(1),
104
- "M"
105
- ]
106
- }), /* @__PURE__ */ l("p", {
107
- className: "text-xs text-muted-foreground",
108
- children: [_.length, " employees"]
109
- })] })] }),
110
- /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ l(m, {
111
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
112
- children: [/* @__PURE__ */ c(h, {
113
- className: "text-sm font-medium",
114
- children: "Total Invoiced"
115
- }), /* @__PURE__ */ c(i, { className: "h-4 w-4 text-muted-foreground" })]
116
- }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
117
- className: "text-2xl font-bold",
118
- children: [
119
- "$",
120
- (E / 1e3).toFixed(1),
121
- "K"
122
- ]
123
- }), /* @__PURE__ */ l("p", {
124
- className: "text-xs text-muted-foreground",
125
- children: [
126
- "$",
127
- (D / 1e3).toFixed(1),
128
- "K collected"
129
- ]
130
- })] })] }),
131
- /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ l(m, {
132
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
133
- children: [/* @__PURE__ */ c(h, {
134
- className: "text-sm font-medium",
135
- children: "Project Budget"
136
- }), /* @__PURE__ */ c(o, { className: "h-4 w-4 text-muted-foreground" })]
137
- }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
138
- className: "text-2xl font-bold",
139
- children: [
140
- "$",
141
- (O / 1e6).toFixed(1),
142
- "M"
143
- ]
144
- }), /* @__PURE__ */ l("p", {
145
- className: "text-xs text-muted-foreground",
146
- children: [Math.round(k / O * 100), "% utilized"]
147
- })] })] })
76
+ /* @__PURE__ */ l(g, {
77
+ treatment: "metric",
78
+ className: "border-border-seam",
79
+ children: [/* @__PURE__ */ l(m, {
80
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
81
+ children: [/* @__PURE__ */ c(h, {
82
+ className: "text-sm font-medium",
83
+ children: "Monthly Payroll"
84
+ }), /* @__PURE__ */ c(r, { className: "h-4 w-4 text-text-secondary" })]
85
+ }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
86
+ className: "text-2xl font-bold tabular-nums",
87
+ children: [
88
+ "$",
89
+ (D / 1e3).toFixed(0),
90
+ "K"
91
+ ]
92
+ }), /* @__PURE__ */ l("div", {
93
+ className: "flex items-center text-xs text-status-warning-text",
94
+ children: [/* @__PURE__ */ c(n, { className: "h-3 w-3 mr-1" }), "+2.1% from last month"]
95
+ })] })]
96
+ }),
97
+ /* @__PURE__ */ l(g, {
98
+ treatment: "metric",
99
+ className: "border-border-seam",
100
+ children: [/* @__PURE__ */ l(m, {
101
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
102
+ children: [/* @__PURE__ */ c(h, {
103
+ className: "text-sm font-medium",
104
+ children: "Annual Salary Cost"
105
+ }), /* @__PURE__ */ c(s, { className: "h-4 w-4 text-text-secondary" })]
106
+ }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
107
+ className: "text-2xl font-bold tabular-nums",
108
+ children: [
109
+ "$",
110
+ (E / 1e6).toFixed(1),
111
+ "M"
112
+ ]
113
+ }), /* @__PURE__ */ l("p", {
114
+ className: "text-xs text-text-secondary",
115
+ children: [y.length, " employees"]
116
+ })] })]
117
+ }),
118
+ /* @__PURE__ */ l(g, {
119
+ treatment: "metric",
120
+ className: "border-border-seam",
121
+ children: [/* @__PURE__ */ l(m, {
122
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
123
+ children: [/* @__PURE__ */ c(h, {
124
+ className: "text-sm font-medium",
125
+ children: "Total Invoiced"
126
+ }), /* @__PURE__ */ c(i, { className: "h-4 w-4 text-text-secondary" })]
127
+ }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
128
+ className: "text-2xl font-bold tabular-nums",
129
+ children: [
130
+ "$",
131
+ (O / 1e3).toFixed(1),
132
+ "K"
133
+ ]
134
+ }), /* @__PURE__ */ l("p", {
135
+ className: "text-xs text-text-secondary",
136
+ children: [
137
+ "$",
138
+ (k / 1e3).toFixed(1),
139
+ "K collected"
140
+ ]
141
+ })] })]
142
+ }),
143
+ /* @__PURE__ */ l(g, {
144
+ treatment: "metric",
145
+ className: "border-border-seam",
146
+ children: [/* @__PURE__ */ l(m, {
147
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
148
+ children: [/* @__PURE__ */ c(h, {
149
+ className: "text-sm font-medium",
150
+ children: "Project Budget"
151
+ }), /* @__PURE__ */ c(o, { className: "h-4 w-4 text-text-secondary" })]
152
+ }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
153
+ className: "text-2xl font-bold tabular-nums",
154
+ children: [
155
+ "$",
156
+ (A / 1e6).toFixed(1),
157
+ "M"
158
+ ]
159
+ }), /* @__PURE__ */ l("p", {
160
+ className: "text-xs text-text-secondary",
161
+ children: [Math.round(j / A * 100), "% utilized"]
162
+ })] })]
163
+ })
148
164
  ]
149
165
  }),
150
166
  /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ c(h, { children: "Payroll Trend" }), /* @__PURE__ */ c(p, { children: "Monthly gross payroll over the last 6 months" })] }), /* @__PURE__ */ l(f, {
151
167
  className: "space-y-3",
152
- children: [S.map((e) => /* @__PURE__ */ l("div", {
168
+ children: [w.map((e) => /* @__PURE__ */ l("div", {
153
169
  className: "flex items-center gap-3",
154
170
  children: [
155
171
  /* @__PURE__ */ c("span", {
156
- className: "w-10 text-sm text-muted-foreground",
172
+ className: "w-10 text-sm text-text-secondary",
157
173
  children: e.month
158
174
  }),
159
175
  /* @__PURE__ */ l("div", {
160
- className: "flex-1 h-5 bg-muted rounded overflow-hidden flex",
176
+ className: "flex-1 h-5 bg-bg-sunken rounded overflow-hidden flex",
161
177
  children: [/* @__PURE__ */ c("div", {
162
- className: "h-5 bg-primary",
163
- style: { width: `${Math.round(e.net / A * 100)}%` }
178
+ className: "h-5 bg-action-primary-bg",
179
+ style: { width: `${Math.round(e.net / M * 100)}%` }
164
180
  }), /* @__PURE__ */ c("div", {
165
- className: "h-5 bg-primary/30",
166
- style: { width: `${Math.round(e.deductions / A * 100)}%` }
181
+ className: "h-5 bg-action-primary-bg/30",
182
+ style: { width: `${Math.round(e.deductions / M * 100)}%` }
167
183
  })]
168
184
  }),
169
185
  /* @__PURE__ */ l("span", {
@@ -176,13 +192,13 @@ function _() {
176
192
  })
177
193
  ]
178
194
  }, e.month)), /* @__PURE__ */ l("div", {
179
- className: "flex items-center gap-4 mt-2 text-xs text-muted-foreground",
195
+ className: "flex items-center gap-4 mt-2 text-xs text-text-secondary",
180
196
  children: [/* @__PURE__ */ l("div", {
181
197
  className: "flex items-center gap-1",
182
- children: [/* @__PURE__ */ c("div", { className: "h-3 w-3 bg-primary rounded" }), /* @__PURE__ */ c("span", { children: "Net Pay" })]
198
+ children: [/* @__PURE__ */ c("div", { className: "h-3 w-3 bg-action-primary-bg rounded" }), /* @__PURE__ */ c("span", { children: "Net Pay" })]
183
199
  }), /* @__PURE__ */ l("div", {
184
200
  className: "flex items-center gap-1",
185
- children: [/* @__PURE__ */ c("div", { className: "h-3 w-3 bg-primary/30 rounded" }), /* @__PURE__ */ c("span", { children: "Deductions" })]
201
+ children: [/* @__PURE__ */ c("div", { className: "h-3 w-3 bg-action-primary-bg/30 rounded" }), /* @__PURE__ */ c("span", { children: "Deductions" })]
186
202
  })]
187
203
  })]
188
204
  })] }),
@@ -190,7 +206,7 @@ function _() {
190
206
  className: "grid gap-4 md:grid-cols-2",
191
207
  children: [/* @__PURE__ */ l(d, { children: [/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ c(h, { children: "Budget vs Actual" }), /* @__PURE__ */ c(p, { children: "Monthly expense tracking by category" })] }), /* @__PURE__ */ c(f, {
192
208
  className: "space-y-4",
193
- children: C.map((e) => {
209
+ children: T.map((e) => {
194
210
  let t = Math.round(e.amount / e.budget * 100);
195
211
  return /* @__PURE__ */ l("div", {
196
212
  className: "space-y-1",
@@ -209,14 +225,14 @@ function _() {
209
225
  ] })]
210
226
  }),
211
227
  /* @__PURE__ */ c("div", {
212
- className: "h-3 bg-muted rounded overflow-hidden",
228
+ className: "h-3 bg-bg-sunken rounded overflow-hidden",
213
229
  children: /* @__PURE__ */ c("div", {
214
- className: `h-3 rounded ${t > 95 ? "bg-red-500" : t > 80 ? "bg-yellow-500" : "bg-green-500"}`,
230
+ className: `h-3 rounded ${t > 95 ? "bg-status-error-text" : t > 80 ? "bg-status-warning-text" : "bg-status-success-text"}`,
215
231
  style: { width: `${t}%` }
216
232
  })
217
233
  }),
218
234
  /* @__PURE__ */ l("p", {
219
- className: "text-xs text-muted-foreground text-right",
235
+ className: "text-xs text-text-secondary text-right",
220
236
  children: [t, "% utilized"]
221
237
  })
222
238
  ]
@@ -224,13 +240,13 @@ function _() {
224
240
  })
225
241
  })] }), /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ c(h, { children: "Outstanding Invoices" }), /* @__PURE__ */ c(p, { children: "Invoices requiring attention" })] }), /* @__PURE__ */ c(f, {
226
242
  className: "space-y-3",
227
- children: b.map((e) => /* @__PURE__ */ l("div", {
243
+ children: S.map((e) => /* @__PURE__ */ l("div", {
228
244
  className: "flex items-center justify-between rounded border p-3",
229
245
  children: [/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
230
246
  className: "text-sm font-medium",
231
247
  children: e.number
232
248
  }), /* @__PURE__ */ c("p", {
233
- className: "text-xs text-muted-foreground",
249
+ className: "text-xs text-text-secondary",
234
250
  children: e.clientName
235
251
  })] }), /* @__PURE__ */ l("div", {
236
252
  className: "text-right",
@@ -248,7 +264,7 @@ function _() {
248
264
  }),
249
265
  /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ c(h, { children: "Department Cost Analysis" }), /* @__PURE__ */ c(p, { children: "Total salary cost and budget allocation by department" })] }), /* @__PURE__ */ l(f, { children: [
250
266
  /* @__PURE__ */ l("div", {
251
- className: "grid grid-cols-5 gap-2 text-xs font-medium text-muted-foreground border-b pb-2 mb-2",
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__ */ c("span", { children: "Department" }),
254
270
  /* @__PURE__ */ c("span", {
@@ -269,7 +285,7 @@ function _() {
269
285
  })
270
286
  ]
271
287
  }),
272
- j.sort((e, t) => t.salary - e.salary).map((e) => /* @__PURE__ */ l("div", {
288
+ N.sort((e, t) => t.salary - e.salary).map((e) => /* @__PURE__ */ l("div", {
273
289
  className: "grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm",
274
290
  children: [
275
291
  /* @__PURE__ */ c("span", {
@@ -306,20 +322,20 @@ function _() {
306
322
  })
307
323
  ]
308
324
  }, e.name)),
309
- /* @__PURE__ */ c(g, { className: "my-2" }),
325
+ /* @__PURE__ */ c(v, { className: "my-2" }),
310
326
  /* @__PURE__ */ l("div", {
311
327
  className: "grid grid-cols-5 gap-2 text-sm font-bold",
312
328
  children: [
313
329
  /* @__PURE__ */ c("span", { children: "Total" }),
314
330
  /* @__PURE__ */ c("span", {
315
331
  className: "text-right",
316
- children: _.length
332
+ children: y.length
317
333
  }),
318
334
  /* @__PURE__ */ l("span", {
319
335
  className: "text-right",
320
336
  children: [
321
337
  "$",
322
- (w / 1e6).toFixed(1),
338
+ (E / 1e6).toFixed(1),
323
339
  "M"
324
340
  ]
325
341
  }),
@@ -327,7 +343,7 @@ function _() {
327
343
  className: "text-right",
328
344
  children: [
329
345
  "$",
330
- (v.reduce((e, t) => e + t.budget, 0) / 1e6).toFixed(1),
346
+ (b.reduce((e, t) => e + t.budget, 0) / 1e6).toFixed(1),
331
347
  "M"
332
348
  ]
333
349
  }),
@@ -339,6 +355,6 @@ function _() {
339
355
  });
340
356
  }
341
357
  //#endregion
342
- export { _ as AnalyticsFinancialAnalyticsPagePage };
358
+ export { y as AnalyticsFinancialAnalyticsPagePage };
343
359
 
344
360
  //# sourceMappingURL=AnalyticsFinancialAnalyticsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsFinancialAnalyticsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.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, DollarSign, FileText, Receipt, TrendingUp, Wallet } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function AnalyticsFinancialAnalyticsPagePage() {\n const { employees, departments, payrollRecords, invoices, projects } = useCrewFoundryStore();\n\n const monthlyPayrollTrend = useMemo(() => {\n const byPeriod = payrollRecords.reduce<\n Record<string, { gross: number; net: number; deductions: number }>\n >((acc, record) => {\n const month = new Date(record.payDate).toLocaleString('en-US', { month: 'short' });\n const current = acc[month] || { gross: 0, net: 0, deductions: 0 };\n current.gross += record.grossPay;\n current.net += record.netPay;\n current.deductions += record.deductions;\n acc[month] = current;\n return acc;\n }, {});\n return Object.entries(byPeriod)\n .map(([month, value]) => ({ month, ...value }))\n .slice(-6);\n }, [payrollRecords]);\n\n const expenseCategories = useMemo(\n () => [\n {\n category: 'Payroll',\n amount: payrollRecords.reduce((sum, record) => sum + record.grossPay, 0),\n budget: departments.reduce((sum, department) => sum + department.budget * 0.7, 0),\n icon: Wallet,\n },\n {\n category: 'Benefits',\n amount: payrollRecords.reduce((sum, record) => sum + record.deductions * 0.4, 0),\n budget: departments.reduce((sum, department) => sum + department.budget * 0.15, 0),\n icon: Receipt,\n },\n {\n category: 'Recruitment',\n amount: invoices.reduce(\n (sum, invoice) => sum + (invoice.status === 'paid' ? invoice.amount * 0.15 : 0),\n 0\n ),\n budget: departments.reduce((sum, department) => sum + department.budget * 0.1, 0),\n icon: FileText,\n },\n {\n category: 'Training',\n amount: projects.reduce((sum, project) => sum + project.spent * 0.08, 0),\n budget: departments.reduce((sum, department) => sum + department.budget * 0.08, 0),\n icon: TrendingUp,\n },\n ],\n [departments, invoices, payrollRecords, projects]\n );\n\n const totalPayroll = employees.reduce((sum, e) => sum + e.salary, 0);\n const monthlyPayroll = Math.round(totalPayroll / 12);\n const totalInvoiced = invoices.reduce((sum, inv) => sum + inv.amount, 0);\n const paidInvoices = invoices\n .filter((i) => i.status === 'paid')\n .reduce((s, i) => s + i.amount, 0);\n const totalProjectBudget = projects.reduce((s, p) => s + p.budget, 0);\n const totalProjectSpent = projects.reduce((s, p) => s + p.spent, 0);\n\n const maxPayroll = Math.max(1, ...monthlyPayrollTrend.map((m) => m.gross));\n\n const deptCost = departments.map((d) => {\n const deptEmps = employees.filter((e) => e.department === d.name);\n const totalSal = deptEmps.reduce((s, e) => s + e.salary, 0);\n return { name: d.name, salary: totalSal, budget: d.budget, headcount: deptEmps.length };\n });\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\">Financial Analytics</h1>\n <p className=\"text-sm text-muted-foreground\">\n Workforce financial metrics and cost analysis\n </p>\n </div>\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\">Monthly Payroll</CardTitle>\n <DollarSign className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${(monthlyPayroll / 1000).toFixed(0)}K</div>\n <div className=\"flex items-center text-xs text-yellow-600\">\n <ArrowUp className=\"h-3 w-3 mr-1\" />\n +2.1% from last month\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\">Annual Salary Cost</CardTitle>\n <Wallet className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${(totalPayroll / 1000000).toFixed(1)}M</div>\n <p className=\"text-xs text-muted-foreground\">{employees.length} employees</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\">Total Invoiced</CardTitle>\n <FileText className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${(totalInvoiced / 1000).toFixed(1)}K</div>\n <p className=\"text-xs text-muted-foreground\">\n ${(paidInvoices / 1000).toFixed(1)}K collected\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\">Project Budget</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${(totalProjectBudget / 1000000).toFixed(1)}M</div>\n <p className=\"text-xs text-muted-foreground\">\n {Math.round((totalProjectSpent / totalProjectBudget) * 100)}% utilized\n </p>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Payroll Trend</CardTitle>\n <CardDescription>Monthly gross payroll over the last 6 months</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {monthlyPayrollTrend.map((m) => (\n <div key={m.month} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-sm text-muted-foreground\">{m.month}</span>\n <div className=\"flex-1 h-5 bg-muted rounded overflow-hidden flex\">\n <div\n className=\"h-5 bg-primary\"\n style={{ width: `${Math.round((m.net / maxPayroll) * 100)}%` }}\n />\n <div\n className=\"h-5 bg-primary/30\"\n style={{ width: `${Math.round((m.deductions / maxPayroll) * 100)}%` }}\n />\n </div>\n <span className=\"text-sm font-medium w-20 text-right\">\n ${(m.gross / 1000000).toFixed(2)}M\n </span>\n </div>\n ))}\n <div className=\"flex items-center gap-4 mt-2 text-xs text-muted-foreground\">\n <div className=\"flex items-center gap-1\">\n <div className=\"h-3 w-3 bg-primary rounded\" />\n <span>Net Pay</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <div className=\"h-3 w-3 bg-primary/30 rounded\" />\n <span>Deductions</span>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Budget vs Actual</CardTitle>\n <CardDescription>Monthly expense tracking by category</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {expenseCategories.map((cat) => {\n const pct = Math.round((cat.amount / cat.budget) * 100);\n return (\n <div key={cat.category} className=\"space-y-1\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"font-medium\">{cat.category}</span>\n <span>\n ${(cat.amount / 1000).toFixed(0)}K / ${(cat.budget / 1000).toFixed(0)}K\n </span>\n </div>\n <div className=\"h-3 bg-muted rounded overflow-hidden\">\n <div\n className={`h-3 rounded ${pct > 95 ? 'bg-red-500' : pct > 80 ? 'bg-yellow-500' : 'bg-green-500'}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground text-right\">{pct}% utilized</p>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Outstanding Invoices</CardTitle>\n <CardDescription>Invoices requiring attention</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {invoices.map((inv) => (\n <div key={inv.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{inv.number}</p>\n <p className=\"text-xs text-muted-foreground\">{inv.clientName}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">${inv.amount.toLocaleString()}</p>\n <Badge\n variant={\n inv.status === 'paid'\n ? 'default'\n : inv.status === 'overdue'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {inv.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Department Cost Analysis</CardTitle>\n <CardDescription>Total salary cost and budget allocation by department</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 className=\"text-right\">Headcount</span>\n <span className=\"text-right\">Total Salary</span>\n <span className=\"text-right\">Dept Budget</span>\n <span className=\"text-right\">Salary/Budget %</span>\n </div>\n {deptCost\n .sort((a, b) => b.salary - a.salary)\n .map((d) => (\n <div\n key={d.name}\n className=\"grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{d.name}</span>\n <span className=\"text-right\">{d.headcount}</span>\n <span className=\"text-right\">${(d.salary / 1000).toFixed(0)}K</span>\n <span className=\"text-right\">${(d.budget / 1000000).toFixed(1)}M</span>\n <span className=\"text-right\">\n <Badge\n variant={d.salary / d.budget > 0.5 ? 'destructive' : 'default'}\n className=\"text-[10px]\"\n >\n {Math.round((d.salary / d.budget) * 100)}%\n </Badge>\n </span>\n </div>\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 className=\"text-right\">{employees.length}</span>\n <span className=\"text-right\">${(totalPayroll / 1000000).toFixed(1)}M</span>\n <span className=\"text-right\">\n ${(departments.reduce((s, d) => s + d.budget, 0) / 1000000).toFixed(1)}M\n </span>\n <span />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AnalyticsFinancialAnalyticsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.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, DollarSign, FileText, Receipt, TrendingUp, Wallet } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function AnalyticsFinancialAnalyticsPagePage() {\n const { employees, departments, payrollRecords, invoices, projects } = useCrewFoundryStore();\n\n const monthlyPayrollTrend = useMemo(() => {\n const byPeriod = payrollRecords.reduce<\n Record<string, { gross: number; net: number; deductions: number }>\n >((acc, record) => {\n const month = new Date(record.payDate).toLocaleString('en-US', { month: 'short' });\n const current = acc[month] || { gross: 0, net: 0, deductions: 0 };\n current.gross += record.grossPay;\n current.net += record.netPay;\n current.deductions += record.deductions;\n acc[month] = current;\n return acc;\n }, {});\n return Object.entries(byPeriod)\n .map(([month, value]) => ({ month, ...value }))\n .slice(-6);\n }, [payrollRecords]);\n\n const expenseCategories = useMemo(\n () => [\n {\n category: 'Payroll',\n amount: payrollRecords.reduce((sum, record) => sum + record.grossPay, 0),\n budget: departments.reduce((sum, department) => sum + department.budget * 0.7, 0),\n icon: Wallet,\n },\n {\n category: 'Benefits',\n amount: payrollRecords.reduce((sum, record) => sum + record.deductions * 0.4, 0),\n budget: departments.reduce((sum, department) => sum + department.budget * 0.15, 0),\n icon: Receipt,\n },\n {\n category: 'Recruitment',\n amount: invoices.reduce(\n (sum, invoice) => sum + (invoice.status === 'paid' ? invoice.amount * 0.15 : 0),\n 0\n ),\n budget: departments.reduce((sum, department) => sum + department.budget * 0.1, 0),\n icon: FileText,\n },\n {\n category: 'Training',\n amount: projects.reduce((sum, project) => sum + project.spent * 0.08, 0),\n budget: departments.reduce((sum, department) => sum + department.budget * 0.08, 0),\n icon: TrendingUp,\n },\n ],\n [departments, invoices, payrollRecords, projects]\n );\n\n const totalPayroll = employees.reduce((sum, e) => sum + e.salary, 0);\n const monthlyPayroll = Math.round(totalPayroll / 12);\n const totalInvoiced = invoices.reduce((sum, inv) => sum + inv.amount, 0);\n const paidInvoices = invoices\n .filter((i) => i.status === 'paid')\n .reduce((s, i) => s + i.amount, 0);\n const totalProjectBudget = projects.reduce((s, p) => s + p.budget, 0);\n const totalProjectSpent = projects.reduce((s, p) => s + p.spent, 0);\n\n const maxPayroll = Math.max(1, ...monthlyPayrollTrend.map((m) => m.gross));\n\n const deptCost = departments.map((d) => {\n const deptEmps = employees.filter((e) => e.department === d.name);\n const totalSal = deptEmps.reduce((s, e) => s + e.salary, 0);\n return { name: d.name, salary: totalSal, budget: d.budget, headcount: deptEmps.length };\n });\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>Financial Analytics</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Workforce financial metrics and cost analysis\n </p>\n </div>\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\">Monthly Payroll</CardTitle>\n <DollarSign className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n ${(monthlyPayroll / 1000).toFixed(0)}K\n </div>\n <div className=\"flex items-center text-xs text-status-warning-text\">\n <ArrowUp className=\"h-3 w-3 mr-1\" />\n +2.1% from last month\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\">Annual Salary Cost</CardTitle>\n <Wallet className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n ${(totalPayroll / 1000000).toFixed(1)}M\n </div>\n <p className=\"text-xs text-text-secondary\">{employees.length} employees</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\">Total Invoiced</CardTitle>\n <FileText className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n ${(totalInvoiced / 1000).toFixed(1)}K\n </div>\n <p className=\"text-xs text-text-secondary\">\n ${(paidInvoices / 1000).toFixed(1)}K collected\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\">Project Budget</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n ${(totalProjectBudget / 1000000).toFixed(1)}M\n </div>\n <p className=\"text-xs text-text-secondary\">\n {Math.round((totalProjectSpent / totalProjectBudget) * 100)}% utilized\n </p>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Payroll Trend</CardTitle>\n <CardDescription>Monthly gross payroll over the last 6 months</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {monthlyPayrollTrend.map((m) => (\n <div key={m.month} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-sm text-text-secondary\">{m.month}</span>\n <div className=\"flex-1 h-5 bg-bg-sunken rounded overflow-hidden flex\">\n <div\n className=\"h-5 bg-action-primary-bg\"\n style={{ width: `${Math.round((m.net / maxPayroll) * 100)}%` }}\n />\n <div\n className=\"h-5 bg-action-primary-bg/30\"\n style={{ width: `${Math.round((m.deductions / maxPayroll) * 100)}%` }}\n />\n </div>\n <span className=\"text-sm font-medium w-20 text-right\">\n ${(m.gross / 1000000).toFixed(2)}M\n </span>\n </div>\n ))}\n <div className=\"flex items-center gap-4 mt-2 text-xs text-text-secondary\">\n <div className=\"flex items-center gap-1\">\n <div className=\"h-3 w-3 bg-action-primary-bg rounded\" />\n <span>Net Pay</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <div className=\"h-3 w-3 bg-action-primary-bg/30 rounded\" />\n <span>Deductions</span>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Budget vs Actual</CardTitle>\n <CardDescription>Monthly expense tracking by category</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {expenseCategories.map((cat) => {\n const pct = Math.round((cat.amount / cat.budget) * 100);\n return (\n <div key={cat.category} className=\"space-y-1\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"font-medium\">{cat.category}</span>\n <span>\n ${(cat.amount / 1000).toFixed(0)}K / ${(cat.budget / 1000).toFixed(0)}K\n </span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className={`h-3 rounded ${pct > 95 ? 'bg-status-error-text' : pct > 80 ? 'bg-status-warning-text' : 'bg-status-success-text'}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-xs text-text-secondary text-right\">{pct}% utilized</p>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Outstanding Invoices</CardTitle>\n <CardDescription>Invoices requiring attention</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {invoices.map((inv) => (\n <div key={inv.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{inv.number}</p>\n <p className=\"text-xs text-text-secondary\">{inv.clientName}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">${inv.amount.toLocaleString()}</p>\n <Badge\n variant={\n inv.status === 'paid'\n ? 'default'\n : inv.status === 'overdue'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {inv.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Department Cost Analysis</CardTitle>\n <CardDescription>Total salary cost and budget allocation by department</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 className=\"text-right\">Headcount</span>\n <span className=\"text-right\">Total Salary</span>\n <span className=\"text-right\">Dept Budget</span>\n <span className=\"text-right\">Salary/Budget %</span>\n </div>\n {deptCost\n .sort((a, b) => b.salary - a.salary)\n .map((d) => (\n <div\n key={d.name}\n className=\"grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{d.name}</span>\n <span className=\"text-right\">{d.headcount}</span>\n <span className=\"text-right\">${(d.salary / 1000).toFixed(0)}K</span>\n <span className=\"text-right\">${(d.budget / 1000000).toFixed(1)}M</span>\n <span className=\"text-right\">\n <Badge\n variant={d.salary / d.budget > 0.5 ? 'destructive' : 'default'}\n className=\"text-[10px]\"\n >\n {Math.round((d.salary / d.budget) * 100)}%\n </Badge>\n </span>\n </div>\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 className=\"text-right\">{employees.length}</span>\n <span className=\"text-right\">${(totalPayroll / 1000000).toFixed(1)}M</span>\n <span className=\"text-right\">\n ${(departments.reduce((s, d) => s + d.budget, 0) / 1000000).toFixed(1)}M\n </span>\n <span />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}