@burdenoff/microfe-workspaces 2026.510.50

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 (260) hide show
  1. package/README.md +88 -0
  2. package/dist/WorkspacesRoot.d.ts +35 -0
  3. package/dist/WorkspacesRoot.d.ts.map +1 -0
  4. package/dist/WorkspacesRoot.js +71 -0
  5. package/dist/WorkspacesRoot.js.map +1 -0
  6. package/dist/WorkspacesRoutes.d.ts +10 -0
  7. package/dist/WorkspacesRoutes.d.ts.map +1 -0
  8. package/dist/WorkspacesRoutes.js +111 -0
  9. package/dist/WorkspacesRoutes.js.map +1 -0
  10. package/dist/components/CreateProjectDialog.d.ts +6 -0
  11. package/dist/components/CreateProjectDialog.d.ts.map +1 -0
  12. package/dist/components/CreateProjectDialog.js +115 -0
  13. package/dist/components/CreateProjectDialog.js.map +1 -0
  14. package/dist/components/CreateWorkspaceDialog.d.ts +2 -0
  15. package/dist/components/CreateWorkspaceDialog.d.ts.map +1 -0
  16. package/dist/components/CreateWorkspaceDialog.js +172 -0
  17. package/dist/components/CreateWorkspaceDialog.js.map +1 -0
  18. package/dist/components/InviteMemberDialog.d.ts +7 -0
  19. package/dist/components/InviteMemberDialog.d.ts.map +1 -0
  20. package/dist/components/InviteMemberDialog.js +148 -0
  21. package/dist/components/InviteMemberDialog.js.map +1 -0
  22. package/dist/components/MemberListItem.d.ts +11 -0
  23. package/dist/components/MemberListItem.d.ts.map +1 -0
  24. package/dist/components/MemberListItem.js +118 -0
  25. package/dist/components/MemberListItem.js.map +1 -0
  26. package/dist/components/ProjectCard.d.ts +13 -0
  27. package/dist/components/ProjectCard.d.ts.map +1 -0
  28. package/dist/components/ProjectCard.js +150 -0
  29. package/dist/components/ProjectCard.js.map +1 -0
  30. package/dist/components/WorkspaceCard.d.ts +8 -0
  31. package/dist/components/WorkspaceCard.d.ts.map +1 -0
  32. package/dist/components/WorkspaceCard.js +79 -0
  33. package/dist/components/WorkspaceCard.js.map +1 -0
  34. package/dist/components/WorkspacesErrorBoundary.d.ts +27 -0
  35. package/dist/components/WorkspacesErrorBoundary.d.ts.map +1 -0
  36. package/dist/components/WorkspacesErrorBoundary.js +136 -0
  37. package/dist/components/WorkspacesErrorBoundary.js.map +1 -0
  38. package/dist/components/index.d.ts +8 -0
  39. package/dist/components/index.d.ts.map +1 -0
  40. package/dist/components/index.js +7 -0
  41. package/dist/constants/permissions.d.ts +33 -0
  42. package/dist/constants/permissions.d.ts.map +1 -0
  43. package/dist/constants/permissions.js +31 -0
  44. package/dist/constants/permissions.js.map +1 -0
  45. package/dist/generated/global-operations.d.ts +279 -0
  46. package/dist/generated/global-operations.d.ts.map +1 -0
  47. package/dist/generated/global-operations.js +103 -0
  48. package/dist/generated/global-operations.js.map +1 -0
  49. package/dist/generated/global-types.d.ts +20714 -0
  50. package/dist/generated/global-types.d.ts.map +1 -0
  51. package/dist/generated/wspace-operations.d.ts +2209 -0
  52. package/dist/generated/wspace-operations.d.ts.map +1 -0
  53. package/dist/generated/wspace-operations.js +576 -0
  54. package/dist/generated/wspace-operations.js.map +1 -0
  55. package/dist/generated/wspace-types.d.ts +54990 -0
  56. package/dist/generated/wspace-types.d.ts.map +1 -0
  57. package/dist/hooks/index.d.ts +8 -0
  58. package/dist/hooks/index.d.ts.map +1 -0
  59. package/dist/hooks/index.js +7 -0
  60. package/dist/hooks/useMemberMutations.d.ts +61 -0
  61. package/dist/hooks/useMemberMutations.d.ts.map +1 -0
  62. package/dist/hooks/useMemberMutations.js +263 -0
  63. package/dist/hooks/useMemberMutations.js.map +1 -0
  64. package/dist/hooks/useProjectMutations.d.ts +26 -0
  65. package/dist/hooks/useProjectMutations.d.ts.map +1 -0
  66. package/dist/hooks/useProjectMutations.js +127 -0
  67. package/dist/hooks/useProjectMutations.js.map +1 -0
  68. package/dist/hooks/useProjects.d.ts +16 -0
  69. package/dist/hooks/useProjects.d.ts.map +1 -0
  70. package/dist/hooks/useProjects.js +103 -0
  71. package/dist/hooks/useProjects.js.map +1 -0
  72. package/dist/hooks/useScopedNavigation.d.ts +4 -0
  73. package/dist/hooks/useScopedNavigation.d.ts.map +1 -0
  74. package/dist/hooks/useScopedNavigation.js +11 -0
  75. package/dist/hooks/useScopedNavigation.js.map +1 -0
  76. package/dist/hooks/useTenants.d.ts +13 -0
  77. package/dist/hooks/useTenants.d.ts.map +1 -0
  78. package/dist/hooks/useTenants.js +47 -0
  79. package/dist/hooks/useTenants.js.map +1 -0
  80. package/dist/hooks/useWorkspaceActivity.d.ts +12 -0
  81. package/dist/hooks/useWorkspaceActivity.d.ts.map +1 -0
  82. package/dist/hooks/useWorkspaceActivity.js +31 -0
  83. package/dist/hooks/useWorkspaceActivity.js.map +1 -0
  84. package/dist/hooks/useWorkspaceMembers.d.ts +24 -0
  85. package/dist/hooks/useWorkspaceMembers.d.ts.map +1 -0
  86. package/dist/hooks/useWorkspaceMembers.js +130 -0
  87. package/dist/hooks/useWorkspaceMembers.js.map +1 -0
  88. package/dist/hooks/useWorkspaceMutations.d.ts +36 -0
  89. package/dist/hooks/useWorkspaceMutations.d.ts.map +1 -0
  90. package/dist/hooks/useWorkspaceMutations.js +119 -0
  91. package/dist/hooks/useWorkspaceMutations.js.map +1 -0
  92. package/dist/hooks/useWorkspacePermissions.d.ts +29 -0
  93. package/dist/hooks/useWorkspacePermissions.d.ts.map +1 -0
  94. package/dist/hooks/useWorkspacePermissions.js +33 -0
  95. package/dist/hooks/useWorkspacePermissions.js.map +1 -0
  96. package/dist/hooks/useWorkspaceRoles.d.ts +8 -0
  97. package/dist/hooks/useWorkspaceRoles.d.ts.map +1 -0
  98. package/dist/hooks/useWorkspaceRoles.js +31 -0
  99. package/dist/hooks/useWorkspaceRoles.js.map +1 -0
  100. package/dist/hooks/useWorkspaces.d.ts +21 -0
  101. package/dist/hooks/useWorkspaces.d.ts.map +1 -0
  102. package/dist/hooks/useWorkspaces.js +75 -0
  103. package/dist/hooks/useWorkspaces.js.map +1 -0
  104. package/dist/hooks/useWorkspacesEventEmitter.d.ts +14 -0
  105. package/dist/hooks/useWorkspacesEventEmitter.d.ts.map +1 -0
  106. package/dist/hooks/useWorkspacesEventEmitter.js +14 -0
  107. package/dist/hooks/useWorkspacesEventEmitter.js.map +1 -0
  108. package/dist/index.d.ts +33 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +24 -0
  111. package/dist/pages/ActivityListPage.d.ts +2 -0
  112. package/dist/pages/ActivityListPage.d.ts.map +1 -0
  113. package/dist/pages/ActivityListPage.js +119 -0
  114. package/dist/pages/ActivityListPage.js.map +1 -0
  115. package/dist/pages/CreateWorkspacePage.d.ts +2 -0
  116. package/dist/pages/CreateWorkspacePage.d.ts.map +1 -0
  117. package/dist/pages/CreateWorkspacePage.js +264 -0
  118. package/dist/pages/CreateWorkspacePage.js.map +1 -0
  119. package/dist/pages/InviteAcceptancePage.d.ts +6 -0
  120. package/dist/pages/InviteAcceptancePage.d.ts.map +1 -0
  121. package/dist/pages/InviteAcceptancePage.js +495 -0
  122. package/dist/pages/InviteAcceptancePage.js.map +1 -0
  123. package/dist/pages/MembersListPage.d.ts +2 -0
  124. package/dist/pages/MembersListPage.d.ts.map +1 -0
  125. package/dist/pages/MembersListPage.js +420 -0
  126. package/dist/pages/MembersListPage.js.map +1 -0
  127. package/dist/pages/ProjectDetailPage.d.ts +2 -0
  128. package/dist/pages/ProjectDetailPage.d.ts.map +1 -0
  129. package/dist/pages/ProjectDetailPage.js +361 -0
  130. package/dist/pages/ProjectDetailPage.js.map +1 -0
  131. package/dist/pages/ProjectsListPage.d.ts +2 -0
  132. package/dist/pages/ProjectsListPage.d.ts.map +1 -0
  133. package/dist/pages/ProjectsListPage.js +398 -0
  134. package/dist/pages/ProjectsListPage.js.map +1 -0
  135. package/dist/pages/WorkspaceDetailPage.d.ts +2 -0
  136. package/dist/pages/WorkspaceDetailPage.d.ts.map +1 -0
  137. package/dist/pages/WorkspaceDetailPage.js +230 -0
  138. package/dist/pages/WorkspaceDetailPage.js.map +1 -0
  139. package/dist/pages/WorkspaceSettingsPage.d.ts +2 -0
  140. package/dist/pages/WorkspaceSettingsPage.d.ts.map +1 -0
  141. package/dist/pages/WorkspaceSettingsPage.js +157 -0
  142. package/dist/pages/WorkspaceSettingsPage.js.map +1 -0
  143. package/dist/pages/WorkspacesListPage.d.ts +2 -0
  144. package/dist/pages/WorkspacesListPage.d.ts.map +1 -0
  145. package/dist/pages/WorkspacesListPage.js +186 -0
  146. package/dist/pages/WorkspacesListPage.js.map +1 -0
  147. package/dist/pages/dashboard/DashboardCustomizer.d.ts +12 -0
  148. package/dist/pages/dashboard/DashboardCustomizer.d.ts.map +1 -0
  149. package/dist/pages/dashboard/DashboardCustomizer.js +136 -0
  150. package/dist/pages/dashboard/DashboardCustomizer.js.map +1 -0
  151. package/dist/pages/dashboard/DashboardGrid.d.ts +8 -0
  152. package/dist/pages/dashboard/DashboardGrid.d.ts.map +1 -0
  153. package/dist/pages/dashboard/DashboardGrid.js +58 -0
  154. package/dist/pages/dashboard/DashboardGrid.js.map +1 -0
  155. package/dist/pages/dashboard/DashboardPage.d.ts +14 -0
  156. package/dist/pages/dashboard/DashboardPage.d.ts.map +1 -0
  157. package/dist/pages/dashboard/DashboardPage.js +136 -0
  158. package/dist/pages/dashboard/DashboardPage.js.map +1 -0
  159. package/dist/pages/dashboard/WidgetWrapper.d.ts +17 -0
  160. package/dist/pages/dashboard/WidgetWrapper.d.ts.map +1 -0
  161. package/dist/pages/dashboard/WidgetWrapper.js +72 -0
  162. package/dist/pages/dashboard/WidgetWrapper.js.map +1 -0
  163. package/dist/pages/dashboard/config.d.ts +9 -0
  164. package/dist/pages/dashboard/config.d.ts.map +1 -0
  165. package/dist/pages/dashboard/config.js +214 -0
  166. package/dist/pages/dashboard/config.js.map +1 -0
  167. package/dist/pages/dashboard/hooks/useDashboardData.d.ts +9 -0
  168. package/dist/pages/dashboard/hooks/useDashboardData.d.ts.map +1 -0
  169. package/dist/pages/dashboard/hooks/useDashboardData.js +118 -0
  170. package/dist/pages/dashboard/hooks/useDashboardData.js.map +1 -0
  171. package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts +4 -0
  172. package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts.map +1 -0
  173. package/dist/pages/dashboard/hooks/useDashboardPreferences.js +32 -0
  174. package/dist/pages/dashboard/hooks/useDashboardPreferences.js.map +1 -0
  175. package/dist/pages/dashboard/types.d.ts +145 -0
  176. package/dist/pages/dashboard/types.d.ts.map +1 -0
  177. package/dist/pages/dashboard/widgets/GroupsWidget.d.ts +4 -0
  178. package/dist/pages/dashboard/widgets/GroupsWidget.d.ts.map +1 -0
  179. package/dist/pages/dashboard/widgets/GroupsWidget.js +59 -0
  180. package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -0
  181. package/dist/pages/dashboard/widgets/MembersWidget.d.ts +4 -0
  182. package/dist/pages/dashboard/widgets/MembersWidget.d.ts.map +1 -0
  183. package/dist/pages/dashboard/widgets/MembersWidget.js +65 -0
  184. package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -0
  185. package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts +4 -0
  186. package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts.map +1 -0
  187. package/dist/pages/dashboard/widgets/ProjectsWidget.js +91 -0
  188. package/dist/pages/dashboard/widgets/ProjectsWidget.js.map +1 -0
  189. package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts +4 -0
  190. package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts.map +1 -0
  191. package/dist/pages/dashboard/widgets/QuickActionsWidget.js +80 -0
  192. package/dist/pages/dashboard/widgets/QuickActionsWidget.js.map +1 -0
  193. package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts +4 -0
  194. package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts.map +1 -0
  195. package/dist/pages/dashboard/widgets/RecentActivityWidget.js +81 -0
  196. package/dist/pages/dashboard/widgets/RecentActivityWidget.js.map +1 -0
  197. package/dist/pages/dashboard/widgets/StorageWidget.d.ts +4 -0
  198. package/dist/pages/dashboard/widgets/StorageWidget.d.ts.map +1 -0
  199. package/dist/pages/dashboard/widgets/StorageWidget.js +69 -0
  200. package/dist/pages/dashboard/widgets/StorageWidget.js.map +1 -0
  201. package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts +4 -0
  202. package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts.map +1 -0
  203. package/dist/pages/dashboard/widgets/SystemHealthWidget.js +59 -0
  204. package/dist/pages/dashboard/widgets/SystemHealthWidget.js.map +1 -0
  205. package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts +4 -0
  206. package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts.map +1 -0
  207. package/dist/pages/dashboard/widgets/TagCloudWidget.js +61 -0
  208. package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -0
  209. package/dist/pages/dashboard/widgets/TipsWidget.d.ts +4 -0
  210. package/dist/pages/dashboard/widgets/TipsWidget.d.ts.map +1 -0
  211. package/dist/pages/dashboard/widgets/TipsWidget.js +67 -0
  212. package/dist/pages/dashboard/widgets/TipsWidget.js.map +1 -0
  213. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts +4 -0
  214. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts.map +1 -0
  215. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js +83 -0
  216. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js.map +1 -0
  217. package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts +4 -0
  218. package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts.map +1 -0
  219. package/dist/pages/dashboard/widgets/WelcomeWidget.js +71 -0
  220. package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -0
  221. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts +4 -0
  222. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts.map +1 -0
  223. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +97 -0
  224. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -0
  225. package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts +4 -0
  226. package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts.map +1 -0
  227. package/dist/pages/dashboard/widgets/WorkspacesWidget.js +67 -0
  228. package/dist/pages/dashboard/widgets/WorkspacesWidget.js.map +1 -0
  229. package/dist/providers/WorkspacesProvider.d.ts +13 -0
  230. package/dist/providers/WorkspacesProvider.d.ts.map +1 -0
  231. package/dist/providers/WorkspacesProvider.js +24 -0
  232. package/dist/providers/WorkspacesProvider.js.map +1 -0
  233. package/dist/store/workspacesStore.d.ts +82 -0
  234. package/dist/store/workspacesStore.d.ts.map +1 -0
  235. package/dist/store/workspacesStore.js +92 -0
  236. package/dist/store/workspacesStore.js.map +1 -0
  237. package/dist/types/index.d.ts +280 -0
  238. package/dist/types/index.d.ts.map +1 -0
  239. package/dist/utils/formatters.d.ts +60 -0
  240. package/dist/utils/formatters.d.ts.map +1 -0
  241. package/dist/utils/formatters.js +61 -0
  242. package/dist/utils/formatters.js.map +1 -0
  243. package/dist/utils/index.d.ts +3 -0
  244. package/dist/utils/index.d.ts.map +1 -0
  245. package/dist/utils/nativeBridge.d.ts +3 -0
  246. package/dist/utils/nativeBridge.d.ts.map +1 -0
  247. package/dist/utils/nativeBridge.js +2 -0
  248. package/dist/utils/projectTags.d.ts +6 -0
  249. package/dist/utils/projectTags.d.ts.map +1 -0
  250. package/dist/utils/projectTags.js +49 -0
  251. package/dist/utils/projectTags.js.map +1 -0
  252. package/dist/utils/slug.d.ts +13 -0
  253. package/dist/utils/slug.d.ts.map +1 -0
  254. package/dist/utils/slug.js +8 -0
  255. package/dist/utils/slug.js.map +1 -0
  256. package/dist/utils/tokenHelpers.d.ts +114 -0
  257. package/dist/utils/tokenHelpers.d.ts.map +1 -0
  258. package/dist/utils/tokenHelpers.js +80 -0
  259. package/dist/utils/tokenHelpers.js.map +1 -0
  260. package/package.json +113 -0
@@ -0,0 +1,150 @@
1
+ import { useWorkspacesContext as e } from "../providers/WorkspacesProvider.js";
2
+ import { getProjectStatusClasses as t } from "../utils/tokenHelpers.js";
3
+ import { useScopedNavigation as n } from "../hooks/useScopedNavigation.js";
4
+ import { nativeConfirm as r, nativeImpact as i } from "../utils/nativeBridge.js";
5
+ import { useArchiveProject as a, useDeleteProject as o, useUnarchiveProject as s } from "../hooks/useProjectMutations.js";
6
+ import { formatDate as c } from "../utils/formatters.js";
7
+ import { normalizeProjectTags as l } from "../utils/projectTags.js";
8
+ import { Archive as u, FolderKanban as d, MoreVertical as f } from "lucide-react";
9
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
10
+ import { Badge as h, Button as g, Card as _, CardContent as v, CardHeader as y, CardTitle as b, DropdownMenu as x, DropdownMenuContent as S, DropdownMenuItem as C, DropdownMenuTrigger as w } from "@burdenoff/fe-libs/ui";
11
+ import { useNavigate as T } from "react-router-dom";
12
+ import { TagBadge as E } from "@burdenoff/fe-libs/tag";
13
+ //#region src/components/ProjectCard.tsx
14
+ function D({ project: D, selected: O = !1, onToggleSelect: k, onTagClick: A, canArchive: j = !1, canDelete: M = !1 }) {
15
+ let N = T(), { basePath: P = "/workspaces" } = e(), { withCurrentSearch: F } = n(), { mutate: I } = a(D.workspaceId), { mutate: L } = s(D.workspaceId), { mutate: R } = o(D.workspaceId), z = l(D.tags), B = () => {
16
+ N(F(`${P}/${D.workspaceId}/projects/${D.id}`));
17
+ };
18
+ return /* @__PURE__ */ m(_, {
19
+ className: `cursor-pointer relative ${O ? "ring-2 ring-primary/25 border-primary/50" : ""}`,
20
+ onClick: B,
21
+ onKeyDown: (e) => {
22
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), B());
23
+ },
24
+ role: "button",
25
+ tabIndex: 0,
26
+ "aria-label": `Open project ${D.name}`,
27
+ children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ m("div", {
28
+ className: "flex items-start justify-between",
29
+ children: [/* @__PURE__ */ m("div", {
30
+ className: "flex items-center gap-3 flex-1",
31
+ children: [
32
+ k && /* @__PURE__ */ p("input", {
33
+ type: "checkbox",
34
+ checked: O,
35
+ onChange: (e) => k(e.target.checked),
36
+ onClick: (e) => e.stopPropagation(),
37
+ "aria-label": `Select project ${D.name}`,
38
+ className: "mt-1 h-4 w-4 rounded border-border text-primary"
39
+ }),
40
+ /* @__PURE__ */ p("div", {
41
+ className: "p-3 rounded-lg bg-primary/10 transition-colors",
42
+ children: /* @__PURE__ */ p(d, {
43
+ className: "text-primary",
44
+ size: 24
45
+ })
46
+ }),
47
+ /* @__PURE__ */ m("div", {
48
+ className: "flex-1 min-w-0",
49
+ children: [/* @__PURE__ */ p(b, {
50
+ className: "truncate",
51
+ children: D.name
52
+ }), /* @__PURE__ */ p("p", {
53
+ className: "truncate text-sm text-muted-foreground",
54
+ children: D.key
55
+ })]
56
+ })
57
+ ]
58
+ }), /* @__PURE__ */ m(x, { children: [/* @__PURE__ */ p(w, {
59
+ asChild: !0,
60
+ onClick: (e) => e.stopPropagation(),
61
+ children: /* @__PURE__ */ m(g, {
62
+ variant: "ghost",
63
+ size: "sm",
64
+ className: "h-8 w-8 p-0",
65
+ children: [/* @__PURE__ */ p(f, { size: 16 }), /* @__PURE__ */ p("span", {
66
+ className: "sr-only",
67
+ children: "Open project actions"
68
+ })]
69
+ })
70
+ }), /* @__PURE__ */ m(S, {
71
+ align: "end",
72
+ children: [j && /* @__PURE__ */ m(C, {
73
+ onClick: (e) => {
74
+ e.stopPropagation(), D.archived ? L(D.id) : I(D.id);
75
+ },
76
+ children: [/* @__PURE__ */ p(u, {
77
+ size: 16,
78
+ className: "mr-2"
79
+ }), D.archived ? "Unarchive" : "Archive"]
80
+ }), M && /* @__PURE__ */ p(C, {
81
+ onClick: async (e) => {
82
+ e.stopPropagation(), i("medium");
83
+ let t = await r({
84
+ title: "Delete project",
85
+ message: `Are you sure you want to delete "${D.name}"?`,
86
+ okButtonTitle: "Delete",
87
+ cancelButtonTitle: "Cancel"
88
+ });
89
+ (t === null ? confirm(`Are you sure you want to delete "${D.name}"?`) : t) && R(D.id);
90
+ },
91
+ className: "text-destructive",
92
+ children: "Delete"
93
+ })]
94
+ })] })]
95
+ }) }), /* @__PURE__ */ m(v, {
96
+ className: "space-y-3",
97
+ children: [
98
+ /* @__PURE__ */ m("div", {
99
+ className: "flex items-center gap-2",
100
+ children: [/* @__PURE__ */ p(h, {
101
+ className: `border ${t(D.status)}`,
102
+ children: D.status
103
+ }), D.archived && /* @__PURE__ */ m(h, {
104
+ variant: "outline",
105
+ className: "border-workspace-archived-border text-workspace-archived-text",
106
+ children: [/* @__PURE__ */ p(u, {
107
+ size: 12,
108
+ className: "mr-1"
109
+ }), "Archived"]
110
+ })]
111
+ }),
112
+ /* @__PURE__ */ m("div", {
113
+ className: "text-xs text-muted-foreground",
114
+ children: ["Created ", c(D.createdAt)]
115
+ }),
116
+ z.length > 0 && /* @__PURE__ */ m("div", {
117
+ className: "flex flex-wrap gap-1.5",
118
+ "aria-label": "Project tags",
119
+ children: [z.slice(0, 4).map((e) => /* @__PURE__ */ p("span", {
120
+ onClick: (t) => {
121
+ t.stopPropagation(), A?.(e);
122
+ },
123
+ onKeyDown: (t) => {
124
+ (t.key === "Enter" || t.key === " ") && (t.preventDefault(), t.stopPropagation(), A?.(e));
125
+ },
126
+ role: A ? "button" : void 0,
127
+ tabIndex: A ? 0 : -1,
128
+ children: /* @__PURE__ */ p(E, {
129
+ id: e.tagId,
130
+ label: e.label,
131
+ color: e.color ?? void 0,
132
+ icon: e.icon ?? void 0,
133
+ description: e.description ?? void 0,
134
+ size: "sm",
135
+ className: A ? "cursor-pointer" : void 0
136
+ })
137
+ }, e.tagId)), z.length > 4 && /* @__PURE__ */ m(h, {
138
+ variant: "outline",
139
+ className: "text-xs",
140
+ children: ["+", z.length - 4]
141
+ })]
142
+ })
143
+ ]
144
+ })]
145
+ });
146
+ }
147
+ //#endregion
148
+ export { D as ProjectCard };
149
+
150
+ //# sourceMappingURL=ProjectCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectCard.js","names":[],"sources":["../../src/components/ProjectCard.tsx"],"sourcesContent":["import { FolderKanban, Archive, MoreVertical } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { TagBadge } from '@burdenoff/fe-libs/tag';\n\nimport type { Project, ProjectTag } from '../types';\nimport { formatDate } from '../utils/formatters';\nimport { normalizeProjectTags } from '../utils/projectTags';\nimport { getProjectStatusClasses } from '../utils/tokenHelpers';\nimport {\n useArchiveProject,\n useUnarchiveProject,\n useDeleteProject,\n} from '../hooks/useProjectMutations';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\nimport { useScopedNavigation } from '../hooks/useScopedNavigation';\nimport { nativeConfirm, nativeImpact } from '../utils/nativeBridge';\n\ninterface ProjectCardProps {\n project: Project;\n selected?: boolean;\n onToggleSelect?: (checked: boolean) => void;\n onTagClick?: (tag: ProjectTag) => void;\n canArchive?: boolean;\n canDelete?: boolean;\n}\n\nexport function ProjectCard({\n project,\n selected = false,\n onToggleSelect,\n onTagClick,\n canArchive = false,\n canDelete = false,\n}: ProjectCardProps) {\n const navigate = useNavigate();\n const { basePath = '/workspaces' } = useWorkspacesContext();\n const { withCurrentSearch } = useScopedNavigation();\n const { mutate: archiveProject } = useArchiveProject(project.workspaceId);\n const { mutate: unarchiveProject } = useUnarchiveProject(project.workspaceId);\n const { mutate: deleteProject } = useDeleteProject(project.workspaceId);\n const projectTags = normalizeProjectTags(project.tags);\n\n const handleCardClick = () => {\n navigate(withCurrentSearch(`${basePath}/${project.workspaceId}/projects/${project.id}`));\n };\n\n const handleArchive = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (project.archived) {\n unarchiveProject(project.id);\n } else {\n archiveProject(project.id);\n }\n };\n\n const handleDelete = async (e: React.MouseEvent) => {\n e.stopPropagation();\n void nativeImpact('medium');\n const native = await nativeConfirm({\n title: 'Delete project',\n message: `Are you sure you want to delete \"${project.name}\"?`,\n okButtonTitle: 'Delete',\n cancelButtonTitle: 'Cancel',\n });\n const ok =\n native === null ? confirm(`Are you sure you want to delete \"${project.name}\"?`) : native;\n if (ok) {\n deleteProject(project.id);\n }\n };\n\n const handleCardKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleCardClick();\n }\n };\n\n return (\n <Card\n className={`cursor-pointer relative ${\n selected ? 'ring-2 ring-primary/25 border-primary/50' : ''\n }`}\n onClick={handleCardClick}\n onKeyDown={handleCardKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-label={`Open project ${project.name}`}\n >\n <CardHeader>\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3 flex-1\">\n {onToggleSelect && (\n <input\n type=\"checkbox\"\n checked={selected}\n onChange={(event) => onToggleSelect(event.target.checked)}\n onClick={(event) => event.stopPropagation()}\n aria-label={`Select project ${project.name}`}\n className=\"mt-1 h-4 w-4 rounded border-border text-primary\"\n />\n )}\n <div className=\"p-3 rounded-lg bg-primary/10 transition-colors\">\n <FolderKanban className=\"text-primary\" size={24} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <CardTitle className=\"truncate\">{project.name}</CardTitle>\n <p className=\"truncate text-sm text-muted-foreground\">{project.key}</p>\n </div>\n </div>\n <DropdownMenu>\n <DropdownMenuTrigger asChild onClick={(e) => e.stopPropagation()}>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-8 w-8 p-0\">\n <MoreVertical size={16} />\n <span className=\"sr-only\">Open project actions</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {canArchive && (\n <DropdownMenuItem onClick={handleArchive}>\n <Archive size={16} className=\"mr-2\" />\n {project.archived ? 'Unarchive' : 'Archive'}\n </DropdownMenuItem>\n )}\n {canDelete && (\n <DropdownMenuItem onClick={handleDelete} className=\"text-destructive\">\n Delete\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <Badge className={`border ${getProjectStatusClasses(project.status)}`}>\n {project.status}\n </Badge>\n {project.archived && (\n <Badge\n variant=\"outline\"\n className=\"border-workspace-archived-border text-workspace-archived-text\"\n >\n <Archive size={12} className=\"mr-1\" />\n Archived\n </Badge>\n )}\n </div>\n <div className=\"text-xs text-muted-foreground\">Created {formatDate(project.createdAt)}</div>\n {projectTags.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\" aria-label=\"Project tags\">\n {projectTags.slice(0, 4).map((tag) => (\n <span\n key={tag.tagId}\n onClick={(event) => {\n event.stopPropagation();\n onTagClick?.(tag);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n event.stopPropagation();\n onTagClick?.(tag);\n }\n }}\n role={onTagClick ? 'button' : undefined}\n tabIndex={onTagClick ? 0 : -1}\n >\n <TagBadge\n id={tag.tagId}\n label={tag.label}\n color={tag.color ?? undefined}\n icon={tag.icon ?? undefined}\n description={tag.description ?? undefined}\n size=\"sm\"\n className={onTagClick ? 'cursor-pointer' : undefined}\n />\n </span>\n ))}\n {projectTags.length > 4 && (\n <Badge variant=\"outline\" className=\"text-xs\">\n +{projectTags.length - 4}\n </Badge>\n )}\n </div>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Workspace } from '../types';
2
+
3
+ interface WorkspaceCardProps {
4
+ workspace: Workspace;
5
+ }
6
+ export declare function WorkspaceCard({ workspace }: WorkspaceCardProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=WorkspaceCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceCard.d.ts","sourceRoot":"","sources":["../../src/components/WorkspaceCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK1C,UAAU,kBAAkB;IAC1B,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CAoE9D"}
@@ -0,0 +1,79 @@
1
+ import { useWorkspacesContext as e } from "../providers/WorkspacesProvider.js";
2
+ import { getWorkspaceStatusClasses as t } from "../utils/tokenHelpers.js";
3
+ import { useScopedNavigation as n } from "../hooks/useScopedNavigation.js";
4
+ import { Building2 as r, FolderKanban as i, Users as a } from "lucide-react";
5
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
+ import { Badge as c, Card as l, CardContent as u, CardHeader as d, CardTitle as f } from "@burdenoff/fe-libs/ui";
7
+ import { useNavigate as p } from "react-router-dom";
8
+ //#region src/components/WorkspaceCard.tsx
9
+ function m({ workspace: m }) {
10
+ let h = p(), { basePath: g = "/" } = e(), { withCurrentSearch: _ } = n(), v = () => {
11
+ h(_(`${g}/${m.id}`));
12
+ };
13
+ return /* @__PURE__ */ s(l, {
14
+ className: "cursor-pointer",
15
+ onClick: v,
16
+ onKeyDown: (e) => {
17
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), v());
18
+ },
19
+ role: "button",
20
+ tabIndex: 0,
21
+ "aria-label": `Open workspace ${m.name}`,
22
+ children: [/* @__PURE__ */ o(d, { children: /* @__PURE__ */ s("div", {
23
+ className: "flex items-center gap-3",
24
+ children: [/* @__PURE__ */ o("div", {
25
+ className: "p-3 rounded-lg bg-primary/10 transition-colors",
26
+ children: /* @__PURE__ */ o(r, {
27
+ className: "text-primary",
28
+ size: 24
29
+ })
30
+ }), /* @__PURE__ */ s("div", {
31
+ className: "flex-1 min-w-0",
32
+ children: [/* @__PURE__ */ o(f, {
33
+ className: "text-lg truncate",
34
+ children: m.name
35
+ }), /* @__PURE__ */ s("div", {
36
+ className: "flex items-center gap-2 mt-1",
37
+ children: [/* @__PURE__ */ o(c, {
38
+ variant: "outline",
39
+ className: "text-xs",
40
+ children: m.type
41
+ }), /* @__PURE__ */ o(c, {
42
+ className: `text-xs border ${t(m.status)}`,
43
+ children: m.status
44
+ })]
45
+ })]
46
+ })]
47
+ }) }), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s("div", {
48
+ className: "flex flex-wrap gap-4 text-sm text-muted-foreground",
49
+ children: [typeof m.memberCount == "number" && m.memberCount > 0 && /* @__PURE__ */ s("div", {
50
+ className: "flex items-center gap-1",
51
+ children: [/* @__PURE__ */ o(a, {
52
+ size: 16,
53
+ "aria-hidden": "true"
54
+ }), /* @__PURE__ */ s("span", { children: [
55
+ m.memberCount,
56
+ " member",
57
+ m.memberCount === 1 ? "" : "s"
58
+ ] })]
59
+ }), typeof m.projectCount == "number" && m.projectCount > 0 && /* @__PURE__ */ s("div", {
60
+ className: "flex items-center gap-1",
61
+ children: [/* @__PURE__ */ o(i, {
62
+ size: 16,
63
+ "aria-hidden": "true"
64
+ }), /* @__PURE__ */ s("span", { children: [
65
+ m.projectCount,
66
+ " project",
67
+ m.projectCount === 1 ? "" : "s"
68
+ ] })]
69
+ })]
70
+ }), m.domain && /* @__PURE__ */ o("p", {
71
+ className: "mt-2 truncate text-xs text-muted-foreground",
72
+ children: m.domain
73
+ })] })]
74
+ });
75
+ }
76
+ //#endregion
77
+ export { m as WorkspaceCard };
78
+
79
+ //# sourceMappingURL=WorkspaceCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceCard.js","names":[],"sources":["../../src/components/WorkspaceCard.tsx"],"sourcesContent":["import { Building2, Users, FolderKanban } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { Card, CardHeader, CardTitle, CardContent, Badge } from '@burdenoff/fe-libs/ui';\nimport type { Workspace } from '../types';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\nimport { getWorkspaceStatusClasses } from '../utils/tokenHelpers';\nimport { useScopedNavigation } from '../hooks/useScopedNavigation';\n\ninterface WorkspaceCardProps {\n workspace: Workspace;\n}\n\nexport function WorkspaceCard({ workspace }: WorkspaceCardProps) {\n const navigate = useNavigate();\n const { basePath = '/' } = useWorkspacesContext();\n const { withCurrentSearch } = useScopedNavigation();\n\n const handleClick = () => {\n navigate(withCurrentSearch(`${basePath}/${workspace.id}`));\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleClick();\n }\n };\n\n return (\n <Card\n className=\"cursor-pointer\"\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-label={`Open workspace ${workspace.name}`}\n >\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-primary/10 transition-colors\">\n <Building2 className=\"text-primary\" size={24} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <CardTitle className=\"text-lg truncate\">{workspace.name}</CardTitle>\n <div className=\"flex items-center gap-2 mt-1\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {workspace.type}\n </Badge>\n <Badge className={`text-xs border ${getWorkspaceStatusClasses(workspace.status)}`}>\n {workspace.status}\n </Badge>\n </div>\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-4 text-sm text-muted-foreground\">\n {typeof workspace.memberCount === 'number' && workspace.memberCount > 0 && (\n <div className=\"flex items-center gap-1\">\n <Users size={16} aria-hidden=\"true\" />\n <span>\n {workspace.memberCount} member{workspace.memberCount === 1 ? '' : 's'}\n </span>\n </div>\n )}\n {typeof workspace.projectCount === 'number' && workspace.projectCount > 0 && (\n <div className=\"flex items-center gap-1\">\n <FolderKanban size={16} aria-hidden=\"true\" />\n <span>\n {workspace.projectCount} project{workspace.projectCount === 1 ? '' : 's'}\n </span>\n </div>\n )}\n </div>\n {workspace.domain && (\n <p className=\"mt-2 truncate text-xs text-muted-foreground\">{workspace.domain}</p>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;AAYA,SAAgB,EAAc,EAAE,gBAAiC;CAC/D,IAAM,IAAW,GAAa,EACxB,EAAE,cAAW,QAAQ,GAAsB,EAC3C,EAAE,yBAAsB,GAAqB,EAE7C,UAAoB;AACxB,IAAS,EAAkB,GAAG,EAAS,GAAG,EAAU,KAAK,CAAC;;AAU5D,QACE,kBAAC,GAAD;EACE,WAAU;EACV,SAAS;EACT,YAXmB,MAA+C;AACpE,IAAI,EAAM,QAAQ,WAAW,EAAM,QAAQ,SACzC,EAAM,gBAAgB,EACtB,GAAa;;EASb,MAAK;EACL,UAAU;EACV,cAAY,kBAAkB,EAAU;YAN1C,CAQE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KAAW,WAAU;KAAe,MAAM;KAAM,CAAA;IAC5C,CAAA,EACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAW,WAAU;eAAoB,EAAU;KAAiB,CAAA,EACpE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAO,SAAQ;MAAU,WAAU;gBAChC,EAAU;MACL,CAAA,EACR,kBAAC,GAAD;MAAO,WAAW,kBAAkB,EAA0B,EAAU,OAAO;gBAC5E,EAAU;MACL,CAAA,CACJ;OACF;MACF;MACK,CAAA,EACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,OAAO,EAAU,eAAgB,YAAY,EAAU,cAAc,KACpE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAO,MAAM;KAAI,eAAY;KAAS,CAAA,EACtC,kBAAC,QAAD,EAAA,UAAA;KACG,EAAU;KAAY;KAAQ,EAAU,gBAAgB,IAAI,KAAK;KAC7D,EAAA,CAAA,CACH;OAEP,OAAO,EAAU,gBAAiB,YAAY,EAAU,eAAe,KACtE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAc,MAAM;KAAI,eAAY;KAAS,CAAA,EAC7C,kBAAC,QAAD,EAAA,UAAA;KACG,EAAU;KAAa;KAAS,EAAU,iBAAiB,IAAI,KAAK;KAChE,EAAA,CAAA,CACH;MAEJ;MACL,EAAU,UACT,kBAAC,KAAD;GAAG,WAAU;aAA+C,EAAU;GAAW,CAAA,CAEvE,EAAA,CAAA,CACT"}
@@ -0,0 +1,27 @@
1
+ import { Component, ReactNode } from 'react';
2
+
3
+ interface Props {
4
+ children: ReactNode;
5
+ fallback?: ReactNode;
6
+ onReset?: () => void;
7
+ }
8
+ interface State {
9
+ hasError: boolean;
10
+ error: Error | null;
11
+ errorInfo: React.ErrorInfo | null;
12
+ }
13
+ /**
14
+ * Error Boundary component for Workspaces microfrontend
15
+ * Catches and handles runtime errors gracefully
16
+ */
17
+ export declare class WorkspacesErrorBoundary extends Component<Props, State> {
18
+ constructor(props: Props);
19
+ static getDerivedStateFromError(error: Error): Partial<State>;
20
+ componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void;
21
+ handleReset: () => void;
22
+ handleReload: () => void;
23
+ handleGoHome: () => void;
24
+ render(): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import('react').ReactPortal | import('react').ReactElement<unknown, string | import('react').JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
25
+ }
26
+ export {};
27
+ //# sourceMappingURL=WorkspacesErrorBoundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspacesErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/components/WorkspacesErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIlD,UAAU,KAAK;IACb,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,UAAU,KAAK;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;gBACtD,KAAK,EAAE,KAAK;IASxB,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAI7D,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;IAkC1D,WAAW,aAST;IAEF,YAAY,aAEV;IAEF,YAAY,aAEV;IAEF,MAAM;CA6EP"}
@@ -0,0 +1,136 @@
1
+ import { Component as e } from "react";
2
+ import { AlertCircle as t, Home as n, RefreshCw as r } from "lucide-react";
3
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
4
+ import { Button as o } from "@burdenoff/fe-libs/ui";
5
+ //#region src/components/WorkspacesErrorBoundary.tsx
6
+ var s = class extends e {
7
+ constructor(e) {
8
+ super(e), this.state = {
9
+ hasError: !1,
10
+ error: null,
11
+ errorInfo: null
12
+ };
13
+ }
14
+ static getDerivedStateFromError(e) {
15
+ return {
16
+ hasError: !0,
17
+ error: e
18
+ };
19
+ }
20
+ componentDidCatch(e, t) {
21
+ if (process.env.NODE_ENV === "development" && console.error("Workspaces Error Boundary caught an error:", e, t), this.setState({
22
+ error: e,
23
+ errorInfo: t
24
+ }), typeof window < "u") {
25
+ let n = window;
26
+ try {
27
+ n.__burdenoffEventBus?.emit("workspaces.error-boundary.caught", {
28
+ source: "microfe-workspaces",
29
+ message: e.message,
30
+ name: e.name,
31
+ stack: e.stack,
32
+ componentStack: t.componentStack
33
+ });
34
+ } catch {}
35
+ }
36
+ }
37
+ handleReset = () => {
38
+ this.setState({
39
+ hasError: !1,
40
+ error: null,
41
+ errorInfo: null
42
+ }), this.props.onReset?.();
43
+ };
44
+ handleReload = () => {
45
+ window.location.reload();
46
+ };
47
+ handleGoHome = () => {
48
+ window.location.href = "/";
49
+ };
50
+ render() {
51
+ return this.state.hasError ? this.props.fallback ? this.props.fallback : /* @__PURE__ */ i("div", {
52
+ className: "flex items-center justify-center min-h-[400px] p-6",
53
+ children: /* @__PURE__ */ a("div", {
54
+ className: "max-w-md w-full text-center space-y-6",
55
+ children: [
56
+ /* @__PURE__ */ i("div", {
57
+ className: "flex justify-center",
58
+ children: /* @__PURE__ */ i("div", {
59
+ className: "rounded-full bg-destructive/10 p-6",
60
+ children: /* @__PURE__ */ i(t, { className: "h-12 w-12 text-destructive" })
61
+ })
62
+ }),
63
+ /* @__PURE__ */ a("div", {
64
+ className: "space-y-2",
65
+ children: [/* @__PURE__ */ i("h2", {
66
+ className: "text-2xl font-bold",
67
+ children: "Something went wrong"
68
+ }), /* @__PURE__ */ i("p", {
69
+ className: "text-muted-foreground",
70
+ children: "We encountered an unexpected error. Please try refreshing the page or contact support if the problem persists."
71
+ })]
72
+ }),
73
+ process.env.NODE_ENV === "development" && this.state.error && /* @__PURE__ */ a("details", {
74
+ className: "text-left",
75
+ children: [/* @__PURE__ */ i("summary", {
76
+ className: "cursor-pointer text-sm font-medium text-muted-foreground hover:text-foreground transition-colors duration-200",
77
+ children: "Error Details"
78
+ }), /* @__PURE__ */ a("div", {
79
+ className: "mt-2 p-4 bg-muted rounded-lg text-xs font-mono overflow-auto max-h-40",
80
+ children: [
81
+ /* @__PURE__ */ a("p", {
82
+ className: "font-semibold text-destructive",
83
+ children: [this.state.error.name, ":"]
84
+ }),
85
+ /* @__PURE__ */ i("p", {
86
+ className: "text-foreground",
87
+ children: this.state.error.message
88
+ }),
89
+ this.state.error.stack && /* @__PURE__ */ i("pre", {
90
+ className: "mt-2 text-muted-foreground text-xs overflow-x-auto",
91
+ children: this.state.error.stack
92
+ })
93
+ ]
94
+ })]
95
+ }),
96
+ /* @__PURE__ */ a("div", {
97
+ className: "flex flex-col sm:flex-row gap-3 justify-center",
98
+ children: [
99
+ /* @__PURE__ */ a(o, {
100
+ onClick: this.handleReset,
101
+ variant: "default",
102
+ children: [/* @__PURE__ */ i(r, { className: "mr-2 h-4 w-4" }), "Try Again"]
103
+ }),
104
+ /* @__PURE__ */ i(o, {
105
+ onClick: this.handleReload,
106
+ variant: "outline",
107
+ children: "Reload Page"
108
+ }),
109
+ /* @__PURE__ */ a(o, {
110
+ onClick: this.handleGoHome,
111
+ variant: "ghost",
112
+ children: [/* @__PURE__ */ i(n, { className: "mr-2 h-4 w-4" }), "Go Home"]
113
+ })
114
+ ]
115
+ }),
116
+ /* @__PURE__ */ a("p", {
117
+ className: "text-sm text-muted-foreground",
118
+ children: [
119
+ "Need help?",
120
+ " ",
121
+ /* @__PURE__ */ i("a", {
122
+ href: "mailto:support@example.com",
123
+ className: "text-primary hover:underline transition-colors duration-200",
124
+ children: "Contact Support"
125
+ })
126
+ ]
127
+ })
128
+ ]
129
+ })
130
+ }) : this.props.children;
131
+ }
132
+ };
133
+ //#endregion
134
+ export { s as WorkspacesErrorBoundary };
135
+
136
+ //# sourceMappingURL=WorkspacesErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspacesErrorBoundary.js","names":[],"sources":["../../src/components/WorkspacesErrorBoundary.tsx"],"sourcesContent":["import { Component, type ReactNode } from 'react';\nimport { AlertCircle, RefreshCw, Home } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\n\ninterface Props {\n children: ReactNode;\n fallback?: ReactNode;\n onReset?: () => void;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n errorInfo: React.ErrorInfo | null;\n}\n\n/**\n * Error Boundary component for Workspaces microfrontend\n * Catches and handles runtime errors gracefully\n */\nexport class WorkspacesErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<State> {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n // Log error to console in development\n if (process.env.NODE_ENV === 'development') {\n console.error('Workspaces Error Boundary caught an error:', error, errorInfo);\n }\n\n // Update state with error details\n this.setState({\n error,\n errorInfo,\n });\n\n // Forward to the shell-owned event bus per\n // ~/products/infra/infra-specs/microfrontends/47-FRONTEND-EVENT-BUS.md.\n // The shell wires Rybbit / OTel / SRE sinks; the MFE never sinks directly.\n // Window guard keeps SSR / non-browser environments safe.\n if (typeof window !== 'undefined') {\n const w = window as unknown as {\n __burdenoffEventBus?: { emit: (name: string, payload: unknown) => void };\n };\n try {\n w.__burdenoffEventBus?.emit('workspaces.error-boundary.caught', {\n source: 'microfe-workspaces',\n message: error.message,\n name: error.name,\n stack: error.stack,\n componentStack: errorInfo.componentStack,\n });\n } catch {\n // Bus failures must not mask the original render error.\n }\n }\n }\n\n handleReset = () => {\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n });\n\n // Call optional onReset callback\n this.props.onReset?.();\n };\n\n handleReload = () => {\n window.location.reload();\n };\n\n handleGoHome = () => {\n window.location.href = '/';\n };\n\n render() {\n if (this.state.hasError) {\n // Use custom fallback if provided\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n // Default error UI\n return (\n <div className=\"flex items-center justify-center min-h-[400px] p-6\">\n <div className=\"max-w-md w-full text-center space-y-6\">\n {/* Error Icon */}\n <div className=\"flex justify-center\">\n <div className=\"rounded-full bg-destructive/10 p-6\">\n <AlertCircle className=\"h-12 w-12 text-destructive\" />\n </div>\n </div>\n\n {/* Error Message */}\n <div className=\"space-y-2\">\n <h2 className=\"text-2xl font-bold\">Something went wrong</h2>\n <p className=\"text-muted-foreground\">\n We encountered an unexpected error. Please try refreshing the page or contact\n support if the problem persists.\n </p>\n </div>\n\n {/* Error Details (Development Only) */}\n {process.env.NODE_ENV === 'development' && this.state.error && (\n <details className=\"text-left\">\n <summary className=\"cursor-pointer text-sm font-medium text-muted-foreground hover:text-foreground transition-colors duration-200\">\n Error Details\n </summary>\n <div className=\"mt-2 p-4 bg-muted rounded-lg text-xs font-mono overflow-auto max-h-40\">\n <p className=\"font-semibold text-destructive\">{this.state.error.name}:</p>\n <p className=\"text-foreground\">{this.state.error.message}</p>\n {this.state.error.stack && (\n <pre className=\"mt-2 text-muted-foreground text-xs overflow-x-auto\">\n {this.state.error.stack}\n </pre>\n )}\n </div>\n </details>\n )}\n\n {/* Action Buttons */}\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center\">\n <Button onClick={this.handleReset} variant=\"default\">\n <RefreshCw className=\"mr-2 h-4 w-4\" />\n Try Again\n </Button>\n <Button onClick={this.handleReload} variant=\"outline\">\n Reload Page\n </Button>\n <Button onClick={this.handleGoHome} variant=\"ghost\">\n <Home className=\"mr-2 h-4 w-4\" />\n Go Home\n </Button>\n </div>\n\n {/* Support Link */}\n <p className=\"text-sm text-muted-foreground\">\n Need help?{' '}\n <a\n href=\"mailto:support@example.com\"\n className=\"text-primary hover:underline transition-colors duration-200\"\n >\n Contact Support\n </a>\n </p>\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n"],"mappings":";;;;;AAoBA,IAAa,IAAb,cAA6C,EAAwB;CACnE,YAAY,GAAc;AAExB,EADA,MAAM,EAAM,EACZ,KAAK,QAAQ;GACX,UAAU;GACV,OAAO;GACP,WAAW;GACZ;;CAGH,OAAO,yBAAyB,GAA8B;AAC5D,SAAO;GAAE,UAAU;GAAM;GAAO;;CAGlC,kBAAkB,GAAc,GAA4B;AAgB1D,MAdA,QAAA,IAAA,aAA6B,iBAC3B,QAAQ,MAAM,8CAA8C,GAAO,EAAU,EAI/E,KAAK,SAAS;GACZ;GACA;GACD,CAAC,EAME,OAAO,SAAW,KAAa;GACjC,IAAM,IAAI;AAGV,OAAI;AACF,MAAE,qBAAqB,KAAK,oCAAoC;KAC9D,QAAQ;KACR,SAAS,EAAM;KACf,MAAM,EAAM;KACZ,OAAO,EAAM;KACb,gBAAgB,EAAU;KAC3B,CAAC;WACI;;;CAMZ,oBAAoB;AAQlB,EAPA,KAAK,SAAS;GACZ,UAAU;GACV,OAAO;GACP,WAAW;GACZ,CAAC,EAGF,KAAK,MAAM,WAAW;;CAGxB,qBAAqB;AACnB,SAAO,SAAS,QAAQ;;CAG1B,qBAAqB;AACnB,SAAO,SAAS,OAAO;;CAGzB,SAAS;AA2EP,SA1EI,KAAK,MAAM,WAET,KAAK,MAAM,WACN,KAAK,MAAM,WAKlB,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf;KAEE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD,EAAa,WAAU,8BAA+B,CAAA;OAClD,CAAA;MACF,CAAA;KAGN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAqB;OAAyB,CAAA,EAC5D,kBAAC,KAAD;OAAG,WAAU;iBAAwB;OAGjC,CAAA,CACA;;8BAGoB,iBAAiB,KAAK,MAAM,SACpD,kBAAC,WAAD;MAAS,WAAU;gBAAnB,CACE,kBAAC,WAAD;OAAS,WAAU;iBAAgH;OAEzH,CAAA,EACV,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,KAAD;SAAG,WAAU;mBAAb,CAA+C,KAAK,MAAM,MAAM,MAAK,IAAK;;QAC1E,kBAAC,KAAD;SAAG,WAAU;mBAAmB,KAAK,MAAM,MAAM;SAAY,CAAA;QAC5D,KAAK,MAAM,MAAM,SAChB,kBAAC,OAAD;SAAK,WAAU;mBACZ,KAAK,MAAM,MAAM;SACd,CAAA;QAEJ;SACE;;KAIZ,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAQ,SAAS,KAAK;QAAa,SAAQ;kBAA3C,CACE,kBAAC,GAAD,EAAW,WAAU,gBAAiB,CAAA,EAAA,YAE/B;;OACT,kBAAC,GAAD;QAAQ,SAAS,KAAK;QAAc,SAAQ;kBAAU;QAE7C,CAAA;OACT,kBAAC,GAAD;QAAQ,SAAS,KAAK;QAAc,SAAQ;kBAA5C,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,UAE1B;;OACL;;KAGN,kBAAC,KAAD;MAAG,WAAU;gBAAb;OAA6C;OAChC;OACX,kBAAC,KAAD;QACE,MAAK;QACL,WAAU;kBACX;QAEG,CAAA;OACF;;KACA;;GACF,CAAA,GAIH,KAAK,MAAM"}
@@ -0,0 +1,8 @@
1
+ export { WorkspaceCard } from './WorkspaceCard';
2
+ export { CreateWorkspaceDialog } from './CreateWorkspaceDialog';
3
+ export { ProjectCard } from './ProjectCard';
4
+ export { CreateProjectDialog } from './CreateProjectDialog';
5
+ export { MemberListItem } from './MemberListItem';
6
+ export { InviteMemberDialog } from './InviteMemberDialog';
7
+ export { WorkspacesErrorBoundary } from './WorkspacesErrorBoundary';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import "./WorkspacesErrorBoundary.js";
2
+ import "./WorkspaceCard.js";
3
+ import "./CreateWorkspaceDialog.js";
4
+ import "./ProjectCard.js";
5
+ import "./CreateProjectDialog.js";
6
+ import "./MemberListItem.js";
7
+ import "./InviteMemberDialog.js";
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Workspace MFE - Permission Constants
3
+ *
4
+ * Maps to action definitions in wspace-rbac-svc seed file.
5
+ * Format: {resourceType}:{action}
6
+ */
7
+ export declare const WORKSPACE_PERMISSIONS: {
8
+ readonly WORKSPACE_LIST: "workspace:list";
9
+ readonly WORKSPACE_READ: "workspace:read";
10
+ readonly WORKSPACE_CREATE: "workspace:create";
11
+ readonly WORKSPACE_UPDATE: "workspace:update";
12
+ readonly WORKSPACE_DELETE: "workspace:delete";
13
+ readonly WORKSPACE_ARCHIVE: "workspace:archive";
14
+ readonly MEMBER_LIST: "workspace-member:list";
15
+ readonly MEMBER_READ: "workspace-member:read";
16
+ readonly MEMBER_CREATE: "workspace-member:create";
17
+ readonly MEMBER_UPDATE: "workspace-member:update";
18
+ readonly MEMBER_DELETE: "workspace-member:delete";
19
+ readonly PROJECT_LIST: "project:list";
20
+ readonly PROJECT_READ: "project:read";
21
+ readonly PROJECT_CREATE: "project:create";
22
+ readonly PROJECT_UPDATE: "project:update";
23
+ readonly PROJECT_DELETE: "project:delete";
24
+ readonly PROJECT_ARCHIVE: "project:archive";
25
+ readonly PROJECT_MEMBER_LIST: "project-member:list";
26
+ readonly PROJECT_MEMBER_READ: "project-member:read";
27
+ readonly PROJECT_MEMBER_CREATE: "project-member:create";
28
+ readonly PROJECT_MEMBER_DELETE: "project-member:delete";
29
+ readonly SETTINGS_READ: "settings:read";
30
+ readonly SETTINGS_WRITE: "settings:write";
31
+ readonly ACTIVITY_READ: "activity:read";
32
+ };
33
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/constants/permissions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;CAoCxB,CAAC"}
@@ -0,0 +1,31 @@
1
+ //#region src/constants/permissions.ts
2
+ var e = {
3
+ WORKSPACE_LIST: "workspace:list",
4
+ WORKSPACE_READ: "workspace:read",
5
+ WORKSPACE_CREATE: "workspace:create",
6
+ WORKSPACE_UPDATE: "workspace:update",
7
+ WORKSPACE_DELETE: "workspace:delete",
8
+ WORKSPACE_ARCHIVE: "workspace:archive",
9
+ MEMBER_LIST: "workspace-member:list",
10
+ MEMBER_READ: "workspace-member:read",
11
+ MEMBER_CREATE: "workspace-member:create",
12
+ MEMBER_UPDATE: "workspace-member:update",
13
+ MEMBER_DELETE: "workspace-member:delete",
14
+ PROJECT_LIST: "project:list",
15
+ PROJECT_READ: "project:read",
16
+ PROJECT_CREATE: "project:create",
17
+ PROJECT_UPDATE: "project:update",
18
+ PROJECT_DELETE: "project:delete",
19
+ PROJECT_ARCHIVE: "project:archive",
20
+ PROJECT_MEMBER_LIST: "project-member:list",
21
+ PROJECT_MEMBER_READ: "project-member:read",
22
+ PROJECT_MEMBER_CREATE: "project-member:create",
23
+ PROJECT_MEMBER_DELETE: "project-member:delete",
24
+ SETTINGS_READ: "settings:read",
25
+ SETTINGS_WRITE: "settings:write",
26
+ ACTIVITY_READ: "activity:read"
27
+ };
28
+ //#endregion
29
+ export { e as WORKSPACE_PERMISSIONS };
30
+
31
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","names":[],"sources":["../../src/constants/permissions.ts"],"sourcesContent":["/**\n * Workspace MFE - Permission Constants\n *\n * Maps to action definitions in wspace-rbac-svc seed file.\n * Format: {resourceType}:{action}\n */\n\nexport const WORKSPACE_PERMISSIONS = {\n // Workspace\n WORKSPACE_LIST: 'workspace:list',\n WORKSPACE_READ: 'workspace:read',\n WORKSPACE_CREATE: 'workspace:create',\n WORKSPACE_UPDATE: 'workspace:update',\n WORKSPACE_DELETE: 'workspace:delete',\n WORKSPACE_ARCHIVE: 'workspace:archive',\n\n // Workspace Members\n MEMBER_LIST: 'workspace-member:list',\n MEMBER_READ: 'workspace-member:read',\n MEMBER_CREATE: 'workspace-member:create',\n MEMBER_UPDATE: 'workspace-member:update',\n MEMBER_DELETE: 'workspace-member:delete',\n\n // Projects\n PROJECT_LIST: 'project:list',\n PROJECT_READ: 'project:read',\n PROJECT_CREATE: 'project:create',\n PROJECT_UPDATE: 'project:update',\n PROJECT_DELETE: 'project:delete',\n PROJECT_ARCHIVE: 'project:archive',\n\n // Project Members\n PROJECT_MEMBER_LIST: 'project-member:list',\n PROJECT_MEMBER_READ: 'project-member:read',\n PROJECT_MEMBER_CREATE: 'project-member:create',\n PROJECT_MEMBER_DELETE: 'project-member:delete',\n\n // Settings\n SETTINGS_READ: 'settings:read',\n SETTINGS_WRITE: 'settings:write',\n\n // Activity / Audit\n ACTIVITY_READ: 'activity:read',\n} as const;\n"],"mappings":";AAOA,IAAa,IAAwB;CAEnC,gBAAgB;CAChB,gBAAgB;CAChB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CAGnB,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,eAAe;CAGf,cAAc;CACd,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAChB,iBAAiB;CAGjB,qBAAqB;CACrB,qBAAqB;CACrB,uBAAuB;CACvB,uBAAuB;CAGvB,eAAe;CACf,gBAAgB;CAGhB,eAAe;CAChB"}