@burdenoff/microfe-crewfoundry 2026.704.5 → 2026.704.7

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 (155) 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/HiringApplicationsPagePage.js +84 -75
  81. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  82. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +368 -174
  83. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  84. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +236 -201
  85. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  86. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +369 -196
  87. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  88. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +252 -249
  89. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  90. package/dist/crewfoundry/pages/HiringJobsPagePage.js +210 -110
  91. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  92. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +216 -178
  93. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  94. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js +385 -0
  95. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js.map +1 -0
  96. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +189 -130
  97. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  98. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +397 -241
  99. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  100. package/dist/crewfoundry/pages/HrPayrollPagePage.js +262 -147
  101. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  102. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +345 -167
  103. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  104. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +98 -24
  105. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  106. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +35 -31
  107. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  108. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +289 -108
  109. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  110. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +221 -114
  111. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  112. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +136 -133
  113. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  114. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +148 -97
  115. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  116. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +264 -157
  117. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  118. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  119. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +85 -93
  120. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  121. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +211 -122
  122. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  123. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +94 -54
  124. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  125. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +28 -25
  126. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  127. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +290 -138
  128. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  129. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +169 -79
  130. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  131. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  132. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +65 -61
  133. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  134. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +296 -125
  135. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  136. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js +187 -0
  137. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js.map +1 -0
  138. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +142 -76
  139. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  140. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +93 -43
  141. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  142. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  143. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +250 -98
  144. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  145. package/dist/crewfoundry/store/crewfoundryStore.js +1 -1
  146. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  147. package/dist/crewfoundry/utils/cn.js +10 -0
  148. package/dist/crewfoundry/utils/cn.js.map +1 -0
  149. package/dist/crewfoundry/utils/courseProgress.js +46 -0
  150. package/dist/crewfoundry/utils/courseProgress.js.map +1 -0
  151. package/dist/node_modules/clsx/dist/clsx.js +18 -0
  152. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  153. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
  154. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  155. package/package.json +1 -1
@@ -1,16 +1,20 @@
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 } from "../components/forms/formValues.js";
6
- import { useState as s } from "react";
7
- import { Briefcase as c, Calendar as l, CheckCircle as u, DollarSign as d, MapPin as f, Pencil as p, Share2 as m, Trash2 as h, Users as g } from "lucide-react";
8
- import { useNavigate as _, useSearchParams as v } from "react-router-dom";
9
- import { jsx as y, jsxs as b } from "react/jsx-runtime";
10
- import { Badge as x, Button as S, Card as C, CardContent as w, CardDescription as T, CardHeader as E, CardTitle as D, GlassCard as O, GradientText as k, IllustratedEmptyState as A, NextSteps as j, PagePurpose as M, ResponsiveTable as N } from "@burdenoff/fe-libs/ui";
11
- import { useGlobalUi as P } from "@burdenoff/fe-libs/shared/providers/shell";
3
+ import { getInitials as n } from "../components/viz/lib/format.js";
4
+ import { HBarFunnel as r } from "../components/viz/HBarFunnel.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 } from "../components/forms/formValues.js";
10
+ import { useState as u } from "react";
11
+ import { Briefcase as d, Calendar as f, CheckCircle as p, MapPin as m, Pencil as h, Share2 as g, Trash2 as ee, Users as _ } from "lucide-react";
12
+ import { useNavigate as v, useSearchParams as y } from "react-router-dom";
13
+ import { jsx as b, jsxs as x } from "react/jsx-runtime";
14
+ import { Badge as S, Button as C, Card as w, CardContent as T, CardHeader as E, CardTitle as D, GlassCard as O, GradientText as k, IllustratedEmptyState as A, PagePurpose as j, Spinner as M } from "@burdenoff/fe-libs/ui";
15
+ import { useGlobalUi as N } from "@burdenoff/fe-libs/shared/providers/shell";
12
16
  //#region src/crewfoundry/pages/HiringJobDetailsPagePage.tsx
13
- var F = [
17
+ var P = [
14
18
  {
15
19
  name: "title",
16
20
  label: "Job Title",
@@ -138,63 +142,63 @@ var F = [
138
142
  label: "Benefits",
139
143
  type: "tags"
140
144
  }
141
- ], I = [
142
- {
143
- key: "name",
144
- header: "Name",
145
- priority: "primary",
146
- cell: (e) => /* @__PURE__ */ b("span", {
147
- className: "font-medium",
148
- children: [
149
- e.firstName,
150
- " ",
151
- e.lastName
152
- ]
153
- })
154
- },
155
- {
156
- key: "source",
157
- header: "Source",
158
- priority: "secondary",
159
- cell: (e) => /* @__PURE__ */ y("span", {
160
- className: "text-text-secondary",
161
- children: e.source
162
- })
163
- },
164
- {
165
- key: "experience",
166
- header: "Experience",
167
- priority: "secondary",
168
- cell: (e) => /* @__PURE__ */ b("span", { children: [e.experience, " yrs"] })
169
- },
170
- {
171
- key: "rating",
172
- header: "Rating",
173
- priority: "secondary",
174
- cell: (e) => /* @__PURE__ */ b("span", { children: [e.rating, "/5"] })
175
- },
176
- {
177
- key: "status",
178
- header: "Status",
179
- priority: "secondary",
180
- cell: (e) => /* @__PURE__ */ y(x, {
181
- variant: e.status === "hired" ? "default" : "secondary",
182
- className: "text-[10px]",
183
- children: t(e.status)
184
- })
185
- }
186
- ];
145
+ ], F = {
146
+ new: "outline",
147
+ screening: "secondary",
148
+ interview: "secondary",
149
+ assessment: "secondary",
150
+ offer: "default",
151
+ hired: "default",
152
+ rejected: "destructive"
153
+ };
154
+ function I({ name: e, size: t = 32 }) {
155
+ return /* @__PURE__ */ b("span", {
156
+ 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",
157
+ style: {
158
+ width: t,
159
+ height: t,
160
+ fontSize: Math.round(t * .36)
161
+ },
162
+ "aria-hidden": "true",
163
+ children: n(e)
164
+ });
165
+ }
187
166
  function L() {
188
- let L = _(), [R] = v(), { showToast: z } = P(), { jobPostings: B, candidates: V, updateJobPosting: H, removeJobPosting: U } = e(), W = R.get("id"), G = W ? B.find((e) => e.id === W) : B[0], [K, q] = s(!1), [J, Y] = s(!1);
189
- if (!G) return /* @__PURE__ */ y("div", {
167
+ let n = v(), [L] = y(), { showToast: R } = N(), { jobPostings: z, candidates: B, updateJobPosting: V, removeJobPosting: H, initialized: U } = e(), W = L.get("id"), G = W ? z.find((e) => e.id === W) : z[0], [K, q] = u(!1), [J, Y] = u(!1);
168
+ if (!U && !G) return /* @__PURE__ */ b("div", {
169
+ className: "flex min-h-[60vh] items-center justify-center p-6",
170
+ children: /* @__PURE__ */ b(M, { size: "lg" })
171
+ });
172
+ if (!G) return /* @__PURE__ */ b("div", {
190
173
  className: "p-6",
191
- children: /* @__PURE__ */ y(A, {
174
+ children: /* @__PURE__ */ b(A, {
192
175
  illustration: "empty-search",
193
176
  title: "No job posting found",
194
177
  description: "This job posting is no longer available."
195
178
  })
196
179
  });
197
- let X = V.filter((e) => e.position === G.title), Z = {
180
+ let X = G.title.trim().toLowerCase(), Z = B.filter((e) => e.position.trim().toLowerCase() === X), Q = (e) => Z.filter((t) => t.status === e).length, $ = Q("interview"), te = [
181
+ {
182
+ label: "Applied",
183
+ value: Z.length
184
+ },
185
+ {
186
+ label: "Screening",
187
+ value: Q("screening")
188
+ },
189
+ {
190
+ label: "Interview",
191
+ value: $
192
+ },
193
+ {
194
+ label: "Assessment",
195
+ value: Q("assessment")
196
+ },
197
+ {
198
+ label: "Offer",
199
+ value: Q("offer") + Q("hired")
200
+ }
201
+ ], ne = {
198
202
  title: G.title,
199
203
  department: G.department,
200
204
  location: G.location,
@@ -208,222 +212,221 @@ function L() {
208
212
  requirements: G.requirements,
209
213
  benefits: G.benefits
210
214
  };
211
- return /* @__PURE__ */ b("div", {
212
- className: "space-y-6 p-6 max-w-4xl",
215
+ return /* @__PURE__ */ x("div", {
216
+ className: "space-y-6 p-6",
213
217
  children: [
214
- /* @__PURE__ */ b("div", {
215
- className: "flex items-center justify-between",
216
- children: [/* @__PURE__ */ b("div", { children: [
217
- /* @__PURE__ */ b("div", {
218
- className: "flex items-center gap-2 mb-1",
219
- children: [/* @__PURE__ */ y("h1", {
220
- className: "text-2xl font-semibold",
221
- children: /* @__PURE__ */ y(k, { children: G.title })
222
- }), /* @__PURE__ */ y(x, {
223
- variant: G.status === "active" ? "default" : "secondary",
224
- children: t(G.status)
225
- })]
226
- }),
227
- /* @__PURE__ */ b("div", {
228
- className: "flex items-center gap-4 text-sm text-text-secondary",
218
+ /* @__PURE__ */ b(O, {
219
+ treatment: "glass",
220
+ glow: !0,
221
+ className: "border-border-seam",
222
+ children: /* @__PURE__ */ x(T, {
223
+ className: "flex flex-col gap-4 p-6 lg:flex-row lg:items-start lg:justify-between",
224
+ children: [/* @__PURE__ */ x("div", {
225
+ className: "min-w-0",
229
226
  children: [
230
- /* @__PURE__ */ b("span", {
231
- className: "flex items-center gap-1",
232
- children: [/* @__PURE__ */ y(c, { className: "h-3 w-3" }), G.department]
227
+ /* @__PURE__ */ x("div", {
228
+ className: "mb-1 flex flex-wrap items-center gap-2",
229
+ children: [/* @__PURE__ */ b("h1", {
230
+ className: "text-2xl font-semibold",
231
+ children: /* @__PURE__ */ b(k, { children: G.title })
232
+ }), /* @__PURE__ */ b(S, {
233
+ variant: G.status === "active" ? "default" : "secondary",
234
+ children: t(G.status)
235
+ })]
233
236
  }),
234
- /* @__PURE__ */ b("span", {
235
- className: "flex items-center gap-1",
236
- children: [/* @__PURE__ */ y(f, { className: "h-3 w-3" }), G.location]
237
+ /* @__PURE__ */ x("div", {
238
+ className: "flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-text-secondary",
239
+ children: [
240
+ /* @__PURE__ */ x("span", {
241
+ className: "flex items-center gap-1",
242
+ children: [/* @__PURE__ */ b(d, { className: "h-3.5 w-3.5" }), G.department]
243
+ }),
244
+ /* @__PURE__ */ x("span", {
245
+ className: "flex items-center gap-1",
246
+ children: [/* @__PURE__ */ b(m, { className: "h-3.5 w-3.5" }), G.location]
247
+ }),
248
+ /* @__PURE__ */ b("span", { children: t(G.type) })
249
+ ]
237
250
  }),
238
- /* @__PURE__ */ b("span", {
239
- className: "flex items-center gap-1",
251
+ /* @__PURE__ */ x("div", {
252
+ className: "mt-2 flex flex-wrap items-center gap-2 text-xs text-text-secondary",
240
253
  children: [
241
- /* @__PURE__ */ y(l, { className: "h-3 w-3" }),
242
- "Posted ",
243
- G.postedDate
254
+ /* @__PURE__ */ x(S, {
255
+ variant: "secondary",
256
+ className: "text-[10px]",
257
+ children: [Z.length, " applicants"]
258
+ }),
259
+ $ > 0 && /* @__PURE__ */ x(S, {
260
+ variant: "secondary",
261
+ className: "text-[10px]",
262
+ children: [$, " in interview"]
263
+ }),
264
+ /* @__PURE__ */ x("span", {
265
+ className: "flex items-center gap-1",
266
+ children: [
267
+ /* @__PURE__ */ b(f, { className: "h-3 w-3" }),
268
+ "Posted ",
269
+ G.postedDate
270
+ ]
271
+ })
244
272
  ]
273
+ }),
274
+ /* @__PURE__ */ b(j, {
275
+ className: "mt-3",
276
+ children: "Everything about this role in one place — review applicants, requirements, and compensation to decide who to interview and keep the posting current."
245
277
  })
246
278
  ]
247
- }),
248
- /* @__PURE__ */ y(M, {
249
- className: "mt-2",
250
- children: "Everything about this role in one place — review applicants, requirements, and compensation here to decide who to interview and keep the posting current."
251
- })
252
- ] }), /* @__PURE__ */ b("div", {
253
- className: "flex gap-2",
279
+ }), /* @__PURE__ */ x("div", {
280
+ className: "flex shrink-0 flex-col items-start gap-3 lg:items-end",
281
+ children: [/* @__PURE__ */ x("div", {
282
+ className: "text-2xl font-bold tabular-nums text-text-primary",
283
+ children: [
284
+ "$",
285
+ (G.salaryMin / 1e3).toFixed(0),
286
+ "k – $",
287
+ (G.salaryMax / 1e3).toFixed(0),
288
+ "k"
289
+ ]
290
+ }), /* @__PURE__ */ x("div", {
291
+ className: "flex flex-wrap gap-2",
292
+ children: [
293
+ /* @__PURE__ */ x(C, {
294
+ variant: "outline",
295
+ size: "sm",
296
+ onClick: async () => {
297
+ try {
298
+ await navigator.clipboard.writeText(window.location.href), R("Job link copied to clipboard", "success");
299
+ } catch {
300
+ R("Could not copy the job link", "error");
301
+ }
302
+ },
303
+ children: [/* @__PURE__ */ b(g, { className: "mr-1 h-4 w-4" }), "Share"]
304
+ }),
305
+ /* @__PURE__ */ x(C, {
306
+ variant: "outline",
307
+ size: "sm",
308
+ onClick: () => q(!0),
309
+ children: [/* @__PURE__ */ b(h, { className: "mr-1 h-4 w-4" }), "Edit"]
310
+ }),
311
+ /* @__PURE__ */ b(C, {
312
+ variant: "destructive",
313
+ size: "sm",
314
+ "aria-label": "Delete job posting",
315
+ onClick: () => Y(!0),
316
+ children: /* @__PURE__ */ b(ee, { className: "h-4 w-4" })
317
+ }),
318
+ /* @__PURE__ */ x(C, {
319
+ size: "sm",
320
+ onClick: () => n(`../hiring/applications-page?position=${encodeURIComponent(G.title)}`),
321
+ children: [/* @__PURE__ */ b(_, { className: "mr-1 h-4 w-4" }), "View Applications"]
322
+ })
323
+ ]
324
+ })]
325
+ })]
326
+ })
327
+ }),
328
+ /* @__PURE__ */ x("div", {
329
+ className: "grid gap-6 lg:grid-cols-3",
330
+ children: [/* @__PURE__ */ x("div", {
331
+ className: "space-y-6 lg:col-span-2",
254
332
  children: [
255
- /* @__PURE__ */ b(S, {
256
- variant: "outline",
257
- size: "sm",
258
- onClick: () => z("Sharing job postings is coming soon", "info"),
259
- children: [/* @__PURE__ */ y(m, { className: "h-4 w-4 mr-1" }), "Share"]
260
- }),
261
- /* @__PURE__ */ b(S, {
262
- variant: "outline",
263
- size: "sm",
264
- onClick: () => q(!0),
265
- children: [/* @__PURE__ */ y(p, { className: "h-4 w-4 mr-1" }), "Edit Posting"]
266
- }),
267
- /* @__PURE__ */ y(S, {
268
- variant: "destructive",
269
- size: "sm",
270
- "aria-label": "Delete job posting",
271
- onClick: () => Y(!0),
272
- children: /* @__PURE__ */ y(h, { className: "h-4 w-4" })
273
- })
333
+ /* @__PURE__ */ x(w, { children: [/* @__PURE__ */ b(E, { children: /* @__PURE__ */ b(D, { children: "Description" }) }), /* @__PURE__ */ b(T, { children: /* @__PURE__ */ b("p", {
334
+ className: "text-sm leading-relaxed text-text-secondary",
335
+ children: G.description
336
+ }) })] }),
337
+ /* @__PURE__ */ x(w, { children: [/* @__PURE__ */ b(E, { children: /* @__PURE__ */ b(D, { children: "Requirements" }) }), /* @__PURE__ */ b(T, { children: G.requirements.length === 0 ? /* @__PURE__ */ b("p", {
338
+ className: "text-sm text-text-muted",
339
+ children: "No requirements listed."
340
+ }) : /* @__PURE__ */ b("ul", {
341
+ className: "space-y-2",
342
+ children: G.requirements.map((e, t) => /* @__PURE__ */ x("li", {
343
+ className: "flex items-start gap-2 text-sm",
344
+ children: [/* @__PURE__ */ b(p, { className: "mt-0.5 h-4 w-4 flex-shrink-0 text-status-success-text" }), e]
345
+ }, t))
346
+ }) })] }),
347
+ /* @__PURE__ */ x(w, { children: [/* @__PURE__ */ b(E, { children: /* @__PURE__ */ b(D, { children: "Benefits" }) }), /* @__PURE__ */ b(T, { children: G.benefits.length === 0 ? /* @__PURE__ */ b("p", {
348
+ className: "text-sm text-text-muted",
349
+ children: "No benefits listed."
350
+ }) : /* @__PURE__ */ b("div", {
351
+ className: "flex flex-wrap gap-2",
352
+ children: G.benefits.map((e, t) => /* @__PURE__ */ b(S, {
353
+ variant: "outline",
354
+ className: "rounded-full px-3 py-1 text-xs",
355
+ children: e
356
+ }, t))
357
+ }) })] })
274
358
  ]
275
- })]
276
- }),
277
- /* @__PURE__ */ y(j, {
278
- storageKey: "crewfoundry-job-details",
279
- steps: [
280
- {
281
- id: "applicants",
282
- label: "Review applicants",
283
- description: "Screen the candidates who applied for this role.",
284
- icon: /* @__PURE__ */ y(g, { className: "h-4 w-4" }),
285
- onClick: () => L("../hiring/applications-page")
286
- },
287
- {
288
- id: "interviews",
289
- label: "Schedule interviews",
290
- description: "Set up conversations with promising candidates.",
291
- icon: /* @__PURE__ */ y(l, { className: "h-4 w-4" }),
292
- onClick: () => L("../hiring/interviews-page")
293
- },
294
- {
295
- id: "candidates",
296
- label: "Browse your talent pool",
297
- description: "Source more candidates that fit this position.",
298
- icon: /* @__PURE__ */ y(c, { className: "h-4 w-4" }),
299
- onClick: () => L("../hiring/candidates-page")
300
- }
301
- ]
302
- }),
303
- /* @__PURE__ */ b("div", {
304
- className: "grid gap-4 md:grid-cols-4",
305
- children: [
306
- /* @__PURE__ */ y(O, {
307
- treatment: "glass",
308
- glow: !0,
309
- className: "border-border-seam",
310
- children: /* @__PURE__ */ b(w, {
311
- className: "p-4 text-center",
359
+ }), /* @__PURE__ */ x("div", {
360
+ className: "space-y-6",
361
+ children: [/* @__PURE__ */ x(w, { children: [/* @__PURE__ */ b(E, { children: /* @__PURE__ */ b(D, { children: "Candidates" }) }), /* @__PURE__ */ b(T, { children: Z.length === 0 ? /* @__PURE__ */ b("p", {
362
+ className: "text-sm text-text-muted",
363
+ children: "No applicants matched to this role yet."
364
+ }) : /* @__PURE__ */ b("ul", {
365
+ className: "max-h-96 space-y-1 overflow-y-auto pr-1",
366
+ children: Z.map((e) => /* @__PURE__ */ x("li", {
367
+ className: "flex items-center gap-2 rounded-[var(--radius-input)] px-2 py-2 hover:bg-bg-sunken",
312
368
  children: [
313
- /* @__PURE__ */ y(g, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
314
- /* @__PURE__ */ y("p", {
315
- className: "text-2xl font-bold tabular-nums",
316
- children: G.applicants
369
+ /* @__PURE__ */ b(I, {
370
+ name: `${e.firstName} ${e.lastName}`,
371
+ size: 30
317
372
  }),
318
- /* @__PURE__ */ y("p", {
319
- className: "text-xs text-text-secondary",
320
- children: "Applicants"
373
+ /* @__PURE__ */ x("span", {
374
+ className: "min-w-0 flex-1 truncate text-sm font-medium text-text-primary",
375
+ children: [
376
+ e.firstName,
377
+ " ",
378
+ e.lastName
379
+ ]
380
+ }),
381
+ /* @__PURE__ */ b(S, {
382
+ variant: F[e.status],
383
+ className: "shrink-0 text-[9px]",
384
+ children: t(e.status)
385
+ }),
386
+ /* @__PURE__ */ b(i, {
387
+ value: e.rating,
388
+ size: 12,
389
+ className: "shrink-0"
321
390
  })
322
391
  ]
323
- })
324
- }),
325
- /* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
326
- className: "p-4 text-center",
327
- children: [
328
- /* @__PURE__ */ y(d, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
329
- /* @__PURE__ */ b("p", {
330
- className: "text-lg font-bold",
331
- children: [
332
- "$",
333
- (G.salaryMin / 1e3).toFixed(0),
334
- "K-$",
335
- (G.salaryMax / 1e3).toFixed(0),
336
- "K"
337
- ]
338
- }),
339
- /* @__PURE__ */ y("p", {
340
- className: "text-xs text-text-secondary",
341
- children: "Salary Range"
342
- })
343
- ]
344
- }) }),
345
- /* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
346
- className: "p-4 text-center",
347
- children: [
348
- /* @__PURE__ */ y(l, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
349
- /* @__PURE__ */ y("p", {
350
- className: "text-lg font-bold",
351
- children: G.deadline
352
- }),
353
- /* @__PURE__ */ y("p", {
354
- className: "text-xs text-text-secondary",
355
- children: "Deadline"
356
- })
357
- ]
358
- }) }),
359
- /* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
360
- className: "p-4 text-center",
361
- children: [
362
- /* @__PURE__ */ y(u, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
363
- /* @__PURE__ */ y("p", {
364
- className: "text-lg font-bold",
365
- children: t(G.experienceLevel)
366
- }),
367
- /* @__PURE__ */ y("p", {
368
- className: "text-xs text-text-secondary",
369
- children: "Level"
370
- })
371
- ]
372
- }) })
373
- ]
374
- }),
375
- /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, { children: /* @__PURE__ */ y(D, { children: "Description" }) }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y("p", {
376
- className: "text-sm text-text-secondary",
377
- children: G.description
378
- }) })] }),
379
- /* @__PURE__ */ b("div", {
380
- className: "grid gap-4 md:grid-cols-2",
381
- children: [/* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, { children: /* @__PURE__ */ y(D, { children: "Requirements" }) }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y("ul", {
382
- className: "space-y-2",
383
- children: G.requirements.map((e, t) => /* @__PURE__ */ b("li", {
384
- className: "flex items-start gap-2 text-sm",
385
- children: [/* @__PURE__ */ y(u, { className: "h-4 w-4 text-status-success-text mt-0.5 flex-shrink-0" }), e]
386
- }, t))
387
- }) })] }), /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, { children: /* @__PURE__ */ y(D, { children: "Benefits" }) }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y("ul", {
388
- className: "space-y-2",
389
- children: G.benefits.map((e, t) => /* @__PURE__ */ b("li", {
390
- className: "flex items-start gap-2 text-sm",
391
- children: [/* @__PURE__ */ y(u, { className: "h-4 w-4 text-status-info-text mt-0.5 flex-shrink-0" }), e]
392
- }, t))
393
- }) })] })]
392
+ }, e.id))
393
+ }) })] }), /* @__PURE__ */ x(w, { children: [/* @__PURE__ */ b(E, { children: /* @__PURE__ */ b(D, { children: "Hiring funnel" }) }), /* @__PURE__ */ b(T, { children: Z.length === 0 ? /* @__PURE__ */ b("p", {
394
+ className: "text-sm text-text-muted",
395
+ children: "The funnel appears once candidates apply to this role."
396
+ }) : /* @__PURE__ */ b(r, {
397
+ stages: te,
398
+ valueFormatter: (e) => String(e),
399
+ showConversion: !0
400
+ }) })] })]
401
+ })]
394
402
  }),
395
- X.length > 0 && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ b(E, { children: [/* @__PURE__ */ y(D, { children: "Applicants for this Role" }), /* @__PURE__ */ b(T, { children: [X.length, " candidates"] })] }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y(N, {
396
- data: X,
397
- rowKey: (e) => e.id,
398
- columns: I
399
- }) })] }),
400
- /* @__PURE__ */ y(n, {
403
+ /* @__PURE__ */ b(a, {
401
404
  open: K,
402
405
  onOpenChange: q,
403
406
  title: "Edit Job Posting",
404
407
  description: "Update the role details, compensation, and status.",
405
- fields: F,
406
- initialValues: Z,
408
+ fields: P,
409
+ initialValues: ne,
407
410
  submitLabel: "Save changes",
408
411
  onSubmit: async (e) => {
409
412
  let t = {
410
- title: o(e, "title"),
411
- department: o(e, "department"),
412
- location: o(e, "location"),
413
+ title: l(e, "title"),
414
+ department: l(e, "department"),
415
+ location: l(e, "location"),
413
416
  type: e.type,
414
417
  experienceLevel: e.experienceLevel,
415
418
  status: e.status,
416
- salaryMin: i(e, "salaryMin"),
417
- salaryMax: i(e, "salaryMax"),
418
- deadline: o(e, "deadline"),
419
- description: o(e, "description"),
420
- requirements: a(e, "requirements"),
421
- benefits: a(e, "benefits")
419
+ salaryMin: s(e, "salaryMin"),
420
+ salaryMax: s(e, "salaryMax"),
421
+ deadline: l(e, "deadline"),
422
+ description: l(e, "description"),
423
+ requirements: c(e, "requirements"),
424
+ benefits: c(e, "benefits")
422
425
  };
423
- await H(G.id, t), z("Job posting updated", "success");
426
+ await V(G.id, t), R("Job posting updated", "success");
424
427
  }
425
428
  }),
426
- /* @__PURE__ */ y(r, {
429
+ /* @__PURE__ */ b(o, {
427
430
  open: J,
428
431
  onOpenChange: Y,
429
432
  title: "Delete job posting",
@@ -431,7 +434,7 @@ function L() {
431
434
  confirmLabel: "Delete",
432
435
  destructive: !0,
433
436
  onConfirm: async () => {
434
- await U(G.id), z("Job posting deleted", "success"), L("../hiring/jobs-page");
437
+ await H(G.id), R("Job posting deleted", "success"), n("../hiring/jobs-page");
435
438
  }
436
439
  })
437
440
  ]