@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,398 @@
1
+ import { useWorkspacesStore as e } from "../store/workspacesStore.js";
2
+ import { nativeConfirm as t, nativeImpact as n } from "../utils/nativeBridge.js";
3
+ import { useProjects as r } from "../hooks/useProjects.js";
4
+ import { useArchiveProject as i, useDeleteProject as ee, useUnarchiveProject as a } from "../hooks/useProjectMutations.js";
5
+ import { ProjectCard as o } from "../components/ProjectCard.js";
6
+ import { CreateProjectDialog as te } from "../components/CreateProjectDialog.js";
7
+ import { useWorkspacePermissions as ne } from "../hooks/useWorkspacePermissions.js";
8
+ import { useCallback as s, useEffect as c, useMemo as l, useState as u } from "react";
9
+ import { FolderKanban as d, Grid3x3 as re, List as f, Plus as p, Search as ie } from "lucide-react";
10
+ import { Fragment as ae, jsx as m, jsxs as h } from "react/jsx-runtime";
11
+ import { Button as g, Card as _, CardContent as v, Input as oe, Select as y, SelectContent as b, SelectItem as x, SelectTrigger as S, SelectValue as C, Skeleton as w } from "@burdenoff/fe-libs/ui";
12
+ import { useParams as se } from "react-router-dom";
13
+ import { useDebounce as ce } from "@burdenoff/fe-libs/shared/hooks";
14
+ import { useI18n as le } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
15
+ import { TagBadge as ue } from "@burdenoff/fe-libs/tag";
16
+ //#region src/pages/ProjectsListPage.tsx
17
+ function T() {
18
+ let { t: T } = le(), E = s((e, t) => {
19
+ let n = T(e);
20
+ return n === e ? t : n;
21
+ }, [T]), { workspaceId: D } = se(), { viewMode: O, setViewMode: k, projectFilters: A, setProjectFilters: j, clearProjectFilters: de, selectedProjectIds: M, toggleProjectSelection: N, clearProjectSelection: P, openCreateProjectDialog: fe, isCreateProjectDialogOpen: pe } = e(), [F, I] = u(A.search || ""), [L, R] = u([]), [z, B] = u(!0), V = ce(F, 500);
22
+ c(() => {
23
+ j({ search: V });
24
+ }, [V, j]), c(() => {
25
+ if (L.length === 0) {
26
+ j({
27
+ tagIds: void 0,
28
+ tagHierarchyPaths: void 0,
29
+ matchAllTags: void 0,
30
+ includeDescendants: void 0
31
+ });
32
+ return;
33
+ }
34
+ j({
35
+ tagIds: L.map((e) => e.tagId),
36
+ tagHierarchyPaths: L.map((e) => e.hierarchyPath).filter((e) => typeof e == "string" && e.length > 0),
37
+ matchAllTags: z,
38
+ includeDescendants: !0
39
+ });
40
+ }, [
41
+ L,
42
+ z,
43
+ j
44
+ ]), c(() => () => P(), [P]);
45
+ let { data: H, isLoading: U, error: W } = r(A, void 0, D), { mutateAsync: me } = i(D), { mutateAsync: he } = a(D), { mutateAsync: ge } = ee(D), G = l(() => H?.items.filter((e) => M.has(e.id)) ?? [], [H?.items, M]), K = l(() => G.filter((e) => !e.archived), [G]), q = l(() => G.filter((e) => e.archived), [G]), J = (H?.items.length ?? 0) > 0 && (H?.items ?? []).every((e) => M.has(e.id)), _e = (H?.items ?? []).some((e) => M.has(e.id)) && !J, { canListProjects: ve, canCreateProject: Y, canDeleteProject: X, canArchiveProject: Z, isLoading: ye } = ne();
46
+ if (ye) return /* @__PURE__ */ h("div", {
47
+ className: "space-y-4 p-6",
48
+ children: [/* @__PURE__ */ m(w, { className: "h-10 w-1/3" }), /* @__PURE__ */ h("div", {
49
+ className: "grid grid-cols-1 md:grid-cols-3 gap-4",
50
+ children: [
51
+ /* @__PURE__ */ m(w, { className: "h-32" }),
52
+ /* @__PURE__ */ m(w, { className: "h-32" }),
53
+ /* @__PURE__ */ m(w, { className: "h-32" })
54
+ ]
55
+ })]
56
+ });
57
+ if (!ve) return /* @__PURE__ */ m("div", {
58
+ className: "flex items-center justify-center min-h-[400px]",
59
+ children: /* @__PURE__ */ h("div", {
60
+ className: "text-center space-y-2",
61
+ children: [/* @__PURE__ */ m("h2", {
62
+ className: "text-lg font-semibold",
63
+ children: E("projectsList.accessDenied", "Access Denied")
64
+ }), /* @__PURE__ */ m("p", {
65
+ className: "text-sm text-muted-foreground",
66
+ children: E("projectsList.noPermissionToViewProjects", "You don't have permission to view projects.")
67
+ })]
68
+ })
69
+ });
70
+ let Q = () => {
71
+ fe({});
72
+ }, be = (e) => {
73
+ if (e === "all") {
74
+ let e = { ...A };
75
+ delete e.status, j(e);
76
+ } else j({ status: e });
77
+ }, xe = (e) => {
78
+ if (e === "all") {
79
+ let e = { ...A };
80
+ delete e.archived, j(e);
81
+ } else j({ archived: e === "true" });
82
+ }, $ = (e) => {
83
+ R((t) => t.some((t) => t.tagId === e.tagId) ? t.filter((t) => t.tagId !== e.tagId) : [...t, e]);
84
+ }, Se = () => {
85
+ I(""), R([]), B(!0), de();
86
+ }, Ce = (e) => {
87
+ (H?.items ?? []).forEach((t) => {
88
+ e !== M.has(t.id) && N(t.id);
89
+ });
90
+ };
91
+ return /* @__PURE__ */ h("div", {
92
+ className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
93
+ children: [
94
+ /* @__PURE__ */ h("div", {
95
+ className: "flex flex-col sm:flex-row sm:items-center justify-between gap-4",
96
+ children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h1", {
97
+ className: "text-2xl sm:text-3xl font-bold",
98
+ children: E("projectsList.pageTitle", "Projects")
99
+ }), /* @__PURE__ */ m("p", {
100
+ className: "text-muted-foreground",
101
+ children: E("projectsList.pageSubtitle", "Manage and organize your projects")
102
+ })] }), /* @__PURE__ */ h("div", {
103
+ className: "flex items-center gap-2",
104
+ children: [/* @__PURE__ */ h("div", {
105
+ className: "flex items-center gap-1 border rounded-lg p-1",
106
+ children: [/* @__PURE__ */ m(g, {
107
+ variant: O === "grid" ? "secondary" : "ghost",
108
+ size: "sm",
109
+ onClick: () => k("grid"),
110
+ className: "h-8 w-8 p-0",
111
+ "aria-label": E("projectsList.gridViewAriaLabel", "Show projects in grid view"),
112
+ children: /* @__PURE__ */ m(re, { size: 16 })
113
+ }), /* @__PURE__ */ m(g, {
114
+ variant: O === "list" ? "secondary" : "ghost",
115
+ size: "sm",
116
+ onClick: () => k("list"),
117
+ className: "h-8 w-8 p-0",
118
+ "aria-label": E("projectsList.listViewAriaLabel", "Show projects in list view"),
119
+ children: /* @__PURE__ */ m(f, { size: 16 })
120
+ })]
121
+ }), Y && /* @__PURE__ */ h(g, {
122
+ onClick: Q,
123
+ children: [/* @__PURE__ */ m(p, { className: "h-4 w-4 sm:mr-2" }), /* @__PURE__ */ m("span", {
124
+ className: "hidden sm:inline",
125
+ children: E("projectsList.createProject", "Create Project")
126
+ })]
127
+ })]
128
+ })]
129
+ }),
130
+ /* @__PURE__ */ h("div", {
131
+ className: "flex flex-col sm:flex-row gap-3",
132
+ children: [
133
+ /* @__PURE__ */ h("div", {
134
+ className: "relative flex-1",
135
+ children: [/* @__PURE__ */ m(ie, {
136
+ className: "absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground",
137
+ size: 18
138
+ }), /* @__PURE__ */ m(oe, {
139
+ placeholder: E("projectsList.searchPlaceholder", "Search projects..."),
140
+ value: F,
141
+ onChange: (e) => I(e.target.value),
142
+ className: "pl-[3.25rem]"
143
+ })]
144
+ }),
145
+ /* @__PURE__ */ h(y, {
146
+ value: A.status || "all",
147
+ onValueChange: be,
148
+ children: [/* @__PURE__ */ m(S, {
149
+ className: "w-full sm:w-[180px]",
150
+ children: /* @__PURE__ */ m(C, { placeholder: E("projectsList.filterByStatus", "Filter by status") })
151
+ }), /* @__PURE__ */ h(b, { children: [
152
+ /* @__PURE__ */ m(x, {
153
+ value: "all",
154
+ children: E("projectsList.statusAll", "All Statuses")
155
+ }),
156
+ /* @__PURE__ */ m(x, {
157
+ value: "ACTIVE",
158
+ children: E("projectsList.statusActive", "Active")
159
+ }),
160
+ /* @__PURE__ */ m(x, {
161
+ value: "INACTIVE",
162
+ children: E("projectsList.statusInactive", "Inactive")
163
+ })
164
+ ] })]
165
+ }),
166
+ /* @__PURE__ */ h(y, {
167
+ value: A.archived === void 0 ? "all" : A.archived ? "true" : "false",
168
+ onValueChange: xe,
169
+ children: [/* @__PURE__ */ m(S, {
170
+ className: "w-full sm:w-[180px]",
171
+ children: /* @__PURE__ */ m(C, { placeholder: E("projectsList.filterByArchive", "Filter by archive") })
172
+ }), /* @__PURE__ */ h(b, { children: [
173
+ /* @__PURE__ */ m(x, {
174
+ value: "all",
175
+ children: E("projectsList.archiveAll", "All Projects")
176
+ }),
177
+ /* @__PURE__ */ m(x, {
178
+ value: "false",
179
+ children: E("projectsList.archiveActiveProjects", "Active Projects")
180
+ }),
181
+ /* @__PURE__ */ m(x, {
182
+ value: "true",
183
+ children: E("projectsList.archiveArchived", "Archived")
184
+ })
185
+ ] })]
186
+ }),
187
+ (A.search || A.status || A.archived !== void 0 || L.length > 0) && /* @__PURE__ */ m(g, {
188
+ variant: "outline",
189
+ onClick: Se,
190
+ children: E("projectsList.clearFilters", "Clear Filters")
191
+ })
192
+ ]
193
+ }),
194
+ L.length > 0 && /* @__PURE__ */ h("div", {
195
+ className: "flex flex-col gap-3 rounded-lg border border-border bg-card px-4 py-3",
196
+ children: [/* @__PURE__ */ h("div", {
197
+ className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
198
+ children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
199
+ className: "text-sm font-medium",
200
+ children: E("projectsList.activeTagFilters", "Active tag filters")
201
+ }), /* @__PURE__ */ m("p", {
202
+ className: "text-xs text-muted-foreground",
203
+ children: E("projectsList.activeTagFiltersDescription", "Click a project tag to add or remove it from the current filter set.")
204
+ })] }), /* @__PURE__ */ h(y, {
205
+ value: z ? "all" : "any",
206
+ onValueChange: (e) => B(e === "all"),
207
+ children: [/* @__PURE__ */ m(S, {
208
+ className: "w-full sm:w-[180px]",
209
+ children: /* @__PURE__ */ m(C, { placeholder: E("projectsList.tagMatchMode", "Tag match mode") })
210
+ }), /* @__PURE__ */ h(b, { children: [/* @__PURE__ */ m(x, {
211
+ value: "all",
212
+ children: E("projectsList.tagMatchAll", "Match all tags")
213
+ }), /* @__PURE__ */ m(x, {
214
+ value: "any",
215
+ children: E("projectsList.tagMatchAny", "Match any tag")
216
+ })] })]
217
+ })]
218
+ }), /* @__PURE__ */ m("div", {
219
+ className: "flex flex-wrap gap-2",
220
+ children: L.map((e) => /* @__PURE__ */ m(ue, {
221
+ id: e.tagId,
222
+ label: e.label,
223
+ color: e.color ?? void 0,
224
+ icon: e.icon ?? void 0,
225
+ description: e.description ?? void 0,
226
+ removable: !0,
227
+ onRemove: () => $(e),
228
+ size: "sm"
229
+ }, e.tagId))
230
+ })]
231
+ }),
232
+ W && /* @__PURE__ */ m(_, {
233
+ className: "border-destructive",
234
+ children: /* @__PURE__ */ m(v, {
235
+ className: "pt-6",
236
+ children: /* @__PURE__ */ h("div", {
237
+ className: "flex flex-col items-center justify-center py-8 text-center",
238
+ children: [/* @__PURE__ */ m("p", {
239
+ className: "text-destructive font-semibold mb-2",
240
+ children: E("projectsList.errorLoading", "Error loading projects")
241
+ }), /* @__PURE__ */ m("p", {
242
+ className: "text-sm text-muted-foreground",
243
+ children: W instanceof Error ? W.message : E("projectsList.unknownError", "An unknown error occurred")
244
+ })]
245
+ })
246
+ })
247
+ }),
248
+ U && /* @__PURE__ */ m("div", {
249
+ className: "grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4",
250
+ children: Array.from({ length: 6 }).map((e, t) => /* @__PURE__ */ m(_, { children: /* @__PURE__ */ m(v, {
251
+ className: "pt-6",
252
+ children: /* @__PURE__ */ h("div", {
253
+ className: "space-y-3",
254
+ children: [
255
+ /* @__PURE__ */ m(w, { className: "h-12 w-12 rounded-lg" }),
256
+ /* @__PURE__ */ m(w, { className: "h-4 w-3/4" }),
257
+ /* @__PURE__ */ m(w, { className: "h-4 w-1/2" })
258
+ ]
259
+ })
260
+ }) }, t))
261
+ }),
262
+ !U && !W && H?.items.length === 0 && /* @__PURE__ */ m(_, { children: /* @__PURE__ */ m(v, {
263
+ className: "pt-6",
264
+ children: /* @__PURE__ */ h("div", {
265
+ className: "flex flex-col items-center justify-center py-12 text-center",
266
+ children: [
267
+ /* @__PURE__ */ m("div", {
268
+ className: "rounded-full bg-muted p-6 mb-4",
269
+ children: /* @__PURE__ */ m(d, {
270
+ size: 48,
271
+ className: "text-muted-foreground"
272
+ })
273
+ }),
274
+ /* @__PURE__ */ m("h3", {
275
+ className: "text-lg font-semibold mb-2",
276
+ children: E("projectsList.noProjectsFound", "No projects found")
277
+ }),
278
+ /* @__PURE__ */ m("p", {
279
+ className: "text-muted-foreground max-w-sm mb-4",
280
+ children: A.search ? E("projectsList.adjustSearchOrFilters", "Try adjusting your search or filters") : E("projectsList.createFirstProject", "Create your first project to get started organizing your work")
281
+ }),
282
+ !A.search && Y && /* @__PURE__ */ h(g, {
283
+ onClick: Q,
284
+ children: [/* @__PURE__ */ m(p, {
285
+ size: 16,
286
+ className: "mr-2"
287
+ }), E("projectsList.createProject", "Create Project")]
288
+ })
289
+ ]
290
+ })
291
+ }) }),
292
+ !U && !W && H && H.items.length > 0 && /* @__PURE__ */ h(ae, { children: [
293
+ /* @__PURE__ */ h("div", {
294
+ className: "flex flex-col gap-3 rounded-lg border bg-card p-4 sm:flex-row sm:items-center sm:justify-between",
295
+ children: [/* @__PURE__ */ h("label", {
296
+ className: "flex items-center gap-2 text-sm text-foreground",
297
+ children: [/* @__PURE__ */ m("input", {
298
+ type: "checkbox",
299
+ checked: J,
300
+ ref: (e) => {
301
+ e && (e.indeterminate = _e && !J);
302
+ },
303
+ onChange: (e) => Ce(e.target.checked),
304
+ "aria-label": E("projectsList.selectAllAriaLabel", "Select all projects"),
305
+ className: "h-4 w-4 rounded border-border text-primary"
306
+ }), /* @__PURE__ */ m("span", { children: E("projectsList.selectAllVisible", "Select all visible") })]
307
+ }), /* @__PURE__ */ h("div", {
308
+ className: "flex flex-wrap items-center gap-2",
309
+ children: [
310
+ /* @__PURE__ */ h("span", {
311
+ className: "text-sm text-muted-foreground",
312
+ children: [
313
+ M.size,
314
+ " ",
315
+ E("projectsList.selected", "selected")
316
+ ]
317
+ }),
318
+ M.size > 0 && /* @__PURE__ */ m(g, {
319
+ variant: "ghost",
320
+ size: "sm",
321
+ onClick: P,
322
+ children: E("projectsList.clearSelection", "Clear selection")
323
+ }),
324
+ Z && /* @__PURE__ */ h(g, {
325
+ variant: "outline",
326
+ size: "sm",
327
+ onClick: async () => {
328
+ K.length !== 0 && (await Promise.allSettled(K.map((e) => me(e.id))), P());
329
+ },
330
+ disabled: K.length === 0,
331
+ children: [E("projectsList.archiveSelected", "Archive Selected"), K.length > 0 ? ` (${K.length})` : ""]
332
+ }),
333
+ Z && /* @__PURE__ */ h(g, {
334
+ variant: "outline",
335
+ size: "sm",
336
+ onClick: async () => {
337
+ q.length !== 0 && (await Promise.allSettled(q.map((e) => he(e.id))), P());
338
+ },
339
+ disabled: q.length === 0,
340
+ children: [E("projectsList.unarchiveSelected", "Unarchive Selected"), q.length > 0 ? ` (${q.length})` : ""]
341
+ }),
342
+ X && /* @__PURE__ */ h(g, {
343
+ variant: "outline",
344
+ size: "sm",
345
+ onClick: async () => {
346
+ if (G.length === 0) return;
347
+ n("medium");
348
+ let e = E("projectsList.bulkDeleteConfirmPrefix", "Delete ") + G.length + " " + E("projectsList.bulkDeleteConfirmProject", "selected project") + (G.length === 1 ? "" : E("projectsList.bulkDeleteConfirmPluralSuffix", "s")) + E("projectsList.bulkDeleteConfirmSuffix", "? This cannot be undone."), r = await t({
349
+ title: "Delete projects",
350
+ message: e,
351
+ okButtonTitle: "Delete",
352
+ cancelButtonTitle: "Cancel"
353
+ });
354
+ (r === null ? window.confirm(e) : r) && (await Promise.allSettled(G.map((e) => ge(e.id))), P());
355
+ },
356
+ disabled: G.length === 0,
357
+ className: "text-destructive",
358
+ children: [E("projectsList.deleteSelected", "Delete Selected"), G.length > 0 ? ` (${G.length})` : ""]
359
+ })
360
+ ]
361
+ })]
362
+ }),
363
+ /* @__PURE__ */ m("div", {
364
+ className: O === "list" ? "space-y-3" : "grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4",
365
+ children: H.items.map((e) => /* @__PURE__ */ m(o, {
366
+ project: e,
367
+ selected: M.has(e.id),
368
+ canArchive: Z,
369
+ canDelete: X,
370
+ onTagClick: $,
371
+ onToggleSelect: (t) => {
372
+ t !== M.has(e.id) && N(e.id);
373
+ }
374
+ }, e.id))
375
+ }),
376
+ H.total > H.items.length && /* @__PURE__ */ h("div", {
377
+ className: "text-center text-sm text-muted-foreground",
378
+ children: [
379
+ E("projectsList.showingPrefix", "Showing"),
380
+ " ",
381
+ H.items.length,
382
+ " ",
383
+ E("projectsList.showingOf", "of"),
384
+ " ",
385
+ H.total,
386
+ " ",
387
+ E("projectsList.showingProjects", "projects")
388
+ ]
389
+ })
390
+ ] }),
391
+ pe && /* @__PURE__ */ m(te, { workspaceId: D })
392
+ ]
393
+ });
394
+ }
395
+ //#endregion
396
+ export { T as ProjectsListPage };
397
+
398
+ //# sourceMappingURL=ProjectsListPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectsListPage.js","names":[],"sources":["../../src/pages/ProjectsListPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { FolderKanban, Plus, Grid3x3, List, Search } from 'lucide-react';\nimport { TagBadge } from '@burdenoff/fe-libs/tag';\nimport {\n Button,\n Input,\n Card,\n CardContent,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport { useDebounce } from '@burdenoff/fe-libs/shared/hooks';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useWorkspacesStore } from '../store/workspacesStore';\nimport { nativeConfirm, nativeImpact } from '../utils/nativeBridge';\nimport { useProjects } from '../hooks/useProjects';\nimport {\n useArchiveProject,\n useDeleteProject,\n useUnarchiveProject,\n} from '../hooks/useProjectMutations';\nimport { ProjectCard } from '../components/ProjectCard';\nimport { CreateProjectDialog } from '../components/CreateProjectDialog';\nimport { useWorkspacePermissions } from '../hooks/useWorkspacePermissions';\nimport type { ProjectTag, Workspace } from '../types';\n\nexport function ProjectsListPage() {\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n const { workspaceId } = useParams<{ workspaceId: string }>();\n const {\n viewMode,\n setViewMode,\n projectFilters,\n setProjectFilters,\n clearProjectFilters,\n selectedProjectIds,\n toggleProjectSelection,\n clearProjectSelection,\n openCreateProjectDialog,\n isCreateProjectDialogOpen,\n } = useWorkspacesStore();\n\n const [searchValue, setSearchValue] = useState(projectFilters.search || '');\n const [activeTagFilters, setActiveTagFilters] = useState<ProjectTag[]>([]);\n const [matchAllTagFilters, setMatchAllTagFilters] = useState(true);\n const debouncedSearch = useDebounce(searchValue, 500);\n\n // Update filters when debounced search changes\n useEffect(() => {\n setProjectFilters({ search: debouncedSearch });\n }, [debouncedSearch, setProjectFilters]);\n\n useEffect(() => {\n if (activeTagFilters.length === 0) {\n setProjectFilters({\n tagIds: undefined,\n tagHierarchyPaths: undefined,\n matchAllTags: undefined,\n includeDescendants: undefined,\n });\n return;\n }\n\n setProjectFilters({\n tagIds: activeTagFilters.map((tag) => tag.tagId),\n tagHierarchyPaths: activeTagFilters\n .map((tag) => tag.hierarchyPath)\n .filter((tagPath): tagPath is string => typeof tagPath === 'string' && tagPath.length > 0),\n matchAllTags: matchAllTagFilters,\n includeDescendants: true,\n });\n }, [activeTagFilters, matchAllTagFilters, setProjectFilters]);\n\n useEffect(() => {\n return () => clearProjectSelection();\n }, [clearProjectSelection]);\n\n const { data, isLoading, error } = useProjects(projectFilters, undefined, workspaceId);\n const { mutateAsync: archiveProject } = useArchiveProject(workspaceId);\n const { mutateAsync: unarchiveProject } = useUnarchiveProject(workspaceId);\n const { mutateAsync: deleteProject } = useDeleteProject(workspaceId);\n\n const selectedProjects = useMemo(\n () => data?.items.filter((project) => selectedProjectIds.has(project.id)) ?? [],\n [data?.items, selectedProjectIds]\n );\n\n const archivableProjects = useMemo(\n () => selectedProjects.filter((project) => !project.archived),\n [selectedProjects]\n );\n\n const unarchivableProjects = useMemo(\n () => selectedProjects.filter((project) => project.archived),\n [selectedProjects]\n );\n\n const allVisibleSelected =\n (data?.items.length ?? 0) > 0 &&\n (data?.items ?? []).every((project) => selectedProjectIds.has(project.id));\n const partiallySelected =\n (data?.items ?? []).some((project) => selectedProjectIds.has(project.id)) &&\n !allVisibleSelected;\n\n const {\n canListProjects,\n canCreateProject,\n canDeleteProject,\n canArchiveProject,\n isLoading: permissionsLoading,\n } = useWorkspacePermissions();\n\n if (permissionsLoading) {\n return (\n <div className=\"space-y-4 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 (!canListProjects) {\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 {tr('projectsList.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'projectsList.noPermissionToViewProjects',\n \"You don't have permission to view projects.\"\n )}\n </p>\n </div>\n </div>\n );\n }\n\n const handleCreateProject = () => {\n openCreateProjectDialog({} as Workspace);\n };\n\n const handleStatusFilter = (value: string) => {\n if (value === 'all') {\n const nextFilters = { ...projectFilters };\n delete nextFilters.status;\n setProjectFilters(nextFilters);\n } else {\n setProjectFilters({ status: value as 'ACTIVE' | 'INACTIVE' | 'ARCHIVED' });\n }\n };\n\n const handleArchivedFilter = (value: string) => {\n if (value === 'all') {\n const nextFilters = { ...projectFilters };\n delete nextFilters.archived;\n setProjectFilters(nextFilters);\n } else {\n setProjectFilters({ archived: value === 'true' });\n }\n };\n\n const toggleTagFilter = (tag: ProjectTag) => {\n setActiveTagFilters((current) => {\n const exists = current.some((entry) => entry.tagId === tag.tagId);\n if (exists) {\n return current.filter((entry) => entry.tagId !== tag.tagId);\n }\n\n return [...current, tag];\n });\n };\n\n const clearAllProjectFilters = () => {\n setSearchValue('');\n setActiveTagFilters([]);\n setMatchAllTagFilters(true);\n clearProjectFilters();\n };\n\n const toggleAllProjects = (checked: boolean) => {\n (data?.items ?? []).forEach((project) => {\n const isSelected = selectedProjectIds.has(project.id);\n if (checked !== isSelected) {\n toggleProjectSelection(project.id);\n }\n });\n };\n\n const handleBulkArchive = async () => {\n if (archivableProjects.length === 0) return;\n await Promise.allSettled(archivableProjects.map((project) => archiveProject(project.id)));\n clearProjectSelection();\n };\n\n const handleBulkUnarchive = async () => {\n if (unarchivableProjects.length === 0) return;\n await Promise.allSettled(unarchivableProjects.map((project) => unarchiveProject(project.id)));\n clearProjectSelection();\n };\n\n const handleBulkDelete = async () => {\n if (selectedProjects.length === 0) return;\n void nativeImpact('medium');\n const message =\n tr('projectsList.bulkDeleteConfirmPrefix', 'Delete ') +\n selectedProjects.length +\n ' ' +\n tr('projectsList.bulkDeleteConfirmProject', 'selected project') +\n (selectedProjects.length === 1 ? '' : tr('projectsList.bulkDeleteConfirmPluralSuffix', 's')) +\n tr('projectsList.bulkDeleteConfirmSuffix', '? This cannot be undone.');\n const native = await nativeConfirm({\n title: 'Delete projects',\n message,\n okButtonTitle: 'Delete',\n cancelButtonTitle: 'Cancel',\n });\n const confirmed = native === null ? window.confirm(message) : native;\n if (!confirmed) return;\n\n await Promise.allSettled(selectedProjects.map((project) => deleteProject(project.id)));\n clearProjectSelection();\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 justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">\n {tr('projectsList.pageTitle', 'Projects')}\n </h1>\n <p className=\"text-muted-foreground\">\n {tr('projectsList.pageSubtitle', 'Manage and organize your projects')}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n {/* View mode toggle */}\n <div className=\"flex items-center gap-1 border rounded-lg p-1\">\n <Button\n variant={viewMode === 'grid' ? 'secondary' : 'ghost'}\n size=\"sm\"\n onClick={() => setViewMode('grid')}\n className=\"h-8 w-8 p-0\"\n aria-label={tr('projectsList.gridViewAriaLabel', 'Show projects in grid view')}\n >\n <Grid3x3 size={16} />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'secondary' : 'ghost'}\n size=\"sm\"\n onClick={() => setViewMode('list')}\n className=\"h-8 w-8 p-0\"\n aria-label={tr('projectsList.listViewAriaLabel', 'Show projects in list view')}\n >\n <List size={16} />\n </Button>\n </div>\n {canCreateProject && (\n <Button onClick={handleCreateProject}>\n <Plus className=\"h-4 w-4 sm:mr-2\" />\n <span className=\"hidden sm:inline\">\n {tr('projectsList.createProject', 'Create Project')}\n </span>\n </Button>\n )}\n </div>\n </div>\n\n {/* Filters & Search */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"relative flex-1\">\n <Search\n className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground\"\n size={18}\n />\n <Input\n placeholder={tr('projectsList.searchPlaceholder', 'Search projects...')}\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n className=\"pl-[3.25rem]\"\n />\n </div>\n <Select value={projectFilters.status || 'all'} onValueChange={handleStatusFilter}>\n <SelectTrigger className=\"w-full sm:w-[180px]\">\n <SelectValue placeholder={tr('projectsList.filterByStatus', 'Filter by status')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">{tr('projectsList.statusAll', 'All Statuses')}</SelectItem>\n <SelectItem value=\"ACTIVE\">{tr('projectsList.statusActive', 'Active')}</SelectItem>\n <SelectItem value=\"INACTIVE\">\n {tr('projectsList.statusInactive', 'Inactive')}\n </SelectItem>\n </SelectContent>\n </Select>\n <Select\n value={\n projectFilters.archived === undefined\n ? 'all'\n : projectFilters.archived\n ? 'true'\n : 'false'\n }\n onValueChange={handleArchivedFilter}\n >\n <SelectTrigger className=\"w-full sm:w-[180px]\">\n <SelectValue placeholder={tr('projectsList.filterByArchive', 'Filter by archive')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">{tr('projectsList.archiveAll', 'All Projects')}</SelectItem>\n <SelectItem value=\"false\">\n {tr('projectsList.archiveActiveProjects', 'Active Projects')}\n </SelectItem>\n <SelectItem value=\"true\">{tr('projectsList.archiveArchived', 'Archived')}</SelectItem>\n </SelectContent>\n </Select>\n {(projectFilters.search ||\n projectFilters.status ||\n projectFilters.archived !== undefined ||\n activeTagFilters.length > 0) && (\n <Button variant=\"outline\" onClick={clearAllProjectFilters}>\n {tr('projectsList.clearFilters', 'Clear Filters')}\n </Button>\n )}\n </div>\n\n {activeTagFilters.length > 0 && (\n <div className=\"flex flex-col gap-3 rounded-lg border border-border bg-card px-4 py-3\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <p className=\"text-sm font-medium\">\n {tr('projectsList.activeTagFilters', 'Active tag filters')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'projectsList.activeTagFiltersDescription',\n 'Click a project tag to add or remove it from the current filter set.'\n )}\n </p>\n </div>\n <Select\n value={matchAllTagFilters ? 'all' : 'any'}\n onValueChange={(value) => setMatchAllTagFilters(value === 'all')}\n >\n <SelectTrigger className=\"w-full sm:w-[180px]\">\n <SelectValue placeholder={tr('projectsList.tagMatchMode', 'Tag match mode')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n {tr('projectsList.tagMatchAll', 'Match all tags')}\n </SelectItem>\n <SelectItem value=\"any\">\n {tr('projectsList.tagMatchAny', 'Match any tag')}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex flex-wrap gap-2\">\n {activeTagFilters.map((tag) => (\n <TagBadge\n key={tag.tagId}\n id={tag.tagId}\n label={tag.label}\n color={tag.color ?? undefined}\n icon={tag.icon ?? undefined}\n description={tag.description ?? undefined}\n removable\n onRemove={() => toggleTagFilter(tag)}\n size=\"sm\"\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Error State */}\n {error && (\n <Card className=\"border-destructive\">\n <CardContent className=\"pt-6\">\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\n <p className=\"text-destructive font-semibold mb-2\">\n {tr('projectsList.errorLoading', 'Error loading projects')}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {error instanceof Error\n ? error.message\n : tr('projectsList.unknownError', 'An unknown error occurred')}\n </p>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Loading State */}\n {isLoading && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\n {Array.from({ length: 6 }).map((_, i) => (\n <Card key={i}>\n <CardContent className=\"pt-6\">\n <div className=\"space-y-3\">\n <Skeleton className=\"h-12 w-12 rounded-lg\" />\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {/* Empty State */}\n {!isLoading && !error && data?.items.length === 0 && (\n <Card>\n <CardContent className=\"pt-6\">\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"rounded-full bg-muted p-6 mb-4\">\n <FolderKanban size={48} className=\"text-muted-foreground\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">\n {tr('projectsList.noProjectsFound', 'No projects found')}\n </h3>\n <p className=\"text-muted-foreground max-w-sm mb-4\">\n {projectFilters.search\n ? tr('projectsList.adjustSearchOrFilters', 'Try adjusting your search or filters')\n : tr(\n 'projectsList.createFirstProject',\n 'Create your first project to get started organizing your work'\n )}\n </p>\n {!projectFilters.search && canCreateProject && (\n <Button onClick={handleCreateProject}>\n <Plus size={16} className=\"mr-2\" />\n {tr('projectsList.createProject', 'Create Project')}\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Projects Grid */}\n {!isLoading && !error && data && data.items.length > 0 && (\n <>\n <div className=\"flex flex-col gap-3 rounded-lg border bg-card p-4 sm:flex-row sm:items-center sm:justify-between\">\n <label className=\"flex items-center gap-2 text-sm text-foreground\">\n <input\n type=\"checkbox\"\n checked={allVisibleSelected}\n ref={(input) => {\n if (input) {\n input.indeterminate = partiallySelected && !allVisibleSelected;\n }\n }}\n onChange={(event) => toggleAllProjects(event.target.checked)}\n aria-label={tr('projectsList.selectAllAriaLabel', 'Select all projects')}\n className=\"h-4 w-4 rounded border-border text-primary\"\n />\n <span>{tr('projectsList.selectAllVisible', 'Select all visible')}</span>\n </label>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">\n {selectedProjectIds.size} {tr('projectsList.selected', 'selected')}\n </span>\n {selectedProjectIds.size > 0 && (\n <Button variant=\"ghost\" size=\"sm\" onClick={clearProjectSelection}>\n {tr('projectsList.clearSelection', 'Clear selection')}\n </Button>\n )}\n {canArchiveProject && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleBulkArchive}\n disabled={archivableProjects.length === 0}\n >\n {tr('projectsList.archiveSelected', 'Archive Selected')}\n {archivableProjects.length > 0 ? ` (${archivableProjects.length})` : ''}\n </Button>\n )}\n {canArchiveProject && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleBulkUnarchive}\n disabled={unarchivableProjects.length === 0}\n >\n {tr('projectsList.unarchiveSelected', 'Unarchive Selected')}\n {unarchivableProjects.length > 0 ? ` (${unarchivableProjects.length})` : ''}\n </Button>\n )}\n {canDeleteProject && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleBulkDelete}\n disabled={selectedProjects.length === 0}\n className=\"text-destructive\"\n >\n {tr('projectsList.deleteSelected', 'Delete Selected')}\n {selectedProjects.length > 0 ? ` (${selectedProjects.length})` : ''}\n </Button>\n )}\n </div>\n </div>\n\n <div\n className={\n viewMode === 'list'\n ? 'space-y-3'\n : 'grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4'\n }\n >\n {data.items.map((project) => (\n <ProjectCard\n key={project.id}\n project={project}\n selected={selectedProjectIds.has(project.id)}\n canArchive={canArchiveProject}\n canDelete={canDeleteProject}\n onTagClick={toggleTagFilter}\n onToggleSelect={(checked) => {\n const isSelected = selectedProjectIds.has(project.id);\n if (checked !== isSelected) {\n toggleProjectSelection(project.id);\n }\n }}\n />\n ))}\n </div>\n\n {/* Pagination Info */}\n {data.total > data.items.length && (\n <div className=\"text-center text-sm text-muted-foreground\">\n {tr('projectsList.showingPrefix', 'Showing')} {data.items.length}{' '}\n {tr('projectsList.showingOf', 'of')} {data.total}{' '}\n {tr('projectsList.showingProjects', 'projects')}\n </div>\n )}\n </>\n )}\n\n {/* Create Project Dialog */}\n {isCreateProjectDialogOpen && <CreateProjectDialog workspaceId={workspaceId} />}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA+BA,SAAgB,IAAmB;CACjC,IAAM,EAAE,SAAM,IAAS,EACjB,IAAK,GACR,GAAa,MAA6B;EACzC,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;IAEpC,CAAC,EAAE,CACJ,EAEK,EAAE,mBAAgB,IAAoC,EACtD,EACJ,aACA,gBACA,mBACA,sBACA,yBACA,uBACA,2BACA,0BACA,6BACA,kCACE,GAAoB,EAElB,CAAC,GAAa,KAAkB,EAAS,EAAe,UAAU,GAAG,EACrE,CAAC,GAAkB,KAAuB,EAAuB,EAAE,CAAC,EACpE,CAAC,GAAoB,KAAyB,EAAS,GAAK,EAC5D,IAAkB,GAAY,GAAa,IAAI;AA4BrD,CAzBA,QAAgB;AACd,IAAkB,EAAE,QAAQ,GAAiB,CAAC;IAC7C,CAAC,GAAiB,EAAkB,CAAC,EAExC,QAAgB;AACd,MAAI,EAAiB,WAAW,GAAG;AACjC,KAAkB;IAChB,QAAQ,KAAA;IACR,mBAAmB,KAAA;IACnB,cAAc,KAAA;IACd,oBAAoB,KAAA;IACrB,CAAC;AACF;;AAGF,IAAkB;GAChB,QAAQ,EAAiB,KAAK,MAAQ,EAAI,MAAM;GAChD,mBAAmB,EAChB,KAAK,MAAQ,EAAI,cAAc,CAC/B,QAAQ,MAA+B,OAAO,KAAY,YAAY,EAAQ,SAAS,EAAE;GAC5F,cAAc;GACd,oBAAoB;GACrB,CAAC;IACD;EAAC;EAAkB;EAAoB;EAAkB,CAAC,EAE7D,cACe,GAAuB,EACnC,CAAC,EAAsB,CAAC;CAE3B,IAAM,EAAE,SAAM,cAAW,aAAU,EAAY,GAAgB,KAAA,GAAW,EAAY,EAChF,EAAE,aAAa,OAAmB,EAAkB,EAAY,EAChE,EAAE,aAAa,OAAqB,EAAoB,EAAY,EACpE,EAAE,aAAa,OAAkB,GAAiB,EAAY,EAE9D,IAAmB,QACjB,GAAM,MAAM,QAAQ,MAAY,EAAmB,IAAI,EAAQ,GAAG,CAAC,IAAI,EAAE,EAC/E,CAAC,GAAM,OAAO,EAAmB,CAClC,EAEK,IAAqB,QACnB,EAAiB,QAAQ,MAAY,CAAC,EAAQ,SAAS,EAC7D,CAAC,EAAiB,CACnB,EAEK,IAAuB,QACrB,EAAiB,QAAQ,MAAY,EAAQ,SAAS,EAC5D,CAAC,EAAiB,CACnB,EAEK,KACH,GAAM,MAAM,UAAU,KAAK,MAC3B,GAAM,SAAS,EAAE,EAAE,OAAO,MAAY,EAAmB,IAAI,EAAQ,GAAG,CAAC,EACtE,MACH,GAAM,SAAS,EAAE,EAAE,MAAM,MAAY,EAAmB,IAAI,EAAQ,GAAG,CAAC,IACzE,CAAC,GAEG,EACJ,qBACA,qBACA,qBACA,sBACA,WAAW,OACT,IAAyB;AAE7B,KAAI,GACF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD,EAAU,WAAU,cAAe,CAAA,EACnC,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAU,WAAU,QAAS,CAAA;IAC7B,kBAAC,GAAD,EAAU,WAAU,QAAS,CAAA;IAC7B,kBAAC,GAAD,EAAU,WAAU,QAAS,CAAA;IACzB;KACF;;AAIV,KAAI,CAAC,GACH,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAG,6BAA6B,gBAAgB;IAC9C,CAAA,EACL,kBAAC,KAAD;IAAG,WAAU;cACV,EACC,2CACA,8CACD;IACC,CAAA,CACA;;EACF,CAAA;CAIV,IAAM,UAA4B;AAChC,KAAwB,EAAE,CAAc;IAGpC,MAAsB,MAAkB;AAC5C,MAAI,MAAU,OAAO;GACnB,IAAM,IAAc,EAAE,GAAG,GAAgB;AAEzC,GADA,OAAO,EAAY,QACnB,EAAkB,EAAY;QAE9B,GAAkB,EAAE,QAAQ,GAA6C,CAAC;IAIxE,MAAwB,MAAkB;AAC9C,MAAI,MAAU,OAAO;GACnB,IAAM,IAAc,EAAE,GAAG,GAAgB;AAEzC,GADA,OAAO,EAAY,UACnB,EAAkB,EAAY;QAE9B,GAAkB,EAAE,UAAU,MAAU,QAAQ,CAAC;IAI/C,KAAmB,MAAoB;AAC3C,KAAqB,MACJ,EAAQ,MAAM,MAAU,EAAM,UAAU,EAAI,MAAM,GAExD,EAAQ,QAAQ,MAAU,EAAM,UAAU,EAAI,MAAM,GAGtD,CAAC,GAAG,GAAS,EAAI,CACxB;IAGE,WAA+B;AAInC,EAHA,EAAe,GAAG,EAClB,EAAoB,EAAE,CAAC,EACvB,EAAsB,GAAK,EAC3B,IAAqB;IAGjB,MAAqB,MAAqB;AAC9C,GAAC,GAAM,SAAS,EAAE,EAAE,SAAS,MAAY;AAEvC,GAAI,MADe,EAAmB,IAAI,EAAQ,GAAG,IAEnD,EAAuB,EAAQ,GAAG;IAEpC;;AAsCJ,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GAEE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAG,0BAA0B,WAAW;KACtC,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eACV,EAAG,6BAA6B,oCAAoC;KACnE,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CAEE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,SAAS,MAAa,SAAS,cAAc;OAC7C,MAAK;OACL,eAAe,EAAY,OAAO;OAClC,WAAU;OACV,cAAY,EAAG,kCAAkC,6BAA6B;iBAE9E,kBAAC,IAAD,EAAS,MAAM,IAAM,CAAA;OACd,CAAA,EACT,kBAAC,GAAD;OACE,SAAS,MAAa,SAAS,cAAc;OAC7C,MAAK;OACL,eAAe,EAAY,OAAO;OAClC,WAAU;OACV,cAAY,EAAG,kCAAkC,6BAA6B;iBAE9E,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;OACX,CAAA,CACL;SACL,KACC,kBAAC,GAAD;MAAQ,SAAS;gBAAjB,CACE,kBAAC,GAAD,EAAM,WAAU,mBAAoB,CAAA,EACpC,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAG,8BAA8B,iBAAiB;OAC9C,CAAA,CACA;QAEP;OACF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,IAAD;OACE,WAAU;OACV,MAAM;OACN,CAAA,EACF,kBAAC,IAAD;OACE,aAAa,EAAG,kCAAkC,qBAAqB;OACvE,OAAO;OACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;OAC/C,WAAU;OACV,CAAA,CACE;;KACN,kBAAC,GAAD;MAAQ,OAAO,EAAe,UAAU;MAAO,eAAe;gBAA9D,CACE,kBAAC,GAAD;OAAe,WAAU;iBACvB,kBAAC,GAAD,EAAa,aAAa,EAAG,+BAA+B,mBAAmB,EAAI,CAAA;OACrE,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA;OACE,kBAAC,GAAD;QAAY,OAAM;kBAAO,EAAG,0BAA0B,eAAe;QAAc,CAAA;OACnF,kBAAC,GAAD;QAAY,OAAM;kBAAU,EAAG,6BAA6B,SAAS;QAAc,CAAA;OACnF,kBAAC,GAAD;QAAY,OAAM;kBACf,EAAG,+BAA+B,WAAW;QACnC,CAAA;OACC,EAAA,CAAA,CACT;;KACT,kBAAC,GAAD;MACE,OACE,EAAe,aAAa,KAAA,IACxB,QACA,EAAe,WACb,SACA;MAER,eAAe;gBARjB,CAUE,kBAAC,GAAD;OAAe,WAAU;iBACvB,kBAAC,GAAD,EAAa,aAAa,EAAG,gCAAgC,oBAAoB,EAAI,CAAA;OACvE,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA;OACE,kBAAC,GAAD;QAAY,OAAM;kBAAO,EAAG,2BAA2B,eAAe;QAAc,CAAA;OACpF,kBAAC,GAAD;QAAY,OAAM;kBACf,EAAG,sCAAsC,kBAAkB;QACjD,CAAA;OACb,kBAAC,GAAD;QAAY,OAAM;kBAAQ,EAAG,gCAAgC,WAAW;QAAc,CAAA;OACxE,EAAA,CAAA,CACT;;MACP,EAAe,UACf,EAAe,UACf,EAAe,aAAa,KAAA,KAC5B,EAAiB,SAAS,MAC1B,kBAAC,GAAD;MAAQ,SAAQ;MAAU,SAAS;gBAChC,EAAG,6BAA6B,gBAAgB;MAC1C,CAAA;KAEP;;GAEL,EAAiB,SAAS,KACzB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAG,iCAAiC,qBAAqB;MACxD,CAAA,EACJ,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,4CACA,uEACD;MACC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;MACE,OAAO,IAAqB,QAAQ;MACpC,gBAAgB,MAAU,EAAsB,MAAU,MAAM;gBAFlE,CAIE,kBAAC,GAAD;OAAe,WAAU;iBACvB,kBAAC,GAAD,EAAa,aAAa,EAAG,6BAA6B,iBAAiB,EAAI,CAAA;OACjE,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;OAAY,OAAM;iBACf,EAAG,4BAA4B,iBAAiB;OACtC,CAAA,EACb,kBAAC,GAAD;OAAY,OAAM;iBACf,EAAG,4BAA4B,gBAAgB;OACrC,CAAA,CACC,EAAA,CAAA,CACT;QACL;QAEN,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAiB,KAAK,MACrB,kBAAC,IAAD;MAEE,IAAI,EAAI;MACR,OAAO,EAAI;MACX,OAAO,EAAI,SAAS,KAAA;MACpB,MAAM,EAAI,QAAQ,KAAA;MAClB,aAAa,EAAI,eAAe,KAAA;MAChC,WAAA;MACA,gBAAgB,EAAgB,EAAI;MACpC,MAAK;MACL,EATK,EAAI,MAST,CACF;KACE,CAAA,CACF;;GAIP,KACC,kBAAC,GAAD;IAAM,WAAU;cACd,kBAAC,GAAD;KAAa,WAAU;eACrB,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAG,6BAA6B,yBAAyB;OACxD,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBACV,aAAiB,QACd,EAAM,UACN,EAAG,6BAA6B,4BAA4B;OAC9D,CAAA,CACA;;KACM,CAAA;IACT,CAAA;GAIR,KACC,kBAAC,OAAD;IAAK,WAAU;cACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAa,WAAU;eACrB,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;OAC7C,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA;OAClC,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA;OAC9B;;KACM,CAAA,EACT,EARI,EAQJ,CACP;IACE,CAAA;GAIP,CAAC,KAAa,CAAC,KAAS,GAAM,MAAM,WAAW,KAC9C,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAa,WAAU;cACrB,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD;QAAc,MAAM;QAAI,WAAU;QAA0B,CAAA;OACxD,CAAA;MACN,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAG,gCAAgC,oBAAoB;OACrD,CAAA;MACL,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAe,SACZ,EAAG,sCAAsC,uCAAuC,GAChF,EACE,mCACA,gEACD;OACH,CAAA;MACH,CAAC,EAAe,UAAU,KACzB,kBAAC,GAAD;OAAQ,SAAS;iBAAjB,CACE,kBAAC,GAAD;QAAM,MAAM;QAAI,WAAU;QAAS,CAAA,EAClC,EAAG,8BAA8B,iBAAiB,CAC5C;;MAEP;;IACM,CAAA,EACT,CAAA;GAIR,CAAC,KAAa,CAAC,KAAS,KAAQ,EAAK,MAAM,SAAS,KACnD,kBAAA,IAAA,EAAA,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,SAAD;MAAO,WAAU;gBAAjB,CACE,kBAAC,SAAD;OACE,MAAK;OACL,SAAS;OACT,MAAM,MAAU;AACd,QAAI,MACF,EAAM,gBAAgB,MAAqB,CAAC;;OAGhD,WAAW,MAAU,GAAkB,EAAM,OAAO,QAAQ;OAC5D,cAAY,EAAG,mCAAmC,sBAAsB;OACxE,WAAU;OACV,CAAA,EACF,kBAAC,QAAD,EAAA,UAAO,EAAG,iCAAiC,qBAAqB,EAAQ,CAAA,CAClE;SAER,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,QAAD;QAAM,WAAU;kBAAhB;SACG,EAAmB;SAAK;SAAE,EAAG,yBAAyB,WAAW;SAC7D;;OACN,EAAmB,OAAO,KACzB,kBAAC,GAAD;QAAQ,SAAQ;QAAQ,MAAK;QAAK,SAAS;kBACxC,EAAG,+BAA+B,kBAAkB;QAC9C,CAAA;OAEV,KACC,kBAAC,GAAD;QACE,SAAQ;QACR,MAAK;QACL,SA7RU,YAAY;AAChC,WAAmB,WAAW,MAClC,MAAM,QAAQ,WAAW,EAAmB,KAAK,MAAY,GAAe,EAAQ,GAAG,CAAC,CAAC,EACzF,GAAuB;;QA2RT,UAAU,EAAmB,WAAW;kBAJ1C,CAMG,EAAG,gCAAgC,mBAAmB,EACtD,EAAmB,SAAS,IAAI,KAAK,EAAmB,OAAO,KAAK,GAC9D;;OAEV,KACC,kBAAC,GAAD;QACE,SAAQ;QACR,MAAK;QACL,SAlSY,YAAY;AAClC,WAAqB,WAAW,MACpC,MAAM,QAAQ,WAAW,EAAqB,KAAK,MAAY,GAAiB,EAAQ,GAAG,CAAC,CAAC,EAC7F,GAAuB;;QAgST,UAAU,EAAqB,WAAW;kBAJ5C,CAMG,EAAG,kCAAkC,qBAAqB,EAC1D,EAAqB,SAAS,IAAI,KAAK,EAAqB,OAAO,KAAK,GAClE;;OAEV,KACC,kBAAC,GAAD;QACE,SAAQ;QACR,MAAK;QACL,SAvSS,YAAY;AACnC,aAAI,EAAiB,WAAW,EAAG;AAC9B,WAAa,SAAS;SAC3B,IAAM,IACJ,EAAG,wCAAwC,UAAU,GACrD,EAAiB,SACjB,MACA,EAAG,yCAAyC,mBAAmB,IAC9D,EAAiB,WAAW,IAAI,KAAK,EAAG,8CAA8C,IAAI,IAC3F,EAAG,wCAAwC,2BAA2B,EAClE,IAAS,MAAM,EAAc;UACjC,OAAO;UACP;UACA,eAAe;UACf,mBAAmB;UACpB,CAAC;AACgB,gBAAW,OAAO,OAAO,QAAQ,EAAQ,GAAG,OAG9D,MAAM,QAAQ,WAAW,EAAiB,KAAK,MAAY,GAAc,EAAQ,GAAG,CAAC,CAAC,EACtF,GAAuB;;QAoRT,UAAU,EAAiB,WAAW;QACtC,WAAU;kBALZ,CAOG,EAAG,+BAA+B,kBAAkB,EACpD,EAAiB,SAAS,IAAI,KAAK,EAAiB,OAAO,KAAK,GAC1D;;OAEP;QACF;;IAEN,kBAAC,OAAD;KACE,WACE,MAAa,SACT,cACA;eAGL,EAAK,MAAM,KAAK,MACf,kBAAC,GAAD;MAEW;MACT,UAAU,EAAmB,IAAI,EAAQ,GAAG;MAC5C,YAAY;MACZ,WAAW;MACX,YAAY;MACZ,iBAAiB,MAAY;AAE3B,OAAI,MADe,EAAmB,IAAI,EAAQ,GAAG,IAEnD,EAAuB,EAAQ,GAAG;;MAGtC,EAZK,EAAQ,GAYb,CACF;KACE,CAAA;IAGL,EAAK,QAAQ,EAAK,MAAM,UACvB,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,EAAG,8BAA8B,UAAU;MAAC;MAAE,EAAK,MAAM;MAAQ;MACjE,EAAG,0BAA0B,KAAK;MAAC;MAAE,EAAK;MAAO;MACjD,EAAG,gCAAgC,WAAW;MAC3C;;IAEP,EAAA,CAAA;GAIJ,MAA6B,kBAAC,IAAD,EAAkC,gBAAe,CAAA;GAC3E"}
@@ -0,0 +1,2 @@
1
+ export declare function WorkspaceDetailPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=WorkspaceDetailPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/WorkspaceDetailPage.tsx"],"names":[],"mappings":"AAqBA,wBAAgB,mBAAmB,4CA8PlC"}