@burdenoff/microfe-crewfoundry 2026.704.6 → 2026.707.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 (150) hide show
  1. package/dist/crewfoundry/CrewFoundryRoutes.js +51 -43
  2. package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
  3. package/dist/crewfoundry/components/forms/formValues.js +5 -2
  4. package/dist/crewfoundry/components/forms/formValues.js.map +1 -1
  5. package/dist/crewfoundry/components/viz/AllocationBar.js +68 -0
  6. package/dist/crewfoundry/components/viz/AllocationBar.js.map +1 -0
  7. package/dist/crewfoundry/components/viz/AreaChart.js +102 -0
  8. package/dist/crewfoundry/components/viz/AreaChart.js.map +1 -0
  9. package/dist/crewfoundry/components/viz/AvatarStack.js +36 -0
  10. package/dist/crewfoundry/components/viz/AvatarStack.js.map +1 -0
  11. package/dist/crewfoundry/components/viz/BarChart.js +83 -0
  12. package/dist/crewfoundry/components/viz/BarChart.js.map +1 -0
  13. package/dist/crewfoundry/components/viz/CertificateCard.js +118 -0
  14. package/dist/crewfoundry/components/viz/CertificateCard.js.map +1 -0
  15. package/dist/crewfoundry/components/viz/DonutChart.js +109 -0
  16. package/dist/crewfoundry/components/viz/DonutChart.js.map +1 -0
  17. package/dist/crewfoundry/components/viz/HBarFunnel.js +54 -0
  18. package/dist/crewfoundry/components/viz/HBarFunnel.js.map +1 -0
  19. package/dist/crewfoundry/components/viz/Heatmap.js +91 -0
  20. package/dist/crewfoundry/components/viz/Heatmap.js.map +1 -0
  21. package/dist/crewfoundry/components/viz/KanbanBoard.js +50 -0
  22. package/dist/crewfoundry/components/viz/KanbanBoard.js.map +1 -0
  23. package/dist/crewfoundry/components/viz/LineChart.js +123 -0
  24. package/dist/crewfoundry/components/viz/LineChart.js.map +1 -0
  25. package/dist/crewfoundry/components/viz/OrgTree.js +83 -0
  26. package/dist/crewfoundry/components/viz/OrgTree.js.map +1 -0
  27. package/dist/crewfoundry/components/viz/PathSteps.js +68 -0
  28. package/dist/crewfoundry/components/viz/PathSteps.js.map +1 -0
  29. package/dist/crewfoundry/components/viz/ProgressRing.js +68 -0
  30. package/dist/crewfoundry/components/viz/ProgressRing.js.map +1 -0
  31. package/dist/crewfoundry/components/viz/RatingStars.js +51 -0
  32. package/dist/crewfoundry/components/viz/RatingStars.js.map +1 -0
  33. package/dist/crewfoundry/components/viz/SegmentedTabs.js +69 -0
  34. package/dist/crewfoundry/components/viz/SegmentedTabs.js.map +1 -0
  35. package/dist/crewfoundry/components/viz/SkillBar.js +3 -0
  36. package/dist/crewfoundry/components/viz/Sparkline.js +74 -0
  37. package/dist/crewfoundry/components/viz/Sparkline.js.map +1 -0
  38. package/dist/crewfoundry/components/viz/StatCard.js +60 -0
  39. package/dist/crewfoundry/components/viz/StatCard.js.map +1 -0
  40. package/dist/crewfoundry/components/viz/StepProgress.js +3 -0
  41. package/dist/crewfoundry/components/viz/Timeline.js +66 -0
  42. package/dist/crewfoundry/components/viz/Timeline.js.map +1 -0
  43. package/dist/crewfoundry/components/viz/index.js +23 -0
  44. package/dist/crewfoundry/components/viz/lib/Avatar.js +30 -0
  45. package/dist/crewfoundry/components/viz/lib/Avatar.js.map +1 -0
  46. package/dist/crewfoundry/components/viz/lib/CartesianFrame.js +119 -0
  47. package/dist/crewfoundry/components/viz/lib/CartesianFrame.js.map +1 -0
  48. package/dist/crewfoundry/components/viz/lib/ResponsiveSvg.js +35 -0
  49. package/dist/crewfoundry/components/viz/lib/ResponsiveSvg.js.map +1 -0
  50. package/dist/crewfoundry/components/viz/lib/format.js +21 -0
  51. package/dist/crewfoundry/components/viz/lib/format.js.map +1 -0
  52. package/dist/crewfoundry/components/viz/lib/geometry.js +69 -0
  53. package/dist/crewfoundry/components/viz/lib/geometry.js.map +1 -0
  54. package/dist/crewfoundry/components/viz/lib/hooks.js +39 -0
  55. package/dist/crewfoundry/components/viz/lib/hooks.js.map +1 -0
  56. package/dist/crewfoundry/components/viz/lib/palette.js +27 -0
  57. package/dist/crewfoundry/components/viz/lib/palette.js.map +1 -0
  58. package/dist/crewfoundry/lib/analytics.js +323 -0
  59. package/dist/crewfoundry/lib/analytics.js.map +1 -0
  60. package/dist/crewfoundry/lib/companyFinance.js +16 -0
  61. package/dist/crewfoundry/lib/companyFinance.js.map +1 -0
  62. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +226 -283
  63. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  64. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +107 -120
  65. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
  66. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +122 -162
  67. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  68. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +121 -158
  69. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  70. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +316 -211
  71. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  72. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +75 -27
  73. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
  74. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +167 -165
  75. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  76. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +168 -109
  77. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  78. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +401 -290
  79. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  80. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +0 -41
  81. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  82. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +84 -75
  83. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  84. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +368 -174
  85. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  86. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +236 -201
  87. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  88. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +369 -196
  89. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  90. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +269 -270
  91. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  92. package/dist/crewfoundry/pages/HiringJobsPagePage.js +210 -110
  93. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  94. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +216 -178
  95. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  96. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js +385 -0
  97. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js.map +1 -0
  98. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +189 -130
  99. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  100. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +397 -241
  101. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  102. package/dist/crewfoundry/pages/HrPayrollPagePage.js +262 -147
  103. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  104. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +345 -167
  105. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  106. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +98 -24
  107. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  108. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +1 -1
  109. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  110. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +289 -108
  111. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  112. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +221 -114
  113. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  114. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +134 -135
  115. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  116. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +148 -97
  117. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  118. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +264 -157
  119. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  120. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +85 -93
  121. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  122. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +211 -122
  123. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  124. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +94 -54
  125. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  126. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +289 -140
  127. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  128. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +169 -79
  129. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  130. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +296 -125
  131. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  132. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js +187 -0
  133. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js.map +1 -0
  134. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +140 -78
  135. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  136. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +93 -43
  137. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  138. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +250 -98
  139. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  140. package/dist/crewfoundry/store/crewfoundryStore.js +142 -184
  141. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  142. package/dist/crewfoundry/utils/cn.js +10 -0
  143. package/dist/crewfoundry/utils/cn.js.map +1 -0
  144. package/dist/crewfoundry/utils/courseProgress.js +46 -0
  145. package/dist/crewfoundry/utils/courseProgress.js.map +1 -0
  146. package/dist/node_modules/clsx/dist/clsx.js +18 -0
  147. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  148. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
  149. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  150. package/package.json +1 -1
@@ -1,16 +1,85 @@
1
1
  import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
- import { FormModal as n } from "../components/forms/FormModal.js";
4
- import { ConfirmDialog as r } from "../components/forms/ConfirmDialog.js";
5
- import { getNumber as i, getTags as a, getText as o, newClientId as s } from "../components/forms/formValues.js";
6
- import { useState as c } from "react";
7
- import { Pencil as l, Plus as u, Search as d, Star as f, Trash2 as p } from "lucide-react";
8
- import { jsx as m, jsxs as h } from "react/jsx-runtime";
9
- import { Badge as g, Button as _, CardContent as v, GlassCard as y, GradientText as b, IllustratedEmptyState as x, Input as S, PagePurpose as C, Pagination as w, ResponsiveTable as T } from "@burdenoff/fe-libs/ui";
10
- import { usePagination as E } from "@burdenoff/fe-libs/shared/hooks";
11
- import { useGlobalUi as D } from "@burdenoff/fe-libs/shared/providers/shell";
3
+ import { getInitials as n } from "../components/viz/lib/format.js";
4
+ import { KanbanBoard as r } from "../components/viz/KanbanBoard.js";
5
+ import { RatingStars as i } from "../components/viz/RatingStars.js";
6
+ import "../components/viz/index.js";
7
+ import { FormModal as a } from "../components/forms/FormModal.js";
8
+ import { ConfirmDialog as o } from "../components/forms/ConfirmDialog.js";
9
+ import { getNumber as s, getTags as c, getText as l, newClientId as ee } from "../components/forms/formValues.js";
10
+ import { useMemo as u, useState as d } from "react";
11
+ import { ArrowRightLeft as f, LayoutGrid as p, Pencil as m, Plus as h, Search as g, Table2 as _, Trash2 as v } from "lucide-react";
12
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
13
+ import { Badge as x, Button as S, CardContent as C, DropdownMenu as w, DropdownMenuContent as T, DropdownMenuItem as E, DropdownMenuLabel as D, DropdownMenuSeparator as O, DropdownMenuTrigger as k, GlassCard as A, GradientText as j, IllustratedEmptyState as M, Input as N, PagePurpose as P, Pagination as F, ResponsiveTable as te } from "@burdenoff/fe-libs/ui";
14
+ import { usePagination as ne } from "@burdenoff/fe-libs/shared/hooks";
15
+ import { useGlobalUi as re } from "@burdenoff/fe-libs/shared/providers/shell";
12
16
  //#region src/crewfoundry/pages/HiringCandidatesPagePage.tsx
13
- var O = [
17
+ var I = [
18
+ {
19
+ label: "New",
20
+ value: "new"
21
+ },
22
+ {
23
+ label: "Screening",
24
+ value: "screening"
25
+ },
26
+ {
27
+ label: "Interview",
28
+ value: "interview"
29
+ },
30
+ {
31
+ label: "Assessment",
32
+ value: "assessment"
33
+ },
34
+ {
35
+ label: "Offer",
36
+ value: "offer"
37
+ },
38
+ {
39
+ label: "Hired",
40
+ value: "hired"
41
+ },
42
+ {
43
+ label: "Rejected",
44
+ value: "rejected"
45
+ }
46
+ ], L = [
47
+ {
48
+ key: "new",
49
+ label: "New",
50
+ accent: "var(--color-status-info-text)"
51
+ },
52
+ {
53
+ key: "screening",
54
+ label: "Screening",
55
+ accent: "var(--color-accent-blue)"
56
+ },
57
+ {
58
+ key: "interview",
59
+ label: "Interview",
60
+ accent: "var(--color-accent-purple)"
61
+ },
62
+ {
63
+ key: "assessment",
64
+ label: "Assessment",
65
+ accent: "var(--color-status-warning-text)"
66
+ },
67
+ {
68
+ key: "offer",
69
+ label: "Offer",
70
+ accent: "var(--color-accent-teal)"
71
+ },
72
+ {
73
+ key: "hired",
74
+ label: "Hired",
75
+ accent: "var(--color-status-success-text)"
76
+ },
77
+ {
78
+ key: "rejected",
79
+ label: "Rejected",
80
+ accent: "var(--color-status-error-text)"
81
+ }
82
+ ], R = [
14
83
  {
15
84
  name: "firstName",
16
85
  label: "First Name",
@@ -46,36 +115,7 @@ var O = [
46
115
  label: "Status",
47
116
  type: "select",
48
117
  required: !0,
49
- options: [
50
- {
51
- label: "New",
52
- value: "new"
53
- },
54
- {
55
- label: "Screening",
56
- value: "screening"
57
- },
58
- {
59
- label: "Interview",
60
- value: "interview"
61
- },
62
- {
63
- label: "Assessment",
64
- value: "assessment"
65
- },
66
- {
67
- label: "Offer",
68
- value: "offer"
69
- },
70
- {
71
- label: "Hired",
72
- value: "hired"
73
- },
74
- {
75
- label: "Rejected",
76
- value: "rejected"
77
- }
78
- ]
118
+ options: I
79
119
  },
80
120
  {
81
121
  name: "source",
@@ -122,7 +162,7 @@ var O = [
122
162
  type: "textarea",
123
163
  colSpan: 2
124
164
  }
125
- ], k = (e) => ({
165
+ ], z = (e) => ({
126
166
  firstName: e.firstName,
127
167
  lastName: e.lastName,
128
168
  email: e.email,
@@ -137,46 +177,65 @@ var O = [
137
177
  resumeUrl: e.resumeUrl ?? "",
138
178
  skills: e.skills,
139
179
  notes: e.notes
140
- }), A = (e) => {
141
- let t = o(e, "appliedDate");
180
+ }), B = (e) => {
181
+ let t = l(e, "appliedDate");
142
182
  return {
143
- firstName: o(e, "firstName"),
144
- lastName: o(e, "lastName"),
145
- email: o(e, "email"),
146
- phone: o(e, "phone"),
147
- position: o(e, "position"),
183
+ firstName: l(e, "firstName"),
184
+ lastName: l(e, "lastName"),
185
+ email: l(e, "email"),
186
+ phone: l(e, "phone"),
187
+ position: l(e, "position"),
148
188
  status: e.status,
149
- source: o(e, "source"),
150
- experience: i(e, "experience"),
151
- currentCompany: o(e, "currentCompany"),
152
- rating: i(e, "rating"),
189
+ source: l(e, "source"),
190
+ experience: s(e, "experience"),
191
+ currentCompany: l(e, "currentCompany"),
192
+ rating: s(e, "rating"),
153
193
  appliedDate: t.trim() === "" ? (/* @__PURE__ */ new Date()).toISOString().slice(0, 10) : t,
154
- resumeUrl: o(e, "resumeUrl"),
155
- skills: a(e, "skills"),
156
- notes: o(e, "notes")
194
+ resumeUrl: l(e, "resumeUrl"),
195
+ skills: c(e, "skills"),
196
+ notes: l(e, "notes")
157
197
  };
158
- }, j = [
198
+ };
199
+ function V({ name: e, size: t = 36 }) {
200
+ return /* @__PURE__ */ y("span", {
201
+ className: "inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full border border-border-subtle bg-bg-sunken font-medium text-text-secondary",
202
+ style: {
203
+ width: t,
204
+ height: t,
205
+ fontSize: Math.round(t * .36)
206
+ },
207
+ "aria-hidden": "true",
208
+ children: n(e)
209
+ });
210
+ }
211
+ var H = [
159
212
  {
160
213
  key: "name",
161
214
  header: "Name",
162
215
  priority: "primary",
163
- cell: (e) => /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("p", {
164
- className: "font-medium",
165
- children: [
166
- e.firstName,
167
- " ",
168
- e.lastName
169
- ]
170
- }), /* @__PURE__ */ m("p", {
171
- className: "text-xs text-text-secondary",
172
- children: e.email
173
- })] })
216
+ cell: (e) => /* @__PURE__ */ b("div", {
217
+ className: "flex items-center gap-2",
218
+ children: [/* @__PURE__ */ y(V, {
219
+ name: `${e.firstName} ${e.lastName}`,
220
+ size: 30
221
+ }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("p", {
222
+ className: "font-medium",
223
+ children: [
224
+ e.firstName,
225
+ " ",
226
+ e.lastName
227
+ ]
228
+ }), /* @__PURE__ */ y("p", {
229
+ className: "text-xs text-text-secondary",
230
+ children: e.email
231
+ })] })]
232
+ })
174
233
  },
175
234
  {
176
235
  key: "position",
177
236
  header: "Position",
178
237
  priority: "secondary",
179
- cell: (e) => /* @__PURE__ */ m("span", {
238
+ cell: (e) => /* @__PURE__ */ y("span", {
180
239
  className: "text-text-secondary",
181
240
  children: e.position
182
241
  })
@@ -185,7 +244,7 @@ var O = [
185
244
  key: "source",
186
245
  header: "Source",
187
246
  priority: "secondary",
188
- cell: (e) => /* @__PURE__ */ m(g, {
247
+ cell: (e) => /* @__PURE__ */ y(x, {
189
248
  variant: "outline",
190
249
  className: "w-fit h-fit text-[10px]",
191
250
  children: e.source
@@ -195,22 +254,22 @@ var O = [
195
254
  key: "experience",
196
255
  header: "Experience",
197
256
  priority: "secondary",
198
- cell: (e) => /* @__PURE__ */ h("span", { children: [e.experience, " yrs"] })
257
+ cell: (e) => /* @__PURE__ */ b("span", { children: [e.experience, " yrs"] })
199
258
  },
200
259
  {
201
260
  key: "rating",
202
261
  header: "Rating",
203
262
  priority: "secondary",
204
- cell: (e) => /* @__PURE__ */ h("span", {
205
- className: "flex items-center gap-1",
206
- children: [/* @__PURE__ */ m(f, { className: "h-3 w-3 text-status-warning-text" }), e.rating]
263
+ cell: (e) => /* @__PURE__ */ y(i, {
264
+ value: e.rating,
265
+ size: 13
207
266
  })
208
267
  },
209
268
  {
210
269
  key: "applied",
211
270
  header: "Applied",
212
271
  priority: "hidden-on-mobile",
213
- cell: (e) => /* @__PURE__ */ m("span", {
272
+ cell: (e) => /* @__PURE__ */ y("span", {
214
273
  className: "text-text-secondary text-xs",
215
274
  children: e.appliedDate
216
275
  })
@@ -219,160 +278,295 @@ var O = [
219
278
  key: "status",
220
279
  header: "Status",
221
280
  priority: "secondary",
222
- cell: (e) => /* @__PURE__ */ m(g, {
281
+ cell: (e) => /* @__PURE__ */ y(x, {
223
282
  variant: e.status === "hired" || e.status === "offer" ? "default" : e.status === "rejected" ? "destructive" : "secondary",
224
283
  className: "text-[10px]",
225
284
  children: t(e.status)
226
285
  })
227
286
  }
228
287
  ];
229
- function M() {
230
- let { showToast: t } = D(), { candidates: i, addCandidate: a, updateCandidate: o, removeCandidate: f } = e(), [g, M] = c(""), [N, P] = c("all"), { page: F, pageSize: I, offset: L, setPage: R } = E({ initialPageSize: 25 }), [z, B] = c(!1), [V, H] = c(null), [U, W] = c(null), G = async (e) => {
231
- await a({
232
- id: s(),
233
- ...A(e)
234
- }), t("Candidate added", "success");
235
- }, K = async (e) => {
236
- V && (await o(V.id, A(e)), t("Candidate updated", "success"));
237
- }, q = async () => {
238
- U && (await f(U.id), t("Candidate removed", "success"));
239
- }, J = [...new Set(i.map((e) => e.status))], Y = i.filter((e) => {
240
- let t = `${e.firstName} ${e.lastName} ${e.position} ${e.email}`.toLowerCase().includes(g.toLowerCase()), n = N === "all" || e.status === N;
241
- return t && n;
242
- }), X = Y.slice(L, L + I);
243
- return /* @__PURE__ */ h("div", {
288
+ function U() {
289
+ let { showToast: n } = re(), { candidates: i, addCandidate: s, updateCandidate: c, removeCandidate: l } = e(), [f, x] = d(""), [w, T] = d("board"), [E, D] = d("all"), { page: O, pageSize: k, offset: I, setPage: V } = ne({ initialPageSize: 25 }), [U, G] = d(!1), [K, q] = d(null), [J, Y] = d(null), X = async (e) => {
290
+ await s({
291
+ id: ee(),
292
+ ...B(e)
293
+ }), n("Candidate added", "success");
294
+ }, ie = async (e) => {
295
+ K && (await c(K.id, B(e)), n("Candidate updated", "success"));
296
+ }, ae = async () => {
297
+ J && (await l(J.id), n("Candidate removed", "success"));
298
+ }, oe = async (e, r) => {
299
+ if (e.status !== r) try {
300
+ await c(e.id, { status: r }), n(`${e.firstName} ${e.lastName} moved to ${t(r)}`, "success");
301
+ } catch {
302
+ n("Could not move candidate", "error");
303
+ }
304
+ }, Z = f.toLowerCase(), Q = u(() => i.filter((e) => `${e.firstName} ${e.lastName} ${e.position} ${e.email}`.toLowerCase().includes(Z)), [i, Z]), $ = Q.filter((e) => E === "all" || e.status === E), se = $.slice(I, I + k), ce = L.map((e) => {
305
+ let t = Q.filter((t) => t.status === e.key).sort((e, t) => t.rating - e.rating);
306
+ return {
307
+ id: e.key,
308
+ title: e.label,
309
+ accent: e.accent,
310
+ items: t.map((e) => /* @__PURE__ */ y(W, {
311
+ candidate: e,
312
+ onMove: oe,
313
+ onEdit: () => q(e),
314
+ onDelete: () => Y(e)
315
+ }, e.id))
316
+ };
317
+ });
318
+ return /* @__PURE__ */ b("div", {
244
319
  className: "space-y-6 p-6",
245
320
  children: [
246
- /* @__PURE__ */ h("div", {
247
- className: "flex items-center justify-between",
248
- children: [/* @__PURE__ */ h("div", { children: [
249
- /* @__PURE__ */ m("h1", {
321
+ /* @__PURE__ */ b("div", {
322
+ className: "flex flex-wrap items-start justify-between gap-3",
323
+ children: [/* @__PURE__ */ b("div", { children: [
324
+ /* @__PURE__ */ y("h1", {
250
325
  className: "text-2xl font-semibold",
251
- children: /* @__PURE__ */ m(b, { children: "Candidates" })
326
+ children: /* @__PURE__ */ y(j, { children: "Candidate Pipeline" })
252
327
  }),
253
- /* @__PURE__ */ h("p", {
328
+ /* @__PURE__ */ b("p", {
254
329
  className: "text-sm text-text-secondary",
255
330
  children: [i.length, " candidates in pipeline"]
256
331
  }),
257
- /* @__PURE__ */ m(C, {
332
+ /* @__PURE__ */ y(P, {
258
333
  className: "mt-1",
259
- children: "Your candidate pool — search, filter, and evaluate the people you're considering so you can fill open roles with the right talent."
334
+ children: "Track every candidate as they move through your hiring stages — drag work through New, Screening, Interview, Assessment, Offer, and Hired to keep the pipeline flowing."
260
335
  })
261
- ] }), /* @__PURE__ */ h(_, {
336
+ ] }), /* @__PURE__ */ b(S, {
262
337
  size: "sm",
263
- onClick: () => B(!0),
264
- children: [/* @__PURE__ */ m(u, { className: "h-4 w-4 mr-1" }), "Add Candidate"]
338
+ onClick: () => G(!0),
339
+ children: [/* @__PURE__ */ y(h, { className: "h-4 w-4 mr-1" }), "Add Candidate"]
265
340
  })]
266
341
  }),
267
- /* @__PURE__ */ h("div", {
268
- className: "flex gap-3 flex-wrap",
269
- children: [/* @__PURE__ */ h("div", {
270
- className: "relative flex-1 max-w-sm",
271
- children: [/* @__PURE__ */ m(d, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ m(S, {
342
+ /* @__PURE__ */ b("div", {
343
+ className: "flex flex-wrap items-center gap-3",
344
+ children: [/* @__PURE__ */ b("div", {
345
+ className: "relative flex-1 min-w-[12rem] max-w-sm",
346
+ children: [/* @__PURE__ */ y(g, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ y(N, {
272
347
  placeholder: "Search candidates...",
273
348
  className: "pl-9",
274
- value: g,
349
+ value: f,
275
350
  onChange: (e) => {
276
- M(e.target.value), R(1);
351
+ x(e.target.value), V(1);
277
352
  }
278
353
  })]
279
- }), /* @__PURE__ */ h("div", {
280
- className: "flex gap-1",
281
- children: [/* @__PURE__ */ m(_, {
282
- variant: N === "all" ? "default" : "outline",
354
+ }), /* @__PURE__ */ b("div", {
355
+ className: "inline-flex items-center gap-1 rounded-full border border-border-subtle bg-bg-sunken p-1",
356
+ children: [/* @__PURE__ */ b(S, {
357
+ variant: w === "board" ? "default" : "ghost",
283
358
  size: "sm",
284
- onClick: () => {
285
- P("all"), R(1);
286
- },
287
- children: "All"
288
- }), J.map((e) => /* @__PURE__ */ m(_, {
289
- variant: N === e ? "default" : "outline",
359
+ className: "rounded-full",
360
+ onClick: () => T("board"),
361
+ children: [/* @__PURE__ */ y(p, { className: "h-4 w-4 mr-1" }), "Board"]
362
+ }), /* @__PURE__ */ b(S, {
363
+ variant: w === "table" ? "default" : "ghost",
290
364
  size: "sm",
291
- onClick: () => {
292
- P(e), R(1);
293
- },
294
- children: e
295
- }, e))]
365
+ className: "rounded-full",
366
+ onClick: () => T("table"),
367
+ children: [/* @__PURE__ */ y(_, { className: "h-4 w-4 mr-1" }), "Table"]
368
+ })]
296
369
  })]
297
370
  }),
298
- /* @__PURE__ */ m(y, {
371
+ i.length === 0 ? /* @__PURE__ */ y(A, {
372
+ treatment: "glass",
373
+ className: "border-border-seam",
374
+ children: /* @__PURE__ */ y(C, {
375
+ className: "p-4",
376
+ children: /* @__PURE__ */ y(M, {
377
+ illustration: "empty-search",
378
+ title: "No candidates yet",
379
+ description: "Add your first candidate to start building the pipeline."
380
+ })
381
+ })
382
+ }) : w === "board" ? /* @__PURE__ */ y(r, {
383
+ columns: ce,
384
+ emptyColumnHint: "No candidates in this stage"
385
+ }) : /* @__PURE__ */ y(A, {
299
386
  treatment: "glass",
300
387
  glow: !0,
301
388
  className: "border-border-seam",
302
- children: /* @__PURE__ */ h(v, {
389
+ children: /* @__PURE__ */ b(C, {
303
390
  className: "p-4",
304
- children: [/* @__PURE__ */ m(T, {
305
- data: X,
306
- rowKey: (e) => e.id,
307
- columns: j,
308
- emptyState: /* @__PURE__ */ m(x, {
309
- illustration: "empty-search",
310
- title: "No candidates match",
311
- description: "Try a different search term or status filter."
312
- }),
313
- rowActions: (e) => /* @__PURE__ */ h("div", {
314
- className: "flex items-center justify-end gap-1",
315
- children: [/* @__PURE__ */ m(_, {
316
- variant: "ghost",
391
+ children: [
392
+ /* @__PURE__ */ b("div", {
393
+ className: "mb-3 flex flex-wrap gap-1",
394
+ children: [/* @__PURE__ */ y(S, {
395
+ variant: E === "all" ? "default" : "outline",
317
396
  size: "sm",
318
- "aria-label": `Edit ${e.firstName} ${e.lastName}`,
319
- onClick: () => H(e),
320
- children: /* @__PURE__ */ m(l, { className: "h-3.5 w-3.5" })
321
- }), /* @__PURE__ */ m(_, {
322
- variant: "ghost",
397
+ onClick: () => {
398
+ D("all"), V(1);
399
+ },
400
+ children: "All"
401
+ }), L.map((e) => /* @__PURE__ */ y(S, {
402
+ variant: E === e.key ? "default" : "outline",
323
403
  size: "sm",
324
- "aria-label": `Delete ${e.firstName} ${e.lastName}`,
325
- onClick: () => W(e),
326
- children: /* @__PURE__ */ m(p, { className: "h-3.5 w-3.5 text-status-error-fg" })
327
- })]
328
- })
329
- }), Y.length > I && /* @__PURE__ */ m("div", {
330
- className: "mt-4",
331
- children: /* @__PURE__ */ m(w, {
332
- page: F,
333
- pageSize: I,
334
- totalItems: Y.length,
335
- onPageChange: R
404
+ onClick: () => {
405
+ D(e.key), V(1);
406
+ },
407
+ children: e.label
408
+ }, e.key))]
409
+ }),
410
+ /* @__PURE__ */ y(te, {
411
+ data: se,
412
+ rowKey: (e) => e.id,
413
+ columns: H,
414
+ emptyState: /* @__PURE__ */ y(M, {
415
+ illustration: "empty-search",
416
+ title: "No candidates match",
417
+ description: "Try a different search term or status filter."
418
+ }),
419
+ rowActions: (e) => /* @__PURE__ */ b("div", {
420
+ className: "flex items-center justify-end gap-1",
421
+ children: [/* @__PURE__ */ y(S, {
422
+ variant: "ghost",
423
+ size: "sm",
424
+ "aria-label": `Edit ${e.firstName} ${e.lastName}`,
425
+ onClick: () => q(e),
426
+ children: /* @__PURE__ */ y(m, { className: "h-3.5 w-3.5" })
427
+ }), /* @__PURE__ */ y(S, {
428
+ variant: "ghost",
429
+ size: "sm",
430
+ "aria-label": `Delete ${e.firstName} ${e.lastName}`,
431
+ onClick: () => Y(e),
432
+ children: /* @__PURE__ */ y(v, { className: "h-3.5 w-3.5 text-status-error-fg" })
433
+ })]
434
+ })
435
+ }),
436
+ $.length > k && /* @__PURE__ */ y("div", {
437
+ className: "mt-4",
438
+ children: /* @__PURE__ */ y(F, {
439
+ page: O,
440
+ pageSize: k,
441
+ totalItems: $.length,
442
+ onPageChange: V
443
+ })
336
444
  })
337
- })]
445
+ ]
338
446
  })
339
447
  }),
340
- /* @__PURE__ */ m(n, {
341
- open: z,
342
- onOpenChange: B,
448
+ /* @__PURE__ */ y(a, {
449
+ open: U,
450
+ onOpenChange: G,
343
451
  title: "Add Candidate",
344
452
  description: "Add someone to your hiring pipeline.",
345
- fields: O,
453
+ fields: R,
346
454
  submitLabel: "Add candidate",
347
- onSubmit: G
455
+ onSubmit: X
348
456
  }),
349
- /* @__PURE__ */ m(n, {
350
- open: V !== null,
457
+ /* @__PURE__ */ y(a, {
458
+ open: K !== null,
351
459
  onOpenChange: (e) => {
352
- e || H(null);
460
+ e || q(null);
353
461
  },
354
462
  title: "Edit Candidate",
355
- description: V ? `${V.firstName} ${V.lastName}` : void 0,
356
- fields: O,
357
- initialValues: V ? k(V) : void 0,
463
+ description: K ? `${K.firstName} ${K.lastName}` : void 0,
464
+ fields: R,
465
+ initialValues: K ? z(K) : void 0,
358
466
  submitLabel: "Save changes",
359
- onSubmit: K
467
+ onSubmit: ie
360
468
  }),
361
- /* @__PURE__ */ m(r, {
362
- open: U !== null,
469
+ /* @__PURE__ */ y(o, {
470
+ open: J !== null,
363
471
  onOpenChange: (e) => {
364
- e || W(null);
472
+ e || Y(null);
365
473
  },
366
474
  title: "Remove candidate",
367
- description: U ? `Remove ${U.firstName} ${U.lastName} from the pipeline?` : void 0,
475
+ description: J ? `Remove ${J.firstName} ${J.lastName} from the pipeline?` : void 0,
368
476
  confirmLabel: "Remove",
369
477
  destructive: !0,
370
- onConfirm: q
478
+ onConfirm: ae
479
+ })
480
+ ]
481
+ });
482
+ }
483
+ function W({ candidate: e, onMove: t, onEdit: n, onDelete: r }) {
484
+ let a = `${e.firstName} ${e.lastName}`;
485
+ return /* @__PURE__ */ b("div", {
486
+ className: "group rounded-[var(--radius-input)] border border-border-subtle bg-bg-surface p-3 shadow-elevation-1 transition-shadow hover:shadow-elevation-2",
487
+ children: [
488
+ /* @__PURE__ */ b("div", {
489
+ className: "flex items-start gap-2.5",
490
+ children: [/* @__PURE__ */ y(V, {
491
+ name: a,
492
+ size: 36
493
+ }), /* @__PURE__ */ b("div", {
494
+ className: "min-w-0 flex-1",
495
+ children: [/* @__PURE__ */ y("p", {
496
+ className: "truncate text-sm font-semibold text-text-primary",
497
+ children: a
498
+ }), /* @__PURE__ */ y("p", {
499
+ className: "truncate text-xs text-text-secondary",
500
+ children: e.position
501
+ })]
502
+ })]
503
+ }),
504
+ /* @__PURE__ */ b("div", {
505
+ className: "mt-2 flex items-center justify-between gap-2",
506
+ children: [/* @__PURE__ */ y(i, {
507
+ value: e.rating,
508
+ size: 13
509
+ }), /* @__PURE__ */ y(x, {
510
+ variant: "outline",
511
+ className: "shrink-0 text-[9px]",
512
+ children: e.source
513
+ })]
514
+ }),
515
+ e.skills.length > 0 && /* @__PURE__ */ y("div", {
516
+ className: "mt-2 flex flex-wrap gap-1",
517
+ children: e.skills.slice(0, 3).map((e) => /* @__PURE__ */ y(x, {
518
+ variant: "secondary",
519
+ className: "text-[9px]",
520
+ children: e
521
+ }, e))
522
+ }),
523
+ /* @__PURE__ */ b("div", {
524
+ className: "mt-2.5 flex items-center justify-between gap-1 border-t border-border-subtle pt-2",
525
+ children: [/* @__PURE__ */ b(w, { children: [/* @__PURE__ */ y(k, {
526
+ asChild: !0,
527
+ children: /* @__PURE__ */ b(S, {
528
+ variant: "ghost",
529
+ size: "sm",
530
+ className: "h-7 px-2 text-xs",
531
+ children: [/* @__PURE__ */ y(f, { className: "mr-1 h-3.5 w-3.5" }), "Move"]
532
+ })
533
+ }), /* @__PURE__ */ b(T, {
534
+ align: "start",
535
+ children: [
536
+ /* @__PURE__ */ y(D, { children: "Move to stage" }),
537
+ /* @__PURE__ */ y(O, {}),
538
+ L.filter((t) => t.key !== e.status).map((n) => /* @__PURE__ */ b(E, {
539
+ onSelect: () => t(e, n.key),
540
+ children: [/* @__PURE__ */ y("span", {
541
+ "aria-hidden": "true",
542
+ className: "mr-2 inline-block h-2 w-2 rounded-full",
543
+ style: { backgroundColor: n.accent }
544
+ }), n.label]
545
+ }, n.key))
546
+ ]
547
+ })] }), /* @__PURE__ */ b("div", {
548
+ className: "flex items-center gap-0.5",
549
+ children: [/* @__PURE__ */ y(S, {
550
+ variant: "ghost",
551
+ size: "sm",
552
+ className: "h-7 w-7 p-0",
553
+ "aria-label": `Edit ${a}`,
554
+ onClick: n,
555
+ children: /* @__PURE__ */ y(m, { className: "h-3.5 w-3.5" })
556
+ }), /* @__PURE__ */ y(S, {
557
+ variant: "ghost",
558
+ size: "sm",
559
+ className: "h-7 w-7 p-0",
560
+ "aria-label": `Delete ${a}`,
561
+ onClick: r,
562
+ children: /* @__PURE__ */ y(v, { className: "h-3.5 w-3.5 text-status-error-fg" })
563
+ })]
564
+ })]
371
565
  })
372
566
  ]
373
567
  });
374
568
  }
375
569
  //#endregion
376
- export { M as HiringCandidatesPagePage };
570
+ export { U as HiringCandidatesPagePage };
377
571
 
378
572
  //# sourceMappingURL=HiringCandidatesPagePage.js.map