@burdenoff/microfe-workspaces 2026.520.1 → 2026.529.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/dist/WorkspacesRoot.js +4 -1
  2. package/dist/WorkspacesRoot.js.map +1 -1
  3. package/dist/WorkspacesRoutes.js +4 -4
  4. package/dist/WorkspacesRoutes.js.map +1 -1
  5. package/dist/components/CreateProjectDialog.js +1 -1
  6. package/dist/components/CreateProjectDialog.js.map +1 -1
  7. package/dist/components/CreateWorkspaceDialog.js +2 -2
  8. package/dist/components/CreateWorkspaceDialog.js.map +1 -1
  9. package/dist/components/InviteMemberDialog.js +2 -2
  10. package/dist/components/InviteMemberDialog.js.map +1 -1
  11. package/dist/components/MemberListItem.js +71 -86
  12. package/dist/components/MemberListItem.js.map +1 -1
  13. package/dist/components/ProjectCard.js +12 -10
  14. package/dist/components/ProjectCard.js.map +1 -1
  15. package/dist/components/WorkspaceCard.js.map +1 -1
  16. package/dist/components/WorkspacesErrorBoundary.js +12 -4
  17. package/dist/components/WorkspacesErrorBoundary.js.map +1 -1
  18. package/dist/components/tags/ProjectTagsWidget.js +248 -0
  19. package/dist/components/tags/ProjectTagsWidget.js.map +1 -0
  20. package/dist/hooks/useOrgsWithPermission.js +1 -1
  21. package/dist/hooks/useOrgsWithPermission.js.map +1 -1
  22. package/dist/hooks/useWorkspacesEventEmitter.js.map +1 -1
  23. package/dist/hooks/useWorkspacesPageView.js +6 -4
  24. package/dist/hooks/useWorkspacesPageView.js.map +1 -1
  25. package/dist/pages/CreateWorkspacePage.js +239 -224
  26. package/dist/pages/CreateWorkspacePage.js.map +1 -1
  27. package/dist/pages/InviteAcceptancePage.js +28 -28
  28. package/dist/pages/InviteAcceptancePage.js.map +1 -1
  29. package/dist/pages/MembersListPage.js +380 -352
  30. package/dist/pages/MembersListPage.js.map +1 -1
  31. package/dist/pages/ProjectDetailPage.js +96 -97
  32. package/dist/pages/ProjectDetailPage.js.map +1 -1
  33. package/dist/pages/ProjectsListPage.js +307 -304
  34. package/dist/pages/ProjectsListPage.js.map +1 -1
  35. package/dist/pages/WorkspaceSettingsPage.js +94 -91
  36. package/dist/pages/WorkspaceSettingsPage.js.map +1 -1
  37. package/dist/pages/WorkspacesListPage.js +1 -1
  38. package/dist/pages/WorkspacesListPage.js.map +1 -1
  39. package/dist/pages/dashboard/DashboardCustomizer.js +68 -68
  40. package/dist/pages/dashboard/DashboardCustomizer.js.map +1 -1
  41. package/dist/pages/dashboard/DashboardGrid.js +52 -41
  42. package/dist/pages/dashboard/DashboardGrid.js.map +1 -1
  43. package/dist/pages/dashboard/DashboardPage.js +74 -65
  44. package/dist/pages/dashboard/DashboardPage.js.map +1 -1
  45. package/dist/pages/dashboard/WidgetWrapper.js +3 -3
  46. package/dist/pages/dashboard/WidgetWrapper.js.map +1 -1
  47. package/dist/pages/dashboard/config.js +126 -30
  48. package/dist/pages/dashboard/config.js.map +1 -1
  49. package/dist/pages/dashboard/hooks/useDashboardData.js +39 -2
  50. package/dist/pages/dashboard/hooks/useDashboardData.js.map +1 -1
  51. package/dist/pages/dashboard/widgets/AgentsWidget.js +109 -0
  52. package/dist/pages/dashboard/widgets/AgentsWidget.js.map +1 -0
  53. package/dist/pages/dashboard/widgets/GroupsWidget.js +6 -5
  54. package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -1
  55. package/dist/pages/dashboard/widgets/MembersWidget.js +6 -6
  56. package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -1
  57. package/dist/pages/dashboard/widgets/ProjectsWidget.js +8 -7
  58. package/dist/pages/dashboard/widgets/ProjectsWidget.js.map +1 -1
  59. package/dist/pages/dashboard/widgets/QuickActionsWidget.js +72 -18
  60. package/dist/pages/dashboard/widgets/QuickActionsWidget.js.map +1 -1
  61. package/dist/pages/dashboard/widgets/RecentActivityWidget.js +3 -3
  62. package/dist/pages/dashboard/widgets/RecentActivityWidget.js.map +1 -1
  63. package/dist/pages/dashboard/widgets/SessionsWidget.js +78 -0
  64. package/dist/pages/dashboard/widgets/SessionsWidget.js.map +1 -0
  65. package/dist/pages/dashboard/widgets/StorageWidget.js +35 -20
  66. package/dist/pages/dashboard/widgets/StorageWidget.js.map +1 -1
  67. package/dist/pages/dashboard/widgets/TagCloudWidget.js +2 -2
  68. package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -1
  69. package/dist/pages/dashboard/widgets/TipsWidget.js +81 -22
  70. package/dist/pages/dashboard/widgets/TipsWidget.js.map +1 -1
  71. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js +6 -5
  72. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js.map +1 -1
  73. package/dist/pages/dashboard/widgets/VibesWidget.js +64 -0
  74. package/dist/pages/dashboard/widgets/VibesWidget.js.map +1 -0
  75. package/dist/pages/dashboard/widgets/WelcomeWidget.js +5 -5
  76. package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -1
  77. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +3 -3
  78. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -1
  79. package/dist/pages/dashboard/widgets/WorkspacesWidget.js +6 -5
  80. package/dist/pages/dashboard/widgets/WorkspacesWidget.js.map +1 -1
  81. package/dist/providers/WorkspacesProvider.js +1 -1
  82. package/dist/providers/WorkspacesProvider.js.map +1 -1
  83. package/dist/store/workspacesStore.js.map +1 -1
  84. package/dist/utils/formatters.js +21 -16
  85. package/dist/utils/formatters.js.map +1 -1
  86. package/dist/utils/telemetryError.js +1 -1
  87. package/dist/utils/telemetryError.js.map +1 -1
  88. package/package.json +7 -7
  89. package/dist/WorkspacesRoot.d.ts +0 -35
  90. package/dist/WorkspacesRoot.d.ts.map +0 -1
  91. package/dist/WorkspacesRoutes.d.ts +0 -10
  92. package/dist/WorkspacesRoutes.d.ts.map +0 -1
  93. package/dist/components/CreateProjectDialog.d.ts +0 -6
  94. package/dist/components/CreateProjectDialog.d.ts.map +0 -1
  95. package/dist/components/CreateWorkspaceDialog.d.ts +0 -2
  96. package/dist/components/CreateWorkspaceDialog.d.ts.map +0 -1
  97. package/dist/components/InviteMemberDialog.d.ts +0 -7
  98. package/dist/components/InviteMemberDialog.d.ts.map +0 -1
  99. package/dist/components/MemberListItem.d.ts +0 -11
  100. package/dist/components/MemberListItem.d.ts.map +0 -1
  101. package/dist/components/ProjectCard.d.ts +0 -13
  102. package/dist/components/ProjectCard.d.ts.map +0 -1
  103. package/dist/components/WorkspaceCard.d.ts +0 -8
  104. package/dist/components/WorkspaceCard.d.ts.map +0 -1
  105. package/dist/components/WorkspacesErrorBoundary.d.ts +0 -27
  106. package/dist/components/WorkspacesErrorBoundary.d.ts.map +0 -1
  107. package/dist/components/index.d.ts +0 -8
  108. package/dist/components/index.d.ts.map +0 -1
  109. package/dist/constants/permissions.d.ts +0 -33
  110. package/dist/constants/permissions.d.ts.map +0 -1
  111. package/dist/generated/global-operations.d.ts +0 -319
  112. package/dist/generated/global-operations.d.ts.map +0 -1
  113. package/dist/generated/global-types.d.ts +0 -23527
  114. package/dist/generated/global-types.d.ts.map +0 -1
  115. package/dist/generated/wspace-operations.d.ts +0 -2300
  116. package/dist/generated/wspace-operations.d.ts.map +0 -1
  117. package/dist/generated/wspace-types.d.ts +0 -57851
  118. package/dist/generated/wspace-types.d.ts.map +0 -1
  119. package/dist/hooks/index.d.ts +0 -8
  120. package/dist/hooks/index.d.ts.map +0 -1
  121. package/dist/hooks/useMemberMutations.d.ts +0 -61
  122. package/dist/hooks/useMemberMutations.d.ts.map +0 -1
  123. package/dist/hooks/useOrgsWithPermission.d.ts +0 -7
  124. package/dist/hooks/useOrgsWithPermission.d.ts.map +0 -1
  125. package/dist/hooks/useProjectMutations.d.ts +0 -26
  126. package/dist/hooks/useProjectMutations.d.ts.map +0 -1
  127. package/dist/hooks/useProjects.d.ts +0 -16
  128. package/dist/hooks/useProjects.d.ts.map +0 -1
  129. package/dist/hooks/useScopedNavigation.d.ts +0 -4
  130. package/dist/hooks/useScopedNavigation.d.ts.map +0 -1
  131. package/dist/hooks/useTenants.d.ts +0 -13
  132. package/dist/hooks/useTenants.d.ts.map +0 -1
  133. package/dist/hooks/useWorkspaceActivity.d.ts +0 -12
  134. package/dist/hooks/useWorkspaceActivity.d.ts.map +0 -1
  135. package/dist/hooks/useWorkspaceMembers.d.ts +0 -24
  136. package/dist/hooks/useWorkspaceMembers.d.ts.map +0 -1
  137. package/dist/hooks/useWorkspaceMutations.d.ts +0 -36
  138. package/dist/hooks/useWorkspaceMutations.d.ts.map +0 -1
  139. package/dist/hooks/useWorkspacePermissions.d.ts +0 -29
  140. package/dist/hooks/useWorkspacePermissions.d.ts.map +0 -1
  141. package/dist/hooks/useWorkspaceRoles.d.ts +0 -8
  142. package/dist/hooks/useWorkspaceRoles.d.ts.map +0 -1
  143. package/dist/hooks/useWorkspaces.d.ts +0 -21
  144. package/dist/hooks/useWorkspaces.d.ts.map +0 -1
  145. package/dist/hooks/useWorkspacesEventEmitter.d.ts +0 -18
  146. package/dist/hooks/useWorkspacesEventEmitter.d.ts.map +0 -1
  147. package/dist/hooks/useWorkspacesPageView.d.ts +0 -27
  148. package/dist/hooks/useWorkspacesPageView.d.ts.map +0 -1
  149. package/dist/index.d.ts +0 -33
  150. package/dist/index.d.ts.map +0 -1
  151. package/dist/pages/ActivityListPage.d.ts +0 -2
  152. package/dist/pages/ActivityListPage.d.ts.map +0 -1
  153. package/dist/pages/CreateWorkspacePage.d.ts +0 -2
  154. package/dist/pages/CreateWorkspacePage.d.ts.map +0 -1
  155. package/dist/pages/InviteAcceptancePage.d.ts +0 -6
  156. package/dist/pages/InviteAcceptancePage.d.ts.map +0 -1
  157. package/dist/pages/MembersListPage.d.ts +0 -2
  158. package/dist/pages/MembersListPage.d.ts.map +0 -1
  159. package/dist/pages/ProjectDetailPage.d.ts +0 -2
  160. package/dist/pages/ProjectDetailPage.d.ts.map +0 -1
  161. package/dist/pages/ProjectsListPage.d.ts +0 -2
  162. package/dist/pages/ProjectsListPage.d.ts.map +0 -1
  163. package/dist/pages/WorkspaceDetailPage.d.ts +0 -2
  164. package/dist/pages/WorkspaceDetailPage.d.ts.map +0 -1
  165. package/dist/pages/WorkspaceSettingsPage.d.ts +0 -2
  166. package/dist/pages/WorkspaceSettingsPage.d.ts.map +0 -1
  167. package/dist/pages/WorkspacesListPage.d.ts +0 -2
  168. package/dist/pages/WorkspacesListPage.d.ts.map +0 -1
  169. package/dist/pages/dashboard/DashboardCustomizer.d.ts +0 -12
  170. package/dist/pages/dashboard/DashboardCustomizer.d.ts.map +0 -1
  171. package/dist/pages/dashboard/DashboardGrid.d.ts +0 -8
  172. package/dist/pages/dashboard/DashboardGrid.d.ts.map +0 -1
  173. package/dist/pages/dashboard/DashboardPage.d.ts +0 -14
  174. package/dist/pages/dashboard/DashboardPage.d.ts.map +0 -1
  175. package/dist/pages/dashboard/WidgetWrapper.d.ts +0 -17
  176. package/dist/pages/dashboard/WidgetWrapper.d.ts.map +0 -1
  177. package/dist/pages/dashboard/config.d.ts +0 -9
  178. package/dist/pages/dashboard/config.d.ts.map +0 -1
  179. package/dist/pages/dashboard/hooks/useDashboardData.d.ts +0 -9
  180. package/dist/pages/dashboard/hooks/useDashboardData.d.ts.map +0 -1
  181. package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts +0 -4
  182. package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts.map +0 -1
  183. package/dist/pages/dashboard/types.d.ts +0 -145
  184. package/dist/pages/dashboard/types.d.ts.map +0 -1
  185. package/dist/pages/dashboard/widgets/GroupsWidget.d.ts +0 -4
  186. package/dist/pages/dashboard/widgets/GroupsWidget.d.ts.map +0 -1
  187. package/dist/pages/dashboard/widgets/MembersWidget.d.ts +0 -4
  188. package/dist/pages/dashboard/widgets/MembersWidget.d.ts.map +0 -1
  189. package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts +0 -4
  190. package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts.map +0 -1
  191. package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts +0 -4
  192. package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts.map +0 -1
  193. package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts +0 -4
  194. package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts.map +0 -1
  195. package/dist/pages/dashboard/widgets/StorageWidget.d.ts +0 -4
  196. package/dist/pages/dashboard/widgets/StorageWidget.d.ts.map +0 -1
  197. package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts +0 -4
  198. package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts.map +0 -1
  199. package/dist/pages/dashboard/widgets/SystemHealthWidget.js +0 -59
  200. package/dist/pages/dashboard/widgets/SystemHealthWidget.js.map +0 -1
  201. package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts +0 -4
  202. package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts.map +0 -1
  203. package/dist/pages/dashboard/widgets/TipsWidget.d.ts +0 -4
  204. package/dist/pages/dashboard/widgets/TipsWidget.d.ts.map +0 -1
  205. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts +0 -4
  206. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts.map +0 -1
  207. package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts +0 -4
  208. package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts.map +0 -1
  209. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts +0 -4
  210. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts.map +0 -1
  211. package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts +0 -4
  212. package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts.map +0 -1
  213. package/dist/providers/WorkspacesProvider.d.ts +0 -13
  214. package/dist/providers/WorkspacesProvider.d.ts.map +0 -1
  215. package/dist/store/workspacesStore.d.ts +0 -82
  216. package/dist/store/workspacesStore.d.ts.map +0 -1
  217. package/dist/types/index.d.ts +0 -280
  218. package/dist/types/index.d.ts.map +0 -1
  219. package/dist/utils/formatters.d.ts +0 -60
  220. package/dist/utils/formatters.d.ts.map +0 -1
  221. package/dist/utils/i18n.d.ts +0 -13
  222. package/dist/utils/i18n.d.ts.map +0 -1
  223. package/dist/utils/index.d.ts +0 -3
  224. package/dist/utils/index.d.ts.map +0 -1
  225. package/dist/utils/nativeBridge.d.ts +0 -3
  226. package/dist/utils/nativeBridge.d.ts.map +0 -1
  227. package/dist/utils/projectTags.d.ts +0 -6
  228. package/dist/utils/projectTags.d.ts.map +0 -1
  229. package/dist/utils/slug.d.ts +0 -13
  230. package/dist/utils/slug.d.ts.map +0 -1
  231. package/dist/utils/telemetryError.d.ts +0 -2
  232. package/dist/utils/telemetryError.d.ts.map +0 -1
  233. package/dist/utils/tokenHelpers.d.ts +0 -114
  234. package/dist/utils/tokenHelpers.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WelcomeWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/WelcomeWidget.tsx"],"sourcesContent":["import { LayoutDashboard, Building2, FolderKanban, Users, Activity } from 'lucide-react';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nfunction StatCard({\n icon,\n label,\n value,\n}: {\n icon: React.ReactNode;\n label: string;\n value: number | string;\n}) {\n return (\n <div className=\"flex items-center gap-3 rounded-lg bg-bg-canvas p-3 border border-border-default\">\n <div className=\"rounded-md bg-primary/10 p-2 text-primary\">{icon}</div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{value}</p>\n <p className=\"text-xs text-muted-foreground\">{label}</p>\n </div>\n </div>\n );\n}\n\nexport function WelcomeWidget({ workspaceData, globalData, isLoading }: WidgetProps) {\n const user = globalData?.currentUser;\n const firstName = user?.firstName || user?.name?.split(' ')[0] || 'there';\n const hour = new Date().getHours();\n const greeting = hour < 12 ? 'Good morning' : hour < 18 ? 'Good afternoon' : 'Good evening';\n\n const totalWorkspaces = workspaceData?.workspaces.total ?? 0;\n const totalProjects = workspaceData?.projects.total ?? 0;\n const totalGroups = workspaceData?.groups.totalCount ?? 0;\n const activityCount = workspaceData?.recentActivities.length ?? 0;\n\n return (\n <WidgetWrapper\n title=\"Dashboard\"\n icon={<LayoutDashboard className=\"h-4 w-4\" />}\n size=\"large\"\n isLoading={isLoading}\n >\n <div className=\"space-y-4\">\n <div>\n <h2 className=\"text-xl font-bold text-text-primary\">\n {greeting}, {firstName}!\n </h2>\n <p className=\"text-sm text-muted-foreground mt-1\">\n Here's what's happening across your workspaces today.\n </p>\n </div>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n <StatCard\n icon={<Building2 className=\"h-4 w-4\" />}\n label=\"Workspaces\"\n value={totalWorkspaces}\n />\n <StatCard\n icon={<FolderKanban className=\"h-4 w-4\" />}\n label=\"Projects\"\n value={totalProjects}\n />\n <StatCard icon={<Users className=\"h-4 w-4\" />} label=\"Groups\" value={totalGroups} />\n <StatCard\n icon={<Activity className=\"h-4 w-4\" />}\n label=\"Recent Activity\"\n value={activityCount}\n />\n </div>\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;AAIA,SAAS,EAAS,EAChB,SACA,UACA,YAKC;AACD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAA6C;GAAW,CAAA,EACvE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;GAAG,WAAU;aAAwC;GAAU,CAAA,EAC/D,kBAAC,KAAD;GAAG,WAAU;aAAiC;GAAU,CAAA,CACpD,EAAA,CAAA,CACF;;;AAIV,SAAgB,EAAc,EAAE,kBAAe,eAAY,gBAA0B;CACnF,IAAM,IAAO,GAAY,aACnB,IAAY,GAAM,aAAa,GAAM,MAAM,MAAM,IAAI,CAAC,MAAM,SAC5D,qBAAO,IAAI,MAAM,EAAC,UAAU,EAC5B,IAAW,IAAO,KAAK,iBAAiB,IAAO,KAAK,mBAAmB,gBAEvE,IAAkB,GAAe,WAAW,SAAS,GACrD,IAAgB,GAAe,SAAS,SAAS,GACjD,IAAc,GAAe,OAAO,cAAc,GAClD,IAAgB,GAAe,iBAAiB,UAAU;AAEhE,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAiB,WAAU,WAAY,CAAA;EAC7C,MAAK;EACM;YAEX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAd;KACG;KAAS;KAAG;KAAU;KACpB;OACL,kBAAC,KAAD;IAAG,WAAU;cAAqC;IAE9C,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;MACvC,OAAM;MACN,OAAO;MACP,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;MAC1C,OAAM;MACN,OAAO;MACP,CAAA;KACF,kBAAC,GAAD;MAAU,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;MAAE,OAAM;MAAS,OAAO;MAAe,CAAA;KACpF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;MACtC,OAAM;MACN,OAAO;MACP,CAAA;KACE;MACF;;EACQ,CAAA"}
1
+ {"version":3,"file":"WelcomeWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/WelcomeWidget.tsx"],"sourcesContent":["import { LayoutDashboard, Building2, FolderKanban, Users, Activity } from 'lucide-react';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nfunction StatCard({\n icon,\n label,\n value,\n}: {\n icon: React.ReactNode;\n label: string;\n value: number | string;\n}) {\n return (\n <div className=\"flex items-center gap-3 rounded-lg bg-bg-canvas p-3 border border-border-default\">\n <div className=\"rounded-md bg-primary/10 p-2 text-primary\">{icon}</div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{value}</p>\n <p className=\"text-xs text-muted-foreground\">{label}</p>\n </div>\n </div>\n );\n}\n\nexport function WelcomeWidget({ workspaceData, globalData, isLoading }: WidgetProps) {\n const user = globalData?.currentUser;\n const firstName = user?.firstName || user?.name?.split(' ')[0] || 'there';\n const hour = new Date().getHours();\n const greeting = hour < 12 ? 'Good morning' : hour < 18 ? 'Good afternoon' : 'Good evening';\n\n const totalWorkspaces = workspaceData?.workspaces.total ?? 0;\n const totalProjects = workspaceData?.projects.total ?? 0;\n const totalGroups = workspaceData?.groups.totalCount ?? 0;\n const activityCount = workspaceData?.recentActivities.length ?? 0;\n\n return (\n <WidgetWrapper\n title=\"Dashboard\"\n icon={<LayoutDashboard className=\"size-4\" />}\n size=\"large\"\n isLoading={isLoading}\n >\n <div className=\"space-y-4\">\n <div>\n <h2 className=\"text-xl font-bold text-text-primary\">\n {greeting}, {firstName}!\n </h2>\n <p className=\"text-sm text-muted-foreground mt-1\">\n Here's what's happening across your workspaces today.\n </p>\n </div>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n <StatCard\n icon={<Building2 className=\"size-4\" />}\n label=\"Workspaces\"\n value={totalWorkspaces}\n />\n <StatCard\n icon={<FolderKanban className=\"size-4\" />}\n label=\"Projects\"\n value={totalProjects}\n />\n <StatCard icon={<Users className=\"size-4\" />} label=\"Groups\" value={totalGroups} />\n <StatCard\n icon={<Activity className=\"size-4\" />}\n label=\"Recent Activity\"\n value={activityCount}\n />\n </div>\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;AAIA,SAAS,EAAS,EAChB,SACA,UACA,YAKC;AACD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAA6C;GAAW,CAAA,EACvE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;GAAG,WAAU;aAAwC;GAAU,CAAA,EAC/D,kBAAC,KAAD;GAAG,WAAU;aAAiC;GAAU,CAAA,CACpD,EAAA,CAAA,CACF;;;AAIV,SAAgB,EAAc,EAAE,kBAAe,eAAY,gBAA0B;CACnF,IAAM,IAAO,GAAY,aACnB,IAAY,GAAM,aAAa,GAAM,MAAM,MAAM,IAAI,CAAC,MAAM,SAC5D,qBAAO,IAAI,MAAM,EAAC,UAAU,EAC5B,IAAW,IAAO,KAAK,iBAAiB,IAAO,KAAK,mBAAmB,gBAEvE,IAAkB,GAAe,WAAW,SAAS,GACrD,IAAgB,GAAe,SAAS,SAAS,GACjD,IAAc,GAAe,OAAO,cAAc,GAClD,IAAgB,GAAe,iBAAiB,UAAU;AAEhE,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAiB,WAAU,UAAW,CAAA;EAC5C,MAAK;EACM;YAEX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAd;KACG;KAAS;KAAG;KAAU;KACpB;OACL,kBAAC,KAAD;IAAG,WAAU;cAAqC;IAE9C,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;MACtC,OAAM;MACN,OAAO;MACP,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAc,WAAU,UAAW,CAAA;MACzC,OAAM;MACN,OAAO;MACP,CAAA;KACF,kBAAC,GAAD;MAAU,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;MAAE,OAAM;MAAS,OAAO;MAAe,CAAA;KACnF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;MACrC,OAAM;MACN,OAAO;MACP,CAAA;KACE;MACF;;EACQ,CAAA"}
@@ -25,7 +25,7 @@ function f({ workspaceData: n, isLoading: i, navigate: a }) {
25
25
  let o = n?.workflowStats;
26
26
  return /* @__PURE__ */ s(e, {
27
27
  title: "Workflows",
28
- icon: /* @__PURE__ */ s(r, { className: "h-4 w-4" }),
28
+ icon: /* @__PURE__ */ s(r, { className: "size-4" }),
29
29
  size: "medium",
30
30
  isLoading: i,
31
31
  unavailable: !n,
@@ -34,7 +34,7 @@ function f({ workspaceData: n, isLoading: i, navigate: a }) {
34
34
  size: "sm",
35
35
  className: "text-xs",
36
36
  onClick: () => a("/workflows"),
37
- children: ["View all ", /* @__PURE__ */ s(t, { className: "ml-1 h-3 w-3" })]
37
+ children: ["View all ", /* @__PURE__ */ s(t, { className: "ml-1 size-3" })]
38
38
  }),
39
39
  children: o ? /* @__PURE__ */ c("div", {
40
40
  className: "space-y-3",
@@ -70,7 +70,7 @@ function f({ workspaceData: n, isLoading: i, navigate: a }) {
70
70
  className: "flex items-center justify-between p-1.5 rounded hover:bg-accent/5 transition-colors",
71
71
  children: [/* @__PURE__ */ c("div", {
72
72
  className: "flex items-center gap-2 min-w-0",
73
- children: [/* @__PURE__ */ s(n, { className: `h-3.5 w-3.5 ${t.color}` }), /* @__PURE__ */ s("span", {
73
+ children: [/* @__PURE__ */ s(n, { className: `size-3.5 ${t.color}` }), /* @__PURE__ */ s("span", {
74
74
  className: "text-sm text-text-primary truncate",
75
75
  children: e.workflowKey
76
76
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowStatsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/WorkflowStatsWidget.tsx"],"sourcesContent":["import { GitBranch, ArrowRight, Play, Pause, CheckCircle2, XCircle } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst runStatusIcons: Record<string, { icon: typeof Play; color: string }> = {\n RUNNING: { icon: Play, color: 'text-accent-blue' },\n COMPLETED: { icon: CheckCircle2, color: 'text-status-success-text' },\n FAILED: { icon: XCircle, color: 'text-status-error-text' },\n PAUSED: { icon: Pause, color: 'text-status-warning-text' },\n};\n\nexport function WorkflowStatsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const stats = workspaceData?.workflowStats;\n\n return (\n <WidgetWrapper\n title=\"Workflows\"\n icon={<GitBranch className=\"h-4 w-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/workflows')}\n >\n View all <ArrowRight className=\"ml-1 h-3 w-3\" />\n </Button>\n }\n >\n {!stats ? (\n <div className=\"text-center py-4\">\n <p className=\"text-sm text-muted-foreground\">No workflow data available</p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"rounded-lg bg-bg-canvas p-3 border border-border-default text-center\">\n <p className=\"text-2xl font-bold text-text-primary\">{stats.activeWorkflowsCount}</p>\n <p className=\"text-xs text-muted-foreground\">Active</p>\n </div>\n <div className=\"rounded-lg bg-bg-canvas p-3 border border-border-default text-center\">\n <p className=\"text-2xl font-bold text-text-primary\">{stats.archivedWorkflowsCount}</p>\n <p className=\"text-xs text-muted-foreground\">Archived</p>\n </div>\n </div>\n {stats.recentRuns.length > 0 && (\n <div className=\"space-y-1.5\">\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Recent Runs\n </p>\n {stats.recentRuns.slice(0, 3).map((run) => {\n const statusInfo = runStatusIcons[run.status] || runStatusIcons.RUNNING;\n const StatusIcon = statusInfo.icon;\n return (\n <div\n key={run.id}\n className=\"flex items-center justify-between p-1.5 rounded hover:bg-accent/5 transition-colors\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <StatusIcon className={`h-3.5 w-3.5 ${statusInfo.color}`} />\n <span className=\"text-sm text-text-primary truncate\">{run.workflowKey}</span>\n </div>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {run.status}\n </Badge>\n </div>\n );\n })}\n </div>\n )}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,IAAM,IAAuE;CAC3E,SAAS;EAAE,MAAM;EAAM,OAAO;EAAoB;CAClD,WAAW;EAAE,MAAM;EAAc,OAAO;EAA4B;CACpE,QAAQ;EAAE,MAAM;EAAS,OAAO;EAA0B;CAC1D,QAAQ;EAAE,MAAM;EAAO,OAAO;EAA4B;CAC3D;AAED,SAAgB,EAAoB,EAAE,kBAAe,cAAW,eAAyB;CACvF,IAAM,IAAQ,GAAe;AAE7B,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;EACvC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,aAAa;aAJvC,CAKC,aACU,kBAAC,GAAD,EAAY,WAAU,gBAAiB,CAAA,CACzC;;YAGT,IAKA,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAwC,EAAM;MAAyB,CAAA,EACpF,kBAAC,KAAD;MAAG,WAAU;gBAAgC;MAAU,CAAA,CACnD;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAwC,EAAM;MAA2B,CAAA,EACtF,kBAAC,KAAD;MAAG,WAAU;gBAAgC;MAAY,CAAA,CACrD;OACF;OACL,EAAM,WAAW,SAAS,KACzB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAAqE;KAE9E,CAAA,EACH,EAAM,WAAW,MAAM,GAAG,EAAE,CAAC,KAAK,MAAQ;KACzC,IAAM,IAAa,EAAe,EAAI,WAAW,EAAe,SAC1D,IAAa,EAAW;AAC9B,YACE,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAY,WAAW,eAAe,EAAW,SAAW,CAAA,EAC5D,kBAAC,QAAD;QAAM,WAAU;kBAAsC,EAAI;QAAmB,CAAA,CACzE;UACN,kBAAC,GAAD;OAAO,SAAQ;OAAU,WAAU;iBAChC,EAAI;OACC,CAAA,CACJ;QAVC,EAAI,GAUL;MAER,CACE;MAEJ;OAxCN,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAA8B,CAAA;GACvE,CAAA;EAwCM,CAAA"}
1
+ {"version":3,"file":"WorkflowStatsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/WorkflowStatsWidget.tsx"],"sourcesContent":["import { GitBranch, ArrowRight, Play, Pause, CheckCircle2, XCircle } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst runStatusIcons: Record<string, { icon: typeof Play; color: string }> = {\n RUNNING: { icon: Play, color: 'text-accent-blue' },\n COMPLETED: { icon: CheckCircle2, color: 'text-status-success-text' },\n FAILED: { icon: XCircle, color: 'text-status-error-text' },\n PAUSED: { icon: Pause, color: 'text-status-warning-text' },\n};\n\nexport function WorkflowStatsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const stats = workspaceData?.workflowStats;\n\n return (\n <WidgetWrapper\n title=\"Workflows\"\n icon={<GitBranch className=\"size-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/workflows')}\n >\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {!stats ? (\n <div className=\"text-center py-4\">\n <p className=\"text-sm text-muted-foreground\">No workflow data available</p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"rounded-lg bg-bg-canvas p-3 border border-border-default text-center\">\n <p className=\"text-2xl font-bold text-text-primary\">{stats.activeWorkflowsCount}</p>\n <p className=\"text-xs text-muted-foreground\">Active</p>\n </div>\n <div className=\"rounded-lg bg-bg-canvas p-3 border border-border-default text-center\">\n <p className=\"text-2xl font-bold text-text-primary\">{stats.archivedWorkflowsCount}</p>\n <p className=\"text-xs text-muted-foreground\">Archived</p>\n </div>\n </div>\n {stats.recentRuns.length > 0 && (\n <div className=\"space-y-1.5\">\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Recent Runs\n </p>\n {stats.recentRuns.slice(0, 3).map((run) => {\n const statusInfo = runStatusIcons[run.status] || runStatusIcons.RUNNING;\n const StatusIcon = statusInfo.icon;\n return (\n <div\n key={run.id}\n className=\"flex items-center justify-between p-1.5 rounded hover:bg-accent/5 transition-colors\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <StatusIcon className={`size-3.5 ${statusInfo.color}`} />\n <span className=\"text-sm text-text-primary truncate\">{run.workflowKey}</span>\n </div>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {run.status}\n </Badge>\n </div>\n );\n })}\n </div>\n )}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,IAAM,IAAuE;CAC3E,SAAS;EAAE,MAAM;EAAM,OAAO;EAAoB;CAClD,WAAW;EAAE,MAAM;EAAc,OAAO;EAA4B;CACpE,QAAQ;EAAE,MAAM;EAAS,OAAO;EAA0B;CAC1D,QAAQ;EAAE,MAAM;EAAO,OAAO;EAA4B;CAC3D;AAED,SAAgB,EAAoB,EAAE,kBAAe,cAAW,eAAyB;CACvF,IAAM,IAAQ,GAAe;AAE7B,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;EACtC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,aAAa;aAJvC,CAKC,aACU,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,CACxC;;YAGT,IAKA,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAwC,EAAM;MAAyB,CAAA,EACpF,kBAAC,KAAD;MAAG,WAAU;gBAAgC;MAAU,CAAA,CACnD;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAwC,EAAM;MAA2B,CAAA,EACtF,kBAAC,KAAD;MAAG,WAAU;gBAAgC;MAAY,CAAA,CACrD;OACF;OACL,EAAM,WAAW,SAAS,KACzB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAAqE;KAE9E,CAAA,EACH,EAAM,WAAW,MAAM,GAAG,EAAE,CAAC,KAAK,MAAQ;KACzC,IAAM,IAAa,EAAe,EAAI,WAAW,EAAe,SAC1D,IAAa,EAAW;AAC9B,YACE,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAY,WAAW,YAAY,EAAW,SAAW,CAAA,EACzD,kBAAC,QAAD;QAAM,WAAU;kBAAsC,EAAI;QAAmB,CAAA,CACzE;UACN,kBAAC,GAAD;OAAO,SAAQ;OAAU,WAAU;iBAChC,EAAI;OACC,CAAA,CACJ;QAVC,EAAI,GAUL;MAER,CACE;MAEJ;OAxCN,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAA8B,CAAA;GACvE,CAAA;EAwCM,CAAA"}
@@ -12,7 +12,7 @@ function l({ workspaceData: l, isLoading: u, navigate: d }) {
12
12
  let f = l?.workspaces.items ?? [], p = l?.workspaces.total ?? 0;
13
13
  return /* @__PURE__ */ i(e, {
14
14
  title: "Workspaces",
15
- icon: /* @__PURE__ */ i(n, { className: "h-4 w-4" }),
15
+ icon: /* @__PURE__ */ i(n, { className: "size-4" }),
16
16
  size: "medium",
17
17
  isLoading: u,
18
18
  unavailable: !l,
@@ -21,7 +21,7 @@ function l({ workspaceData: l, isLoading: u, navigate: d }) {
21
21
  size: "sm",
22
22
  className: "text-xs",
23
23
  onClick: () => d("/workspaces/list"),
24
- children: ["View all ", /* @__PURE__ */ i(t, { className: "ml-1 h-3 w-3" })]
24
+ children: ["View all ", /* @__PURE__ */ i(t, { className: "ml-1 size-3" })]
25
25
  }),
26
26
  children: f.length === 0 ? /* @__PURE__ */ a("div", {
27
27
  className: "text-center py-4",
@@ -36,12 +36,13 @@ function l({ workspaceData: l, isLoading: u, navigate: d }) {
36
36
  })]
37
37
  }) : /* @__PURE__ */ a("div", {
38
38
  className: "space-y-2",
39
- children: [f.slice(0, 5).map((e) => /* @__PURE__ */ a("div", {
40
- className: "flex items-center justify-between p-2 rounded-md hover:bg-accent/5 cursor-pointer transition-colors",
39
+ children: [f.slice(0, 5).map((e) => /* @__PURE__ */ a("button", {
40
+ type: "button",
41
+ className: "w-full flex items-center justify-between p-2 rounded-md hover:bg-accent/5 cursor-pointer transition-colors text-left",
41
42
  onClick: () => d(`/workspaces/${e.id}`),
42
43
  children: [/* @__PURE__ */ a("div", {
43
44
  className: "flex items-center gap-2 min-w-0",
44
- children: [/* @__PURE__ */ i(r, { className: `h-2 w-2 ${c[e.status] || "bg-text-tertiary"} fill-current` }), /* @__PURE__ */ i("span", {
45
+ children: [/* @__PURE__ */ i(r, { className: `size-2 ${c[e.status] || "bg-text-tertiary"} fill-current` }), /* @__PURE__ */ i("span", {
45
46
  className: "text-sm font-medium text-text-primary truncate",
46
47
  children: e.name
47
48
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspacesWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/WorkspacesWidget.tsx"],"sourcesContent":["import { Building2, ArrowRight, Circle } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst statusColors: Record<string, string> = {\n ACTIVE: 'bg-status-success-bg',\n SUSPENDED: 'bg-status-warning-bg',\n ARCHIVED: 'bg-text-tertiary',\n};\n\nexport function WorkspacesWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const workspaces = workspaceData?.workspaces.items ?? [];\n const total = workspaceData?.workspaces.total ?? 0;\n\n return (\n <WidgetWrapper\n title=\"Workspaces\"\n icon={<Building2 className=\"h-4 w-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/workspaces/list')}\n >\n View all <ArrowRight className=\"ml-1 h-3 w-3\" />\n </Button>\n }\n >\n {workspaces.length === 0 ? (\n <div className=\"text-center py-4\">\n <p className=\"text-sm text-muted-foreground mb-2\">No workspaces yet</p>\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/workspaces/list')}>\n Create your first workspace\n </Button>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {workspaces.slice(0, 5).map((ws) => (\n <div\n key={ws.id}\n className=\"flex items-center justify-between p-2 rounded-md hover:bg-accent/5 cursor-pointer transition-colors\"\n onClick={() => navigate(`/workspaces/${ws.id}`)}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <Circle\n className={`h-2 w-2 ${statusColors[ws.status] || 'bg-text-tertiary'} fill-current`}\n />\n <span className=\"text-sm font-medium text-text-primary truncate\">{ws.name}</span>\n </div>\n <Badge variant=\"outline\" className=\"text-[10px] shrink-0\">\n {ws.type}\n </Badge>\n </div>\n ))}\n {total > 5 && (\n <p className=\"text-xs text-muted-foreground text-center pt-1\">\n +{total - 5} more workspaces\n </p>\n )}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,IAAM,IAAuC;CAC3C,QAAQ;CACR,WAAW;CACX,UAAU;CACX;AAED,SAAgB,EAAiB,EAAE,kBAAe,cAAW,eAAyB;CACpF,IAAM,IAAa,GAAe,WAAW,SAAS,EAAE,EAClD,IAAQ,GAAe,WAAW,SAAS;AAEjD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;EACvC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,mBAAmB;aAJ7C,CAKC,aACU,kBAAC,GAAD,EAAY,WAAU,gBAAiB,CAAA,CACzC;;YAGV,EAAW,WAAW,IACrB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAqC;IAAqB,CAAA,EACvE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,eAAe,EAAS,mBAAmB;cAAE;IAExE,CAAA,CACL;OAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAW,MAAM,GAAG,EAAE,CAAC,KAAK,MAC3B,kBAAC,OAAD;IAEE,WAAU;IACV,eAAe,EAAS,eAAe,EAAG,KAAK;cAHjD,CAKE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EACE,WAAW,WAAW,EAAa,EAAG,WAAW,mBAAmB,gBACpE,CAAA,EACF,kBAAC,QAAD;MAAM,WAAU;gBAAkD,EAAG;MAAY,CAAA,CAC7E;QACN,kBAAC,GAAD;KAAO,SAAQ;KAAU,WAAU;eAChC,EAAG;KACE,CAAA,CACJ;MAbC,EAAG,GAaJ,CACN,EACD,IAAQ,KACP,kBAAC,KAAD;IAAG,WAAU;cAAb;KAA8D;KAC1D,IAAQ;KAAE;KACV;MAEF;;EAEM,CAAA"}
1
+ {"version":3,"file":"WorkspacesWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/WorkspacesWidget.tsx"],"sourcesContent":["import { Building2, ArrowRight, Circle } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst statusColors: Record<string, string> = {\n ACTIVE: 'bg-status-success-bg',\n SUSPENDED: 'bg-status-warning-bg',\n ARCHIVED: 'bg-text-tertiary',\n};\n\nexport function WorkspacesWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const workspaces = workspaceData?.workspaces.items ?? [];\n const total = workspaceData?.workspaces.total ?? 0;\n\n return (\n <WidgetWrapper\n title=\"Workspaces\"\n icon={<Building2 className=\"size-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/workspaces/list')}\n >\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {workspaces.length === 0 ? (\n <div className=\"text-center py-4\">\n <p className=\"text-sm text-muted-foreground mb-2\">No workspaces yet</p>\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/workspaces/list')}>\n Create your first workspace\n </Button>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {workspaces.slice(0, 5).map((ws) => (\n <button\n key={ws.id}\n type=\"button\"\n className=\"w-full flex items-center justify-between p-2 rounded-md hover:bg-accent/5 cursor-pointer transition-colors text-left\"\n onClick={() => navigate(`/workspaces/${ws.id}`)}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <Circle\n className={`size-2 ${statusColors[ws.status] || 'bg-text-tertiary'} fill-current`}\n />\n <span className=\"text-sm font-medium text-text-primary truncate\">{ws.name}</span>\n </div>\n <Badge variant=\"outline\" className=\"text-[10px] shrink-0\">\n {ws.type}\n </Badge>\n </button>\n ))}\n {total > 5 && (\n <p className=\"text-xs text-muted-foreground text-center pt-1\">\n +{total - 5} more workspaces\n </p>\n )}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,IAAM,IAAuC;CAC3C,QAAQ;CACR,WAAW;CACX,UAAU;CACX;AAED,SAAgB,EAAiB,EAAE,kBAAe,cAAW,eAAyB;CACpF,IAAM,IAAa,GAAe,WAAW,SAAS,EAAE,EAClD,IAAQ,GAAe,WAAW,SAAS;AAEjD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;EACtC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,mBAAmB;aAJ7C,CAKC,aACU,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,CACxC;;YAGV,EAAW,WAAW,IACrB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAqC;IAAqB,CAAA,EACvE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,eAAe,EAAS,mBAAmB;cAAE;IAExE,CAAA,CACL;OAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAW,MAAM,GAAG,EAAE,CAAC,KAAK,MAC3B,kBAAC,UAAD;IAEE,MAAK;IACL,WAAU;IACV,eAAe,EAAS,eAAe,EAAG,KAAK;cAJjD,CAME,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EACE,WAAW,UAAU,EAAa,EAAG,WAAW,mBAAmB,gBACnE,CAAA,EACF,kBAAC,QAAD;MAAM,WAAU;gBAAkD,EAAG;MAAY,CAAA,CAC7E;QACN,kBAAC,GAAD;KAAO,SAAQ;KAAU,WAAU;eAChC,EAAG;KACE,CAAA,CACD;MAdF,EAAG,GAcD,CACT,EACD,IAAQ,KACP,kBAAC,KAAD;IAAG,WAAU;cAAb;KAA8D;KAC1D,IAAQ;KAAE;KACV;MAEF;;EAEM,CAAA"}
@@ -1,4 +1,4 @@
1
- import { createContext as e, useContext as t } from "react";
1
+ import { createContext as e, use as t } from "react";
2
2
  import { PermissionProvider as n } from "@burdenoff/fe-libs/shared/providers/shell";
3
3
  import { jsx as r } from "react/jsx-runtime";
4
4
  //#region src/providers/WorkspacesProvider.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspacesProvider.js","names":[],"sources":["../../src/providers/WorkspacesProvider.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren, createContext, useContext } from 'react';\nimport { PermissionProvider } from '@burdenoff/fe-libs/shared/providers/shell';\nimport type { WorkspacesRootProps } from '../types';\n\n/**\n * Context value for Workspaces microfrontend\n */\ntype WorkspacesContextValue = WorkspacesRootProps;\n\nconst WorkspacesContext = createContext<WorkspacesContextValue | null>(null);\n\n/**\n * Hook to access Workspaces context\n */\nexport const useWorkspacesContext = () => {\n const context = useContext(WorkspacesContext);\n if (!context) {\n throw new Error('useWorkspacesContext must be used within WorkspacesProvider');\n }\n return context;\n};\n\n/**\n * Provider component for Workspaces microfrontend\n * Sets up context and dependencies including permission management\n */\nexport const WorkspacesProvider: FC<PropsWithChildren<WorkspacesRootProps>> = ({\n children,\n ...props\n}) => {\n const contextValue: WorkspacesContextValue = {\n ...props,\n };\n\n return (\n <WorkspacesContext.Provider value={contextValue}>\n <PermissionProvider scopeId={props.workspaceId ?? null} gateway=\"workspace\" debug={false}>\n {children}\n </PermissionProvider>\n </WorkspacesContext.Provider>\n );\n};\n"],"mappings":";;;;AASA,IAAM,IAAoB,EAA6C,KAAK,EAK/D,UAA6B;CACxC,IAAM,IAAU,EAAW,EAAkB;AAC7C,KAAI,CAAC,EACH,OAAU,MAAM,8DAA8D;AAEhF,QAAO;GAOI,KAAkE,EAC7E,aACA,GAAG,QACC;CACJ,IAAM,IAAuC,EAC3C,GAAG,GACJ;AAED,QACE,kBAAC,EAAkB,UAAnB;EAA4B,OAAO;YACjC,kBAAC,GAAD;GAAoB,SAAS,EAAM,eAAe;GAAM,SAAQ;GAAY,OAAO;GAChF;GACkB,CAAA;EACM,CAAA"}
1
+ {"version":3,"file":"WorkspacesProvider.js","names":[],"sources":["../../src/providers/WorkspacesProvider.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren, createContext, use } from 'react';\nimport { PermissionProvider } from '@burdenoff/fe-libs/shared/providers/shell';\nimport type { WorkspacesRootProps } from '../types';\n\n/**\n * Context value for Workspaces microfrontend\n */\ntype WorkspacesContextValue = WorkspacesRootProps;\n\nconst WorkspacesContext = createContext<WorkspacesContextValue | null>(null);\n\n/**\n * Hook to access Workspaces context\n */\nexport const useWorkspacesContext = () => {\n const context = use(WorkspacesContext);\n if (!context) {\n throw new Error('useWorkspacesContext must be used within WorkspacesProvider');\n }\n return context;\n};\n\n/**\n * Provider component for Workspaces microfrontend\n * Sets up context and dependencies including permission management\n */\nexport const WorkspacesProvider: FC<PropsWithChildren<WorkspacesRootProps>> = ({\n children,\n ...props\n}) => {\n const contextValue: WorkspacesContextValue = {\n ...props,\n };\n\n return (\n <WorkspacesContext.Provider value={contextValue}>\n <PermissionProvider scopeId={props.workspaceId ?? null} gateway=\"workspace\" debug={false}>\n {children}\n </PermissionProvider>\n </WorkspacesContext.Provider>\n );\n};\n"],"mappings":";;;;AASA,IAAM,IAAoB,EAA6C,KAAK,EAK/D,UAA6B;CACxC,IAAM,IAAU,EAAI,EAAkB;AACtC,KAAI,CAAC,EACH,OAAU,MAAM,8DAA8D;AAEhF,QAAO;GAOI,KAAkE,EAC7E,aACA,GAAG,QACC;CACJ,IAAM,IAAuC,EAC3C,GAAG,GACJ;AAED,QACE,kBAAC,EAAkB,UAAnB;EAA4B,OAAO;YACjC,kBAAC,GAAD;GAAoB,SAAS,EAAM,eAAe;GAAM,SAAQ;GAAY,OAAO;GAChF;GACkB,CAAA;EACM,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspacesStore.js","names":[],"sources":["../../src/store/workspacesStore.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { devtools, persist, createJSONStorage } from 'zustand/middleware';\nimport { createProfileScopedStorage } from '@burdenoff/fe-libs/shared/utils';\n\nimport type {\n ViewMode,\n SortBy,\n SortDirection,\n WorkspaceFilters,\n ProjectFilters,\n MemberFilters,\n Workspace,\n} from '../types';\n\ninterface WorkspacesState {\n // View state\n viewMode: ViewMode;\n sortBy: SortBy;\n sortDirection: SortDirection;\n\n // Filters\n workspaceFilters: WorkspaceFilters;\n projectFilters: ProjectFilters;\n memberFilters: MemberFilters;\n\n // Selection state\n selectedWorkspaceIds: Set<string>;\n selectedProjectIds: Set<string>;\n selectedMemberIds: Set<string>;\n\n // UI state\n isCreateWorkspaceDialogOpen: boolean;\n isCreateProjectDialogOpen: boolean;\n isInviteMemberDialogOpen: boolean;\n currentWorkspace: Workspace | null;\n currentWorkspaceId: string | null;\n\n // Actions - View\n setViewMode: (mode: ViewMode) => void;\n setSortBy: (sortBy: SortBy) => void;\n toggleSortDirection: () => void;\n\n // Actions - Filters\n setWorkspaceFilters: (filters: Partial<WorkspaceFilters>) => void;\n clearWorkspaceFilters: () => void;\n setProjectFilters: (filters: Partial<ProjectFilters>) => void;\n clearProjectFilters: () => void;\n setMemberFilters: (filters: Partial<MemberFilters>) => void;\n clearMemberFilters: () => void;\n\n // Actions - Selection\n toggleWorkspaceSelection: (id: string) => void;\n clearWorkspaceSelection: () => void;\n toggleProjectSelection: (id: string) => void;\n clearProjectSelection: () => void;\n toggleMemberSelection: (id: string) => void;\n clearMemberSelection: () => void;\n\n // Actions - UI\n openCreateWorkspaceDialog: () => void;\n closeCreateWorkspaceDialog: () => void;\n openCreateProjectDialog: (workspace: Workspace) => void;\n closeCreateProjectDialog: () => void;\n openInviteMemberDialog: (workspace: Workspace) => void;\n closeInviteMemberDialog: () => void;\n setCurrentWorkspace: (workspace: Workspace | null) => void;\n\n // Actions - Reset\n reset: () => void;\n}\n\nconst initialState = {\n viewMode: 'grid' as ViewMode,\n sortBy: 'name' as SortBy,\n sortDirection: 'asc' as SortDirection,\n workspaceFilters: {},\n projectFilters: {},\n memberFilters: {},\n selectedWorkspaceIds: new Set<string>(),\n selectedProjectIds: new Set<string>(),\n selectedMemberIds: new Set<string>(),\n isCreateWorkspaceDialogOpen: false,\n isCreateProjectDialogOpen: false,\n isInviteMemberDialogOpen: false,\n currentWorkspace: null,\n currentWorkspaceId: null,\n};\n\nexport const useWorkspacesStore = create<WorkspacesState>()(\n devtools(\n persist(\n (set) => ({\n ...initialState,\n\n // View actions\n setViewMode: (mode) => set({ viewMode: mode }),\n setSortBy: (sortBy) => set({ sortBy }),\n toggleSortDirection: () =>\n set((state) => ({\n sortDirection: state.sortDirection === 'asc' ? 'desc' : 'asc',\n })),\n\n // Filter actions\n setWorkspaceFilters: (filters) =>\n set((state) => ({\n workspaceFilters: { ...state.workspaceFilters, ...filters },\n })),\n clearWorkspaceFilters: () => set({ workspaceFilters: {} }),\n setProjectFilters: (filters) =>\n set((state) => ({\n projectFilters: { ...state.projectFilters, ...filters },\n })),\n clearProjectFilters: () => set({ projectFilters: {} }),\n setMemberFilters: (filters) =>\n set((state) => ({\n memberFilters: { ...state.memberFilters, ...filters },\n })),\n clearMemberFilters: () => set({ memberFilters: {} }),\n\n // Selection actions\n toggleWorkspaceSelection: (id) =>\n set((state) => {\n const newSet = new Set(state.selectedWorkspaceIds);\n if (newSet.has(id)) {\n newSet.delete(id);\n } else {\n newSet.add(id);\n }\n return { selectedWorkspaceIds: newSet };\n }),\n clearWorkspaceSelection: () => set({ selectedWorkspaceIds: new Set() }),\n toggleProjectSelection: (id) =>\n set((state) => {\n const newSet = new Set(state.selectedProjectIds);\n if (newSet.has(id)) {\n newSet.delete(id);\n } else {\n newSet.add(id);\n }\n return { selectedProjectIds: newSet };\n }),\n clearProjectSelection: () => set({ selectedProjectIds: new Set() }),\n toggleMemberSelection: (id) =>\n set((state) => {\n const newSet = new Set(state.selectedMemberIds);\n if (newSet.has(id)) {\n newSet.delete(id);\n } else {\n newSet.add(id);\n }\n return { selectedMemberIds: newSet };\n }),\n clearMemberSelection: () => set({ selectedMemberIds: new Set() }),\n\n // UI actions\n openCreateWorkspaceDialog: () => set({ isCreateWorkspaceDialogOpen: true }),\n closeCreateWorkspaceDialog: () => set({ isCreateWorkspaceDialogOpen: false }),\n openCreateProjectDialog: (workspace) =>\n set({\n isCreateProjectDialogOpen: true,\n currentWorkspace: workspace,\n }),\n closeCreateProjectDialog: () =>\n set({\n isCreateProjectDialogOpen: false,\n currentWorkspace: null,\n }),\n openInviteMemberDialog: (workspace) =>\n set({\n isInviteMemberDialogOpen: true,\n currentWorkspace: workspace,\n currentWorkspaceId: workspace.id,\n }),\n closeInviteMemberDialog: () =>\n set({\n isInviteMemberDialogOpen: false,\n currentWorkspace: null,\n currentWorkspaceId: null,\n }),\n setCurrentWorkspace: (workspace) => set({ currentWorkspace: workspace }),\n\n // Reset\n reset: () => set(initialState),\n }),\n {\n name: 'burdenoff-workspaces-storage',\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n viewMode: state.viewMode,\n sortBy: state.sortBy,\n sortDirection: state.sortDirection,\n }),\n }\n ),\n { name: 'Workspaces Store', enabled: process.env.NODE_ENV === 'development' }\n )\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"workspacesStore.js","names":[],"sources":["../../src/store/workspacesStore.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { devtools, persist } from 'zustand/middleware';\nimport { createProfileScopedStorage } from '@burdenoff/fe-libs/shared/utils';\n\nimport type {\n ViewMode,\n SortBy,\n SortDirection,\n WorkspaceFilters,\n ProjectFilters,\n MemberFilters,\n Workspace,\n} from '../types';\n\ninterface WorkspacesState {\n // View state\n viewMode: ViewMode;\n sortBy: SortBy;\n sortDirection: SortDirection;\n\n // Filters\n workspaceFilters: WorkspaceFilters;\n projectFilters: ProjectFilters;\n memberFilters: MemberFilters;\n\n // Selection state\n selectedWorkspaceIds: Set<string>;\n selectedProjectIds: Set<string>;\n selectedMemberIds: Set<string>;\n\n // UI state\n isCreateWorkspaceDialogOpen: boolean;\n isCreateProjectDialogOpen: boolean;\n isInviteMemberDialogOpen: boolean;\n currentWorkspace: Workspace | null;\n currentWorkspaceId: string | null;\n\n // Actions - View\n setViewMode: (mode: ViewMode) => void;\n setSortBy: (sortBy: SortBy) => void;\n toggleSortDirection: () => void;\n\n // Actions - Filters\n setWorkspaceFilters: (filters: Partial<WorkspaceFilters>) => void;\n clearWorkspaceFilters: () => void;\n setProjectFilters: (filters: Partial<ProjectFilters>) => void;\n clearProjectFilters: () => void;\n setMemberFilters: (filters: Partial<MemberFilters>) => void;\n clearMemberFilters: () => void;\n\n // Actions - Selection\n toggleWorkspaceSelection: (id: string) => void;\n clearWorkspaceSelection: () => void;\n toggleProjectSelection: (id: string) => void;\n clearProjectSelection: () => void;\n toggleMemberSelection: (id: string) => void;\n clearMemberSelection: () => void;\n\n // Actions - UI\n openCreateWorkspaceDialog: () => void;\n closeCreateWorkspaceDialog: () => void;\n openCreateProjectDialog: (workspace: Workspace) => void;\n closeCreateProjectDialog: () => void;\n openInviteMemberDialog: (workspace: Workspace) => void;\n closeInviteMemberDialog: () => void;\n setCurrentWorkspace: (workspace: Workspace | null) => void;\n\n // Actions - Reset\n reset: () => void;\n}\n\nconst initialState = {\n viewMode: 'grid' as ViewMode,\n sortBy: 'name' as SortBy,\n sortDirection: 'asc' as SortDirection,\n workspaceFilters: {},\n projectFilters: {},\n memberFilters: {},\n selectedWorkspaceIds: new Set<string>(),\n selectedProjectIds: new Set<string>(),\n selectedMemberIds: new Set<string>(),\n isCreateWorkspaceDialogOpen: false,\n isCreateProjectDialogOpen: false,\n isInviteMemberDialogOpen: false,\n currentWorkspace: null,\n currentWorkspaceId: null,\n};\n\nexport const useWorkspacesStore = create<WorkspacesState>()(\n devtools(\n persist(\n (set) => ({\n ...initialState,\n\n // View actions\n setViewMode: (mode) => set({ viewMode: mode }),\n setSortBy: (sortBy) => set({ sortBy }),\n toggleSortDirection: () =>\n set((state) => ({\n sortDirection: state.sortDirection === 'asc' ? 'desc' : 'asc',\n })),\n\n // Filter actions\n setWorkspaceFilters: (filters) =>\n set((state) => ({\n workspaceFilters: { ...state.workspaceFilters, ...filters },\n })),\n clearWorkspaceFilters: () => set({ workspaceFilters: {} }),\n setProjectFilters: (filters) =>\n set((state) => ({\n projectFilters: { ...state.projectFilters, ...filters },\n })),\n clearProjectFilters: () => set({ projectFilters: {} }),\n setMemberFilters: (filters) =>\n set((state) => ({\n memberFilters: { ...state.memberFilters, ...filters },\n })),\n clearMemberFilters: () => set({ memberFilters: {} }),\n\n // Selection actions\n toggleWorkspaceSelection: (id) =>\n set((state) => {\n const newSet = new Set(state.selectedWorkspaceIds);\n if (newSet.has(id)) {\n newSet.delete(id);\n } else {\n newSet.add(id);\n }\n return { selectedWorkspaceIds: newSet };\n }),\n clearWorkspaceSelection: () => set({ selectedWorkspaceIds: new Set() }),\n toggleProjectSelection: (id) =>\n set((state) => {\n const newSet = new Set(state.selectedProjectIds);\n if (newSet.has(id)) {\n newSet.delete(id);\n } else {\n newSet.add(id);\n }\n return { selectedProjectIds: newSet };\n }),\n clearProjectSelection: () => set({ selectedProjectIds: new Set() }),\n toggleMemberSelection: (id) =>\n set((state) => {\n const newSet = new Set(state.selectedMemberIds);\n if (newSet.has(id)) {\n newSet.delete(id);\n } else {\n newSet.add(id);\n }\n return { selectedMemberIds: newSet };\n }),\n clearMemberSelection: () => set({ selectedMemberIds: new Set() }),\n\n // UI actions\n openCreateWorkspaceDialog: () => set({ isCreateWorkspaceDialogOpen: true }),\n closeCreateWorkspaceDialog: () => set({ isCreateWorkspaceDialogOpen: false }),\n openCreateProjectDialog: (workspace) =>\n set({\n isCreateProjectDialogOpen: true,\n currentWorkspace: workspace,\n }),\n closeCreateProjectDialog: () =>\n set({\n isCreateProjectDialogOpen: false,\n currentWorkspace: null,\n }),\n openInviteMemberDialog: (workspace) =>\n set({\n isInviteMemberDialogOpen: true,\n currentWorkspace: workspace,\n currentWorkspaceId: workspace.id,\n }),\n closeInviteMemberDialog: () =>\n set({\n isInviteMemberDialogOpen: false,\n currentWorkspace: null,\n currentWorkspaceId: null,\n }),\n setCurrentWorkspace: (workspace) => set({ currentWorkspace: workspace }),\n\n // Reset\n reset: () => set(initialState),\n }),\n {\n name: 'burdenoff-workspaces-storage',\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n viewMode: state.viewMode,\n sortBy: state.sortBy,\n sortDirection: state.sortDirection,\n }),\n }\n ),\n { name: 'Workspaces Store', enabled: process.env.NODE_ENV === 'development' }\n )\n);\n"],"mappings":"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"}
@@ -1,17 +1,22 @@
1
1
  //#region src/utils/formatters.ts
2
- function e(e, t = {
2
+ var e = {
3
3
  year: "numeric",
4
4
  month: "short",
5
5
  day: "numeric"
6
- }) {
6
+ }, t = /* @__PURE__ */ new Map();
7
+ function n(e) {
8
+ let n = JSON.stringify(e), r = t.get(n);
9
+ return r || (r = new Intl.DateTimeFormat("en-US", e), t.set(n, r)), r;
10
+ }
11
+ function r(t, r = e) {
7
12
  try {
8
- let n = typeof e == "string" ? new Date(e) : e;
9
- return new Intl.DateTimeFormat("en-US", t).format(n);
13
+ let e = typeof t == "string" ? new Date(t) : t;
14
+ return n(r).format(e);
10
15
  } catch {
11
16
  return "Invalid date";
12
17
  }
13
18
  }
14
- function t(e) {
19
+ function i(e) {
15
20
  try {
16
21
  let t = typeof e == "string" ? new Date(e) : e, n = (/* @__PURE__ */ new Date()).getTime() - t.getTime(), r = Math.floor(n / 1e3), i = Math.floor(r / 60), a = Math.floor(i / 60), o = Math.floor(a / 24), s = Math.floor(o / 7), c = Math.floor(o / 30), l = Math.floor(o / 365);
17
22
  return r < 60 ? "just now" : i < 60 ? `${i} ${i === 1 ? "minute" : "minutes"} ago` : a < 24 ? `${a} ${a === 1 ? "hour" : "hours"} ago` : o < 7 ? `${o} ${o === 1 ? "day" : "days"} ago` : s < 4 ? `${s} ${s === 1 ? "week" : "weeks"} ago` : c < 12 ? `${c} ${c === 1 ? "month" : "months"} ago` : `${l} ${l === 1 ? "year" : "years"} ago`;
@@ -19,8 +24,8 @@ function t(e) {
19
24
  return "Invalid date";
20
25
  }
21
26
  }
22
- function n(t) {
23
- return e(t, {
27
+ function a(e) {
28
+ return r(e, {
24
29
  year: "numeric",
25
30
  month: "short",
26
31
  day: "numeric",
@@ -28,23 +33,23 @@ function n(t) {
28
33
  minute: "2-digit"
29
34
  });
30
35
  }
31
- function r(e, t) {
36
+ function o(e, t) {
32
37
  return e.length <= t ? e : `${e.slice(0, t)}...`;
33
38
  }
34
- function i(e) {
39
+ function s(e) {
35
40
  return e.toLowerCase().split(" ").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
36
41
  }
37
- function a(e) {
38
- return i(e.replace(/_/g, " "));
42
+ function c(e) {
43
+ return s(e.replace(/_/g, " "));
39
44
  }
40
- function o(e) {
41
- return i(e.replace(/_/g, " "));
45
+ function l(e) {
46
+ return s(e.replace(/_/g, " "));
42
47
  }
43
- function s(e) {
48
+ function u(e) {
44
49
  let t = e.trim().split(/\s+/);
45
50
  return t.length === 1 ? t[0].charAt(0).toUpperCase() : (t[0].charAt(0) + t[t.length - 1].charAt(0)).toUpperCase();
46
51
  }
47
- function c(e) {
52
+ function d(e) {
48
53
  if (e === 0) return "0 Bytes";
49
54
  let t = 1024, n = [
50
55
  "Bytes",
@@ -56,6 +61,6 @@ function c(e) {
56
61
  return `${parseFloat((e / t ** +r).toFixed(2))} ${n[r]}`;
57
62
  }
58
63
  //#endregion
59
- export { e as formatDate, n as formatDateTime, c as formatFileSize, o as formatProjectStatus, t as formatRelativeTime, a as formatWorkspaceStatus, s as getInitials, i as toTitleCase, r as truncate };
64
+ export { r as formatDate, a as formatDateTime, d as formatFileSize, l as formatProjectStatus, i as formatRelativeTime, c as formatWorkspaceStatus, u as getInitials, s as toTitleCase, o as truncate };
60
65
 
61
66
  //# sourceMappingURL=formatters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.js","names":[],"sources":["../../src/utils/formatters.ts"],"sourcesContent":["/**\n * Utility functions for formatting dates and strings in the workspace module\n */\n\n/**\n * Format a date string or Date object to a human-readable format\n * @param date - Date string or Date object\n * @param options - Intl.DateTimeFormatOptions\n * @returns Formatted date string\n */\nexport function formatDate(\n date: string | Date,\n options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }\n): string {\n try {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n return new Intl.DateTimeFormat('en-US', options).format(dateObj);\n } catch {\n return 'Invalid date';\n }\n}\n\n/**\n * Format a date to a relative time string (e.g., \"2 days ago\")\n * @param date - Date string or Date object\n * @returns Relative time string\n */\nexport function formatRelativeTime(date: string | Date): string {\n try {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n const now = new Date();\n const diffMs = now.getTime() - dateObj.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n const diffWeek = Math.floor(diffDay / 7);\n const diffMonth = Math.floor(diffDay / 30);\n const diffYear = Math.floor(diffDay / 365);\n\n if (diffSec < 60) {\n return 'just now';\n } else if (diffMin < 60) {\n return `${diffMin} ${diffMin === 1 ? 'minute' : 'minutes'} ago`;\n } else if (diffHour < 24) {\n return `${diffHour} ${diffHour === 1 ? 'hour' : 'hours'} ago`;\n } else if (diffDay < 7) {\n return `${diffDay} ${diffDay === 1 ? 'day' : 'days'} ago`;\n } else if (diffWeek < 4) {\n return `${diffWeek} ${diffWeek === 1 ? 'week' : 'weeks'} ago`;\n } else if (diffMonth < 12) {\n return `${diffMonth} ${diffMonth === 1 ? 'month' : 'months'} ago`;\n } else {\n return `${diffYear} ${diffYear === 1 ? 'year' : 'years'} ago`;\n }\n } catch {\n return 'Invalid date';\n }\n}\n\n/**\n * Format a date and time to a readable string\n * @param date - Date string or Date object\n * @returns Formatted date and time string\n */\nexport function formatDateTime(date: string | Date): string {\n return formatDate(date, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n}\n\n/**\n * Truncate a string to a maximum length and add ellipsis\n * @param str - String to truncate\n * @param maxLength - Maximum length before truncation\n * @returns Truncated string\n */\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return `${str.slice(0, maxLength)}...`;\n}\n\n/**\n * Convert a string to title case\n * @param str - String to convert\n * @returns Title cased string\n */\nexport function toTitleCase(str: string): string {\n return str\n .toLowerCase()\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Format a workspace status to a human-readable string\n * @param status - Workspace status\n * @returns Formatted status string\n */\nexport function formatWorkspaceStatus(status: string): string {\n return toTitleCase(status.replace(/_/g, ' '));\n}\n\n/**\n * Format a project status to a human-readable string\n * @param status - Project status\n * @returns Formatted status string\n */\nexport function formatProjectStatus(status: string): string {\n return toTitleCase(status.replace(/_/g, ' '));\n}\n\n/**\n * Generate initials from a name\n * @param name - Full name\n * @returns Initials (up to 2 characters)\n */\nexport function getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) {\n return parts[0].charAt(0).toUpperCase();\n }\n return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();\n}\n\n/**\n * Format a file size in bytes to a human-readable string\n * @param bytes - Size in bytes\n * @returns Formatted size string (e.g., \"1.5 MB\")\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n"],"mappings":";AAUA,SAAgB,EACd,GACA,IAAsC;CACpC,MAAM;CACN,OAAO;CACP,KAAK;CACN,EACO;AACR,KAAI;EACF,IAAM,IAAU,OAAO,KAAS,WAAW,IAAI,KAAK,EAAK,GAAG;AAC5D,SAAO,IAAI,KAAK,eAAe,SAAS,EAAQ,CAAC,OAAO,EAAQ;SAC1D;AACN,SAAO;;;AASX,SAAgB,EAAmB,GAA6B;AAC9D,KAAI;EACF,IAAM,IAAU,OAAO,KAAS,WAAW,IAAI,KAAK,EAAK,GAAG,GAEtD,qBADM,IAAI,MAAM,EACH,SAAS,GAAG,EAAQ,SAAS,EAC1C,IAAU,KAAK,MAAM,IAAS,IAAK,EACnC,IAAU,KAAK,MAAM,IAAU,GAAG,EAClC,IAAW,KAAK,MAAM,IAAU,GAAG,EACnC,IAAU,KAAK,MAAM,IAAW,GAAG,EACnC,IAAW,KAAK,MAAM,IAAU,EAAE,EAClC,IAAY,KAAK,MAAM,IAAU,GAAG,EACpC,IAAW,KAAK,MAAM,IAAU,IAAI;AAexC,SAbE,IAAU,KACL,aACE,IAAU,KACZ,GAAG,EAAQ,GAAG,MAAY,IAAI,WAAW,UAAU,QACjD,IAAW,KACb,GAAG,EAAS,GAAG,MAAa,IAAI,SAAS,QAAQ,QAC/C,IAAU,IACZ,GAAG,EAAQ,GAAG,MAAY,IAAI,QAAQ,OAAO,QAC3C,IAAW,IACb,GAAG,EAAS,GAAG,MAAa,IAAI,SAAS,QAAQ,QAC/C,IAAY,KACd,GAAG,EAAU,GAAG,MAAc,IAAI,UAAU,SAAS,QAErD,GAAG,EAAS,GAAG,MAAa,IAAI,SAAS,QAAQ;SAEpD;AACN,SAAO;;;AASX,SAAgB,EAAe,GAA6B;AAC1D,QAAO,EAAW,GAAM;EACtB,MAAM;EACN,OAAO;EACP,KAAK;EACL,MAAM;EACN,QAAQ;EACT,CAAC;;AASJ,SAAgB,EAAS,GAAa,GAA2B;AAE/D,QADI,EAAI,UAAU,IAAkB,IAC7B,GAAG,EAAI,MAAM,GAAG,EAAU,CAAC;;AAQpC,SAAgB,EAAY,GAAqB;AAC/C,QAAO,EACJ,aAAa,CACb,MAAM,IAAI,CACV,KAAK,MAAS,EAAK,OAAO,EAAE,CAAC,aAAa,GAAG,EAAK,MAAM,EAAE,CAAC,CAC3D,KAAK,IAAI;;AAQd,SAAgB,EAAsB,GAAwB;AAC5D,QAAO,EAAY,EAAO,QAAQ,MAAM,IAAI,CAAC;;AAQ/C,SAAgB,EAAoB,GAAwB;AAC1D,QAAO,EAAY,EAAO,QAAQ,MAAM,IAAI,CAAC;;AAQ/C,SAAgB,EAAY,GAAsB;CAChD,IAAM,IAAQ,EAAK,MAAM,CAAC,MAAM,MAAM;AAItC,QAHI,EAAM,WAAW,IACZ,EAAM,GAAG,OAAO,EAAE,CAAC,aAAa,IAEjC,EAAM,GAAG,OAAO,EAAE,GAAG,EAAM,EAAM,SAAS,GAAG,OAAO,EAAE,EAAE,aAAa;;AAQ/E,SAAgB,EAAe,GAAuB;AACpD,KAAI,MAAU,EAAG,QAAO;CAExB,IAAM,IAAI,MACJ,IAAQ;EAAC;EAAS;EAAM;EAAM;EAAM;EAAK,EACzC,IAAI,KAAK,MAAM,KAAK,IAAI,EAAM,GAAG,KAAK,IAAI,EAAE,CAAC;AAEnD,QAAO,GAAG,YAAY,IAAiB,MAAG,GAAI,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAM"}
1
+ {"version":3,"file":"formatters.js","names":[],"sources":["../../src/utils/formatters.ts"],"sourcesContent":["/**\n * Utility functions for formatting dates and strings in the workspace module\n */\n\n/**\n * Format a date string or Date object to a human-readable format\n * @param date - Date string or Date object\n * @param options - Intl.DateTimeFormatOptions\n * @returns Formatted date string\n */\nconst DEFAULT_DATE_OPTIONS: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n};\n\nconst dateFormatterCache = new Map<string, Intl.DateTimeFormat>();\n\nfunction getDateFormatter(options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n const key = JSON.stringify(options);\n let formatter = dateFormatterCache.get(key);\n if (!formatter) {\n formatter = new Intl.DateTimeFormat('en-US', options);\n dateFormatterCache.set(key, formatter);\n }\n return formatter;\n}\n\nexport function formatDate(\n date: string | Date,\n options: Intl.DateTimeFormatOptions = DEFAULT_DATE_OPTIONS\n): string {\n try {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n return getDateFormatter(options).format(dateObj);\n } catch {\n return 'Invalid date';\n }\n}\n\n/**\n * Format a date to a relative time string (e.g., \"2 days ago\")\n * @param date - Date string or Date object\n * @returns Relative time string\n */\nexport function formatRelativeTime(date: string | Date): string {\n try {\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n const now = new Date();\n const diffMs = now.getTime() - dateObj.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n const diffWeek = Math.floor(diffDay / 7);\n const diffMonth = Math.floor(diffDay / 30);\n const diffYear = Math.floor(diffDay / 365);\n\n if (diffSec < 60) {\n return 'just now';\n } else if (diffMin < 60) {\n return `${diffMin} ${diffMin === 1 ? 'minute' : 'minutes'} ago`;\n } else if (diffHour < 24) {\n return `${diffHour} ${diffHour === 1 ? 'hour' : 'hours'} ago`;\n } else if (diffDay < 7) {\n return `${diffDay} ${diffDay === 1 ? 'day' : 'days'} ago`;\n } else if (diffWeek < 4) {\n return `${diffWeek} ${diffWeek === 1 ? 'week' : 'weeks'} ago`;\n } else if (diffMonth < 12) {\n return `${diffMonth} ${diffMonth === 1 ? 'month' : 'months'} ago`;\n } else {\n return `${diffYear} ${diffYear === 1 ? 'year' : 'years'} ago`;\n }\n } catch {\n return 'Invalid date';\n }\n}\n\n/**\n * Format a date and time to a readable string\n * @param date - Date string or Date object\n * @returns Formatted date and time string\n */\nexport function formatDateTime(date: string | Date): string {\n return formatDate(date, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n}\n\n/**\n * Truncate a string to a maximum length and add ellipsis\n * @param str - String to truncate\n * @param maxLength - Maximum length before truncation\n * @returns Truncated string\n */\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return `${str.slice(0, maxLength)}...`;\n}\n\n/**\n * Convert a string to title case\n * @param str - String to convert\n * @returns Title cased string\n */\nexport function toTitleCase(str: string): string {\n return str\n .toLowerCase()\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Format a workspace status to a human-readable string\n * @param status - Workspace status\n * @returns Formatted status string\n */\nexport function formatWorkspaceStatus(status: string): string {\n return toTitleCase(status.replace(/_/g, ' '));\n}\n\n/**\n * Format a project status to a human-readable string\n * @param status - Project status\n * @returns Formatted status string\n */\nexport function formatProjectStatus(status: string): string {\n return toTitleCase(status.replace(/_/g, ' '));\n}\n\n/**\n * Generate initials from a name\n * @param name - Full name\n * @returns Initials (up to 2 characters)\n */\nexport function getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) {\n return parts[0].charAt(0).toUpperCase();\n }\n return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();\n}\n\n/**\n * Format a file size in bytes to a human-readable string\n * @param bytes - Size in bytes\n * @returns Formatted size string (e.g., \"1.5 MB\")\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n"],"mappings":";AAUA,IAAM,IAAmD;CACvD,MAAM;CACN,OAAO;CACP,KAAK;CACN,EAEK,oBAAqB,IAAI,KAAkC;AAEjE,SAAS,EAAiB,GAA0D;CAClF,IAAM,IAAM,KAAK,UAAU,EAAQ,EAC/B,IAAY,EAAmB,IAAI,EAAI;AAK3C,QAJK,MACH,IAAY,IAAI,KAAK,eAAe,SAAS,EAAQ,EACrD,EAAmB,IAAI,GAAK,EAAU,GAEjC;;AAGT,SAAgB,EACd,GACA,IAAsC,GAC9B;AACR,KAAI;EACF,IAAM,IAAU,OAAO,KAAS,WAAW,IAAI,KAAK,EAAK,GAAG;AAC5D,SAAO,EAAiB,EAAQ,CAAC,OAAO,EAAQ;SAC1C;AACN,SAAO;;;AASX,SAAgB,EAAmB,GAA6B;AAC9D,KAAI;EACF,IAAM,IAAU,OAAO,KAAS,WAAW,IAAI,KAAK,EAAK,GAAG,GAEtD,qBADM,IAAI,MAAM,EACH,SAAS,GAAG,EAAQ,SAAS,EAC1C,IAAU,KAAK,MAAM,IAAS,IAAK,EACnC,IAAU,KAAK,MAAM,IAAU,GAAG,EAClC,IAAW,KAAK,MAAM,IAAU,GAAG,EACnC,IAAU,KAAK,MAAM,IAAW,GAAG,EACnC,IAAW,KAAK,MAAM,IAAU,EAAE,EAClC,IAAY,KAAK,MAAM,IAAU,GAAG,EACpC,IAAW,KAAK,MAAM,IAAU,IAAI;AAexC,SAbE,IAAU,KACL,aACE,IAAU,KACZ,GAAG,EAAQ,GAAG,MAAY,IAAI,WAAW,UAAU,QACjD,IAAW,KACb,GAAG,EAAS,GAAG,MAAa,IAAI,SAAS,QAAQ,QAC/C,IAAU,IACZ,GAAG,EAAQ,GAAG,MAAY,IAAI,QAAQ,OAAO,QAC3C,IAAW,IACb,GAAG,EAAS,GAAG,MAAa,IAAI,SAAS,QAAQ,QAC/C,IAAY,KACd,GAAG,EAAU,GAAG,MAAc,IAAI,UAAU,SAAS,QAErD,GAAG,EAAS,GAAG,MAAa,IAAI,SAAS,QAAQ;SAEpD;AACN,SAAO;;;AASX,SAAgB,EAAe,GAA6B;AAC1D,QAAO,EAAW,GAAM;EACtB,MAAM;EACN,OAAO;EACP,KAAK;EACL,MAAM;EACN,QAAQ;EACT,CAAC;;AASJ,SAAgB,EAAS,GAAa,GAA2B;AAE/D,QADI,EAAI,UAAU,IAAkB,IAC7B,GAAG,EAAI,MAAM,GAAG,EAAU,CAAC;;AAQpC,SAAgB,EAAY,GAAqB;AAC/C,QAAO,EACJ,aAAa,CACb,MAAM,IAAI,CACV,KAAK,MAAS,EAAK,OAAO,EAAE,CAAC,aAAa,GAAG,EAAK,MAAM,EAAE,CAAC,CAC3D,KAAK,IAAI;;AAQd,SAAgB,EAAsB,GAAwB;AAC5D,QAAO,EAAY,EAAO,QAAQ,MAAM,IAAI,CAAC;;AAQ/C,SAAgB,EAAoB,GAAwB;AAC1D,QAAO,EAAY,EAAO,QAAQ,MAAM,IAAI,CAAC;;AAQ/C,SAAgB,EAAY,GAAsB;CAChD,IAAM,IAAQ,EAAK,MAAM,CAAC,MAAM,MAAM;AAItC,QAHI,EAAM,WAAW,IACZ,EAAM,GAAG,OAAO,EAAE,CAAC,aAAa,IAEjC,EAAM,GAAG,OAAO,EAAE,GAAG,EAAM,EAAM,SAAS,GAAG,OAAO,EAAE,EAAE,aAAa;;AAQ/E,SAAgB,EAAe,GAAuB;AACpD,KAAI,MAAU,EAAG,QAAO;CAExB,IAAM,IAAI,MACJ,IAAQ;EAAC;EAAS;EAAM;EAAM;EAAM;EAAK,EACzC,IAAI,KAAK,MAAM,KAAK,IAAI,EAAM,GAAG,KAAK,IAAI,EAAE,CAAC;AAEnD,QAAO,GAAG,YAAY,IAAiB,MAAG,GAAI,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAM"}
@@ -11,7 +11,7 @@ function n(e) {
11
11
  if (e == null) return "An unknown error occurred";
12
12
  if (t(e)) {
13
13
  if (e.graphQLErrors && e.graphQLErrors.length > 0) {
14
- let t = e.graphQLErrors.map((e) => typeof e?.message == "string" ? e.message : "").filter((e) => e.length > 0);
14
+ let t = e.graphQLErrors.flatMap((e) => typeof e?.message == "string" && e.message.length > 0 ? [e.message] : []);
15
15
  if (t.length > 0) return t.join(", ");
16
16
  }
17
17
  return e.networkError ? "Network error. Please check your connection." : e.message;
@@ -1 +1 @@
1
- {"version":3,"file":"telemetryError.js","names":[],"sources":["../../src/utils/telemetryError.ts"],"sourcesContent":["/**\n * Build a payload-safe error string for the event bus / OtelBrowserSink.\n *\n * Apollo errors expose a `graphQLErrors[*].message` array — these are the\n * server-sanitized messages. For native Errors and arbitrary throws we fall\n * back to `.message` / String coercion. Everything is capped at 200 chars\n * so stack frames or SQL fragments that slip through don't end up in audit\n * sinks. Keep in sync with SRE guide §7.\n *\n * Trust assumption: server error messages are assumed sanitized. Callers\n * MUST NOT pass raw user input through this helper — its job is to bound\n * the size and shape, not to scrub PII.\n */\nconst MAX_TELEMETRY_ERROR_LEN = 200;\n\ninterface ApolloErrorLike {\n graphQLErrors?: Array<{ message: string }>;\n networkError?: Error & { statusCode?: number };\n message: string;\n}\n\nfunction isApolloErrorLike(err: unknown): err is ApolloErrorLike {\n if (typeof err !== 'object' || err === null) return false;\n const e = err as Record<string, unknown>;\n // Must look like an Apollo error in shape, not just key-presence:\n // - `graphQLErrors`, when present, must be an array (null / wrong-type\n // versions of the property silently passed the old guard).\n // - `networkError`, when present, must be an Error instance.\n // - `message` must be a string (Apollo always sets one).\n if (typeof e['message'] !== 'string') return false;\n const hasArrayGqlErrors = Array.isArray(e['graphQLErrors']);\n const hasErrorNetwork = e['networkError'] instanceof Error;\n return hasArrayGqlErrors || hasErrorNetwork;\n}\n\nfunction rawMessage(err: unknown): string {\n if (err == null) return 'An unknown error occurred';\n if (isApolloErrorLike(err)) {\n if (err.graphQLErrors && err.graphQLErrors.length > 0) {\n // Filter out anything without a string message — wrong-shape entries\n // would otherwise stringify to \"undefined\" and dilute the output.\n const messages = err.graphQLErrors\n .map((e) => (typeof e?.message === 'string' ? e.message : ''))\n .filter((m) => m.length > 0);\n if (messages.length > 0) return messages.join(', ');\n }\n if (err.networkError) {\n return 'Network error. Please check your connection.';\n }\n return err.message;\n }\n if (err instanceof Error) return err.message;\n if (typeof err === 'string') return err;\n return String(err);\n}\n\nexport function safeTelemetryError(err: unknown): string {\n const msg = rawMessage(err);\n if (msg.length <= MAX_TELEMETRY_ERROR_LEN) return msg;\n return `${msg.slice(0, MAX_TELEMETRY_ERROR_LEN - 1)}…`;\n}\n"],"mappings":";AAaA,IAAM,IAA0B;AAQhC,SAAS,EAAkB,GAAsC;AAC/D,KAAI,OAAO,KAAQ,aAAY,EAAc,QAAO;CACpD,IAAM,IAAI;AAMV,KAAI,OAAO,EAAE,WAAe,SAAU,QAAO;CAC7C,IAAM,IAAoB,MAAM,QAAQ,EAAE,cAAiB,EACrD,IAAkB,EAAE,wBAA2B;AACrD,QAAO,KAAqB;;AAG9B,SAAS,EAAW,GAAsB;AACxC,KAAI,KAAO,KAAM,QAAO;AACxB,KAAI,EAAkB,EAAI,EAAE;AAC1B,MAAI,EAAI,iBAAiB,EAAI,cAAc,SAAS,GAAG;GAGrD,IAAM,IAAW,EAAI,cAClB,KAAK,MAAO,OAAO,GAAG,WAAY,WAAW,EAAE,UAAU,GAAI,CAC7D,QAAQ,MAAM,EAAE,SAAS,EAAE;AAC9B,OAAI,EAAS,SAAS,EAAG,QAAO,EAAS,KAAK,KAAK;;AAKrD,SAHI,EAAI,eACC,iDAEF,EAAI;;AAIb,QAFI,aAAe,QAAc,EAAI,UACjC,OAAO,KAAQ,WAAiB,IAC7B,OAAO,EAAI;;AAGpB,SAAgB,EAAmB,GAAsB;CACvD,IAAM,IAAM,EAAW,EAAI;AAE3B,QADI,EAAI,UAAU,IAAgC,IAC3C,GAAG,EAAI,MAAM,GAAG,IAA0B,EAAE,CAAC"}
1
+ {"version":3,"file":"telemetryError.js","names":[],"sources":["../../src/utils/telemetryError.ts"],"sourcesContent":["/**\n * Build a payload-safe error string for the event bus / OtelBrowserSink.\n *\n * Apollo errors expose a `graphQLErrors[*].message` array — these are the\n * server-sanitized messages. For native Errors and arbitrary throws we fall\n * back to `.message` / String coercion. Everything is capped at 200 chars\n * so stack frames or SQL fragments that slip through don't end up in audit\n * sinks. Keep in sync with SRE guide §7.\n *\n * Trust assumption: server error messages are assumed sanitized. Callers\n * MUST NOT pass raw user input through this helper — its job is to bound\n * the size and shape, not to scrub PII.\n */\nconst MAX_TELEMETRY_ERROR_LEN = 200;\n\ninterface ApolloErrorLike {\n graphQLErrors?: Array<{ message: string }>;\n networkError?: Error & { statusCode?: number };\n message: string;\n}\n\nfunction isApolloErrorLike(err: unknown): err is ApolloErrorLike {\n if (typeof err !== 'object' || err === null) return false;\n const e = err as Record<string, unknown>;\n // Must look like an Apollo error in shape, not just key-presence:\n // - `graphQLErrors`, when present, must be an array (null / wrong-type\n // versions of the property silently passed the old guard).\n // - `networkError`, when present, must be an Error instance.\n // - `message` must be a string (Apollo always sets one).\n if (typeof e['message'] !== 'string') return false;\n const hasArrayGqlErrors = Array.isArray(e['graphQLErrors']);\n const hasErrorNetwork = e['networkError'] instanceof Error;\n return hasArrayGqlErrors || hasErrorNetwork;\n}\n\nfunction rawMessage(err: unknown): string {\n if (err == null) return 'An unknown error occurred';\n if (isApolloErrorLike(err)) {\n if (err.graphQLErrors && err.graphQLErrors.length > 0) {\n // Filter out anything without a string message — wrong-shape entries\n // would otherwise stringify to \"undefined\" and dilute the output.\n const messages = err.graphQLErrors.flatMap((e) =>\n typeof e?.message === 'string' && e.message.length > 0 ? [e.message] : []\n );\n if (messages.length > 0) return messages.join(', ');\n }\n if (err.networkError) {\n return 'Network error. Please check your connection.';\n }\n return err.message;\n }\n if (err instanceof Error) return err.message;\n if (typeof err === 'string') return err;\n return String(err);\n}\n\nexport function safeTelemetryError(err: unknown): string {\n const msg = rawMessage(err);\n if (msg.length <= MAX_TELEMETRY_ERROR_LEN) return msg;\n return `${msg.slice(0, MAX_TELEMETRY_ERROR_LEN - 1)}…`;\n}\n"],"mappings":";AAaA,IAAM,IAA0B;AAQhC,SAAS,EAAkB,GAAsC;AAC/D,KAAI,OAAO,KAAQ,aAAY,EAAc,QAAO;CACpD,IAAM,IAAI;AAMV,KAAI,OAAO,EAAE,WAAe,SAAU,QAAO;CAC7C,IAAM,IAAoB,MAAM,QAAQ,EAAE,cAAiB,EACrD,IAAkB,EAAE,wBAA2B;AACrD,QAAO,KAAqB;;AAG9B,SAAS,EAAW,GAAsB;AACxC,KAAI,KAAO,KAAM,QAAO;AACxB,KAAI,EAAkB,EAAI,EAAE;AAC1B,MAAI,EAAI,iBAAiB,EAAI,cAAc,SAAS,GAAG;GAGrD,IAAM,IAAW,EAAI,cAAc,SAAS,MAC1C,OAAO,GAAG,WAAY,YAAY,EAAE,QAAQ,SAAS,IAAI,CAAC,EAAE,QAAQ,GAAG,EAAE,CAC1E;AACD,OAAI,EAAS,SAAS,EAAG,QAAO,EAAS,KAAK,KAAK;;AAKrD,SAHI,EAAI,eACC,iDAEF,EAAI;;AAIb,QAFI,aAAe,QAAc,EAAI,UACjC,OAAO,KAAQ,WAAiB,IAC7B,OAAO,EAAI;;AAGpB,SAAgB,EAAmB,GAAsB;CACvD,IAAM,IAAM,EAAW,EAAI;AAE3B,QADI,EAAI,UAAU,IAAgC,IAC3C,GAAG,EAAI,MAAM,GAAG,IAA0B,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-workspaces",
3
- "version": "2026.520.1",
3
+ "version": "2026.529.1",
4
4
  "description": "Workspaces microfrontend for Burdenoff products",
5
5
  "type": "module",
6
6
  "files": [
@@ -44,11 +44,10 @@
44
44
  },
45
45
  "dependencies": {
46
46
  "@apollo/client": "^4.0.11",
47
- "@burdenoff/fe-libs": "2026.518.7",
48
- "@iconify/react": "^6.0.2",
47
+ "@burdenoff/fe-libs": "2026.528.9",
49
48
  "@radix-ui/react-icons": "^1.3.2",
50
49
  "@tanstack/react-query": "^5.62.13",
51
- "axios": ">=1.15.0",
50
+ "axios": "^1.15.2",
52
51
  "graphql": "^16.10.0",
53
52
  "graphql-ws": "^5.16.0",
54
53
  "immer": "^11.1.0",
@@ -103,16 +102,17 @@
103
102
  "lodash-es": ">=4.17.21",
104
103
  "dompurify": ">=3.3.4",
105
104
  "fast-xml-parser": ">=4.5.5",
106
- "@xmldom/xmldom": ">=0.8.12",
105
+ "@xmldom/xmldom": ">=0.8.13",
107
106
  "swiper": ">=12.1.2",
108
107
  "brace-expansion": ">=1.1.13",
109
108
  "follow-redirects": ">=1.15.12",
110
109
  "smol-toml": ">=1.6.1",
111
- "axios": ">=1.15.0",
112
110
  "flatted": ">=3.4.1",
113
111
  "yaml": ">=2.8.3",
114
112
  "picomatch": ">=2.3.2",
115
113
  "immutable": ">=3.8.3",
116
- "minimatch": ">=3.1.3"
114
+ "minimatch": ">=3.1.3",
115
+ "fast-uri": ">=3.1.2",
116
+ "ws": ">=8.20.1"
117
117
  }
118
118
  }
@@ -1,35 +0,0 @@
1
- import { FC } from 'react';
2
- import { WorkspacesRootProps } from './types';
3
-
4
- /**
5
- * Root component for the Workspaces microfrontend.
6
- *
7
- * This is the main entry point that host applications import and render.
8
- * It sets up the necessary providers and renders the internal routing.
9
- * Automatically registers navigation items with the shell if registration functions are provided.
10
- * Nav items for feature-previewed pages (projects, members, activity) are conditionally
11
- * hidden based on feature flags.
12
- *
13
- * @example
14
- * ```tsx
15
- * import { WorkspacesRoot } from '@burdenoff/micro-fe/workspaces';
16
- *
17
- * function App() {
18
- * return (
19
- * <Route path="/workspaces/*" element={
20
- * <WorkspacesRoot
21
- * basePath="/workspaces"
22
- * navigate={navigate}
23
- * currentUser={user}
24
- * workspaceId="ws-123"
25
- * tenantId="tenant-123"
26
- * apiGatewayUrl="https://gw-global.local.burdenoff.com"
27
- * authToken="token"
28
- * />
29
- * } />
30
- * );
31
- * }
32
- * ```
33
- */
34
- export declare const WorkspacesRoot: FC<WorkspacesRootProps>;
35
- //# sourceMappingURL=WorkspacesRoot.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkspacesRoot.d.ts","sourceRoot":"","sources":["../src/WorkspacesRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAMhC,OAAO,KAAK,EAAW,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAG5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAsGlD,CAAC"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Internal routing for the Workspaces microfrontend.
3
- * Defines all routes and their corresponding page components.
4
- *
5
- * - WorkspacesListPage: Eager loaded (main entry point)
6
- * - All other pages: Lazy loaded for better performance
7
- * - Projects, Members, Activity: gated by feature flags (unreleased)
8
- */
9
- export declare function WorkspacesRoutes(): import("react/jsx-runtime").JSX.Element;
10
- //# sourceMappingURL=WorkspacesRoutes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkspacesRoutes.d.ts","sourceRoot":"","sources":["../src/WorkspacesRoutes.tsx"],"names":[],"mappings":"AAmFA;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,4CAqD/B"}
@@ -1,6 +0,0 @@
1
- interface CreateProjectDialogProps {
2
- workspaceId?: string;
3
- }
4
- export declare function CreateProjectDialog({ workspaceId }: CreateProjectDialogProps): import("react/jsx-runtime").JSX.Element;
5
- export {};
6
- //# sourceMappingURL=CreateProjectDialog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CreateProjectDialog.d.ts","sourceRoot":"","sources":["../../src/components/CreateProjectDialog.tsx"],"names":[],"mappings":"AAuCA,UAAU,wBAAwB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CAsI5E"}
@@ -1,2 +0,0 @@
1
- export declare function CreateWorkspaceDialog(): import("react/jsx-runtime").JSX.Element;
2
- //# sourceMappingURL=CreateWorkspaceDialog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CreateWorkspaceDialog.d.ts","sourceRoot":"","sources":["../../src/components/CreateWorkspaceDialog.tsx"],"names":[],"mappings":"AA+CA,wBAAgB,qBAAqB,4CA6OpC"}
@@ -1,7 +0,0 @@
1
- interface InviteMemberDialogProps {
2
- /** Workspace ID to invite the member to (from URL params) */
3
- workspaceId?: string;
4
- }
5
- export declare function InviteMemberDialog({ workspaceId }: InviteMemberDialogProps): import("react/jsx-runtime").JSX.Element;
6
- export {};
7
- //# sourceMappingURL=InviteMemberDialog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InviteMemberDialog.d.ts","sourceRoot":"","sources":["../../src/components/InviteMemberDialog.tsx"],"names":[],"mappings":"AAoCA,UAAU,uBAAuB;IAC/B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,WAAW,EAAE,EAAE,uBAAuB,2CAkL1E"}
@@ -1,11 +0,0 @@
1
- import { WorkspaceMember } from '../types';
2
-
3
- export interface MemberListItemProps {
4
- member: WorkspaceMember;
5
- onUpdateRoles?: (memberId: string, roleIds: string[]) => void;
6
- selected?: boolean;
7
- onToggleSelect?: (checked: boolean) => void;
8
- canRemove?: boolean;
9
- }
10
- export declare function MemberListItem({ member, selected, onToggleSelect, canRemove, }: MemberListItemProps): import("react/jsx-runtime").JSX.Element;
11
- //# sourceMappingURL=MemberListItem.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MemberListItem.d.ts","sourceRoot":"","sources":["../../src/components/MemberListItem.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAmBhD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,eAAe,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,QAAgB,EAChB,cAAc,EACd,SAAiB,GAClB,EAAE,mBAAmB,2CAwHrB"}
@@ -1,13 +0,0 @@
1
- import { Project, ProjectTag } from '../types';
2
-
3
- interface ProjectCardProps {
4
- project: Project;
5
- selected?: boolean;
6
- onToggleSelect?: (checked: boolean) => void;
7
- onTagClick?: (tag: ProjectTag) => void;
8
- canArchive?: boolean;
9
- canDelete?: boolean;
10
- }
11
- export declare function ProjectCard({ project, selected, onToggleSelect, onTagClick, canArchive, canDelete, }: ProjectCardProps): import("react/jsx-runtime").JSX.Element;
12
- export {};
13
- //# sourceMappingURL=ProjectCard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProjectCard.d.ts","sourceRoot":"","sources":["../../src/components/ProjectCard.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAapD,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,QAAgB,EAChB,cAAc,EACd,UAAU,EACV,UAAkB,EAClB,SAAiB,GAClB,EAAE,gBAAgB,2CA4JlB"}
@@ -1,8 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,27 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,8 +0,0 @@
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
@@ -1 +0,0 @@
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"}