@burdenoff/microfe-workspaces 2026.801.1 → 2026.825.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 (52) hide show
  1. package/dist/generated/global-operations.js +44 -1
  2. package/dist/generated/global-operations.js.map +1 -1
  3. package/dist/generated/wspace-operations.js +18 -18
  4. package/dist/generated/wspace-operations.js.map +1 -1
  5. package/dist/hooks/useMemberMutations.js +0 -2
  6. package/dist/hooks/useMemberMutations.js.map +1 -1
  7. package/dist/hooks/useWorkspaceMutations.js +84 -61
  8. package/dist/hooks/useWorkspaceMutations.js.map +1 -1
  9. package/dist/hooks/useWorkspacesEventEmitter.js.map +1 -1
  10. package/dist/pages/WorkspaceDetailPage.js +152 -114
  11. package/dist/pages/WorkspaceDetailPage.js.map +1 -1
  12. package/dist/pages/dashboard/DashboardCustomizer.js +62 -62
  13. package/dist/pages/dashboard/DashboardCustomizer.js.map +1 -1
  14. package/dist/pages/dashboard/DashboardPage.js +88 -69
  15. package/dist/pages/dashboard/DashboardPage.js.map +1 -1
  16. package/dist/pages/dashboard/config.js +77 -1
  17. package/dist/pages/dashboard/config.js.map +1 -1
  18. package/dist/pages/dashboard/widgets/AgentsWidget.js +56 -54
  19. package/dist/pages/dashboard/widgets/AgentsWidget.js.map +1 -1
  20. package/dist/pages/dashboard/widgets/GroupsWidget.js +29 -31
  21. package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -1
  22. package/dist/pages/dashboard/widgets/MembersWidget.js +33 -33
  23. package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -1
  24. package/dist/pages/dashboard/widgets/ProjectsWidget.js +42 -44
  25. package/dist/pages/dashboard/widgets/ProjectsWidget.js.map +1 -1
  26. package/dist/pages/dashboard/widgets/QuickActionsWidget.js +171 -161
  27. package/dist/pages/dashboard/widgets/QuickActionsWidget.js.map +1 -1
  28. package/dist/pages/dashboard/widgets/RecentActivityWidget.js +54 -44
  29. package/dist/pages/dashboard/widgets/RecentActivityWidget.js.map +1 -1
  30. package/dist/pages/dashboard/widgets/SessionsWidget.js +57 -41
  31. package/dist/pages/dashboard/widgets/SessionsWidget.js.map +1 -1
  32. package/dist/pages/dashboard/widgets/StorageWidget.js +52 -54
  33. package/dist/pages/dashboard/widgets/StorageWidget.js.map +1 -1
  34. package/dist/pages/dashboard/widgets/TagCloudWidget.js +28 -30
  35. package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -1
  36. package/dist/pages/dashboard/widgets/TipsWidget.js +141 -131
  37. package/dist/pages/dashboard/widgets/TipsWidget.js.map +1 -1
  38. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js +46 -40
  39. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js.map +1 -1
  40. package/dist/pages/dashboard/widgets/VibesWidget.js +44 -34
  41. package/dist/pages/dashboard/widgets/VibesWidget.js.map +1 -1
  42. package/dist/pages/dashboard/widgets/WelcomeWidget.js +43 -41
  43. package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -1
  44. package/dist/pages/dashboard/widgets/WorkflowRunsWidget.js +68 -62
  45. package/dist/pages/dashboard/widgets/WorkflowRunsWidget.js.map +1 -1
  46. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +50 -44
  47. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -1
  48. package/dist/pages/dashboard/widgets/WorkflowsOverviewWidget.js +59 -49
  49. package/dist/pages/dashboard/widgets/WorkflowsOverviewWidget.js.map +1 -1
  50. package/dist/pages/dashboard/widgets/WorkspacesWidget.js +35 -33
  51. package/dist/pages/dashboard/widgets/WorkspacesWidget.js.map +1 -1
  52. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"MembersWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/MembersWidget.tsx"],"sourcesContent":["import { Users, UserPlus, ArrowRight } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nexport function MembersWidget({ workspaceData, globalData, isLoading, navigate }: WidgetProps) {\n // Member count comes from globalData.workspaces (each workspace has memberCount)\n const workspaces = globalData?.workspaces?.items ?? workspaceData?.workspaces.items ?? [];\n const totalMembers = workspaces.reduce(\n (sum, ws) => sum + ((ws as { memberCount?: number }).memberCount ?? 0),\n 0\n );\n const totalWorkspaces = globalData?.workspaces?.total ?? workspaceData?.workspaces.total ?? 0;\n\n return (\n <WidgetWrapper\n title=\"Members\"\n icon={<Users className=\"size-4\" />}\n size=\"small\"\n isLoading={isLoading}\n unavailable={!workspaceData && !globalData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/workspaces/members')}\n >\n <ArrowRight className=\"size-3\" />\n </Button>\n }\n >\n <div className=\"space-y-3\">\n <div className=\"text-center\">\n <p className=\"text-3xl font-bold text-text-primary tabular-nums\">{totalMembers}</p>\n <p className=\"text-xs text-text-secondary\">\n {totalMembers === 1 ? 'Member' : 'Members'} across {totalWorkspaces}{' '}\n {totalWorkspaces === 1 ? 'workspace' : 'workspaces'}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full text-xs\"\n onClick={() => navigate('/workspaces/members?invite=true')}\n >\n <UserPlus className=\"size-3 mr-1.5\" />\n Invite a member\n </Button>\n {workspaces.length > 0 && (\n <div className=\"flex -space-x-2 justify-center\">\n {workspaces.slice(0, 5).map((ws) => (\n <div\n key={ws.id}\n className=\"size-8 rounded-full bg-action-primary-bg/10 text-primary flex items-center justify-center text-xs font-bold border-2 border-bg-surface\"\n title={ws.name}\n >\n {ws.name.charAt(0).toUpperCase()}\n </div>\n ))}\n {totalWorkspaces > 5 && (\n <div className=\"size-8 rounded-full bg-bg-sunken text-text-secondary flex items-center justify-center text-xs font-bold border-2 border-bg-surface\">\n +{totalWorkspaces - 5}\n </div>\n )}\n </div>\n )}\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,EAAc,EAAE,kBAAe,eAAY,cAAW,eAAyB;CAE7F,IAAM,IAAa,GAAY,YAAY,SAAS,GAAe,WAAW,SAAS,EAAE,EACnF,IAAe,EAAW,QAC7B,GAAK,MAAO,KAAQ,EAAgC,eAAe,IACpE,EACD,EACK,IAAkB,GAAY,YAAY,SAAS,GAAe,WAAW,SAAS;AAE5F,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;EAClC,MAAK;EACM;EACX,aAAa,CAAC,KAAiB,CAAC;EAChC,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,sBAAsB;aAE9C,kBAAC,GAAD,EAAY,WAAU,UAAW,CAAA;GAC1B,CAAA;YAGX,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAqD;MAAiB,CAAA,EACnF,kBAAC,KAAD;MAAG,WAAU;gBAAb;OACG,MAAiB,IAAI,WAAW;OAAU;OAAS;OAAiB;OACpE,MAAoB,IAAI,cAAc;OACrC;QACA;;IACN,kBAAC,GAAD;KACE,SAAQ;KACR,MAAK;KACL,WAAU;KACV,eAAe,EAAS,kCAAkC;eAJ5D,CAME,kBAAC,GAAD,EAAU,WAAU,iBAAkB,CAAA,EAAA,kBAE/B;;IACR,EAAW,SAAS,KACnB,kBAAC,OAAD;KAAK,WAAU;eAAf,CACG,EAAW,MAAM,GAAG,EAAE,CAAC,KAAK,MAC3B,kBAAC,OAAD;MAEE,WAAU;MACV,OAAO,EAAG;gBAET,EAAG,KAAK,OAAO,EAAE,CAAC,aAAa;MAC5B,EALC,EAAG,GAKJ,CACN,EACD,IAAkB,KACjB,kBAAC,OAAD;MAAK,WAAU;gBAAf,CAAoJ,KAChJ,IAAkB,EAChB;QAEJ;;IAEJ;;EACQ,CAAA"}
1
+ {"version":3,"file":"MembersWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/MembersWidget.tsx"],"sourcesContent":["import { Users, UserPlus, ArrowRight } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport { tWithFallback } from '../../../utils/i18n';\nimport type { WidgetProps } from '../types';\n\nexport function MembersWidget({ workspaceData, globalData, isLoading, navigate }: WidgetProps) {\n const { t } = useI18n();\n\n // Member count comes from globalData.workspaces (each workspace has memberCount)\n const workspaces = globalData?.workspaces?.items ?? workspaceData?.workspaces.items ?? [];\n const totalMembers = workspaces.reduce(\n (sum, ws) => sum + ((ws as { memberCount?: number }).memberCount ?? 0),\n 0\n );\n const totalWorkspaces = globalData?.workspaces?.total ?? workspaceData?.workspaces.total ?? 0;\n\n return (\n <WidgetWrapper\n title={tWithFallback(t, 'dashboard.members.title', 'Members')}\n icon={<Users className=\"size-4\" />}\n size=\"small\"\n isLoading={isLoading}\n unavailable={!workspaceData && !globalData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/workspaces/members')}\n >\n <ArrowRight className=\"size-3\" />\n </Button>\n }\n >\n <div className=\"space-y-3\">\n <div className=\"text-center\">\n <p className=\"text-3xl font-bold text-text-primary tabular-nums\">{totalMembers}</p>\n <p className=\"text-xs text-text-secondary\">\n {tWithFallback(\n t,\n 'dashboard.members.summary',\n '{memberLabel} across {count} {workspaceLabel}',\n {\n memberLabel:\n totalMembers === 1\n ? tWithFallback(t, 'dashboard.members.memberSingular', 'Member')\n : tWithFallback(t, 'dashboard.members.memberPlural', 'Members'),\n count: totalWorkspaces,\n workspaceLabel:\n totalWorkspaces === 1\n ? tWithFallback(t, 'dashboard.members.workspaceSingular', 'workspace')\n : tWithFallback(t, 'dashboard.members.workspacePlural', 'workspaces'),\n }\n )}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full text-xs\"\n onClick={() => navigate('/workspaces/members?invite=true')}\n >\n <UserPlus className=\"size-3 mr-1.5\" />\n {tWithFallback(t, 'dashboard.members.invite', 'Invite a member')}\n </Button>\n {workspaces.length > 0 && (\n <div className=\"flex -space-x-2 justify-center\">\n {workspaces.slice(0, 5).map((ws) => (\n <div\n key={ws.id}\n className=\"size-8 rounded-full bg-action-primary-bg/10 text-primary flex items-center justify-center text-xs font-bold border-2 border-bg-surface\"\n title={ws.name}\n >\n {ws.name.charAt(0).toUpperCase()}\n </div>\n ))}\n {totalWorkspaces > 5 && (\n <div className=\"size-8 rounded-full bg-bg-sunken text-text-secondary flex items-center justify-center text-xs font-bold border-2 border-bg-surface\">\n +{totalWorkspaces - 5}\n </div>\n )}\n </div>\n )}\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,EAAc,EAAE,kBAAe,eAAY,cAAW,eAAyB;CAC7F,IAAM,EAAE,SAAM,GAAS,EAGjB,IAAa,GAAY,YAAY,SAAS,GAAe,WAAW,SAAS,EAAE,EACnF,IAAe,EAAW,QAC7B,GAAK,MAAO,KAAQ,EAAgC,eAAe,IACpE,EACD,EACK,IAAkB,GAAY,YAAY,SAAS,GAAe,WAAW,SAAS;AAE5F,QACE,kBAAC,GAAD;EACE,OAAO,EAAc,GAAG,2BAA2B,UAAU;EAC7D,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;EAClC,MAAK;EACM;EACX,aAAa,CAAC,KAAiB,CAAC;EAChC,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,sBAAsB;aAE9C,kBAAC,GAAD,EAAY,WAAU,UAAW,CAAA;GAC1B,CAAA;YAGX,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAqD;MAAiB,CAAA,EACnF,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,GACA,6BACA,iDACA;OACE,aACE,MAAiB,IACb,EAAc,GAAG,oCAAoC,SAAS,GAC9D,EAAc,GAAG,kCAAkC,UAAU;OACnE,OAAO;OACP,gBACE,MAAoB,IAChB,EAAc,GAAG,uCAAuC,YAAY,GACpE,EAAc,GAAG,qCAAqC,aAAa;OAC1E,CACF;MACC,CAAA,CACA;;IACN,kBAAC,GAAD;KACE,SAAQ;KACR,MAAK;KACL,WAAU;KACV,eAAe,EAAS,kCAAkC;eAJ5D,CAME,kBAAC,GAAD,EAAU,WAAU,iBAAkB,CAAA,EACrC,EAAc,GAAG,4BAA4B,kBAAkB,CACzD;;IACR,EAAW,SAAS,KACnB,kBAAC,OAAD;KAAK,WAAU;eAAf,CACG,EAAW,MAAM,GAAG,EAAE,CAAC,KAAK,MAC3B,kBAAC,OAAD;MAEE,WAAU;MACV,OAAO,EAAG;gBAET,EAAG,KAAK,OAAO,EAAE,CAAC,aAAa;MAC5B,EALC,EAAG,GAKJ,CACN,EACD,IAAkB,KACjB,kBAAC,OAAD;MAAK,WAAU;gBAAf,CAAoJ,KAChJ,IAAkB,EAChB;QAEJ;;IAEJ;;EACQ,CAAA"}
@@ -1,82 +1,80 @@
1
- import { WidgetWrapper as e } from "../WidgetWrapper.js";
2
- import { ArrowRight as t, Circle as n, FolderKanban as r } from "lucide-react";
3
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
4
- import { Badge as o, Button as s, IllustratedEmptyState as c } from "@burdenoff/fe-libs/ui";
1
+ import { tWithFallback as e } from "../../../utils/i18n.js";
2
+ import { WidgetWrapper as t } from "../WidgetWrapper.js";
3
+ import { ArrowRight as n, Circle as r, FolderKanban as i } from "lucide-react";
4
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
+ import { Badge as s, Button as c, IllustratedEmptyState as l } from "@burdenoff/fe-libs/ui";
6
+ import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
5
7
  //#region src/pages/dashboard/widgets/ProjectsWidget.tsx
6
- var l = {
8
+ var d = {
7
9
  ACTIVE: "bg-status-success-bg",
8
10
  INACTIVE: "bg-text-tertiary",
9
11
  ARCHIVED: "bg-status-warning-bg"
10
- }, u = {
12
+ }, f = {
11
13
  ACTIVE: "default",
12
14
  INACTIVE: "secondary",
13
15
  ARCHIVED: "outline"
14
16
  };
15
- function d({ workspaceData: d, isLoading: f, navigate: p }) {
16
- let m = d?.projects.items ?? [], h = d?.projects.total ?? 0, g = m.filter((e) => e.status === "ACTIVE").length, _ = m.filter((e) => e.status === "INACTIVE").length;
17
- return /* @__PURE__ */ i(e, {
18
- title: "Projects",
19
- icon: /* @__PURE__ */ i(r, { className: "size-4" }),
17
+ function p({ workspaceData: p, isLoading: m, navigate: h }) {
18
+ let { t: g } = u(), _ = p?.projects.items ?? [], v = p?.projects.total ?? 0, y = _.filter((e) => e.status === "ACTIVE").length, b = _.filter((e) => e.status === "INACTIVE").length;
19
+ return /* @__PURE__ */ a(t, {
20
+ title: e(g, "dashboard.projects.title", "Projects"),
21
+ icon: /* @__PURE__ */ a(i, { className: "size-4" }),
20
22
  size: "medium",
21
- isLoading: f,
22
- unavailable: !d,
23
- headerAction: /* @__PURE__ */ a(s, {
23
+ isLoading: m,
24
+ unavailable: !p,
25
+ headerAction: /* @__PURE__ */ o(c, {
24
26
  variant: "ghost",
25
27
  size: "sm",
26
28
  className: "text-xs",
27
- onClick: () => p("/workspaces/projects"),
28
- children: ["View all ", /* @__PURE__ */ i(t, { className: "ml-1 size-3" })]
29
+ onClick: () => h("/workspaces/projects"),
30
+ children: [
31
+ e(g, "dashboard.projects.viewAll", "View all"),
32
+ " ",
33
+ /* @__PURE__ */ a(n, { className: "ml-1 size-3" })
34
+ ]
29
35
  }),
30
- children: m.length === 0 ? /* @__PURE__ */ i(c, {
36
+ children: _.length === 0 ? /* @__PURE__ */ a(l, {
31
37
  illustration: "empty-data",
32
- title: "No projects yet",
38
+ title: e(g, "dashboard.projects.emptyTitle", "No projects yet"),
33
39
  className: "py-4",
34
- action: /* @__PURE__ */ i(s, {
40
+ action: /* @__PURE__ */ a(c, {
35
41
  variant: "outline",
36
42
  size: "sm",
37
- onClick: () => p("/workspaces/projects"),
38
- children: "Create a project"
43
+ onClick: () => h("/workspaces/projects"),
44
+ children: e(g, "dashboard.projects.createProject", "Create a project")
39
45
  })
40
- }) : /* @__PURE__ */ a("div", {
46
+ }) : /* @__PURE__ */ o("div", {
41
47
  className: "space-y-3",
42
- children: [h > 0 && /* @__PURE__ */ a("div", {
48
+ children: [v > 0 && /* @__PURE__ */ o("div", {
43
49
  className: "flex items-center gap-3 text-xs text-text-secondary",
44
50
  children: [
45
- /* @__PURE__ */ a("span", {
51
+ /* @__PURE__ */ o("span", {
46
52
  className: "flex items-center gap-1",
47
- children: [
48
- /* @__PURE__ */ i(n, { className: `size-2 fill-status-success-bg text-status-success-bg ${g > 0 ? "motion-safe:animate-vc-glow-pulse" : ""}` }),
49
- g,
50
- " active"
51
- ]
53
+ children: [/* @__PURE__ */ a(r, { className: `size-2 fill-status-success-bg text-status-success-bg ${y > 0 ? "motion-safe:animate-vc-glow-pulse" : ""}` }), e(g, "dashboard.projects.activeCount", "{count} active", { count: y })]
52
54
  }),
53
- _ > 0 && /* @__PURE__ */ a("span", {
55
+ b > 0 && /* @__PURE__ */ o("span", {
54
56
  className: "flex items-center gap-1",
55
- children: [
56
- /* @__PURE__ */ i(n, { className: "size-2 fill-text-tertiary text-text-tertiary" }),
57
- _,
58
- " inactive"
59
- ]
57
+ children: [/* @__PURE__ */ a(r, { className: "size-2 fill-text-tertiary text-text-tertiary" }), e(g, "dashboard.projects.inactiveCount", "{count} inactive", { count: b })]
60
58
  }),
61
59
  /* @__PURE__ */ a("span", {
62
60
  className: "ml-auto font-medium",
63
- children: [h, " total"]
61
+ children: e(g, "dashboard.projects.totalCount", "{count} total", { count: v })
64
62
  })
65
63
  ]
66
- }), /* @__PURE__ */ i("div", {
64
+ }), /* @__PURE__ */ a("div", {
67
65
  className: "space-y-2",
68
- children: m.slice(0, 4).map((e) => /* @__PURE__ */ a("button", {
66
+ children: _.slice(0, 4).map((e) => /* @__PURE__ */ o("button", {
69
67
  type: "button",
70
68
  className: "w-full flex items-center justify-between p-2 rounded-md hover:bg-accent/5 cursor-pointer transition-colors text-left",
71
- onClick: () => p(`/workspaces/${e.workspaceId}/projects`),
72
- children: [/* @__PURE__ */ a("div", {
69
+ onClick: () => h(`/workspaces/${e.workspaceId}/projects`),
70
+ children: [/* @__PURE__ */ o("div", {
73
71
  className: "flex items-center gap-2 min-w-0",
74
- children: [/* @__PURE__ */ i(n, { className: `size-2 ${l[e.status] || "bg-text-tertiary"} fill-current ${e.status === "ACTIVE" ? "motion-safe:animate-vc-glow-pulse" : ""}` }), /* @__PURE__ */ i("span", {
72
+ children: [/* @__PURE__ */ a(r, { className: `size-2 ${d[e.status] || "bg-text-tertiary"} fill-current ${e.status === "ACTIVE" ? "motion-safe:animate-vc-glow-pulse" : ""}` }), /* @__PURE__ */ a("span", {
75
73
  className: "text-sm font-medium text-text-primary truncate",
76
74
  children: e.name
77
75
  })]
78
- }), /* @__PURE__ */ i(o, {
79
- variant: u[e.status] || "outline",
76
+ }), /* @__PURE__ */ a(s, {
77
+ variant: f[e.status] || "outline",
80
78
  className: "text-[10px] shrink-0",
81
79
  children: e.key
82
80
  })]
@@ -86,6 +84,6 @@ function d({ workspaceData: d, isLoading: f, navigate: p }) {
86
84
  });
87
85
  }
88
86
  //#endregion
89
- export { d as ProjectsWidget };
87
+ export { p as ProjectsWidget };
90
88
 
91
89
  //# sourceMappingURL=ProjectsWidget.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/ProjectsWidget.tsx"],"sourcesContent":["import { FolderKanban, ArrowRight, Circle } from 'lucide-react';\nimport { Badge, Button, IllustratedEmptyState } 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 INACTIVE: 'bg-text-tertiary',\n ARCHIVED: 'bg-status-warning-bg',\n};\n\nconst statusVariant: Record<string, 'default' | 'secondary' | 'outline'> = {\n ACTIVE: 'default',\n INACTIVE: 'secondary',\n ARCHIVED: 'outline',\n};\n\nexport function ProjectsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const projects = workspaceData?.projects.items ?? [];\n const total = workspaceData?.projects.total ?? 0;\n\n // Status breakdown\n const activeCount = projects.filter((p) => p.status === 'ACTIVE').length;\n const inactiveCount = projects.filter((p) => p.status === 'INACTIVE').length;\n\n return (\n <WidgetWrapper\n title=\"Projects\"\n icon={<FolderKanban 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/projects')}\n >\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {projects.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No projects yet\"\n className=\"py-4\"\n action={\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/workspaces/projects')}>\n Create a project\n </Button>\n }\n />\n ) : (\n <div className=\"space-y-3\">\n {total > 0 && (\n <div className=\"flex items-center gap-3 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Circle\n className={`size-2 fill-status-success-bg text-status-success-bg ${\n activeCount > 0 ? 'motion-safe:animate-vc-glow-pulse' : ''\n }`}\n />\n {activeCount} active\n </span>\n {inactiveCount > 0 && (\n <span className=\"flex items-center gap-1\">\n <Circle className=\"size-2 fill-text-tertiary text-text-tertiary\" />\n {inactiveCount} inactive\n </span>\n )}\n <span className=\"ml-auto font-medium\">{total} total</span>\n </div>\n )}\n <div className=\"space-y-2\">\n {projects.slice(0, 4).map((proj) => (\n <button\n key={proj.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/${proj.workspaceId}/projects`)}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <Circle\n className={`size-2 ${statusColors[proj.status] || 'bg-text-tertiary'} fill-current ${\n proj.status === 'ACTIVE' ? 'motion-safe:animate-vc-glow-pulse' : ''\n }`}\n />\n <span className=\"text-sm font-medium text-text-primary truncate\">\n {proj.name}\n </span>\n </div>\n <Badge\n variant={statusVariant[proj.status] || 'outline'}\n className=\"text-[10px] shrink-0\"\n >\n {proj.key}\n </Badge>\n </button>\n ))}\n </div>\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,IAAM,IAAuC;CAC3C,QAAQ;CACR,UAAU;CACV,UAAU;CACX,EAEK,IAAqE;CACzE,QAAQ;CACR,UAAU;CACV,UAAU;CACX;AAED,SAAgB,EAAe,EAAE,kBAAe,cAAW,eAAyB;CAClF,IAAM,IAAW,GAAe,SAAS,SAAS,EAAE,EAC9C,IAAQ,GAAe,SAAS,SAAS,GAGzC,IAAc,EAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,CAAC,QAC5D,IAAgB,EAAS,QAAQ,MAAM,EAAE,WAAW,WAAW,CAAC;AAEtE,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAc,WAAU,UAAW,CAAA;EACzC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,uBAAuB;aAJjD,CAKC,aACU,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,CACxC;;YAGV,EAAS,WAAW,IACnB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,WAAU;GACV,QACE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,eAAe,EAAS,uBAAuB;cAAE;IAE5E,CAAA;GAEX,CAAA,GAEF,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,IAAQ,KACP,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD,EACE,WAAW,wDACT,IAAc,IAAI,sCAAsC,MAE1D,CAAA;OACD;OAAY;OACR;;KACN,IAAgB,KACf,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACE,kBAAC,GAAD,EAAQ,WAAU,gDAAiD,CAAA;OAClE;OAAc;OACV;;KAET,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CAAuC,GAAM,SAAa;;KACtD;OAER,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,MACzB,kBAAC,UAAD;KAEE,MAAK;KACL,WAAU;KACV,eAAe,EAAS,eAAe,EAAK,YAAY,WAAW;eAJrE,CAME,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EACE,WAAW,UAAU,EAAa,EAAK,WAAW,mBAAmB,gBACnE,EAAK,WAAW,WAAW,sCAAsC,MAEnE,CAAA,EACF,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAK;OACD,CAAA,CACH;SACN,kBAAC,GAAD;MACE,SAAS,EAAc,EAAK,WAAW;MACvC,WAAU;gBAET,EAAK;MACA,CAAA,CACD;OArBF,EAAK,GAqBH,CACT;IACE,CAAA,CACF;;EAEM,CAAA"}
1
+ {"version":3,"file":"ProjectsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/ProjectsWidget.tsx"],"sourcesContent":["import { FolderKanban, ArrowRight, Circle } from 'lucide-react';\nimport { Badge, Button, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport { tWithFallback } from '../../../utils/i18n';\nimport type { WidgetProps } from '../types';\n\nconst statusColors: Record<string, string> = {\n ACTIVE: 'bg-status-success-bg',\n INACTIVE: 'bg-text-tertiary',\n ARCHIVED: 'bg-status-warning-bg',\n};\n\nconst statusVariant: Record<string, 'default' | 'secondary' | 'outline'> = {\n ACTIVE: 'default',\n INACTIVE: 'secondary',\n ARCHIVED: 'outline',\n};\n\nexport function ProjectsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const { t } = useI18n();\n const projects = workspaceData?.projects.items ?? [];\n const total = workspaceData?.projects.total ?? 0;\n\n // Status breakdown\n const activeCount = projects.filter((p) => p.status === 'ACTIVE').length;\n const inactiveCount = projects.filter((p) => p.status === 'INACTIVE').length;\n\n return (\n <WidgetWrapper\n title={tWithFallback(t, 'dashboard.projects.title', 'Projects')}\n icon={<FolderKanban 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/projects')}\n >\n {tWithFallback(t, 'dashboard.projects.viewAll', 'View all')}{' '}\n <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {projects.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tWithFallback(t, 'dashboard.projects.emptyTitle', 'No projects yet')}\n className=\"py-4\"\n action={\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/workspaces/projects')}>\n {tWithFallback(t, 'dashboard.projects.createProject', 'Create a project')}\n </Button>\n }\n />\n ) : (\n <div className=\"space-y-3\">\n {total > 0 && (\n <div className=\"flex items-center gap-3 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Circle\n className={`size-2 fill-status-success-bg text-status-success-bg ${\n activeCount > 0 ? 'motion-safe:animate-vc-glow-pulse' : ''\n }`}\n />\n {tWithFallback(t, 'dashboard.projects.activeCount', '{count} active', {\n count: activeCount,\n })}\n </span>\n {inactiveCount > 0 && (\n <span className=\"flex items-center gap-1\">\n <Circle className=\"size-2 fill-text-tertiary text-text-tertiary\" />\n {tWithFallback(t, 'dashboard.projects.inactiveCount', '{count} inactive', {\n count: inactiveCount,\n })}\n </span>\n )}\n <span className=\"ml-auto font-medium\">\n {tWithFallback(t, 'dashboard.projects.totalCount', '{count} total', {\n count: total,\n })}\n </span>\n </div>\n )}\n <div className=\"space-y-2\">\n {projects.slice(0, 4).map((proj) => (\n <button\n key={proj.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/${proj.workspaceId}/projects`)}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <Circle\n className={`size-2 ${statusColors[proj.status] || 'bg-text-tertiary'} fill-current ${\n proj.status === 'ACTIVE' ? 'motion-safe:animate-vc-glow-pulse' : ''\n }`}\n />\n <span className=\"text-sm font-medium text-text-primary truncate\">\n {proj.name}\n </span>\n </div>\n <Badge\n variant={statusVariant[proj.status] || 'outline'}\n className=\"text-[10px] shrink-0\"\n >\n {proj.key}\n </Badge>\n </button>\n ))}\n </div>\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;;;AAOA,IAAM,IAAuC;CAC3C,QAAQ;CACR,UAAU;CACV,UAAU;CACX,EAEK,IAAqE;CACzE,QAAQ;CACR,UAAU;CACV,UAAU;CACX;AAED,SAAgB,EAAe,EAAE,kBAAe,cAAW,eAAyB;CAClF,IAAM,EAAE,SAAM,GAAS,EACjB,IAAW,GAAe,SAAS,SAAS,EAAE,EAC9C,IAAQ,GAAe,SAAS,SAAS,GAGzC,IAAc,EAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,CAAC,QAC5D,IAAgB,EAAS,QAAQ,MAAM,EAAE,WAAW,WAAW,CAAC;AAEtE,QACE,kBAAC,GAAD;EACE,OAAO,EAAc,GAAG,4BAA4B,WAAW;EAC/D,MAAM,kBAAC,GAAD,EAAc,WAAU,UAAW,CAAA;EACzC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,uBAAuB;aAJjD;IAMG,EAAc,GAAG,8BAA8B,WAAW;IAAE;IAC7D,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA;IAC/B;;YAGV,EAAS,WAAW,IACnB,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAc,GAAG,iCAAiC,kBAAkB;GAC3E,WAAU;GACV,QACE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,eAAe,EAAS,uBAAuB;cAChF,EAAc,GAAG,oCAAoC,mBAAmB;IAClE,CAAA;GAEX,CAAA,GAEF,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,IAAQ,KACP,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD,EACE,WAAW,wDACT,IAAc,IAAI,sCAAsC,MAE1D,CAAA,EACD,EAAc,GAAG,kCAAkC,kBAAkB,EACpE,OAAO,GACR,CAAC,CACG;;KACN,IAAgB,KACf,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD,EAAQ,WAAU,gDAAiD,CAAA,EAClE,EAAc,GAAG,oCAAoC,oBAAoB,EACxE,OAAO,GACR,CAAC,CACG;;KAET,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAc,GAAG,iCAAiC,iBAAiB,EAClE,OAAO,GACR,CAAC;MACG,CAAA;KACH;OAER,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,MACzB,kBAAC,UAAD;KAEE,MAAK;KACL,WAAU;KACV,eAAe,EAAS,eAAe,EAAK,YAAY,WAAW;eAJrE,CAME,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EACE,WAAW,UAAU,EAAa,EAAK,WAAW,mBAAmB,gBACnE,EAAK,WAAW,WAAW,sCAAsC,MAEnE,CAAA,EACF,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAK;OACD,CAAA,CACH;SACN,kBAAC,GAAD;MACE,SAAS,EAAc,EAAK,WAAW;MACvC,WAAU;gBAET,EAAK;MACA,CAAA,CACD;OArBF,EAAK,GAqBH,CACT;IACE,CAAA,CACF;;EAEM,CAAA"}
@@ -1,169 +1,179 @@
1
- import { WidgetWrapper as e } from "../WidgetWrapper.js";
2
- import { Bot as t, Calendar as n, Cog as r, FileText as i, FolderKanban as a, GitBranch as o, LayoutTemplate as s, PlayCircle as c, Plus as l, Sparkles as u, Tags as d, Terminal as f, Upload as p, UserPlus as m, Zap as h } from "lucide-react";
3
- import { jsx as g, jsxs as _ } from "react/jsx-runtime";
4
- import { Button as v } from "@burdenoff/fe-libs/ui";
1
+ import { tWithFallback as e } from "../../../utils/i18n.js";
2
+ import { WidgetWrapper as t } from "../WidgetWrapper.js";
3
+ import { Bot as n, Calendar as r, Cog as i, FileText as a, FolderKanban as o, GitBranch as s, LayoutTemplate as c, PlayCircle as l, Plus as u, Sparkles as d, Tags as f, Terminal as p, Upload as m, UserPlus as h, Zap as g } from "lucide-react";
4
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
5
+ import { Button as y } from "@burdenoff/fe-libs/ui";
6
+ import { useI18n as b } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
5
7
  //#region src/pages/dashboard/widgets/QuickActionsWidget.tsx
6
- var y = [
7
- {
8
- id: "create-workspace",
9
- label: "New Workspace",
10
- icon: l,
11
- path: "/workspaces/list",
12
- color: "text-accent-blue"
13
- },
14
- {
15
- id: "create-project",
16
- label: "New Project",
17
- icon: a,
18
- path: "/workspaces/projects",
19
- color: "text-status-success-text"
20
- },
21
- {
22
- id: "invite-member",
23
- label: "Invite Member",
24
- icon: m,
25
- path: "/workspaces/members",
26
- color: "text-accent-purple"
27
- },
28
- {
29
- id: "upload-file",
30
- label: "Upload File",
31
- icon: p,
32
- path: "/files",
33
- color: "text-status-warning-text"
34
- },
35
- {
36
- id: "new-event",
37
- label: "New Event",
38
- icon: n,
39
- path: "/calendar",
40
- color: "text-accent-pink"
41
- },
42
- {
43
- id: "manage-tags",
44
- label: "Manage Tags",
45
- icon: d,
46
- path: "/tags",
47
- color: "text-accent-cyan"
48
- },
49
- {
50
- id: "view-workflows",
51
- label: "Workflows",
52
- icon: i,
53
- path: "/workflows",
54
- color: "text-accent-orange"
55
- },
56
- {
57
- id: "settings",
58
- label: "Settings",
59
- icon: r,
60
- path: "/settings",
61
- color: "text-text-secondary"
62
- }
63
- ], b = [
64
- {
65
- id: "new-vibe",
66
- label: "New Vibe",
67
- icon: u,
68
- path: "/vibecontrols/vibes/new",
69
- color: "text-accent-blue"
70
- },
71
- {
72
- id: "view-sessions",
73
- label: "Sessions",
74
- icon: f,
75
- path: "/vibecontrols/sessions",
76
- color: "text-status-success-text"
77
- },
78
- {
79
- id: "connect-agent",
80
- label: "Connect Agent",
81
- icon: t,
82
- path: "/vibecontrols/agents/new",
83
- color: "text-accent-purple"
84
- },
85
- {
86
- id: "invite-member",
87
- label: "Invite Member",
88
- icon: m,
89
- path: "/workspaces/members",
90
- color: "text-accent-pink"
91
- },
92
- {
93
- id: "upload-file",
94
- label: "Upload File",
95
- icon: p,
96
- path: "/files",
97
- color: "text-status-warning-text"
98
- },
99
- {
100
- id: "settings",
101
- label: "Settings",
102
- icon: r,
103
- path: "/settings",
104
- color: "text-accent-cyan"
105
- }
106
- ], x = [
107
- {
108
- id: "new-workflow",
109
- label: "New Workflow",
110
- icon: o,
111
- path: "/workflows/new",
112
- color: "text-accent-blue"
113
- },
114
- {
115
- id: "view-runs",
116
- label: "View Runs",
117
- icon: c,
118
- path: "/workflows/runs",
119
- color: "text-status-success-text"
120
- },
121
- {
122
- id: "browse-templates",
123
- label: "Templates",
124
- icon: s,
125
- path: "/workflows/templates",
126
- color: "text-accent-purple"
127
- },
128
- {
129
- id: "invite-member",
130
- label: "Invite Member",
131
- icon: m,
132
- path: "/workspaces/members",
133
- color: "text-accent-pink"
134
- },
135
- {
136
- id: "upload-file",
137
- label: "Upload File",
138
- icon: p,
139
- path: "/files",
140
- color: "text-status-warning-text"
141
- },
142
- {
143
- id: "settings",
144
- label: "Settings",
145
- icon: r,
146
- path: "/settings",
147
- color: "text-accent-cyan"
148
- }
149
- ];
150
- function S(e) {
151
- return e === "vibecontrols" ? b : e === "fluidgrids" ? x : y;
8
+ function x(t) {
9
+ return [
10
+ {
11
+ id: "create-workspace",
12
+ label: e(t, "dashboard.quickActions.newWorkspace", "New Workspace"),
13
+ icon: u,
14
+ path: "/workspaces/list",
15
+ color: "text-accent-blue"
16
+ },
17
+ {
18
+ id: "create-project",
19
+ label: e(t, "dashboard.quickActions.newProject", "New Project"),
20
+ icon: o,
21
+ path: "/workspaces/projects",
22
+ color: "text-status-success-text"
23
+ },
24
+ {
25
+ id: "invite-member",
26
+ label: e(t, "dashboard.quickActions.inviteMember", "Invite Member"),
27
+ icon: h,
28
+ path: "/workspaces/members",
29
+ color: "text-accent-purple"
30
+ },
31
+ {
32
+ id: "upload-file",
33
+ label: e(t, "dashboard.quickActions.uploadFile", "Upload File"),
34
+ icon: m,
35
+ path: "/files",
36
+ color: "text-status-warning-text"
37
+ },
38
+ {
39
+ id: "new-event",
40
+ label: e(t, "dashboard.quickActions.newEvent", "New Event"),
41
+ icon: r,
42
+ path: "/calendar",
43
+ color: "text-accent-pink"
44
+ },
45
+ {
46
+ id: "manage-tags",
47
+ label: e(t, "dashboard.quickActions.manageTags", "Manage Tags"),
48
+ icon: f,
49
+ path: "/tags",
50
+ color: "text-accent-cyan"
51
+ },
52
+ {
53
+ id: "view-workflows",
54
+ label: e(t, "dashboard.quickActions.workflows", "Workflows"),
55
+ icon: a,
56
+ path: "/workflows",
57
+ color: "text-accent-orange"
58
+ },
59
+ {
60
+ id: "settings",
61
+ label: e(t, "dashboard.quickActions.settings", "Settings"),
62
+ icon: i,
63
+ path: "/settings",
64
+ color: "text-text-secondary"
65
+ }
66
+ ];
152
67
  }
153
- function C({ navigate: t, isLoading: n, productId: r }) {
154
- let i = S(r);
155
- return /* @__PURE__ */ g(e, {
156
- title: "Quick Actions",
157
- icon: /* @__PURE__ */ g(h, { className: "size-4" }),
68
+ function S(t) {
69
+ return [
70
+ {
71
+ id: "new-vibe",
72
+ label: e(t, "dashboard.quickActions.newVibe", "New Vibe"),
73
+ icon: d,
74
+ path: "/vibecontrols/vibes/new",
75
+ color: "text-accent-blue"
76
+ },
77
+ {
78
+ id: "view-sessions",
79
+ label: e(t, "dashboard.quickActions.sessions", "Sessions"),
80
+ icon: p,
81
+ path: "/vibecontrols/sessions",
82
+ color: "text-status-success-text"
83
+ },
84
+ {
85
+ id: "connect-agent",
86
+ label: e(t, "dashboard.quickActions.connectAgent", "Connect Agent"),
87
+ icon: n,
88
+ path: "/vibecontrols/agents/new",
89
+ color: "text-accent-purple"
90
+ },
91
+ {
92
+ id: "invite-member",
93
+ label: e(t, "dashboard.quickActions.inviteMember", "Invite Member"),
94
+ icon: h,
95
+ path: "/workspaces/members",
96
+ color: "text-accent-pink"
97
+ },
98
+ {
99
+ id: "upload-file",
100
+ label: e(t, "dashboard.quickActions.uploadFile", "Upload File"),
101
+ icon: m,
102
+ path: "/files",
103
+ color: "text-status-warning-text"
104
+ },
105
+ {
106
+ id: "settings",
107
+ label: e(t, "dashboard.quickActions.settings", "Settings"),
108
+ icon: i,
109
+ path: "/settings",
110
+ color: "text-accent-cyan"
111
+ }
112
+ ];
113
+ }
114
+ function C(t) {
115
+ return [
116
+ {
117
+ id: "new-workflow",
118
+ label: e(t, "dashboard.quickActions.newWorkflow", "New Workflow"),
119
+ icon: s,
120
+ path: "/workflows/new",
121
+ color: "text-accent-blue"
122
+ },
123
+ {
124
+ id: "view-runs",
125
+ label: e(t, "dashboard.quickActions.viewRuns", "View Runs"),
126
+ icon: l,
127
+ path: "/workflows/runs",
128
+ color: "text-status-success-text"
129
+ },
130
+ {
131
+ id: "browse-templates",
132
+ label: e(t, "dashboard.quickActions.templates", "Templates"),
133
+ icon: c,
134
+ path: "/workflows/templates",
135
+ color: "text-accent-purple"
136
+ },
137
+ {
138
+ id: "invite-member",
139
+ label: e(t, "dashboard.quickActions.inviteMember", "Invite Member"),
140
+ icon: h,
141
+ path: "/workspaces/members",
142
+ color: "text-accent-pink"
143
+ },
144
+ {
145
+ id: "upload-file",
146
+ label: e(t, "dashboard.quickActions.uploadFile", "Upload File"),
147
+ icon: m,
148
+ path: "/files",
149
+ color: "text-status-warning-text"
150
+ },
151
+ {
152
+ id: "settings",
153
+ label: e(t, "dashboard.quickActions.settings", "Settings"),
154
+ icon: i,
155
+ path: "/settings",
156
+ color: "text-accent-cyan"
157
+ }
158
+ ];
159
+ }
160
+ function w(e, t) {
161
+ return t === "vibecontrols" ? S(e) : t === "fluidgrids" ? C(e) : x(e);
162
+ }
163
+ function T({ navigate: n, isLoading: r, productId: i }) {
164
+ let { t: a } = b(), o = w(a, i);
165
+ return /* @__PURE__ */ _(t, {
166
+ title: e(a, "dashboard.quickActions.title", "Quick Actions"),
167
+ icon: /* @__PURE__ */ _(g, { className: "size-4" }),
158
168
  size: "medium",
159
- isLoading: n,
160
- children: /* @__PURE__ */ g("div", {
169
+ isLoading: r,
170
+ children: /* @__PURE__ */ _("div", {
161
171
  className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-2",
162
- children: i.map((e) => /* @__PURE__ */ _(v, {
172
+ children: o.map((e) => /* @__PURE__ */ v(y, {
163
173
  variant: "outline",
164
174
  className: "flex flex-col items-center gap-1.5 h-auto py-3 px-2 text-xs hover:bg-accent/5 transition-colors",
165
- onClick: () => t(e.path),
166
- children: [/* @__PURE__ */ g(e.icon, { className: `size-5 ${e.color}` }), /* @__PURE__ */ g("span", {
175
+ onClick: () => n(e.path),
176
+ children: [/* @__PURE__ */ _(e.icon, { className: `size-5 ${e.color}` }), /* @__PURE__ */ _("span", {
167
177
  className: "text-text-secondary font-medium",
168
178
  children: e.label
169
179
  })]
@@ -172,6 +182,6 @@ function C({ navigate: t, isLoading: n, productId: r }) {
172
182
  });
173
183
  }
174
184
  //#endregion
175
- export { C as QuickActionsWidget };
185
+ export { T as QuickActionsWidget };
176
186
 
177
187
  //# sourceMappingURL=QuickActionsWidget.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QuickActionsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/QuickActionsWidget.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport {\n Zap,\n Plus,\n Upload,\n UserPlus,\n FolderKanban,\n Calendar,\n FileText,\n Tags,\n Bot,\n Terminal,\n Sparkles,\n Cog,\n GitBranch,\n PlayCircle,\n LayoutTemplate,\n} from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\ninterface QuickAction {\n id: string;\n label: string;\n icon: LucideIcon;\n path: string;\n color: string;\n}\n\nconst WORKSPACES_QUICK_ACTIONS: QuickAction[] = [\n {\n id: 'create-workspace',\n label: 'New Workspace',\n icon: Plus,\n path: '/workspaces/list',\n color: 'text-accent-blue',\n },\n {\n id: 'create-project',\n label: 'New Project',\n icon: FolderKanban,\n path: '/workspaces/projects',\n color: 'text-status-success-text',\n },\n {\n id: 'invite-member',\n label: 'Invite Member',\n icon: UserPlus,\n path: '/workspaces/members',\n color: 'text-accent-purple',\n },\n {\n id: 'upload-file',\n label: 'Upload File',\n icon: Upload,\n path: '/files',\n color: 'text-status-warning-text',\n },\n {\n id: 'new-event',\n label: 'New Event',\n icon: Calendar,\n path: '/calendar',\n color: 'text-accent-pink',\n },\n {\n id: 'manage-tags',\n label: 'Manage Tags',\n icon: Tags,\n path: '/tags',\n color: 'text-accent-cyan',\n },\n {\n id: 'view-workflows',\n label: 'Workflows',\n icon: FileText,\n path: '/workflows',\n color: 'text-accent-orange',\n },\n {\n id: 'settings',\n label: 'Settings',\n icon: Cog,\n path: '/settings',\n color: 'text-text-secondary',\n },\n];\n\nconst VIBECONTROLS_QUICK_ACTIONS: QuickAction[] = [\n {\n id: 'new-vibe',\n label: 'New Vibe',\n icon: Sparkles,\n path: '/vibecontrols/vibes/new',\n color: 'text-accent-blue',\n },\n {\n id: 'view-sessions',\n label: 'Sessions',\n icon: Terminal,\n path: '/vibecontrols/sessions',\n color: 'text-status-success-text',\n },\n {\n id: 'connect-agent',\n label: 'Connect Agent',\n icon: Bot,\n path: '/vibecontrols/agents/new',\n color: 'text-accent-purple',\n },\n {\n id: 'invite-member',\n label: 'Invite Member',\n icon: UserPlus,\n path: '/workspaces/members',\n color: 'text-accent-pink',\n },\n {\n id: 'upload-file',\n label: 'Upload File',\n icon: Upload,\n path: '/files',\n color: 'text-status-warning-text',\n },\n {\n id: 'settings',\n label: 'Settings',\n icon: Cog,\n path: '/settings',\n color: 'text-accent-cyan',\n },\n];\n\nconst FLUIDGRIDS_QUICK_ACTIONS: QuickAction[] = [\n {\n id: 'new-workflow',\n label: 'New Workflow',\n icon: GitBranch,\n path: '/workflows/new',\n color: 'text-accent-blue',\n },\n {\n id: 'view-runs',\n label: 'View Runs',\n icon: PlayCircle,\n path: '/workflows/runs',\n color: 'text-status-success-text',\n },\n {\n id: 'browse-templates',\n label: 'Templates',\n icon: LayoutTemplate,\n path: '/workflows/templates',\n color: 'text-accent-purple',\n },\n {\n id: 'invite-member',\n label: 'Invite Member',\n icon: UserPlus,\n path: '/workspaces/members',\n color: 'text-accent-pink',\n },\n {\n id: 'upload-file',\n label: 'Upload File',\n icon: Upload,\n path: '/files',\n color: 'text-status-warning-text',\n },\n {\n id: 'settings',\n label: 'Settings',\n icon: Cog,\n path: '/settings',\n color: 'text-accent-cyan',\n },\n];\n\nfunction pickActions(productId?: string): QuickAction[] {\n if (productId === 'vibecontrols') return VIBECONTROLS_QUICK_ACTIONS;\n if (productId === 'fluidgrids') return FLUIDGRIDS_QUICK_ACTIONS;\n return WORKSPACES_QUICK_ACTIONS;\n}\n\nexport function QuickActionsWidget({ navigate, isLoading, productId }: WidgetProps) {\n const actions = pickActions(productId);\n return (\n <WidgetWrapper\n title=\"Quick Actions\"\n icon={<Zap className=\"size-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n >\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-2\">\n {actions.map((action) => (\n <Button\n key={action.id}\n variant=\"outline\"\n className=\"flex flex-col items-center gap-1.5 h-auto py-3 px-2 text-xs hover:bg-accent/5 transition-colors\"\n onClick={() => navigate(action.path)}\n >\n <action.icon className={`size-5 ${action.color}`} />\n <span className=\"text-text-secondary font-medium\">{action.label}</span>\n </Button>\n ))}\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AA8BA,IAAM,IAA0C;CAC9C;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACF,EAEK,IAA4C;CAChD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACF,EAEK,IAA0C;CAC9C;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACR;CACF;AAED,SAAS,EAAY,GAAmC;AAGtD,QAFI,MAAc,iBAAuB,IACrC,MAAc,eAAqB,IAChC;;AAGT,SAAgB,EAAmB,EAAE,aAAU,cAAW,gBAA0B;CAClF,IAAM,IAAU,EAAY,EAAU;AACtC,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAK,WAAU,UAAW,CAAA;EAChC,MAAK;EACM;YAEX,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAQ,KAAK,MACZ,kBAAC,GAAD;IAEE,SAAQ;IACR,WAAU;IACV,eAAe,EAAS,EAAO,KAAK;cAJtC,CAME,kBAAC,EAAO,MAAR,EAAa,WAAW,UAAU,EAAO,SAAW,CAAA,EACpD,kBAAC,QAAD;KAAM,WAAU;eAAmC,EAAO;KAAa,CAAA,CAChE;MAPF,EAAO,GAOL,CACT;GACE,CAAA;EACQ,CAAA"}
1
+ {"version":3,"file":"QuickActionsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/QuickActionsWidget.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport {\n Zap,\n Plus,\n Upload,\n UserPlus,\n FolderKanban,\n Calendar,\n FileText,\n Tags,\n Bot,\n Terminal,\n Sparkles,\n Cog,\n GitBranch,\n PlayCircle,\n LayoutTemplate,\n} from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { I18nContextValue } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport { tWithFallback } from '../../../utils/i18n';\nimport type { WidgetProps } from '../types';\n\ntype Translate = I18nContextValue['t'];\n\ninterface QuickAction {\n id: string;\n label: string;\n icon: LucideIcon;\n path: string;\n color: string;\n}\n\nfunction workspacesQuickActions(t: Translate): QuickAction[] {\n return [\n {\n id: 'create-workspace',\n label: tWithFallback(t, 'dashboard.quickActions.newWorkspace', 'New Workspace'),\n icon: Plus,\n path: '/workspaces/list',\n color: 'text-accent-blue',\n },\n {\n id: 'create-project',\n label: tWithFallback(t, 'dashboard.quickActions.newProject', 'New Project'),\n icon: FolderKanban,\n path: '/workspaces/projects',\n color: 'text-status-success-text',\n },\n {\n id: 'invite-member',\n label: tWithFallback(t, 'dashboard.quickActions.inviteMember', 'Invite Member'),\n icon: UserPlus,\n path: '/workspaces/members',\n color: 'text-accent-purple',\n },\n {\n id: 'upload-file',\n label: tWithFallback(t, 'dashboard.quickActions.uploadFile', 'Upload File'),\n icon: Upload,\n path: '/files',\n color: 'text-status-warning-text',\n },\n {\n id: 'new-event',\n label: tWithFallback(t, 'dashboard.quickActions.newEvent', 'New Event'),\n icon: Calendar,\n path: '/calendar',\n color: 'text-accent-pink',\n },\n {\n id: 'manage-tags',\n label: tWithFallback(t, 'dashboard.quickActions.manageTags', 'Manage Tags'),\n icon: Tags,\n path: '/tags',\n color: 'text-accent-cyan',\n },\n {\n id: 'view-workflows',\n label: tWithFallback(t, 'dashboard.quickActions.workflows', 'Workflows'),\n icon: FileText,\n path: '/workflows',\n color: 'text-accent-orange',\n },\n {\n id: 'settings',\n label: tWithFallback(t, 'dashboard.quickActions.settings', 'Settings'),\n icon: Cog,\n path: '/settings',\n color: 'text-text-secondary',\n },\n ];\n}\n\nfunction vibecontrolsQuickActions(t: Translate): QuickAction[] {\n return [\n {\n id: 'new-vibe',\n label: tWithFallback(t, 'dashboard.quickActions.newVibe', 'New Vibe'),\n icon: Sparkles,\n path: '/vibecontrols/vibes/new',\n color: 'text-accent-blue',\n },\n {\n id: 'view-sessions',\n label: tWithFallback(t, 'dashboard.quickActions.sessions', 'Sessions'),\n icon: Terminal,\n path: '/vibecontrols/sessions',\n color: 'text-status-success-text',\n },\n {\n id: 'connect-agent',\n label: tWithFallback(t, 'dashboard.quickActions.connectAgent', 'Connect Agent'),\n icon: Bot,\n path: '/vibecontrols/agents/new',\n color: 'text-accent-purple',\n },\n {\n id: 'invite-member',\n label: tWithFallback(t, 'dashboard.quickActions.inviteMember', 'Invite Member'),\n icon: UserPlus,\n path: '/workspaces/members',\n color: 'text-accent-pink',\n },\n {\n id: 'upload-file',\n label: tWithFallback(t, 'dashboard.quickActions.uploadFile', 'Upload File'),\n icon: Upload,\n path: '/files',\n color: 'text-status-warning-text',\n },\n {\n id: 'settings',\n label: tWithFallback(t, 'dashboard.quickActions.settings', 'Settings'),\n icon: Cog,\n path: '/settings',\n color: 'text-accent-cyan',\n },\n ];\n}\n\nfunction fluidgridsQuickActions(t: Translate): QuickAction[] {\n return [\n {\n id: 'new-workflow',\n label: tWithFallback(t, 'dashboard.quickActions.newWorkflow', 'New Workflow'),\n icon: GitBranch,\n path: '/workflows/new',\n color: 'text-accent-blue',\n },\n {\n id: 'view-runs',\n label: tWithFallback(t, 'dashboard.quickActions.viewRuns', 'View Runs'),\n icon: PlayCircle,\n path: '/workflows/runs',\n color: 'text-status-success-text',\n },\n {\n id: 'browse-templates',\n label: tWithFallback(t, 'dashboard.quickActions.templates', 'Templates'),\n icon: LayoutTemplate,\n path: '/workflows/templates',\n color: 'text-accent-purple',\n },\n {\n id: 'invite-member',\n label: tWithFallback(t, 'dashboard.quickActions.inviteMember', 'Invite Member'),\n icon: UserPlus,\n path: '/workspaces/members',\n color: 'text-accent-pink',\n },\n {\n id: 'upload-file',\n label: tWithFallback(t, 'dashboard.quickActions.uploadFile', 'Upload File'),\n icon: Upload,\n path: '/files',\n color: 'text-status-warning-text',\n },\n {\n id: 'settings',\n label: tWithFallback(t, 'dashboard.quickActions.settings', 'Settings'),\n icon: Cog,\n path: '/settings',\n color: 'text-accent-cyan',\n },\n ];\n}\n\nfunction pickActions(t: Translate, productId?: string): QuickAction[] {\n if (productId === 'vibecontrols') return vibecontrolsQuickActions(t);\n if (productId === 'fluidgrids') return fluidgridsQuickActions(t);\n return workspacesQuickActions(t);\n}\n\nexport function QuickActionsWidget({ navigate, isLoading, productId }: WidgetProps) {\n const { t } = useI18n();\n const actions = pickActions(t, productId);\n return (\n <WidgetWrapper\n title={tWithFallback(t, 'dashboard.quickActions.title', 'Quick Actions')}\n icon={<Zap className=\"size-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n >\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-2\">\n {actions.map((action) => (\n <Button\n key={action.id}\n variant=\"outline\"\n className=\"flex flex-col items-center gap-1.5 h-auto py-3 px-2 text-xs hover:bg-accent/5 transition-colors\"\n onClick={() => navigate(action.path)}\n >\n <action.icon className={`size-5 ${action.color}`} />\n <span className=\"text-text-secondary font-medium\">{action.label}</span>\n </Button>\n ))}\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":"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"}