@burdenoff/microfe-crewfoundry 2026.625.1 → 2026.626.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 +37 -29
  2. package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
  3. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +50 -42
  4. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  5. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +39 -31
  6. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
  7. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +52 -44
  8. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +46 -38
  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 +30 -22
  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 +86 -67
  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 +37 -29
  24. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
  25. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +29 -21
  26. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +25 -17
  28. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
  29. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +42 -35
  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 +41 -33
  34. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
  35. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +142 -108
  36. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  37. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +177 -136
  38. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  39. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +44 -36
  40. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
  41. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +49 -38
  42. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +26 -18
  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 +53 -46
  48. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  49. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +31 -23
  50. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  51. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +129 -90
  52. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/HiringJobsPagePage.js +96 -85
  54. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +26 -18
  56. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +47 -35
  58. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +33 -25
  60. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/HrPayrollPagePage.js +36 -28
  62. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +27 -19
  64. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +27 -19
  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 +111 -70
  70. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +65 -53
  72. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +35 -19
  74. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +33 -25
  76. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/LearningLearningPagePage.js +26 -18
  78. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  79. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +80 -55
  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 +31 -23
  84. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +29 -21
  86. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  87. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +35 -27
  88. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
  89. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +147 -112
  90. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  91. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +31 -27
  92. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +31 -23
  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 +75 -56
  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 +133 -92
  102. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  103. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +93 -52
  104. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  105. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +28 -20
  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 +25 -17
  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 +41 -33
  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 +103 -72
  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 +28 -20
  122. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  123. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +103 -62
  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":"LearningMyLearningPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningMyLearningPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Award, BookOpen, Clock, Play, Star } from 'lucide-react';\nimport {\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 { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype EnrolledCourse = {\n id: string;\n title: string;\n progress: number;\n modules: number;\n completedModules: number;\n instructor: string;\n dueDate: string;\n};\n\ntype CompletedCourse = {\n id: string;\n title: string;\n completedDate: string;\n rating: number;\n certificate: boolean;\n};\n\nconst BASE_TS = new Date('2026-03-01T00:00:00Z').getTime();\n\nconst isoDate = (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 LearningMyLearningPagePage() {\n const { courses } = useCrewFoundryStore();\n\n const myEnrolledCourses = useMemo<EnrolledCourse[]>(() => {\n return courses\n .filter((course) => course.status === 'active')\n .slice(0, 8)\n .map((course, index) => {\n const completedModules = Math.min(\n course.modules,\n Math.round((course.completed / Math.max(course.enrolled, 1)) * course.modules)\n );\n const progress = Math.round((completedModules / Math.max(course.modules, 1)) * 100);\n return {\n id: course.id,\n title: course.title,\n progress,\n modules: course.modules,\n completedModules,\n instructor: course.instructor,\n dueDate: isoDate(new Date(BASE_TS + (index + 1) * 86400000 * 12).toISOString()),\n };\n });\n }, [courses]);\n\n const completedCourses = useMemo<CompletedCourse[]>(() => {\n return courses\n .filter((course) => course.completed > 0)\n .slice(0, 8)\n .map((course, index) => ({\n id: `completed-${course.id}`,\n title: course.title,\n completedDate: isoDate(new Date(BASE_TS - (index + 1) * 86400000 * 15).toISOString()),\n rating: Number(course.rating.toFixed(1)),\n certificate: course.completed / Math.max(course.enrolled, 1) > 0.35,\n }));\n }, [courses]);\n\n const hoursLogged = myEnrolledCourses.reduce(\n (sum, course) => sum + course.completedModules * 1.25,\n 0\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>My Learning</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Track your learning progress and achievements</p>\n </div>\n\n <div className=\"grid gap-4 md: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\">In Progress</CardTitle>\n <BookOpen className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{myEnrolledCourses.length}</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 <Award className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{completedCourses.length}</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\">Hours Logged</CardTitle>\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{hoursLogged.toFixed(1)}</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\">Certificates</CardTitle>\n <Award className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {completedCourses.filter((course) => course.certificate).length}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>In Progress</CardTitle>\n <CardDescription>Continue where you left off</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {myEnrolledCourses.map((course) => (\n <div key={course.id} className=\"flex items-center gap-4 rounded border p-4\">\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">{course.title}</p>\n <p className=\"text-xs text-text-secondary\">\n {course.instructor} · Due {course.dueDate}\n </p>\n <div className=\"mt-2 flex items-center gap-2\">\n <div className=\"h-2 flex-1 overflow-hidden rounded bg-bg-sunken\">\n <div\n className=\"h-2 rounded bg-action-primary-bg\"\n style={{ width: `${course.progress}%` }}\n />\n </div>\n <span className=\"text-xs font-medium\">{course.progress}%</span>\n </div>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {course.completedModules}/{course.modules} modules\n </p>\n </div>\n <Button size=\"sm\">\n <Play className=\"mr-1 h-3 w-3\" />\n Continue\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Completed</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {completedCourses.map((course) => (\n <div key={course.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{course.title}</p>\n <p className=\"text-xs text-text-secondary\">Completed {course.completedDate}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {course.rating}/5\n </div>\n {course.certificate ? (\n <Badge variant=\"default\" className=\"text-[10px]\">\n Certificate\n </Badge>\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":"LearningMyLearningPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningMyLearningPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Award, BookOpen, Clock, Play, Star } from 'lucide-react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype EnrolledCourse = {\n id: string;\n title: string;\n progress: number;\n modules: number;\n completedModules: number;\n instructor: string;\n dueDate: string;\n};\n\ntype CompletedCourse = {\n id: string;\n title: string;\n completedDate: string;\n rating: number;\n certificate: boolean;\n};\n\nconst BASE_TS = new Date('2026-03-01T00:00:00Z').getTime();\n\nconst isoDate = (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 LearningMyLearningPagePage() {\n const { courses } = useCrewFoundryStore();\n\n const myEnrolledCourses = useMemo<EnrolledCourse[]>(() => {\n return courses\n .filter((course) => course.status === 'active')\n .slice(0, 8)\n .map((course, index) => {\n const completedModules = Math.min(\n course.modules,\n Math.round((course.completed / Math.max(course.enrolled, 1)) * course.modules)\n );\n const progress = Math.round((completedModules / Math.max(course.modules, 1)) * 100);\n return {\n id: course.id,\n title: course.title,\n progress,\n modules: course.modules,\n completedModules,\n instructor: course.instructor,\n dueDate: isoDate(new Date(BASE_TS + (index + 1) * 86400000 * 12).toISOString()),\n };\n });\n }, [courses]);\n\n const completedCourses = useMemo<CompletedCourse[]>(() => {\n return courses\n .filter((course) => course.completed > 0)\n .slice(0, 8)\n .map((course, index) => ({\n id: `completed-${course.id}`,\n title: course.title,\n completedDate: isoDate(new Date(BASE_TS - (index + 1) * 86400000 * 15).toISOString()),\n rating: Number(course.rating.toFixed(1)),\n certificate: course.completed / Math.max(course.enrolled, 1) > 0.35,\n }));\n }, [courses]);\n\n const hoursLogged = myEnrolledCourses.reduce(\n (sum, course) => sum + course.completedModules * 1.25,\n 0\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>My Learning</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Track your learning progress and achievements</p>\n <PagePurpose className=\"mt-1\">Everything you&apos;re currently learning — track your enrolled courses, progress, and certificates earned all in one place.</PagePurpose>\n </div>\n\n <div className=\"grid gap-4 md: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\">In Progress</CardTitle>\n <BookOpen className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{myEnrolledCourses.length}</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 <Award className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{completedCourses.length}</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\">Hours Logged</CardTitle>\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{hoursLogged.toFixed(1)}</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\">Certificates</CardTitle>\n <Award className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {completedCourses.filter((course) => course.certificate).length}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>In Progress</CardTitle>\n <CardDescription>Continue where you left off</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {myEnrolledCourses.map((course) => (\n <div key={course.id} className=\"flex items-center gap-4 rounded border p-4\">\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">{course.title}</p>\n <p className=\"text-xs text-text-secondary\">\n {course.instructor} · Due {course.dueDate}\n </p>\n <div className=\"mt-2 flex items-center gap-2\">\n <div className=\"h-2 flex-1 overflow-hidden rounded bg-bg-sunken\">\n <div\n className=\"h-2 rounded bg-action-primary-bg\"\n style={{ width: `${course.progress}%` }}\n />\n </div>\n <span className=\"text-xs font-medium\">{course.progress}%</span>\n </div>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {course.completedModules}/{course.modules} modules\n </p>\n </div>\n <Button size=\"sm\">\n <Play className=\"mr-1 h-3 w-3\" />\n Continue\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Completed</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {completedCourses.map((course) => (\n <div key={course.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{course.title}</p>\n <p className=\"text-xs text-text-secondary\">Completed {course.completedDate}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {course.rating}/5\n </div>\n {course.certificate ? (\n <Badge variant=\"default\" className=\"text-[10px]\">\n Certificate\n </Badge>\n ) : null}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -2,41 +2,48 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { useMemo as t } from "react";
3
3
  import { Calendar as n, CheckCircle as r, Clock as i, Plus 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, GlassCard as m, GradientText as h } 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/MarketplaceBookingManagementPagePage.tsx
7
- var g = (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
10
  };
11
- function _() {
12
- let { marketplaceServices: _, projects: v, teams: y } = e(), b = t(() => _.slice(0, 12).map((e, t) => {
13
- let n = v[t % Math.max(v.length, 1)], r = y[t % Math.max(y.length, 1)], i = e.status === "active" ? "confirmed" : e.status === "pending" ? "pending" : "completed";
11
+ function v() {
12
+ let { marketplaceServices: v, projects: y, teams: b } = e(), x = t(() => v.slice(0, 12).map((e, t) => {
13
+ let n = y[t % Math.max(y.length, 1)], r = b[t % Math.max(b.length, 1)], i = e.status === "active" ? "confirmed" : e.status === "pending" ? "pending" : "completed";
14
14
  return {
15
15
  id: e.id,
16
16
  service: e.title,
17
17
  provider: e.provider,
18
- date: g(n?.startDate || e.deliveryTime),
18
+ date: _(n?.startDate || e.deliveryTime),
19
19
  time: `${String(t % 12 + 1).padStart(2, "0")}:00 ${t % 2 == 0 ? "AM" : "PM"}`,
20
20
  duration: `${Math.max(1, Math.ceil((r?.memberCount || 4) / 4))} hours`,
21
21
  status: i
22
22
  };
23
23
  }), [
24
- _,
25
24
  v,
26
- y
25
+ y,
26
+ b
27
27
  ]);
28
28
  return /* @__PURE__ */ s("div", {
29
29
  className: "space-y-6 p-6",
30
30
  children: [
31
31
  /* @__PURE__ */ s("div", {
32
32
  className: "flex items-center justify-between",
33
- children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
34
- className: "text-2xl font-semibold",
35
- children: /* @__PURE__ */ o(h, { children: "Booking Management" })
36
- }), /* @__PURE__ */ o("p", {
37
- className: "text-sm text-text-secondary",
38
- children: "Manage service provider appointments"
39
- })] }), /* @__PURE__ */ s(l, {
33
+ children: [/* @__PURE__ */ s("div", { children: [
34
+ /* @__PURE__ */ o("h1", {
35
+ className: "text-2xl font-semibold",
36
+ children: /* @__PURE__ */ o(h, { children: "Booking Management" })
37
+ }),
38
+ /* @__PURE__ */ o("p", {
39
+ className: "text-sm text-text-secondary",
40
+ children: "Manage service provider appointments"
41
+ }),
42
+ /* @__PURE__ */ o(g, {
43
+ className: "mt-1",
44
+ children: "Manage your service bookings — review upcoming engagements, confirm schedules, and keep your client commitments on track."
45
+ })
46
+ ] }), /* @__PURE__ */ s(l, {
40
47
  size: "sm",
41
48
  children: [/* @__PURE__ */ o(a, { className: "mr-1 h-4 w-4" }), "New Booking"]
42
49
  })]
@@ -45,7 +52,8 @@ function _() {
45
52
  className: "grid gap-4 md:grid-cols-3",
46
53
  children: [
47
54
  /* @__PURE__ */ s(m, {
48
- treatment: "metric",
55
+ treatment: "glass",
56
+ glow: !0,
49
57
  className: "border-border-seam",
50
58
  children: [/* @__PURE__ */ s(f, {
51
59
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
@@ -55,7 +63,7 @@ function _() {
55
63
  }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-status-info-text" })]
56
64
  }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
57
65
  className: "text-2xl font-bold tabular-nums",
58
- children: b.filter((e) => e.status !== "completed").length
66
+ children: x.filter((e) => e.status !== "completed").length
59
67
  }) })]
60
68
  }),
61
69
  /* @__PURE__ */ s(m, {
@@ -69,7 +77,7 @@ function _() {
69
77
  }), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-status-success-text" })]
70
78
  }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
71
79
  className: "text-2xl font-bold tabular-nums",
72
- children: b.filter((e) => e.status === "confirmed").length
80
+ children: x.filter((e) => e.status === "confirmed").length
73
81
  }) })]
74
82
  }),
75
83
  /* @__PURE__ */ s(m, {
@@ -83,14 +91,14 @@ function _() {
83
91
  }), /* @__PURE__ */ o(i, { className: "h-4 w-4 text-status-warning-text" })]
84
92
  }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
85
93
  className: "text-2xl font-bold tabular-nums",
86
- children: b.filter((e) => e.status === "pending").length
94
+ children: x.filter((e) => e.status === "pending").length
87
95
  }) })]
88
96
  })
89
97
  ]
90
98
  }),
91
99
  /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o(f, { children: /* @__PURE__ */ o(p, { children: "All Bookings" }) }), /* @__PURE__ */ o(d, {
92
100
  className: "space-y-3",
93
- children: b.map((e) => /* @__PURE__ */ s("div", {
101
+ children: x.map((e) => /* @__PURE__ */ s("div", {
94
102
  className: "flex items-center justify-between rounded border p-4",
95
103
  children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
96
104
  className: "text-sm font-medium",
@@ -125,6 +133,6 @@ function _() {
125
133
  });
126
134
  }
127
135
  //#endregion
128
- export { _ as MarketplaceBookingManagementPagePage };
136
+ export { v as MarketplaceBookingManagementPagePage };
129
137
 
130
138
  //# sourceMappingURL=MarketplaceBookingManagementPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MarketplaceBookingManagementPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceBookingManagementPagePage.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 { Calendar, CheckCircle, Clock, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype Booking = {\n id: string;\n service: string;\n provider: string;\n date: string;\n time: string;\n duration: string;\n status: 'confirmed' | 'pending' | 'completed';\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\nexport function MarketplaceBookingManagementPagePage() {\n const { marketplaceServices, projects, teams } = useCrewFoundryStore();\n\n const bookings = useMemo<Booking[]>(() => {\n return marketplaceServices.slice(0, 12).map((service, index) => {\n const project = projects[index % Math.max(projects.length, 1)];\n const team = teams[index % Math.max(teams.length, 1)];\n const status: Booking['status'] =\n service.status === 'active'\n ? 'confirmed'\n : service.status === 'pending'\n ? 'pending'\n : 'completed';\n\n return {\n id: service.id,\n service: service.title,\n provider: service.provider,\n date: formatDate(project?.startDate || service.deliveryTime),\n time: `${String((index % 12) + 1).padStart(2, '0')}:00 ${index % 2 === 0 ? 'AM' : 'PM'}`,\n duration: `${Math.max(1, Math.ceil((team?.memberCount || 4) / 4))} hours`,\n status,\n };\n });\n }, [marketplaceServices, projects, teams]);\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>Booking Management</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage service provider appointments</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-1 h-4 w-4\" />\n New Booking\n </Button>\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\">Upcoming</CardTitle>\n <Calendar className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {bookings.filter((booking) => booking.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\">Confirmed</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 {bookings.filter((booking) => booking.status === 'confirmed').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\">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\">\n {bookings.filter((booking) => booking.status === 'pending').length}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>All Bookings</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {bookings.map((booking) => (\n <div key={booking.id} className=\"flex items-center justify-between rounded border p-4\">\n <div>\n <p className=\"text-sm font-medium\">{booking.service}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider}</p>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"text-right text-xs\">\n <p className=\"font-medium\">{booking.date}</p>\n <p className=\"text-text-secondary\">\n {booking.time} · {booking.duration}\n </p>\n </div>\n <Badge\n variant={\n booking.status === 'confirmed'\n ? 'default'\n : booking.status === 'completed'\n ? 'secondary'\n : 'outline'\n }\n className=\"text-[10px]\"\n >\n {booking.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":"MarketplaceBookingManagementPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceBookingManagementPagePage.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 { Calendar, CheckCircle, Clock, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype Booking = {\n id: string;\n service: string;\n provider: string;\n date: string;\n time: string;\n duration: string;\n status: 'confirmed' | 'pending' | 'completed';\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\nexport function MarketplaceBookingManagementPagePage() {\n const { marketplaceServices, projects, teams } = useCrewFoundryStore();\n\n const bookings = useMemo<Booking[]>(() => {\n return marketplaceServices.slice(0, 12).map((service, index) => {\n const project = projects[index % Math.max(projects.length, 1)];\n const team = teams[index % Math.max(teams.length, 1)];\n const status: Booking['status'] =\n service.status === 'active'\n ? 'confirmed'\n : service.status === 'pending'\n ? 'pending'\n : 'completed';\n\n return {\n id: service.id,\n service: service.title,\n provider: service.provider,\n date: formatDate(project?.startDate || service.deliveryTime),\n time: `${String((index % 12) + 1).padStart(2, '0')}:00 ${index % 2 === 0 ? 'AM' : 'PM'}`,\n duration: `${Math.max(1, Math.ceil((team?.memberCount || 4) / 4))} hours`,\n status,\n };\n });\n }, [marketplaceServices, projects, teams]);\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>Booking Management</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage service provider appointments</p>\n <PagePurpose className=\"mt-1\">Manage your service bookings — review upcoming engagements, confirm schedules, and keep your client commitments on track.</PagePurpose>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-1 h-4 w-4\" />\n New Booking\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\">Upcoming</CardTitle>\n <Calendar className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {bookings.filter((booking) => booking.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\">Confirmed</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 {bookings.filter((booking) => booking.status === 'confirmed').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\">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\">\n {bookings.filter((booking) => booking.status === 'pending').length}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>All Bookings</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {bookings.map((booking) => (\n <div key={booking.id} className=\"flex items-center justify-between rounded border p-4\">\n <div>\n <p className=\"text-sm font-medium\">{booking.service}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider}</p>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"text-right text-xs\">\n <p className=\"font-medium\">{booking.date}</p>\n <p className=\"text-text-secondary\">\n {booking.time} · {booking.duration}\n </p>\n </div>\n <Badge\n variant={\n booking.status === 'confirmed'\n ? 'default'\n : booking.status === 'completed'\n ? 'secondary'\n : 'outline'\n }\n className=\"text-[10px]\"\n >\n {booking.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -2,46 +2,54 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { useMemo as t } from "react";
3
3
  import { ArrowUp as n, DollarSign as r, TrendingUp as i, Wallet as a } from "lucide-react";
4
4
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
- import { Badge as c, Card as l, CardContent as u, CardHeader as d, CardTitle as f, GlassCard as p, GradientText as m } from "@burdenoff/fe-libs/ui";
5
+ import { Badge as c, Card as l, CardContent as u, CardHeader as d, CardTitle as f, GlassCard as p, GradientText as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
6
6
  //#region src/crewfoundry/pages/MarketplaceEarningsPagePage.tsx
7
- var h = (e) => {
7
+ var g = (e) => {
8
8
  let t = new Date(e);
9
9
  return Number.isNaN(t.getTime()) ? "N/A" : t.toLocaleString("en-US", { month: "short" });
10
- }, g = (e) => {
10
+ }, _ = (e) => {
11
11
  let t = new Date(e);
12
12
  return Number.isNaN(t.getTime()) ? "Unknown" : t.toISOString().split("T")[0];
13
13
  };
14
- function _() {
15
- let { invoices: _, marketplaceServices: v, clients: y } = e(), b = t(() => _.slice(0, 12).map((e, t) => ({
14
+ function v() {
15
+ let { invoices: v, marketplaceServices: y, clients: b } = e(), x = t(() => v.slice(0, 12).map((e, t) => ({
16
16
  id: e.id,
17
17
  client: e.clientName,
18
- service: v[t % Math.max(v.length, 1)]?.title || "Marketplace Service",
18
+ service: y[t % Math.max(y.length, 1)]?.title || "Marketplace Service",
19
19
  amount: e.amount,
20
- date: g(e.issueDate),
20
+ date: _(e.issueDate),
21
21
  status: e.status === "paid" ? "completed" : "pending"
22
- })), [_, v]), x = t(() => b.slice(0, 6).map((e, t) => {
23
- let n = b.filter((t) => h(t.date) === h(e.date)), r = n.reduce((e, t) => e + t.amount, 0);
22
+ })), [v, y]), S = t(() => x.slice(0, 6).map((e, t) => {
23
+ let n = x.filter((t) => g(t.date) === g(e.date)), r = n.reduce((e, t) => e + t.amount, 0);
24
24
  return {
25
- month: h(e.date) || `M${t + 1}`,
25
+ month: g(e.date) || `M${t + 1}`,
26
26
  amount: r,
27
27
  orders: n.length
28
28
  };
29
- }), [b]), S = x.reduce((e, t) => e + t.amount, 0), C = Math.max(1, ...x.map((e) => e.amount)), w = x.reduce((e, t) => e + t.orders, 0), T = b.filter((e) => e.status === "pending").reduce((e, t) => e + t.amount, 0), E = y.length > 0 ? Math.round(w / y.length * 100) : 0;
29
+ }), [x]), C = S.reduce((e, t) => e + t.amount, 0), w = Math.max(1, ...S.map((e) => e.amount)), T = S.reduce((e, t) => e + t.orders, 0), E = x.filter((e) => e.status === "pending").reduce((e, t) => e + t.amount, 0), D = b.length > 0 ? Math.round(T / b.length * 100) : 0;
30
30
  return /* @__PURE__ */ s("div", {
31
31
  className: "space-y-6 p-6",
32
32
  children: [
33
- /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
34
- className: "text-2xl font-semibold",
35
- children: /* @__PURE__ */ o(m, { children: "Earnings" })
36
- }), /* @__PURE__ */ o("p", {
37
- className: "text-sm text-text-secondary",
38
- children: "Revenue from marketplace services"
39
- })] }),
33
+ /* @__PURE__ */ s("div", { children: [
34
+ /* @__PURE__ */ o("h1", {
35
+ className: "text-2xl font-semibold",
36
+ children: /* @__PURE__ */ o(m, { children: "Earnings" })
37
+ }),
38
+ /* @__PURE__ */ o("p", {
39
+ className: "text-sm text-text-secondary",
40
+ children: "Revenue from marketplace services"
41
+ }),
42
+ /* @__PURE__ */ o(h, {
43
+ className: "mt-1",
44
+ children: "Track what you've earned on the marketplace — payouts, pending balances, and earning trends so you always know where you stand."
45
+ })
46
+ ] }),
40
47
  /* @__PURE__ */ s("div", {
41
48
  className: "grid gap-4 md:grid-cols-3",
42
49
  children: [
43
50
  /* @__PURE__ */ s(p, {
44
- treatment: "metric",
51
+ treatment: "glass",
52
+ glow: !0,
45
53
  className: "border-border-seam",
46
54
  children: [/* @__PURE__ */ s(d, {
47
55
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
@@ -51,13 +59,13 @@ function _() {
51
59
  }), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-text-secondary" })]
52
60
  }), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s("div", {
53
61
  className: "text-2xl font-bold tabular-nums",
54
- children: ["$", S.toLocaleString()]
62
+ children: ["$", C.toLocaleString()]
55
63
  }), /* @__PURE__ */ s("div", {
56
64
  className: "flex items-center text-xs text-status-success-text",
57
65
  children: [
58
66
  /* @__PURE__ */ o(n, { className: "mr-1 h-3 w-3" }),
59
67
  "+",
60
- E,
68
+ D,
61
69
  "% from recent cycle"
62
70
  ]
63
71
  })] })]
@@ -73,7 +81,7 @@ function _() {
73
81
  }), /* @__PURE__ */ o(i, { className: "h-4 w-4 text-text-secondary" })]
74
82
  }), /* @__PURE__ */ o(u, { children: /* @__PURE__ */ s("div", {
75
83
  className: "text-2xl font-bold tabular-nums",
76
- children: ["$", Math.round(S / Math.max(w, 1)).toLocaleString()]
84
+ children: ["$", Math.round(C / Math.max(T, 1)).toLocaleString()]
77
85
  }) })]
78
86
  }),
79
87
  /* @__PURE__ */ s(p, {
@@ -87,14 +95,14 @@ function _() {
87
95
  }), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-status-warning-text" })]
88
96
  }), /* @__PURE__ */ o(u, { children: /* @__PURE__ */ s("div", {
89
97
  className: "text-2xl font-bold tabular-nums",
90
- children: ["$", T.toLocaleString()]
98
+ children: ["$", E.toLocaleString()]
91
99
  }) })]
92
100
  })
93
101
  ]
94
102
  }),
95
103
  /* @__PURE__ */ s(l, { children: [/* @__PURE__ */ o(d, { children: /* @__PURE__ */ o(f, { children: "Earnings Trend" }) }), /* @__PURE__ */ o(u, {
96
104
  className: "space-y-3",
97
- children: x.map((e, t) => /* @__PURE__ */ s("div", {
105
+ children: S.map((e, t) => /* @__PURE__ */ s("div", {
98
106
  className: "flex items-center gap-3",
99
107
  children: [
100
108
  /* @__PURE__ */ o("span", {
@@ -105,7 +113,7 @@ function _() {
105
113
  className: "h-4 flex-1 overflow-hidden rounded bg-bg-sunken",
106
114
  children: /* @__PURE__ */ o("div", {
107
115
  className: "h-4 rounded bg-action-primary-bg",
108
- style: { width: `${Math.round(e.amount / C * 100)}%` }
116
+ style: { width: `${Math.round(e.amount / w * 100)}%` }
109
117
  })
110
118
  }),
111
119
  /* @__PURE__ */ s("span", {
@@ -126,7 +134,7 @@ function _() {
126
134
  })] }),
127
135
  /* @__PURE__ */ s(l, { children: [/* @__PURE__ */ o(d, { children: /* @__PURE__ */ o(f, { children: "Recent Payments" }) }), /* @__PURE__ */ o(u, {
128
136
  className: "space-y-3",
129
- children: b.map((e) => /* @__PURE__ */ s("div", {
137
+ children: x.map((e) => /* @__PURE__ */ s("div", {
130
138
  className: "flex items-center justify-between rounded border p-3",
131
139
  children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
132
140
  className: "text-sm font-medium",
@@ -155,6 +163,6 @@ function _() {
155
163
  });
156
164
  }
157
165
  //#endregion
158
- export { _ as MarketplaceEarningsPagePage };
166
+ export { v as MarketplaceEarningsPagePage };
159
167
 
160
168
  //# sourceMappingURL=MarketplaceEarningsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MarketplaceEarningsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceEarningsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowUp, DollarSign, TrendingUp, Wallet } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype EarningPoint = {\n month: string;\n amount: number;\n orders: number;\n};\n\ntype PaymentItem = {\n id: string;\n client: string;\n service: string;\n amount: number;\n date: string;\n status: 'completed' | 'pending';\n};\n\nconst monthLabel = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'N/A';\n }\n return parsed.toLocaleString('en-US', { month: 'short' });\n};\n\nconst isoDate = (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 MarketplaceEarningsPagePage() {\n const { invoices, marketplaceServices, clients } = useCrewFoundryStore();\n\n const recentPayments = useMemo<PaymentItem[]>(() => {\n return invoices.slice(0, 12).map((invoice, index) => ({\n id: invoice.id,\n client: invoice.clientName,\n service:\n marketplaceServices[index % Math.max(marketplaceServices.length, 1)]?.title ||\n 'Marketplace Service',\n amount: invoice.amount,\n date: isoDate(invoice.issueDate),\n status: invoice.status === 'paid' ? 'completed' : 'pending',\n }));\n }, [invoices, marketplaceServices]);\n\n const earningsData = useMemo<EarningPoint[]>(() => {\n return recentPayments.slice(0, 6).map((payment, index) => {\n const sibling = recentPayments.filter(\n (item) => monthLabel(item.date) === monthLabel(payment.date)\n );\n const amount = sibling.reduce((sum, item) => sum + item.amount, 0);\n return {\n month: monthLabel(payment.date) || `M${index + 1}`,\n amount,\n orders: sibling.length,\n };\n });\n }, [recentPayments]);\n\n const totalEarnings = earningsData.reduce((sum, point) => sum + point.amount, 0);\n const maxEarning = Math.max(1, ...earningsData.map((point) => point.amount));\n const totalOrders = earningsData.reduce((sum, point) => sum + point.orders, 0);\n const pendingAmount = recentPayments\n .filter((payment) => payment.status === 'pending')\n .reduce((sum, payment) => sum + payment.amount, 0);\n const growthBase = clients.length > 0 ? Math.round((totalOrders / clients.length) * 100) : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Earnings</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Revenue from marketplace services</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\">Total Earnings</CardTitle>\n <DollarSign className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalEarnings.toLocaleString()}</div>\n <div className=\"flex items-center text-xs text-status-success-text\">\n <ArrowUp className=\"mr-1 h-3 w-3\" />+{growthBase}% from recent cycle\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\">Avg Order Value</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n ${Math.round(totalEarnings / Math.max(totalOrders, 1)).toLocaleString()}\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\">Pending</CardTitle>\n <Wallet className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${pendingAmount.toLocaleString()}</div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Earnings Trend</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {earningsData.map((earning, index) => (\n <div key={`${earning.month}-${index}`} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-sm text-text-secondary\">{earning.month}</span>\n <div className=\"h-4 flex-1 overflow-hidden rounded bg-bg-sunken\">\n <div\n className=\"h-4 rounded bg-action-primary-bg\"\n style={{ width: `${Math.round((earning.amount / maxEarning) * 100)}%` }}\n />\n </div>\n <span className=\"w-16 text-right text-sm font-medium\">\n ${(earning.amount / 1000).toFixed(1)}K\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {earning.orders} orders\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Recent Payments</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {recentPayments.map((payment) => (\n <div key={payment.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{payment.client}</p>\n <p className=\"text-xs text-text-secondary\">\n {payment.service} · {payment.date}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-bold\">${payment.amount.toLocaleString()}</span>\n <Badge\n variant={payment.status === 'completed' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {payment.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":"MarketplaceEarningsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceEarningsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowUp, DollarSign, TrendingUp, Wallet } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype EarningPoint = {\n month: string;\n amount: number;\n orders: number;\n};\n\ntype PaymentItem = {\n id: string;\n client: string;\n service: string;\n amount: number;\n date: string;\n status: 'completed' | 'pending';\n};\n\nconst monthLabel = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'N/A';\n }\n return parsed.toLocaleString('en-US', { month: 'short' });\n};\n\nconst isoDate = (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 MarketplaceEarningsPagePage() {\n const { invoices, marketplaceServices, clients } = useCrewFoundryStore();\n\n const recentPayments = useMemo<PaymentItem[]>(() => {\n return invoices.slice(0, 12).map((invoice, index) => ({\n id: invoice.id,\n client: invoice.clientName,\n service:\n marketplaceServices[index % Math.max(marketplaceServices.length, 1)]?.title ||\n 'Marketplace Service',\n amount: invoice.amount,\n date: isoDate(invoice.issueDate),\n status: invoice.status === 'paid' ? 'completed' : 'pending',\n }));\n }, [invoices, marketplaceServices]);\n\n const earningsData = useMemo<EarningPoint[]>(() => {\n return recentPayments.slice(0, 6).map((payment, index) => {\n const sibling = recentPayments.filter(\n (item) => monthLabel(item.date) === monthLabel(payment.date)\n );\n const amount = sibling.reduce((sum, item) => sum + item.amount, 0);\n return {\n month: monthLabel(payment.date) || `M${index + 1}`,\n amount,\n orders: sibling.length,\n };\n });\n }, [recentPayments]);\n\n const totalEarnings = earningsData.reduce((sum, point) => sum + point.amount, 0);\n const maxEarning = Math.max(1, ...earningsData.map((point) => point.amount));\n const totalOrders = earningsData.reduce((sum, point) => sum + point.orders, 0);\n const pendingAmount = recentPayments\n .filter((payment) => payment.status === 'pending')\n .reduce((sum, payment) => sum + payment.amount, 0);\n const growthBase = clients.length > 0 ? Math.round((totalOrders / clients.length) * 100) : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Earnings</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Revenue from marketplace services</p>\n <PagePurpose className=\"mt-1\">Track what you&apos;ve earned on the marketplace — payouts, pending balances, and earning trends so you always know where you stand.</PagePurpose>\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\">Total Earnings</CardTitle>\n <DollarSign className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalEarnings.toLocaleString()}</div>\n <div className=\"flex items-center text-xs text-status-success-text\">\n <ArrowUp className=\"mr-1 h-3 w-3\" />+{growthBase}% from recent cycle\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\">Avg Order Value</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n ${Math.round(totalEarnings / Math.max(totalOrders, 1)).toLocaleString()}\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\">Pending</CardTitle>\n <Wallet className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${pendingAmount.toLocaleString()}</div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Earnings Trend</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {earningsData.map((earning, index) => (\n <div key={`${earning.month}-${index}`} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-sm text-text-secondary\">{earning.month}</span>\n <div className=\"h-4 flex-1 overflow-hidden rounded bg-bg-sunken\">\n <div\n className=\"h-4 rounded bg-action-primary-bg\"\n style={{ width: `${Math.round((earning.amount / maxEarning) * 100)}%` }}\n />\n </div>\n <span className=\"w-16 text-right text-sm font-medium\">\n ${(earning.amount / 1000).toFixed(1)}K\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {earning.orders} orders\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Recent Payments</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {recentPayments.map((payment) => (\n <div key={payment.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{payment.client}</p>\n <p className=\"text-xs text-text-secondary\">\n {payment.service} · {payment.date}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-bold\">${payment.amount.toLocaleString()}</span>\n <Badge\n variant={payment.status === 'completed' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {payment.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}