@burdenoff/microfe-crewfoundry 2026.1030.3 → 2026.1102.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 (55) hide show
  1. package/dist/crewfoundry/CrewFoundryRoutes.d.ts.map +1 -1
  2. package/dist/crewfoundry/CrewFoundryRoutes.js +18 -14
  3. package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
  4. package/dist/crewfoundry/components/EmployeeSkillsPanel.d.ts +9 -0
  5. package/dist/crewfoundry/components/EmployeeSkillsPanel.d.ts.map +1 -1
  6. package/dist/crewfoundry/components/EmployeeSkillsPanel.js +111 -77
  7. package/dist/crewfoundry/components/EmployeeSkillsPanel.js.map +1 -1
  8. package/dist/crewfoundry/components/skills/FindPeopleBySkillCard.d.ts +13 -0
  9. package/dist/crewfoundry/components/skills/FindPeopleBySkillCard.d.ts.map +1 -0
  10. package/dist/crewfoundry/components/skills/FindPeopleBySkillCard.js +128 -0
  11. package/dist/crewfoundry/components/skills/FindPeopleBySkillCard.js.map +1 -0
  12. package/dist/crewfoundry/components/skills/MergeSkillDialog.d.ts +15 -0
  13. package/dist/crewfoundry/components/skills/MergeSkillDialog.d.ts.map +1 -0
  14. package/dist/crewfoundry/components/skills/MergeSkillDialog.js +58 -0
  15. package/dist/crewfoundry/components/skills/MergeSkillDialog.js.map +1 -0
  16. package/dist/crewfoundry/components/skills/RoleSkillMatchPanel.d.ts +15 -0
  17. package/dist/crewfoundry/components/skills/RoleSkillMatchPanel.d.ts.map +1 -0
  18. package/dist/crewfoundry/components/skills/RoleSkillMatchPanel.js +163 -0
  19. package/dist/crewfoundry/components/skills/RoleSkillMatchPanel.js.map +1 -0
  20. package/dist/crewfoundry/components/skills/SkillPicker.d.ts +20 -0
  21. package/dist/crewfoundry/components/skills/SkillPicker.d.ts.map +1 -0
  22. package/dist/crewfoundry/components/skills/SkillPicker.js +73 -0
  23. package/dist/crewfoundry/components/skills/SkillPicker.js.map +1 -0
  24. package/dist/crewfoundry/components/skills/SkillRelationsDialog.d.ts +13 -0
  25. package/dist/crewfoundry/components/skills/SkillRelationsDialog.d.ts.map +1 -0
  26. package/dist/crewfoundry/components/skills/SkillRelationsDialog.js +156 -0
  27. package/dist/crewfoundry/components/skills/SkillRelationsDialog.js.map +1 -0
  28. package/dist/crewfoundry/lib/analytics.d.ts +1 -29
  29. package/dist/crewfoundry/lib/analytics.d.ts.map +1 -1
  30. package/dist/crewfoundry/lib/analytics.js +3 -48
  31. package/dist/crewfoundry/lib/analytics.js.map +1 -1
  32. package/dist/crewfoundry/lib/skillMatching.d.ts +70 -0
  33. package/dist/crewfoundry/lib/skillMatching.d.ts.map +1 -0
  34. package/dist/crewfoundry/lib/skillMatching.js +73 -0
  35. package/dist/crewfoundry/lib/skillMatching.js.map +1 -0
  36. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.d.ts +8 -0
  37. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.d.ts.map +1 -1
  38. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +468 -212
  39. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
  40. package/dist/crewfoundry/pages/HiringCandidatesPagePage.d.ts.map +1 -1
  41. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +210 -177
  42. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js +6 -6
  44. package/dist/crewfoundry/pages/HrSkillsTaxonomyPagePage.d.ts +9 -0
  45. package/dist/crewfoundry/pages/HrSkillsTaxonomyPagePage.d.ts.map +1 -0
  46. package/dist/crewfoundry/pages/HrSkillsTaxonomyPagePage.js +456 -0
  47. package/dist/crewfoundry/pages/HrSkillsTaxonomyPagePage.js.map +1 -0
  48. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.d.ts.map +1 -1
  49. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js +50 -102
  50. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js.map +1 -1
  51. package/dist/crewfoundry/store/crewfoundryStore.d.ts +145 -0
  52. package/dist/crewfoundry/store/crewfoundryStore.d.ts.map +1 -1
  53. package/dist/crewfoundry/store/crewfoundryStore.js +188 -57
  54. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  55. package/package.json +1 -1
@@ -6,16 +6,17 @@ import { RatingStars as i } from "../components/viz/RatingStars.js";
6
6
  import "../components/viz/index.js";
7
7
  import { FormModal as a } from "../components/forms/FormModal.js";
8
8
  import { useFocusedRecordParam as o } from "../lib/useFocusedRecordParam.js";
9
- import { ConfirmDialog as s } from "../components/forms/ConfirmDialog.js";
10
- import { getNumber as c, getTags as l, getText as u, newClientId as d } from "../components/forms/formValues.js";
11
- import { useMemo as f, useState as p } from "react";
12
- import { ArrowRightLeft as m, LayoutGrid as h, Pencil as g, Plus as _, Search as v, Table2 as y, Trash2 as b } from "lucide-react";
13
- import { jsx as x, jsxs as S } from "react/jsx-runtime";
14
- import { Badge as C, Button as w, CardContent as T, DropdownMenu as E, DropdownMenuContent as D, DropdownMenuItem as O, DropdownMenuLabel as k, DropdownMenuSeparator as A, DropdownMenuTrigger as j, GlassCard as M, GradientText as N, IllustratedEmptyState as P, Input as F, PagePurpose as ee, Pagination as te, ResponsiveTable as ne } from "@burdenoff/fe-libs/ui";
15
- import { usePagination as re } from "@burdenoff/fe-libs/shared/hooks";
16
- import { useGlobalUi as ie } from "@burdenoff/fe-libs/shared/providers/shell";
9
+ import { CandidateSkillsPanel as s } from "../components/EmployeeSkillsPanel.js";
10
+ import { ConfirmDialog as c } from "../components/forms/ConfirmDialog.js";
11
+ import { getNumber as l, getTags as u, getText as d, newClientId as f } from "../components/forms/formValues.js";
12
+ import { useMemo as p, useState as m } from "react";
13
+ import { ArrowRightLeft as h, Gauge as g, LayoutGrid as ee, Pencil as _, Plus as te, Search as ne, Table2 as v, Trash2 as y } from "lucide-react";
14
+ import { jsx as b, jsxs as x } from "react/jsx-runtime";
15
+ import { Badge as S, Button as C, CardContent as w, DropdownMenu as T, DropdownMenuContent as E, DropdownMenuItem as D, DropdownMenuLabel as O, DropdownMenuSeparator as k, DropdownMenuTrigger as A, GlassCard as j, GradientText as M, IllustratedEmptyState as N, Input as re, PagePurpose as ie, Pagination as ae, ResponsiveDialog as oe, ResponsiveDialogContent as se, ResponsiveDialogDescription as ce, ResponsiveDialogHeader as le, ResponsiveDialogTitle as ue, ResponsiveTable as P } from "@burdenoff/fe-libs/ui";
16
+ import { usePagination as F } from "@burdenoff/fe-libs/shared/hooks";
17
+ import { useGlobalUi as I } from "@burdenoff/fe-libs/shared/providers/shell";
17
18
  //#region src/crewfoundry/pages/HiringCandidatesPagePage.tsx
18
- var I = [
19
+ var L = [
19
20
  {
20
21
  label: "New",
21
22
  value: "new"
@@ -44,7 +45,7 @@ var I = [
44
45
  label: "Rejected",
45
46
  value: "rejected"
46
47
  }
47
- ], L = [
48
+ ], R = [
48
49
  {
49
50
  key: "new",
50
51
  label: "New",
@@ -80,7 +81,7 @@ var I = [
80
81
  label: "Rejected",
81
82
  accent: "var(--color-status-error-text)"
82
83
  }
83
- ], R = [
84
+ ], z = [
84
85
  {
85
86
  name: "firstName",
86
87
  label: "First Name",
@@ -116,7 +117,7 @@ var I = [
116
117
  label: "Status",
117
118
  type: "select",
118
119
  required: !0,
119
- options: I
120
+ options: L
120
121
  },
121
122
  {
122
123
  name: "source",
@@ -163,7 +164,7 @@ var I = [
163
164
  type: "textarea",
164
165
  colSpan: 2
165
166
  }
166
- ], z = (e) => ({
167
+ ], B = (e) => ({
167
168
  firstName: e.firstName,
168
169
  lastName: e.lastName,
169
170
  email: e.email,
@@ -178,27 +179,27 @@ var I = [
178
179
  resumeUrl: e.resumeUrl ?? "",
179
180
  skills: e.skills,
180
181
  notes: e.notes
181
- }), B = (e) => {
182
- let t = u(e, "appliedDate");
182
+ }), V = (e) => {
183
+ let t = d(e, "appliedDate");
183
184
  return {
184
- firstName: u(e, "firstName"),
185
- lastName: u(e, "lastName"),
186
- email: u(e, "email"),
187
- phone: u(e, "phone"),
188
- position: u(e, "position"),
185
+ firstName: d(e, "firstName"),
186
+ lastName: d(e, "lastName"),
187
+ email: d(e, "email"),
188
+ phone: d(e, "phone"),
189
+ position: d(e, "position"),
189
190
  status: e.status,
190
- source: u(e, "source"),
191
- experience: c(e, "experience"),
192
- currentCompany: u(e, "currentCompany"),
193
- rating: c(e, "rating"),
191
+ source: d(e, "source"),
192
+ experience: l(e, "experience"),
193
+ currentCompany: d(e, "currentCompany"),
194
+ rating: l(e, "rating"),
194
195
  appliedDate: t.trim() === "" ? (/* @__PURE__ */ new Date()).toISOString().slice(0, 10) : t,
195
- resumeUrl: u(e, "resumeUrl"),
196
- skills: l(e, "skills"),
197
- notes: u(e, "notes")
196
+ resumeUrl: d(e, "resumeUrl"),
197
+ skills: u(e, "skills"),
198
+ notes: d(e, "notes")
198
199
  };
199
200
  };
200
- function V({ name: e, size: t = 36 }) {
201
- return /* @__PURE__ */ x("span", {
201
+ function H({ name: e, size: t = 36 }) {
202
+ return /* @__PURE__ */ b("span", {
202
203
  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",
203
204
  style: {
204
205
  width: t,
@@ -209,24 +210,24 @@ function V({ name: e, size: t = 36 }) {
209
210
  children: n(e)
210
211
  });
211
212
  }
212
- var H = [
213
+ var de = [
213
214
  {
214
215
  key: "name",
215
216
  header: "Name",
216
217
  priority: "primary",
217
- cell: (e) => /* @__PURE__ */ S("div", {
218
+ cell: (e) => /* @__PURE__ */ x("div", {
218
219
  className: "flex items-center gap-2",
219
- children: [/* @__PURE__ */ x(V, {
220
+ children: [/* @__PURE__ */ b(H, {
220
221
  name: `${e.firstName} ${e.lastName}`,
221
222
  size: 30
222
- }), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("p", {
223
+ }), /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ x("p", {
223
224
  className: "font-medium",
224
225
  children: [
225
226
  e.firstName,
226
227
  " ",
227
228
  e.lastName
228
229
  ]
229
- }), /* @__PURE__ */ x("p", {
230
+ }), /* @__PURE__ */ b("p", {
230
231
  className: "text-xs text-text-secondary",
231
232
  children: e.email
232
233
  })] })]
@@ -236,7 +237,7 @@ var H = [
236
237
  key: "position",
237
238
  header: "Position",
238
239
  priority: "secondary",
239
- cell: (e) => /* @__PURE__ */ x("span", {
240
+ cell: (e) => /* @__PURE__ */ b("span", {
240
241
  className: "text-text-secondary",
241
242
  children: e.position
242
243
  })
@@ -245,7 +246,7 @@ var H = [
245
246
  key: "source",
246
247
  header: "Source",
247
248
  priority: "secondary",
248
- cell: (e) => /* @__PURE__ */ x(C, {
249
+ cell: (e) => /* @__PURE__ */ b(S, {
249
250
  variant: "outline",
250
251
  className: "w-fit h-fit text-[10px]",
251
252
  children: e.source
@@ -255,13 +256,13 @@ var H = [
255
256
  key: "experience",
256
257
  header: "Experience",
257
258
  priority: "secondary",
258
- cell: (e) => /* @__PURE__ */ S("span", { children: [e.experience, " yrs"] })
259
+ cell: (e) => /* @__PURE__ */ x("span", { children: [e.experience, " yrs"] })
259
260
  },
260
261
  {
261
262
  key: "rating",
262
263
  header: "Rating",
263
264
  priority: "secondary",
264
- cell: (e) => /* @__PURE__ */ x(i, {
265
+ cell: (e) => /* @__PURE__ */ b(i, {
265
266
  value: e.rating,
266
267
  size: 13
267
268
  })
@@ -270,7 +271,7 @@ var H = [
270
271
  key: "applied",
271
272
  header: "Applied",
272
273
  priority: "hidden-on-mobile",
273
- cell: (e) => /* @__PURE__ */ x("span", {
274
+ cell: (e) => /* @__PURE__ */ b("span", {
274
275
  className: "text-text-secondary text-xs",
275
276
  children: e.appliedDate
276
277
  })
@@ -279,7 +280,7 @@ var H = [
279
280
  key: "status",
280
281
  header: "Status",
281
282
  priority: "secondary",
282
- cell: (e) => /* @__PURE__ */ x(C, {
283
+ cell: (e) => /* @__PURE__ */ b(S, {
283
284
  variant: e.status === "hired" || e.status === "offer" ? "default" : e.status === "rejected" ? "destructive" : "secondary",
284
285
  className: "text-[10px]",
285
286
  children: t(e.status)
@@ -287,287 +288,319 @@ var H = [
287
288
  }
288
289
  ];
289
290
  function U() {
290
- let { showToast: n } = ie(), { candidates: i, addCandidate: c, updateCandidate: l, removeCandidate: u } = e(), [m, C] = p(""), [E, D] = p("board"), [O, k] = p("all"), { page: A, pageSize: j, offset: I, setPage: V } = re({ initialPageSize: 25 }), [U, G] = p(!1), [K, q] = p(null), [J, Y] = p(null);
291
+ let { showToast: n } = I(), { candidates: i, addCandidate: l, updateCandidate: u, removeCandidate: d } = e(), [h, S] = m(""), [T, E] = m("board"), [D, O] = m("all"), { page: k, pageSize: A, offset: L, setPage: H } = F({ initialPageSize: 25 }), [U, W] = m(!1), [G, K] = m(null), [q, J] = m(null), [Y, X] = m(null);
291
292
  o({
292
293
  records: i,
293
- activeId: K?.id ?? null,
294
- onRestore: q
294
+ activeId: G?.id ?? null,
295
+ onRestore: K
295
296
  });
296
- let ae = async (e) => {
297
- await c({
298
- id: d(),
299
- ...B(e)
297
+ let pe = async (e) => {
298
+ await l({
299
+ id: f(),
300
+ ...V(e)
300
301
  }), n("Candidate added", "success");
301
- }, oe = async (e) => {
302
- K && (await l(K.id, B(e)), n("Candidate updated", "success"));
303
- }, se = async () => {
304
- J && (await u(J.id), n("Candidate removed", "success"));
305
- }, ce = async (e, r) => {
302
+ }, me = async (e) => {
303
+ G && (await u(G.id, V(e)), n("Candidate updated", "success"));
304
+ }, he = async () => {
305
+ q && (await d(q.id), n("Candidate removed", "success"));
306
+ }, ge = async (e, r) => {
306
307
  if (e.status !== r) try {
307
- await l(e.id, { status: r }), n(`${e.firstName} ${e.lastName} moved to ${t(r)}`, "success");
308
+ await u(e.id, { status: r }), n(`${e.firstName} ${e.lastName} moved to ${t(r)}`, "success");
308
309
  } catch {
309
310
  n("Could not move candidate", "error");
310
311
  }
311
- }, X = m.toLowerCase(), Z = f(() => i.filter((e) => `${e.firstName} ${e.lastName} ${e.position} ${e.email}`.toLowerCase().includes(X)), [i, X]), Q = Z.filter((e) => O === "all" || e.status === O), le = Q.slice(I, I + j), $ = L.map((e) => {
312
- let t = Z.filter((t) => t.status === e.key).sort((e, t) => t.rating - e.rating);
312
+ }, Z = h.toLowerCase(), Q = p(() => i.filter((e) => `${e.firstName} ${e.lastName} ${e.position} ${e.email}`.toLowerCase().includes(Z)), [i, Z]), $ = Q.filter((e) => D === "all" || e.status === D), _e = $.slice(L, L + A), ve = R.map((e) => {
313
+ let t = Q.filter((t) => t.status === e.key).sort((e, t) => t.rating - e.rating);
313
314
  return {
314
315
  id: e.key,
315
316
  title: e.label,
316
317
  accent: e.accent,
317
- items: t.map((e) => /* @__PURE__ */ x(W, {
318
+ items: t.map((e) => /* @__PURE__ */ b(fe, {
318
319
  candidate: e,
319
- onMove: ce,
320
- onEdit: () => q(e),
321
- onDelete: () => Y(e)
320
+ onMove: ge,
321
+ onEdit: () => K(e),
322
+ onSkills: () => X(e),
323
+ onDelete: () => J(e)
322
324
  }, e.id))
323
325
  };
324
326
  });
325
- return /* @__PURE__ */ S("div", {
327
+ return /* @__PURE__ */ x("div", {
326
328
  className: "space-y-6 p-6",
327
329
  children: [
328
- /* @__PURE__ */ S("div", {
330
+ /* @__PURE__ */ x("div", {
329
331
  className: "flex flex-wrap items-start justify-between gap-3",
330
- children: [/* @__PURE__ */ S("div", { children: [
331
- /* @__PURE__ */ x("h1", {
332
+ children: [/* @__PURE__ */ x("div", { children: [
333
+ /* @__PURE__ */ b("h1", {
332
334
  className: "text-2xl font-semibold",
333
- children: /* @__PURE__ */ x(N, { children: "Candidate Pipeline" })
335
+ children: /* @__PURE__ */ b(M, { children: "Candidate Pipeline" })
334
336
  }),
335
- /* @__PURE__ */ S("p", {
337
+ /* @__PURE__ */ x("p", {
336
338
  className: "text-sm text-text-secondary",
337
339
  children: [i.length, " candidates in pipeline"]
338
340
  }),
339
- /* @__PURE__ */ x(ee, {
341
+ /* @__PURE__ */ b(ie, {
340
342
  className: "mt-1",
341
343
  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."
342
344
  })
343
- ] }), /* @__PURE__ */ S(w, {
345
+ ] }), /* @__PURE__ */ x(C, {
344
346
  size: "sm",
345
- onClick: () => G(!0),
346
- children: [/* @__PURE__ */ x(_, { className: "h-4 w-4 mr-1" }), "Add Candidate"]
347
+ onClick: () => W(!0),
348
+ children: [/* @__PURE__ */ b(te, { className: "h-4 w-4 mr-1" }), "Add Candidate"]
347
349
  })]
348
350
  }),
349
- /* @__PURE__ */ S("div", {
351
+ /* @__PURE__ */ x("div", {
350
352
  className: "flex flex-wrap items-center gap-3",
351
- children: [/* @__PURE__ */ S("div", {
353
+ children: [/* @__PURE__ */ x("div", {
352
354
  className: "relative flex-1 min-w-[12rem] max-w-sm",
353
- children: [/* @__PURE__ */ x(v, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ x(F, {
355
+ children: [/* @__PURE__ */ b(ne, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ b(re, {
354
356
  placeholder: "Search candidates...",
355
357
  className: "pl-9",
356
- value: m,
358
+ value: h,
357
359
  onChange: (e) => {
358
- C(e.target.value), V(1);
360
+ S(e.target.value), H(1);
359
361
  }
360
362
  })]
361
- }), /* @__PURE__ */ S("div", {
363
+ }), /* @__PURE__ */ x("div", {
362
364
  className: "inline-flex items-center gap-1 rounded-full border border-border-subtle bg-bg-sunken p-1",
363
- children: [/* @__PURE__ */ S(w, {
364
- variant: E === "board" ? "default" : "ghost",
365
+ children: [/* @__PURE__ */ x(C, {
366
+ variant: T === "board" ? "default" : "ghost",
365
367
  size: "sm",
366
368
  className: "rounded-full",
367
- onClick: () => D("board"),
368
- children: [/* @__PURE__ */ x(h, { className: "h-4 w-4 mr-1" }), "Board"]
369
- }), /* @__PURE__ */ S(w, {
370
- variant: E === "table" ? "default" : "ghost",
369
+ onClick: () => E("board"),
370
+ children: [/* @__PURE__ */ b(ee, { className: "h-4 w-4 mr-1" }), "Board"]
371
+ }), /* @__PURE__ */ x(C, {
372
+ variant: T === "table" ? "default" : "ghost",
371
373
  size: "sm",
372
374
  className: "rounded-full",
373
- onClick: () => D("table"),
374
- children: [/* @__PURE__ */ x(y, { className: "h-4 w-4 mr-1" }), "Table"]
375
+ onClick: () => E("table"),
376
+ children: [/* @__PURE__ */ b(v, { className: "h-4 w-4 mr-1" }), "Table"]
375
377
  })]
376
378
  })]
377
379
  }),
378
- i.length === 0 ? /* @__PURE__ */ x(M, {
380
+ i.length === 0 ? /* @__PURE__ */ b(j, {
379
381
  treatment: "glass",
380
382
  className: "border-border-seam",
381
- children: /* @__PURE__ */ x(T, {
383
+ children: /* @__PURE__ */ b(w, {
382
384
  className: "p-4",
383
- children: /* @__PURE__ */ x(P, {
385
+ children: /* @__PURE__ */ b(N, {
384
386
  illustration: "empty-search",
385
387
  title: "No candidates yet",
386
388
  description: "Add your first candidate to start building the pipeline."
387
389
  })
388
390
  })
389
- }) : E === "board" ? /* @__PURE__ */ x(r, {
390
- columns: $,
391
+ }) : T === "board" ? /* @__PURE__ */ b(r, {
392
+ columns: ve,
391
393
  emptyColumnHint: "No candidates in this stage"
392
- }) : /* @__PURE__ */ x(M, {
394
+ }) : /* @__PURE__ */ b(j, {
393
395
  treatment: "glass",
394
396
  glow: !0,
395
397
  className: "border-border-seam",
396
- children: /* @__PURE__ */ S(T, {
398
+ children: /* @__PURE__ */ x(w, {
397
399
  className: "p-4",
398
400
  children: [
399
- /* @__PURE__ */ S("div", {
401
+ /* @__PURE__ */ x("div", {
400
402
  className: "mb-3 flex flex-wrap gap-1",
401
- children: [/* @__PURE__ */ x(w, {
402
- variant: O === "all" ? "default" : "outline",
403
+ children: [/* @__PURE__ */ b(C, {
404
+ variant: D === "all" ? "default" : "outline",
403
405
  size: "sm",
404
406
  onClick: () => {
405
- k("all"), V(1);
407
+ O("all"), H(1);
406
408
  },
407
409
  children: "All"
408
- }), L.map((e) => /* @__PURE__ */ x(w, {
409
- variant: O === e.key ? "default" : "outline",
410
+ }), R.map((e) => /* @__PURE__ */ b(C, {
411
+ variant: D === e.key ? "default" : "outline",
410
412
  size: "sm",
411
413
  onClick: () => {
412
- k(e.key), V(1);
414
+ O(e.key), H(1);
413
415
  },
414
416
  children: e.label
415
417
  }, e.key))]
416
418
  }),
417
- /* @__PURE__ */ x(ne, {
418
- data: le,
419
+ /* @__PURE__ */ b(P, {
420
+ data: _e,
419
421
  rowKey: (e) => e.id,
420
- columns: H,
421
- emptyState: /* @__PURE__ */ x(P, {
422
+ columns: de,
423
+ emptyState: /* @__PURE__ */ b(N, {
422
424
  illustration: "empty-search",
423
425
  title: "No candidates match",
424
426
  description: "Try a different search term or status filter."
425
427
  }),
426
- rowActions: (e) => /* @__PURE__ */ S("div", {
428
+ rowActions: (e) => /* @__PURE__ */ x("div", {
427
429
  className: "flex items-center justify-end gap-1",
428
- children: [/* @__PURE__ */ x(w, {
429
- variant: "ghost",
430
- size: "sm",
431
- "aria-label": `Edit ${e.firstName} ${e.lastName}`,
432
- onClick: () => q(e),
433
- children: /* @__PURE__ */ x(g, { className: "h-3.5 w-3.5" })
434
- }), /* @__PURE__ */ x(w, {
435
- variant: "ghost",
436
- size: "sm",
437
- "aria-label": `Delete ${e.firstName} ${e.lastName}`,
438
- onClick: () => Y(e),
439
- children: /* @__PURE__ */ x(b, { className: "h-3.5 w-3.5 text-status-error-fg" })
440
- })]
430
+ children: [
431
+ /* @__PURE__ */ b(C, {
432
+ variant: "ghost",
433
+ size: "sm",
434
+ "aria-label": `Skills of ${e.firstName} ${e.lastName}`,
435
+ onClick: () => X(e),
436
+ children: /* @__PURE__ */ b(g, { className: "h-3.5 w-3.5" })
437
+ }),
438
+ /* @__PURE__ */ b(C, {
439
+ variant: "ghost",
440
+ size: "sm",
441
+ "aria-label": `Edit ${e.firstName} ${e.lastName}`,
442
+ onClick: () => K(e),
443
+ children: /* @__PURE__ */ b(_, { className: "h-3.5 w-3.5" })
444
+ }),
445
+ /* @__PURE__ */ b(C, {
446
+ variant: "ghost",
447
+ size: "sm",
448
+ "aria-label": `Delete ${e.firstName} ${e.lastName}`,
449
+ onClick: () => J(e),
450
+ children: /* @__PURE__ */ b(y, { className: "h-3.5 w-3.5 text-status-error-fg" })
451
+ })
452
+ ]
441
453
  })
442
454
  }),
443
- Q.length > j && /* @__PURE__ */ x("div", {
455
+ $.length > A && /* @__PURE__ */ b("div", {
444
456
  className: "mt-4",
445
- children: /* @__PURE__ */ x(te, {
446
- page: A,
447
- pageSize: j,
448
- totalItems: Q.length,
449
- onPageChange: V
457
+ children: /* @__PURE__ */ b(ae, {
458
+ page: k,
459
+ pageSize: A,
460
+ totalItems: $.length,
461
+ onPageChange: H
450
462
  })
451
463
  })
452
464
  ]
453
465
  })
454
466
  }),
455
- /* @__PURE__ */ x(a, {
467
+ /* @__PURE__ */ b(a, {
456
468
  open: U,
457
- onOpenChange: G,
469
+ onOpenChange: W,
458
470
  title: "Add Candidate",
459
471
  description: "Add someone to your hiring pipeline.",
460
- fields: R,
472
+ fields: z,
461
473
  submitLabel: "Add candidate",
462
- onSubmit: ae
474
+ onSubmit: pe
463
475
  }),
464
- /* @__PURE__ */ x(a, {
465
- open: K !== null,
476
+ /* @__PURE__ */ b(a, {
477
+ open: G !== null,
466
478
  onOpenChange: (e) => {
467
- e || q(null);
479
+ e || K(null);
468
480
  },
469
481
  title: "Edit Candidate",
470
- description: K ? `${K.firstName} ${K.lastName}` : void 0,
471
- fields: R,
472
- initialValues: K ? z(K) : void 0,
482
+ description: G ? `${G.firstName} ${G.lastName}` : void 0,
483
+ fields: z,
484
+ initialValues: G ? B(G) : void 0,
473
485
  submitLabel: "Save changes",
474
- onSubmit: oe
486
+ onSubmit: me
475
487
  }),
476
- /* @__PURE__ */ x(s, {
477
- open: J !== null,
488
+ /* @__PURE__ */ b(c, {
489
+ open: q !== null,
478
490
  onOpenChange: (e) => {
479
- e || Y(null);
491
+ e || J(null);
480
492
  },
481
493
  title: "Remove candidate",
482
- description: J ? `Remove ${J.firstName} ${J.lastName} from the pipeline?` : void 0,
494
+ description: q ? `Remove ${q.firstName} ${q.lastName} from the pipeline?` : void 0,
483
495
  confirmLabel: "Remove",
484
496
  destructive: !0,
485
- onConfirm: se
497
+ onConfirm: he
498
+ }),
499
+ /* @__PURE__ */ b(oe, {
500
+ open: Y !== null,
501
+ onOpenChange: (e) => {
502
+ e || X(null);
503
+ },
504
+ children: /* @__PURE__ */ x(se, {
505
+ className: "sm:max-w-[560px]",
506
+ children: [/* @__PURE__ */ x(le, { children: [/* @__PURE__ */ b(ue, { children: Y ? `${Y.firstName} ${Y.lastName} · Skills` : "Skills" }), /* @__PURE__ */ b(ce, { children: "Canonical skills with proficiency. Matching for open roles uses these, including skills they imply or supersede." })] }), Y ? /* @__PURE__ */ b(s, { candidateId: Y.id }) : null]
507
+ })
486
508
  })
487
509
  ]
488
510
  });
489
511
  }
490
- function W({ candidate: e, onMove: t, onEdit: n, onDelete: r }) {
491
- let a = `${e.firstName} ${e.lastName}`;
492
- return /* @__PURE__ */ S("div", {
512
+ function fe({ candidate: e, onMove: t, onEdit: n, onSkills: r, onDelete: a }) {
513
+ let o = `${e.firstName} ${e.lastName}`;
514
+ return /* @__PURE__ */ x("div", {
493
515
  className: "group rounded-[var(--radius-input)] border border-border-subtle bg-bg-surface p-3 shadow-elevation-1 transition-shadow hover:shadow-elevation-2",
494
516
  children: [
495
- /* @__PURE__ */ S("div", {
517
+ /* @__PURE__ */ x("div", {
496
518
  className: "flex items-start gap-2.5",
497
- children: [/* @__PURE__ */ x(V, {
498
- name: a,
519
+ children: [/* @__PURE__ */ b(H, {
520
+ name: o,
499
521
  size: 36
500
- }), /* @__PURE__ */ S("div", {
522
+ }), /* @__PURE__ */ x("div", {
501
523
  className: "min-w-0 flex-1",
502
- children: [/* @__PURE__ */ x("p", {
524
+ children: [/* @__PURE__ */ b("p", {
503
525
  className: "truncate text-sm font-semibold text-text-primary",
504
- children: a
505
- }), /* @__PURE__ */ x("p", {
526
+ children: o
527
+ }), /* @__PURE__ */ b("p", {
506
528
  className: "truncate text-xs text-text-secondary",
507
529
  children: e.position
508
530
  })]
509
531
  })]
510
532
  }),
511
- /* @__PURE__ */ S("div", {
533
+ /* @__PURE__ */ x("div", {
512
534
  className: "mt-2 flex items-center justify-between gap-2",
513
- children: [/* @__PURE__ */ x(i, {
535
+ children: [/* @__PURE__ */ b(i, {
514
536
  value: e.rating,
515
537
  size: 13
516
- }), /* @__PURE__ */ x(C, {
538
+ }), /* @__PURE__ */ b(S, {
517
539
  variant: "outline",
518
540
  className: "shrink-0 text-[9px]",
519
541
  children: e.source
520
542
  })]
521
543
  }),
522
- e.skills.length > 0 && /* @__PURE__ */ x("div", {
544
+ e.skills.length > 0 && /* @__PURE__ */ b("div", {
523
545
  className: "mt-2 flex flex-wrap gap-1",
524
- children: e.skills.slice(0, 3).map((e) => /* @__PURE__ */ x(C, {
546
+ children: e.skills.slice(0, 3).map((e) => /* @__PURE__ */ b(S, {
525
547
  variant: "secondary",
526
548
  className: "text-[9px]",
527
549
  children: e
528
550
  }, e))
529
551
  }),
530
- /* @__PURE__ */ S("div", {
552
+ /* @__PURE__ */ x("div", {
531
553
  className: "mt-2.5 flex items-center justify-between gap-1 border-t border-border-subtle pt-2",
532
- children: [/* @__PURE__ */ S(E, { children: [/* @__PURE__ */ x(j, {
554
+ children: [/* @__PURE__ */ x(T, { children: [/* @__PURE__ */ b(A, {
533
555
  asChild: !0,
534
- children: /* @__PURE__ */ S(w, {
556
+ children: /* @__PURE__ */ x(C, {
535
557
  variant: "ghost",
536
558
  size: "sm",
537
559
  className: "h-7 px-2 text-xs",
538
- children: [/* @__PURE__ */ x(m, { className: "mr-1 h-3.5 w-3.5" }), "Move"]
560
+ children: [/* @__PURE__ */ b(h, { className: "mr-1 h-3.5 w-3.5" }), "Move"]
539
561
  })
540
- }), /* @__PURE__ */ S(D, {
562
+ }), /* @__PURE__ */ x(E, {
541
563
  align: "start",
542
564
  children: [
543
- /* @__PURE__ */ x(k, { children: "Move to stage" }),
544
- /* @__PURE__ */ x(A, {}),
545
- L.filter((t) => t.key !== e.status).map((n) => /* @__PURE__ */ S(O, {
565
+ /* @__PURE__ */ b(O, { children: "Move to stage" }),
566
+ /* @__PURE__ */ b(k, {}),
567
+ R.filter((t) => t.key !== e.status).map((n) => /* @__PURE__ */ x(D, {
546
568
  onSelect: () => t(e, n.key),
547
- children: [/* @__PURE__ */ x("span", {
569
+ children: [/* @__PURE__ */ b("span", {
548
570
  "aria-hidden": "true",
549
571
  className: "mr-2 inline-block h-2 w-2 rounded-full",
550
572
  style: { backgroundColor: n.accent }
551
573
  }), n.label]
552
574
  }, n.key))
553
575
  ]
554
- })] }), /* @__PURE__ */ S("div", {
576
+ })] }), /* @__PURE__ */ x("div", {
555
577
  className: "flex items-center gap-0.5",
556
- children: [/* @__PURE__ */ x(w, {
557
- variant: "ghost",
558
- size: "sm",
559
- className: "h-7 w-7 p-0",
560
- "aria-label": `Edit ${a}`,
561
- onClick: n,
562
- children: /* @__PURE__ */ x(g, { className: "h-3.5 w-3.5" })
563
- }), /* @__PURE__ */ x(w, {
564
- variant: "ghost",
565
- size: "sm",
566
- className: "h-7 w-7 p-0",
567
- "aria-label": `Delete ${a}`,
568
- onClick: r,
569
- children: /* @__PURE__ */ x(b, { className: "h-3.5 w-3.5 text-status-error-fg" })
570
- })]
578
+ children: [
579
+ /* @__PURE__ */ b(C, {
580
+ variant: "ghost",
581
+ size: "sm",
582
+ className: "h-7 w-7 p-0",
583
+ "aria-label": `Skills of ${o}`,
584
+ onClick: r,
585
+ children: /* @__PURE__ */ b(g, { className: "h-3.5 w-3.5" })
586
+ }),
587
+ /* @__PURE__ */ b(C, {
588
+ variant: "ghost",
589
+ size: "sm",
590
+ className: "h-7 w-7 p-0",
591
+ "aria-label": `Edit ${o}`,
592
+ onClick: n,
593
+ children: /* @__PURE__ */ b(_, { className: "h-3.5 w-3.5" })
594
+ }),
595
+ /* @__PURE__ */ b(C, {
596
+ variant: "ghost",
597
+ size: "sm",
598
+ className: "h-7 w-7 p-0",
599
+ "aria-label": `Delete ${o}`,
600
+ onClick: a,
601
+ children: /* @__PURE__ */ b(y, { className: "h-3.5 w-3.5 text-status-error-fg" })
602
+ })
603
+ ]
571
604
  })]
572
605
  })
573
606
  ]