@burdenoff/microfe-workspaces 2026.625.4 → 2026.626.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 (35) hide show
  1. package/dist/hooks/useMemberMutations.js +6 -6
  2. package/dist/hooks/useMemberMutations.js.map +1 -1
  3. package/dist/pages/ActivityListPage.js +94 -90
  4. package/dist/pages/ActivityListPage.js.map +1 -1
  5. package/dist/pages/CreateWorkspacePage.js +68 -63
  6. package/dist/pages/CreateWorkspacePage.js.map +1 -1
  7. package/dist/pages/InviteAcceptancePage.js +101 -96
  8. package/dist/pages/InviteAcceptancePage.js.map +1 -1
  9. package/dist/pages/MembersListPage.js +185 -184
  10. package/dist/pages/MembersListPage.js.map +1 -1
  11. package/dist/pages/PendingInvitesPage.js +70 -68
  12. package/dist/pages/PendingInvitesPage.js.map +1 -1
  13. package/dist/pages/ProjectDetailPage.js +119 -78
  14. package/dist/pages/ProjectDetailPage.js.map +1 -1
  15. package/dist/pages/ProjectMembersPage.js +105 -104
  16. package/dist/pages/ProjectMembersPage.js.map +1 -1
  17. package/dist/pages/ProjectsListPage.js +158 -157
  18. package/dist/pages/ProjectsListPage.js.map +1 -1
  19. package/dist/pages/WorkspaceDetailPage.js +236 -198
  20. package/dist/pages/WorkspaceDetailPage.js.map +1 -1
  21. package/dist/pages/WorkspaceInvitePage.js +341 -300
  22. package/dist/pages/WorkspaceInvitePage.js.map +1 -1
  23. package/dist/pages/WorkspaceSettingsPage.js +87 -85
  24. package/dist/pages/WorkspaceSettingsPage.js.map +1 -1
  25. package/dist/pages/WorkspacesListPage.js +122 -121
  26. package/dist/pages/WorkspacesListPage.js.map +1 -1
  27. package/dist/pages/dashboard/DashboardPage.js +55 -51
  28. package/dist/pages/dashboard/DashboardPage.js.map +1 -1
  29. package/dist/pages/dashboard/widgets/GroupsWidget.js +16 -17
  30. package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -1
  31. package/dist/pages/dashboard/widgets/TagCloudWidget.js +18 -19
  32. package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -1
  33. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +10 -11
  34. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -1
  35. package/package.json +2 -2
@@ -9,249 +9,287 @@ import { useProjects as s } from "../hooks/useProjects.js";
9
9
  import { useWorkspaceActivity as c } from "../hooks/useWorkspaceActivity.js";
10
10
  import { Activity as l, ArrowLeft as u, ChevronRight as d, FolderKanban as f, Settings as p, UserPlus as m, Users as h } from "lucide-react";
11
11
  import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
12
- import { Badge as y, Button as b, CTAOverflowMenu as x, CardContent as S, CardHeader as C, CardTitle as w, GlassCard as T, IllustratedEmptyState as E, Skeleton as D } from "@burdenoff/fe-libs/ui";
13
- import { useNavigate as O, useParams as k } from "react-router-dom";
14
- import { useI18n as A } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
+ import { Badge as y, Button as b, CTAOverflowMenu as x, CardContent as S, CardHeader as C, CardTitle as w, GlassCard as T, IllustratedEmptyState as E, NextSteps as D, PagePurpose as O, Skeleton as k } from "@burdenoff/fe-libs/ui";
13
+ import { useNavigate as A, useParams as j } from "react-router-dom";
14
+ import { useI18n as M } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
15
15
  //#region src/pages/WorkspaceDetailPage.tsx
16
- function j() {
17
- let { workspaceId: j } = k();
16
+ function N() {
17
+ let { workspaceId: N } = j();
18
18
  i("workspaces.detail", {
19
- workspaceId: j,
19
+ workspaceId: N,
20
20
  requireParams: !0
21
21
  });
22
- let { t: M } = A(), N = O(), { basePath: P = "/" } = e(), { withCurrentSearch: F } = n(), { data: I, isLoading: L, error: R } = t(j || ""), { data: z } = s({ workspaceId: j }, { limit: 1 }, j), { data: B } = a(j || "", { limit: 1 }), { data: V } = c(j), { canViewWorkspace: H, canUpdateWorkspace: U, canInviteMember: W, isLoading: G } = o();
23
- if (G) return /* @__PURE__ */ v("div", {
22
+ let { t: P } = M(), F = A(), { basePath: I = "/" } = e(), { withCurrentSearch: L } = n(), { data: R, isLoading: z, error: B } = t(N || ""), { data: V } = s({ workspaceId: N }, { limit: 1 }, N), { data: H } = a(N || "", { limit: 1 }), { data: U } = c(N), { canViewWorkspace: W, canUpdateWorkspace: G, canInviteMember: K, isLoading: q } = o();
23
+ if (q) return /* @__PURE__ */ v("div", {
24
24
  className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
25
- children: [/* @__PURE__ */ _(D, { className: "h-10 w-1/3" }), /* @__PURE__ */ v("div", {
25
+ children: [/* @__PURE__ */ _(k, { className: "h-10 w-1/3" }), /* @__PURE__ */ v("div", {
26
26
  className: "grid grid-cols-1 md:grid-cols-3 gap-4",
27
27
  children: [
28
- /* @__PURE__ */ _(D, { className: "h-32" }),
29
- /* @__PURE__ */ _(D, { className: "h-32" }),
30
- /* @__PURE__ */ _(D, { className: "h-32" })
28
+ /* @__PURE__ */ _(k, { className: "h-32" }),
29
+ /* @__PURE__ */ _(k, { className: "h-32" }),
30
+ /* @__PURE__ */ _(k, { className: "h-32" })
31
31
  ]
32
32
  })]
33
33
  });
34
- if (!H) return /* @__PURE__ */ _("div", {
34
+ if (!W) return /* @__PURE__ */ _("div", {
35
35
  className: "flex items-center justify-center min-h-[400px]",
36
36
  children: /* @__PURE__ */ v("div", {
37
37
  className: "text-center space-y-2",
38
38
  children: [/* @__PURE__ */ _("h2", {
39
39
  className: "text-lg font-semibold",
40
- children: r(M, "workspaceDetail.accessDenied", "Access Denied")
40
+ children: r(P, "workspaceDetail.accessDenied", "Access Denied")
41
41
  }), /* @__PURE__ */ _("p", {
42
42
  className: "text-sm text-text-secondary",
43
- children: r(M, "workspaceDetail.accessDeniedDesc", "You don't have permission to view this workspace.")
43
+ children: r(P, "workspaceDetail.accessDeniedDesc", "You don't have permission to view this workspace.")
44
44
  })]
45
45
  })
46
46
  });
47
- if (L) return /* @__PURE__ */ v("div", {
47
+ if (z) return /* @__PURE__ */ v("div", {
48
48
  className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
49
- children: [/* @__PURE__ */ _(D, { className: "h-10 w-1/3" }), /* @__PURE__ */ v("div", {
49
+ children: [/* @__PURE__ */ _(k, { className: "h-10 w-1/3" }), /* @__PURE__ */ v("div", {
50
50
  className: "grid grid-cols-1 md:grid-cols-3 gap-4",
51
51
  children: [
52
- /* @__PURE__ */ _(D, { className: "h-32" }),
53
- /* @__PURE__ */ _(D, { className: "h-32" }),
54
- /* @__PURE__ */ _(D, { className: "h-32" })
52
+ /* @__PURE__ */ _(k, { className: "h-32" }),
53
+ /* @__PURE__ */ _(k, { className: "h-32" }),
54
+ /* @__PURE__ */ _(k, { className: "h-32" })
55
55
  ]
56
56
  })]
57
57
  });
58
- if (R || !I) return /* @__PURE__ */ v("div", {
58
+ if (B || !R) return /* @__PURE__ */ v("div", {
59
59
  className: "space-y-4 p-6",
60
60
  children: [/* @__PURE__ */ v(b, {
61
61
  variant: "ghost",
62
- onClick: () => N(F(`${P}/list`)),
62
+ onClick: () => F(L(`${I}/list`)),
63
63
  className: "gap-2",
64
- children: [/* @__PURE__ */ _(u, { size: 20 }), r(M, "workspaceDetail.backToWorkspaces", "Back to Workspaces")]
64
+ children: [/* @__PURE__ */ _(u, { size: 20 }), r(P, "workspaceDetail.backToWorkspaces", "Back to Workspaces")]
65
65
  }), /* @__PURE__ */ _(E, {
66
66
  illustration: "empty-search",
67
- title: r(M, "workspaceDetail.notFound", "Workspace not found"),
68
- description: r(M, "workspaceDetail.notFoundDescription", "This workspace doesn't exist or you don't have permission to view it.")
67
+ title: r(P, "workspaceDetail.notFound", "Workspace not found"),
68
+ description: r(P, "workspaceDetail.notFoundDescription", "This workspace doesn't exist or you don't have permission to view it.")
69
69
  })]
70
70
  });
71
- let K = (e, t) => {
72
- (e.key === "Enter" || e.key === " ") && (e.preventDefault(), N(t));
71
+ let J = (e, t) => {
72
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), F(t));
73
73
  };
74
74
  return /* @__PURE__ */ v("div", {
75
75
  className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
76
- children: [/* @__PURE__ */ v("div", {
77
- className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",
78
- children: [/* @__PURE__ */ v("div", { children: [
79
- /* @__PURE__ */ v(b, {
80
- variant: "ghost",
81
- onClick: () => N(F(`${P}/list`)),
82
- className: "gap-2 mb-2 -ml-2",
83
- children: [/* @__PURE__ */ _(u, { size: 20 }), r(M, "workspaceDetail.backToWorkspaces", "Back to Workspaces")]
84
- }),
85
- /* @__PURE__ */ _("h1", {
86
- className: "text-2xl sm:text-3xl font-bold",
87
- children: I.name
88
- }),
89
- /* @__PURE__ */ v("div", {
90
- className: "flex items-center gap-2 mt-2",
91
- children: [/* @__PURE__ */ _(y, {
92
- variant: "outline",
93
- children: I.type
94
- }), /* @__PURE__ */ _(y, { children: I.status })]
95
- })
96
- ] }), /* @__PURE__ */ _(x, {
97
- primary: U ? {
98
- label: r(M, "workspaceDetail.settings", "Settings"),
99
- icon: /* @__PURE__ */ _(p, { size: 18 }),
100
- onSelect: () => N(F(`${P}/${j}/settings`))
101
- } : W ? {
102
- label: r(M, "workspaceDetail.inviteMembers", "Invite Member"),
103
- icon: /* @__PURE__ */ _(m, { size: 18 }),
104
- onSelect: () => N(F(`${P}/${j}/invite`))
105
- } : void 0,
106
- actions: [...U && W ? [{
107
- label: r(M, "workspaceDetail.inviteMembers", "Invite Member"),
108
- icon: /* @__PURE__ */ _(m, { size: 16 }),
109
- onSelect: () => N(F(`${P}/${j}/invite`))
110
- }] : []]
111
- })]
112
- }), /* @__PURE__ */ v("div", {
113
- className: "grid grid-cols-1 lg:grid-cols-3 gap-4 sm:gap-6",
114
- children: [/* @__PURE__ */ _("div", {
115
- className: "lg:col-span-2 space-y-4 sm:space-y-6",
116
- children: /* @__PURE__ */ v("div", {
117
- className: "grid grid-cols-1 sm:grid-cols-3 gap-4",
118
- children: [
119
- /* @__PURE__ */ v(T, {
120
- treatment: "metric",
121
- className: "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50",
122
- onClick: () => N(F(`${P}/${j}/projects`)),
123
- role: "button",
124
- tabIndex: 0,
125
- onKeyDown: (e) => K(e, F(`${P}/${j}/projects`)),
126
- children: [/* @__PURE__ */ v(C, {
127
- className: "flex flex-row items-center justify-between pb-2",
128
- children: [/* @__PURE__ */ v(w, {
129
- className: "flex items-center gap-2 text-text-secondary text-sm font-medium",
130
- children: [/* @__PURE__ */ _(f, {
76
+ children: [
77
+ /* @__PURE__ */ v("div", {
78
+ className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",
79
+ children: [/* @__PURE__ */ v("div", { children: [
80
+ /* @__PURE__ */ v(b, {
81
+ variant: "ghost",
82
+ onClick: () => F(L(`${I}/list`)),
83
+ className: "gap-2 mb-2 -ml-2",
84
+ children: [/* @__PURE__ */ _(u, { size: 20 }), r(P, "workspaceDetail.backToWorkspaces", "Back to Workspaces")]
85
+ }),
86
+ /* @__PURE__ */ _("h1", {
87
+ className: "text-2xl sm:text-3xl font-bold",
88
+ children: R.name
89
+ }),
90
+ /* @__PURE__ */ v("div", {
91
+ className: "flex items-center gap-2 mt-2",
92
+ children: [/* @__PURE__ */ _(y, {
93
+ variant: "outline",
94
+ children: R.type
95
+ }), /* @__PURE__ */ _(y, { children: R.status })]
96
+ })
97
+ ] }), /* @__PURE__ */ _(x, {
98
+ primary: G ? {
99
+ label: r(P, "workspaceDetail.settings", "Settings"),
100
+ icon: /* @__PURE__ */ _(p, { size: 18 }),
101
+ onSelect: () => F(L(`${I}/${N}/settings`))
102
+ } : K ? {
103
+ label: r(P, "workspaceDetail.inviteMembers", "Invite Member"),
104
+ icon: /* @__PURE__ */ _(m, { size: 18 }),
105
+ onSelect: () => F(L(`${I}/${N}/invite`))
106
+ } : void 0,
107
+ actions: [...G && K ? [{
108
+ label: r(P, "workspaceDetail.inviteMembers", "Invite Member"),
109
+ icon: /* @__PURE__ */ _(m, { size: 16 }),
110
+ onSelect: () => F(L(`${I}/${N}/invite`))
111
+ }] : []]
112
+ })]
113
+ }),
114
+ /* @__PURE__ */ _(O, { children: r(P, "workspaceDetail.purpose", "This is the home for a single workspace — the hub that ties together its projects, the people who collaborate in it, and everything that happens inside. Use the cards below to jump into work, manage who has access, or review recent activity.") }),
115
+ /* @__PURE__ */ _(D, {
116
+ storageKey: "workspaces-workspace-detail",
117
+ steps: [
118
+ {
119
+ id: "open-projects",
120
+ label: r(P, "workspaceDetail.stepProjects", "Open the projects board"),
121
+ description: r(P, "workspaceDetail.stepProjectsDesc", "Projects are where the actual work lives — start or pick one up."),
122
+ icon: /* @__PURE__ */ _(f, { size: 16 }),
123
+ onClick: () => F(L(`${I}/${N}/projects`))
124
+ },
125
+ ...K ? [{
126
+ id: "invite-member",
127
+ label: r(P, "workspaceDetail.stepInvite", "Invite a teammate"),
128
+ description: r(P, "workspaceDetail.stepInviteDesc", "Bring people into this workspace so they can collaborate."),
129
+ icon: /* @__PURE__ */ _(m, { size: 16 }),
130
+ onClick: () => F(L(`${I}/${N}/invite`))
131
+ }] : [],
132
+ {
133
+ id: "review-members",
134
+ label: r(P, "workspaceDetail.stepMembers", "Review who has access"),
135
+ description: r(P, "workspaceDetail.stepMembersDesc", "Check the current members and their roles."),
136
+ icon: /* @__PURE__ */ _(h, { size: 16 }),
137
+ onClick: () => F(L(`${I}/${N}/members`))
138
+ },
139
+ ...G ? [{
140
+ id: "configure-settings",
141
+ label: r(P, "workspaceDetail.stepSettings", "Configure workspace settings"),
142
+ description: r(P, "workspaceDetail.stepSettingsDesc", "Set the name, domain and contact details for this workspace."),
143
+ icon: /* @__PURE__ */ _(p, { size: 16 }),
144
+ onClick: () => F(L(`${I}/${N}/settings`))
145
+ }] : []
146
+ ]
147
+ }),
148
+ /* @__PURE__ */ v("div", {
149
+ className: "grid grid-cols-1 lg:grid-cols-3 gap-4 sm:gap-6",
150
+ children: [/* @__PURE__ */ _("div", {
151
+ className: "lg:col-span-2 space-y-4 sm:space-y-6",
152
+ children: /* @__PURE__ */ v("div", {
153
+ className: "grid grid-cols-1 sm:grid-cols-3 gap-4",
154
+ children: [
155
+ /* @__PURE__ */ v(T, {
156
+ treatment: "metric",
157
+ glow: !0,
158
+ className: "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50",
159
+ onClick: () => F(L(`${I}/${N}/projects`)),
160
+ role: "button",
161
+ tabIndex: 0,
162
+ onKeyDown: (e) => J(e, L(`${I}/${N}/projects`)),
163
+ children: [/* @__PURE__ */ v(C, {
164
+ className: "flex flex-row items-center justify-between pb-2",
165
+ children: [/* @__PURE__ */ v(w, {
166
+ className: "flex items-center gap-2 text-text-secondary text-sm font-medium",
167
+ children: [/* @__PURE__ */ _(f, {
168
+ size: 18,
169
+ className: "text-text-muted"
170
+ }), r(P, "workspaceDetail.projects", "Projects")]
171
+ }), /* @__PURE__ */ _(d, {
131
172
  size: 18,
132
173
  className: "text-text-muted"
133
- }), r(M, "workspaceDetail.projects", "Projects")]
134
- }), /* @__PURE__ */ _(d, {
135
- size: 18,
136
- className: "text-text-muted"
137
- })]
138
- }), /* @__PURE__ */ v(S, { children: [/* @__PURE__ */ _("p", {
139
- className: "text-3xl font-bold tabular-nums",
140
- children: z?.total ?? I.projectCount ?? 0
141
- }), /* @__PURE__ */ _("p", {
142
- className: "text-sm text-text-muted",
143
- children: r(M, "workspaceDetail.projectsDesc", "Projects in this workspace")
144
- })] })]
145
- }),
146
- /* @__PURE__ */ v(T, {
147
- treatment: "metric",
148
- className: "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50",
149
- onClick: () => N(F(`${P}/${j}/members`)),
150
- role: "button",
151
- tabIndex: 0,
152
- onKeyDown: (e) => K(e, F(`${P}/${j}/members`)),
153
- children: [/* @__PURE__ */ v(C, {
154
- className: "flex flex-row items-center justify-between pb-2",
155
- children: [/* @__PURE__ */ v(w, {
156
- className: "flex items-center gap-2 text-text-secondary text-sm font-medium",
157
- children: [/* @__PURE__ */ _(h, {
174
+ })]
175
+ }), /* @__PURE__ */ v(S, { children: [/* @__PURE__ */ _("p", {
176
+ className: "text-3xl font-bold tabular-nums",
177
+ children: V?.total ?? R.projectCount ?? 0
178
+ }), /* @__PURE__ */ _("p", {
179
+ className: "text-sm text-text-muted",
180
+ children: r(P, "workspaceDetail.projectsDesc", "Projects in this workspace")
181
+ })] })]
182
+ }),
183
+ /* @__PURE__ */ v(T, {
184
+ treatment: "metric",
185
+ className: "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50",
186
+ onClick: () => F(L(`${I}/${N}/members`)),
187
+ role: "button",
188
+ tabIndex: 0,
189
+ onKeyDown: (e) => J(e, L(`${I}/${N}/members`)),
190
+ children: [/* @__PURE__ */ v(C, {
191
+ className: "flex flex-row items-center justify-between pb-2",
192
+ children: [/* @__PURE__ */ v(w, {
193
+ className: "flex items-center gap-2 text-text-secondary text-sm font-medium",
194
+ children: [/* @__PURE__ */ _(h, {
195
+ size: 18,
196
+ className: "text-text-muted"
197
+ }), r(P, "workspaceDetail.members", "Members")]
198
+ }), /* @__PURE__ */ _(d, {
158
199
  size: 18,
159
200
  className: "text-text-muted"
160
- }), r(M, "workspaceDetail.members", "Members")]
161
- }), /* @__PURE__ */ _(d, {
162
- size: 18,
163
- className: "text-text-muted"
164
- })]
165
- }), /* @__PURE__ */ v(S, { children: [/* @__PURE__ */ _("p", {
166
- className: "text-3xl font-bold tabular-nums",
167
- children: B?.total ?? I.memberCount ?? 0
168
- }), /* @__PURE__ */ _("p", {
169
- className: "text-sm text-text-muted",
170
- children: r(M, "workspaceDetail.membersDesc", "Workspace members")
171
- })] })]
172
- }),
173
- /* @__PURE__ */ v(T, {
174
- treatment: "metric",
175
- className: "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50",
176
- onClick: () => N(F(`${P}/${j}/activity`)),
177
- role: "button",
178
- tabIndex: 0,
179
- onKeyDown: (e) => K(e, F(`${P}/${j}/activity`)),
180
- children: [/* @__PURE__ */ v(C, {
181
- className: "flex flex-row items-center justify-between pb-2",
182
- children: [/* @__PURE__ */ v(w, {
183
- className: "flex items-center gap-2 text-text-secondary text-sm font-medium",
184
- children: [/* @__PURE__ */ _(l, {
201
+ })]
202
+ }), /* @__PURE__ */ v(S, { children: [/* @__PURE__ */ _("p", {
203
+ className: "text-3xl font-bold tabular-nums",
204
+ children: H?.total ?? R.memberCount ?? 0
205
+ }), /* @__PURE__ */ _("p", {
206
+ className: "text-sm text-text-muted",
207
+ children: r(P, "workspaceDetail.membersDesc", "Workspace members")
208
+ })] })]
209
+ }),
210
+ /* @__PURE__ */ v(T, {
211
+ treatment: "metric",
212
+ className: "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50",
213
+ onClick: () => F(L(`${I}/${N}/activity`)),
214
+ role: "button",
215
+ tabIndex: 0,
216
+ onKeyDown: (e) => J(e, L(`${I}/${N}/activity`)),
217
+ children: [/* @__PURE__ */ v(C, {
218
+ className: "flex flex-row items-center justify-between pb-2",
219
+ children: [/* @__PURE__ */ v(w, {
220
+ className: "flex items-center gap-2 text-text-secondary text-sm font-medium",
221
+ children: [/* @__PURE__ */ _(l, {
222
+ size: 18,
223
+ className: "text-text-muted"
224
+ }), r(P, "workspaceDetail.activity", "Activity")]
225
+ }), /* @__PURE__ */ _(d, {
185
226
  size: 18,
186
227
  className: "text-text-muted"
187
- }), r(M, "workspaceDetail.activity", "Activity")]
188
- }), /* @__PURE__ */ _(d, {
189
- size: 18,
190
- className: "text-text-muted"
191
- })]
192
- }), /* @__PURE__ */ v(S, { children: [/* @__PURE__ */ _("p", {
193
- className: "text-3xl font-bold tabular-nums",
194
- children: V?.length ?? 0
195
- }), /* @__PURE__ */ _("p", {
196
- className: "text-sm text-text-muted",
197
- children: r(M, "workspaceDetail.activityDesc", "Recent activity items")
198
- })] })]
199
- })
200
- ]
201
- })
202
- }), /* @__PURE__ */ _("aside", {
203
- className: "lg:sticky lg:top-6 lg:self-start",
204
- children: /* @__PURE__ */ v(T, {
205
- treatment: "plain",
206
- className: "border-border-seam",
207
- children: [/* @__PURE__ */ _(C, { children: /* @__PURE__ */ _(w, { children: r(M, "workspaceDetail.workspaceInformation", "Workspace Information") }) }), /* @__PURE__ */ _(S, {
208
- className: "space-y-2",
209
- children: /* @__PURE__ */ v("div", {
210
- className: "grid grid-cols-2 gap-2 text-sm",
211
- children: [
212
- /* @__PURE__ */ _("span", {
213
- className: "text-text-muted",
214
- children: r(M, "workspaceDetail.id", "ID:")
215
- }),
216
- /* @__PURE__ */ _("span", {
217
- className: "font-mono text-xs break-all",
218
- children: I.id
219
- }),
220
- I.domain && /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _("span", {
221
- className: "text-text-muted",
222
- children: r(M, "workspaceDetail.domain", "Domain:")
223
- }), /* @__PURE__ */ _("span", { children: I.domain })] }),
224
- I.contactEmail && /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _("span", {
225
- className: "text-text-muted",
226
- children: r(M, "workspaceDetail.contactEmail", "Contact Email:")
227
- }), /* @__PURE__ */ _("span", {
228
- className: "break-all",
229
- children: I.contactEmail
230
- })] }),
231
- I.website && /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _("span", {
232
- className: "text-text-muted",
233
- children: r(M, "workspaceDetail.website", "Website:")
234
- }), /* @__PURE__ */ _("a", {
235
- href: I.website,
236
- target: "_blank",
237
- rel: "noopener noreferrer",
238
- className: "text-primary hover:underline transition-colors duration-200 break-all",
239
- children: I.website
240
- })] }),
241
- /* @__PURE__ */ _("span", {
242
- className: "text-text-muted",
243
- children: r(M, "workspaceDetail.created", "Created:")
244
- }),
245
- /* @__PURE__ */ _("span", { children: new Date(I.createdAt).toLocaleDateString() })
246
- ]
247
- })
248
- })]
249
- })
250
- })]
251
- })]
228
+ })]
229
+ }), /* @__PURE__ */ v(S, { children: [/* @__PURE__ */ _("p", {
230
+ className: "text-3xl font-bold tabular-nums",
231
+ children: U?.length ?? 0
232
+ }), /* @__PURE__ */ _("p", {
233
+ className: "text-sm text-text-muted",
234
+ children: r(P, "workspaceDetail.activityDesc", "Recent activity items")
235
+ })] })]
236
+ })
237
+ ]
238
+ })
239
+ }), /* @__PURE__ */ _("aside", {
240
+ className: "lg:sticky lg:top-6 lg:self-start",
241
+ children: /* @__PURE__ */ v(T, {
242
+ treatment: "plain",
243
+ className: "border-border-seam",
244
+ children: [/* @__PURE__ */ _(C, { children: /* @__PURE__ */ _(w, { children: r(P, "workspaceDetail.workspaceInformation", "Workspace Information") }) }), /* @__PURE__ */ _(S, {
245
+ className: "space-y-2",
246
+ children: /* @__PURE__ */ v("div", {
247
+ className: "grid grid-cols-2 gap-2 text-sm",
248
+ children: [
249
+ /* @__PURE__ */ _("span", {
250
+ className: "text-text-muted",
251
+ children: r(P, "workspaceDetail.id", "ID:")
252
+ }),
253
+ /* @__PURE__ */ _("span", {
254
+ className: "font-mono text-xs break-all",
255
+ children: R.id
256
+ }),
257
+ R.domain && /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _("span", {
258
+ className: "text-text-muted",
259
+ children: r(P, "workspaceDetail.domain", "Domain:")
260
+ }), /* @__PURE__ */ _("span", { children: R.domain })] }),
261
+ R.contactEmail && /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _("span", {
262
+ className: "text-text-muted",
263
+ children: r(P, "workspaceDetail.contactEmail", "Contact Email:")
264
+ }), /* @__PURE__ */ _("span", {
265
+ className: "break-all",
266
+ children: R.contactEmail
267
+ })] }),
268
+ R.website && /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _("span", {
269
+ className: "text-text-muted",
270
+ children: r(P, "workspaceDetail.website", "Website:")
271
+ }), /* @__PURE__ */ _("a", {
272
+ href: R.website,
273
+ target: "_blank",
274
+ rel: "noopener noreferrer",
275
+ className: "text-primary hover:underline transition-colors duration-200 break-all",
276
+ children: R.website
277
+ })] }),
278
+ /* @__PURE__ */ _("span", {
279
+ className: "text-text-muted",
280
+ children: r(P, "workspaceDetail.created", "Created:")
281
+ }),
282
+ /* @__PURE__ */ _("span", { children: new Date(R.createdAt).toLocaleDateString() })
283
+ ]
284
+ })
285
+ })]
286
+ })
287
+ })]
288
+ })
289
+ ]
252
290
  });
253
291
  }
254
292
  //#endregion
255
- export { j as WorkspaceDetailPage };
293
+ export { N as WorkspaceDetailPage };
256
294
 
257
295
  //# sourceMappingURL=WorkspaceDetailPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceDetailPage.js","names":[],"sources":["../../src/pages/WorkspaceDetailPage.tsx"],"sourcesContent":["import { useParams, useNavigate } from 'react-router-dom';\nimport {\n Settings,\n ArrowLeft,\n FolderKanban,\n Users,\n Activity,\n ChevronRight,\n UserPlus,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n Button,\n GlassCard,\n CardHeader,\n CardTitle,\n CardContent,\n Badge,\n Skeleton,\n CTAOverflowMenu,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { useWorkspace } from '../hooks/useWorkspaces';\nimport { useProjects } from '../hooks/useProjects';\nimport { useWorkspaceMembers } from '../hooks/useWorkspaceMembers';\nimport { useWorkspaceActivity } from '../hooks/useWorkspaceActivity';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\nimport { useScopedNavigation } from '../hooks/useScopedNavigation';\nimport { useWorkspacePermissions } from '../hooks/useWorkspacePermissions';\nimport { useWorkspacesPageView } from '../hooks/useWorkspacesPageView';\n\nexport function WorkspaceDetailPage() {\n const { workspaceId } = useParams<{ workspaceId: string }>();\n useWorkspacesPageView('workspaces.detail', { workspaceId, requireParams: true });\n const { t } = useI18n();\n const navigate = useNavigate();\n const { basePath = '/' } = useWorkspacesContext();\n const { withCurrentSearch } = useScopedNavigation();\n const { data: workspace, isLoading, error } = useWorkspace(workspaceId || '');\n const { data: projects } = useProjects({ workspaceId }, { limit: 1 }, workspaceId);\n const { data: members } = useWorkspaceMembers(workspaceId || '', { limit: 1 });\n const { data: activities } = useWorkspaceActivity(workspaceId);\n const {\n canViewWorkspace,\n canUpdateWorkspace,\n canInviteMember,\n isLoading: permissionsLoading,\n } = useWorkspacePermissions();\n\n if (permissionsLoading) {\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <Skeleton className=\"h-10 w-1/3\" />\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n </div>\n </div>\n );\n }\n\n if (!canViewWorkspace) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold\">\n {tWithFallback(t, 'workspaceDetail.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n 'workspaceDetail.accessDeniedDesc',\n \"You don't have permission to view this workspace.\"\n )}\n </p>\n </div>\n </div>\n );\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <Skeleton className=\"h-10 w-1/3\" />\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n </div>\n </div>\n );\n }\n\n if (error || !workspace) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button\n variant=\"ghost\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/list`))}\n className=\"gap-2\"\n >\n <ArrowLeft size={20} />\n {tWithFallback(t, 'workspaceDetail.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title={tWithFallback(t, 'workspaceDetail.notFound', 'Workspace not found')}\n description={tWithFallback(\n t,\n 'workspaceDetail.notFoundDescription',\n \"This workspace doesn't exist or you don't have permission to view it.\"\n )}\n />\n </div>\n );\n }\n\n const handleCardKeyDown = (e: React.KeyboardEvent, path: string) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigate(path);\n }\n };\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3\">\n <div>\n <Button\n variant=\"ghost\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/list`))}\n className=\"gap-2 mb-2 -ml-2\"\n >\n <ArrowLeft size={20} />\n {tWithFallback(t, 'workspaceDetail.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">{workspace.name}</h1>\n <div className=\"flex items-center gap-2 mt-2\">\n <Badge variant=\"outline\">{workspace.type}</Badge>\n <Badge>{workspace.status}</Badge>\n </div>\n </div>\n <CTAOverflowMenu\n primary={\n canUpdateWorkspace\n ? {\n label: tWithFallback(t, 'workspaceDetail.settings', 'Settings'),\n icon: <Settings size={18} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/settings`)),\n }\n : canInviteMember\n ? {\n label: tWithFallback(t, 'workspaceDetail.inviteMembers', 'Invite Member'),\n icon: <UserPlus size={18} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/invite`)),\n }\n : undefined\n }\n actions={[\n ...(canUpdateWorkspace && canInviteMember\n ? [\n {\n label: tWithFallback(t, 'workspaceDetail.inviteMembers', 'Invite Member'),\n icon: <UserPlus size={16} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/invite`)),\n },\n ]\n : []),\n ]}\n />\n </div>\n\n {/* Main + detail rail */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-4 sm:gap-6\">\n {/* Main: stat metrics */}\n <div className=\"lg:col-span-2 space-y-4 sm:space-y-6\">\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <GlassCard\n treatment=\"metric\"\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/projects`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/projects`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <FolderKanban size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.projects', 'Projects')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">\n {projects?.total ?? workspace.projectCount ?? 0}\n </p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.projectsDesc', 'Projects in this workspace')}\n </p>\n </CardContent>\n </GlassCard>\n\n <GlassCard\n treatment=\"metric\"\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/members`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/members`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <Users size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.members', 'Members')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">\n {members?.total ?? workspace.memberCount ?? 0}\n </p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.membersDesc', 'Workspace members')}\n </p>\n </CardContent>\n </GlassCard>\n\n <GlassCard\n treatment=\"metric\"\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/activity`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/activity`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <Activity size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.activity', 'Activity')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">{activities?.length ?? 0}</p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.activityDesc', 'Recent activity items')}\n </p>\n </CardContent>\n </GlassCard>\n </div>\n </div>\n\n {/* Detail rail: workspace info */}\n <aside className=\"lg:sticky lg:top-6 lg:self-start\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <CardHeader>\n <CardTitle>\n {tWithFallback(t, 'workspaceDetail.workspaceInformation', 'Workspace Information')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"grid grid-cols-2 gap-2 text-sm\">\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.id', 'ID:')}\n </span>\n <span className=\"font-mono text-xs break-all\">{workspace.id}</span>\n\n {workspace.domain && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.domain', 'Domain:')}\n </span>\n <span>{workspace.domain}</span>\n </>\n )}\n\n {workspace.contactEmail && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.contactEmail', 'Contact Email:')}\n </span>\n <span className=\"break-all\">{workspace.contactEmail}</span>\n </>\n )}\n\n {workspace.website && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.website', 'Website:')}\n </span>\n <a\n href={workspace.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline transition-colors duration-200 break-all\"\n >\n {workspace.website}\n </a>\n </>\n )}\n\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.created', 'Created:')}\n </span>\n <span>{new Date(workspace.createdAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </GlassCard>\n </aside>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"WorkspaceDetailPage.js","names":[],"sources":["../../src/pages/WorkspaceDetailPage.tsx"],"sourcesContent":["import { useParams, useNavigate } from 'react-router-dom';\nimport {\n Settings,\n ArrowLeft,\n FolderKanban,\n Users,\n Activity,\n ChevronRight,\n UserPlus,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n Button,\n GlassCard,\n CardHeader,\n CardTitle,\n CardContent,\n Badge,\n Skeleton,\n CTAOverflowMenu,\n IllustratedEmptyState,\n PagePurpose,\n NextSteps,\n} from '@burdenoff/fe-libs/ui';\nimport { useWorkspace } from '../hooks/useWorkspaces';\nimport { useProjects } from '../hooks/useProjects';\nimport { useWorkspaceMembers } from '../hooks/useWorkspaceMembers';\nimport { useWorkspaceActivity } from '../hooks/useWorkspaceActivity';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\nimport { useScopedNavigation } from '../hooks/useScopedNavigation';\nimport { useWorkspacePermissions } from '../hooks/useWorkspacePermissions';\nimport { useWorkspacesPageView } from '../hooks/useWorkspacesPageView';\n\nexport function WorkspaceDetailPage() {\n const { workspaceId } = useParams<{ workspaceId: string }>();\n useWorkspacesPageView('workspaces.detail', { workspaceId, requireParams: true });\n const { t } = useI18n();\n const navigate = useNavigate();\n const { basePath = '/' } = useWorkspacesContext();\n const { withCurrentSearch } = useScopedNavigation();\n const { data: workspace, isLoading, error } = useWorkspace(workspaceId || '');\n const { data: projects } = useProjects({ workspaceId }, { limit: 1 }, workspaceId);\n const { data: members } = useWorkspaceMembers(workspaceId || '', { limit: 1 });\n const { data: activities } = useWorkspaceActivity(workspaceId);\n const {\n canViewWorkspace,\n canUpdateWorkspace,\n canInviteMember,\n isLoading: permissionsLoading,\n } = useWorkspacePermissions();\n\n if (permissionsLoading) {\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <Skeleton className=\"h-10 w-1/3\" />\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n </div>\n </div>\n );\n }\n\n if (!canViewWorkspace) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold\">\n {tWithFallback(t, 'workspaceDetail.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n 'workspaceDetail.accessDeniedDesc',\n \"You don't have permission to view this workspace.\"\n )}\n </p>\n </div>\n </div>\n );\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <Skeleton className=\"h-10 w-1/3\" />\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n </div>\n </div>\n );\n }\n\n if (error || !workspace) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button\n variant=\"ghost\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/list`))}\n className=\"gap-2\"\n >\n <ArrowLeft size={20} />\n {tWithFallback(t, 'workspaceDetail.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title={tWithFallback(t, 'workspaceDetail.notFound', 'Workspace not found')}\n description={tWithFallback(\n t,\n 'workspaceDetail.notFoundDescription',\n \"This workspace doesn't exist or you don't have permission to view it.\"\n )}\n />\n </div>\n );\n }\n\n const handleCardKeyDown = (e: React.KeyboardEvent, path: string) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigate(path);\n }\n };\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3\">\n <div>\n <Button\n variant=\"ghost\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/list`))}\n className=\"gap-2 mb-2 -ml-2\"\n >\n <ArrowLeft size={20} />\n {tWithFallback(t, 'workspaceDetail.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">{workspace.name}</h1>\n <div className=\"flex items-center gap-2 mt-2\">\n <Badge variant=\"outline\">{workspace.type}</Badge>\n <Badge>{workspace.status}</Badge>\n </div>\n </div>\n <CTAOverflowMenu\n primary={\n canUpdateWorkspace\n ? {\n label: tWithFallback(t, 'workspaceDetail.settings', 'Settings'),\n icon: <Settings size={18} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/settings`)),\n }\n : canInviteMember\n ? {\n label: tWithFallback(t, 'workspaceDetail.inviteMembers', 'Invite Member'),\n icon: <UserPlus size={18} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/invite`)),\n }\n : undefined\n }\n actions={[\n ...(canUpdateWorkspace && canInviteMember\n ? [\n {\n label: tWithFallback(t, 'workspaceDetail.inviteMembers', 'Invite Member'),\n icon: <UserPlus size={16} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/invite`)),\n },\n ]\n : []),\n ]}\n />\n </div>\n\n <PagePurpose>\n {tWithFallback(\n t,\n 'workspaceDetail.purpose',\n 'This is the home for a single workspace — the hub that ties together its projects, the people who collaborate in it, and everything that happens inside. Use the cards below to jump into work, manage who has access, or review recent activity.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"workspaces-workspace-detail\"\n steps={[\n {\n id: 'open-projects',\n label: tWithFallback(t, 'workspaceDetail.stepProjects', 'Open the projects board'),\n description: tWithFallback(\n t,\n 'workspaceDetail.stepProjectsDesc',\n 'Projects are where the actual work lives — start or pick one up.'\n ),\n icon: <FolderKanban size={16} />,\n onClick: () => navigate(withCurrentSearch(`${basePath}/${workspaceId}/projects`)),\n },\n ...(canInviteMember\n ? [\n {\n id: 'invite-member',\n label: tWithFallback(t, 'workspaceDetail.stepInvite', 'Invite a teammate'),\n description: tWithFallback(\n t,\n 'workspaceDetail.stepInviteDesc',\n 'Bring people into this workspace so they can collaborate.'\n ),\n icon: <UserPlus size={16} />,\n onClick: () => navigate(withCurrentSearch(`${basePath}/${workspaceId}/invite`)),\n },\n ]\n : []),\n {\n id: 'review-members',\n label: tWithFallback(t, 'workspaceDetail.stepMembers', 'Review who has access'),\n description: tWithFallback(\n t,\n 'workspaceDetail.stepMembersDesc',\n 'Check the current members and their roles.'\n ),\n icon: <Users size={16} />,\n onClick: () => navigate(withCurrentSearch(`${basePath}/${workspaceId}/members`)),\n },\n ...(canUpdateWorkspace\n ? [\n {\n id: 'configure-settings',\n label: tWithFallback(\n t,\n 'workspaceDetail.stepSettings',\n 'Configure workspace settings'\n ),\n description: tWithFallback(\n t,\n 'workspaceDetail.stepSettingsDesc',\n 'Set the name, domain and contact details for this workspace.'\n ),\n icon: <Settings size={16} />,\n onClick: () => navigate(withCurrentSearch(`${basePath}/${workspaceId}/settings`)),\n },\n ]\n : []),\n ]}\n />\n\n {/* Main + detail rail */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-4 sm:gap-6\">\n {/* Main: stat metrics */}\n <div className=\"lg:col-span-2 space-y-4 sm:space-y-6\">\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <GlassCard\n treatment=\"metric\"\n glow\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/projects`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/projects`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <FolderKanban size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.projects', 'Projects')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">\n {projects?.total ?? workspace.projectCount ?? 0}\n </p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.projectsDesc', 'Projects in this workspace')}\n </p>\n </CardContent>\n </GlassCard>\n\n <GlassCard\n treatment=\"metric\"\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/members`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/members`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <Users size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.members', 'Members')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">\n {members?.total ?? workspace.memberCount ?? 0}\n </p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.membersDesc', 'Workspace members')}\n </p>\n </CardContent>\n </GlassCard>\n\n <GlassCard\n treatment=\"metric\"\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/activity`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/activity`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <Activity size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.activity', 'Activity')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">{activities?.length ?? 0}</p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.activityDesc', 'Recent activity items')}\n </p>\n </CardContent>\n </GlassCard>\n </div>\n </div>\n\n {/* Detail rail: workspace info */}\n <aside className=\"lg:sticky lg:top-6 lg:self-start\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <CardHeader>\n <CardTitle>\n {tWithFallback(t, 'workspaceDetail.workspaceInformation', 'Workspace Information')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"grid grid-cols-2 gap-2 text-sm\">\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.id', 'ID:')}\n </span>\n <span className=\"font-mono text-xs break-all\">{workspace.id}</span>\n\n {workspace.domain && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.domain', 'Domain:')}\n </span>\n <span>{workspace.domain}</span>\n </>\n )}\n\n {workspace.contactEmail && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.contactEmail', 'Contact Email:')}\n </span>\n <span className=\"break-all\">{workspace.contactEmail}</span>\n </>\n )}\n\n {workspace.website && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.website', 'Website:')}\n </span>\n <a\n href={workspace.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline transition-colors duration-200 break-all\"\n >\n {workspace.website}\n </a>\n </>\n )}\n\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.created', 'Created:')}\n </span>\n <span>{new Date(workspace.createdAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </GlassCard>\n </aside>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}