@burdenoff/microfe-crewfoundry 2026.624.1 → 2026.625.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/crewfoundry/pages/AdminAdminPagePage.js +86 -70
  2. package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
  3. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +104 -88
  4. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  5. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +91 -75
  6. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
  7. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +119 -103
  8. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +107 -91
  10. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +10 -10
  12. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +60 -48
  14. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +10 -10
  16. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +20 -20
  18. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +22 -22
  20. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
  21. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +7 -7
  22. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
  23. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +67 -55
  24. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
  25. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +54 -42
  26. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +68 -52
  28. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
  29. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +30 -30
  30. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
  31. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +9 -9
  32. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  33. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +90 -74
  34. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
  35. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +166 -132
  36. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  37. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +43 -43
  38. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  39. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +107 -91
  40. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
  41. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +35 -35
  42. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +78 -62
  44. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  45. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +17 -17
  46. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  47. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +39 -39
  48. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  49. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +53 -41
  50. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  51. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +41 -37
  52. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/HiringJobsPagePage.js +25 -20
  54. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +54 -42
  56. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +76 -60
  58. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +83 -67
  60. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/HrPayrollPagePage.js +86 -70
  62. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +79 -63
  64. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +51 -39
  66. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
  67. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +14 -14
  68. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +29 -25
  70. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +17 -17
  72. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +11 -11
  74. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +76 -60
  76. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/LearningLearningPagePage.js +67 -51
  78. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  79. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +17 -17
  80. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +7 -7
  82. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  83. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +69 -53
  84. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +54 -42
  86. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  87. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +66 -54
  88. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
  89. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +37 -37
  90. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  91. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +33 -32
  92. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +54 -42
  94. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  95. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +11 -11
  96. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  97. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +18 -18
  98. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
  99. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +7 -7
  100. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  101. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +29 -25
  102. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  103. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +22 -18
  104. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  105. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +55 -43
  106. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
  107. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +7 -7
  108. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  109. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +62 -46
  110. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  111. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +14 -14
  112. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
  113. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +71 -59
  114. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
  115. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +20 -20
  116. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  117. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +33 -29
  118. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  119. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +16 -16
  120. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  121. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +53 -41
  122. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  123. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +25 -21
  124. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  125. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +9 -9
  126. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  127. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +48 -48
  128. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  129. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +13 -13
  130. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  131. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"HrPayrollPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HrPayrollPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Separator,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle, Clock, DollarSign, Download, FileText, Play, TrendingUp } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HrPayrollPagePage() {\n const { payrollRecords, employees } = useCrewFoundryStore();\n const [selectedPeriod, setSelectedPeriod] = useState('January 2026');\n\n const periodRecords = payrollRecords.filter((r) => r.period === selectedPeriod);\n const totalGross = periodRecords.reduce((s, r) => s + r.grossPay, 0);\n const totalDeductions = periodRecords.reduce((s, r) => s + r.deductions, 0);\n const totalNet = periodRecords.reduce((s, r) => s + r.netPay, 0);\n const paidCount = periodRecords.filter((r) => r.status === 'paid').length;\n const processingCount = periodRecords.filter((r) => r.status === 'processing').length;\n\n const periods = [...new Set(payrollRecords.map((r) => r.period))];\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\">Payroll Management</h1>\n <p className=\"text-sm text-text-secondary\">Process and manage employee payroll</p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <Download className=\"h-4 w-4 mr-1\" />\n Export\n </Button>\n <Button size=\"sm\">\n <Play className=\"h-4 w-4 mr-1\" />\n Run Payroll\n </Button>\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\">Gross Payroll</CardTitle>\n <DollarSign className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${totalGross.toLocaleString()}</div>\n <p className=\"text-xs text-text-secondary\">{selectedPeriod}</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\">Net Payroll</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${totalNet.toLocaleString()}</div>\n <p className=\"text-xs text-text-secondary\">After deductions</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\">Paid</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{paidCount}</div>\n <p className=\"text-xs text-text-secondary\">employees paid</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\">Processing</CardTitle>\n <Clock className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{processingCount}</div>\n <p className=\"text-xs text-text-secondary\">in progress</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"flex gap-2\">\n {periods.map((period) => (\n <Button\n key={period}\n variant={selectedPeriod === period ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedPeriod(period)}\n >\n {period}\n </Button>\n ))}\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Payroll Records</CardTitle>\n <CardDescription>\n Individual employee payroll details for {selectedPeriod}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Employee</span>\n <span>Department</span>\n <span className=\"text-right\">Gross Pay</span>\n <span className=\"text-right\">Deductions</span>\n <span className=\"text-right\">Net Pay</span>\n <span>Payment Method</span>\n <span className=\"text-center\">Status</span>\n </div>\n {payrollRecords.map((record) => (\n <div\n key={record.id}\n className=\"grid grid-cols-7 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{record.employeeName}</span>\n <span className=\"text-text-secondary\">{record.department}</span>\n <span className=\"text-right\">${record.grossPay.toLocaleString()}</span>\n <span className=\"text-right text-red-600\">\n -${record.deductions.toLocaleString()}\n </span>\n <span className=\"text-right font-medium\">${record.netPay.toLocaleString()}</span>\n <span className=\"text-text-secondary\">{record.paymentMethod}</span>\n <div className=\"text-center\">\n <Badge\n variant={\n record.status === 'paid'\n ? 'default'\n : record.status === 'processing'\n ? 'secondary'\n : 'outline'\n }\n className=\"text-[10px]\"\n >\n {record.status}\n </Badge>\n </div>\n </div>\n ))}\n <Separator className=\"my-2\" />\n <div className=\"grid grid-cols-7 gap-2 text-sm font-bold\">\n <span>Total</span>\n <span />\n <span className=\"text-right\">\n ${payrollRecords.reduce((s, r) => s + r.grossPay, 0).toLocaleString()}\n </span>\n <span className=\"text-right text-red-600\">\n -${payrollRecords.reduce((s, r) => s + r.deductions, 0).toLocaleString()}\n </span>\n <span className=\"text-right\">\n ${payrollRecords.reduce((s, r) => s + r.netPay, 0).toLocaleString()}\n </span>\n <span />\n <span />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HrPayrollPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HrPayrollPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n Separator,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle, Clock, DollarSign, Download, FileText, Play, TrendingUp } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HrPayrollPagePage() {\n const { payrollRecords, employees } = useCrewFoundryStore();\n const [selectedPeriod, setSelectedPeriod] = useState('January 2026');\n\n const periodRecords = payrollRecords.filter((r) => r.period === selectedPeriod);\n const totalGross = periodRecords.reduce((s, r) => s + r.grossPay, 0);\n const totalDeductions = periodRecords.reduce((s, r) => s + r.deductions, 0);\n const totalNet = periodRecords.reduce((s, r) => s + r.netPay, 0);\n const paidCount = periodRecords.filter((r) => r.status === 'paid').length;\n const processingCount = periodRecords.filter((r) => r.status === 'processing').length;\n\n const periods = [...new Set(payrollRecords.map((r) => r.period))];\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>Payroll Management</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Process and manage employee payroll</p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <Download className=\"h-4 w-4 mr-1\" />\n Export\n </Button>\n <Button size=\"sm\">\n <Play className=\"h-4 w-4 mr-1\" />\n Run Payroll\n </Button>\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\">Gross 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\">${totalGross.toLocaleString()}</div>\n <p className=\"text-xs text-text-secondary\">{selectedPeriod}</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\">Net Payroll</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalNet.toLocaleString()}</div>\n <p className=\"text-xs text-text-secondary\">After deductions</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\">Paid</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\">{paidCount}</div>\n <p className=\"text-xs text-text-secondary\">employees paid</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\">Processing</CardTitle>\n <Clock className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{processingCount}</div>\n <p className=\"text-xs text-text-secondary\">in progress</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"flex gap-2\">\n {periods.map((period) => (\n <Button\n key={period}\n variant={selectedPeriod === period ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedPeriod(period)}\n >\n {period}\n </Button>\n ))}\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Payroll Records</CardTitle>\n <CardDescription>\n Individual employee payroll details for {selectedPeriod}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Employee</span>\n <span>Department</span>\n <span className=\"text-right\">Gross Pay</span>\n <span className=\"text-right\">Deductions</span>\n <span className=\"text-right\">Net Pay</span>\n <span>Payment Method</span>\n <span className=\"text-center\">Status</span>\n </div>\n {payrollRecords.map((record) => (\n <div\n key={record.id}\n className=\"grid grid-cols-7 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{record.employeeName}</span>\n <span className=\"text-text-secondary\">{record.department}</span>\n <span className=\"text-right\">${record.grossPay.toLocaleString()}</span>\n <span className=\"text-right text-status-error-text\">\n -${record.deductions.toLocaleString()}\n </span>\n <span className=\"text-right font-medium\">${record.netPay.toLocaleString()}</span>\n <span className=\"text-text-secondary\">{record.paymentMethod}</span>\n <div className=\"text-center\">\n <Badge\n variant={\n record.status === 'paid'\n ? 'default'\n : record.status === 'processing'\n ? 'secondary'\n : 'outline'\n }\n className=\"text-[10px]\"\n >\n {record.status}\n </Badge>\n </div>\n </div>\n ))}\n <Separator className=\"my-2\" />\n <div className=\"grid grid-cols-7 gap-2 text-sm font-bold\">\n <span>Total</span>\n <span />\n <span className=\"text-right\">\n ${payrollRecords.reduce((s, r) => s + r.grossPay, 0).toLocaleString()}\n </span>\n <span className=\"text-right text-status-error-text\">\n -${payrollRecords.reduce((s, r) => s + r.deductions, 0).toLocaleString()}\n </span>\n <span className=\"text-right\">\n ${payrollRecords.reduce((s, r) => s + r.netPay, 0).toLocaleString()}\n </span>\n <span />\n <span />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { CheckCircle as t, Clock as n, LogIn as r, LogOut as i, Timer as a } from "lucide-react";
3
3
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
4
- import { Badge as c, Button as l, Card as u, CardContent as d, CardDescription as f, CardHeader as p, CardTitle as m } from "@burdenoff/fe-libs/ui";
4
+ import { Badge as c, Button as l, Card as u, CardContent as d, CardDescription as f, CardHeader as p, CardTitle as m, GlassCard as h, GradientText as g } from "@burdenoff/fe-libs/ui";
5
5
  //#region src/crewfoundry/pages/HrTimeTrackingPagePage.tsx
6
- function h() {
7
- let { timeEntries: h } = e(), g = h.reduce((e, t) => e + t.totalHours, 0), _ = h.reduce((e, t) => e + t.overtime, 0), v = h.filter((e) => e.status === "approved").length, y = h.filter((e) => e.status === "pending").length, b = h.reduce((e, t) => (e[t.project] = (e[t.project] || 0) + t.totalHours, e), {}), x = Math.max(...Object.values(b));
6
+ function _() {
7
+ let { timeEntries: _ } = e(), v = _.reduce((e, t) => e + t.totalHours, 0), y = _.reduce((e, t) => e + t.overtime, 0), b = _.filter((e) => e.status === "approved").length, x = _.filter((e) => e.status === "pending").length, S = _.reduce((e, t) => (e[t.project] = (e[t.project] || 0) + t.totalHours, e), {}), C = Math.max(...Object.values(S));
8
8
  return /* @__PURE__ */ s("div", {
9
9
  className: "space-y-6 p-6",
10
10
  children: [
@@ -12,7 +12,7 @@ function h() {
12
12
  className: "flex items-center justify-between",
13
13
  children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
14
14
  className: "text-2xl font-semibold",
15
- children: "Time Tracking"
15
+ children: /* @__PURE__ */ o(g, { children: "Time Tracking" })
16
16
  }), /* @__PURE__ */ o("p", {
17
17
  className: "text-sm text-text-secondary",
18
18
  children: "Monitor employee work hours and overtime"
@@ -24,65 +24,81 @@ function h() {
24
24
  /* @__PURE__ */ s("div", {
25
25
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
26
26
  children: [
27
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, {
28
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
29
- children: [/* @__PURE__ */ o(m, {
30
- className: "text-sm font-medium",
31
- children: "Total Hours"
32
- }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-text-secondary" })]
33
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
34
- className: "text-2xl font-bold",
35
- children: g.toFixed(1)
36
- }), /* @__PURE__ */ o("p", {
37
- className: "text-xs text-text-secondary",
38
- children: "Today"
39
- })] })] }),
40
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, {
41
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
42
- children: [/* @__PURE__ */ o(m, {
43
- className: "text-sm font-medium",
44
- children: "Overtime"
45
- }), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-orange-500" })]
46
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ s("div", {
47
- className: "text-2xl font-bold",
48
- children: [_.toFixed(1), "h"]
49
- }), /* @__PURE__ */ o("p", {
50
- className: "text-xs text-text-secondary",
51
- children: "Extra hours logged"
52
- })] })] }),
53
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, {
54
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
55
- children: [/* @__PURE__ */ o(m, {
56
- className: "text-sm font-medium",
57
- children: "Approved"
58
- }), /* @__PURE__ */ o(t, { className: "h-4 w-4 text-green-500" })]
59
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
60
- className: "text-2xl font-bold",
61
- children: v
62
- }), /* @__PURE__ */ o("p", {
63
- className: "text-xs text-text-secondary",
64
- children: "time entries"
65
- })] })] }),
66
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, {
67
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
68
- children: [/* @__PURE__ */ o(m, {
69
- className: "text-sm font-medium",
70
- children: "Pending"
71
- }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-yellow-500" })]
72
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
73
- className: "text-2xl font-bold",
74
- children: y
75
- }), /* @__PURE__ */ o("p", {
76
- className: "text-xs text-text-secondary",
77
- children: "awaiting approval"
78
- })] })] })
27
+ /* @__PURE__ */ s(h, {
28
+ treatment: "metric",
29
+ className: "border-border-seam",
30
+ children: [/* @__PURE__ */ s(p, {
31
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
32
+ children: [/* @__PURE__ */ o(m, {
33
+ className: "text-sm font-medium",
34
+ children: "Total Hours"
35
+ }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-text-secondary" })]
36
+ }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
37
+ className: "text-2xl font-bold tabular-nums",
38
+ children: v.toFixed(1)
39
+ }), /* @__PURE__ */ o("p", {
40
+ className: "text-xs text-text-secondary",
41
+ children: "Today"
42
+ })] })]
43
+ }),
44
+ /* @__PURE__ */ s(h, {
45
+ treatment: "metric",
46
+ className: "border-border-seam",
47
+ children: [/* @__PURE__ */ s(p, {
48
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
49
+ children: [/* @__PURE__ */ o(m, {
50
+ className: "text-sm font-medium",
51
+ children: "Overtime"
52
+ }), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-status-warning-text" })]
53
+ }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ s("div", {
54
+ className: "text-2xl font-bold tabular-nums",
55
+ children: [y.toFixed(1), "h"]
56
+ }), /* @__PURE__ */ o("p", {
57
+ className: "text-xs text-text-secondary",
58
+ children: "Extra hours logged"
59
+ })] })]
60
+ }),
61
+ /* @__PURE__ */ s(h, {
62
+ treatment: "metric",
63
+ className: "border-border-seam",
64
+ children: [/* @__PURE__ */ s(p, {
65
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
66
+ children: [/* @__PURE__ */ o(m, {
67
+ className: "text-sm font-medium",
68
+ children: "Approved"
69
+ }), /* @__PURE__ */ o(t, { className: "h-4 w-4 text-status-success-text" })]
70
+ }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
71
+ className: "text-2xl font-bold tabular-nums",
72
+ children: b
73
+ }), /* @__PURE__ */ o("p", {
74
+ className: "text-xs text-text-secondary",
75
+ children: "time entries"
76
+ })] })]
77
+ }),
78
+ /* @__PURE__ */ s(h, {
79
+ treatment: "metric",
80
+ className: "border-border-seam",
81
+ children: [/* @__PURE__ */ s(p, {
82
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
83
+ children: [/* @__PURE__ */ o(m, {
84
+ className: "text-sm font-medium",
85
+ children: "Pending"
86
+ }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-status-warning-text" })]
87
+ }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
88
+ className: "text-2xl font-bold tabular-nums",
89
+ children: x
90
+ }), /* @__PURE__ */ o("p", {
91
+ className: "text-xs text-text-secondary",
92
+ children: "awaiting approval"
93
+ })] })]
94
+ })
79
95
  ]
80
96
  }),
81
97
  /* @__PURE__ */ s("div", {
82
98
  className: "grid gap-4 md:grid-cols-2",
83
99
  children: [/* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, { children: [/* @__PURE__ */ o(m, { children: "Hours by Project" }), /* @__PURE__ */ o(f, { children: "Time allocation across active projects" })] }), /* @__PURE__ */ o(d, {
84
100
  className: "space-y-3",
85
- children: Object.entries(b).sort(([, e], [, t]) => t - e).map(([e, t]) => /* @__PURE__ */ s("div", {
101
+ children: Object.entries(S).sort(([, e], [, t]) => t - e).map(([e, t]) => /* @__PURE__ */ s("div", {
86
102
  className: "flex items-center gap-3",
87
103
  children: [
88
104
  /* @__PURE__ */ o("span", {
@@ -93,7 +109,7 @@ function h() {
93
109
  className: "flex-1 h-4 bg-bg-sunken rounded overflow-hidden",
94
110
  children: /* @__PURE__ */ o("div", {
95
111
  className: "h-4 bg-action-primary-bg rounded",
96
- style: { width: `${Math.round(t / x * 100)}%` }
112
+ style: { width: `${Math.round(t / C * 100)}%` }
97
113
  })
98
114
  }),
99
115
  /* @__PURE__ */ s("span", {
@@ -104,7 +120,7 @@ function h() {
104
120
  }, e))
105
121
  })] }), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, { children: [/* @__PURE__ */ o(m, { children: "Today's Activity" }), /* @__PURE__ */ o(f, { children: "Employee clock-in/out for today" })] }), /* @__PURE__ */ o(d, {
106
122
  className: "space-y-3",
107
- children: h.map((e) => /* @__PURE__ */ s("div", {
123
+ children: _.map((e) => /* @__PURE__ */ s("div", {
108
124
  className: "flex items-center justify-between rounded border p-3",
109
125
  children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
110
126
  className: "text-sm font-medium",
@@ -119,10 +135,10 @@ function h() {
119
135
  className: "text-right text-xs",
120
136
  children: [/* @__PURE__ */ s("div", {
121
137
  className: "flex items-center gap-1",
122
- children: [/* @__PURE__ */ o(r, { className: "h-3 w-3 text-green-500" }), e.clockIn]
138
+ children: [/* @__PURE__ */ o(r, { className: "h-3 w-3 text-status-success-text" }), e.clockIn]
123
139
  }), /* @__PURE__ */ s("div", {
124
140
  className: "flex items-center gap-1",
125
- children: [/* @__PURE__ */ o(i, { className: "h-3 w-3 text-red-500" }), e.clockOut]
141
+ children: [/* @__PURE__ */ o(i, { className: "h-3 w-3 text-status-error-text" }), e.clockOut]
126
142
  })]
127
143
  }),
128
144
  /* @__PURE__ */ s("div", {
@@ -131,7 +147,7 @@ function h() {
131
147
  className: "text-sm font-medium",
132
148
  children: [e.totalHours, "h"]
133
149
  }), e.overtime > 0 && /* @__PURE__ */ s("p", {
134
- className: "text-xs text-orange-600",
150
+ className: "text-xs text-status-warning-text",
135
151
  children: [
136
152
  "+",
137
153
  e.overtime,
@@ -153,6 +169,6 @@ function h() {
153
169
  });
154
170
  }
155
171
  //#endregion
156
- export { h as HrTimeTrackingPagePage };
172
+ export { _ as HrTimeTrackingPagePage };
157
173
 
158
174
  //# sourceMappingURL=HrTimeTrackingPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HrTimeTrackingPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HrTimeTrackingPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle, Clock, LogIn, LogOut, Timer } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HrTimeTrackingPagePage() {\n const { timeEntries } = useCrewFoundryStore();\n\n const totalHours = timeEntries.reduce((s, t) => s + t.totalHours, 0);\n const totalOvertime = timeEntries.reduce((s, t) => s + t.overtime, 0);\n const approvedEntries = timeEntries.filter((t) => t.status === 'approved').length;\n const pendingEntries = timeEntries.filter((t) => t.status === 'pending').length;\n\n const projectBreakdown = timeEntries.reduce<Record<string, number>>((acc, t) => {\n acc[t.project] = (acc[t.project] || 0) + t.totalHours;\n return acc;\n }, {});\n const maxProjectHours = Math.max(...Object.values(projectBreakdown));\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\">Time Tracking</h1>\n <p className=\"text-sm text-text-secondary\">Monitor employee work hours and overtime</p>\n </div>\n <Button size=\"sm\">\n <Timer className=\"h-4 w-4 mr-1\" />\n Clock In\n </Button>\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\">Total Hours</CardTitle>\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{totalHours.toFixed(1)}</div>\n <p className=\"text-xs text-text-secondary\">Today</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\">Overtime</CardTitle>\n <Timer className=\"h-4 w-4 text-orange-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{totalOvertime.toFixed(1)}h</div>\n <p className=\"text-xs text-text-secondary\">Extra hours logged</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\">Approved</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{approvedEntries}</div>\n <p className=\"text-xs text-text-secondary\">time entries</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\">Pending</CardTitle>\n <Clock className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{pendingEntries}</div>\n <p className=\"text-xs text-text-secondary\">awaiting approval</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Hours by Project</CardTitle>\n <CardDescription>Time allocation across active projects</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {Object.entries(projectBreakdown)\n .sort(([, a], [, b]) => b - a)\n .map(([project, hours]) => (\n <div key={project} className=\"flex items-center gap-3\">\n <span className=\"w-48 text-sm truncate\">{project}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-action-primary-bg rounded\"\n style={{ width: `${Math.round((hours / maxProjectHours) * 100)}%` }}\n />\n </div>\n <span className=\"text-sm font-medium w-14 text-right\">{hours.toFixed(1)}h</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Today&apos;s Activity</CardTitle>\n <CardDescription>Employee clock-in/out for today</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {timeEntries.map((entry) => (\n <div key={entry.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{entry.employeeName}</p>\n <p className=\"text-xs text-text-secondary\">{entry.project}</p>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"text-right text-xs\">\n <div className=\"flex items-center gap-1\">\n <LogIn className=\"h-3 w-3 text-green-500\" />\n {entry.clockIn}\n </div>\n <div className=\"flex items-center gap-1\">\n <LogOut className=\"h-3 w-3 text-red-500\" />\n {entry.clockOut}\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{entry.totalHours}h</p>\n {entry.overtime > 0 && (\n <p className=\"text-xs text-orange-600\">+{entry.overtime}h OT</p>\n )}\n </div>\n <Badge\n variant={entry.status === 'approved' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {entry.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HrTimeTrackingPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HrTimeTrackingPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle, Clock, LogIn, LogOut, Timer } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HrTimeTrackingPagePage() {\n const { timeEntries } = useCrewFoundryStore();\n\n const totalHours = timeEntries.reduce((s, t) => s + t.totalHours, 0);\n const totalOvertime = timeEntries.reduce((s, t) => s + t.overtime, 0);\n const approvedEntries = timeEntries.filter((t) => t.status === 'approved').length;\n const pendingEntries = timeEntries.filter((t) => t.status === 'pending').length;\n\n const projectBreakdown = timeEntries.reduce<Record<string, number>>((acc, t) => {\n acc[t.project] = (acc[t.project] || 0) + t.totalHours;\n return acc;\n }, {});\n const maxProjectHours = Math.max(...Object.values(projectBreakdown));\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>Time Tracking</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Monitor employee work hours and overtime</p>\n </div>\n <Button size=\"sm\">\n <Timer className=\"h-4 w-4 mr-1\" />\n Clock In\n </Button>\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\">Total Hours</CardTitle>\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{totalHours.toFixed(1)}</div>\n <p className=\"text-xs text-text-secondary\">Today</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\">Overtime</CardTitle>\n <Timer className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{totalOvertime.toFixed(1)}h</div>\n <p className=\"text-xs text-text-secondary\">Extra hours logged</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\">Approved</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\">{approvedEntries}</div>\n <p className=\"text-xs text-text-secondary\">time entries</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\">Pending</CardTitle>\n <Clock className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{pendingEntries}</div>\n <p className=\"text-xs text-text-secondary\">awaiting approval</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Hours by Project</CardTitle>\n <CardDescription>Time allocation across active projects</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {Object.entries(projectBreakdown)\n .sort(([, a], [, b]) => b - a)\n .map(([project, hours]) => (\n <div key={project} className=\"flex items-center gap-3\">\n <span className=\"w-48 text-sm truncate\">{project}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-action-primary-bg rounded\"\n style={{ width: `${Math.round((hours / maxProjectHours) * 100)}%` }}\n />\n </div>\n <span className=\"text-sm font-medium w-14 text-right\">{hours.toFixed(1)}h</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Today&apos;s Activity</CardTitle>\n <CardDescription>Employee clock-in/out for today</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {timeEntries.map((entry) => (\n <div key={entry.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{entry.employeeName}</p>\n <p className=\"text-xs text-text-secondary\">{entry.project}</p>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"text-right text-xs\">\n <div className=\"flex items-center gap-1\">\n <LogIn className=\"h-3 w-3 text-status-success-text\" />\n {entry.clockIn}\n </div>\n <div className=\"flex items-center gap-1\">\n <LogOut className=\"h-3 w-3 text-status-error-text\" />\n {entry.clockOut}\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{entry.totalHours}h</p>\n {entry.overtime > 0 && (\n <p className=\"text-xs text-status-warning-text\">+{entry.overtime}h OT</p>\n )}\n </div>\n <Badge\n variant={entry.status === 'approved' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {entry.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -2,14 +2,14 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { useMemo as t } from "react";
3
3
  import { CheckCircle as n, Clock as r, FileText as i, Play 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 } from "@burdenoff/fe-libs/ui";
6
6
  //#region src/crewfoundry/pages/LearningAssessmentsPagePage.tsx
7
- var m = (/* @__PURE__ */ new Date("2026-03-01T00:00:00Z")).getTime(), h = (e) => {
7
+ var g = (/* @__PURE__ */ new Date("2026-03-01T00:00:00Z")).getTime(), _ = (e) => {
8
8
  let t = new Date(e);
9
9
  return Number.isNaN(t.getTime()) ? "Unknown" : t.toISOString().split("T")[0];
10
10
  };
11
- function g() {
12
- let { courses: g } = e(), _ = t(() => g.slice(0, 16).map((e, t) => {
11
+ function v() {
12
+ let { courses: v } = e(), y = t(() => v.slice(0, 16).map((e, t) => {
13
13
  let n = t % 6 == 0 ? "overdue" : t % 2 == 0 ? "available" : "completed", r = 70 + t % 4 * 5;
14
14
  return {
15
15
  id: e.id,
@@ -19,16 +19,16 @@ function g() {
19
19
  duration: `${Math.max(15, e.modules * 8)} min`,
20
20
  status: n,
21
21
  score: n === "completed" ? Math.min(99, Math.round(e.rating * 20 + 20)) : void 0,
22
- dueDate: h(new Date(m + (t - 3) * 864e5 * 6).toISOString()),
22
+ dueDate: _(new Date(g + (t - 3) * 864e5 * 6).toISOString()),
23
23
  passingScore: r
24
24
  };
25
- }), [g]);
25
+ }), [v]);
26
26
  return /* @__PURE__ */ s("div", {
27
27
  className: "space-y-6 p-6",
28
28
  children: [
29
29
  /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
30
30
  className: "text-2xl font-semibold",
31
- children: "Assessments"
31
+ children: /* @__PURE__ */ o(h, { children: "Assessments" })
32
32
  }), /* @__PURE__ */ o("p", {
33
33
  className: "text-sm text-text-secondary",
34
34
  children: "Quizzes and exams for your enrolled courses"
@@ -36,41 +36,53 @@ function g() {
36
36
  /* @__PURE__ */ s("div", {
37
37
  className: "grid gap-4 md:grid-cols-3",
38
38
  children: [
39
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(f, {
40
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
41
- children: [/* @__PURE__ */ o(p, {
42
- className: "text-sm font-medium",
43
- children: "Available"
44
- }), /* @__PURE__ */ o(i, { className: "h-4 w-4 text-blue-500" })]
45
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
46
- className: "text-2xl font-bold",
47
- children: _.filter((e) => e.status === "available").length
48
- }) })] }),
49
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(f, {
50
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
51
- children: [/* @__PURE__ */ o(p, {
52
- className: "text-sm font-medium",
53
- children: "Completed"
54
- }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-green-500" })]
55
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
56
- className: "text-2xl font-bold",
57
- children: _.filter((e) => e.status === "completed").length
58
- }) })] }),
59
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(f, {
60
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
61
- children: [/* @__PURE__ */ o(p, {
62
- className: "text-sm font-medium",
63
- children: "Overdue"
64
- }), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-red-500" })]
65
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
66
- className: "text-2xl font-bold",
67
- children: _.filter((e) => e.status === "overdue").length
68
- }) })] })
39
+ /* @__PURE__ */ s(m, {
40
+ treatment: "metric",
41
+ className: "border-border-seam",
42
+ children: [/* @__PURE__ */ s(f, {
43
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
44
+ children: [/* @__PURE__ */ o(p, {
45
+ className: "text-sm font-medium",
46
+ children: "Available"
47
+ }), /* @__PURE__ */ o(i, { className: "h-4 w-4 text-status-info-text" })]
48
+ }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
49
+ className: "text-2xl font-bold tabular-nums",
50
+ children: y.filter((e) => e.status === "available").length
51
+ }) })]
52
+ }),
53
+ /* @__PURE__ */ s(m, {
54
+ treatment: "metric",
55
+ className: "border-border-seam",
56
+ children: [/* @__PURE__ */ s(f, {
57
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
58
+ children: [/* @__PURE__ */ o(p, {
59
+ className: "text-sm font-medium",
60
+ children: "Completed"
61
+ }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-status-success-text" })]
62
+ }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
63
+ className: "text-2xl font-bold tabular-nums",
64
+ children: y.filter((e) => e.status === "completed").length
65
+ }) })]
66
+ }),
67
+ /* @__PURE__ */ s(m, {
68
+ treatment: "metric",
69
+ className: "border-border-seam",
70
+ children: [/* @__PURE__ */ s(f, {
71
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
72
+ children: [/* @__PURE__ */ o(p, {
73
+ className: "text-sm font-medium",
74
+ children: "Overdue"
75
+ }), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-status-error-text" })]
76
+ }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
77
+ className: "text-2xl font-bold tabular-nums",
78
+ children: y.filter((e) => e.status === "overdue").length
79
+ }) })]
80
+ })
69
81
  ]
70
82
  }),
71
83
  /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o(f, { children: /* @__PURE__ */ o(p, { children: "All Assessments" }) }), /* @__PURE__ */ o(d, {
72
84
  className: "space-y-3",
73
- children: _.map((e) => /* @__PURE__ */ s("div", {
85
+ children: y.map((e) => /* @__PURE__ */ s("div", {
74
86
  className: "flex items-center justify-between rounded border p-4",
75
87
  children: [/* @__PURE__ */ s("div", { children: [
76
88
  /* @__PURE__ */ o("p", {
@@ -131,6 +143,6 @@ function g() {
131
143
  });
132
144
  }
133
145
  //#endregion
134
- export { g as LearningAssessmentsPagePage };
146
+ export { v as LearningAssessmentsPagePage };
135
147
 
136
148
  //# sourceMappingURL=LearningAssessmentsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LearningAssessmentsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningAssessmentsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Badge, Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { CheckCircle, Clock, FileText, Play } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype Assessment = {\n id: string;\n title: string;\n course: string;\n questions: number;\n duration: string;\n status: 'available' | 'completed' | 'overdue';\n score?: number;\n dueDate: string;\n passingScore: number;\n};\n\nconst BASE_TS = new Date('2026-03-01T00:00:00Z').getTime();\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\nexport function LearningAssessmentsPagePage() {\n const { courses } = useCrewFoundryStore();\n\n const assessments = useMemo<Assessment[]>(() => {\n return courses.slice(0, 16).map((course, index) => {\n const status: Assessment['status'] =\n index % 6 === 0 ? 'overdue' : index % 2 === 0 ? 'available' : 'completed';\n const passingScore = 70 + (index % 4) * 5;\n\n return {\n id: course.id,\n title: `${course.title} Assessment`,\n course: course.title,\n questions: Math.max(10, course.modules * 4),\n duration: `${Math.max(15, course.modules * 8)} min`,\n status,\n score:\n status === 'completed' ? Math.min(99, Math.round(course.rating * 20 + 20)) : undefined,\n dueDate: formatDate(new Date(BASE_TS + (index - 3) * 86400000 * 6).toISOString()),\n passingScore,\n };\n });\n }, [courses]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Assessments</h1>\n <p className=\"text-sm text-text-secondary\">Quizzes and exams for your enrolled courses</p>\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\">Available</CardTitle>\n <FileText className=\"h-4 w-4 text-blue-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n {assessments.filter((assessment) => assessment.status === 'available').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\">Completed</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n {assessments.filter((assessment) => assessment.status === 'completed').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\">Overdue</CardTitle>\n <Clock className=\"h-4 w-4 text-red-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n {assessments.filter((assessment) => assessment.status === 'overdue').length}\n </div>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>All Assessments</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {assessments.map((assessment) => (\n <div\n key={assessment.id}\n className=\"flex items-center justify-between rounded border p-4\"\n >\n <div>\n <p className=\"text-sm font-medium\">{assessment.title}</p>\n <p className=\"text-xs text-text-secondary\">\n {assessment.course} · {assessment.questions} questions · {assessment.duration}\n </p>\n <p className=\"text-xs text-text-secondary\">\n Due: {assessment.dueDate} · Passing: {assessment.passingScore}%\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n {assessment.status === 'completed' && assessment.score ? (\n <Badge\n variant={\n assessment.score >= assessment.passingScore ? 'default' : 'destructive'\n }\n className=\"text-[10px]\"\n >\n Score: {assessment.score}%\n </Badge>\n ) : null}\n <Badge\n variant={\n assessment.status === 'completed'\n ? 'default'\n : assessment.status === 'overdue'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {assessment.status}\n </Badge>\n {assessment.status === 'available' ? (\n <Button size=\"sm\">\n <Play className=\"mr-1 h-3 w-3\" />\n Start\n </Button>\n ) : null}\n {assessment.status === 'overdue' ? (\n <Button size=\"sm\" variant=\"destructive\">\n <Play className=\"mr-1 h-3 w-3\" />\n Take Now\n </Button>\n ) : null}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"LearningAssessmentsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningAssessmentsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle, Clock, FileText, Play } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype Assessment = {\n id: string;\n title: string;\n course: string;\n questions: number;\n duration: string;\n status: 'available' | 'completed' | 'overdue';\n score?: number;\n dueDate: string;\n passingScore: number;\n};\n\nconst BASE_TS = new Date('2026-03-01T00:00:00Z').getTime();\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\nexport function LearningAssessmentsPagePage() {\n const { courses } = useCrewFoundryStore();\n\n const assessments = useMemo<Assessment[]>(() => {\n return courses.slice(0, 16).map((course, index) => {\n const status: Assessment['status'] =\n index % 6 === 0 ? 'overdue' : index % 2 === 0 ? 'available' : 'completed';\n const passingScore = 70 + (index % 4) * 5;\n\n return {\n id: course.id,\n title: `${course.title} Assessment`,\n course: course.title,\n questions: Math.max(10, course.modules * 4),\n duration: `${Math.max(15, course.modules * 8)} min`,\n status,\n score:\n status === 'completed' ? Math.min(99, Math.round(course.rating * 20 + 20)) : undefined,\n dueDate: formatDate(new Date(BASE_TS + (index - 3) * 86400000 * 6).toISOString()),\n passingScore,\n };\n });\n }, [courses]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Assessments</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Quizzes and exams for your enrolled courses</p>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\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\">Available</CardTitle>\n <FileText className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {assessments.filter((assessment) => assessment.status === 'available').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\">Completed</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 {assessments.filter((assessment) => assessment.status === 'completed').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\">Overdue</CardTitle>\n <Clock className=\"h-4 w-4 text-status-error-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {assessments.filter((assessment) => assessment.status === 'overdue').length}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>All Assessments</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {assessments.map((assessment) => (\n <div\n key={assessment.id}\n className=\"flex items-center justify-between rounded border p-4\"\n >\n <div>\n <p className=\"text-sm font-medium\">{assessment.title}</p>\n <p className=\"text-xs text-text-secondary\">\n {assessment.course} · {assessment.questions} questions · {assessment.duration}\n </p>\n <p className=\"text-xs text-text-secondary\">\n Due: {assessment.dueDate} · Passing: {assessment.passingScore}%\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n {assessment.status === 'completed' && assessment.score ? (\n <Badge\n variant={\n assessment.score >= assessment.passingScore ? 'default' : 'destructive'\n }\n className=\"text-[10px]\"\n >\n Score: {assessment.score}%\n </Badge>\n ) : null}\n <Badge\n variant={\n assessment.status === 'completed'\n ? 'default'\n : assessment.status === 'overdue'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {assessment.status}\n </Badge>\n {assessment.status === 'available' ? (\n <Button size=\"sm\">\n <Play className=\"mr-1 h-3 w-3\" />\n Start\n </Button>\n ) : null}\n {assessment.status === 'overdue' ? (\n <Button size=\"sm\" variant=\"destructive\">\n <Play className=\"mr-1 h-3 w-3\" />\n Take Now\n </Button>\n ) : null}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -2,38 +2,38 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { useMemo as t } from "react";
3
3
  import { Award as n, Download as r, ExternalLink 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, CardHeader as d, CardTitle as f } from "@burdenoff/fe-libs/ui";
5
+ import { Badge as s, Button as c, Card as l, CardContent as u, CardHeader as d, CardTitle as f, GradientText as p } from "@burdenoff/fe-libs/ui";
6
6
  //#region src/crewfoundry/pages/LearningCertificatesPagePage.tsx
7
- var p = (/* @__PURE__ */ new Date("2026-03-01T00:00:00Z")).getTime(), m = (e) => {
7
+ var m = (/* @__PURE__ */ new Date("2026-03-01T00:00:00Z")).getTime(), h = (e) => {
8
8
  let t = new Date(e);
9
9
  return Number.isNaN(t.getTime()) ? "Unknown" : t.toISOString().split("T")[0];
10
10
  };
11
- function h() {
12
- let { courses: h, employees: g } = e(), _ = t(() => h.slice(0, 12).map((e, t) => {
13
- let n = g[t % Math.max(g.length, 1)]?.firstName && g[t % Math.max(g.length, 1)]?.lastName ? `${g[t % g.length].firstName} ${g[t % g.length].lastName}` : e.instructor;
11
+ function g() {
12
+ let { courses: g, employees: _ } = e(), v = t(() => g.slice(0, 12).map((e, t) => {
13
+ let n = _[t % Math.max(_.length, 1)]?.firstName && _[t % Math.max(_.length, 1)]?.lastName ? `${_[t % _.length].firstName} ${_[t % _.length].lastName}` : e.instructor;
14
14
  return {
15
15
  id: e.id,
16
16
  title: e.title,
17
- issueDate: m((/* @__PURE__ */ new Date(p - t * 864e5 * 12)).toISOString()),
17
+ issueDate: h((/* @__PURE__ */ new Date(m - t * 864e5 * 12)).toISOString()),
18
18
  instructor: n,
19
19
  credentialId: `CF-${e.id.slice(0, 6).toUpperCase()}-${t + 1}`,
20
20
  status: t % 5 == 0 ? "expiring" : "active",
21
- expiryDate: t % 5 == 0 ? m(new Date(p + 864e5 * (60 + t * 3)).toISOString()) : void 0
21
+ expiryDate: t % 5 == 0 ? h(new Date(m + 864e5 * (60 + t * 3)).toISOString()) : void 0
22
22
  };
23
- }), [h, g]);
23
+ }), [g, _]);
24
24
  return /* @__PURE__ */ o("div", {
25
25
  className: "space-y-6 p-6",
26
26
  children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
27
27
  className: "text-2xl font-semibold",
28
- children: "Certificates"
28
+ children: /* @__PURE__ */ a(p, { children: "Certificates" })
29
29
  }), /* @__PURE__ */ o("p", {
30
30
  className: "text-sm text-text-secondary",
31
- children: [_.length, " certificates earned"]
31
+ children: [v.length, " certificates earned"]
32
32
  })] }), /* @__PURE__ */ a("div", {
33
33
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
34
- children: _.map((e) => /* @__PURE__ */ o(l, { children: [/* @__PURE__ */ o(d, { children: [/* @__PURE__ */ o("div", {
34
+ children: v.map((e) => /* @__PURE__ */ o(l, { children: [/* @__PURE__ */ o(d, { children: [/* @__PURE__ */ o("div", {
35
35
  className: "flex items-center justify-between",
36
- children: [/* @__PURE__ */ a(n, { className: "h-8 w-8 text-yellow-500" }), /* @__PURE__ */ a(s, {
36
+ children: [/* @__PURE__ */ a(n, { className: "h-8 w-8 text-status-warning-text" }), /* @__PURE__ */ a(s, {
37
37
  variant: e.status === "active" ? "default" : "secondary",
38
38
  className: "text-[10px]",
39
39
  children: e.status
@@ -69,7 +69,7 @@ function h() {
69
69
  e.credentialId
70
70
  ] }),
71
71
  e.expiryDate ? /* @__PURE__ */ o("div", {
72
- className: "text-yellow-600",
72
+ className: "text-status-warning-text",
73
73
  children: [
74
74
  /* @__PURE__ */ a("span", {
75
75
  className: "text-xs",
@@ -98,6 +98,6 @@ function h() {
98
98
  });
99
99
  }
100
100
  //#endregion
101
- export { h as LearningCertificatesPagePage };
101
+ export { g as LearningCertificatesPagePage };
102
102
 
103
103
  //# sourceMappingURL=LearningCertificatesPagePage.js.map