@burdenoff/microfe-crewfoundry 2026.625.1 → 2026.625.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/crewfoundry/pages/AdminAdminPagePage.js +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":"HelpApiDocumentationPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HelpApiDocumentationPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GradientText,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport {\n BookOpen,\n ChevronRight,\n Code2,\n Copy,\n ExternalLink,\n Lock,\n Search,\n Server,\n Zap,\n} from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nconst methodColors: Record<string, string> = {\n GET: 'bg-status-success-bg text-status-success-text',\n POST: 'bg-status-info-bg text-status-info-text',\n PATCH: 'bg-status-warning-bg text-status-warning-text',\n DELETE: 'bg-status-error-bg text-status-error-text',\n};\n\nexport function HelpApiDocumentationPagePage() {\n const { employees, jobPostings, candidates, payrollRecords, leaveRequests } =\n useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [copiedPath, setCopiedPath] = useState<string | null>(null);\n\n const apiSections = useMemo(\n () => [\n {\n name: 'Employees',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/employees',\n description: `List all employees (${employees.length} records) with pagination and filters`,\n },\n {\n method: 'POST',\n path: '/api/v2/employees',\n description: 'Create a new employee record',\n },\n {\n method: 'GET',\n path: '/api/v2/employees/:id',\n description: 'Get employee details by ID',\n },\n {\n method: 'PATCH',\n path: '/api/v2/employees/:id',\n description: 'Update employee information',\n },\n {\n method: 'DELETE',\n path: '/api/v2/employees/:id',\n description: 'Deactivate an employee record',\n },\n ],\n },\n {\n name: 'Hiring',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/jobs',\n description: `List all job postings (${jobPostings.length} total)`,\n },\n { method: 'POST', path: '/api/v2/jobs', description: 'Create a new job posting' },\n {\n method: 'GET',\n path: '/api/v2/candidates',\n description: `List candidates (${candidates.length}) with pipeline filters`,\n },\n {\n method: 'POST',\n path: '/api/v2/candidates',\n description: 'Add a new candidate to the pipeline',\n },\n ],\n },\n {\n name: 'Payroll',\n version: 'v1',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v1/payroll/records',\n description: `List payroll records by period (${payrollRecords.length} loaded)`,\n },\n {\n method: 'POST',\n path: '/api/v1/payroll/run',\n description: 'Trigger payroll processing',\n },\n {\n method: 'GET',\n path: '/api/v1/payroll/reports',\n description: 'Generate payroll reports',\n },\n ],\n },\n {\n name: 'Leave',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/leave/requests',\n description: `List leave requests with status filters (${leaveRequests.length} total)`,\n },\n {\n method: 'POST',\n path: '/api/v2/leave/requests',\n description: 'Submit a new leave request',\n },\n {\n method: 'PATCH',\n path: '/api/v2/leave/requests/:id/approve',\n description: 'Approve a leave request',\n },\n ],\n },\n ],\n [\n candidates.length,\n employees.length,\n jobPostings.length,\n leaveRequests.length,\n payrollRecords.length,\n ]\n );\n\n const handleCopy = (path: string) => {\n setCopiedPath(path);\n setTimeout(() => setCopiedPath(null), 1500);\n };\n\n const filteredSections = apiSections\n .map((section) => ({\n ...section,\n endpoints: section.endpoints.filter(\n (ep) =>\n ep.path.toLowerCase().includes(search.toLowerCase()) ||\n ep.description.toLowerCase().includes(search.toLowerCase())\n ),\n }))\n .filter((s) => s.endpoints.length > 0);\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>API Documentation</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n CrewFoundry REST API reference for integrations\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Badge variant=\"secondary\">Base URL: api.crewfoundry.com</Badge>\n <Button size=\"sm\" variant=\"outline\">\n <ExternalLink className=\"h-3 w-3 mr-1\" />\n OpenAPI Spec\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {[\n { icon: Server, label: 'REST API', value: 'v2.1.0', color: 'text-status-info-text' },\n {\n icon: Code2,\n label: 'GraphQL',\n value: 'Federation v2',\n color: 'text-action-primary-bg',\n },\n {\n icon: Lock,\n label: 'Auth',\n value: 'OAuth 2.0 + JWT',\n color: 'text-status-success-text',\n },\n {\n icon: Zap,\n label: 'Rate Limit',\n value: '1,000 req/min',\n color: 'text-status-warning-text',\n },\n ].map((item) => (\n <Card key={item.label}>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <item.icon className={`h-5 w-5 ${item.color}`} />\n <div>\n <p className=\"text-xs text-text-secondary\">{item.label}</p>\n <p className=\"text-sm font-medium\">{item.value}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-4\">\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Quick Start</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {[\n { icon: BookOpen, label: 'Authentication Guide' },\n { icon: Code2, label: 'SDK Reference' },\n { icon: Zap, label: 'Webhooks' },\n { icon: Server, label: 'Rate Limiting' },\n ].map((link) => (\n <button\n key={link.label}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-bg-sunken transition-colors\"\n >\n <link.icon className=\"h-3 w-3 text-text-secondary\" />\n <span>{link.label}</span>\n <ChevronRight className=\"h-3 w-3 ml-auto text-text-secondary\" />\n </button>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Authentication</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <code className=\"text-xs font-mono\">Authorization: Bearer {'<token>'}</code>\n </div>\n <p className=\"text-xs text-text-secondary\">\n All API requests require a valid JWT token obtained through the OAuth 2.0 flow.\n </p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"lg:col-span-3 space-y-4\">\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search endpoints...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n\n {filteredSections.map((section) => (\n <Card key={section.name}>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <CardTitle className=\"text-base\">{section.name}</CardTitle>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {section.version}\n </Badge>\n </div>\n <CardDescription>{section.endpoints.length} endpoints</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {section.endpoints.map((ep, i) => (\n <div\n key={ep.path + ep.method}\n className={`flex items-center gap-3 px-6 py-3 hover:bg-bg-sunken/50 cursor-pointer ${i < section.endpoints.length - 1 ? 'border-b' : ''}`}\n >\n <Badge\n className={`${methodColors[ep.method]} text-[10px] font-mono border-0 min-w-[50px] justify-center`}\n >\n {ep.method}\n </Badge>\n <code className=\"text-sm font-mono flex-1\">{ep.path}</code>\n <span className=\"text-xs text-text-secondary hidden lg:block max-w-[250px] truncate\">\n {ep.description}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0\"\n onClick={() => handleCopy(ep.path)}\n >\n <Copy\n className={`h-3 w-3 ${copiedPath === ep.path ? 'text-status-success-text' : 'text-text-secondary'}`}\n />\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n\n {filteredSections.length === 0 && (\n <div className=\"rounded-lg border p-8 text-center text-sm text-text-secondary\">\n No endpoints match your search criteria.\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HelpApiDocumentationPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HelpApiDocumentationPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport {\n BookOpen,\n ChevronRight,\n Code2,\n Copy,\n ExternalLink,\n Lock,\n Search,\n Server,\n Zap,\n} from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nconst methodColors: Record<string, string> = {\n GET: 'bg-status-success-bg text-status-success-text',\n POST: 'bg-status-info-bg text-status-info-text',\n PATCH: 'bg-status-warning-bg text-status-warning-text',\n DELETE: 'bg-status-error-bg text-status-error-text',\n};\n\nexport function HelpApiDocumentationPagePage() {\n const { employees, jobPostings, candidates, payrollRecords, leaveRequests } =\n useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [copiedPath, setCopiedPath] = useState<string | null>(null);\n\n const apiSections = useMemo(\n () => [\n {\n name: 'Employees',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/employees',\n description: `List all employees (${employees.length} records) with pagination and filters`,\n },\n {\n method: 'POST',\n path: '/api/v2/employees',\n description: 'Create a new employee record',\n },\n {\n method: 'GET',\n path: '/api/v2/employees/:id',\n description: 'Get employee details by ID',\n },\n {\n method: 'PATCH',\n path: '/api/v2/employees/:id',\n description: 'Update employee information',\n },\n {\n method: 'DELETE',\n path: '/api/v2/employees/:id',\n description: 'Deactivate an employee record',\n },\n ],\n },\n {\n name: 'Hiring',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/jobs',\n description: `List all job postings (${jobPostings.length} total)`,\n },\n { method: 'POST', path: '/api/v2/jobs', description: 'Create a new job posting' },\n {\n method: 'GET',\n path: '/api/v2/candidates',\n description: `List candidates (${candidates.length}) with pipeline filters`,\n },\n {\n method: 'POST',\n path: '/api/v2/candidates',\n description: 'Add a new candidate to the pipeline',\n },\n ],\n },\n {\n name: 'Payroll',\n version: 'v1',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v1/payroll/records',\n description: `List payroll records by period (${payrollRecords.length} loaded)`,\n },\n {\n method: 'POST',\n path: '/api/v1/payroll/run',\n description: 'Trigger payroll processing',\n },\n {\n method: 'GET',\n path: '/api/v1/payroll/reports',\n description: 'Generate payroll reports',\n },\n ],\n },\n {\n name: 'Leave',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/leave/requests',\n description: `List leave requests with status filters (${leaveRequests.length} total)`,\n },\n {\n method: 'POST',\n path: '/api/v2/leave/requests',\n description: 'Submit a new leave request',\n },\n {\n method: 'PATCH',\n path: '/api/v2/leave/requests/:id/approve',\n description: 'Approve a leave request',\n },\n ],\n },\n ],\n [\n candidates.length,\n employees.length,\n jobPostings.length,\n leaveRequests.length,\n payrollRecords.length,\n ]\n );\n\n const handleCopy = (path: string) => {\n setCopiedPath(path);\n setTimeout(() => setCopiedPath(null), 1500);\n };\n\n const filteredSections = apiSections\n .map((section) => ({\n ...section,\n endpoints: section.endpoints.filter(\n (ep) =>\n ep.path.toLowerCase().includes(search.toLowerCase()) ||\n ep.description.toLowerCase().includes(search.toLowerCase())\n ),\n }))\n .filter((s) => s.endpoints.length > 0);\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>API Documentation</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n CrewFoundry REST API reference for integrations\n </p>\n <PagePurpose className=\"mt-1\">Browse the CrewFoundry API reference — use it to find endpoints, understand request formats, and integrate CrewFoundry with your own tools.</PagePurpose>\n </div>\n <div className=\"flex gap-2\">\n <Badge variant=\"secondary\">Base URL: api.crewfoundry.com</Badge>\n <Button size=\"sm\" variant=\"outline\">\n <ExternalLink className=\"h-3 w-3 mr-1\" />\n OpenAPI Spec\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {[\n { icon: Server, label: 'REST API', value: 'v2.1.0', color: 'text-status-info-text' },\n {\n icon: Code2,\n label: 'GraphQL',\n value: 'Federation v2',\n color: 'text-action-primary-bg',\n },\n {\n icon: Lock,\n label: 'Auth',\n value: 'OAuth 2.0 + JWT',\n color: 'text-status-success-text',\n },\n {\n icon: Zap,\n label: 'Rate Limit',\n value: '1,000 req/min',\n color: 'text-status-warning-text',\n },\n ].map((item) => (\n <Card key={item.label}>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <item.icon className={`h-5 w-5 ${item.color}`} />\n <div>\n <p className=\"text-xs text-text-secondary\">{item.label}</p>\n <p className=\"text-sm font-medium\">{item.value}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-4\">\n <div className=\"space-y-4\">\n <EmphasisPanel>\n <div className=\"mb-2 text-sm font-semibold\">Quick Start</div>\n <div className=\"space-y-2\">\n {[\n { icon: BookOpen, label: 'Authentication Guide' },\n { icon: Code2, label: 'SDK Reference' },\n { icon: Zap, label: 'Webhooks' },\n { icon: Server, label: 'Rate Limiting' },\n ].map((link) => (\n <button\n key={link.label}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-bg-sunken transition-colors\"\n >\n <link.icon className=\"h-3 w-3 text-text-secondary\" />\n <span>{link.label}</span>\n <ChevronRight className=\"h-3 w-3 ml-auto text-text-secondary\" />\n </button>\n ))}\n </div>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Authentication</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <code className=\"text-xs font-mono\">Authorization: Bearer {'<token>'}</code>\n </div>\n <p className=\"text-xs text-text-secondary\">\n All API requests require a valid JWT token obtained through the OAuth 2.0 flow.\n </p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"lg:col-span-3 space-y-4\">\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search endpoints...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n\n {filteredSections.map((section) => (\n <Card key={section.name}>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <CardTitle className=\"text-base\">{section.name}</CardTitle>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {section.version}\n </Badge>\n </div>\n <CardDescription>{section.endpoints.length} endpoints</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {section.endpoints.map((ep, i) => (\n <div\n key={ep.path + ep.method}\n className={`flex items-center gap-3 px-6 py-3 hover:bg-bg-sunken/50 cursor-pointer ${i < section.endpoints.length - 1 ? 'border-b' : ''}`}\n >\n <Badge\n className={`${methodColors[ep.method]} text-[10px] font-mono border-0 min-w-[50px] justify-center`}\n >\n {ep.method}\n </Badge>\n <code className=\"text-sm font-mono flex-1\">{ep.path}</code>\n <span className=\"text-xs text-text-secondary hidden lg:block max-w-[250px] truncate\">\n {ep.description}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0\"\n onClick={() => handleCopy(ep.path)}\n >\n <Copy\n className={`h-3 w-3 ${copiedPath === ep.path ? 'text-status-success-text' : 'text-text-secondary'}`}\n />\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n\n {filteredSections.length === 0 && (\n <div className=\"py-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No endpoints match\"\n description=\"Try a different search term to find the API you need.\"\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,28 +1,36 @@
1
1
  import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { Clock as t, FileText as n, Star as r, UserCheck as i, Users as a } from "lucide-react";
3
3
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
4
- import { Badge as c, Card as l, CardContent as u, CardDescription as d, CardHeader as f, CardTitle as p, GlassCard as m, GradientText as h } from "@burdenoff/fe-libs/ui";
4
+ import { Badge as c, Card as l, CardContent as u, CardDescription as d, CardHeader as f, CardTitle as p, GlassCard as m, GradientText as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
5
5
  //#region src/crewfoundry/pages/HiringApplicationsPagePage.tsx
6
- function g() {
7
- let { candidates: g, jobPostings: _ } = e(), v = g.filter((e) => e.status === "new"), y = g.filter((e) => e.status === "screening"), b = g.filter((e) => e.status === "interview"), x = _.reduce((e, t) => e + t.applicants, 0);
6
+ function _() {
7
+ let { candidates: _, jobPostings: v } = e(), y = _.filter((e) => e.status === "new"), b = _.filter((e) => e.status === "screening"), x = _.filter((e) => e.status === "interview"), S = v.reduce((e, t) => e + t.applicants, 0);
8
8
  return /* @__PURE__ */ s("div", {
9
9
  className: "space-y-6 p-6",
10
10
  children: [
11
11
  /* @__PURE__ */ o("div", {
12
12
  className: "flex items-center justify-between",
13
- children: /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
14
- className: "text-2xl font-semibold",
15
- children: /* @__PURE__ */ o(h, { children: "Applications" })
16
- }), /* @__PURE__ */ s("p", {
17
- className: "text-sm text-text-secondary",
18
- children: [x, " total applications across all positions"]
19
- })] })
13
+ children: /* @__PURE__ */ s("div", { children: [
14
+ /* @__PURE__ */ o("h1", {
15
+ className: "text-2xl font-semibold",
16
+ children: /* @__PURE__ */ o(h, { children: "Applications" })
17
+ }),
18
+ /* @__PURE__ */ s("p", {
19
+ className: "text-sm text-text-secondary",
20
+ children: [S, " total applications across all positions"]
21
+ }),
22
+ /* @__PURE__ */ o(g, {
23
+ className: "mt-1",
24
+ children: "Review and triage incoming job applications — move candidates through your pipeline and decide who to interview next."
25
+ })
26
+ ] })
20
27
  }),
21
28
  /* @__PURE__ */ s("div", {
22
29
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
23
30
  children: [
24
31
  /* @__PURE__ */ s(m, {
25
- treatment: "metric",
32
+ treatment: "glass",
33
+ glow: !0,
26
34
  className: "border-border-seam",
27
35
  children: [/* @__PURE__ */ s(f, {
28
36
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
@@ -32,7 +40,7 @@ function g() {
32
40
  }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-status-info-text" })]
33
41
  }), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o("div", {
34
42
  className: "text-2xl font-bold tabular-nums",
35
- children: v.length
43
+ children: y.length
36
44
  }), /* @__PURE__ */ o("p", {
37
45
  className: "text-xs text-text-secondary",
38
46
  children: "Unreviewed applications"
@@ -49,7 +57,7 @@ function g() {
49
57
  }), /* @__PURE__ */ o(t, { className: "h-4 w-4 text-status-warning-text" })]
50
58
  }), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o("div", {
51
59
  className: "text-2xl font-bold tabular-nums",
52
- children: y.length
60
+ children: b.length
53
61
  }), /* @__PURE__ */ o("p", {
54
62
  className: "text-xs text-text-secondary",
55
63
  children: "Under review"
@@ -66,7 +74,7 @@ function g() {
66
74
  }), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-action-primary-bg" })]
67
75
  }), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o("div", {
68
76
  className: "text-2xl font-bold tabular-nums",
69
- children: b.length
77
+ children: x.length
70
78
  }), /* @__PURE__ */ o("p", {
71
79
  className: "text-xs text-text-secondary",
72
80
  children: "Moving forward"
@@ -93,8 +101,8 @@ function g() {
93
101
  }),
94
102
  /* @__PURE__ */ s(l, { children: [/* @__PURE__ */ s(f, { children: [/* @__PURE__ */ o(p, { children: "Applications by Position" }), /* @__PURE__ */ o(d, { children: "Applicant count per open role" })] }), /* @__PURE__ */ o(u, {
95
103
  className: "space-y-3",
96
- children: _.sort((e, t) => t.applicants - e.applicants).map((e) => {
97
- let t = Math.max(..._.map((e) => e.applicants));
104
+ children: v.sort((e, t) => t.applicants - e.applicants).map((e) => {
105
+ let t = Math.max(...v.map((e) => e.applicants));
98
106
  return /* @__PURE__ */ s("div", {
99
107
  className: "flex items-center gap-3",
100
108
  children: [
@@ -142,7 +150,7 @@ function g() {
142
150
  children: "Status"
143
151
  })
144
152
  ]
145
- }), g.map((e) => /* @__PURE__ */ s("div", {
153
+ }), _.map((e) => /* @__PURE__ */ s("div", {
146
154
  className: "grid grid-cols-7 gap-2 py-2 border-b last:border-0 text-sm",
147
155
  children: [
148
156
  /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ s("p", {
@@ -194,6 +202,6 @@ function g() {
194
202
  });
195
203
  }
196
204
  //#endregion
197
- export { g as HiringApplicationsPagePage };
205
+ export { _ as HiringApplicationsPagePage };
198
206
 
199
207
  //# sourceMappingURL=HiringApplicationsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HiringApplicationsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringApplicationsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { Clock, FileText, Star, UserCheck, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HiringApplicationsPagePage() {\n const { candidates, jobPostings } = useCrewFoundryStore();\n\n const newApps = candidates.filter((c) => c.status === 'new');\n const screeningApps = candidates.filter((c) => c.status === 'screening');\n const interviewApps = candidates.filter((c) => c.status === 'interview');\n const totalApps = jobPostings.reduce((s, j) => s + j.applicants, 0);\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>Applications</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {totalApps} total applications across all positions\n </p>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">New</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\">{newApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Unreviewed applications</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\">Screening</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\">{screeningApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Under review</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\">Interview Stage</CardTitle>\n <Users className=\"h-4 w-4 text-action-primary-bg\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{interviewApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Moving forward</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\">Conversion Rate</CardTitle>\n <UserCheck className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">4.8%</div>\n <p className=\"text-xs text-text-secondary\">Application to hire</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Applications by Position</CardTitle>\n <CardDescription>Applicant count per open role</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {jobPostings\n .sort((a, b) => b.applicants - a.applicants)\n .map((job) => {\n const maxApplicants = Math.max(...jobPostings.map((j) => j.applicants));\n return (\n <div key={job.id} className=\"flex items-center gap-3\">\n <span className=\"w-56 text-sm font-medium truncate\">{job.title}</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((job.applicants / maxApplicants) * 100)}%` }}\n />\n </div>\n <span className=\"text-sm font-medium w-10 text-right\">{job.applicants}</span>\n <Badge\n variant={job.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {job.status}\n </Badge>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>All Candidates</CardTitle>\n <CardDescription>Complete candidate pipeline</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>Candidate</span>\n <span>Position</span>\n <span>Company</span>\n <span className=\"text-right\">Experience</span>\n <span className=\"text-center\">Rating</span>\n <span>Skills</span>\n <span className=\"text-center\">Status</span>\n </div>\n {candidates.map((c) => (\n <div key={c.id} className=\"grid grid-cols-7 gap-2 py-2 border-b last:border-0 text-sm\">\n <div>\n <p className=\"font-medium\">\n {c.firstName} {c.lastName}\n </p>\n <p className=\"text-xs text-text-secondary\">{c.email}</p>\n </div>\n <span className=\"text-text-secondary truncate\">{c.position}</span>\n <span className=\"text-text-secondary\">{c.currentCompany}</span>\n <span className=\"text-right\">{c.experience} yrs</span>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {c.rating}\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {c.skills.slice(0, 2).map((s) => (\n <Badge key={s} variant=\"outline\" className=\"text-[9px]\">\n {s}\n </Badge>\n ))}\n </div>\n <div className=\"text-center\">\n <Badge\n variant={\n c.status === 'hired'\n ? 'default'\n : c.status === 'offer'\n ? 'default'\n : c.status === 'rejected'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {c.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":"HiringApplicationsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringApplicationsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Clock, FileText, Star, UserCheck, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HiringApplicationsPagePage() {\n const { candidates, jobPostings } = useCrewFoundryStore();\n\n const newApps = candidates.filter((c) => c.status === 'new');\n const screeningApps = candidates.filter((c) => c.status === 'screening');\n const interviewApps = candidates.filter((c) => c.status === 'interview');\n const totalApps = jobPostings.reduce((s, j) => s + j.applicants, 0);\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>Applications</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {totalApps} total applications across all positions\n </p>\n <PagePurpose className=\"mt-1\">Review and triage incoming job applications — move candidates through your pipeline and decide who to interview next.</PagePurpose>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">New</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\">{newApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Unreviewed applications</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\">Screening</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\">{screeningApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Under review</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\">Interview Stage</CardTitle>\n <Users className=\"h-4 w-4 text-action-primary-bg\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{interviewApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Moving forward</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\">Conversion Rate</CardTitle>\n <UserCheck className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">4.8%</div>\n <p className=\"text-xs text-text-secondary\">Application to hire</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Applications by Position</CardTitle>\n <CardDescription>Applicant count per open role</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {jobPostings\n .sort((a, b) => b.applicants - a.applicants)\n .map((job) => {\n const maxApplicants = Math.max(...jobPostings.map((j) => j.applicants));\n return (\n <div key={job.id} className=\"flex items-center gap-3\">\n <span className=\"w-56 text-sm font-medium truncate\">{job.title}</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((job.applicants / maxApplicants) * 100)}%` }}\n />\n </div>\n <span className=\"text-sm font-medium w-10 text-right\">{job.applicants}</span>\n <Badge\n variant={job.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {job.status}\n </Badge>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>All Candidates</CardTitle>\n <CardDescription>Complete candidate pipeline</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>Candidate</span>\n <span>Position</span>\n <span>Company</span>\n <span className=\"text-right\">Experience</span>\n <span className=\"text-center\">Rating</span>\n <span>Skills</span>\n <span className=\"text-center\">Status</span>\n </div>\n {candidates.map((c) => (\n <div key={c.id} className=\"grid grid-cols-7 gap-2 py-2 border-b last:border-0 text-sm\">\n <div>\n <p className=\"font-medium\">\n {c.firstName} {c.lastName}\n </p>\n <p className=\"text-xs text-text-secondary\">{c.email}</p>\n </div>\n <span className=\"text-text-secondary truncate\">{c.position}</span>\n <span className=\"text-text-secondary\">{c.currentCompany}</span>\n <span className=\"text-right\">{c.experience} yrs</span>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {c.rating}\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {c.skills.slice(0, 2).map((s) => (\n <Badge key={s} variant=\"outline\" className=\"text-[9px]\">\n {s}\n </Badge>\n ))}\n </div>\n <div className=\"text-center\">\n <Badge\n variant={\n c.status === 'hired'\n ? 'default'\n : c.status === 'offer'\n ? 'default'\n : c.status === 'rejected'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {c.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,124 +1,143 @@
1
1
  import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { useState as t } from "react";
3
3
  import { Search as n, Star as r } from "lucide-react";
4
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
- import { Badge as o, Button as s, Card as c, CardContent as l, GradientText as u, Input as d } from "@burdenoff/fe-libs/ui";
4
+ import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
5
+ import { Badge as s, Button as c, CardContent as l, GlassCard as u, GradientText as d, IllustratedEmptyState as f, Input as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
6
6
  //#region src/crewfoundry/pages/HiringCandidatesPagePage.tsx
7
- function f() {
8
- let { candidates: f } = e(), [p, m] = t(""), [h, g] = t("all"), _ = [...new Set(f.map((e) => e.status))], v = f.filter((e) => {
9
- let t = `${e.firstName} ${e.lastName} ${e.position} ${e.email}`.toLowerCase().includes(p.toLowerCase()), n = h === "all" || e.status === h;
7
+ function h() {
8
+ let { candidates: h } = e(), [g, _] = t(""), [v, y] = t("all"), b = [...new Set(h.map((e) => e.status))], x = h.filter((e) => {
9
+ let t = `${e.firstName} ${e.lastName} ${e.position} ${e.email}`.toLowerCase().includes(g.toLowerCase()), n = v === "all" || e.status === v;
10
10
  return t && n;
11
11
  });
12
- return /* @__PURE__ */ a("div", {
12
+ return /* @__PURE__ */ o("div", {
13
13
  className: "space-y-6 p-6",
14
14
  children: [
15
- /* @__PURE__ */ i("div", {
15
+ /* @__PURE__ */ a("div", {
16
16
  className: "flex items-center justify-between",
17
- children: /* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("h1", {
18
- className: "text-2xl font-semibold",
19
- children: /* @__PURE__ */ i(u, { children: "Candidates" })
20
- }), /* @__PURE__ */ a("p", {
21
- className: "text-sm text-text-secondary",
22
- children: [f.length, " candidates in pipeline"]
23
- })] })
17
+ children: /* @__PURE__ */ o("div", { children: [
18
+ /* @__PURE__ */ a("h1", {
19
+ className: "text-2xl font-semibold",
20
+ children: /* @__PURE__ */ a(d, { children: "Candidates" })
21
+ }),
22
+ /* @__PURE__ */ o("p", {
23
+ className: "text-sm text-text-secondary",
24
+ children: [h.length, " candidates in pipeline"]
25
+ }),
26
+ /* @__PURE__ */ a(m, {
27
+ className: "mt-1",
28
+ children: "Your candidate pool — search, filter, and evaluate the people you're considering so you can fill open roles with the right talent."
29
+ })
30
+ ] })
24
31
  }),
25
- /* @__PURE__ */ a("div", {
32
+ /* @__PURE__ */ o("div", {
26
33
  className: "flex gap-3 flex-wrap",
27
- children: [/* @__PURE__ */ a("div", {
34
+ children: [/* @__PURE__ */ o("div", {
28
35
  className: "relative flex-1 max-w-sm",
29
- children: [/* @__PURE__ */ i(n, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ i(d, {
36
+ children: [/* @__PURE__ */ a(n, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ a(p, {
30
37
  placeholder: "Search candidates...",
31
38
  className: "pl-9",
32
- value: p,
33
- onChange: (e) => m(e.target.value)
39
+ value: g,
40
+ onChange: (e) => _(e.target.value)
34
41
  })]
35
- }), /* @__PURE__ */ a("div", {
42
+ }), /* @__PURE__ */ o("div", {
36
43
  className: "flex gap-1",
37
- children: [/* @__PURE__ */ i(s, {
38
- variant: h === "all" ? "default" : "outline",
44
+ children: [/* @__PURE__ */ a(c, {
45
+ variant: v === "all" ? "default" : "outline",
39
46
  size: "sm",
40
- onClick: () => g("all"),
47
+ onClick: () => y("all"),
41
48
  children: "All"
42
- }), _.map((e) => /* @__PURE__ */ i(s, {
43
- variant: h === e ? "default" : "outline",
49
+ }), b.map((e) => /* @__PURE__ */ a(c, {
50
+ variant: v === e ? "default" : "outline",
44
51
  size: "sm",
45
- onClick: () => g(e),
52
+ onClick: () => y(e),
46
53
  children: e
47
54
  }, e))]
48
55
  })]
49
56
  }),
50
- /* @__PURE__ */ i(c, { children: /* @__PURE__ */ a(l, {
51
- className: "p-0",
52
- children: [/* @__PURE__ */ a("div", {
53
- className: "grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary p-4 border-b",
54
- children: [
55
- /* @__PURE__ */ i("span", { children: "Name" }),
56
- /* @__PURE__ */ i("span", { children: "Position" }),
57
- /* @__PURE__ */ i("span", { children: "Source" }),
58
- /* @__PURE__ */ i("span", {
59
- className: "text-right",
60
- children: "Experience"
61
- }),
62
- /* @__PURE__ */ i("span", {
63
- className: "text-center",
64
- children: "Rating"
65
- }),
66
- /* @__PURE__ */ i("span", { children: "Applied" }),
67
- /* @__PURE__ */ i("span", {
68
- className: "text-center",
69
- children: "Status"
57
+ /* @__PURE__ */ a(u, {
58
+ treatment: "glass",
59
+ glow: !0,
60
+ className: "border-border-seam",
61
+ children: /* @__PURE__ */ a(l, {
62
+ className: "p-0",
63
+ children: x.length === 0 ? /* @__PURE__ */ a("div", {
64
+ className: "p-6",
65
+ children: /* @__PURE__ */ a(f, {
66
+ illustration: "empty-search",
67
+ title: "No candidates match",
68
+ description: "Try a different search term or status filter."
70
69
  })
71
- ]
72
- }), v.map((e) => /* @__PURE__ */ a("div", {
73
- className: "grid grid-cols-7 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50",
74
- children: [
75
- /* @__PURE__ */ a("div", { children: [/* @__PURE__ */ a("p", {
76
- className: "font-medium",
77
- children: [
78
- e.firstName,
79
- " ",
80
- e.lastName
81
- ]
82
- }), /* @__PURE__ */ i("p", {
83
- className: "text-xs text-text-secondary",
84
- children: e.email
85
- })] }),
86
- /* @__PURE__ */ i("span", {
87
- className: "text-text-secondary",
88
- children: e.position
89
- }),
90
- /* @__PURE__ */ i(o, {
91
- variant: "outline",
92
- className: "w-fit h-fit text-[10px]",
93
- children: e.source
94
- }),
95
- /* @__PURE__ */ a("span", {
96
- className: "text-right",
97
- children: [e.experience, " yrs"]
98
- }),
99
- /* @__PURE__ */ a("div", {
100
- className: "flex items-center justify-center gap-1",
101
- children: [/* @__PURE__ */ i(r, { className: "h-3 w-3 text-status-warning-text" }), /* @__PURE__ */ i("span", { children: e.rating })]
102
- }),
103
- /* @__PURE__ */ i("span", {
104
- className: "text-text-secondary text-xs",
105
- children: e.appliedDate
106
- }),
107
- /* @__PURE__ */ i("div", {
108
- className: "text-center",
109
- children: /* @__PURE__ */ i(o, {
110
- variant: e.status === "hired" || e.status === "offer" ? "default" : e.status === "rejected" ? "destructive" : "secondary",
111
- className: "text-[10px]",
112
- children: e.status
70
+ }) : /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ o("div", {
71
+ className: "grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary p-4 border-b",
72
+ children: [
73
+ /* @__PURE__ */ a("span", { children: "Name" }),
74
+ /* @__PURE__ */ a("span", { children: "Position" }),
75
+ /* @__PURE__ */ a("span", { children: "Source" }),
76
+ /* @__PURE__ */ a("span", {
77
+ className: "text-right",
78
+ children: "Experience"
79
+ }),
80
+ /* @__PURE__ */ a("span", {
81
+ className: "text-center",
82
+ children: "Rating"
83
+ }),
84
+ /* @__PURE__ */ a("span", { children: "Applied" }),
85
+ /* @__PURE__ */ a("span", {
86
+ className: "text-center",
87
+ children: "Status"
113
88
  })
114
- })
115
- ]
116
- }, e.id))]
117
- }) })
89
+ ]
90
+ }), x.map((e) => /* @__PURE__ */ o("div", {
91
+ className: "grid grid-cols-7 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50",
92
+ children: [
93
+ /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ o("p", {
94
+ className: "font-medium",
95
+ children: [
96
+ e.firstName,
97
+ " ",
98
+ e.lastName
99
+ ]
100
+ }), /* @__PURE__ */ a("p", {
101
+ className: "text-xs text-text-secondary",
102
+ children: e.email
103
+ })] }),
104
+ /* @__PURE__ */ a("span", {
105
+ className: "text-text-secondary",
106
+ children: e.position
107
+ }),
108
+ /* @__PURE__ */ a(s, {
109
+ variant: "outline",
110
+ className: "w-fit h-fit text-[10px]",
111
+ children: e.source
112
+ }),
113
+ /* @__PURE__ */ o("span", {
114
+ className: "text-right",
115
+ children: [e.experience, " yrs"]
116
+ }),
117
+ /* @__PURE__ */ o("div", {
118
+ className: "flex items-center justify-center gap-1",
119
+ children: [/* @__PURE__ */ a(r, { className: "h-3 w-3 text-status-warning-text" }), /* @__PURE__ */ a("span", { children: e.rating })]
120
+ }),
121
+ /* @__PURE__ */ a("span", {
122
+ className: "text-text-secondary text-xs",
123
+ children: e.appliedDate
124
+ }),
125
+ /* @__PURE__ */ a("div", {
126
+ className: "text-center",
127
+ children: /* @__PURE__ */ a(s, {
128
+ variant: e.status === "hired" || e.status === "offer" ? "default" : e.status === "rejected" ? "destructive" : "secondary",
129
+ className: "text-[10px]",
130
+ children: e.status
131
+ })
132
+ })
133
+ ]
134
+ }, e.id))] })
135
+ })
136
+ })
118
137
  ]
119
138
  });
120
139
  }
121
140
  //#endregion
122
- export { f as HiringCandidatesPagePage };
141
+ export { h as HiringCandidatesPagePage };
123
142
 
124
143
  //# sourceMappingURL=HiringCandidatesPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HiringCandidatesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringCandidatesPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GradientText,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport { Filter, Mail, Phone, Search, Star, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HiringCandidatesPagePage() {\n const { candidates } = useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [filterStatus, setFilterStatus] = useState<string>('all');\n\n const statuses = [...new Set(candidates.map((c) => c.status))];\n const filtered = candidates.filter((c) => {\n const matchSearch = `${c.firstName} ${c.lastName} ${c.position} ${c.email}`\n .toLowerCase()\n .includes(search.toLowerCase());\n const matchStatus = filterStatus === 'all' || c.status === filterStatus;\n return matchSearch && matchStatus;\n });\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Candidates</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{candidates.length} candidates in pipeline</p>\n </div>\n </div>\n\n <div className=\"flex gap-3 flex-wrap\">\n <div className=\"relative flex-1 max-w-sm\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search candidates...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <div className=\"flex gap-1\">\n <Button\n variant={filterStatus === 'all' ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterStatus('all')}\n >\n All\n </Button>\n {statuses.map((status) => (\n <Button\n key={status}\n variant={filterStatus === status ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterStatus(status)}\n >\n {status}\n </Button>\n ))}\n </div>\n </div>\n\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary p-4 border-b\">\n <span>Name</span>\n <span>Position</span>\n <span>Source</span>\n <span className=\"text-right\">Experience</span>\n <span className=\"text-center\">Rating</span>\n <span>Applied</span>\n <span className=\"text-center\">Status</span>\n </div>\n {filtered.map((candidate) => (\n <div\n key={candidate.id}\n className=\"grid grid-cols-7 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50\"\n >\n <div>\n <p className=\"font-medium\">\n {candidate.firstName} {candidate.lastName}\n </p>\n <p className=\"text-xs text-text-secondary\">{candidate.email}</p>\n </div>\n <span className=\"text-text-secondary\">{candidate.position}</span>\n <Badge variant=\"outline\" className=\"w-fit h-fit text-[10px]\">\n {candidate.source}\n </Badge>\n <span className=\"text-right\">{candidate.experience} yrs</span>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n <span>{candidate.rating}</span>\n </div>\n <span className=\"text-text-secondary text-xs\">{candidate.appliedDate}</span>\n <div className=\"text-center\">\n <Badge\n variant={\n candidate.status === 'hired'\n ? 'default'\n : candidate.status === 'offer'\n ? 'default'\n : candidate.status === 'rejected'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {candidate.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;;;AAeA,SAAgB,IAA2B;CACzC,IAAM,EAAE,kBAAe,GAAqB,EACtC,CAAC,GAAQ,KAAa,EAAS,GAAG,EAClC,CAAC,GAAc,KAAmB,EAAiB,MAAM,EAEzD,IAAW,CAAC,GAAG,IAAI,IAAI,EAAW,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC,EACxD,IAAW,EAAW,QAAQ,MAAM;EACxC,IAAM,IAAc,GAAG,EAAE,UAAU,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,GAAG,EAAE,QACjE,aAAa,CACb,SAAS,EAAO,aAAa,CAAC,EAC3B,IAAc,MAAiB,SAAS,EAAE,WAAW;AAC3D,SAAO,KAAe;GACtB;AAEF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,cAAyB,CAAA;KACpC,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eAAb,CAA4C,EAAW,QAAO,0BAA2B;OACrF,EAAA,CAAA;IACF,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,GAAD;MACE,aAAY;MACZ,WAAU;MACV,OAAO;MACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;MAC1C,CAAA,CACE;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,SAAS,MAAiB,QAAQ,YAAY;MAC9C,MAAK;MACL,eAAe,EAAgB,MAAM;gBACtC;MAEQ,CAAA,EACR,EAAS,KAAK,MACb,kBAAC,GAAD;MAEE,SAAS,MAAiB,IAAS,YAAY;MAC/C,MAAK;MACL,eAAe,EAAgB,EAAO;gBAErC;MACM,EANF,EAME,CACT,CACE;OACF;;GAEN,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAa,WAAU;cAAvB,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,QAAD,EAAA,UAAM,QAAW,CAAA;MACjB,kBAAC,QAAD,EAAA,UAAM,YAAe,CAAA;MACrB,kBAAC,QAAD,EAAA,UAAM,UAAa,CAAA;MACnB,kBAAC,QAAD;OAAM,WAAU;iBAAa;OAAiB,CAAA;MAC9C,kBAAC,QAAD;OAAM,WAAU;iBAAc;OAAa,CAAA;MAC3C,kBAAC,QAAD,EAAA,UAAM,WAAc,CAAA;MACpB,kBAAC,QAAD;OAAM,WAAU;iBAAc;OAAa,CAAA;MACvC;QACL,EAAS,KAAK,MACb,kBAAC,OAAD;KAEE,WAAU;eAFZ;MAIE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAU;QAAU;QAAE,EAAU;QAC/B;UACJ,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAU;OAAU,CAAA,CAC5D,EAAA,CAAA;MACN,kBAAC,QAAD;OAAM,WAAU;iBAAuB,EAAU;OAAgB,CAAA;MACjE,kBAAC,GAAD;OAAO,SAAQ;OAAU,WAAU;iBAChC,EAAU;OACL,CAAA;MACR,kBAAC,QAAD;OAAM,WAAU;iBAAhB,CAA8B,EAAU,YAAW,OAAW;;MAC9D,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,oCAAqC,CAAA,EACrD,kBAAC,QAAD,EAAA,UAAO,EAAU,QAAc,CAAA,CAC3B;;MACN,kBAAC,QAAD;OAAM,WAAU;iBAA+B,EAAU;OAAmB,CAAA;MAC5E,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD;QACE,SACE,EAAU,WAAW,WAEjB,EAAU,WAAW,UADrB,YAGE,EAAU,WAAW,aACnB,gBACA;QAEV,WAAU;kBAET,EAAU;QACL,CAAA;OACJ,CAAA;MACF;OAnCC,EAAU,GAmCX,CACN,CACU;OACT,CAAA;GACH"}
1
+ {"version":3,"file":"HiringCandidatesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringCandidatesPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n CardContent,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Search, Star } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HiringCandidatesPagePage() {\n const { candidates } = useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [filterStatus, setFilterStatus] = useState<string>('all');\n\n const statuses = [...new Set(candidates.map((c) => c.status))];\n const filtered = candidates.filter((c) => {\n const matchSearch = `${c.firstName} ${c.lastName} ${c.position} ${c.email}`\n .toLowerCase()\n .includes(search.toLowerCase());\n const matchStatus = filterStatus === 'all' || c.status === filterStatus;\n return matchSearch && matchStatus;\n });\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Candidates</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{candidates.length} candidates in pipeline</p>\n <PagePurpose className=\"mt-1\">Your candidate pool — search, filter, and evaluate the people you&apos;re considering so you can fill open roles with the right talent.</PagePurpose>\n </div>\n </div>\n\n <div className=\"flex gap-3 flex-wrap\">\n <div className=\"relative flex-1 max-w-sm\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search candidates...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <div className=\"flex gap-1\">\n <Button\n variant={filterStatus === 'all' ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterStatus('all')}\n >\n All\n </Button>\n {statuses.map((status) => (\n <Button\n key={status}\n variant={filterStatus === status ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterStatus(status)}\n >\n {status}\n </Button>\n ))}\n </div>\n </div>\n\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-0\">\n {filtered.length === 0 ? (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No candidates match\"\n description=\"Try a different search term or status filter.\"\n />\n </div>\n ) : (\n <>\n <div className=\"grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary p-4 border-b\">\n <span>Name</span>\n <span>Position</span>\n <span>Source</span>\n <span className=\"text-right\">Experience</span>\n <span className=\"text-center\">Rating</span>\n <span>Applied</span>\n <span className=\"text-center\">Status</span>\n </div>\n {filtered.map((candidate) => (\n <div\n key={candidate.id}\n className=\"grid grid-cols-7 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50\"\n >\n <div>\n <p className=\"font-medium\">\n {candidate.firstName} {candidate.lastName}\n </p>\n <p className=\"text-xs text-text-secondary\">{candidate.email}</p>\n </div>\n <span className=\"text-text-secondary\">{candidate.position}</span>\n <Badge variant=\"outline\" className=\"w-fit h-fit text-[10px]\">\n {candidate.source}\n </Badge>\n <span className=\"text-right\">{candidate.experience} yrs</span>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n <span>{candidate.rating}</span>\n </div>\n <span className=\"text-text-secondary text-xs\">{candidate.appliedDate}</span>\n <div className=\"text-center\">\n <Badge\n variant={\n candidate.status === 'hired'\n ? 'default'\n : candidate.status === 'offer'\n ? 'default'\n : candidate.status === 'rejected'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {candidate.status}\n </Badge>\n </div>\n </div>\n ))}\n </>\n )}\n </CardContent>\n </GlassCard>\n </div>\n );\n}\n"],"mappings":"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"}