@burdenoff/microfe-crewfoundry 2026.704.4 → 2026.704.6

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 (62) hide show
  1. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +1 -1
  2. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
  3. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +4 -4
  4. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  5. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +4 -4
  6. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  7. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +1 -1
  8. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +57 -53
  10. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/HiringJobsPagePage.js +2 -2
  12. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +2 -1
  14. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +1 -1
  16. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +1 -1
  18. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +35 -31
  20. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  21. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +2 -2
  22. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  23. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +1 -1
  24. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  25. package/dist/crewfoundry/pages/LearningLearningPagePage.js +1 -1
  26. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +30 -26
  28. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  29. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +1 -1
  30. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  31. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +3 -3
  32. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  33. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +2 -2
  34. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  35. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +1 -1
  36. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  37. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +1 -1
  38. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  39. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +1 -1
  40. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  41. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +28 -25
  42. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +22 -19
  44. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  45. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +1 -1
  46. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  47. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +1 -1
  48. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  49. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +65 -61
  50. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  51. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +2 -2
  52. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +27 -23
  54. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +1 -1
  56. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +4 -4
  58. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +1 -1
  60. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  61. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  62. package/package.json +1 -1
@@ -5,10 +5,10 @@ import { useState as i } from "react";
5
5
  import { Calendar as a, DollarSign as o, FolderKanban as s, Pencil as c, Target as l, Trash2 as u, Users as d } from "lucide-react";
6
6
  import { useNavigate as f, useSearchParams as p } from "react-router-dom";
7
7
  import { jsx as m, jsxs as h } from "react/jsx-runtime";
8
- import { Badge as g, Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x, EmphasisPanel as S, GradientText as C, IllustratedEmptyState as w, NextSteps as T, PagePurpose as E, ResponsiveDialog as D, ResponsiveDialogContent as O, ResponsiveDialogDescription as k, ResponsiveDialogFooter as A, ResponsiveDialogHeader as j, ResponsiveDialogTitle as M } from "@burdenoff/fe-libs/ui";
9
- import { useGlobalUi as N } from "@burdenoff/fe-libs/shared/providers/shell";
8
+ import { Badge as g, Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x, EmphasisPanel as S, GradientText as C, IllustratedEmptyState as w, NextSteps as T, PagePurpose as E, ResponsiveDialog as D, ResponsiveDialogContent as O, ResponsiveDialogDescription as k, ResponsiveDialogFooter as A, ResponsiveDialogHeader as j, ResponsiveDialogTitle as M, Spinner as N } from "@burdenoff/fe-libs/ui";
9
+ import { useGlobalUi as P } from "@burdenoff/fe-libs/shared/providers/shell";
10
10
  //#region src/crewfoundry/pages/ProjectsProjectDetailsPagePage.tsx
11
- var P = [
11
+ var F = [
12
12
  {
13
13
  name: "name",
14
14
  label: "Project Name",
@@ -83,9 +83,13 @@ var P = [
83
83
  type: "number"
84
84
  }
85
85
  ];
86
- function F() {
87
- let F = f(), [I] = p(), { showToast: L } = N(), R = e((e) => e.projects), z = e((e) => e.updateProject), B = e((e) => e.removeProject), V = r(), [H, U] = i(!1), [W, G] = i(!1), K = I.get("id"), q = R.find((e) => e.id === K) ?? R[0];
88
- if (!q) return /* @__PURE__ */ m("div", {
86
+ function I() {
87
+ let I = f(), [L] = p(), { showToast: R } = P(), z = e((e) => e.projects), B = e((e) => e.updateProject), V = e((e) => e.removeProject), H = e((e) => e.initialized), U = r(), [W, G] = i(!1), [K, q] = i(!1), J = L.get("id"), Y = z.find((e) => e.id === J) ?? z[0];
88
+ if (!H && !Y) return /* @__PURE__ */ m("div", {
89
+ className: "flex min-h-[60vh] items-center justify-center p-6",
90
+ children: /* @__PURE__ */ m(N, { size: "lg" })
91
+ });
92
+ if (!Y) return /* @__PURE__ */ m("div", {
89
93
  className: "p-6",
90
94
  children: /* @__PURE__ */ m(w, {
91
95
  illustration: "empty-search",
@@ -93,13 +97,13 @@ function F() {
93
97
  description: "This project is no longer available."
94
98
  })
95
99
  });
96
- let J = q.budget > 0 ? Math.round(q.spent / q.budget * 100) : 0, Y = q.budget > 0 && q.spent / q.budget > .9, X = {
97
- name: q.name,
98
- description: q.description,
99
- status: q.status,
100
- priority: q.priority,
101
- budget: q.budget,
102
- progress: q.progress
100
+ let X = Y.budget > 0 ? Math.round(Y.spent / Y.budget * 100) : 0, Z = Y.budget > 0 && Y.spent / Y.budget > .9, Q = {
101
+ name: Y.name,
102
+ description: Y.description,
103
+ status: Y.status,
104
+ priority: Y.priority,
105
+ budget: Y.budget,
106
+ progress: Y.progress
103
107
  };
104
108
  return /* @__PURE__ */ h("div", {
105
109
  className: "space-y-6 p-6 max-w-4xl",
@@ -108,27 +112,27 @@ function F() {
108
112
  className: "flex items-center justify-between gap-4",
109
113
  children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h1", {
110
114
  className: "text-2xl font-semibold",
111
- children: /* @__PURE__ */ m(C, { children: q.name })
115
+ children: /* @__PURE__ */ m(C, { children: Y.name })
112
116
  }), /* @__PURE__ */ m("p", {
113
117
  className: "text-sm text-text-secondary",
114
- children: q.description
118
+ children: Y.description
115
119
  })] }), /* @__PURE__ */ h("div", {
116
120
  className: "flex items-center gap-2",
117
121
  children: [
118
122
  /* @__PURE__ */ h("div", {
119
123
  className: "hidden gap-1 sm:flex",
120
124
  children: [/* @__PURE__ */ m(g, {
121
- variant: q.priority === "critical" ? "destructive" : "default",
122
- children: t(q.priority)
125
+ variant: Y.priority === "critical" ? "destructive" : "default",
126
+ children: t(Y.priority)
123
127
  }), /* @__PURE__ */ m(g, {
124
- variant: q.status === "active" ? "default" : "secondary",
125
- children: t(q.status)
128
+ variant: Y.status === "active" ? "default" : "secondary",
129
+ children: t(Y.status)
126
130
  })]
127
131
  }),
128
132
  /* @__PURE__ */ h(_, {
129
133
  variant: "outline",
130
134
  size: "sm",
131
- onClick: () => V.openModal(),
135
+ onClick: () => U.openModal(),
132
136
  children: [/* @__PURE__ */ m(c, { className: "h-4 w-4 mr-1" }), "Edit"]
133
137
  }),
134
138
  /* @__PURE__ */ m(_, {
@@ -136,7 +140,7 @@ function F() {
136
140
  size: "sm",
137
141
  "aria-label": "Delete project",
138
142
  className: "h-9 w-9 p-0 text-text-secondary hover:text-status-error-text",
139
- onClick: () => U(!0),
143
+ onClick: () => G(!0),
140
144
  children: /* @__PURE__ */ m(u, { className: "h-4 w-4" })
141
145
  })
142
146
  ]
@@ -151,21 +155,21 @@ function F() {
151
155
  label: "View all projects",
152
156
  description: "See how this project compares across your portfolio.",
153
157
  icon: /* @__PURE__ */ m(s, { className: "h-4 w-4" }),
154
- onClick: () => F("../../projects/projects-page")
158
+ onClick: () => I("../projects/projects-page")
155
159
  },
156
160
  {
157
161
  id: "team",
158
162
  label: "Check the team",
159
163
  description: "Review who is working on this and their workload.",
160
164
  icon: /* @__PURE__ */ m(d, { className: "h-4 w-4" }),
161
- onClick: () => F("../../teams/teams-page")
165
+ onClick: () => I("../teams/teams-page")
162
166
  },
163
167
  {
164
168
  id: "new-project",
165
169
  label: "Start a new project",
166
170
  description: "Kick off the next piece of work.",
167
171
  icon: /* @__PURE__ */ m(l, { className: "h-4 w-4" }),
168
- onClick: () => F("../../projects/create-project-page")
172
+ onClick: () => I("../projects/create-project-page")
169
173
  }
170
174
  ]
171
175
  }),
@@ -178,7 +182,7 @@ function F() {
178
182
  /* @__PURE__ */ m(l, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
179
183
  /* @__PURE__ */ h("p", {
180
184
  className: "text-lg font-bold",
181
- children: [q.progress, "%"]
185
+ children: [Y.progress, "%"]
182
186
  }),
183
187
  /* @__PURE__ */ m("p", {
184
188
  className: "text-xs text-text-secondary",
@@ -194,7 +198,7 @@ function F() {
194
198
  className: "text-lg font-bold",
195
199
  children: [
196
200
  "$",
197
- (q.budget / 1e3).toFixed(0),
201
+ (Y.budget / 1e3).toFixed(0),
198
202
  "K"
199
203
  ]
200
204
  }),
@@ -210,7 +214,7 @@ function F() {
210
214
  /* @__PURE__ */ m(d, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
211
215
  /* @__PURE__ */ m("p", {
212
216
  className: "text-lg font-bold",
213
- children: q.teamName
217
+ children: Y.teamName
214
218
  }),
215
219
  /* @__PURE__ */ m("p", {
216
220
  className: "text-xs text-text-secondary",
@@ -224,7 +228,7 @@ function F() {
224
228
  /* @__PURE__ */ m(a, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
225
229
  /* @__PURE__ */ m("p", {
226
230
  className: "text-lg font-bold",
227
- children: q.endDate
231
+ children: Y.endDate
228
232
  }),
229
233
  /* @__PURE__ */ m("p", {
230
234
  className: "text-xs text-text-secondary",
@@ -242,19 +246,19 @@ function F() {
242
246
  children: [/* @__PURE__ */ h("div", {
243
247
  className: "flex justify-between text-sm",
244
248
  children: [/* @__PURE__ */ h("span", { children: [
245
- q.completedTasks,
249
+ Y.completedTasks,
246
250
  " of ",
247
- q.tasks,
251
+ Y.tasks,
248
252
  " tasks completed"
249
253
  ] }), /* @__PURE__ */ h("span", {
250
254
  className: "font-medium",
251
- children: [q.progress, "%"]
255
+ children: [Y.progress, "%"]
252
256
  })]
253
257
  }), /* @__PURE__ */ m("div", {
254
258
  className: "h-3 bg-bg-sunken rounded overflow-hidden",
255
259
  children: /* @__PURE__ */ m("div", {
256
260
  className: "h-3 bg-action-primary-bg rounded",
257
- style: { width: `${q.progress}%` }
261
+ style: { width: `${Y.progress}%` }
258
262
  })
259
263
  })]
260
264
  })] }),
@@ -264,19 +268,19 @@ function F() {
264
268
  className: "flex justify-between text-sm",
265
269
  children: [/* @__PURE__ */ h("span", { children: [
266
270
  "Spent $",
267
- (q.spent / 1e3).toFixed(0),
271
+ (Y.spent / 1e3).toFixed(0),
268
272
  "K of $",
269
- (q.budget / 1e3).toFixed(0),
273
+ (Y.budget / 1e3).toFixed(0),
270
274
  "K"
271
275
  ] }), /* @__PURE__ */ h("span", {
272
276
  className: "font-medium",
273
- children: [J, "%"]
277
+ children: [X, "%"]
274
278
  })]
275
279
  }), /* @__PURE__ */ m("div", {
276
280
  className: "h-3 bg-bg-sunken rounded overflow-hidden",
277
281
  children: /* @__PURE__ */ m("div", {
278
- className: `h-3 rounded ${Y ? "bg-status-error-text" : "bg-status-success-text"}`,
279
- style: { width: `${J}%` }
282
+ className: `h-3 rounded ${Z ? "bg-status-error-text" : "bg-status-success-text"}`,
283
+ style: { width: `${X}%` }
280
284
  })
281
285
  })]
282
286
  }), /* @__PURE__ */ h("div", {
@@ -286,66 +290,66 @@ function F() {
286
290
  children: "Manager"
287
291
  }), /* @__PURE__ */ m("p", {
288
292
  className: "font-medium",
289
- children: q.managerName
293
+ children: Y.managerName
290
294
  })] }), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
291
295
  className: "text-xs text-text-secondary",
292
296
  children: "Timeline"
293
297
  }), /* @__PURE__ */ h("p", { children: [
294
- q.startDate,
298
+ Y.startDate,
295
299
  " — ",
296
- q.endDate
300
+ Y.endDate
297
301
  ] })] })]
298
302
  })] })] }),
299
303
  /* @__PURE__ */ m(n, {
300
- open: V.open,
301
- onOpenChange: V.onOpenChange,
304
+ open: U.open,
305
+ onOpenChange: U.onOpenChange,
302
306
  title: "Edit Project",
303
- description: `Update the details for ${q.name}.`,
304
- fields: P,
305
- initialValues: X,
307
+ description: `Update the details for ${Y.name}.`,
308
+ fields: F,
309
+ initialValues: Q,
306
310
  submitLabel: "Save Changes",
307
311
  onSubmit: async (e) => {
308
312
  let t = {
309
313
  name: String(e.name ?? "").trim(),
310
314
  description: String(e.description ?? "").trim(),
311
- status: String(e.status ?? q.status),
312
- priority: String(e.priority ?? q.priority)
315
+ status: String(e.status ?? Y.status),
316
+ priority: String(e.priority ?? Y.priority)
313
317
  };
314
- typeof e.budget == "number" && !Number.isNaN(e.budget) && (t.budget = e.budget), typeof e.progress == "number" && !Number.isNaN(e.progress) && (t.progress = e.progress), await z(q.id, t), L("Project updated", "success");
318
+ typeof e.budget == "number" && !Number.isNaN(e.budget) && (t.budget = e.budget), typeof e.progress == "number" && !Number.isNaN(e.progress) && (t.progress = e.progress), await B(Y.id, t), R("Project updated", "success");
315
319
  }
316
320
  }),
317
321
  /* @__PURE__ */ m(D, {
318
- open: H,
319
- onOpenChange: U,
322
+ open: W,
323
+ onOpenChange: G,
320
324
  children: /* @__PURE__ */ h(O, {
321
325
  className: "sm:max-w-[440px]",
322
326
  children: [/* @__PURE__ */ h(j, { children: [/* @__PURE__ */ h(M, { children: [
323
327
  "Delete ",
324
- q.name,
328
+ Y.name,
325
329
  "?"
326
330
  ] }), /* @__PURE__ */ m(k, { children: "This permanently removes the project and its tracking data. This cannot be undone." })] }), /* @__PURE__ */ h(A, { children: [/* @__PURE__ */ m(_, {
327
331
  type: "button",
328
332
  variant: "outline",
329
- onClick: () => U(!1),
330
- disabled: W,
333
+ onClick: () => G(!1),
334
+ disabled: K,
331
335
  children: "Cancel"
332
336
  }), /* @__PURE__ */ m(_, {
333
337
  type: "button",
334
338
  variant: "destructive",
335
339
  onClick: async () => {
336
- if (!W) {
337
- G(!0);
340
+ if (!K) {
341
+ q(!0);
338
342
  try {
339
- await B(q.id), L("Project deleted", "success"), U(!1), F("../../projects/projects-page");
343
+ await V(Y.id), R("Project deleted", "success"), G(!1), I("../projects/projects-page");
340
344
  } catch (e) {
341
- L(e instanceof Error ? e.message : "Unable to delete project", "error");
345
+ R(e instanceof Error ? e.message : "Unable to delete project", "error");
342
346
  } finally {
343
- G(!1);
347
+ q(!1);
344
348
  }
345
349
  }
346
350
  },
347
- disabled: W,
348
- children: W ? "Deleting…" : "Delete Project"
351
+ disabled: K,
352
+ children: K ? "Deleting…" : "Delete Project"
349
353
  })] })]
350
354
  })
351
355
  })
@@ -353,6 +357,6 @@ function F() {
353
357
  });
354
358
  }
355
359
  //#endregion
356
- export { F as ProjectsProjectDetailsPagePage };
360
+ export { I as ProjectsProjectDetailsPagePage };
357
361
 
358
362
  //# sourceMappingURL=ProjectsProjectDetailsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectsProjectDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectDetailsPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { Calendar, DollarSign, FolderKanban, Pencil, Target, Trash2, Users } from 'lucide-react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { useCrewFoundryStore, type Project } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nconst PROJECT_EDIT_FIELDS: FieldConfig[] = [\n { name: 'name', label: 'Project Name', type: 'text', required: true, colSpan: 2 },\n { name: 'description', label: 'Description', type: 'textarea', colSpan: 2 },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n options: [\n { label: 'Planning', value: 'planning' },\n { label: 'Active', value: 'active' },\n { label: 'On Hold', value: 'on_hold' },\n { label: 'Completed', value: 'completed' },\n { label: 'Cancelled', value: 'cancelled' },\n ],\n },\n {\n name: 'priority',\n label: 'Priority',\n type: 'select',\n options: [\n { label: 'Low', value: 'low' },\n { label: 'Medium', value: 'medium' },\n { label: 'High', value: 'high' },\n { label: 'Critical', value: 'critical' },\n ],\n },\n { name: 'budget', label: 'Budget ($)', type: 'number' },\n { name: 'progress', label: 'Progress (%)', type: 'number' },\n];\n\nexport function ProjectsProjectDetailsPagePage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { showToast } = useGlobalUi();\n const projects = useCrewFoundryStore((state) => state.projects);\n const updateProject = useCrewFoundryStore((state) => state.updateProject);\n const removeProject = useCrewFoundryStore((state) => state.removeProject);\n const editModal = useFormModal();\n const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const projectId = searchParams.get('id');\n const project = projects.find((p) => p.id === projectId) ?? projects[0];\n if (!project)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Project not found\"\n description=\"This project is no longer available.\"\n />\n </div>\n );\n\n const budgetPct = project.budget > 0 ? Math.round((project.spent / project.budget) * 100) : 0;\n const budgetOverrun = project.budget > 0 && project.spent / project.budget > 0.9;\n\n const editInitialValues: FormValues = {\n name: project.name,\n description: project.description,\n status: project.status,\n priority: project.priority,\n budget: project.budget,\n progress: project.progress,\n };\n\n const handleEdit = async (values: FormValues) => {\n const updates: Partial<Project> = {\n name: String(values.name ?? '').trim(),\n description: String(values.description ?? '').trim(),\n status: String(values.status ?? project.status) as Project['status'],\n priority: String(values.priority ?? project.priority) as Project['priority'],\n };\n if (typeof values.budget === 'number' && !Number.isNaN(values.budget)) {\n updates.budget = values.budget;\n }\n if (typeof values.progress === 'number' && !Number.isNaN(values.progress)) {\n updates.progress = values.progress;\n }\n await updateProject(project.id, updates);\n showToast('Project updated', 'success');\n };\n\n const handleDelete = async () => {\n if (deleting) return;\n setDeleting(true);\n try {\n await removeProject(project.id);\n showToast('Project deleted', 'success');\n setConfirmDeleteOpen(false);\n navigate('../../projects/projects-page');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to delete project', 'error');\n } finally {\n setDeleting(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{project.name}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{project.description}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"hidden gap-1 sm:flex\">\n <Badge variant={project.priority === 'critical' ? 'destructive' : 'default'}>\n {formatEnumLabel(project.priority)}\n </Badge>\n <Badge variant={project.status === 'active' ? 'default' : 'secondary'}>\n {formatEnumLabel(project.status)}\n </Badge>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => editModal.openModal()}>\n <Pencil className=\"h-4 w-4 mr-1\" />\n Edit\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Delete project\"\n className=\"h-9 w-9 p-0 text-text-secondary hover:text-status-error-text\"\n onClick={() => setConfirmDeleteOpen(true)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n <PagePurpose>\n Track a single project end-to-end — progress, budget, team, and timeline in one place — so\n you can spot risks early and keep delivery on schedule and on budget.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"crewfoundry-project-details\"\n steps={[\n {\n id: 'all-projects',\n label: 'View all projects',\n description: 'See how this project compares across your portfolio.',\n icon: <FolderKanban className=\"h-4 w-4\" />,\n onClick: () => navigate('../../projects/projects-page'),\n },\n {\n id: 'team',\n label: 'Check the team',\n description: 'Review who is working on this and their workload.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('../../teams/teams-page'),\n },\n {\n id: 'new-project',\n label: 'Start a new project',\n description: 'Kick off the next piece of work.',\n icon: <Target className=\"h-4 w-4\" />,\n onClick: () => navigate('../../projects/create-project-page'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Target className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.progress}%</p>\n <p className=\"text-xs text-text-secondary\">Progress</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <DollarSign className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">${(project.budget / 1000).toFixed(0)}K</p>\n <p className=\"text-xs text-text-secondary\">Budget</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Users className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.teamName}</p>\n <p className=\"text-xs text-text-secondary\">Team</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Calendar className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.endDate}</p>\n <p className=\"text-xs text-text-secondary\">Deadline</p>\n </CardContent>\n </Card>\n </div>\n <EmphasisPanel>\n <div className=\"mb-2 text-lg font-semibold\">Task Progress</div>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n {project.completedTasks} of {project.tasks} tasks completed\n </span>\n <span className=\"font-medium\">{project.progress}%</span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-3 bg-action-primary-bg rounded\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n </div>\n </EmphasisPanel>\n <Card>\n <CardHeader>\n <CardTitle>Budget Tracking</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n Spent ${(project.spent / 1000).toFixed(0)}K of ${(project.budget / 1000).toFixed(0)}\n K\n </span>\n <span className=\"font-medium\">{budgetPct}%</span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className={`h-3 rounded ${budgetOverrun ? 'bg-status-error-text' : 'bg-status-success-text'}`}\n style={{ width: `${budgetPct}%` }}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4 mt-4 text-sm\">\n <div>\n <p className=\"text-xs text-text-secondary\">Manager</p>\n <p className=\"font-medium\">{project.managerName}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Timeline</p>\n <p>\n {project.startDate} — {project.endDate}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <FormModal\n open={editModal.open}\n onOpenChange={editModal.onOpenChange}\n title=\"Edit Project\"\n description={`Update the details for ${project.name}.`}\n fields={PROJECT_EDIT_FIELDS}\n initialValues={editInitialValues}\n submitLabel=\"Save Changes\"\n onSubmit={handleEdit}\n />\n\n <ResponsiveDialog open={confirmDeleteOpen} onOpenChange={setConfirmDeleteOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-[440px]\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Delete {project.name}?</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This permanently removes the project and its tracking data. This cannot be undone.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmDeleteOpen(false)}\n disabled={deleting}\n >\n Cancel\n </Button>\n <Button type=\"button\" variant=\"destructive\" onClick={handleDelete} disabled={deleting}>\n {deleting ? 'Deleting…' : 'Delete Project'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAgCA,IAAM,IAAqC;CACzC;EAAE,MAAM;EAAQ,OAAO;EAAgB,MAAM;EAAQ,UAAU;EAAM,SAAS;EAAG;CACjF;EAAE,MAAM;EAAe,OAAO;EAAe,MAAM;EAAY,SAAS;EAAG;CAC3E;EACE,MAAM;EACN,OAAO;EACP,MAAM;EACN,SAAS;GACP;IAAE,OAAO;IAAY,OAAO;IAAY;GACxC;IAAE,OAAO;IAAU,OAAO;IAAU;GACpC;IAAE,OAAO;IAAW,OAAO;IAAW;GACtC;IAAE,OAAO;IAAa,OAAO;IAAa;GAC1C;IAAE,OAAO;IAAa,OAAO;IAAa;GAC3C;EACF;CACD;EACE,MAAM;EACN,OAAO;EACP,MAAM;EACN,SAAS;GACP;IAAE,OAAO;IAAO,OAAO;IAAO;GAC9B;IAAE,OAAO;IAAU,OAAO;IAAU;GACpC;IAAE,OAAO;IAAQ,OAAO;IAAQ;GAChC;IAAE,OAAO;IAAY,OAAO;IAAY;GACzC;EACF;CACD;EAAE,MAAM;EAAU,OAAO;EAAc,MAAM;EAAU;CACvD;EAAE,MAAM;EAAY,OAAO;EAAgB,MAAM;EAAU;CAC5D;AAED,SAAgB,IAAiC;CAC/C,IAAM,IAAW,GAAa,EACxB,CAAC,KAAgB,GAAiB,EAClC,EAAE,iBAAc,GAAa,EAC7B,IAAW,GAAqB,MAAU,EAAM,SAAS,EACzD,IAAgB,GAAqB,MAAU,EAAM,cAAc,EACnE,IAAgB,GAAqB,MAAU,EAAM,cAAc,EACnE,IAAY,GAAc,EAC1B,CAAC,GAAmB,KAAwB,EAAS,GAAM,EAC3D,CAAC,GAAU,KAAe,EAAS,GAAM,EACzC,IAAY,EAAa,IAAI,KAAK,EAClC,IAAU,EAAS,MAAM,MAAM,EAAE,OAAO,EAAU,IAAI,EAAS;AACrE,KAAI,CAAC,EACH,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,CAAA;EACE,CAAA;CAGV,IAAM,IAAY,EAAQ,SAAS,IAAI,KAAK,MAAO,EAAQ,QAAQ,EAAQ,SAAU,IAAI,GAAG,GACtF,IAAgB,EAAQ,SAAS,KAAK,EAAQ,QAAQ,EAAQ,SAAS,IAEvE,IAAgC;EACpC,MAAM,EAAQ;EACd,aAAa,EAAQ;EACrB,QAAQ,EAAQ;EAChB,UAAU,EAAQ;EAClB,QAAQ,EAAQ;EAChB,UAAU,EAAQ;EACnB;AAkCD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAe,EAAQ,MAAoB,CAAA;KACxC,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eAA+B,EAAQ;KAAgB,CAAA,CAChE,EAAA,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QAAO,SAAS,EAAQ,aAAa,aAAa,gBAAgB;kBAC/D,EAAgB,EAAQ,SAAS;QAC5B,CAAA,EACR,kBAAC,GAAD;QAAO,SAAS,EAAQ,WAAW,WAAW,YAAY;kBACvD,EAAgB,EAAQ,OAAO;QAC1B,CAAA,CACJ;;MACN,kBAAC,GAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,eAAe,EAAU,WAAW;iBAAxE,CACE,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA,EAAA,OAE5B;;MACT,kBAAC,GAAD;OACE,SAAQ;OACR,MAAK;OACL,cAAW;OACX,WAAU;OACV,eAAe,EAAqB,GAAK;iBAEzC,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;OACvB,CAAA;MACL;OACF;;GACN,kBAAC,GAAD,EAAA,UAAa,oKAGC,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;MAC1C,eAAe,EAAS,+BAA+B;MACxD;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;MACnC,eAAe,EAAS,yBAAyB;MAClD;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;MACpC,eAAe,EAAS,qCAAqC;MAC9D;KACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,GAAD,EAAQ,WAAU,4CAA6C,CAAA;OAC/D,kBAAC,KAAD;QAAG,WAAU;kBAAb,CAAkC,EAAQ,UAAS,IAAK;;OACxD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAY,CAAA;OAC3C;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,GAAD,EAAY,WAAU,4CAA6C,CAAA;OACnE,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAAiC;UAAG,EAAQ,SAAS,KAAM,QAAQ,EAAE;SAAC;SAAK;;OAC3E,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAU,CAAA;OACzC;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,GAAD,EAAO,WAAU,4CAA6C,CAAA;OAC9D,kBAAC,KAAD;QAAG,WAAU;kBAAqB,EAAQ;QAAa,CAAA;OACvD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAQ,CAAA;OACvC;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,GAAD,EAAU,WAAU,4CAA6C,CAAA;OACjE,kBAAC,KAAD;QAAG,WAAU;kBAAqB,EAAQ;QAAY,CAAA;OACtD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAY,CAAA;OAC3C;SACT,CAAA;KACH;;GACN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;cAA6B;IAAmB,CAAA,EAC/D,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD,EAAA,UAAA;MACG,EAAQ;MAAe;MAAK,EAAQ;MAAM;MACtC,EAAA,CAAA,EACP,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CAA+B,EAAQ,UAAS,IAAQ;QACpD;QACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MACE,WAAU;MACV,OAAO,EAAE,OAAO,GAAG,EAAQ,SAAS,IAAI;MACxC,CAAA;KACE,CAAA,CACF;MACQ,EAAA,CAAA;GAChB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,mBAA2B,CAAA,EAC3B,CAAA,EACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD,EAAA,UAAA;MAAM;OACK,EAAQ,QAAQ,KAAM,QAAQ,EAAE;MAAC;OAAQ,EAAQ,SAAS,KAAM,QAAQ,EAAE;MAAC;MAE/E,EAAA,CAAA,EACP,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CAA+B,GAAU,IAAQ;QAC7C;QACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MACE,WAAW,eAAe,IAAgB,yBAAyB;MACnE,OAAO,EAAE,OAAO,GAAG,EAAU,IAAI;MACjC,CAAA;KACE,CAAA,CACF;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAW,CAAA,EACtD,kBAAC,KAAD;KAAG,WAAU;eAAe,EAAQ;KAAgB,CAAA,CAChD,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAY,CAAA,EACvD,kBAAC,KAAD,EAAA,UAAA;KACG,EAAQ;KAAU;KAAI,EAAQ;KAC7B,EAAA,CAAA,CACA,EAAA,CAAA,CACF;MACM,EAAA,CAAA,CACT,EAAA,CAAA;GAEP,kBAAC,GAAD;IACE,MAAM,EAAU;IAChB,cAAc,EAAU;IACxB,OAAM;IACN,aAAa,0BAA0B,EAAQ,KAAK;IACpD,QAAQ;IACR,eAAe;IACf,aAAY;IACZ,UA3La,OAAO,MAAuB;KAC/C,IAAM,IAA4B;MAChC,MAAM,OAAO,EAAO,QAAQ,GAAG,CAAC,MAAM;MACtC,aAAa,OAAO,EAAO,eAAe,GAAG,CAAC,MAAM;MACpD,QAAQ,OAAO,EAAO,UAAU,EAAQ,OAAO;MAC/C,UAAU,OAAO,EAAO,YAAY,EAAQ,SAAS;MACtD;AAQD,KAPI,OAAO,EAAO,UAAW,YAAY,CAAC,OAAO,MAAM,EAAO,OAAO,KACnE,EAAQ,SAAS,EAAO,SAEtB,OAAO,EAAO,YAAa,YAAY,CAAC,OAAO,MAAM,EAAO,SAAS,KACvE,EAAQ,WAAW,EAAO,WAE5B,MAAM,EAAc,EAAQ,IAAI,EAAQ,EACxC,EAAU,mBAAmB,UAAU;;IA8KnC,CAAA;GAEF,kBAAC,GAAD;IAAkB,MAAM;IAAmB,cAAc;cACvD,kBAAC,GAAD;KAAyB,WAAU;eAAnC,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA;MAAuB;MAAQ,EAAQ;MAAK;MAAyB,EAAA,CAAA,EACrE,kBAAC,GAAD,EAAA,UAA6B,sFAEC,CAAA,CACP,EAAA,CAAA,EACzB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MACE,MAAK;MACL,SAAQ;MACR,eAAe,EAAqB,GAAM;MAC1C,UAAU;gBACX;MAEQ,CAAA,EACT,kBAAC,GAAD;MAAQ,MAAK;MAAS,SAAQ;MAAc,SA9LjC,YAAY;AAC3B,eACJ;UAAY,GAAK;AACjB,YAAI;AAIF,SAHA,MAAM,EAAc,EAAQ,GAAG,EAC/B,EAAU,mBAAmB,UAAU,EACvC,EAAqB,GAAM,EAC3B,EAAS,+BAA+B;iBACjC,GAAO;AACd,WAAU,aAAiB,QAAQ,EAAM,UAAU,4BAA4B,QAAQ;kBAC/E;AACR,WAAY,GAAM;;;;MAmLuD,UAAU;gBAC1E,IAAW,cAAc;MACnB,CAAA,CACc,EAAA,CAAA,CACD;;IACT,CAAA;GACf"}
1
+ {"version":3,"file":"ProjectsProjectDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectDetailsPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Spinner,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { Calendar, DollarSign, FolderKanban, Pencil, Target, Trash2, Users } from 'lucide-react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { useCrewFoundryStore, type Project } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nconst PROJECT_EDIT_FIELDS: FieldConfig[] = [\n { name: 'name', label: 'Project Name', type: 'text', required: true, colSpan: 2 },\n { name: 'description', label: 'Description', type: 'textarea', colSpan: 2 },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n options: [\n { label: 'Planning', value: 'planning' },\n { label: 'Active', value: 'active' },\n { label: 'On Hold', value: 'on_hold' },\n { label: 'Completed', value: 'completed' },\n { label: 'Cancelled', value: 'cancelled' },\n ],\n },\n {\n name: 'priority',\n label: 'Priority',\n type: 'select',\n options: [\n { label: 'Low', value: 'low' },\n { label: 'Medium', value: 'medium' },\n { label: 'High', value: 'high' },\n { label: 'Critical', value: 'critical' },\n ],\n },\n { name: 'budget', label: 'Budget ($)', type: 'number' },\n { name: 'progress', label: 'Progress (%)', type: 'number' },\n];\n\nexport function ProjectsProjectDetailsPagePage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { showToast } = useGlobalUi();\n const projects = useCrewFoundryStore((state) => state.projects);\n const updateProject = useCrewFoundryStore((state) => state.updateProject);\n const removeProject = useCrewFoundryStore((state) => state.removeProject);\n const initialized = useCrewFoundryStore((state) => state.initialized);\n const editModal = useFormModal();\n const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const projectId = searchParams.get('id');\n const project = projects.find((p) => p.id === projectId) ?? projects[0];\n if (!initialized && !project) {\n return (\n <div className=\"flex min-h-[60vh] items-center justify-center p-6\">\n <Spinner size=\"lg\" />\n </div>\n );\n }\n\n if (!project)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Project not found\"\n description=\"This project is no longer available.\"\n />\n </div>\n );\n\n const budgetPct = project.budget > 0 ? Math.round((project.spent / project.budget) * 100) : 0;\n const budgetOverrun = project.budget > 0 && project.spent / project.budget > 0.9;\n\n const editInitialValues: FormValues = {\n name: project.name,\n description: project.description,\n status: project.status,\n priority: project.priority,\n budget: project.budget,\n progress: project.progress,\n };\n\n const handleEdit = async (values: FormValues) => {\n const updates: Partial<Project> = {\n name: String(values.name ?? '').trim(),\n description: String(values.description ?? '').trim(),\n status: String(values.status ?? project.status) as Project['status'],\n priority: String(values.priority ?? project.priority) as Project['priority'],\n };\n if (typeof values.budget === 'number' && !Number.isNaN(values.budget)) {\n updates.budget = values.budget;\n }\n if (typeof values.progress === 'number' && !Number.isNaN(values.progress)) {\n updates.progress = values.progress;\n }\n await updateProject(project.id, updates);\n showToast('Project updated', 'success');\n };\n\n const handleDelete = async () => {\n if (deleting) return;\n setDeleting(true);\n try {\n await removeProject(project.id);\n showToast('Project deleted', 'success');\n setConfirmDeleteOpen(false);\n navigate('../projects/projects-page');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to delete project', 'error');\n } finally {\n setDeleting(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{project.name}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{project.description}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"hidden gap-1 sm:flex\">\n <Badge variant={project.priority === 'critical' ? 'destructive' : 'default'}>\n {formatEnumLabel(project.priority)}\n </Badge>\n <Badge variant={project.status === 'active' ? 'default' : 'secondary'}>\n {formatEnumLabel(project.status)}\n </Badge>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => editModal.openModal()}>\n <Pencil className=\"h-4 w-4 mr-1\" />\n Edit\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Delete project\"\n className=\"h-9 w-9 p-0 text-text-secondary hover:text-status-error-text\"\n onClick={() => setConfirmDeleteOpen(true)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n <PagePurpose>\n Track a single project end-to-end — progress, budget, team, and timeline in one place — so\n you can spot risks early and keep delivery on schedule and on budget.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"crewfoundry-project-details\"\n steps={[\n {\n id: 'all-projects',\n label: 'View all projects',\n description: 'See how this project compares across your portfolio.',\n icon: <FolderKanban className=\"h-4 w-4\" />,\n onClick: () => navigate('../projects/projects-page'),\n },\n {\n id: 'team',\n label: 'Check the team',\n description: 'Review who is working on this and their workload.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('../teams/teams-page'),\n },\n {\n id: 'new-project',\n label: 'Start a new project',\n description: 'Kick off the next piece of work.',\n icon: <Target className=\"h-4 w-4\" />,\n onClick: () => navigate('../projects/create-project-page'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Target className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.progress}%</p>\n <p className=\"text-xs text-text-secondary\">Progress</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <DollarSign className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">${(project.budget / 1000).toFixed(0)}K</p>\n <p className=\"text-xs text-text-secondary\">Budget</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Users className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.teamName}</p>\n <p className=\"text-xs text-text-secondary\">Team</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Calendar className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.endDate}</p>\n <p className=\"text-xs text-text-secondary\">Deadline</p>\n </CardContent>\n </Card>\n </div>\n <EmphasisPanel>\n <div className=\"mb-2 text-lg font-semibold\">Task Progress</div>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n {project.completedTasks} of {project.tasks} tasks completed\n </span>\n <span className=\"font-medium\">{project.progress}%</span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-3 bg-action-primary-bg rounded\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n </div>\n </EmphasisPanel>\n <Card>\n <CardHeader>\n <CardTitle>Budget Tracking</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n Spent ${(project.spent / 1000).toFixed(0)}K of ${(project.budget / 1000).toFixed(0)}\n K\n </span>\n <span className=\"font-medium\">{budgetPct}%</span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className={`h-3 rounded ${budgetOverrun ? 'bg-status-error-text' : 'bg-status-success-text'}`}\n style={{ width: `${budgetPct}%` }}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4 mt-4 text-sm\">\n <div>\n <p className=\"text-xs text-text-secondary\">Manager</p>\n <p className=\"font-medium\">{project.managerName}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Timeline</p>\n <p>\n {project.startDate} — {project.endDate}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <FormModal\n open={editModal.open}\n onOpenChange={editModal.onOpenChange}\n title=\"Edit Project\"\n description={`Update the details for ${project.name}.`}\n fields={PROJECT_EDIT_FIELDS}\n initialValues={editInitialValues}\n submitLabel=\"Save Changes\"\n onSubmit={handleEdit}\n />\n\n <ResponsiveDialog open={confirmDeleteOpen} onOpenChange={setConfirmDeleteOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-[440px]\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Delete {project.name}?</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This permanently removes the project and its tracking data. This cannot be undone.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmDeleteOpen(false)}\n disabled={deleting}\n >\n Cancel\n </Button>\n <Button type=\"button\" variant=\"destructive\" onClick={handleDelete} disabled={deleting}>\n {deleting ? 'Deleting…' : 'Delete Project'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -11,7 +11,7 @@ function y() {
11
11
  let { t: y } = v(), b = r(), { projects: x } = e(), S = x.filter((e) => e.status === "active"), { page: C, pageSize: w, setPage: T } = _({ initialPageSize: 12 }), E = (e, t) => {
12
12
  let n = y(e);
13
13
  return n === e ? t : n;
14
- }, D = x.slice((C - 1) * w, (C - 1) * w + w), O = (e) => b(`../../projects/project-details-page?id=${encodeURIComponent(e.id)}`);
14
+ }, D = x.slice((C - 1) * w, (C - 1) * w + w), O = (e) => b(`../projects/project-details-page?id=${encodeURIComponent(e.id)}`);
15
15
  return /* @__PURE__ */ a("div", {
16
16
  className: "space-y-6 p-6",
17
17
  children: [
@@ -36,7 +36,7 @@ function y() {
36
36
  })
37
37
  ] }), /* @__PURE__ */ a(s, {
38
38
  size: "sm",
39
- onClick: () => b("../../projects/create-project-page"),
39
+ onClick: () => b("../projects/create-project-page"),
40
40
  children: [/* @__PURE__ */ i(n, { className: "h-4 w-4 mr-1" }), E("crewfoundry.projects.actions.newProject", "New Project")]
41
41
  })]
42
42
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectsProjectsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { Plus } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore, type Project } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nexport function ProjectsProjectsPagePage() {\n const { t: translate } = useI18n();\n const navigate = useNavigate();\n const { projects } = useCrewFoundryStore();\n const activeProjects = projects.filter((p) => p.status === 'active');\n const { page, pageSize, setPage } = usePagination({ initialPageSize: 12 });\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n\n const pageProjects = projects.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize);\n\n const openProject = (project: Project) =>\n navigate(`../../projects/project-details-page?id=${encodeURIComponent(project.id)}`);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{t('crewfoundry.projects.title', 'Projects')}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {activeProjects.length}{' '}\n {t('crewfoundry.projects.summary.activeProjects', 'active projects')}\n </p>\n <PagePurpose className=\"mt-1\">\n All your projects in one view — track status, progress, and budgets so nothing stalls\n and everything ships on time.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => navigate('../../projects/create-project-page')}>\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('crewfoundry.projects.actions.newProject', 'New Project')}\n </Button>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {projects.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No projects yet\"\n description=\"Create your first project to start tracking work.\"\n />\n </div>\n ) : (\n pageProjects.map((project, _idx) => (\n <GlassCard\n key={project.id}\n treatment={_idx === 0 && page === 1 ? 'glass' : 'plain'}\n glow={_idx === 0 && page === 1}\n role=\"button\"\n tabIndex={0}\n aria-label={`Open ${project.name} project detail`}\n onClick={() => openProject(project)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openProject(project);\n }\n }}\n className=\"hover:shadow-md transition-shadow cursor-pointer focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{project.name}</CardTitle>\n <Badge\n variant={\n project.status === 'active'\n ? 'default'\n : project.status === 'completed'\n ? 'secondary'\n : 'outline'\n }\n className=\"text-[10px]\"\n >\n {formatEnumLabel(project.status)}\n </Badge>\n </div>\n <CardDescription>{project.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2 mb-3\">\n <div className=\"flex justify-between text-xs\">\n <span>\n {project.completedTasks}/{project.tasks}{' '}\n {t('crewfoundry.projects.card.tasks', 'tasks')}\n </span>\n <span>{project.progress}%</span>\n </div>\n <div className=\"h-2 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-2 bg-action-primary-bg rounded\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-2 text-xs text-text-secondary\">\n <span>\n {t('crewfoundry.projects.card.team', 'Team')}: {project.teamName}\n </span>\n <span>\n {t('crewfoundry.projects.card.manager', 'Manager')}: {project.managerName}\n </span>\n <span>\n {t('crewfoundry.projects.card.budget', 'Budget')}: $\n {(project.budget / 1000).toFixed(0)}K\n </span>\n <span>\n {t('crewfoundry.projects.card.spent', 'Spent')}: $\n {(project.spent / 1000).toFixed(0)}K\n </span>\n </div>\n <div className=\"flex gap-1 mt-2\">\n <Badge\n variant={\n project.priority === 'critical'\n ? 'destructive'\n : project.priority === 'high'\n ? 'default'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {formatEnumLabel(project.priority)}\n </Badge>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {project.startDate} — {project.endDate}\n </Badge>\n </div>\n </CardContent>\n </GlassCard>\n ))\n )}\n </div>\n\n {projects.length > pageSize && (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={projects.length}\n onPageChange={setPage}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectsProjectsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { Plus } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore, type Project } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nexport function ProjectsProjectsPagePage() {\n const { t: translate } = useI18n();\n const navigate = useNavigate();\n const { projects } = useCrewFoundryStore();\n const activeProjects = projects.filter((p) => p.status === 'active');\n const { page, pageSize, setPage } = usePagination({ initialPageSize: 12 });\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n\n const pageProjects = projects.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize);\n\n const openProject = (project: Project) =>\n navigate(`../projects/project-details-page?id=${encodeURIComponent(project.id)}`);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{t('crewfoundry.projects.title', 'Projects')}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {activeProjects.length}{' '}\n {t('crewfoundry.projects.summary.activeProjects', 'active projects')}\n </p>\n <PagePurpose className=\"mt-1\">\n All your projects in one view — track status, progress, and budgets so nothing stalls\n and everything ships on time.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => navigate('../projects/create-project-page')}>\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('crewfoundry.projects.actions.newProject', 'New Project')}\n </Button>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {projects.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No projects yet\"\n description=\"Create your first project to start tracking work.\"\n />\n </div>\n ) : (\n pageProjects.map((project, _idx) => (\n <GlassCard\n key={project.id}\n treatment={_idx === 0 && page === 1 ? 'glass' : 'plain'}\n glow={_idx === 0 && page === 1}\n role=\"button\"\n tabIndex={0}\n aria-label={`Open ${project.name} project detail`}\n onClick={() => openProject(project)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openProject(project);\n }\n }}\n className=\"hover:shadow-md transition-shadow cursor-pointer focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{project.name}</CardTitle>\n <Badge\n variant={\n project.status === 'active'\n ? 'default'\n : project.status === 'completed'\n ? 'secondary'\n : 'outline'\n }\n className=\"text-[10px]\"\n >\n {formatEnumLabel(project.status)}\n </Badge>\n </div>\n <CardDescription>{project.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2 mb-3\">\n <div className=\"flex justify-between text-xs\">\n <span>\n {project.completedTasks}/{project.tasks}{' '}\n {t('crewfoundry.projects.card.tasks', 'tasks')}\n </span>\n <span>{project.progress}%</span>\n </div>\n <div className=\"h-2 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-2 bg-action-primary-bg rounded\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-2 text-xs text-text-secondary\">\n <span>\n {t('crewfoundry.projects.card.team', 'Team')}: {project.teamName}\n </span>\n <span>\n {t('crewfoundry.projects.card.manager', 'Manager')}: {project.managerName}\n </span>\n <span>\n {t('crewfoundry.projects.card.budget', 'Budget')}: $\n {(project.budget / 1000).toFixed(0)}K\n </span>\n <span>\n {t('crewfoundry.projects.card.spent', 'Spent')}: $\n {(project.spent / 1000).toFixed(0)}K\n </span>\n </div>\n <div className=\"flex gap-1 mt-2\">\n <Badge\n variant={\n project.priority === 'critical'\n ? 'destructive'\n : project.priority === 'high'\n ? 'default'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {formatEnumLabel(project.priority)}\n </Badge>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {project.startDate} — {project.endDate}\n </Badge>\n </div>\n </CardContent>\n </GlassCard>\n ))\n )}\n </div>\n\n {projects.length > pageSize && (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={projects.length}\n onPageChange={setPage}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -3,11 +3,15 @@ import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
3
  import { BarChart3 as n, Calendar as r, FolderKanban as i, Settings as a, Star as o, Users as s } from "lucide-react";
4
4
  import { useNavigate as c, useSearchParams as l } from "react-router-dom";
5
5
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
6
- import { Badge as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g, EmphasisPanel as _, GradientText as v, IllustratedEmptyState as y, NextSteps as b, PagePurpose as x, ResponsiveTable as S } from "@burdenoff/fe-libs/ui";
6
+ import { Badge as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g, EmphasisPanel as _, GradientText as v, IllustratedEmptyState as y, NextSteps as b, PagePurpose as x, ResponsiveTable as S, Spinner as C } from "@burdenoff/fe-libs/ui";
7
7
  //#region src/crewfoundry/pages/TeamsTeamDetailPagePage.tsx
8
- function C() {
9
- let C = c(), [w] = l(), { teams: T, employees: E, projects: D } = e(), O = w.get("id"), k = T.find((e) => e.id === O) ?? T[0];
10
- if (!k) return /* @__PURE__ */ u("div", {
8
+ function w() {
9
+ let w = c(), [T] = l(), { teams: E, employees: D, projects: O, initialized: k } = e(), A = T.get("id"), j = E.find((e) => e.id === A) ?? E[0];
10
+ if (!k && !j) return /* @__PURE__ */ u("div", {
11
+ className: "flex min-h-[60vh] items-center justify-center p-6",
12
+ children: /* @__PURE__ */ u(C, { size: "lg" })
13
+ });
14
+ if (!j) return /* @__PURE__ */ u("div", {
11
15
  className: "p-6",
12
16
  children: /* @__PURE__ */ u(y, {
13
17
  illustration: "empty-search",
@@ -15,7 +19,7 @@ function C() {
15
19
  description: "This team is no longer available."
16
20
  })
17
21
  });
18
- let A = E.filter((e) => k.members.includes(e.id)), j = D.filter((e) => e.teamId === k.id);
22
+ let M = D.filter((e) => j.members.includes(e.id)), N = O.filter((e) => e.teamId === j.id);
19
23
  return /* @__PURE__ */ d("div", {
20
24
  className: "space-y-6 p-6 max-w-4xl",
21
25
  children: [
@@ -24,19 +28,19 @@ function C() {
24
28
  children: [/* @__PURE__ */ d("div", { children: [
25
29
  /* @__PURE__ */ u("h1", {
26
30
  className: "text-2xl font-semibold",
27
- children: /* @__PURE__ */ u(v, { children: k.name })
31
+ children: /* @__PURE__ */ u(v, { children: j.name })
28
32
  }),
29
33
  /* @__PURE__ */ u("p", {
30
34
  className: "text-sm text-text-secondary",
31
- children: k.description
35
+ children: j.description
32
36
  }),
33
37
  /* @__PURE__ */ u(x, {
34
38
  className: "mt-2",
35
39
  children: "A complete view of one team — who's on it, what they're working on, and how they're performing — so you can support the group and keep its projects on track."
36
40
  })
37
41
  ] }), /* @__PURE__ */ u(f, {
38
- variant: k.status === "active" ? "default" : "secondary",
39
- children: t(k.status)
42
+ variant: j.status === "active" ? "default" : "secondary",
43
+ children: t(j.status)
40
44
  })]
41
45
  }),
42
46
  /* @__PURE__ */ u(b, {
@@ -47,21 +51,21 @@ function C() {
47
51
  label: "View team analytics",
48
52
  description: "See productivity and workload trends for this team.",
49
53
  icon: /* @__PURE__ */ u(n, { className: "h-4 w-4" }),
50
- onClick: () => C("../../teams/team-analytics-page")
54
+ onClick: () => w("../teams/team-analytics-page")
51
55
  },
52
56
  {
53
57
  id: "settings",
54
58
  label: "Adjust team settings",
55
59
  description: "Manage membership, permissions, and preferences.",
56
60
  icon: /* @__PURE__ */ u(a, { className: "h-4 w-4" }),
57
- onClick: () => C(`../../teams/team-settings-page?id=${encodeURIComponent(k.id)}`)
61
+ onClick: () => w(`../teams/team-settings-page?id=${encodeURIComponent(j.id)}`)
58
62
  },
59
63
  {
60
64
  id: "directory",
61
65
  label: "Browse all teams",
62
66
  description: "Explore how the rest of the organization is structured.",
63
67
  icon: /* @__PURE__ */ u(s, { className: "h-4 w-4" }),
64
- onClick: () => C("../../teams/team-directory-page")
68
+ onClick: () => w("../teams/team-directory-page")
65
69
  }
66
70
  ]
67
71
  }),
@@ -74,7 +78,7 @@ function C() {
74
78
  /* @__PURE__ */ u(s, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
75
79
  /* @__PURE__ */ u("p", {
76
80
  className: "text-lg font-bold",
77
- children: k.memberCount
81
+ children: j.memberCount
78
82
  }),
79
83
  /* @__PURE__ */ u("p", {
80
84
  className: "text-xs text-text-secondary",
@@ -88,7 +92,7 @@ function C() {
88
92
  /* @__PURE__ */ u(i, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
89
93
  /* @__PURE__ */ u("p", {
90
94
  className: "text-lg font-bold",
91
- children: k.projectCount
95
+ children: j.projectCount
92
96
  }),
93
97
  /* @__PURE__ */ u("p", {
94
98
  className: "text-xs text-text-secondary",
@@ -102,7 +106,7 @@ function C() {
102
106
  /* @__PURE__ */ u(o, { className: "h-5 w-5 mx-auto text-status-warning-text mb-1" }),
103
107
  /* @__PURE__ */ u("p", {
104
108
  className: "text-lg font-bold",
105
- children: k.leadName
109
+ children: j.leadName
106
110
  }),
107
111
  /* @__PURE__ */ u("p", {
108
112
  className: "text-xs text-text-secondary",
@@ -116,7 +120,7 @@ function C() {
116
120
  /* @__PURE__ */ u(r, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
117
121
  /* @__PURE__ */ u("p", {
118
122
  className: "text-lg font-bold",
119
- children: k.createdAt
123
+ children: j.createdAt
120
124
  }),
121
125
  /* @__PURE__ */ u("p", {
122
126
  className: "text-xs text-text-secondary",
@@ -129,7 +133,7 @@ function C() {
129
133
  /* @__PURE__ */ d(_, { children: [/* @__PURE__ */ u("div", {
130
134
  className: "mb-2 text-lg font-semibold",
131
135
  children: "Team Members"
132
- }), A.length === 0 ? /* @__PURE__ */ u(y, {
136
+ }), M.length === 0 ? /* @__PURE__ */ u(y, {
133
137
  illustration: "empty-people",
134
138
  title: "No members yet",
135
139
  description: "Add people to this team to start collaborating."
@@ -177,18 +181,18 @@ function C() {
177
181
  })
178
182
  }
179
183
  ],
180
- data: A,
184
+ data: M,
181
185
  rowKey: (e) => e.id
182
186
  })] }),
183
- j.length > 0 && /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Team Projects" }) }), /* @__PURE__ */ u(m, {
187
+ N.length > 0 && /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Team Projects" }) }), /* @__PURE__ */ u(m, {
184
188
  className: "space-y-3",
185
- children: j.map((e) => /* @__PURE__ */ d("div", {
189
+ children: N.map((e) => /* @__PURE__ */ d("div", {
186
190
  role: "button",
187
191
  tabIndex: 0,
188
192
  "aria-label": `Open ${e.name} project detail`,
189
- onClick: () => C(`../../projects/project-details-page?id=${encodeURIComponent(e.id)}`),
193
+ onClick: () => w(`../projects/project-details-page?id=${encodeURIComponent(e.id)}`),
190
194
  onKeyDown: (t) => {
191
- (t.key === "Enter" || t.key === " ") && (t.preventDefault(), C(`../../projects/project-details-page?id=${encodeURIComponent(e.id)}`));
195
+ (t.key === "Enter" || t.key === " ") && (t.preventDefault(), w(`../projects/project-details-page?id=${encodeURIComponent(e.id)}`));
192
196
  },
193
197
  className: "flex items-center justify-between rounded border p-3 cursor-pointer hover:bg-bg-sunken/50 focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]",
194
198
  children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
@@ -228,6 +232,6 @@ function C() {
228
232
  });
229
233
  }
230
234
  //#endregion
231
- export { C as TeamsTeamDetailPagePage };
235
+ export { w as TeamsTeamDetailPagePage };
232
236
 
233
237
  //# sourceMappingURL=TeamsTeamDetailPagePage.js.map