@burdenoff/microfe-workspaces 2026.623.1 → 2026.624.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 (73) hide show
  1. package/dist/components/CreateWorkspaceDialog.js +5 -5
  2. package/dist/components/CreateWorkspaceDialog.js.map +1 -1
  3. package/dist/components/InviteMemberDialog.js +11 -11
  4. package/dist/components/InviteMemberDialog.js.map +1 -1
  5. package/dist/components/ProjectCard.js +5 -5
  6. package/dist/components/ProjectCard.js.map +1 -1
  7. package/dist/components/ProjectMemberPickerDialog.js +14 -14
  8. package/dist/components/ProjectMemberPickerDialog.js.map +1 -1
  9. package/dist/components/WorkspaceCard.js +3 -3
  10. package/dist/components/WorkspaceCard.js.map +1 -1
  11. package/dist/components/WorkspacesErrorBoundary.js +9 -9
  12. package/dist/components/WorkspacesErrorBoundary.js.map +1 -1
  13. package/dist/components/tags/ProjectTagsWidget.js +8 -8
  14. package/dist/components/tags/ProjectTagsWidget.js.map +1 -1
  15. package/dist/pages/ActivityListPage.js +12 -12
  16. package/dist/pages/ActivityListPage.js.map +1 -1
  17. package/dist/pages/CreateWorkspacePage.js +24 -24
  18. package/dist/pages/CreateWorkspacePage.js.map +1 -1
  19. package/dist/pages/InviteAcceptancePage.js +46 -46
  20. package/dist/pages/InviteAcceptancePage.js.map +1 -1
  21. package/dist/pages/MembersListPage.js +27 -27
  22. package/dist/pages/MembersListPage.js.map +1 -1
  23. package/dist/pages/PendingInvitesPage.js +23 -23
  24. package/dist/pages/PendingInvitesPage.js.map +1 -1
  25. package/dist/pages/ProjectDetailPage.js +20 -20
  26. package/dist/pages/ProjectDetailPage.js.map +1 -1
  27. package/dist/pages/ProjectMembersPage.js +15 -15
  28. package/dist/pages/ProjectMembersPage.js.map +1 -1
  29. package/dist/pages/ProjectsListPage.js +16 -16
  30. package/dist/pages/ProjectsListPage.js.map +1 -1
  31. package/dist/pages/WorkspaceDetailPage.js +16 -16
  32. package/dist/pages/WorkspaceDetailPage.js.map +1 -1
  33. package/dist/pages/WorkspaceInvitePage.js +51 -51
  34. package/dist/pages/WorkspaceInvitePage.js.map +1 -1
  35. package/dist/pages/WorkspaceSettingsPage.js +2 -2
  36. package/dist/pages/WorkspaceSettingsPage.js.map +1 -1
  37. package/dist/pages/WorkspacesListPage.js +8 -8
  38. package/dist/pages/WorkspacesListPage.js.map +1 -1
  39. package/dist/pages/dashboard/DashboardCustomizer.js +3 -3
  40. package/dist/pages/dashboard/DashboardCustomizer.js.map +1 -1
  41. package/dist/pages/dashboard/DashboardGrid.js +2 -2
  42. package/dist/pages/dashboard/DashboardGrid.js.map +1 -1
  43. package/dist/pages/dashboard/DashboardPage.js +5 -5
  44. package/dist/pages/dashboard/DashboardPage.js.map +1 -1
  45. package/dist/pages/dashboard/WidgetWrapper.js +6 -6
  46. package/dist/pages/dashboard/WidgetWrapper.js.map +1 -1
  47. package/dist/pages/dashboard/widgets/AgentsWidget.js +6 -6
  48. package/dist/pages/dashboard/widgets/AgentsWidget.js.map +1 -1
  49. package/dist/pages/dashboard/widgets/GroupsWidget.js +3 -3
  50. package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -1
  51. package/dist/pages/dashboard/widgets/MembersWidget.js +3 -3
  52. package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -1
  53. package/dist/pages/dashboard/widgets/ProjectsWidget.js +2 -2
  54. package/dist/pages/dashboard/widgets/ProjectsWidget.js.map +1 -1
  55. package/dist/pages/dashboard/widgets/RecentActivityWidget.js +3 -3
  56. package/dist/pages/dashboard/widgets/RecentActivityWidget.js.map +1 -1
  57. package/dist/pages/dashboard/widgets/SessionsWidget.js +4 -4
  58. package/dist/pages/dashboard/widgets/SessionsWidget.js.map +1 -1
  59. package/dist/pages/dashboard/widgets/TagCloudWidget.js +2 -2
  60. package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -1
  61. package/dist/pages/dashboard/widgets/TipsWidget.js +3 -3
  62. package/dist/pages/dashboard/widgets/TipsWidget.js.map +1 -1
  63. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js +2 -2
  64. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js.map +1 -1
  65. package/dist/pages/dashboard/widgets/VibesWidget.js +2 -2
  66. package/dist/pages/dashboard/widgets/VibesWidget.js.map +1 -1
  67. package/dist/pages/dashboard/widgets/WelcomeWidget.js +3 -3
  68. package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -1
  69. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +4 -4
  70. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -1
  71. package/dist/pages/dashboard/widgets/WorkspacesWidget.js +2 -2
  72. package/dist/pages/dashboard/widgets/WorkspacesWidget.js.map +1 -1
  73. package/package.json +1 -1
@@ -45,10 +45,10 @@ function l({ workspaceData: l, isLoading: u, navigate: d }) {
45
45
  children: f.length === 0 ? /* @__PURE__ */ i("div", {
46
46
  className: "text-center py-6",
47
47
  children: [/* @__PURE__ */ r("p", {
48
- className: "text-sm text-muted-foreground",
48
+ className: "text-sm text-text-secondary",
49
49
  children: "No recent activity"
50
50
  }), /* @__PURE__ */ r("p", {
51
- className: "text-xs text-muted-foreground mt-1",
51
+ className: "text-xs text-text-secondary mt-1",
52
52
  children: "Activity will appear here as you use the platform"
53
53
  })]
54
54
  }) : /* @__PURE__ */ r("div", {
@@ -66,7 +66,7 @@ function l({ workspaceData: l, isLoading: u, navigate: d }) {
66
66
  className: "text-sm text-text-primary truncate",
67
67
  children: e.description || s[e.action] || e.action
68
68
  }), /* @__PURE__ */ r("p", {
69
- className: "text-xs text-muted-foreground",
69
+ className: "text-xs text-text-secondary",
70
70
  children: l
71
71
  })]
72
72
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"RecentActivityWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/RecentActivityWidget.tsx"],"sourcesContent":["import { Activity, ArrowRight } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\nimport { formatRelativeTime } from '@burdenoff/fe-libs/shared/utils';\n\nconst actionLabels: Record<string, string> = {\n 'workspace.created': 'Created workspace',\n 'workspace.updated': 'Updated workspace',\n 'project.created': 'Created project',\n 'project.updated': 'Updated project',\n 'member.added': 'Added member',\n 'member.removed': 'Removed member',\n 'file.uploaded': 'Uploaded file',\n 'tag.created': 'Created tag',\n 'tag.assigned': 'Assigned tag',\n 'workflow.started': 'Started workflow',\n 'workflow.completed': 'Completed workflow',\n 'event.created': 'Created event',\n 'comment.added': 'Added comment',\n};\n\nconst entityIcons: Record<string, string> = {\n workspace: 'bg-status-info-bg-subtle text-status-info-text',\n project: 'bg-status-success-bg-subtle text-status-success-text',\n member: 'bg-accent-purple-subtle text-accent-purple',\n file: 'bg-status-warning-bg-subtle text-status-warning-text',\n tag: 'bg-accent-cyan-subtle text-accent-cyan',\n workflow: 'bg-accent-orange-subtle text-accent-orange',\n calendar: 'bg-accent-pink-subtle text-accent-pink',\n};\n\nexport function RecentActivityWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const activities = workspaceData?.recentActivities ?? [];\n\n return (\n <WidgetWrapper\n title=\"Recent Activity\"\n icon={<Activity className=\"size-4\" />}\n size=\"large\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/workspaces/activity')}\n >\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {activities.length === 0 ? (\n <div className=\"text-center py-6\">\n <p className=\"text-sm text-muted-foreground\">No recent activity</p>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Activity will appear here as you use the platform\n </p>\n </div>\n ) : (\n <div className=\"space-y-1\">\n {activities.map((activity, idx) => {\n const resourceType = activity.resourceType || 'workspace';\n const colorClass = entityIcons[resourceType] || 'bg-bg-sunken text-text-secondary';\n const timeAgo = formatRelativeTime(new Date(activity.timestamp));\n return (\n <div\n key={activity.id || idx}\n className=\"flex items-start gap-3 p-2 rounded-md hover:bg-accent/5 transition-colors\"\n >\n <div\n className={`rounded-full size-7 flex items-center justify-center text-xs font-bold shrink-0 ${colorClass}`}\n >\n {resourceType.charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm text-text-primary truncate\">\n {activity.description || actionLabels[activity.action] || activity.action}\n </p>\n <p className=\"text-xs text-muted-foreground\">{timeAgo}</p>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;;AAMA,IAAM,IAAuC;CAC3C,qBAAqB;CACrB,qBAAqB;CACrB,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;CACf,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,iBAAiB;CACjB,iBAAiB;CAClB,EAEK,IAAsC;CAC1C,WAAW;CACX,SAAS;CACT,QAAQ;CACR,MAAM;CACN,KAAK;CACL,UAAU;CACV,UAAU;CACX;AAED,SAAgB,EAAqB,EAAE,kBAAe,cAAW,eAAyB;CACxF,IAAM,IAAa,GAAe,oBAAoB,EAAE;AAExD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;EACrC,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,EAAW,WAAW,IACrB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAsB,CAAA,EACnE,kBAAC,KAAD;IAAG,WAAU;cAAqC;IAE9C,CAAA,CACA;OAEN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAW,KAAK,GAAU,MAAQ;IACjC,IAAM,IAAe,EAAS,gBAAgB,aACxC,IAAa,EAAY,MAAiB,oCAC1C,IAAU,EAAmB,IAAI,KAAK,EAAS,UAAU,CAAC;AAChE,WACE,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MACE,WAAW,mFAAmF;gBAE7F,EAAa,OAAO,EAAE,CAAC,aAAa;MACjC,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAS,eAAe,EAAa,EAAS,WAAW,EAAS;OACjE,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBAAiC;OAAY,CAAA,CACtD;QACF;OAdC,EAAS,MAAM,EAchB;KAER;GACE,CAAA;EAEM,CAAA"}
1
+ {"version":3,"file":"RecentActivityWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/RecentActivityWidget.tsx"],"sourcesContent":["import { Activity, ArrowRight } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\nimport { formatRelativeTime } from '@burdenoff/fe-libs/shared/utils';\n\nconst actionLabels: Record<string, string> = {\n 'workspace.created': 'Created workspace',\n 'workspace.updated': 'Updated workspace',\n 'project.created': 'Created project',\n 'project.updated': 'Updated project',\n 'member.added': 'Added member',\n 'member.removed': 'Removed member',\n 'file.uploaded': 'Uploaded file',\n 'tag.created': 'Created tag',\n 'tag.assigned': 'Assigned tag',\n 'workflow.started': 'Started workflow',\n 'workflow.completed': 'Completed workflow',\n 'event.created': 'Created event',\n 'comment.added': 'Added comment',\n};\n\nconst entityIcons: Record<string, string> = {\n workspace: 'bg-status-info-bg-subtle text-status-info-text',\n project: 'bg-status-success-bg-subtle text-status-success-text',\n member: 'bg-accent-purple-subtle text-accent-purple',\n file: 'bg-status-warning-bg-subtle text-status-warning-text',\n tag: 'bg-accent-cyan-subtle text-accent-cyan',\n workflow: 'bg-accent-orange-subtle text-accent-orange',\n calendar: 'bg-accent-pink-subtle text-accent-pink',\n};\n\nexport function RecentActivityWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const activities = workspaceData?.recentActivities ?? [];\n\n return (\n <WidgetWrapper\n title=\"Recent Activity\"\n icon={<Activity className=\"size-4\" />}\n size=\"large\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/workspaces/activity')}\n >\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {activities.length === 0 ? (\n <div className=\"text-center py-6\">\n <p className=\"text-sm text-text-secondary\">No recent activity</p>\n <p className=\"text-xs text-text-secondary mt-1\">\n Activity will appear here as you use the platform\n </p>\n </div>\n ) : (\n <div className=\"space-y-1\">\n {activities.map((activity, idx) => {\n const resourceType = activity.resourceType || 'workspace';\n const colorClass = entityIcons[resourceType] || 'bg-bg-sunken text-text-secondary';\n const timeAgo = formatRelativeTime(new Date(activity.timestamp));\n return (\n <div\n key={activity.id || idx}\n className=\"flex items-start gap-3 p-2 rounded-md hover:bg-accent/5 transition-colors\"\n >\n <div\n className={`rounded-full size-7 flex items-center justify-center text-xs font-bold shrink-0 ${colorClass}`}\n >\n {resourceType.charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm text-text-primary truncate\">\n {activity.description || actionLabels[activity.action] || activity.action}\n </p>\n <p className=\"text-xs text-text-secondary\">{timeAgo}</p>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;;AAMA,IAAM,IAAuC;CAC3C,qBAAqB;CACrB,qBAAqB;CACrB,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;CACf,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,iBAAiB;CACjB,iBAAiB;CAClB,EAEK,IAAsC;CAC1C,WAAW;CACX,SAAS;CACT,QAAQ;CACR,MAAM;CACN,KAAK;CACL,UAAU;CACV,UAAU;CACX;AAED,SAAgB,EAAqB,EAAE,kBAAe,cAAW,eAAyB;CACxF,IAAM,IAAa,GAAe,oBAAoB,EAAE;AAExD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;EACrC,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,EAAW,WAAW,IACrB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAAsB,CAAA,EACjE,kBAAC,KAAD;IAAG,WAAU;cAAmC;IAE5C,CAAA,CACA;OAEN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAW,KAAK,GAAU,MAAQ;IACjC,IAAM,IAAe,EAAS,gBAAgB,aACxC,IAAa,EAAY,MAAiB,oCAC1C,IAAU,EAAmB,IAAI,KAAK,EAAS,UAAU,CAAC;AAChE,WACE,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MACE,WAAW,mFAAmF;gBAE7F,EAAa,OAAO,EAAE,CAAC,aAAa;MACjC,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAS,eAAe,EAAa,EAAS,WAAW,EAAS;OACjE,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBAA+B;OAAY,CAAA,CACpD;QACF;OAdC,EAAS,MAAM,EAchB;KAER;GACE,CAAA;EAEM,CAAA"}
@@ -38,8 +38,8 @@ function u({ workspaceData: u, isLoading: d, navigate: f }) {
38
38
  }),
39
39
  children: p.length === 0 ? /* @__PURE__ */ a("div", {
40
40
  className: "text-center py-4",
41
- children: [/* @__PURE__ */ i(t, { className: "mx-auto mb-2 size-5 text-muted-foreground" }), /* @__PURE__ */ i("p", {
42
- className: "text-sm text-muted-foreground",
41
+ children: [/* @__PURE__ */ i(t, { className: "mx-auto mb-2 size-5 text-text-secondary" }), /* @__PURE__ */ i("p", {
42
+ className: "text-sm text-text-secondary",
43
43
  children: "No active sessions"
44
44
  })]
45
45
  }) : /* @__PURE__ */ i("ul", {
@@ -54,7 +54,7 @@ function u({ workspaceData: u, isLoading: d, navigate: f }) {
54
54
  className: "truncate text-sm font-medium text-text-primary",
55
55
  children: e.name || `Session ${e.id.slice(0, 8)}`
56
56
  }), e.agent?.name ? /* @__PURE__ */ i("p", {
57
- className: "truncate text-[11px] text-muted-foreground",
57
+ className: "truncate text-[11px] text-text-secondary",
58
58
  children: e.agent.name
59
59
  }) : null]
60
60
  }), /* @__PURE__ */ a("div", {
@@ -64,7 +64,7 @@ function u({ workspaceData: u, isLoading: d, navigate: f }) {
64
64
  className: `text-[10px] ${c[e.status] ?? ""}`,
65
65
  children: e.status.toLowerCase()
66
66
  }), e.startedAt ? /* @__PURE__ */ i("span", {
67
- className: "text-[10px] text-muted-foreground",
67
+ className: "text-[10px] text-text-secondary",
68
68
  children: l(e.startedAt)
69
69
  }) : null]
70
70
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"SessionsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/SessionsWidget.tsx"],"sourcesContent":["import { Terminal, ArrowRight, Activity } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst STATUS_BADGE: Record<string, string> = {\n RUNNING: 'bg-status-success-bg text-status-success-text',\n ACTIVE: 'bg-status-success-bg text-status-success-text',\n STARTING: 'bg-status-warning-bg text-status-warning-text',\n STOPPED: 'bg-text-tertiary/20 text-text-tertiary',\n ERROR: 'bg-status-error-bg text-status-error-text',\n};\n\nfunction formatRelative(dateString: string | null | undefined): string {\n if (!dateString) return '';\n const diffMs = Date.now() - new Date(dateString).getTime();\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return `${diffMin}m`;\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return `${diffHr}h`;\n return new Date(dateString).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n });\n}\n\nexport function SessionsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const sessions = workspaceData?.activeSessions ?? [];\n\n return (\n <WidgetWrapper\n title=\"Active Sessions\"\n icon={<Terminal 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('/vibecontrols/sessions')}\n >\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {sessions.length === 0 ? (\n <div className=\"text-center py-4\">\n <Activity className=\"mx-auto mb-2 size-5 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">No active sessions</p>\n </div>\n ) : (\n <ul className=\"space-y-1.5\">\n {sessions.slice(0, 5).map((s) => (\n <li key={s.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`/vibecontrols/sessions/${s.id}`)}\n className=\"flex w-full items-center justify-between gap-2 rounded-md p-2 text-left transition-colors hover:bg-accent/5\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {s.name || `Session ${s.id.slice(0, 8)}`}\n </p>\n {s.agent?.name ? (\n <p className=\"truncate text-[11px] text-muted-foreground\">{s.agent.name}</p>\n ) : null}\n </div>\n <div className=\"flex flex-col items-end gap-1\">\n <Badge\n variant=\"outline\"\n className={`text-[10px] ${STATUS_BADGE[s.status] ?? ''}`}\n >\n {s.status.toLowerCase()}\n </Badge>\n {s.startedAt ? (\n <span className=\"text-[10px] text-muted-foreground\">\n {formatRelative(s.startedAt)}\n </span>\n ) : null}\n </div>\n </button>\n </li>\n ))}\n </ul>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,IAAM,IAAuC;CAC3C,SAAS;CACT,QAAQ;CACR,UAAU;CACV,SAAS;CACT,OAAO;CACR;AAED,SAAS,EAAe,GAA+C;AACrE,KAAI,CAAC,EAAY,QAAO;CACxB,IAAM,IAAS,KAAK,KAAK,GAAG,IAAI,KAAK,EAAW,CAAC,SAAS,EACpD,IAAU,KAAK,MAAM,IAAS,IAAM;AAC1C,KAAI,IAAU,EAAG,QAAO;AACxB,KAAI,IAAU,GAAI,QAAO,GAAG,EAAQ;CACpC,IAAM,IAAS,KAAK,MAAM,IAAU,GAAG;AAEvC,QADI,IAAS,KAAW,GAAG,EAAO,KAC3B,IAAI,KAAK,EAAW,CAAC,mBAAmB,KAAA,GAAW;EACxD,OAAO;EACP,KAAK;EACN,CAAC;;AAGJ,SAAgB,EAAe,EAAE,kBAAe,cAAW,eAAyB;CAClF,IAAM,IAAW,GAAe,kBAAkB,EAAE;AAEpD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;EACrC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,yBAAyB;aAJnD,CAKC,aACU,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,CACxC;;YAGV,EAAS,WAAW,IACnB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAU,WAAU,6CAA8C,CAAA,EAClE,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAsB,CAAA,CAC/D;OAEN,kBAAC,MAAD;GAAI,WAAU;aACX,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,MACzB,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAS,0BAA0B,EAAE,KAAK;IACzD,WAAU;cAHZ,CAKE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAE,QAAQ,WAAW,EAAE,GAAG,MAAM,GAAG,EAAE;MACpC,CAAA,EACH,EAAE,OAAO,OACR,kBAAC,KAAD;MAAG,WAAU;gBAA8C,EAAE,MAAM;MAAS,CAAA,GAC1E,KACA;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,SAAQ;MACR,WAAW,eAAe,EAAa,EAAE,WAAW;gBAEnD,EAAE,OAAO,aAAa;MACjB,CAAA,EACP,EAAE,YACD,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAe,EAAE,UAAU;MACvB,CAAA,GACL,KACA;OACC;OACN,EA5BI,EAAE,GA4BN,CACL;GACC,CAAA;EAEO,CAAA"}
1
+ {"version":3,"file":"SessionsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/SessionsWidget.tsx"],"sourcesContent":["import { Terminal, ArrowRight, Activity } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst STATUS_BADGE: Record<string, string> = {\n RUNNING: 'bg-status-success-bg text-status-success-text',\n ACTIVE: 'bg-status-success-bg text-status-success-text',\n STARTING: 'bg-status-warning-bg text-status-warning-text',\n STOPPED: 'bg-text-tertiary/20 text-text-tertiary',\n ERROR: 'bg-status-error-bg text-status-error-text',\n};\n\nfunction formatRelative(dateString: string | null | undefined): string {\n if (!dateString) return '';\n const diffMs = Date.now() - new Date(dateString).getTime();\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return `${diffMin}m`;\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return `${diffHr}h`;\n return new Date(dateString).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n });\n}\n\nexport function SessionsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const sessions = workspaceData?.activeSessions ?? [];\n\n return (\n <WidgetWrapper\n title=\"Active Sessions\"\n icon={<Terminal 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('/vibecontrols/sessions')}\n >\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {sessions.length === 0 ? (\n <div className=\"text-center py-4\">\n <Activity className=\"mx-auto mb-2 size-5 text-text-secondary\" />\n <p className=\"text-sm text-text-secondary\">No active sessions</p>\n </div>\n ) : (\n <ul className=\"space-y-1.5\">\n {sessions.slice(0, 5).map((s) => (\n <li key={s.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`/vibecontrols/sessions/${s.id}`)}\n className=\"flex w-full items-center justify-between gap-2 rounded-md p-2 text-left transition-colors hover:bg-accent/5\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {s.name || `Session ${s.id.slice(0, 8)}`}\n </p>\n {s.agent?.name ? (\n <p className=\"truncate text-[11px] text-text-secondary\">{s.agent.name}</p>\n ) : null}\n </div>\n <div className=\"flex flex-col items-end gap-1\">\n <Badge\n variant=\"outline\"\n className={`text-[10px] ${STATUS_BADGE[s.status] ?? ''}`}\n >\n {s.status.toLowerCase()}\n </Badge>\n {s.startedAt ? (\n <span className=\"text-[10px] text-text-secondary\">\n {formatRelative(s.startedAt)}\n </span>\n ) : null}\n </div>\n </button>\n </li>\n ))}\n </ul>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,IAAM,IAAuC;CAC3C,SAAS;CACT,QAAQ;CACR,UAAU;CACV,SAAS;CACT,OAAO;CACR;AAED,SAAS,EAAe,GAA+C;AACrE,KAAI,CAAC,EAAY,QAAO;CACxB,IAAM,IAAS,KAAK,KAAK,GAAG,IAAI,KAAK,EAAW,CAAC,SAAS,EACpD,IAAU,KAAK,MAAM,IAAS,IAAM;AAC1C,KAAI,IAAU,EAAG,QAAO;AACxB,KAAI,IAAU,GAAI,QAAO,GAAG,EAAQ;CACpC,IAAM,IAAS,KAAK,MAAM,IAAU,GAAG;AAEvC,QADI,IAAS,KAAW,GAAG,EAAO,KAC3B,IAAI,KAAK,EAAW,CAAC,mBAAmB,KAAA,GAAW;EACxD,OAAO;EACP,KAAK;EACN,CAAC;;AAGJ,SAAgB,EAAe,EAAE,kBAAe,cAAW,eAAyB;CAClF,IAAM,IAAW,GAAe,kBAAkB,EAAE;AAEpD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;EACrC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,yBAAyB;aAJnD,CAKC,aACU,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,CACxC;;YAGV,EAAS,WAAW,IACnB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAU,WAAU,2CAA4C,CAAA,EAChE,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAAsB,CAAA,CAC7D;OAEN,kBAAC,MAAD;GAAI,WAAU;aACX,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,MACzB,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAS,0BAA0B,EAAE,KAAK;IACzD,WAAU;cAHZ,CAKE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAE,QAAQ,WAAW,EAAE,GAAG,MAAM,GAAG,EAAE;MACpC,CAAA,EACH,EAAE,OAAO,OACR,kBAAC,KAAD;MAAG,WAAU;gBAA4C,EAAE,MAAM;MAAS,CAAA,GACxE,KACA;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,SAAQ;MACR,WAAW,eAAe,EAAa,EAAE,WAAW;gBAEnD,EAAE,OAAO,aAAa;MACjB,CAAA,EACP,EAAE,YACD,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAe,EAAE,UAAU;MACvB,CAAA,GACL,KACA;OACC;OACN,EA5BI,EAAE,GA4BN,CACL;GACC,CAAA;EAEO,CAAA"}
@@ -31,7 +31,7 @@ function c({ workspaceData: c, isLoading: l, navigate: u }) {
31
31
  children: d.length === 0 ? /* @__PURE__ */ r("div", {
32
32
  className: "text-center py-3",
33
33
  children: /* @__PURE__ */ r("p", {
34
- className: "text-xs text-muted-foreground",
34
+ className: "text-xs text-text-secondary",
35
35
  children: "No tags created yet"
36
36
  })
37
37
  }) : /* @__PURE__ */ i("div", {
@@ -45,7 +45,7 @@ function c({ workspaceData: c, isLoading: l, navigate: u }) {
45
45
  children: e.label
46
46
  }, e.id))
47
47
  }), f > 12 && /* @__PURE__ */ i("p", {
48
- className: "text-[11px] text-muted-foreground text-center",
48
+ className: "text-[11px] text-text-secondary text-center",
49
49
  children: [
50
50
  "+",
51
51
  f - 12,
@@ -1 +1 @@
1
- {"version":3,"file":"TagCloudWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/TagCloudWidget.tsx"],"sourcesContent":["import { Tags, ArrowRight } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst tagColors = [\n 'bg-status-info-bg-subtle text-status-info-text border-border-default',\n 'bg-status-success-bg-subtle text-status-success-text border-border-default',\n 'bg-accent-purple-subtle text-accent-purple border-border-default',\n 'bg-status-warning-bg-subtle text-status-warning-text border-border-default',\n 'bg-accent-pink-subtle text-accent-pink border-border-default',\n 'bg-accent-cyan-subtle text-accent-cyan border-border-default',\n 'bg-accent-orange-subtle text-accent-orange border-border-default',\n 'bg-accent-rose-subtle text-accent-rose border-border-default',\n];\n\nexport function TagCloudWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const tags = workspaceData?.tags.items ?? [];\n const total = workspaceData?.tags.total ?? 0;\n\n return (\n <WidgetWrapper\n title=\"Tags\"\n icon={<Tags className=\"size-4\" />}\n size=\"small\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs\" onClick={() => navigate('/tags')}>\n <ArrowRight className=\"size-3\" />\n </Button>\n }\n >\n {tags.length === 0 ? (\n <div className=\"text-center py-3\">\n <p className=\"text-xs text-muted-foreground\">No tags created yet</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-1.5\">\n {tags.slice(0, 12).map((tag, idx) => (\n <Badge\n key={tag.id}\n variant=\"outline\"\n className={`text-[11px] cursor-pointer hover:opacity-80 transition-opacity ${tagColors[idx % tagColors.length]}`}\n onClick={() => navigate('/tags')}\n >\n {tag.label}\n </Badge>\n ))}\n </div>\n {total > 12 && (\n <p className=\"text-[11px] text-muted-foreground text-center\">+{total - 12} more tags</p>\n )}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,IAAM,IAAY;CAChB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,EAAe,EAAE,kBAAe,cAAW,eAAyB;CAClF,IAAM,IAAO,GAAe,KAAK,SAAS,EAAE,EACtC,IAAQ,GAAe,KAAK,SAAS;AAE3C,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA;EACjC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GAAQ,SAAQ;GAAQ,MAAK;GAAK,WAAU;GAAU,eAAe,EAAS,QAAQ;aACpF,kBAAC,GAAD,EAAY,WAAU,UAAW,CAAA;GAC1B,CAAA;YAGV,EAAK,WAAW,IACf,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAuB,CAAA;GAChE,CAAA,GAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAK,MAAM,GAAG,GAAG,CAAC,KAAK,GAAK,MAC3B,kBAAC,GAAD;KAEE,SAAQ;KACR,WAAW,kEAAkE,EAAU,IAAM,EAAU;KACvG,eAAe,EAAS,QAAQ;eAE/B,EAAI;KACC,EAND,EAAI,GAMH,CACR;IACE,CAAA,EACL,IAAQ,MACP,kBAAC,KAAD;IAAG,WAAU;cAAb;KAA6D;KAAE,IAAQ;KAAG;KAAc;MAEtF;;EAEM,CAAA"}
1
+ {"version":3,"file":"TagCloudWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/TagCloudWidget.tsx"],"sourcesContent":["import { Tags, ArrowRight } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst tagColors = [\n 'bg-status-info-bg-subtle text-status-info-text border-border-default',\n 'bg-status-success-bg-subtle text-status-success-text border-border-default',\n 'bg-accent-purple-subtle text-accent-purple border-border-default',\n 'bg-status-warning-bg-subtle text-status-warning-text border-border-default',\n 'bg-accent-pink-subtle text-accent-pink border-border-default',\n 'bg-accent-cyan-subtle text-accent-cyan border-border-default',\n 'bg-accent-orange-subtle text-accent-orange border-border-default',\n 'bg-accent-rose-subtle text-accent-rose border-border-default',\n];\n\nexport function TagCloudWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const tags = workspaceData?.tags.items ?? [];\n const total = workspaceData?.tags.total ?? 0;\n\n return (\n <WidgetWrapper\n title=\"Tags\"\n icon={<Tags className=\"size-4\" />}\n size=\"small\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs\" onClick={() => navigate('/tags')}>\n <ArrowRight className=\"size-3\" />\n </Button>\n }\n >\n {tags.length === 0 ? (\n <div className=\"text-center py-3\">\n <p className=\"text-xs text-text-secondary\">No tags created yet</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-1.5\">\n {tags.slice(0, 12).map((tag, idx) => (\n <Badge\n key={tag.id}\n variant=\"outline\"\n className={`text-[11px] cursor-pointer hover:opacity-80 transition-opacity ${tagColors[idx % tagColors.length]}`}\n onClick={() => navigate('/tags')}\n >\n {tag.label}\n </Badge>\n ))}\n </div>\n {total > 12 && (\n <p className=\"text-[11px] text-text-secondary text-center\">+{total - 12} more tags</p>\n )}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,IAAM,IAAY;CAChB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,EAAe,EAAE,kBAAe,cAAW,eAAyB;CAClF,IAAM,IAAO,GAAe,KAAK,SAAS,EAAE,EACtC,IAAQ,GAAe,KAAK,SAAS;AAE3C,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA;EACjC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GAAQ,SAAQ;GAAQ,MAAK;GAAK,WAAU;GAAU,eAAe,EAAS,QAAQ;aACpF,kBAAC,GAAD,EAAY,WAAU,UAAW,CAAA;GAC1B,CAAA;YAGV,EAAK,WAAW,IACf,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAAuB,CAAA;GAC9D,CAAA,GAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAK,MAAM,GAAG,GAAG,CAAC,KAAK,GAAK,MAC3B,kBAAC,GAAD;KAEE,SAAQ;KACR,WAAW,kEAAkE,EAAU,IAAM,EAAU;KACvG,eAAe,EAAS,QAAQ;eAE/B,EAAI;KACC,EAND,EAAI,GAMH,CACR;IACE,CAAA,EACL,IAAQ,MACP,kBAAC,KAAD;IAAG,WAAU;cAAb;KAA2D;KAAE,IAAQ;KAAG;KAAc;MAEpF;;EAEM,CAAA"}
@@ -96,11 +96,11 @@ function g({ navigate: t, isLoading: i, productId: a }) {
96
96
  className: "text-xs font-medium text-text-primary leading-tight",
97
97
  children: e.title
98
98
  }), /* @__PURE__ */ d("p", {
99
- className: "text-[11px] text-muted-foreground leading-tight mt-0.5",
99
+ className: "text-[11px] text-text-secondary leading-tight mt-0.5",
100
100
  children: e.description
101
101
  })]
102
102
  }),
103
- /* @__PURE__ */ d(n, { className: "size-3 text-muted-foreground shrink-0 mt-0.5" })
103
+ /* @__PURE__ */ d(n, { className: "size-3 text-text-secondary shrink-0 mt-0.5" })
104
104
  ]
105
105
  }, e.title) : /* @__PURE__ */ f("button", {
106
106
  type: "button",
@@ -112,7 +112,7 @@ function g({ navigate: t, isLoading: i, productId: a }) {
112
112
  className: "text-xs font-medium text-text-primary leading-tight",
113
113
  children: e.title
114
114
  }), /* @__PURE__ */ d("p", {
115
- className: "text-[11px] text-muted-foreground leading-tight mt-0.5",
115
+ className: "text-[11px] text-text-secondary leading-tight mt-0.5",
116
116
  children: e.description
117
117
  })]
118
118
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"TipsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/TipsWidget.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport {\n Lightbulb,\n ExternalLink,\n BookOpen,\n Rocket,\n Shield,\n Workflow,\n Users,\n Puzzle,\n Newspaper,\n Sparkles,\n} from 'lucide-react';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\ninterface Tip {\n icon: LucideIcon;\n title: string;\n description: string;\n href: string;\n external?: boolean;\n color: string;\n}\n\nconst VIBECONTROLS_TIPS: Tip[] = [\n {\n icon: BookOpen,\n title: 'Read the docs',\n description: 'Guides, references, and tutorials at docs.vibecontrols.com.',\n href: 'https://docs.vibecontrols.com',\n external: true,\n color: 'text-accent-blue',\n },\n {\n icon: Users,\n title: 'Join the community',\n description: 'Ask questions, share workflows, and chat with the team.',\n href: 'https://community.vibecontrols.com',\n external: true,\n color: 'text-accent-purple',\n },\n {\n icon: Puzzle,\n title: 'Browse plugins',\n description: '50+ plugins for terminals, AI, tunnels, sandboxes, and more.',\n href: '/vibecontrols/plugins',\n color: 'text-status-success-text',\n },\n {\n icon: Newspaper,\n title: 'Latest from the blog',\n description: 'Product updates, deep dives, and engineering posts.',\n href: 'https://vibecontrols.com/blog',\n external: true,\n color: 'text-status-warning-text',\n },\n {\n icon: Sparkles,\n title: 'Feature previews',\n description: 'Try opt-in features before they ship to everyone.',\n href: '/feature-previews',\n color: 'text-accent-pink',\n },\n];\n\nconst WORKSPACES_TIPS: Tip[] = [\n {\n icon: Rocket,\n title: 'Create your first workspace',\n description: 'Organize your team with a dedicated workspace.',\n href: '/workspaces/list',\n color: 'text-accent-blue',\n },\n {\n icon: Workflow,\n title: 'Automate with workflows',\n description: 'Build automation workflows to streamline your processes.',\n href: '/workflows',\n color: 'text-status-success-text',\n },\n {\n icon: Shield,\n title: 'Set up permissions',\n description: 'Configure role-based access for your workspace members.',\n href: '/rbac',\n color: 'text-accent-purple',\n },\n {\n icon: BookOpen,\n title: 'Explore the API',\n description: 'Check out our developer portal for API documentation.',\n href: '/devportal',\n color: 'text-status-warning-text',\n },\n];\n\nfunction pickTips(productId?: string): Tip[] {\n if (productId === 'vibecontrols') return VIBECONTROLS_TIPS;\n return WORKSPACES_TIPS;\n}\n\nexport function TipsWidget({ navigate, isLoading, productId }: WidgetProps) {\n const tips = pickTips(productId);\n\n return (\n <WidgetWrapper\n title=\"Tips & Resources\"\n icon={<Lightbulb className=\"size-4\" />}\n size=\"small\"\n isLoading={isLoading}\n >\n <div className=\"space-y-2\">\n {tips.map((tip) =>\n tip.external ? (\n <a\n key={tip.title}\n href={tip.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"w-full flex items-start gap-2 p-1.5 rounded hover:bg-accent/5 transition-colors text-left\"\n >\n <tip.icon className={`size-4 mt-0.5 shrink-0 ${tip.color}`} />\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary leading-tight\">{tip.title}</p>\n <p className=\"text-[11px] text-muted-foreground leading-tight mt-0.5\">\n {tip.description}\n </p>\n </div>\n <ExternalLink className=\"size-3 text-muted-foreground shrink-0 mt-0.5\" />\n </a>\n ) : (\n <button\n key={tip.title}\n type=\"button\"\n className=\"w-full flex items-start gap-2 p-1.5 rounded hover:bg-accent/5 cursor-pointer transition-colors text-left\"\n onClick={() => navigate(tip.href)}\n >\n <tip.icon className={`size-4 mt-0.5 shrink-0 ${tip.color}`} />\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary leading-tight\">{tip.title}</p>\n <p className=\"text-[11px] text-muted-foreground leading-tight mt-0.5\">\n {tip.description}\n </p>\n </div>\n </button>\n )\n )}\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;AAyBA,IAAM,IAA2B;CAC/B;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACF,EAEK,IAAyB;CAC7B;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACF;AAED,SAAS,EAAS,GAA2B;AAE3C,QADI,MAAc,iBAAuB,IAClC;;AAGT,SAAgB,EAAW,EAAE,aAAU,cAAW,gBAA0B;CAC1E,IAAM,IAAO,EAAS,EAAU;AAEhC,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;EACtC,MAAK;EACM;YAEX,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAK,KAAK,MACT,EAAI,WACF,kBAAC,KAAD;IAEE,MAAM,EAAI;IACV,QAAO;IACP,KAAI;IACJ,WAAU;cALZ;KAOE,kBAAC,EAAI,MAAL,EAAU,WAAW,0BAA0B,EAAI,SAAW,CAAA;KAC9D,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAuD,EAAI;OAAU,CAAA,EAClF,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAI;OACH,CAAA,CACA;;KACN,kBAAC,GAAD,EAAc,WAAU,gDAAiD,CAAA;KACvE;MAdG,EAAI,MAcP,GAEJ,kBAAC,UAAD;IAEE,MAAK;IACL,WAAU;IACV,eAAe,EAAS,EAAI,KAAK;cAJnC,CAME,kBAAC,EAAI,MAAL,EAAU,WAAW,0BAA0B,EAAI,SAAW,CAAA,EAC9D,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAuD,EAAI;MAAU,CAAA,EAClF,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAI;MACH,CAAA,CACA;OACC;MAZF,EAAI,MAYF,CAEZ;GACG,CAAA;EACQ,CAAA"}
1
+ {"version":3,"file":"TipsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/TipsWidget.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport {\n Lightbulb,\n ExternalLink,\n BookOpen,\n Rocket,\n Shield,\n Workflow,\n Users,\n Puzzle,\n Newspaper,\n Sparkles,\n} from 'lucide-react';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\ninterface Tip {\n icon: LucideIcon;\n title: string;\n description: string;\n href: string;\n external?: boolean;\n color: string;\n}\n\nconst VIBECONTROLS_TIPS: Tip[] = [\n {\n icon: BookOpen,\n title: 'Read the docs',\n description: 'Guides, references, and tutorials at docs.vibecontrols.com.',\n href: 'https://docs.vibecontrols.com',\n external: true,\n color: 'text-accent-blue',\n },\n {\n icon: Users,\n title: 'Join the community',\n description: 'Ask questions, share workflows, and chat with the team.',\n href: 'https://community.vibecontrols.com',\n external: true,\n color: 'text-accent-purple',\n },\n {\n icon: Puzzle,\n title: 'Browse plugins',\n description: '50+ plugins for terminals, AI, tunnels, sandboxes, and more.',\n href: '/vibecontrols/plugins',\n color: 'text-status-success-text',\n },\n {\n icon: Newspaper,\n title: 'Latest from the blog',\n description: 'Product updates, deep dives, and engineering posts.',\n href: 'https://vibecontrols.com/blog',\n external: true,\n color: 'text-status-warning-text',\n },\n {\n icon: Sparkles,\n title: 'Feature previews',\n description: 'Try opt-in features before they ship to everyone.',\n href: '/feature-previews',\n color: 'text-accent-pink',\n },\n];\n\nconst WORKSPACES_TIPS: Tip[] = [\n {\n icon: Rocket,\n title: 'Create your first workspace',\n description: 'Organize your team with a dedicated workspace.',\n href: '/workspaces/list',\n color: 'text-accent-blue',\n },\n {\n icon: Workflow,\n title: 'Automate with workflows',\n description: 'Build automation workflows to streamline your processes.',\n href: '/workflows',\n color: 'text-status-success-text',\n },\n {\n icon: Shield,\n title: 'Set up permissions',\n description: 'Configure role-based access for your workspace members.',\n href: '/rbac',\n color: 'text-accent-purple',\n },\n {\n icon: BookOpen,\n title: 'Explore the API',\n description: 'Check out our developer portal for API documentation.',\n href: '/devportal',\n color: 'text-status-warning-text',\n },\n];\n\nfunction pickTips(productId?: string): Tip[] {\n if (productId === 'vibecontrols') return VIBECONTROLS_TIPS;\n return WORKSPACES_TIPS;\n}\n\nexport function TipsWidget({ navigate, isLoading, productId }: WidgetProps) {\n const tips = pickTips(productId);\n\n return (\n <WidgetWrapper\n title=\"Tips & Resources\"\n icon={<Lightbulb className=\"size-4\" />}\n size=\"small\"\n isLoading={isLoading}\n >\n <div className=\"space-y-2\">\n {tips.map((tip) =>\n tip.external ? (\n <a\n key={tip.title}\n href={tip.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"w-full flex items-start gap-2 p-1.5 rounded hover:bg-accent/5 transition-colors text-left\"\n >\n <tip.icon className={`size-4 mt-0.5 shrink-0 ${tip.color}`} />\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary leading-tight\">{tip.title}</p>\n <p className=\"text-[11px] text-text-secondary leading-tight mt-0.5\">\n {tip.description}\n </p>\n </div>\n <ExternalLink className=\"size-3 text-text-secondary shrink-0 mt-0.5\" />\n </a>\n ) : (\n <button\n key={tip.title}\n type=\"button\"\n className=\"w-full flex items-start gap-2 p-1.5 rounded hover:bg-accent/5 cursor-pointer transition-colors text-left\"\n onClick={() => navigate(tip.href)}\n >\n <tip.icon className={`size-4 mt-0.5 shrink-0 ${tip.color}`} />\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary leading-tight\">{tip.title}</p>\n <p className=\"text-[11px] text-text-secondary leading-tight mt-0.5\">\n {tip.description}\n </p>\n </div>\n </button>\n )\n )}\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;AAyBA,IAAM,IAA2B;CAC/B;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,UAAU;EACV,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACF,EAEK,IAAyB;CAC7B;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACF;AAED,SAAS,EAAS,GAA2B;AAE3C,QADI,MAAc,iBAAuB,IAClC;;AAGT,SAAgB,EAAW,EAAE,aAAU,cAAW,gBAA0B;CAC1E,IAAM,IAAO,EAAS,EAAU;AAEhC,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;EACtC,MAAK;EACM;YAEX,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAK,KAAK,MACT,EAAI,WACF,kBAAC,KAAD;IAEE,MAAM,EAAI;IACV,QAAO;IACP,KAAI;IACJ,WAAU;cALZ;KAOE,kBAAC,EAAI,MAAL,EAAU,WAAW,0BAA0B,EAAI,SAAW,CAAA;KAC9D,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAuD,EAAI;OAAU,CAAA,EAClF,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAI;OACH,CAAA,CACA;;KACN,kBAAC,GAAD,EAAc,WAAU,8CAA+C,CAAA;KACrE;MAdG,EAAI,MAcP,GAEJ,kBAAC,UAAD;IAEE,MAAK;IACL,WAAU;IACV,eAAe,EAAS,EAAI,KAAK;cAJnC,CAME,kBAAC,EAAI,MAAL,EAAU,WAAW,0BAA0B,EAAI,SAAW,CAAA,EAC9D,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAuD,EAAI;MAAU,CAAA,EAClF,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAI;MACH,CAAA,CACA;OACC;MAZF,EAAI,MAYF,CAEZ;GACG,CAAA;EACQ,CAAA"}
@@ -38,7 +38,7 @@ function l({ workspaceData: l, isLoading: u, navigate: d }) {
38
38
  children: f.length === 0 ? /* @__PURE__ */ a("div", {
39
39
  className: "text-center py-4",
40
40
  children: [/* @__PURE__ */ i("p", {
41
- className: "text-sm text-muted-foreground",
41
+ className: "text-sm text-text-secondary",
42
42
  children: "No upcoming events"
43
43
  }), /* @__PURE__ */ i(s, {
44
44
  variant: "outline",
@@ -64,7 +64,7 @@ function l({ workspaceData: l, isLoading: u, navigate: d }) {
64
64
  className: "text-sm font-medium text-text-primary truncate",
65
65
  children: e.title
66
66
  }), /* @__PURE__ */ i("p", {
67
- className: "text-xs text-muted-foreground",
67
+ className: "text-xs text-text-secondary",
68
68
  children: c(e.startTime)
69
69
  })]
70
70
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"UpcomingEventsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/UpcomingEventsWidget.tsx"],"sourcesContent":["import { Calendar, ArrowRight, Clock } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nfunction formatEventDate(dateStr: string): string {\n const d = new Date(dateStr);\n const now = new Date();\n const isToday = d.toDateString() === now.toDateString();\n const tomorrow = new Date(now);\n tomorrow.setDate(tomorrow.getDate() + 1);\n const isTomorrow = d.toDateString() === tomorrow.toDateString();\n\n if (isToday)\n return `Today at ${d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n if (isTomorrow)\n return `Tomorrow at ${d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n return d.toLocaleDateString([], {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function UpcomingEventsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const events = workspaceData?.upcomingEvents ?? [];\n\n return (\n <WidgetWrapper\n title=\"Upcoming Events\"\n icon={<Calendar className=\"size-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs\" onClick={() => navigate('/calendar')}>\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {events.length === 0 ? (\n <div className=\"text-center py-4\">\n <p className=\"text-sm text-muted-foreground\">No upcoming events</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2\"\n onClick={() => navigate('/calendar')}\n >\n Schedule an event\n </Button>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {events.map((event) => (\n <button\n key={event.id}\n type=\"button\"\n className=\"w-full flex items-start gap-3 p-2 rounded-md hover:bg-accent/5 cursor-pointer transition-colors text-left\"\n onClick={() => navigate('/calendar')}\n >\n <div className=\"rounded-md bg-accent-pink-subtle text-accent-pink p-1.5 shrink-0\">\n <Clock className=\"size-3.5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-text-primary truncate\">{event.title}</p>\n <p className=\"text-xs text-muted-foreground\">{formatEventDate(event.startTime)}</p>\n </div>\n {event.allDay && (\n <Badge variant=\"secondary\" className=\"text-[10px] shrink-0\">\n All day\n </Badge>\n )}\n </button>\n ))}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,SAAS,EAAgB,GAAyB;CAChD,IAAM,IAAI,IAAI,KAAK,EAAQ,EACrB,oBAAM,IAAI,MAAM,EAChB,IAAU,EAAE,cAAc,KAAK,EAAI,cAAc,EACjD,IAAW,IAAI,KAAK,EAAI;AAC9B,GAAS,QAAQ,EAAS,SAAS,GAAG,EAAE;CACxC,IAAM,IAAa,EAAE,cAAc,KAAK,EAAS,cAAc;AAM/D,QAJI,IACK,YAAY,EAAE,mBAAmB,EAAE,EAAE;EAAE,MAAM;EAAW,QAAQ;EAAW,CAAC,KACjF,IACK,eAAe,EAAE,mBAAmB,EAAE,EAAE;EAAE,MAAM;EAAW,QAAQ;EAAW,CAAC,KACjF,EAAE,mBAAmB,EAAE,EAAE;EAC9B,OAAO;EACP,KAAK;EACL,MAAM;EACN,QAAQ;EACT,CAAC;;AAGJ,SAAgB,EAAqB,EAAE,kBAAe,cAAW,eAAyB;CACxF,IAAM,IAAS,GAAe,kBAAkB,EAAE;AAElD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;EACrC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GAAQ,SAAQ;GAAQ,MAAK;GAAK,WAAU;GAAU,eAAe,EAAS,YAAY;aAA1F,CAA4F,aACjF,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,CACxC;;YAGV,EAAO,WAAW,IACjB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAsB,CAAA,EACnE,kBAAC,GAAD;IACE,SAAQ;IACR,MAAK;IACL,WAAU;IACV,eAAe,EAAS,YAAY;cACrC;IAEQ,CAAA,CACL;OAEN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAO,KAAK,MACX,kBAAC,UAAD;IAEE,MAAK;IACL,WAAU;IACV,eAAe,EAAS,YAAY;cAJtC;KAME,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAO,WAAU,YAAa,CAAA;MAC1B,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAkD,EAAM;OAAU,CAAA,EAC/E,kBAAC,KAAD;OAAG,WAAU;iBAAiC,EAAgB,EAAM,UAAU;OAAK,CAAA,CAC/E;;KACL,EAAM,UACL,kBAAC,GAAD;MAAO,SAAQ;MAAY,WAAU;gBAAuB;MAEpD,CAAA;KAEH;MAjBF,EAAM,GAiBJ,CACT;GACE,CAAA;EAEM,CAAA"}
1
+ {"version":3,"file":"UpcomingEventsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/UpcomingEventsWidget.tsx"],"sourcesContent":["import { Calendar, ArrowRight, Clock } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nfunction formatEventDate(dateStr: string): string {\n const d = new Date(dateStr);\n const now = new Date();\n const isToday = d.toDateString() === now.toDateString();\n const tomorrow = new Date(now);\n tomorrow.setDate(tomorrow.getDate() + 1);\n const isTomorrow = d.toDateString() === tomorrow.toDateString();\n\n if (isToday)\n return `Today at ${d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n if (isTomorrow)\n return `Tomorrow at ${d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n return d.toLocaleDateString([], {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function UpcomingEventsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const events = workspaceData?.upcomingEvents ?? [];\n\n return (\n <WidgetWrapper\n title=\"Upcoming Events\"\n icon={<Calendar className=\"size-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs\" onClick={() => navigate('/calendar')}>\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {events.length === 0 ? (\n <div className=\"text-center py-4\">\n <p className=\"text-sm text-text-secondary\">No upcoming events</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2\"\n onClick={() => navigate('/calendar')}\n >\n Schedule an event\n </Button>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {events.map((event) => (\n <button\n key={event.id}\n type=\"button\"\n className=\"w-full flex items-start gap-3 p-2 rounded-md hover:bg-accent/5 cursor-pointer transition-colors text-left\"\n onClick={() => navigate('/calendar')}\n >\n <div className=\"rounded-md bg-accent-pink-subtle text-accent-pink p-1.5 shrink-0\">\n <Clock className=\"size-3.5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-text-primary truncate\">{event.title}</p>\n <p className=\"text-xs text-text-secondary\">{formatEventDate(event.startTime)}</p>\n </div>\n {event.allDay && (\n <Badge variant=\"secondary\" className=\"text-[10px] shrink-0\">\n All day\n </Badge>\n )}\n </button>\n ))}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,SAAS,EAAgB,GAAyB;CAChD,IAAM,IAAI,IAAI,KAAK,EAAQ,EACrB,oBAAM,IAAI,MAAM,EAChB,IAAU,EAAE,cAAc,KAAK,EAAI,cAAc,EACjD,IAAW,IAAI,KAAK,EAAI;AAC9B,GAAS,QAAQ,EAAS,SAAS,GAAG,EAAE;CACxC,IAAM,IAAa,EAAE,cAAc,KAAK,EAAS,cAAc;AAM/D,QAJI,IACK,YAAY,EAAE,mBAAmB,EAAE,EAAE;EAAE,MAAM;EAAW,QAAQ;EAAW,CAAC,KACjF,IACK,eAAe,EAAE,mBAAmB,EAAE,EAAE;EAAE,MAAM;EAAW,QAAQ;EAAW,CAAC,KACjF,EAAE,mBAAmB,EAAE,EAAE;EAC9B,OAAO;EACP,KAAK;EACL,MAAM;EACN,QAAQ;EACT,CAAC;;AAGJ,SAAgB,EAAqB,EAAE,kBAAe,cAAW,eAAyB;CACxF,IAAM,IAAS,GAAe,kBAAkB,EAAE;AAElD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;EACrC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GAAQ,SAAQ;GAAQ,MAAK;GAAK,WAAU;GAAU,eAAe,EAAS,YAAY;aAA1F,CAA4F,aACjF,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,CACxC;;YAGV,EAAO,WAAW,IACjB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAAsB,CAAA,EACjE,kBAAC,GAAD;IACE,SAAQ;IACR,MAAK;IACL,WAAU;IACV,eAAe,EAAS,YAAY;cACrC;IAEQ,CAAA,CACL;OAEN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAO,KAAK,MACX,kBAAC,UAAD;IAEE,MAAK;IACL,WAAU;IACV,eAAe,EAAS,YAAY;cAJtC;KAME,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAO,WAAU,YAAa,CAAA;MAC1B,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAkD,EAAM;OAAU,CAAA,EAC/E,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAgB,EAAM,UAAU;OAAK,CAAA,CAC7E;;KACL,EAAM,UACL,kBAAC,GAAD;MAAO,SAAQ;MAAY,WAAU;gBAAuB;MAEpD,CAAA;KAEH;MAjBF,EAAM,GAiBJ,CACT;GACE,CAAA;EAEM,CAAA"}
@@ -33,7 +33,7 @@ function c({ workspaceData: c, isLoading: l, navigate: u }) {
33
33
  children: d.length === 0 ? /* @__PURE__ */ a("div", {
34
34
  className: "text-center py-4",
35
35
  children: [/* @__PURE__ */ i("p", {
36
- className: "text-sm text-muted-foreground mb-2",
36
+ className: "text-sm text-text-secondary mb-2",
37
37
  children: "No vibes yet"
38
38
  }), /* @__PURE__ */ a(o, {
39
39
  variant: "outline",
@@ -51,7 +51,7 @@ function c({ workspaceData: c, isLoading: l, navigate: u }) {
51
51
  className: "truncate text-sm font-medium text-text-primary",
52
52
  children: e.name
53
53
  }), /* @__PURE__ */ i("span", {
54
- className: "shrink-0 text-[11px] text-muted-foreground",
54
+ className: "shrink-0 text-[11px] text-text-secondary",
55
55
  children: s(e.updatedAt)
56
56
  })]
57
57
  }) }, e.id))
@@ -1 +1 @@
1
- {"version":3,"file":"VibesWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/VibesWidget.tsx"],"sourcesContent":["import { Sparkles, ArrowRight, Plus } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nfunction formatRelative(dateString: string): string {\n const diffMs = Date.now() - new Date(dateString).getTime();\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return `${diffHr}h ago`;\n const diffDay = Math.floor(diffHr / 24);\n if (diffDay < 7) return `${diffDay}d ago`;\n return new Date(dateString).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n });\n}\n\nexport function VibesWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const vibes = workspaceData?.recentVibes ?? [];\n\n return (\n <WidgetWrapper\n title=\"Recent Vibes\"\n icon={<Sparkles 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('/vibecontrols/vibes')}\n >\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {vibes.length === 0 ? (\n <div className=\"text-center py-4\">\n <p className=\"text-sm text-muted-foreground mb-2\">No vibes yet</p>\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/vibecontrols/vibes/new')}>\n <Plus className=\"mr-1.5 size-3.5\" /> Create your first vibe\n </Button>\n </div>\n ) : (\n <ul className=\"space-y-1.5\">\n {vibes.slice(0, 5).map((vibe) => (\n <li key={vibe.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`/vibecontrols/vibes/${vibe.id}`)}\n className=\"flex w-full items-center justify-between gap-2 rounded-md p-2 text-left transition-colors hover:bg-accent/5\"\n >\n <span className=\"truncate text-sm font-medium text-text-primary\">{vibe.name}</span>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {formatRelative(vibe.updatedAt)}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,SAAS,EAAe,GAA4B;CAClD,IAAM,IAAS,KAAK,KAAK,GAAG,IAAI,KAAK,EAAW,CAAC,SAAS,EACpD,IAAU,KAAK,MAAM,IAAS,IAAM;AAC1C,KAAI,IAAU,EAAG,QAAO;AACxB,KAAI,IAAU,GAAI,QAAO,GAAG,EAAQ;CACpC,IAAM,IAAS,KAAK,MAAM,IAAU,GAAG;AACvC,KAAI,IAAS,GAAI,QAAO,GAAG,EAAO;CAClC,IAAM,IAAU,KAAK,MAAM,IAAS,GAAG;AAEvC,QADI,IAAU,IAAU,GAAG,EAAQ,SAC5B,IAAI,KAAK,EAAW,CAAC,mBAAmB,KAAA,GAAW;EACxD,OAAO;EACP,KAAK;EACN,CAAC;;AAGJ,SAAgB,EAAY,EAAE,kBAAe,cAAW,eAAyB;CAC/E,IAAM,IAAQ,GAAe,eAAe,EAAE;AAE9C,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;EACrC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,sBAAsB;aAJhD,CAKC,aACU,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,CACxC;;YAGV,EAAM,WAAW,IAChB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAqC;IAAgB,CAAA,EAClE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,eAAe,EAAS,0BAA0B;cAAtF,CACE,kBAAC,GAAD,EAAM,WAAU,mBAAoB,CAAA,EAAA,0BAC7B;MACL;OAEN,kBAAC,MAAD;GAAI,WAAU;aACX,EAAM,MAAM,GAAG,EAAE,CAAC,KAAK,MACtB,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAS,uBAAuB,EAAK,KAAK;IACzD,WAAU;cAHZ,CAKE,kBAAC,QAAD;KAAM,WAAU;eAAkD,EAAK;KAAY,CAAA,EACnF,kBAAC,QAAD;KAAM,WAAU;eACb,EAAe,EAAK,UAAU;KAC1B,CAAA,CACA;OACN,EAXI,EAAK,GAWT,CACL;GACC,CAAA;EAEO,CAAA"}
1
+ {"version":3,"file":"VibesWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/VibesWidget.tsx"],"sourcesContent":["import { Sparkles, ArrowRight, Plus } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nfunction formatRelative(dateString: string): string {\n const diffMs = Date.now() - new Date(dateString).getTime();\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return `${diffHr}h ago`;\n const diffDay = Math.floor(diffHr / 24);\n if (diffDay < 7) return `${diffDay}d ago`;\n return new Date(dateString).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n });\n}\n\nexport function VibesWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const vibes = workspaceData?.recentVibes ?? [];\n\n return (\n <WidgetWrapper\n title=\"Recent Vibes\"\n icon={<Sparkles 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('/vibecontrols/vibes')}\n >\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {vibes.length === 0 ? (\n <div className=\"text-center py-4\">\n <p className=\"text-sm text-text-secondary mb-2\">No vibes yet</p>\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/vibecontrols/vibes/new')}>\n <Plus className=\"mr-1.5 size-3.5\" /> Create your first vibe\n </Button>\n </div>\n ) : (\n <ul className=\"space-y-1.5\">\n {vibes.slice(0, 5).map((vibe) => (\n <li key={vibe.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`/vibecontrols/vibes/${vibe.id}`)}\n className=\"flex w-full items-center justify-between gap-2 rounded-md p-2 text-left transition-colors hover:bg-accent/5\"\n >\n <span className=\"truncate text-sm font-medium text-text-primary\">{vibe.name}</span>\n <span className=\"shrink-0 text-[11px] text-text-secondary\">\n {formatRelative(vibe.updatedAt)}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,SAAS,EAAe,GAA4B;CAClD,IAAM,IAAS,KAAK,KAAK,GAAG,IAAI,KAAK,EAAW,CAAC,SAAS,EACpD,IAAU,KAAK,MAAM,IAAS,IAAM;AAC1C,KAAI,IAAU,EAAG,QAAO;AACxB,KAAI,IAAU,GAAI,QAAO,GAAG,EAAQ;CACpC,IAAM,IAAS,KAAK,MAAM,IAAU,GAAG;AACvC,KAAI,IAAS,GAAI,QAAO,GAAG,EAAO;CAClC,IAAM,IAAU,KAAK,MAAM,IAAS,GAAG;AAEvC,QADI,IAAU,IAAU,GAAG,EAAQ,SAC5B,IAAI,KAAK,EAAW,CAAC,mBAAmB,KAAA,GAAW;EACxD,OAAO;EACP,KAAK;EACN,CAAC;;AAGJ,SAAgB,EAAY,EAAE,kBAAe,cAAW,eAAyB;CAC/E,IAAM,IAAQ,GAAe,eAAe,EAAE;AAE9C,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;EACrC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,sBAAsB;aAJhD,CAKC,aACU,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,CACxC;;YAGV,EAAM,WAAW,IAChB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAmC;IAAgB,CAAA,EAChE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,eAAe,EAAS,0BAA0B;cAAtF,CACE,kBAAC,GAAD,EAAM,WAAU,mBAAoB,CAAA,EAAA,0BAC7B;MACL;OAEN,kBAAC,MAAD;GAAI,WAAU;aACX,EAAM,MAAM,GAAG,EAAE,CAAC,KAAK,MACtB,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAS,uBAAuB,EAAK,KAAK;IACzD,WAAU;cAHZ,CAKE,kBAAC,QAAD;KAAM,WAAU;eAAkD,EAAK;KAAY,CAAA,EACnF,kBAAC,QAAD;KAAM,WAAU;eACb,EAAe,EAAK,UAAU;KAC1B,CAAA,CACA;OACN,EAXI,EAAK,GAWT,CACL;GACC,CAAA;EAEO,CAAA"}
@@ -6,13 +6,13 @@ function c({ icon: e, label: t, value: n }) {
6
6
  return /* @__PURE__ */ s("div", {
7
7
  className: "flex items-center gap-3 rounded-lg bg-bg-canvas p-3 border border-border-default",
8
8
  children: [/* @__PURE__ */ o("div", {
9
- className: "rounded-md bg-primary/10 p-2 text-primary",
9
+ className: "rounded-md bg-action-primary-bg/10 p-2 text-primary",
10
10
  children: e
11
11
  }), /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
12
12
  className: "text-2xl font-bold text-text-primary",
13
13
  children: n
14
14
  }), /* @__PURE__ */ o("p", {
15
- className: "text-xs text-muted-foreground",
15
+ className: "text-xs text-text-secondary",
16
16
  children: t
17
17
  })] })]
18
18
  });
@@ -35,7 +35,7 @@ function l({ workspaceData: l, globalData: u, isLoading: d }) {
35
35
  "!"
36
36
  ]
37
37
  }), /* @__PURE__ */ o("p", {
38
- className: "text-sm text-muted-foreground mt-1",
38
+ className: "text-sm text-text-secondary mt-1",
39
39
  children: "Here's what's happening across your workspaces today."
40
40
  })] }), /* @__PURE__ */ s("div", {
41
41
  className: "grid grid-cols-2 sm:grid-cols-4 gap-3",
@@ -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=\"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"}
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-action-primary-bg/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-text-secondary\">{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-text-secondary 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;aAAuD;GAAW,CAAA,EACjF,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;GAAG,WAAU;aAAwC;GAAU,CAAA,EAC/D,kBAAC,KAAD;GAAG,WAAU;aAA+B;GAAU,CAAA,CAClD,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;cAAmC;IAE5C,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"}
@@ -46,7 +46,7 @@ function f({ workspaceData: n, isLoading: i, navigate: a }) {
46
46
  className: "text-2xl font-bold text-text-primary",
47
47
  children: o.activeWorkflowsCount
48
48
  }), /* @__PURE__ */ s("p", {
49
- className: "text-xs text-muted-foreground",
49
+ className: "text-xs text-text-secondary",
50
50
  children: "Active"
51
51
  })]
52
52
  }), /* @__PURE__ */ c("div", {
@@ -55,14 +55,14 @@ function f({ workspaceData: n, isLoading: i, navigate: a }) {
55
55
  className: "text-2xl font-bold text-text-primary",
56
56
  children: o.archivedWorkflowsCount
57
57
  }), /* @__PURE__ */ s("p", {
58
- className: "text-xs text-muted-foreground",
58
+ className: "text-xs text-text-secondary",
59
59
  children: "Archived"
60
60
  })]
61
61
  })]
62
62
  }), o.recentRuns.length > 0 && /* @__PURE__ */ c("div", {
63
63
  className: "space-y-1.5",
64
64
  children: [/* @__PURE__ */ s("p", {
65
- className: "text-xs font-medium text-muted-foreground uppercase tracking-wider",
65
+ className: "text-xs font-medium text-text-secondary uppercase tracking-wider",
66
66
  children: "Recent Runs"
67
67
  }), o.recentRuns.slice(0, 3).map((e) => {
68
68
  let t = d[e.status] || d.RUNNING, n = t.icon;
@@ -85,7 +85,7 @@ function f({ workspaceData: n, isLoading: i, navigate: a }) {
85
85
  }) : /* @__PURE__ */ s("div", {
86
86
  className: "text-center py-4",
87
87
  children: /* @__PURE__ */ s("p", {
88
- className: "text-sm text-muted-foreground",
88
+ className: "text-sm text-text-secondary",
89
89
  children: "No workflow data available"
90
90
  })
91
91
  })
@@ -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=\"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"}
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-text-secondary\">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-text-secondary\">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-text-secondary\">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-text-secondary 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;gBAA8B;MAAU,CAAA,CACjD;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAwC,EAAM;MAA2B,CAAA,EACtF,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAAY,CAAA,CACnD;OACF;OACL,EAAM,WAAW,SAAS,KACzB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAAmE;KAE5E,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;cAA8B;IAA8B,CAAA;GACrE,CAAA;EAwCM,CAAA"}
@@ -26,7 +26,7 @@ function l({ workspaceData: l, isLoading: u, navigate: d }) {
26
26
  children: f.length === 0 ? /* @__PURE__ */ a("div", {
27
27
  className: "text-center py-4",
28
28
  children: [/* @__PURE__ */ i("p", {
29
- className: "text-sm text-muted-foreground mb-2",
29
+ className: "text-sm text-text-secondary mb-2",
30
30
  children: "No workspaces yet"
31
31
  }), /* @__PURE__ */ i(s, {
32
32
  variant: "outline",
@@ -52,7 +52,7 @@ function l({ workspaceData: l, isLoading: u, navigate: d }) {
52
52
  children: e.type
53
53
  })]
54
54
  }, e.id)), p > 5 && /* @__PURE__ */ a("p", {
55
- className: "text-xs text-muted-foreground text-center pt-1",
55
+ className: "text-xs text-text-secondary text-center pt-1",
56
56
  children: [
57
57
  "+",
58
58
  p - 5,
@@ -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=\"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
+ {"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-text-secondary 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-text-secondary 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;cAAmC;IAAqB,CAAA,EACrE,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;KAA4D;KACxD,IAAQ;KAAE;KACV;MAEF;;EAEM,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-workspaces",
3
- "version": "2026.623.1",
3
+ "version": "2026.624.1",
4
4
  "description": "Workspaces microfrontend for Burdenoff products",
5
5
  "type": "module",
6
6
  "files": [