@burdenoff/microfe-workspaces 2026.627.1 → 2026.711.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 (27) hide show
  1. package/dist/components/ProjectCard.js +174 -155
  2. package/dist/components/ProjectCard.js.map +1 -1
  3. package/dist/components/RenameProjectDialog.js +82 -0
  4. package/dist/components/RenameProjectDialog.js.map +1 -0
  5. package/dist/generated/wspace-operations.js +11 -0
  6. package/dist/generated/wspace-operations.js.map +1 -1
  7. package/dist/pages/ProjectDetailPage.js +244 -226
  8. package/dist/pages/ProjectDetailPage.js.map +1 -1
  9. package/dist/pages/ProjectsListPage.js +16 -15
  10. package/dist/pages/ProjectsListPage.js.map +1 -1
  11. package/dist/pages/dashboard/DashboardGrid.js +60 -48
  12. package/dist/pages/dashboard/DashboardGrid.js.map +1 -1
  13. package/dist/pages/dashboard/DashboardPage.js +107 -82
  14. package/dist/pages/dashboard/DashboardPage.js.map +1 -1
  15. package/dist/pages/dashboard/WidgetWrapper.js +2 -2
  16. package/dist/pages/dashboard/WidgetWrapper.js.map +1 -1
  17. package/dist/pages/dashboard/config.js +82 -0
  18. package/dist/pages/dashboard/config.js.map +1 -1
  19. package/dist/pages/dashboard/widgets/QuickActionsWidget.js +66 -23
  20. package/dist/pages/dashboard/widgets/QuickActionsWidget.js.map +1 -1
  21. package/dist/pages/dashboard/widgets/TipsWidget.js +68 -30
  22. package/dist/pages/dashboard/widgets/TipsWidget.js.map +1 -1
  23. package/dist/pages/dashboard/widgets/WorkflowRunsWidget.js +139 -0
  24. package/dist/pages/dashboard/widgets/WorkflowRunsWidget.js.map +1 -0
  25. package/dist/pages/dashboard/widgets/WorkflowsOverviewWidget.js +91 -0
  26. package/dist/pages/dashboard/widgets/WorkflowsOverviewWidget.js.map +1 -0
  27. package/package.json +1 -1
@@ -9,89 +9,90 @@ import { useProject as ie, useProjectMembersCount as ae } from "../hooks/useProj
9
9
  import { useArchiveProject as oe, useDeleteProject as se, useTagProject as ce, useUnarchiveProject as le, useUntagProject as ue, useUpdateProject as de } from "../hooks/useProjectMutations.js";
10
10
  import { formatDate as i } from "../utils/formatters.js";
11
11
  import { getProjectDisplayTags as fe, toProjectTag as a } from "../utils/projectTags.js";
12
- import { useWorkspaceActivity as pe } from "../hooks/useWorkspaceActivity.js";
13
- import { ProjectTagsWidget as me } from "../components/tags/ProjectTagsWidget.js";
12
+ import { RenameProjectDialog as pe } from "../components/RenameProjectDialog.js";
13
+ import { useWorkspaceActivity as me } from "../hooks/useWorkspaceActivity.js";
14
+ import { ProjectTagsWidget as he } from "../components/tags/ProjectTagsWidget.js";
14
15
  import { ProjectMemberPickerDialog as o } from "../components/ProjectMemberPickerDialog.js";
15
- import { useMemo as s, useState as c } from "react";
16
- import { Activity as l, Archive as u, ArrowLeft as d, Clock as f, FolderKanban as p, MoreVertical as he, UserPlus as m, Users as h } from "lucide-react";
17
- import { jsx as g, jsxs as _ } from "react/jsx-runtime";
18
- import { AlertDialog as ge, AlertDialogAction as _e, AlertDialogCancel as ve, AlertDialogContent as ye, AlertDialogDescription as be, AlertDialogFooter as xe, AlertDialogHeader as Se, AlertDialogTitle as Ce, Badge as v, Button as y, CardContent as b, CardHeader as x, CardTitle as S, DropdownMenu as we, DropdownMenuContent as C, DropdownMenuItem as w, DropdownMenuSeparator as T, DropdownMenuTrigger as E, EntityIdModal as D, GlassCard as O, IllustratedEmptyState as k, NextSteps as Te, PagePurpose as A, ShowMore as Ee, Skeleton as j, useEntityIdModal as De } from "@burdenoff/fe-libs/ui";
19
- import { useNavigate as Oe, useParams as ke } from "react-router-dom";
20
- import { useI18n as Ae } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
16
+ import { useMemo as ge, useState as s } from "react";
17
+ import { Activity as c, Archive as l, ArrowLeft as u, Clock as d, FolderKanban as f, MoreVertical as _e, Pencil as ve, UserPlus as p, Users as m } from "lucide-react";
18
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
19
+ import { AlertDialog as ye, AlertDialogAction as be, AlertDialogCancel as xe, AlertDialogContent as Se, AlertDialogDescription as Ce, AlertDialogFooter as we, AlertDialogHeader as Te, AlertDialogTitle as Ee, Badge as _, Button as v, CardContent as y, CardHeader as b, CardTitle as x, DropdownMenu as De, DropdownMenuContent as Oe, DropdownMenuItem as S, DropdownMenuSeparator as C, DropdownMenuTrigger as w, EntityIdModal as T, GlassCard as E, IllustratedEmptyState as ke, NextSteps as Ae, PagePurpose as je, ShowMore as Me, Skeleton as D, useEntityIdModal as Ne } from "@burdenoff/fe-libs/ui";
20
+ import { useNavigate as Pe, useParams as O } from "react-router-dom";
21
+ import { useI18n as Fe } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
21
22
  //#region src/pages/ProjectDetailPage.tsx
22
- function M() {
23
- let { t: M } = Ae(), N = De(), { workspaceId: P, projectId: F } = ke();
23
+ function k() {
24
+ let { t: k } = Fe(), A = Ne(), { workspaceId: j, projectId: M } = O();
24
25
  te("workspaces.project-detail", {
25
- workspaceId: P,
26
- projectId: F,
26
+ workspaceId: j,
27
+ projectId: M,
27
28
  requireParams: !0
28
29
  });
29
- let I = Oe(), { basePath: L = "/workspaces" } = e(), { withCurrentSearch: R } = ee(), { data: z, isLoading: je, error: Me } = ie(F || "", P), [Ne, B] = c(!1), [V, H] = c(!1), { mutate: Pe, isPending: U } = oe(P), { mutate: Fe, isPending: W } = le(P), { mutate: Ie, isPending: G } = se(P), { mutateAsync: Le, isPending: Re } = ce(P), { mutateAsync: ze, isPending: Be } = ue(P), { mutateAsync: Ve, isPending: He } = de(P), { canViewProject: Ue, canDeleteProject: K, canArchiveProject: q, canListProjectMembers: J, canAddProjectMember: Y, isLoading: We } = re(), { data: Ge } = ae(F || "", P), X = s(() => fe({
30
- tags: z?.tags ?? [],
31
- tagAssignments: z?.tagAssignments
32
- }), [z?.tags, z?.tagAssignments]), { data: Ke } = pe(P), qe = (Ke ?? []).filter((e) => e.resourceId === F || e.resourceType?.toLowerCase() === "project").length, Je = X;
33
- if (We) return /* @__PURE__ */ _("div", {
30
+ let N = Pe(), { basePath: P = "/workspaces" } = e(), { withCurrentSearch: F } = ee(), { data: I, isLoading: Ie, error: Le } = ie(M || "", j), [Re, L] = s(!1), [R, z] = s(!1), [B, V] = s(!1), { mutate: ze, isPending: H } = oe(j), { mutate: Be, isPending: U } = le(j), { mutate: Ve, isPending: W } = se(j), { mutateAsync: He, isPending: Ue } = ce(j), { mutateAsync: We, isPending: Ge } = ue(j), { mutateAsync: Ke, isPending: qe } = de(j), { canViewProject: Je, canUpdateProject: G, canDeleteProject: K, canArchiveProject: q, canListProjectMembers: J, canAddProjectMember: Y, isLoading: Ye } = re(), { data: Xe } = ae(M || "", j), X = ge(() => fe({
31
+ tags: I?.tags ?? [],
32
+ tagAssignments: I?.tagAssignments
33
+ }), [I?.tags, I?.tagAssignments]), { data: Ze } = me(j), Qe = (Ze ?? []).filter((e) => e.resourceId === M || e.resourceType?.toLowerCase() === "project").length, $e = X;
34
+ if (Ye) return /* @__PURE__ */ g("div", {
34
35
  className: "space-y-4 p-6",
35
- children: [/* @__PURE__ */ g(j, { className: "h-10 w-1/3" }), /* @__PURE__ */ g(j, { className: "h-64" })]
36
+ children: [/* @__PURE__ */ h(D, { className: "h-10 w-1/3" }), /* @__PURE__ */ h(D, { className: "h-64" })]
36
37
  });
37
- if (!Ue) return /* @__PURE__ */ g("div", {
38
+ if (!Je) return /* @__PURE__ */ h("div", {
38
39
  className: "flex items-center justify-center min-h-[400px]",
39
- children: /* @__PURE__ */ _("div", {
40
+ children: /* @__PURE__ */ g("div", {
40
41
  className: "text-center space-y-2",
41
- children: [/* @__PURE__ */ g("h2", {
42
+ children: [/* @__PURE__ */ h("h2", {
42
43
  className: "text-lg font-semibold",
43
- children: n(M, "projectDetail.accessDenied", "Access Denied")
44
- }), /* @__PURE__ */ g("p", {
44
+ children: n(k, "projectDetail.accessDenied", "Access Denied")
45
+ }), /* @__PURE__ */ h("p", {
45
46
  className: "text-sm text-text-secondary",
46
- children: n(M, "projectDetail.noPermissionToViewProject", "You don't have permission to view this project.")
47
+ children: n(k, "projectDetail.noPermissionToViewProject", "You don't have permission to view this project.")
47
48
  })]
48
49
  })
49
50
  });
50
51
  let Z = () => {
51
- I(R(`${L}/${P}/projects`));
52
- }, Ye = () => {
53
- z && (z.archived ? Fe(z.id, { onError: (e) => {
52
+ N(F(`${P}/${j}/projects`));
53
+ }, et = () => {
54
+ I && (I.archived ? Be(I.id, { onError: (e) => {
54
55
  console.error("Failed to unarchive project:", e);
55
- } }) : Pe(z.id, { onError: (e) => {
56
+ } }) : ze(I.id, { onError: (e) => {
56
57
  console.error("Failed to archive project:", e);
57
58
  } }));
58
- }, Xe = () => {
59
- z && (ne("medium"), Ie(z.id, {
59
+ }, tt = () => {
60
+ I && (ne("medium"), Ve(I.id, {
60
61
  onSuccess: () => {
61
- r("success"), B(!1), I(R(`${L}/${P}/projects`));
62
+ r("success"), L(!1), N(F(`${P}/${j}/projects`));
62
63
  },
63
64
  onError: (e) => {
64
65
  r("error"), console.error("Failed to delete project:", e);
65
66
  }
66
67
  }));
67
68
  }, Q = () => {
68
- I(R(`${L}/${P}/projects/${F}/members`));
69
+ N(F(`${P}/${j}/projects/${M}/members`));
69
70
  }, $ = async (e) => {
70
- if (!z) return;
71
+ if (!I) return;
71
72
  let t = e.map((e) => a(e));
72
73
  try {
73
- await Ve({
74
- id: z.id,
74
+ await Ke({
75
+ id: I.id,
75
76
  input: { tags: t }
76
77
  });
77
78
  } catch (e) {
78
79
  r("warning"), console.error("Failed to sync legacy project tag mirror after updating structured project tags:", e);
79
80
  }
80
- }, Ze = async (e) => {
81
- if (z) try {
82
- await Le({
83
- entityId: z.id,
81
+ }, nt = async (e) => {
82
+ if (I) try {
83
+ await He({
84
+ entityId: I.id,
84
85
  tagId: e.id
85
86
  }), await $([...X, a(e)]);
86
87
  } catch (e) {
87
88
  throw r("error"), e;
88
89
  }
89
- }, Qe = async (e) => {
90
- if (!z) return;
91
- let t = z.tagAssignments?.find((t) => t.tagId === e)?.id;
90
+ }, rt = async (e) => {
91
+ if (!I) return;
92
+ let t = I.tagAssignments?.find((t) => t.tagId === e)?.id;
92
93
  try {
93
- await ze({
94
- entityId: z.id,
94
+ await We({
95
+ entityId: I.id,
95
96
  tagId: e,
96
97
  assignmentId: t
97
98
  }), await $(X.filter((t) => t.tagId !== e && t.id !== e));
@@ -99,129 +100,137 @@ function M() {
99
100
  throw r("error"), e;
100
101
  }
101
102
  };
102
- return je ? /* @__PURE__ */ _("div", {
103
+ return Ie ? /* @__PURE__ */ g("div", {
103
104
  className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
104
105
  children: [
105
- /* @__PURE__ */ g(j, { className: "h-10 w-32" }),
106
- /* @__PURE__ */ g(j, { className: "h-10 w-1/3" }),
107
- /* @__PURE__ */ _("div", {
106
+ /* @__PURE__ */ h(D, { className: "h-10 w-32" }),
107
+ /* @__PURE__ */ h(D, { className: "h-10 w-1/3" }),
108
+ /* @__PURE__ */ g("div", {
108
109
  className: "grid grid-cols-1 md:grid-cols-3 gap-4",
109
110
  children: [
110
- /* @__PURE__ */ g(j, { className: "h-32" }),
111
- /* @__PURE__ */ g(j, { className: "h-32" }),
112
- /* @__PURE__ */ g(j, { className: "h-32" })
111
+ /* @__PURE__ */ h(D, { className: "h-32" }),
112
+ /* @__PURE__ */ h(D, { className: "h-32" }),
113
+ /* @__PURE__ */ h(D, { className: "h-32" })
113
114
  ]
114
115
  }),
115
- /* @__PURE__ */ g(j, { className: "h-48" })
116
+ /* @__PURE__ */ h(D, { className: "h-48" })
116
117
  ]
117
- }) : Me || !z ? /* @__PURE__ */ _("div", {
118
+ }) : Le || !I ? /* @__PURE__ */ g("div", {
118
119
  className: "space-y-4 p-6",
119
- children: [/* @__PURE__ */ _(y, {
120
+ children: [/* @__PURE__ */ g(v, {
120
121
  variant: "ghost",
121
122
  onClick: Z,
122
123
  className: "gap-2",
123
- children: [/* @__PURE__ */ g(d, { size: 20 }), n(M, "projectDetail.backToProjects", "Back to Projects")]
124
- }), /* @__PURE__ */ g(k, {
124
+ children: [/* @__PURE__ */ h(u, { size: 20 }), n(k, "projectDetail.backToProjects", "Back to Projects")]
125
+ }), /* @__PURE__ */ h(ke, {
125
126
  illustration: "empty-search",
126
- title: n(M, "projectDetail.projectNotFound", "Project not found"),
127
- description: n(M, "projectDetail.projectNotFoundDescription", "The project you're looking for doesn't exist or you don't have permission to view it."),
128
- action: /* @__PURE__ */ _(y, {
127
+ title: n(k, "projectDetail.projectNotFound", "Project not found"),
128
+ description: n(k, "projectDetail.projectNotFoundDescription", "The project you're looking for doesn't exist or you don't have permission to view it."),
129
+ action: /* @__PURE__ */ g(v, {
129
130
  onClick: Z,
130
- children: [/* @__PURE__ */ g(d, {
131
+ children: [/* @__PURE__ */ h(u, {
131
132
  size: 16,
132
133
  className: "mr-2"
133
- }), n(M, "projectDetail.backToProjects", "Back to Projects")]
134
+ }), n(k, "projectDetail.backToProjects", "Back to Projects")]
134
135
  })
135
136
  })]
136
- }) : /* @__PURE__ */ _("div", {
137
+ }) : /* @__PURE__ */ g("div", {
137
138
  className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
138
139
  children: [
139
- /* @__PURE__ */ _("div", {
140
+ /* @__PURE__ */ g("div", {
140
141
  className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3",
141
- children: [/* @__PURE__ */ _("div", { children: [
142
- /* @__PURE__ */ _(y, {
142
+ children: [/* @__PURE__ */ g("div", { children: [
143
+ /* @__PURE__ */ g(v, {
143
144
  variant: "ghost",
144
145
  onClick: Z,
145
146
  className: "gap-2 mb-2 -ml-2",
146
- children: [/* @__PURE__ */ g(d, { size: 20 }), n(M, "projectDetail.backToProjects", "Back to Projects")]
147
+ children: [/* @__PURE__ */ h(u, { size: 20 }), n(k, "projectDetail.backToProjects", "Back to Projects")]
147
148
  }),
148
- /* @__PURE__ */ _("div", {
149
+ /* @__PURE__ */ g("div", {
149
150
  className: "flex items-center gap-3",
150
- children: [/* @__PURE__ */ g("div", {
151
+ children: [/* @__PURE__ */ h("div", {
151
152
  className: "p-3 rounded-lg bg-action-primary-bg/10",
152
- children: /* @__PURE__ */ g(p, {
153
+ children: /* @__PURE__ */ h(f, {
153
154
  className: "text-primary",
154
155
  size: 28
155
156
  })
156
- }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h1", {
157
+ }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("h1", {
157
158
  className: "text-2xl sm:text-3xl font-bold",
158
- children: z.name
159
- }), /* @__PURE__ */ g("p", {
159
+ children: I.name
160
+ }), /* @__PURE__ */ h("p", {
160
161
  className: "text-sm text-text-secondary font-mono",
161
- children: z.key
162
+ children: I.key
162
163
  })] })]
163
164
  }),
164
- /* @__PURE__ */ _("div", {
165
+ /* @__PURE__ */ g("div", {
165
166
  className: "flex items-center gap-2 mt-3",
166
- children: [/* @__PURE__ */ g(v, {
167
- className: `border ${t(z.status)}`,
168
- children: z.status
169
- }), z.archived && /* @__PURE__ */ _(v, {
167
+ children: [/* @__PURE__ */ h(_, {
168
+ className: `border ${t(I.status)}`,
169
+ children: I.status
170
+ }), I.archived && /* @__PURE__ */ g(_, {
170
171
  variant: "outline",
171
172
  className: "border-workspace-archived-border text-workspace-archived-text",
172
- children: [/* @__PURE__ */ g(u, {
173
+ children: [/* @__PURE__ */ h(l, {
173
174
  size: 12,
174
175
  className: "mr-1"
175
- }), n(M, "projectDetail.archived", "Archived")]
176
+ }), n(k, "projectDetail.archived", "Archived")]
176
177
  })]
177
178
  })
178
- ] }), /* @__PURE__ */ g("div", {
179
+ ] }), /* @__PURE__ */ h("div", {
179
180
  className: "flex items-center gap-2",
180
- children: /* @__PURE__ */ _(we, { children: [/* @__PURE__ */ g(E, {
181
+ children: /* @__PURE__ */ g(De, { children: [/* @__PURE__ */ h(w, {
181
182
  asChild: !0,
182
- children: /* @__PURE__ */ g(y, {
183
+ children: /* @__PURE__ */ h(v, {
183
184
  variant: "outline",
184
185
  size: "icon",
185
- "aria-label": n(M, "projectDetail.openProjectActionsAriaLabel", "Open project actions"),
186
- children: /* @__PURE__ */ g(he, { size: 20 })
186
+ "aria-label": n(k, "projectDetail.openProjectActionsAriaLabel", "Open project actions"),
187
+ children: /* @__PURE__ */ h(_e, { size: 20 })
187
188
  })
188
- }), /* @__PURE__ */ _(C, {
189
+ }), /* @__PURE__ */ g(Oe, {
189
190
  align: "end",
190
191
  children: [
191
- q && /* @__PURE__ */ _(w, {
192
- onClick: Ye,
193
- disabled: U || W,
194
- children: [/* @__PURE__ */ g(u, {
192
+ G && /* @__PURE__ */ g(S, {
193
+ onClick: () => V(!0),
194
+ children: [/* @__PURE__ */ h(ve, {
195
195
  size: 16,
196
196
  className: "mr-2"
197
- }), U || W ? n(M, "projectDetail.processing", "Processing...") : z.archived ? n(M, "projectDetail.unarchive", "Unarchive") : n(M, "projectDetail.archive", "Archive")]
197
+ }), n(k, "projectDetail.renameProject", "Rename Project")]
198
198
  }),
199
- q && K && /* @__PURE__ */ g(T, {}),
200
- K && /* @__PURE__ */ g(w, {
201
- onClick: () => B(!0),
199
+ G && (q || K) && /* @__PURE__ */ h(C, {}),
200
+ q && /* @__PURE__ */ g(S, {
201
+ onClick: et,
202
+ disabled: H || U,
203
+ children: [/* @__PURE__ */ h(l, {
204
+ size: 16,
205
+ className: "mr-2"
206
+ }), H || U ? n(k, "projectDetail.processing", "Processing...") : I.archived ? n(k, "projectDetail.unarchive", "Unarchive") : n(k, "projectDetail.archive", "Archive")]
207
+ }),
208
+ q && K && /* @__PURE__ */ h(C, {}),
209
+ K && /* @__PURE__ */ h(S, {
210
+ onClick: () => L(!0),
202
211
  className: "text-status-error-text",
203
- children: n(M, "projectDetail.deleteProject", "Delete Project")
212
+ children: n(k, "projectDetail.deleteProject", "Delete Project")
204
213
  })
205
214
  ]
206
215
  })] })
207
216
  })]
208
217
  }),
209
- /* @__PURE__ */ g(A, { children: n(M, "projectDetail.purpose", "This is a single project — a focused stream of work within its workspace. From here you can manage the people working on it, organise it with tags so it surfaces in filters and reports, and keep track of related activity. Use the menu in the top-right to archive or delete it when it wraps up.") }),
210
- /* @__PURE__ */ g(Te, {
218
+ /* @__PURE__ */ h(je, { children: n(k, "projectDetail.purpose", "This is a single project — a focused stream of work within its workspace. From here you can manage the people working on it, organise it with tags so it surfaces in filters and reports, and keep track of related activity. Use the menu in the top-right to archive or delete it when it wraps up.") }),
219
+ /* @__PURE__ */ h(Ae, {
211
220
  storageKey: "workspaces-project-detail",
212
221
  steps: [
213
222
  ...Y ? [{
214
223
  id: "add-member",
215
- label: n(M, "projectDetail.stepAddMember", "Add people to the project"),
216
- description: n(M, "projectDetail.stepAddMemberDesc", "Pull in the teammates who will actually work on this project."),
217
- icon: /* @__PURE__ */ g(m, { size: 16 }),
218
- onClick: () => H(!0)
224
+ label: n(k, "projectDetail.stepAddMember", "Add people to the project"),
225
+ description: n(k, "projectDetail.stepAddMemberDesc", "Pull in the teammates who will actually work on this project."),
226
+ icon: /* @__PURE__ */ h(p, { size: 16 }),
227
+ onClick: () => z(!0)
219
228
  }] : [],
220
229
  {
221
230
  id: "tag-project",
222
- label: n(M, "projectDetail.stepTag", "Tag the project"),
223
- description: n(M, "projectDetail.stepTagDesc", "Add tags so this project shows up in the right filters and views."),
224
- icon: /* @__PURE__ */ g(p, { size: 16 }),
231
+ label: n(k, "projectDetail.stepTag", "Tag the project"),
232
+ description: n(k, "projectDetail.stepTagDesc", "Add tags so this project shows up in the right filters and views."),
233
+ icon: /* @__PURE__ */ h(f, { size: 16 }),
225
234
  onClick: () => {
226
235
  document.getElementById("project-tags-section")?.scrollIntoView({
227
236
  behavior: "smooth",
@@ -231,231 +240,231 @@ function M() {
231
240
  },
232
241
  ...J ? [{
233
242
  id: "manage-members",
234
- label: n(M, "projectDetail.stepManageMembers", "Review project members"),
235
- description: n(M, "projectDetail.stepManageMembersDesc", "See who has access and adjust their project roles."),
236
- icon: /* @__PURE__ */ g(h, { size: 16 }),
243
+ label: n(k, "projectDetail.stepManageMembers", "Review project members"),
244
+ description: n(k, "projectDetail.stepManageMembersDesc", "See who has access and adjust their project roles."),
245
+ icon: /* @__PURE__ */ h(m, { size: 16 }),
237
246
  onClick: Q
238
247
  }] : [],
239
248
  {
240
249
  id: "review-activity",
241
- label: n(M, "projectDetail.stepActivity", "Check recent activity"),
242
- description: n(M, "projectDetail.stepActivityDesc", "Catch up on what has changed across the workspace."),
243
- icon: /* @__PURE__ */ g(l, { size: 16 }),
244
- onClick: () => I(R(`${L}/${P}/activity`))
250
+ label: n(k, "projectDetail.stepActivity", "Check recent activity"),
251
+ description: n(k, "projectDetail.stepActivityDesc", "Catch up on what has changed across the workspace."),
252
+ icon: /* @__PURE__ */ h(c, { size: 16 }),
253
+ onClick: () => N(F(`${P}/${j}/activity`))
245
254
  }
246
255
  ]
247
256
  }),
248
- /* @__PURE__ */ _("div", {
257
+ /* @__PURE__ */ g("div", {
249
258
  className: "grid grid-cols-1 lg:grid-cols-3 gap-4 sm:gap-6",
250
- children: [/* @__PURE__ */ _("div", {
259
+ children: [/* @__PURE__ */ g("div", {
251
260
  className: "lg:col-span-2 space-y-4 sm:space-y-6",
252
- children: [/* @__PURE__ */ _("div", {
261
+ children: [/* @__PURE__ */ g("div", {
253
262
  className: "grid grid-cols-1 md:grid-cols-2 gap-4",
254
- children: [/* @__PURE__ */ _(O, {
263
+ children: [/* @__PURE__ */ g(E, {
255
264
  treatment: "metric",
256
265
  glow: !0,
257
- children: [/* @__PURE__ */ g(x, {
266
+ children: [/* @__PURE__ */ h(b, {
258
267
  className: "flex flex-row items-center justify-between pb-2",
259
- children: /* @__PURE__ */ _(S, {
268
+ children: /* @__PURE__ */ g(x, {
260
269
  className: "flex items-center gap-2 text-sm font-medium text-text-secondary",
261
- children: [/* @__PURE__ */ g(h, {
270
+ children: [/* @__PURE__ */ h(m, {
262
271
  size: 18,
263
272
  className: "text-text-muted"
264
- }), n(M, "projectDetail.membersCardTitle", "Members")]
273
+ }), n(k, "projectDetail.membersCardTitle", "Members")]
265
274
  })
266
- }), /* @__PURE__ */ _(b, {
275
+ }), /* @__PURE__ */ g(y, {
267
276
  className: "space-y-4",
268
277
  children: [
269
- /* @__PURE__ */ g("p", {
278
+ /* @__PURE__ */ h("p", {
270
279
  className: "text-3xl font-bold tabular-nums",
271
- children: Ge ?? 0
280
+ children: Xe ?? 0
272
281
  }),
273
- /* @__PURE__ */ g("p", {
282
+ /* @__PURE__ */ h("p", {
274
283
  className: "text-sm text-text-muted",
275
- children: n(M, "projectDetail.projectMembers", "Project members")
284
+ children: n(k, "projectDetail.projectMembers", "Project members")
276
285
  }),
277
- Y || J ? /* @__PURE__ */ _("div", {
286
+ Y || J ? /* @__PURE__ */ g("div", {
278
287
  className: "flex flex-wrap gap-2",
279
- children: [Y ? /* @__PURE__ */ _(y, {
288
+ children: [Y ? /* @__PURE__ */ g(v, {
280
289
  size: "sm",
281
- onClick: () => H(!0),
282
- children: [/* @__PURE__ */ g(m, {
290
+ onClick: () => z(!0),
291
+ children: [/* @__PURE__ */ h(p, {
283
292
  size: 16,
284
293
  className: "mr-2"
285
- }), n(M, "projectDetail.addProjectMember", "Add Member")]
286
- }) : null, J ? /* @__PURE__ */ _(y, {
294
+ }), n(k, "projectDetail.addProjectMember", "Add Member")]
295
+ }) : null, J ? /* @__PURE__ */ g(v, {
287
296
  variant: "outline",
288
297
  size: "sm",
289
298
  onClick: Q,
290
- children: [/* @__PURE__ */ g(h, {
299
+ children: [/* @__PURE__ */ h(m, {
291
300
  size: 16,
292
301
  className: "mr-2"
293
- }), n(M, "projectDetail.manageProjectMembers", "Manage Members")]
302
+ }), n(k, "projectDetail.manageProjectMembers", "Manage Members")]
294
303
  }) : null]
295
304
  }) : null
296
305
  ]
297
306
  })]
298
- }), /* @__PURE__ */ _(O, {
307
+ }), /* @__PURE__ */ g(E, {
299
308
  treatment: "metric",
300
- children: [/* @__PURE__ */ g(x, {
309
+ children: [/* @__PURE__ */ h(b, {
301
310
  className: "flex flex-row items-center justify-between pb-2",
302
- children: /* @__PURE__ */ _(S, {
311
+ children: /* @__PURE__ */ g(x, {
303
312
  className: "flex items-center gap-2 text-sm font-medium text-text-secondary",
304
- children: [/* @__PURE__ */ g(l, {
313
+ children: [/* @__PURE__ */ h(c, {
305
314
  size: 18,
306
315
  className: "text-text-muted"
307
- }), n(M, "projectDetail.activityCardTitle", "Activity")]
316
+ }), n(k, "projectDetail.activityCardTitle", "Activity")]
308
317
  })
309
- }), /* @__PURE__ */ _(b, { children: [/* @__PURE__ */ g("p", {
318
+ }), /* @__PURE__ */ g(y, { children: [/* @__PURE__ */ h("p", {
310
319
  className: "text-3xl font-bold tabular-nums",
311
- children: qe
312
- }), /* @__PURE__ */ g("p", {
320
+ children: Qe
321
+ }), /* @__PURE__ */ h("p", {
313
322
  className: "text-sm text-text-muted",
314
- children: n(M, "projectDetail.recentActivityItems", "Recent activity items")
323
+ children: n(k, "projectDetail.recentActivityItems", "Recent activity items")
315
324
  })] })]
316
325
  })]
317
- }), /* @__PURE__ */ _(O, {
326
+ }), /* @__PURE__ */ g(E, {
318
327
  treatment: "plain",
319
328
  id: "project-tags-section",
320
329
  className: "border-border-seam",
321
- children: [/* @__PURE__ */ g(x, { children: /* @__PURE__ */ g(S, { children: n(M, "projectDetail.tagsTitle", "Tags") }) }), /* @__PURE__ */ _(b, {
330
+ children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ h(x, { children: n(k, "projectDetail.tagsTitle", "Tags") }) }), /* @__PURE__ */ g(y, {
322
331
  className: "space-y-3",
323
- children: [/* @__PURE__ */ g("p", {
332
+ children: [/* @__PURE__ */ h("p", {
324
333
  className: "text-sm text-text-muted",
325
- children: n(M, "projectDetail.tagsDescription", "Use universal tags to classify and filter this project across the workspace.")
326
- }), /* @__PURE__ */ g(me, {
334
+ children: n(k, "projectDetail.tagsDescription", "Use universal tags to classify and filter this project across the workspace.")
335
+ }), /* @__PURE__ */ h(he, {
327
336
  entityType: "Project",
328
- entityId: z.id,
329
- workspaceId: P,
330
- tags: Je,
331
- onAdd: Ze,
332
- onRemove: Qe,
333
- className: Re || Be || He ? "pointer-events-none opacity-75" : void 0
337
+ entityId: I.id,
338
+ workspaceId: j,
339
+ tags: $e,
340
+ onAdd: nt,
341
+ onRemove: rt,
342
+ className: Ue || Ge || qe ? "pointer-events-none opacity-75" : void 0
334
343
  })]
335
344
  })]
336
345
  })]
337
- }), /* @__PURE__ */ g("aside", {
346
+ }), /* @__PURE__ */ h("aside", {
338
347
  className: "lg:sticky lg:top-6 lg:self-start",
339
- children: /* @__PURE__ */ _(O, {
348
+ children: /* @__PURE__ */ g(E, {
340
349
  treatment: "plain",
341
350
  className: "border-border-seam",
342
- children: [/* @__PURE__ */ g(x, { children: /* @__PURE__ */ g(S, { children: n(M, "projectDetail.projectInformation", "Project Information") }) }), /* @__PURE__ */ _(b, {
351
+ children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ h(x, { children: n(k, "projectDetail.projectInformation", "Project Information") }) }), /* @__PURE__ */ g(y, {
343
352
  className: "space-y-4",
344
353
  children: [
345
- /* @__PURE__ */ _("div", {
354
+ /* @__PURE__ */ g("div", {
346
355
  className: "grid grid-cols-1 gap-4 text-sm",
347
356
  children: [
348
- /* @__PURE__ */ _("div", {
357
+ /* @__PURE__ */ g("div", {
349
358
  className: "space-y-1",
350
- children: [/* @__PURE__ */ _("span", {
359
+ children: [/* @__PURE__ */ g("span", {
351
360
  className: "text-text-muted flex items-center gap-2",
352
- children: [/* @__PURE__ */ g(p, { size: 14 }), n(M, "projectDetail.projectId", "Project ID")]
353
- }), /* @__PURE__ */ g("button", {
361
+ children: [/* @__PURE__ */ h(f, { size: 14 }), n(k, "projectDetail.projectId", "Project ID")]
362
+ }), /* @__PURE__ */ h("button", {
354
363
  type: "button",
355
- onClick: () => N.show({
356
- id: z.id,
357
- name: z.name,
364
+ onClick: () => A.show({
365
+ id: I.id,
366
+ name: I.name,
358
367
  type: "Project",
359
- details: z.key ? [{
368
+ details: I.key ? [{
360
369
  label: "Key",
361
- value: z.key
370
+ value: I.key
362
371
  }] : void 0
363
372
  }),
364
373
  className: "inline-flex items-center gap-1.5 text-xs font-medium text-text-link hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] rounded",
365
- children: n(M, "projectDetail.getId", "Get ID")
374
+ children: n(k, "projectDetail.getId", "Get ID")
366
375
  })]
367
376
  }),
368
- /* @__PURE__ */ _("div", {
377
+ /* @__PURE__ */ g("div", {
369
378
  className: "space-y-1",
370
- children: [/* @__PURE__ */ _("span", {
379
+ children: [/* @__PURE__ */ g("span", {
371
380
  className: "text-text-secondary flex items-center gap-2",
372
- children: [/* @__PURE__ */ g(p, { size: 14 }), n(M, "projectDetail.projectKey", "Project Key")]
373
- }), /* @__PURE__ */ g("span", {
381
+ children: [/* @__PURE__ */ h(f, { size: 14 }), n(k, "projectDetail.projectKey", "Project Key")]
382
+ }), /* @__PURE__ */ h("span", {
374
383
  className: "font-medium",
375
- children: z.key
384
+ children: I.key
376
385
  })]
377
386
  }),
378
- /* @__PURE__ */ _("div", {
387
+ /* @__PURE__ */ g("div", {
379
388
  className: "space-y-1",
380
- children: [/* @__PURE__ */ _("span", {
389
+ children: [/* @__PURE__ */ g("span", {
381
390
  className: "text-text-secondary flex items-center gap-2",
382
- children: [/* @__PURE__ */ g(f, { size: 14 }), n(M, "projectDetail.created", "Created")]
383
- }), /* @__PURE__ */ g("span", { children: i(z.createdAt) })]
391
+ children: [/* @__PURE__ */ h(d, { size: 14 }), n(k, "projectDetail.created", "Created")]
392
+ }), /* @__PURE__ */ h("span", { children: i(I.createdAt) })]
384
393
  }),
385
- /* @__PURE__ */ _("div", {
394
+ /* @__PURE__ */ g("div", {
386
395
  className: "space-y-1",
387
- children: [/* @__PURE__ */ _("span", {
396
+ children: [/* @__PURE__ */ g("span", {
388
397
  className: "text-text-secondary flex items-center gap-2",
389
- children: [/* @__PURE__ */ g(f, { size: 14 }), n(M, "projectDetail.lastUpdated", "Last Updated")]
390
- }), /* @__PURE__ */ g("span", { children: i(z.updatedAt) })]
398
+ children: [/* @__PURE__ */ h(d, { size: 14 }), n(k, "projectDetail.lastUpdated", "Last Updated")]
399
+ }), /* @__PURE__ */ h("span", { children: i(I.updatedAt) })]
391
400
  }),
392
- /* @__PURE__ */ _("div", {
401
+ /* @__PURE__ */ g("div", {
393
402
  className: "space-y-1",
394
- children: [/* @__PURE__ */ _("span", {
403
+ children: [/* @__PURE__ */ g("span", {
395
404
  className: "text-text-secondary flex items-center gap-2",
396
- children: [/* @__PURE__ */ g(h, { size: 14 }), n(M, "projectDetail.workspaceId", "Workspace ID")]
397
- }), /* @__PURE__ */ g("span", {
405
+ children: [/* @__PURE__ */ h(m, { size: 14 }), n(k, "projectDetail.workspaceId", "Workspace ID")]
406
+ }), /* @__PURE__ */ h("span", {
398
407
  className: "font-mono text-xs block",
399
- children: z.workspaceId
408
+ children: I.workspaceId
400
409
  })]
401
410
  }),
402
- /* @__PURE__ */ _("div", {
411
+ /* @__PURE__ */ g("div", {
403
412
  className: "space-y-1",
404
- children: [/* @__PURE__ */ _("span", {
413
+ children: [/* @__PURE__ */ g("span", {
405
414
  className: "text-text-secondary flex items-center gap-2",
406
- children: [/* @__PURE__ */ g(h, { size: 14 }), n(M, "projectDetail.creatorId", "Creator ID")]
407
- }), /* @__PURE__ */ g("span", {
415
+ children: [/* @__PURE__ */ h(m, { size: 14 }), n(k, "projectDetail.creatorId", "Creator ID")]
416
+ }), /* @__PURE__ */ h("span", {
408
417
  className: "font-mono text-xs block",
409
- children: z.creatorId
418
+ children: I.creatorId
410
419
  })]
411
420
  })
412
421
  ]
413
422
  }),
414
- z.config && Object.keys(z.config).length > 0 && /* @__PURE__ */ _("div", {
423
+ I.config && Object.keys(I.config).length > 0 && /* @__PURE__ */ g("div", {
415
424
  className: "pt-4 border-t border-border-seam",
416
- children: [/* @__PURE__ */ g("h4", {
425
+ children: [/* @__PURE__ */ h("h4", {
417
426
  className: "text-sm font-medium mb-2",
418
- children: n(M, "projectDetail.configuration", "Configuration")
419
- }), /* @__PURE__ */ g("pre", {
427
+ children: n(k, "projectDetail.configuration", "Configuration")
428
+ }), /* @__PURE__ */ h("pre", {
420
429
  className: "text-xs bg-bg-sunken p-3 rounded-lg overflow-auto",
421
- children: JSON.stringify(z.config, null, 2)
430
+ children: JSON.stringify(I.config, null, 2)
422
431
  })]
423
432
  }),
424
- /* @__PURE__ */ g(Ee, {
433
+ /* @__PURE__ */ h(Me, {
425
434
  collapsedHeight: 0,
426
- label: n(M, "projectDetail.quickActions", "Quick Actions"),
427
- children: /* @__PURE__ */ _("div", {
435
+ label: n(k, "projectDetail.quickActions", "Quick Actions"),
436
+ children: /* @__PURE__ */ g("div", {
428
437
  className: "flex flex-col gap-2 pt-2",
429
438
  children: [
430
- J ? /* @__PURE__ */ _(y, {
439
+ J ? /* @__PURE__ */ g(v, {
431
440
  variant: "outline",
432
441
  size: "sm",
433
442
  className: "justify-start",
434
443
  onClick: Q,
435
- children: [/* @__PURE__ */ g(h, {
444
+ children: [/* @__PURE__ */ h(m, {
436
445
  size: 16,
437
446
  className: "mr-2"
438
- }), n(M, "projectDetail.projectMembersPage", "Project Members")]
447
+ }), n(k, "projectDetail.projectMembersPage", "Project Members")]
439
448
  }) : null,
440
- /* @__PURE__ */ _(y, {
449
+ /* @__PURE__ */ g(v, {
441
450
  variant: "outline",
442
451
  size: "sm",
443
452
  className: "justify-start",
444
- onClick: () => I(R(`${L}/${P}/members`)),
445
- children: [/* @__PURE__ */ g(h, {
453
+ onClick: () => N(F(`${P}/${j}/members`)),
454
+ children: [/* @__PURE__ */ h(m, {
446
455
  size: 16,
447
456
  className: "mr-2"
448
- }), n(M, "projectDetail.workspaceMembers", "Workspace Members")]
457
+ }), n(k, "projectDetail.workspaceMembers", "Workspace Members")]
449
458
  }),
450
- /* @__PURE__ */ _(y, {
459
+ /* @__PURE__ */ g(v, {
451
460
  variant: "outline",
452
461
  size: "sm",
453
462
  className: "justify-start",
454
- onClick: () => I(R(`${L}/${P}/activity`)),
455
- children: [/* @__PURE__ */ g(l, {
463
+ onClick: () => N(F(`${P}/${j}/activity`)),
464
+ children: [/* @__PURE__ */ h(c, {
456
465
  size: 16,
457
466
  className: "mr-2"
458
- }), n(M, "projectDetail.workspaceActivity", "Workspace Activity")]
467
+ }), n(k, "projectDetail.workspaceActivity", "Workspace Activity")]
459
468
  })
460
469
  ]
461
470
  })
@@ -465,31 +474,40 @@ function M() {
465
474
  })
466
475
  })]
467
476
  }),
468
- /* @__PURE__ */ g(ge, {
469
- open: Ne,
470
- onOpenChange: B,
471
- children: /* @__PURE__ */ _(ye, { children: [/* @__PURE__ */ _(Se, { children: [/* @__PURE__ */ g(Ce, { children: n(M, "projectDetail.deleteDialogTitle", "Delete Project") }), /* @__PURE__ */ g(be, { children: n(M, "projectDetail.deleteConfirmPrefix", "Are you sure you want to delete \"") + z.name + n(M, "projectDetail.deleteConfirmSuffix", "\"? This action cannot be undone and all project data will be permanently removed.") })] }), /* @__PURE__ */ _(xe, { children: [/* @__PURE__ */ g(ve, {
472
- disabled: G,
473
- children: n(M, "projectDetail.cancel", "Cancel")
474
- }), /* @__PURE__ */ g(_e, {
475
- onClick: Xe,
476
- disabled: G,
477
+ /* @__PURE__ */ h(ye, {
478
+ open: Re,
479
+ onOpenChange: L,
480
+ children: /* @__PURE__ */ g(Se, { children: [/* @__PURE__ */ g(Te, { children: [/* @__PURE__ */ h(Ee, { children: n(k, "projectDetail.deleteDialogTitle", "Delete Project") }), /* @__PURE__ */ h(Ce, { children: n(k, "projectDetail.deleteConfirmPrefix", "Are you sure you want to delete \"") + I.name + n(k, "projectDetail.deleteConfirmSuffix", "\"? This action cannot be undone and all project data will be permanently removed.") })] }), /* @__PURE__ */ g(we, { children: [/* @__PURE__ */ h(xe, {
481
+ disabled: W,
482
+ children: n(k, "projectDetail.cancel", "Cancel")
483
+ }), /* @__PURE__ */ h(be, {
484
+ onClick: tt,
485
+ disabled: W,
477
486
  className: "bg-status-error-bg text-status-error-text hover:bg-status-error-bg/90",
478
- children: G ? n(M, "projectDetail.deleting", "Deleting...") : n(M, "projectDetail.deleteProject", "Delete Project")
487
+ children: W ? n(k, "projectDetail.deleting", "Deleting...") : n(k, "projectDetail.deleteProject", "Delete Project")
479
488
  })] })] })
480
489
  }),
481
- P && F && V ? /* @__PURE__ */ g(o, {
482
- open: V,
483
- onOpenChange: H,
484
- workspaceId: P,
485
- projectId: F,
486
- projectName: z.name
490
+ j && M && R ? /* @__PURE__ */ h(o, {
491
+ open: R,
492
+ onOpenChange: z,
493
+ workspaceId: j,
494
+ projectId: M,
495
+ projectName: I.name
487
496
  }) : null,
488
- /* @__PURE__ */ g(D, { control: N })
497
+ B && /* @__PURE__ */ h(pe, {
498
+ project: {
499
+ id: I.id,
500
+ name: I.name,
501
+ workspaceId: I.workspaceId
502
+ },
503
+ open: B,
504
+ onOpenChange: V
505
+ }),
506
+ /* @__PURE__ */ h(T, { control: A })
489
507
  ]
490
508
  });
491
509
  }
492
510
  //#endregion
493
- export { M as ProjectDetailPage };
511
+ export { k as ProjectDetailPage };
494
512
 
495
513
  //# sourceMappingURL=ProjectDetailPage.js.map