@burdenoff/microfe-crewfoundry 2026.624.1 → 2026.625.2

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 +100 -76
  2. package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
  3. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +118 -94
  4. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  5. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +105 -81
  6. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
  7. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +134 -110
  8. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +121 -97
  10. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +28 -15
  12. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +74 -54
  14. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +87 -69
  16. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +99 -80
  18. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +87 -68
  20. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
  21. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +31 -15
  22. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
  23. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +81 -61
  24. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
  25. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +71 -51
  26. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +82 -58
  28. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
  29. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +46 -39
  30. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
  31. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +80 -62
  32. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  33. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +104 -80
  34. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
  35. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +219 -151
  36. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  37. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +183 -142
  38. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  39. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +121 -97
  40. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
  41. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +57 -46
  42. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +91 -67
  44. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  45. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +112 -93
  46. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  47. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +55 -48
  48. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  49. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +70 -50
  50. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  51. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +140 -97
  52. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/HiringJobsPagePage.js +101 -85
  54. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +68 -48
  56. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +99 -71
  58. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +97 -73
  60. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/HrPayrollPagePage.js +100 -76
  62. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +93 -69
  64. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +65 -45
  66. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
  67. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +93 -75
  68. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +117 -72
  70. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +66 -54
  72. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +36 -20
  74. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +90 -66
  76. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/LearningLearningPagePage.js +81 -57
  78. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  79. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +90 -65
  80. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +33 -17
  82. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  83. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +83 -59
  84. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +68 -48
  86. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  87. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +80 -60
  88. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
  89. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +153 -118
  90. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  91. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +42 -37
  92. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +67 -47
  94. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  95. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +104 -85
  96. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  97. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +76 -57
  98. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
  99. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +78 -60
  100. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  101. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +138 -93
  102. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  103. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +98 -53
  104. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  105. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +69 -49
  106. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
  107. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +84 -65
  108. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  109. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +76 -52
  110. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  111. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +58 -40
  112. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
  113. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +85 -65
  114. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
  115. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +36 -29
  116. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  117. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +108 -73
  118. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  119. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +43 -27
  120. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  121. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +67 -47
  122. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  123. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +108 -63
  124. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  125. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +83 -64
  126. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  127. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +185 -144
  128. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  129. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +40 -24
  130. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  131. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"PaymentsPaymentDashboardPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentDashboardPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowUp, CreditCard, DollarSign, Receipt, TrendingUp } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function PaymentsPaymentDashboardPagePage() {\n const { invoices, payrollRecords } = useCrewFoundryStore();\n const totalInvoiced = invoices.reduce((s, i) => s + i.amount, 0);\n const totalPaid = invoices.filter((i) => i.status === 'paid').reduce((s, i) => s + i.amount, 0);\n const totalPayroll = payrollRecords.reduce((s, r) => s + r.grossPay, 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Payment Dashboard</h1>\n <p className=\"text-sm text-text-secondary\">Financial transactions and payment overview</p>\n </div>\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\">Total Invoiced</CardTitle>\n <Receipt className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${totalInvoiced.toLocaleString()}</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\">Collected</CardTitle>\n <DollarSign className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${totalPaid.toLocaleString()}</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\">Payroll Processed</CardTitle>\n <CreditCard className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${totalPayroll.toLocaleString()}</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\">Outstanding</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n ${(totalInvoiced - totalPaid).toLocaleString()}\n </div>\n </CardContent>\n </Card>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Recent Invoices</CardTitle>\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>Invoice</span>\n <span>Client</span>\n <span className=\"text-right\">Amount</span>\n <span>Due Date</span>\n <span className=\"text-center\">Status</span>\n </div>\n {invoices.map((inv) => (\n <div\n key={inv.id}\n className=\"grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{inv.number}</span>\n <span className=\"text-text-secondary\">{inv.clientName}</span>\n <span className=\"text-right\">${inv.amount.toLocaleString()}</span>\n <span className=\"text-text-secondary\">{inv.dueDate}</span>\n <div className=\"text-center\">\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}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PaymentsPaymentDashboardPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentDashboardPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowUp, CreditCard, DollarSign, Receipt, TrendingUp } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function PaymentsPaymentDashboardPagePage() {\n const { invoices, payrollRecords } = useCrewFoundryStore();\n const totalInvoiced = invoices.reduce((s, i) => s + i.amount, 0);\n const totalPaid = invoices.filter((i) => i.status === 'paid').reduce((s, i) => s + i.amount, 0);\n const totalPayroll = payrollRecords.reduce((s, r) => s + r.grossPay, 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Payment Dashboard</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Financial transactions and payment overview</p>\n <PagePurpose className=\"mt-1\">A snapshot of all money movement — incoming payments, payouts, and balances so you understand your financial position at a glance.</PagePurpose>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Invoiced</CardTitle>\n <Receipt className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalInvoiced.toLocaleString()}</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\">Collected</CardTitle>\n <DollarSign className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalPaid.toLocaleString()}</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\">Payroll Processed</CardTitle>\n <CreditCard className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalPayroll.toLocaleString()}</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\">Outstanding</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n ${(totalInvoiced - totalPaid).toLocaleString()}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Recent Invoices</CardTitle>\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>Invoice</span>\n <span>Client</span>\n <span className=\"text-right\">Amount</span>\n <span>Due Date</span>\n <span className=\"text-center\">Status</span>\n </div>\n {invoices.map((inv) => (\n <div\n key={inv.id}\n className=\"grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{inv.number}</span>\n <span className=\"text-text-secondary\">{inv.clientName}</span>\n <span className=\"text-right\">${inv.amount.toLocaleString()}</span>\n <span className=\"text-text-secondary\">{inv.dueDate}</span>\n <div className=\"text-center\">\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}\n"],"mappings":"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"}
@@ -2,23 +2,23 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { useMemo as t } from "react";
3
3
  import { Building2 as n, CreditCard as r, Plus as i } from "lucide-react";
4
4
  import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
- import { Badge as s, Button as c, Card as l, CardContent as u } from "@burdenoff/fe-libs/ui";
5
+ import { Badge as s, Button as c, CardContent as l, GlassCard as u, GradientText as d, IllustratedEmptyState as f, PagePurpose as p } from "@burdenoff/fe-libs/ui";
6
6
  //#region src/crewfoundry/pages/PaymentsPaymentMethodsPagePage.tsx
7
- function d() {
8
- let { paymentMethods: d, invoices: f, payrollRecords: p, vendors: m, clients: h } = e(), g = t(() => {
9
- let e = p.slice(0, 3).map((e, t) => ({
7
+ function m() {
8
+ let { paymentMethods: m, invoices: h, payrollRecords: g, vendors: _, clients: v } = e(), y = t(() => {
9
+ let e = g.slice(0, 3).map((e, t) => ({
10
10
  id: `bank-${e.id}`,
11
11
  type: "bank",
12
12
  name: `${e.department} Settlement Account`,
13
- bank: m[t % Math.max(m.length, 1)]?.name || "Burdenoff Bank",
13
+ bank: _[t % Math.max(_.length, 1)]?.name || "Burdenoff Bank",
14
14
  last4: String(e.netPay).slice(-4).padStart(4, "0"),
15
15
  status: t === 0 ? "primary" : "active"
16
- })), t = f.slice(0, 4).map((t, n) => {
16
+ })), t = h.slice(0, 4).map((t, n) => {
17
17
  let r = String((n + 3) % 12 + 1).padStart(2, "0"), i = String(2027 + n % 2);
18
18
  return {
19
19
  id: `card-${t.id}`,
20
20
  type: "card",
21
- name: `${h[n % Math.max(h.length, 1)]?.name || "Corporate"} Card`,
21
+ name: `${v[n % Math.max(v.length, 1)]?.name || "Corporate"} Card`,
22
22
  bank: t.clientName,
23
23
  last4: t.number.replaceAll(/\D/g, "").slice(-4).padStart(4, "0"),
24
24
  status: n === 0 && e.length === 0 ? "primary" : "active",
@@ -27,54 +27,72 @@ function d() {
27
27
  });
28
28
  return [...e, ...t];
29
29
  }, [
30
+ v,
30
31
  h,
31
- f,
32
- p,
33
- m
34
- ]), _ = d.length > 0 ? d : g;
32
+ g,
33
+ _
34
+ ]), b = m.length > 0 ? m : y;
35
35
  return /* @__PURE__ */ o("div", {
36
36
  className: "space-y-6 p-6",
37
37
  children: [/* @__PURE__ */ o("div", {
38
38
  className: "flex items-center justify-between",
39
- children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
40
- className: "text-2xl font-semibold",
41
- children: "Payment Methods"
42
- }), /* @__PURE__ */ a("p", {
43
- className: "text-sm text-text-secondary",
44
- children: "Manage company payment accounts"
45
- })] }), /* @__PURE__ */ o(c, {
39
+ children: [/* @__PURE__ */ o("div", { children: [
40
+ /* @__PURE__ */ a("h1", {
41
+ className: "text-2xl font-semibold",
42
+ children: /* @__PURE__ */ a(d, { children: "Payment Methods" })
43
+ }),
44
+ /* @__PURE__ */ a("p", {
45
+ className: "text-sm text-text-secondary",
46
+ children: "Manage company payment accounts"
47
+ }),
48
+ /* @__PURE__ */ a(p, {
49
+ className: "mt-1",
50
+ children: "Manage how you pay and get paid — add and update cards, bank accounts, and payout methods securely."
51
+ })
52
+ ] }), /* @__PURE__ */ o(c, {
46
53
  size: "sm",
47
54
  children: [/* @__PURE__ */ a(i, { className: "mr-1 h-4 w-4" }), "Add Method"]
48
55
  })]
49
56
  }), /* @__PURE__ */ a("div", {
50
57
  className: "grid gap-4 md:grid-cols-2",
51
- children: _.map((e) => /* @__PURE__ */ a(l, { children: /* @__PURE__ */ o(u, {
52
- className: "p-4",
53
- children: [/* @__PURE__ */ o("div", {
54
- className: "mb-3 flex items-center justify-between",
58
+ children: b.length === 0 ? /* @__PURE__ */ a("div", {
59
+ className: "col-span-full",
60
+ children: /* @__PURE__ */ a(f, {
61
+ illustration: "empty-generic",
62
+ title: "No payment methods",
63
+ description: "Add a card or bank account to pay and get paid."
64
+ })
65
+ }) : b.map((e, t) => /* @__PURE__ */ a(u, {
66
+ treatment: t === 0 ? "glass" : "plain",
67
+ glow: t === 0,
68
+ children: /* @__PURE__ */ o(l, {
69
+ className: "p-4",
55
70
  children: [/* @__PURE__ */ o("div", {
56
- className: "flex items-center gap-2",
57
- children: [e.type === "bank" ? /* @__PURE__ */ a(n, { className: "h-5 w-5 text-text-secondary" }) : /* @__PURE__ */ a(r, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
58
- className: "text-sm font-medium",
59
- children: e.name
60
- }), /* @__PURE__ */ a("p", {
61
- className: "text-xs text-text-secondary",
62
- children: e.bank
63
- })] })]
64
- }), /* @__PURE__ */ a(s, {
65
- variant: e.status === "primary" ? "default" : "secondary",
66
- className: "text-[10px]",
67
- children: e.status
71
+ className: "mb-3 flex items-center justify-between",
72
+ children: [/* @__PURE__ */ o("div", {
73
+ className: "flex items-center gap-2",
74
+ children: [e.type === "bank" ? /* @__PURE__ */ a(n, { className: "h-5 w-5 text-text-secondary" }) : /* @__PURE__ */ a(r, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
75
+ className: "text-sm font-medium",
76
+ children: e.name
77
+ }), /* @__PURE__ */ a("p", {
78
+ className: "text-xs text-text-secondary",
79
+ children: e.bank
80
+ })] })]
81
+ }), /* @__PURE__ */ a(s, {
82
+ variant: e.status === "primary" ? "default" : "secondary",
83
+ className: "text-[10px]",
84
+ children: e.status
85
+ })]
86
+ }), /* @__PURE__ */ o("div", {
87
+ className: "flex items-center justify-between text-sm text-text-secondary",
88
+ children: [/* @__PURE__ */ o("span", { children: ["•••• •••• •••• ", e.last4] }), e.expiry ? /* @__PURE__ */ o("span", { children: ["Exp: ", e.expiry] }) : null]
68
89
  })]
69
- }), /* @__PURE__ */ o("div", {
70
- className: "flex items-center justify-between text-sm text-text-secondary",
71
- children: [/* @__PURE__ */ o("span", { children: ["•••• •••• •••• ", e.last4] }), e.expiry ? /* @__PURE__ */ o("span", { children: ["Exp: ", e.expiry] }) : null]
72
- })]
73
- }) }, e.id))
90
+ })
91
+ }, e.id))
74
92
  })]
75
93
  });
76
94
  }
77
95
  //#endregion
78
- export { d as PaymentsPaymentMethodsPagePage };
96
+ export { m as PaymentsPaymentMethodsPagePage };
79
97
 
80
98
  //# sourceMappingURL=PaymentsPaymentMethodsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PaymentsPaymentMethodsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentMethodsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Badge, Button, Card, CardContent } from '@burdenoff/fe-libs/ui';\nimport { Building2, CreditCard, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype PaymentMethod = {\n id: string;\n type: 'bank' | 'card';\n name: string;\n bank: string;\n last4: string;\n status: 'primary' | 'active';\n expiry?: string;\n};\n\nexport function PaymentsPaymentMethodsPagePage() {\n const {\n paymentMethods: overlapPaymentMethods,\n invoices,\n payrollRecords,\n vendors,\n clients,\n } = useCrewFoundryStore();\n\n const fallbackMethods = useMemo<PaymentMethod[]>(() => {\n const bankMethods = payrollRecords.slice(0, 3).map((record, index) => ({\n id: `bank-${record.id}`,\n type: 'bank' as const,\n name: `${record.department} Settlement Account`,\n bank: vendors[index % Math.max(vendors.length, 1)]?.name || 'Burdenoff Bank',\n last4: String(record.netPay).slice(-4).padStart(4, '0'),\n status: index === 0 ? ('primary' as const) : ('active' as const),\n }));\n\n const cardMethods = invoices.slice(0, 4).map((invoice, index) => {\n const month = String(((index + 3) % 12) + 1).padStart(2, '0');\n const year = String(2027 + (index % 2));\n return {\n id: `card-${invoice.id}`,\n type: 'card' as const,\n name: `${clients[index % Math.max(clients.length, 1)]?.name || 'Corporate'} Card`,\n bank: invoice.clientName,\n last4: invoice.number.replaceAll(/\\D/g, '').slice(-4).padStart(4, '0'),\n status:\n index === 0 && bankMethods.length === 0 ? ('primary' as const) : ('active' as const),\n expiry: `${month}/${year}`,\n };\n });\n\n return [...bankMethods, ...cardMethods];\n }, [clients, invoices, payrollRecords, vendors]);\n\n const paymentMethods = overlapPaymentMethods.length > 0 ? overlapPaymentMethods : fallbackMethods;\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\">Payment Methods</h1>\n <p className=\"text-sm text-text-secondary\">Manage company payment accounts</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-1 h-4 w-4\" />\n Add Method\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n {paymentMethods.map((method) => (\n <Card key={method.id}>\n <CardContent className=\"p-4\">\n <div className=\"mb-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {method.type === 'bank' ? (\n <Building2 className=\"h-5 w-5 text-text-secondary\" />\n ) : (\n <CreditCard className=\"h-5 w-5 text-text-secondary\" />\n )}\n <div>\n <p className=\"text-sm font-medium\">{method.name}</p>\n <p className=\"text-xs text-text-secondary\">{method.bank}</p>\n </div>\n </div>\n <Badge\n variant={method.status === 'primary' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {method.status}\n </Badge>\n </div>\n <div className=\"flex items-center justify-between text-sm text-text-secondary\">\n <span>•••• •••• •••• {method.last4}</span>\n {method.expiry ? <span>Exp: {method.expiry}</span> : null}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAeA,SAAgB,IAAiC;CAC/C,IAAM,EACJ,gBAAgB,GAChB,aACA,mBACA,YACA,eACE,GAAqB,EAEnB,IAAkB,QAA+B;EACrD,IAAM,IAAc,EAAe,MAAM,GAAG,EAAE,CAAC,KAAK,GAAQ,OAAW;GACrE,IAAI,QAAQ,EAAO;GACnB,MAAM;GACN,MAAM,GAAG,EAAO,WAAW;GAC3B,MAAM,EAAQ,IAAQ,KAAK,IAAI,EAAQ,QAAQ,EAAE,GAAG,QAAQ;GAC5D,OAAO,OAAO,EAAO,OAAO,CAAC,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI;GACvD,QAAQ,MAAU,IAAK,YAAuB;GAC/C,EAAE,EAEG,IAAc,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,GAAS,MAAU;GAC/D,IAAM,IAAQ,QAAS,IAAQ,KAAK,KAAM,EAAE,CAAC,SAAS,GAAG,IAAI,EACvD,IAAO,OAAO,OAAQ,IAAQ,EAAG;AACvC,UAAO;IACL,IAAI,QAAQ,EAAQ;IACpB,MAAM;IACN,MAAM,GAAG,EAAQ,IAAQ,KAAK,IAAI,EAAQ,QAAQ,EAAE,GAAG,QAAQ,YAAY;IAC3E,MAAM,EAAQ;IACd,OAAO,EAAQ,OAAO,WAAW,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI;IACtE,QACE,MAAU,KAAK,EAAY,WAAW,IAAK,YAAuB;IACpE,QAAQ,GAAG,EAAM,GAAG;IACrB;IACD;AAEF,SAAO,CAAC,GAAG,GAAa,GAAG,EAAY;IACtC;EAAC;EAAS;EAAU;EAAgB;EAAQ,CAAC,EAE1C,IAAiB,EAAsB,SAAS,IAAI,IAAwB;AAElF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAoB,CAAA,EAC3D,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAAmC,CAAA,CAC1E,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;cAAb,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,aAE1B;MACL;MAEN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAe,KAAK,MACnB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAa,WAAU;cAAvB,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACG,EAAO,SAAS,SACf,kBAAC,GAAD,EAAW,WAAU,+BAAgC,CAAA,GAErD,kBAAC,GAAD,EAAY,WAAU,+BAAgC,CAAA,EAExD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAuB,EAAO;OAAS,CAAA,EACpD,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAO;OAAS,CAAA,CACxD,EAAA,CAAA,CACF;SACN,kBAAC,GAAD;MACE,SAAS,EAAO,WAAW,YAAY,YAAY;MACnD,WAAU;gBAET,EAAO;MACF,CAAA,CACJ;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD,EAAA,UAAA,CAAM,mBAAgB,EAAO,MAAa,EAAA,CAAA,EACzC,EAAO,SAAS,kBAAC,QAAD,EAAA,UAAA,CAAM,SAAM,EAAO,OAAc,EAAA,CAAA,GAAG,KACjD;OACM;OACT,EA1BI,EAAO,GA0BX,CACP;GACE,CAAA,CACF"}
1
+ {"version":3,"file":"PaymentsPaymentMethodsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentMethodsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Button,\n CardContent,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Building2, CreditCard, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype PaymentMethod = {\n id: string;\n type: 'bank' | 'card';\n name: string;\n bank: string;\n last4: string;\n status: 'primary' | 'active';\n expiry?: string;\n};\n\nexport function PaymentsPaymentMethodsPagePage() {\n const {\n paymentMethods: overlapPaymentMethods,\n invoices,\n payrollRecords,\n vendors,\n clients,\n } = useCrewFoundryStore();\n\n const fallbackMethods = useMemo<PaymentMethod[]>(() => {\n const bankMethods = payrollRecords.slice(0, 3).map((record, index) => ({\n id: `bank-${record.id}`,\n type: 'bank' as const,\n name: `${record.department} Settlement Account`,\n bank: vendors[index % Math.max(vendors.length, 1)]?.name || 'Burdenoff Bank',\n last4: String(record.netPay).slice(-4).padStart(4, '0'),\n status: index === 0 ? ('primary' as const) : ('active' as const),\n }));\n\n const cardMethods = invoices.slice(0, 4).map((invoice, index) => {\n const month = String(((index + 3) % 12) + 1).padStart(2, '0');\n const year = String(2027 + (index % 2));\n return {\n id: `card-${invoice.id}`,\n type: 'card' as const,\n name: `${clients[index % Math.max(clients.length, 1)]?.name || 'Corporate'} Card`,\n bank: invoice.clientName,\n last4: invoice.number.replaceAll(/\\D/g, '').slice(-4).padStart(4, '0'),\n status:\n index === 0 && bankMethods.length === 0 ? ('primary' as const) : ('active' as const),\n expiry: `${month}/${year}`,\n };\n });\n\n return [...bankMethods, ...cardMethods];\n }, [clients, invoices, payrollRecords, vendors]);\n\n const paymentMethods = overlapPaymentMethods.length > 0 ? overlapPaymentMethods : fallbackMethods;\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>Payment Methods</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage company payment accounts</p>\n <PagePurpose className=\"mt-1\">Manage how you pay and get paid — add and update cards, bank accounts, and payout methods securely.</PagePurpose>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-1 h-4 w-4\" />\n Add Method\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n {paymentMethods.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No payment methods\"\n description=\"Add a card or bank account to pay and get paid.\"\n />\n </div>\n ) : (\n paymentMethods.map((method, _idx) => (\n <GlassCard key={method.id} treatment={_idx === 0 ? 'glass' : 'plain'} glow={_idx === 0}>\n <CardContent className=\"p-4\">\n <div className=\"mb-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {method.type === 'bank' ? (\n <Building2 className=\"h-5 w-5 text-text-secondary\" />\n ) : (\n <CreditCard className=\"h-5 w-5 text-text-secondary\" />\n )}\n <div>\n <p className=\"text-sm font-medium\">{method.name}</p>\n <p className=\"text-xs text-text-secondary\">{method.bank}</p>\n </div>\n </div>\n <Badge\n variant={method.status === 'primary' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {method.status}\n </Badge>\n </div>\n <div className=\"flex items-center justify-between text-sm text-text-secondary\">\n <span>•••• •••• •••• {method.last4}</span>\n {method.expiry ? <span>Exp: {method.expiry}</span> : null}\n </div>\n </CardContent>\n </GlassCard>\n )))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAuBA,SAAgB,IAAiC;CAC/C,IAAM,EACJ,gBAAgB,GAChB,aACA,mBACA,YACA,eACE,GAAqB,EAEnB,IAAkB,QAA+B;EACrD,IAAM,IAAc,EAAe,MAAM,GAAG,EAAE,CAAC,KAAK,GAAQ,OAAW;GACrE,IAAI,QAAQ,EAAO;GACnB,MAAM;GACN,MAAM,GAAG,EAAO,WAAW;GAC3B,MAAM,EAAQ,IAAQ,KAAK,IAAI,EAAQ,QAAQ,EAAE,GAAG,QAAQ;GAC5D,OAAO,OAAO,EAAO,OAAO,CAAC,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI;GACvD,QAAQ,MAAU,IAAK,YAAuB;GAC/C,EAAE,EAEG,IAAc,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,GAAS,MAAU;GAC/D,IAAM,IAAQ,QAAS,IAAQ,KAAK,KAAM,EAAE,CAAC,SAAS,GAAG,IAAI,EACvD,IAAO,OAAO,OAAQ,IAAQ,EAAG;AACvC,UAAO;IACL,IAAI,QAAQ,EAAQ;IACpB,MAAM;IACN,MAAM,GAAG,EAAQ,IAAQ,KAAK,IAAI,EAAQ,QAAQ,EAAE,GAAG,QAAQ,YAAY;IAC3E,MAAM,EAAQ;IACd,OAAO,EAAQ,OAAO,WAAW,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI;IACtE,QACE,MAAU,KAAK,EAAY,WAAW,IAAK,YAAuB;IACpE,QAAQ,GAAG,EAAM,GAAG;IACrB;IACD;AAEF,SAAO,CAAC,GAAG,GAAa,GAAG,EAAY;IACtC;EAAC;EAAS;EAAU;EAAgB;EAAQ,CAAC,EAE1C,IAAiB,EAAsB,SAAS,IAAI,IAAwB;AAElF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,mBAA8B,CAAA;KACzC,CAAA;IACL,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAmC,CAAA;IAC9E,kBAAC,GAAD;KAAa,WAAU;eAAO;KAAiH,CAAA;IAC3I,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;cAAb,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,aAE1B;MACL;MAEN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAe,WAAW,IACzB,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aAAY;KACZ,CAAA;IACE,CAAA,GAEN,EAAe,KAAK,GAAQ,MAC5B,kBAAC,GAAD;IAA2B,WAAW,MAAS,IAAI,UAAU;IAAS,MAAM,MAAS;cACnF,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACG,EAAO,SAAS,SACf,kBAAC,GAAD,EAAW,WAAU,+BAAgC,CAAA,GAErD,kBAAC,GAAD,EAAY,WAAU,+BAAgC,CAAA,EAExD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAuB,EAAO;QAAS,CAAA,EACpD,kBAAC,KAAD;QAAG,WAAU;kBAA+B,EAAO;QAAS,CAAA,CACxD,EAAA,CAAA,CACF;UACN,kBAAC,GAAD;OACE,SAAS,EAAO,WAAW,YAAY,YAAY;OACnD,WAAU;iBAET,EAAO;OACF,CAAA,CACJ;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD,EAAA,UAAA,CAAM,mBAAgB,EAAO,MAAa,EAAA,CAAA,EACzC,EAAO,SAAS,kBAAC,QAAD,EAAA,UAAA,CAAM,SAAM,EAAO,OAAc,EAAA,CAAA,GAAG,KACjD;QACM;;IACJ,EA1BI,EAAO,GA0BX,CACZ;GACE,CAAA,CACF"}
@@ -2,77 +2,84 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { useMemo as t } from "react";
3
3
  import { AlertTriangle as n, CheckCircle as r, Shield as i, ShieldCheck as a } from "lucide-react";
4
4
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
- import { Badge as c, Button as l, Card as u, CardContent as d, CardHeader as f, CardTitle as p } from "@burdenoff/fe-libs/ui";
5
+ import { Badge as c, Button as l, Card as u, CardContent as d, CardHeader as f, CardTitle as p, GlassCard as m, GradientText as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
6
6
  //#region src/crewfoundry/pages/PaymentsSecurityPagePage.tsx
7
- var m = (e) => {
7
+ var _ = (e) => {
8
8
  let t = new Date(e);
9
9
  return Number.isNaN(t.getTime()) ? "Unknown" : t.toISOString().split("T")[0];
10
- }, h = (e) => {
10
+ }, v = (e) => {
11
11
  let t = new Date(e);
12
12
  if (Number.isNaN(t.getTime())) return "recently";
13
13
  let n = Math.max(1, Math.floor((Date.now() - t.getTime()) / (1e3 * 60 * 60)));
14
14
  return n < 24 ? `${n}h ago` : `${Math.floor(n / 24)}d ago`;
15
15
  };
16
- function g() {
17
- let { notifications: g, invoices: _, payrollRecords: v } = e(), y = t(() => {
18
- let e = _.filter((e) => e.status === "overdue").length, t = v.filter((e) => e.status === "failed").length, n = e > 0 || t > 0;
16
+ function y() {
17
+ let { notifications: y, invoices: b, payrollRecords: x } = e(), S = t(() => {
18
+ let e = b.filter((e) => e.status === "overdue").length, t = x.filter((e) => e.status === "failed").length, n = e > 0 || t > 0;
19
19
  return [
20
20
  {
21
21
  name: "PCI DSS Compliance",
22
22
  status: "passed",
23
- lastChecked: m((/* @__PURE__ */ new Date()).toISOString())
23
+ lastChecked: _((/* @__PURE__ */ new Date()).toISOString())
24
24
  },
25
25
  {
26
26
  name: "SSL/TLS Encryption",
27
27
  status: "passed",
28
- lastChecked: m((/* @__PURE__ */ new Date()).toISOString())
28
+ lastChecked: _((/* @__PURE__ */ new Date()).toISOString())
29
29
  },
30
30
  {
31
31
  name: "Two-Factor Authentication",
32
32
  status: "passed",
33
- lastChecked: m((/* @__PURE__ */ new Date()).toISOString())
33
+ lastChecked: _((/* @__PURE__ */ new Date()).toISOString())
34
34
  },
35
35
  {
36
36
  name: "Data Encryption at Rest",
37
37
  status: "passed",
38
- lastChecked: m((/* @__PURE__ */ new Date()).toISOString())
38
+ lastChecked: _((/* @__PURE__ */ new Date()).toISOString())
39
39
  },
40
40
  {
41
41
  name: "Payment Processing Audit",
42
42
  status: n ? "warning" : "passed",
43
- lastChecked: m((/* @__PURE__ */ new Date()).toISOString())
43
+ lastChecked: _((/* @__PURE__ */ new Date()).toISOString())
44
44
  },
45
45
  {
46
46
  name: "Access Control Review",
47
- status: g.some((e) => e.type === "error") ? "warning" : "passed",
48
- lastChecked: m((/* @__PURE__ */ new Date()).toISOString())
47
+ status: y.some((e) => e.type === "error") ? "warning" : "passed",
48
+ lastChecked: _((/* @__PURE__ */ new Date()).toISOString())
49
49
  }
50
50
  ];
51
51
  }, [
52
- _,
53
- g,
54
- v
55
- ]), b = t(() => g.slice(0, 6).map((e) => {
52
+ b,
53
+ y,
54
+ x
55
+ ]), C = t(() => y.slice(0, 6).map((e) => {
56
56
  let t = e.type === "error" ? "medium" : e.type === "warning" ? "low" : "info";
57
57
  return {
58
58
  id: e.id,
59
59
  message: e.message,
60
60
  severity: t,
61
- time: h(e.createdAt)
61
+ time: v(e.createdAt)
62
62
  };
63
- }), [g]), x = y.filter((e) => e.status === "passed").length, S = Math.round(x / Math.max(y.length, 1) * 100);
63
+ }), [y]), w = S.filter((e) => e.status === "passed").length, T = Math.round(w / Math.max(S.length, 1) * 100);
64
64
  return /* @__PURE__ */ s("div", {
65
65
  className: "space-y-6 p-6",
66
66
  children: [
67
67
  /* @__PURE__ */ s("div", {
68
68
  className: "flex items-center justify-between",
69
- children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
70
- className: "text-2xl font-semibold",
71
- children: "Payment Security"
72
- }), /* @__PURE__ */ o("p", {
73
- className: "text-sm text-text-secondary",
74
- children: "Security controls and compliance status"
75
- })] }), /* @__PURE__ */ s(l, {
69
+ children: [/* @__PURE__ */ s("div", { children: [
70
+ /* @__PURE__ */ o("h1", {
71
+ className: "text-2xl font-semibold",
72
+ children: /* @__PURE__ */ o(h, { children: "Payment Security" })
73
+ }),
74
+ /* @__PURE__ */ o("p", {
75
+ className: "text-sm text-text-secondary",
76
+ children: "Security controls and compliance status"
77
+ }),
78
+ /* @__PURE__ */ o(g, {
79
+ className: "mt-1",
80
+ children: "Protect your account and payments — review security settings, activity, and safeguards that keep your money and data safe."
81
+ })
82
+ ] }), /* @__PURE__ */ s(l, {
76
83
  variant: "outline",
77
84
  size: "sm",
78
85
  children: [/* @__PURE__ */ o(i, { className: "mr-1 h-4 w-4" }), "Run Audit"]
@@ -81,49 +88,62 @@ function g() {
81
88
  /* @__PURE__ */ s("div", {
82
89
  className: "grid gap-4 md:grid-cols-3",
83
90
  children: [
84
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(f, {
85
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
86
- children: [/* @__PURE__ */ o(p, {
87
- className: "text-sm font-medium",
88
- children: "Security Score"
89
- }), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-green-500" })]
90
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ s("div", {
91
- className: "text-2xl font-bold",
92
- children: [S, "/100"]
93
- }) })] }),
94
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(f, {
95
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
96
- children: [/* @__PURE__ */ o(p, {
97
- className: "text-sm font-medium",
98
- children: "Checks Passing"
99
- }), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-green-500" })]
100
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ s("div", {
101
- className: "text-2xl font-bold",
102
- children: [
103
- x,
104
- "/",
105
- y.length
106
- ]
107
- }) })] }),
108
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(f, {
109
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
110
- children: [/* @__PURE__ */ o(p, {
111
- className: "text-sm font-medium",
112
- children: "Active Alerts"
113
- }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-yellow-500" })]
114
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
115
- className: "text-2xl font-bold",
116
- children: b.length
117
- }) })] })
91
+ /* @__PURE__ */ s(m, {
92
+ treatment: "glass",
93
+ glow: !0,
94
+ className: "border-border-seam",
95
+ children: [/* @__PURE__ */ s(f, {
96
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
97
+ children: [/* @__PURE__ */ o(p, {
98
+ className: "text-sm font-medium",
99
+ children: "Security Score"
100
+ }), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-status-success-text" })]
101
+ }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ s("div", {
102
+ className: "text-2xl font-bold tabular-nums",
103
+ children: [T, "/100"]
104
+ }) })]
105
+ }),
106
+ /* @__PURE__ */ s(m, {
107
+ treatment: "metric",
108
+ className: "border-border-seam",
109
+ children: [/* @__PURE__ */ s(f, {
110
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
111
+ children: [/* @__PURE__ */ o(p, {
112
+ className: "text-sm font-medium",
113
+ children: "Checks Passing"
114
+ }), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-status-success-text" })]
115
+ }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ s("div", {
116
+ className: "text-2xl font-bold tabular-nums",
117
+ children: [
118
+ w,
119
+ "/",
120
+ S.length
121
+ ]
122
+ }) })]
123
+ }),
124
+ /* @__PURE__ */ s(m, {
125
+ treatment: "metric",
126
+ className: "border-border-seam",
127
+ children: [/* @__PURE__ */ s(f, {
128
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
129
+ children: [/* @__PURE__ */ o(p, {
130
+ className: "text-sm font-medium",
131
+ children: "Active Alerts"
132
+ }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-status-warning-text" })]
133
+ }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
134
+ className: "text-2xl font-bold tabular-nums",
135
+ children: C.length
136
+ }) })]
137
+ })
118
138
  ]
119
139
  }),
120
140
  /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o(f, { children: /* @__PURE__ */ o(p, { children: "Security Checks" }) }), /* @__PURE__ */ o(d, {
121
141
  className: "space-y-3",
122
- children: y.map((e) => /* @__PURE__ */ s("div", {
142
+ children: S.map((e) => /* @__PURE__ */ s("div", {
123
143
  className: "flex items-center justify-between rounded border p-3",
124
144
  children: [/* @__PURE__ */ s("div", {
125
145
  className: "flex items-center gap-2",
126
- children: [e.status === "passed" ? /* @__PURE__ */ o(r, { className: "h-4 w-4 text-green-500" }) : /* @__PURE__ */ o(n, { className: "h-4 w-4 text-yellow-500" }), /* @__PURE__ */ o("span", {
146
+ children: [e.status === "passed" ? /* @__PURE__ */ o(r, { className: "h-4 w-4 text-status-success-text" }) : /* @__PURE__ */ o(n, { className: "h-4 w-4 text-status-warning-text" }), /* @__PURE__ */ o("span", {
127
147
  className: "text-sm font-medium",
128
148
  children: e.name
129
149
  })]
@@ -142,11 +162,11 @@ function g() {
142
162
  })] }),
143
163
  /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o(f, { children: /* @__PURE__ */ o(p, { children: "Security Alerts" }) }), /* @__PURE__ */ o(d, {
144
164
  className: "space-y-3",
145
- children: b.map((e) => /* @__PURE__ */ s("div", {
165
+ children: C.map((e) => /* @__PURE__ */ s("div", {
146
166
  className: "flex items-center justify-between rounded border p-3",
147
167
  children: [/* @__PURE__ */ s("div", {
148
168
  className: "flex items-center gap-2",
149
- children: [/* @__PURE__ */ o(n, { className: `h-4 w-4 ${e.severity === "medium" ? "text-yellow-500" : e.severity === "low" ? "text-blue-500" : "text-text-secondary"}` }), /* @__PURE__ */ o("span", {
169
+ children: [/* @__PURE__ */ o(n, { className: `h-4 w-4 ${e.severity === "medium" ? "text-status-warning-text" : e.severity === "low" ? "text-status-info-text" : "text-text-secondary"}` }), /* @__PURE__ */ o("span", {
150
170
  className: "text-sm",
151
171
  children: e.message
152
172
  })]
@@ -167,6 +187,6 @@ function g() {
167
187
  });
168
188
  }
169
189
  //#endregion
170
- export { g as PaymentsSecurityPagePage };
190
+ export { y as PaymentsSecurityPagePage };
171
191
 
172
192
  //# sourceMappingURL=PaymentsSecurityPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PaymentsSecurityPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsSecurityPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Badge, Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { AlertTriangle, CheckCircle, Shield, ShieldCheck } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype SecurityCheck = {\n name: string;\n status: 'passed' | 'warning';\n lastChecked: string;\n};\n\ntype SecurityAlert = {\n id: string;\n message: string;\n severity: 'medium' | 'low' | 'info';\n time: string;\n};\n\nconst formatDate = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'Unknown';\n }\n return parsed.toISOString().split('T')[0];\n};\n\nconst timeAgo = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'recently';\n }\n const hours = Math.max(1, Math.floor((Date.now() - parsed.getTime()) / (1000 * 60 * 60)));\n return hours < 24 ? `${hours}h ago` : `${Math.floor(hours / 24)}d ago`;\n};\n\nexport function PaymentsSecurityPagePage() {\n const { notifications, invoices, payrollRecords } = useCrewFoundryStore();\n\n const securityChecks = useMemo<SecurityCheck[]>(() => {\n const failedInvoices = invoices.filter((invoice) => invoice.status === 'overdue').length;\n const payrollFailures = payrollRecords.filter((record) => record.status === 'failed').length;\n const warning = failedInvoices > 0 || payrollFailures > 0;\n\n return [\n {\n name: 'PCI DSS Compliance',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'SSL/TLS Encryption',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Two-Factor Authentication',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Data Encryption at Rest',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Payment Processing Audit',\n status: warning ? 'warning' : 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Access Control Review',\n status: notifications.some((notification) => notification.type === 'error')\n ? 'warning'\n : 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n ];\n }, [invoices, notifications, payrollRecords]);\n\n const recentAlerts = useMemo<SecurityAlert[]>(() => {\n return notifications.slice(0, 6).map((notification) => {\n const severity: SecurityAlert['severity'] =\n notification.type === 'error' ? 'medium' : notification.type === 'warning' ? 'low' : 'info';\n\n return {\n id: notification.id,\n message: notification.message,\n severity,\n time: timeAgo(notification.createdAt),\n };\n });\n }, [notifications]);\n\n const passedChecks = securityChecks.filter((check) => check.status === 'passed').length;\n const securityScore = Math.round((passedChecks / Math.max(securityChecks.length, 1)) * 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\">Payment Security</h1>\n <p className=\"text-sm text-text-secondary\">Security controls and compliance status</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n <Shield className=\"mr-1 h-4 w-4\" />\n Run Audit\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Security Score</CardTitle>\n <ShieldCheck className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{securityScore}/100</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\">Checks Passing</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n {passedChecks}/{securityChecks.length}\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\">Active Alerts</CardTitle>\n <AlertTriangle className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{recentAlerts.length}</div>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Security Checks</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {securityChecks.map((check) => (\n <div key={check.name} className=\"flex items-center justify-between rounded border p-3\">\n <div className=\"flex items-center gap-2\">\n {check.status === 'passed' ? (\n <CheckCircle className=\"h-4 w-4 text-green-500\" />\n ) : (\n <AlertTriangle className=\"h-4 w-4 text-yellow-500\" />\n )}\n <span className=\"text-sm font-medium\">{check.name}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary\">Last: {check.lastChecked}</span>\n <Badge\n variant={check.status === 'passed' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {check.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Security Alerts</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {recentAlerts.map((alert) => (\n <div key={alert.id} className=\"flex items-center justify-between rounded border p-3\">\n <div className=\"flex items-center gap-2\">\n <AlertTriangle\n className={`h-4 w-4 ${\n alert.severity === 'medium'\n ? 'text-yellow-500'\n : alert.severity === 'low'\n ? 'text-blue-500'\n : 'text-text-secondary'\n }`}\n />\n <span className=\"text-sm\">{alert.message}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary\">{alert.time}</span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {alert.severity}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PaymentsSecurityPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsSecurityPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { AlertTriangle, CheckCircle, Shield, ShieldCheck } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype SecurityCheck = {\n name: string;\n status: 'passed' | 'warning';\n lastChecked: string;\n};\n\ntype SecurityAlert = {\n id: string;\n message: string;\n severity: 'medium' | 'low' | 'info';\n time: string;\n};\n\nconst formatDate = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'Unknown';\n }\n return parsed.toISOString().split('T')[0];\n};\n\nconst timeAgo = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'recently';\n }\n const hours = Math.max(1, Math.floor((Date.now() - parsed.getTime()) / (1000 * 60 * 60)));\n return hours < 24 ? `${hours}h ago` : `${Math.floor(hours / 24)}d ago`;\n};\n\nexport function PaymentsSecurityPagePage() {\n const { notifications, invoices, payrollRecords } = useCrewFoundryStore();\n\n const securityChecks = useMemo<SecurityCheck[]>(() => {\n const failedInvoices = invoices.filter((invoice) => invoice.status === 'overdue').length;\n const payrollFailures = payrollRecords.filter((record) => record.status === 'failed').length;\n const warning = failedInvoices > 0 || payrollFailures > 0;\n\n return [\n {\n name: 'PCI DSS Compliance',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'SSL/TLS Encryption',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Two-Factor Authentication',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Data Encryption at Rest',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Payment Processing Audit',\n status: warning ? 'warning' : 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Access Control Review',\n status: notifications.some((notification) => notification.type === 'error')\n ? 'warning'\n : 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n ];\n }, [invoices, notifications, payrollRecords]);\n\n const recentAlerts = useMemo<SecurityAlert[]>(() => {\n return notifications.slice(0, 6).map((notification) => {\n const severity: SecurityAlert['severity'] =\n notification.type === 'error' ? 'medium' : notification.type === 'warning' ? 'low' : 'info';\n\n return {\n id: notification.id,\n message: notification.message,\n severity,\n time: timeAgo(notification.createdAt),\n };\n });\n }, [notifications]);\n\n const passedChecks = securityChecks.filter((check) => check.status === 'passed').length;\n const securityScore = Math.round((passedChecks / Math.max(securityChecks.length, 1)) * 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>Payment Security</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Security controls and compliance status</p>\n <PagePurpose className=\"mt-1\">Protect your account and payments — review security settings, activity, and safeguards that keep your money and data safe.</PagePurpose>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n <Shield className=\"mr-1 h-4 w-4\" />\n Run Audit\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Security Score</CardTitle>\n <ShieldCheck className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{securityScore}/100</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\">Checks Passing</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {passedChecks}/{securityChecks.length}\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\">Active Alerts</CardTitle>\n <AlertTriangle className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{recentAlerts.length}</div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Security Checks</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {securityChecks.map((check) => (\n <div key={check.name} className=\"flex items-center justify-between rounded border p-3\">\n <div className=\"flex items-center gap-2\">\n {check.status === 'passed' ? (\n <CheckCircle className=\"h-4 w-4 text-status-success-text\" />\n ) : (\n <AlertTriangle className=\"h-4 w-4 text-status-warning-text\" />\n )}\n <span className=\"text-sm font-medium\">{check.name}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary\">Last: {check.lastChecked}</span>\n <Badge\n variant={check.status === 'passed' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {check.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Security Alerts</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {recentAlerts.map((alert) => (\n <div key={alert.id} className=\"flex items-center justify-between rounded border p-3\">\n <div className=\"flex items-center gap-2\">\n <AlertTriangle\n className={`h-4 w-4 ${\n alert.severity === 'medium'\n ? 'text-status-warning-text'\n : alert.severity === 'low'\n ? 'text-status-info-text'\n : 'text-text-secondary'\n }`}\n />\n <span className=\"text-sm\">{alert.message}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary\">{alert.time}</span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {alert.severity}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}