@burdenoff/microfe-timecampus 2026.608.1 → 2026.625.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 (107) hide show
  1. package/dist/timecampus/components/ErrorBoundary.js +4 -4
  2. package/dist/timecampus/components/ErrorBoundary.js.map +1 -1
  3. package/dist/timecampus/components/LoadingSkeleton.js +8 -8
  4. package/dist/timecampus/components/LoadingSkeleton.js.map +1 -1
  5. package/dist/timecampus/components/PageLayout.js +17 -13
  6. package/dist/timecampus/components/PageLayout.js.map +1 -1
  7. package/dist/timecampus/components/StatCard.js +22 -19
  8. package/dist/timecampus/components/StatCard.js.map +1 -1
  9. package/dist/timecampus/pages/HomePage.js +183 -163
  10. package/dist/timecampus/pages/HomePage.js.map +1 -1
  11. package/dist/timecampus/pages/applets/AppletStorePage.js +17 -17
  12. package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
  13. package/dist/timecampus/pages/applets/InstalledAppletsPage.js +18 -18
  14. package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
  15. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +28 -28
  16. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
  17. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +19 -19
  18. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -1
  19. package/dist/timecampus/pages/channels/ChannelsPage.js +15 -15
  20. package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
  21. package/dist/timecampus/pages/client-portal/ClientPortalPage.js +22 -22
  22. package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
  23. package/dist/timecampus/pages/dashboard/AnalyticsPage.js +20 -20
  24. package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -1
  25. package/dist/timecampus/pages/dashboard/ReportsPage.js +20 -20
  26. package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
  27. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +18 -18
  28. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -1
  29. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +22 -22
  30. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -1
  31. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +14 -14
  32. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
  33. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +22 -22
  34. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
  35. package/dist/timecampus/pages/focus-score/FocusScorePage.js +27 -27
  36. package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
  37. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +19 -19
  38. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -1
  39. package/dist/timecampus/pages/geofencing/GeofencingPage.js +16 -16
  40. package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
  41. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +18 -18
  42. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -1
  43. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +16 -16
  44. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
  45. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +21 -21
  46. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -1
  47. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +22 -22
  48. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
  49. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +18 -18
  50. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
  51. package/dist/timecampus/pages/meetings/MeetingCreatePage.js +16 -16
  52. package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
  53. package/dist/timecampus/pages/meetings/MeetingDetailPage.js +29 -29
  54. package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
  55. package/dist/timecampus/pages/meetings/MeetingsPage.js +20 -20
  56. package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
  57. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +23 -23
  58. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
  59. package/dist/timecampus/pages/pomodoro/PomodoroPage.js +23 -23
  60. package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
  61. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +30 -30
  62. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -1
  63. package/dist/timecampus/pages/projects/ProjectCreatePage.js +19 -19
  64. package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
  65. package/dist/timecampus/pages/projects/ProjectDetailPage.js +23 -23
  66. package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
  67. package/dist/timecampus/pages/projects/ProjectsPage.js +20 -20
  68. package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
  69. package/dist/timecampus/pages/projects/TasksPage.js +15 -15
  70. package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
  71. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +25 -25
  72. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
  73. package/dist/timecampus/pages/team/TeamAnalyticsPage.js +19 -19
  74. package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
  75. package/dist/timecampus/pages/team/TeamMembersPage.js +21 -21
  76. package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
  77. package/dist/timecampus/pages/team/TeamPage.js +19 -19
  78. package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
  79. package/dist/timecampus/pages/team-activity/TeamActivityPage.js +21 -21
  80. package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
  81. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +20 -20
  82. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -1
  83. package/dist/timecampus/pages/templates/TemplateApplicationPage.js +16 -16
  84. package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -1
  85. package/dist/timecampus/pages/templates/TemplateDetailPage.js +21 -21
  86. package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
  87. package/dist/timecampus/pages/templates/TemplatesPage.js +16 -16
  88. package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
  89. package/dist/timecampus/pages/time/TimeEntriesPage.js +25 -25
  90. package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
  91. package/dist/timecampus/pages/time/TimeTrackingPage.js +24 -24
  92. package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
  93. package/dist/timecampus/pages/time/TimerPage.js +20 -20
  94. package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
  95. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +27 -27
  96. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
  97. package/dist/timecampus/pages/widgets/WidgetDetailPage.js +20 -20
  98. package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
  99. package/dist/timecampus/pages/widgets/WidgetsPage.js +18 -18
  100. package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
  101. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +23 -23
  102. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
  103. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +19 -19
  104. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -1
  105. package/dist/timecampus/pages/workflows/WorkflowsPage.js +17 -17
  106. package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
  107. package/package.json +2 -2
@@ -1,48 +1,48 @@
1
1
  import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
2
  import { getStatusColor as t } from "../../utils/helpers.js";
3
- import { PageLayout as n } from "../../components/PageLayout.js";
4
- import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
5
- import { useListChannelConfigsQuery as i, useListChannelStatusesQuery as a } from "../../../generated/wspace-operations.js";
3
+ import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
+ import { useListChannelConfigsQuery as r, useListChannelStatusesQuery as i } from "../../../generated/wspace-operations.js";
5
+ import { PageLayout as a } from "../../components/PageLayout.js";
6
6
  import { Wifi as o, WifiOff as s } from "lucide-react";
7
7
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
8
  //#region src/timecampus/pages/channels/ChannelsPage.tsx
9
9
  function u() {
10
- let { workspaceId: u = "" } = e(), { data: d, loading: f, error: p } = i(), { data: m } = a(), h = d?.channelConfigs ?? [], g = m?.channelStatuses ?? [], _ = new Map(g.map((e) => [e.channelId, e]));
11
- return f ? /* @__PURE__ */ c(n, {
10
+ let { workspaceId: u = "" } = e(), { data: d, loading: f, error: p } = r(), { data: m } = i(), h = d?.channelConfigs ?? [], g = m?.channelStatuses ?? [], _ = new Map(g.map((e) => [e.channelId, e]));
11
+ return f ? /* @__PURE__ */ c(a, {
12
12
  title: "Channels",
13
13
  description: "Manage time tracking channels and integrations",
14
- children: /* @__PURE__ */ c(r, {
14
+ children: /* @__PURE__ */ c(n, {
15
15
  variant: "card",
16
16
  count: 6
17
17
  })
18
- }) : p ? /* @__PURE__ */ c(n, {
18
+ }) : p ? /* @__PURE__ */ c(a, {
19
19
  title: "Channels",
20
20
  description: "Manage time tracking channels and integrations",
21
21
  children: /* @__PURE__ */ c("div", {
22
- className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
22
+ className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
23
23
  children: "Failed to load channels data. Please try again later."
24
24
  })
25
- }) : /* @__PURE__ */ c(n, {
25
+ }) : /* @__PURE__ */ c(a, {
26
26
  title: "Channels",
27
27
  description: "Manage time tracking channels and integrations",
28
28
  children: /* @__PURE__ */ c("div", {
29
29
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
30
30
  children: h.length === 0 ? /* @__PURE__ */ c("div", {
31
- className: "col-span-full p-8 text-center text-sm text-muted-foreground",
31
+ className: "col-span-full p-8 text-center text-sm text-text-secondary",
32
32
  children: "No channels configured yet. Set up your first tracking channel."
33
33
  }) : h.map((e) => {
34
34
  let n = _.get(e.id), r = e.status === "active", i = e.lastSync ? new Date(e.lastSync).toLocaleString() : "Never";
35
35
  return /* @__PURE__ */ l("div", {
36
- className: "rounded-xl border border-border bg-card p-5 transition-colors hover:bg-muted/50 cursor-pointer",
36
+ className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer",
37
37
  children: [/* @__PURE__ */ l("div", {
38
38
  className: "flex items-start justify-between",
39
39
  children: [/* @__PURE__ */ l("div", {
40
40
  className: "flex items-center gap-3",
41
- children: [r ? /* @__PURE__ */ c(o, { className: "h-5 w-5 text-emerald-500" }) : /* @__PURE__ */ c(s, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
42
- className: "text-sm font-semibold text-foreground",
41
+ children: [r ? /* @__PURE__ */ c(o, { className: "h-5 w-5 text-status-success-text" }) : /* @__PURE__ */ c(s, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
42
+ className: "text-sm font-semibold text-text-primary",
43
43
  children: e.name
44
44
  }), /* @__PURE__ */ c("p", {
45
- className: "text-xs text-muted-foreground",
45
+ className: "text-xs text-text-secondary",
46
46
  children: e.type
47
47
  })] })]
48
48
  }), /* @__PURE__ */ c("span", {
@@ -50,7 +50,7 @@ function u() {
50
50
  children: e.status
51
51
  })]
52
52
  }), /* @__PURE__ */ l("div", {
53
- className: "mt-3 flex items-center justify-between text-xs text-muted-foreground",
53
+ className: "mt-3 flex items-center justify-between text-xs text-text-secondary",
54
54
  children: [/* @__PURE__ */ c("span", { children: n?.isHealthy ? "Healthy" : "Unhealthy" }), /* @__PURE__ */ l("span", { children: ["Sync: ", i] })]
55
55
  })]
56
56
  }, e.id);
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelsPage.js","names":[],"sources":["../../../../src/timecampus/pages/channels/ChannelsPage.tsx"],"sourcesContent":["import { Radio, Settings, Wifi, WifiOff } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { getStatusColor } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListChannelConfigsQuery,\n useListChannelStatusesQuery,\n type ChannelConfigFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function ChannelsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: configsData,\n loading: configsLoading,\n error: configsError,\n } = useListChannelConfigsQuery();\n const { data: statusesData } = useListChannelStatusesQuery();\n\n const channels = configsData?.channelConfigs ?? [];\n const statuses = statusesData?.channelStatuses ?? [];\n\n type ChannelStatusItem = {\n channelId: string;\n name: string;\n type: string;\n status: string;\n isHealthy: boolean;\n lastSync?: string | null;\n };\n\n // Build a lookup map for status info\n const statusMap = new Map<string, ChannelStatusItem>(\n statuses.map((s: ChannelStatusItem) => [s.channelId, s]),\n );\n\n if (configsLoading) {\n return (\n <PageLayout\n title=\"Channels\"\n description=\"Manage time tracking channels and integrations\"\n >\n <LoadingSkeleton variant=\"card\" count={6} />\n </PageLayout>\n );\n }\n\n if (configsError) {\n return (\n <PageLayout\n title=\"Channels\"\n description=\"Manage time tracking channels and integrations\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load channels data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Channels\"\n description=\"Manage time tracking channels and integrations\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {channels.length === 0 ? (\n <div className=\"col-span-full p-8 text-center text-sm text-muted-foreground\">\n No channels configured yet. Set up your first tracking channel.\n </div>\n ) : (\n channels.map((channel: ChannelConfigFieldsFragment) => {\n const statusInfo = statusMap.get(channel.id);\n const isActive = channel.status === \"active\";\n const lastSync = channel.lastSync\n ? new Date(channel.lastSync).toLocaleString()\n : \"Never\";\n\n return (\n <div\n key={channel.id}\n className=\"rounded-xl border border-border bg-card p-5 transition-colors hover:bg-muted/50 cursor-pointer\"\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n {isActive ? (\n <Wifi className=\"h-5 w-5 text-emerald-500\" />\n ) : (\n <WifiOff className=\"h-5 w-5 text-muted-foreground\" />\n )}\n <div>\n <p className=\"text-sm font-semibold text-foreground\">\n {channel.name}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {channel.type}\n </p>\n </div>\n </div>\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(channel.status)}`}\n >\n {channel.status}\n </span>\n </div>\n <div className=\"mt-3 flex items-center justify-between text-xs text-muted-foreground\">\n <span>{statusInfo?.isHealthy ? \"Healthy\" : \"Unhealthy\"}</span>\n <span>Sync: {lastSync}</span>\n </div>\n </div>\n );\n })\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAWA,SAAgB,IAAe;CAC7B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,GAA4B,EAC1B,EAAE,MAAM,MAAiB,GAA6B,EAEtD,IAAW,GAAa,kBAAkB,EAAE,EAC5C,IAAW,GAAc,mBAAmB,EAAE,EAY9C,IAAY,IAAI,IACpB,EAAS,KAAK,MAAyB,CAAC,EAAE,WAAW,EAAE,CAAC,CACzD;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAS,WAAW,IACnB,kBAAC,OAAD;IAAK,WAAU;cAA8D;IAEvE,CAAA,GAEN,EAAS,KAAK,MAAyC;IACrD,IAAM,IAAa,EAAU,IAAI,EAAQ,GAAG,EACtC,IAAW,EAAQ,WAAW,UAC9B,IAAW,EAAQ,WACrB,IAAI,KAAK,EAAQ,SAAS,CAAC,gBAAgB,GAC3C;AAEJ,WACE,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACG,IACC,kBAAC,GAAD,EAAM,WAAU,4BAA6B,CAAA,GAE7C,kBAAC,GAAD,EAAS,WAAU,iCAAkC,CAAA,EAEvD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAQ;QACP,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAQ;QACP,CAAA,CACA,EAAA,CAAA,CACF;UACN,kBAAC,QAAD;OACE,WAAW,4DAA4D,EAAe,EAAQ,OAAO;iBAEpG,EAAQ;OACJ,CAAA,CACH;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD,EAAA,UAAO,GAAY,YAAY,YAAY,aAAmB,CAAA,EAC9D,kBAAC,QAAD,EAAA,UAAA,CAAM,UAAO,EAAgB,EAAA,CAAA,CACzB;QACF;OA7BC,EAAQ,GA6BT;KAER;GAEA,CAAA;EACK,CAAA"}
1
+ {"version":3,"file":"ChannelsPage.js","names":[],"sources":["../../../../src/timecampus/pages/channels/ChannelsPage.tsx"],"sourcesContent":["import { Radio, Settings, Wifi, WifiOff } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { getStatusColor } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListChannelConfigsQuery,\n useListChannelStatusesQuery,\n type ChannelConfigFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function ChannelsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: configsData,\n loading: configsLoading,\n error: configsError,\n } = useListChannelConfigsQuery();\n const { data: statusesData } = useListChannelStatusesQuery();\n\n const channels = configsData?.channelConfigs ?? [];\n const statuses = statusesData?.channelStatuses ?? [];\n\n type ChannelStatusItem = {\n channelId: string;\n name: string;\n type: string;\n status: string;\n isHealthy: boolean;\n lastSync?: string | null;\n };\n\n // Build a lookup map for status info\n const statusMap = new Map<string, ChannelStatusItem>(\n statuses.map((s: ChannelStatusItem) => [s.channelId, s]),\n );\n\n if (configsLoading) {\n return (\n <PageLayout\n title=\"Channels\"\n description=\"Manage time tracking channels and integrations\"\n >\n <LoadingSkeleton variant=\"card\" count={6} />\n </PageLayout>\n );\n }\n\n if (configsError) {\n return (\n <PageLayout\n title=\"Channels\"\n description=\"Manage time tracking channels and integrations\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load channels data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Channels\"\n description=\"Manage time tracking channels and integrations\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {channels.length === 0 ? (\n <div className=\"col-span-full p-8 text-center text-sm text-text-secondary\">\n No channels configured yet. Set up your first tracking channel.\n </div>\n ) : (\n channels.map((channel: ChannelConfigFieldsFragment) => {\n const statusInfo = statusMap.get(channel.id);\n const isActive = channel.status === \"active\";\n const lastSync = channel.lastSync\n ? new Date(channel.lastSync).toLocaleString()\n : \"Never\";\n\n return (\n <div\n key={channel.id}\n className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer\"\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n {isActive ? (\n <Wifi className=\"h-5 w-5 text-status-success-text\" />\n ) : (\n <WifiOff className=\"h-5 w-5 text-text-secondary\" />\n )}\n <div>\n <p className=\"text-sm font-semibold text-text-primary\">\n {channel.name}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {channel.type}\n </p>\n </div>\n </div>\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(channel.status)}`}\n >\n {channel.status}\n </span>\n </div>\n <div className=\"mt-3 flex items-center justify-between text-xs text-text-secondary\">\n <span>{statusInfo?.isHealthy ? \"Healthy\" : \"Unhealthy\"}</span>\n <span>Sync: {lastSync}</span>\n </div>\n </div>\n );\n })\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAWA,SAAgB,IAAe;CAC7B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,GAA4B,EAC1B,EAAE,MAAM,MAAiB,GAA6B,EAEtD,IAAW,GAAa,kBAAkB,EAAE,EAC5C,IAAW,GAAc,mBAAmB,EAAE,EAY9C,IAAY,IAAI,IACpB,EAAS,KAAK,MAAyB,CAAC,EAAE,WAAW,EAAE,CAAC,CACzD;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAS,WAAW,IACnB,kBAAC,OAAD;IAAK,WAAU;cAA4D;IAErE,CAAA,GAEN,EAAS,KAAK,MAAyC;IACrD,IAAM,IAAa,EAAU,IAAI,EAAQ,GAAG,EACtC,IAAW,EAAQ,WAAW,UAC9B,IAAW,EAAQ,WACrB,IAAI,KAAK,EAAQ,SAAS,CAAC,gBAAgB,GAC3C;AAEJ,WACE,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACG,IACC,kBAAC,GAAD,EAAM,WAAU,oCAAqC,CAAA,GAErD,kBAAC,GAAD,EAAS,WAAU,+BAAgC,CAAA,EAErD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAQ;QACP,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAQ;QACP,CAAA,CACA,EAAA,CAAA,CACF;UACN,kBAAC,QAAD;OACE,WAAW,4DAA4D,EAAe,EAAQ,OAAO;iBAEpG,EAAQ;OACJ,CAAA,CACH;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD,EAAA,UAAO,GAAY,YAAY,YAAY,aAAmB,CAAA,EAC9D,kBAAC,QAAD,EAAA,UAAA,CAAM,UAAO,EAAgB,EAAA,CAAA,CACzB;QACF;OA7BC,EAAQ,GA6BT;KAER;GAEA,CAAA;EACK,CAAA"}
@@ -1,54 +1,54 @@
1
1
  import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
2
  import { getInitials as t, getStatusColor as n } from "../../utils/helpers.js";
3
- import { PageLayout as r } from "../../components/PageLayout.js";
4
- import { StatCard as i } from "../../components/StatCard.js";
5
- import { LoadingSkeleton as a } from "../../components/LoadingSkeleton.js";
6
- import { useGetClientPortalStatsQuery as o, useListClientPortalConfigsQuery as s } from "../../../generated/wspace-operations.js";
3
+ import { StatCard as r } from "../../components/StatCard.js";
4
+ import { LoadingSkeleton as i } from "../../components/LoadingSkeleton.js";
5
+ import { useGetClientPortalStatsQuery as a, useListClientPortalConfigsQuery as o } from "../../../generated/wspace-operations.js";
6
+ import { PageLayout as s } from "../../components/PageLayout.js";
7
7
  import { Building2 as c, DollarSign as l, FolderOpen as u, Plus as d } from "lucide-react";
8
8
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
9
9
  //#region src/timecampus/pages/client-portal/ClientPortalPage.tsx
10
10
  function m() {
11
- let { workspaceId: m = "" } = e(), { data: h, loading: g, error: _ } = s(), { data: v, loading: y } = o(), b = h?.clientPortalConfigs?.items ?? [], x = v?.clientPortalStats;
12
- return g ? /* @__PURE__ */ f(r, {
11
+ let { workspaceId: m = "" } = e(), { data: h, loading: g, error: _ } = o(), { data: v, loading: y } = a(), b = h?.clientPortalConfigs?.items ?? [], x = v?.clientPortalStats;
12
+ return g ? /* @__PURE__ */ f(s, {
13
13
  title: "Client Portal",
14
14
  description: "Manage clients and their projects",
15
- children: /* @__PURE__ */ f(a, {
15
+ children: /* @__PURE__ */ f(i, {
16
16
  variant: "list",
17
17
  count: 4
18
18
  })
19
- }) : _ ? /* @__PURE__ */ f(r, {
19
+ }) : _ ? /* @__PURE__ */ f(s, {
20
20
  title: "Client Portal",
21
21
  description: "Manage clients and their projects",
22
22
  children: /* @__PURE__ */ f("div", {
23
- className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
23
+ className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
24
24
  children: "Failed to load client portal data. Please try again later."
25
25
  })
26
- }) : /* @__PURE__ */ p(r, {
26
+ }) : /* @__PURE__ */ p(s, {
27
27
  title: "Client Portal",
28
28
  description: "Manage clients and their projects",
29
29
  actions: /* @__PURE__ */ p("button", {
30
- className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
30
+ className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
31
31
  children: [/* @__PURE__ */ f(d, { className: "h-4 w-4" }), "Add Client"]
32
32
  }),
33
33
  children: [/* @__PURE__ */ p("div", {
34
34
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
35
35
  children: [
36
- /* @__PURE__ */ f(i, {
36
+ /* @__PURE__ */ f(r, {
37
37
  title: "Active Clients",
38
38
  value: String(x?.activeClients ?? 0),
39
39
  icon: /* @__PURE__ */ f(c, { className: "h-5 w-5" })
40
40
  }),
41
- /* @__PURE__ */ f(i, {
41
+ /* @__PURE__ */ f(r, {
42
42
  title: "Total Projects",
43
43
  value: String(x?.totalProjectsShared ?? 0),
44
44
  icon: /* @__PURE__ */ f(u, { className: "h-5 w-5" })
45
45
  }),
46
- /* @__PURE__ */ f(i, {
46
+ /* @__PURE__ */ f(r, {
47
47
  title: "Total Clients",
48
48
  value: String(x?.totalClients ?? 0),
49
49
  icon: /* @__PURE__ */ f(l, { className: "h-5 w-5" })
50
50
  }),
51
- /* @__PURE__ */ f(i, {
51
+ /* @__PURE__ */ f(r, {
52
52
  title: "Active",
53
53
  value: String(x?.activeClients ?? 0),
54
54
  trend: {
@@ -58,26 +58,26 @@ function m() {
58
58
  })
59
59
  ]
60
60
  }), /* @__PURE__ */ f("div", {
61
- className: "rounded-xl border border-border bg-card",
61
+ className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop",
62
62
  children: /* @__PURE__ */ f("div", {
63
63
  className: "divide-y divide-border",
64
64
  children: b.length === 0 ? /* @__PURE__ */ f("div", {
65
- className: "p-8 text-center text-sm text-muted-foreground",
65
+ className: "p-8 text-center text-sm text-text-secondary",
66
66
  children: "No clients configured yet. Add your first client to get started."
67
67
  }) : b.map((e) => {
68
68
  let r = e.projects.reduce((e, t) => e + t.trackedHours, 0);
69
69
  return /* @__PURE__ */ p("div", {
70
- className: "flex items-center justify-between p-4 hover:bg-muted/50 transition-colors cursor-pointer",
70
+ className: "flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors cursor-pointer",
71
71
  children: [/* @__PURE__ */ p("div", {
72
72
  className: "flex items-center gap-3",
73
73
  children: [/* @__PURE__ */ f("div", {
74
- className: "flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10 text-sm font-medium text-primary",
74
+ className: "flex h-10 w-10 items-center justify-center rounded-lg bg-action-primary-bg/10 text-sm font-medium text-primary",
75
75
  children: t(e.clientName)
76
76
  }), /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
77
- className: "text-sm font-medium text-foreground",
77
+ className: "text-sm font-medium text-text-primary",
78
78
  children: e.clientName
79
79
  }), /* @__PURE__ */ p("p", {
80
- className: "text-xs text-muted-foreground",
80
+ className: "text-xs text-text-secondary",
81
81
  children: [
82
82
  e.projects.length,
83
83
  " projects ·",
@@ -89,7 +89,7 @@ function m() {
89
89
  }), /* @__PURE__ */ p("div", {
90
90
  className: "flex items-center gap-4",
91
91
  children: [e.contactEmail && /* @__PURE__ */ f("span", {
92
- className: "text-xs text-muted-foreground",
92
+ className: "text-xs text-text-secondary",
93
93
  children: e.contactEmail
94
94
  }), /* @__PURE__ */ f("span", {
95
95
  className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${n(e.isActive ? "active" : "inactive")}`,
@@ -1 +1 @@
1
- {"version":3,"file":"ClientPortalPage.js","names":[],"sources":["../../../../src/timecampus/pages/client-portal/ClientPortalPage.tsx"],"sourcesContent":["import { Building2, Plus, DollarSign, FolderOpen } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport {\n getStatusColor,\n formatCurrency,\n getInitials,\n} from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListClientPortalConfigsQuery,\n useGetClientPortalStatsQuery,\n type ClientPortalFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function ClientPortalPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: configsData,\n loading: configsLoading,\n error: configsError,\n } = useListClientPortalConfigsQuery();\n const { data: statsData, loading: statsLoading } =\n useGetClientPortalStatsQuery();\n\n const clients = configsData?.clientPortalConfigs?.items ?? [];\n const stats = statsData?.clientPortalStats;\n\n if (configsLoading) {\n return (\n <PageLayout\n title=\"Client Portal\"\n description=\"Manage clients and their projects\"\n >\n <LoadingSkeleton variant=\"list\" count={4} />\n </PageLayout>\n );\n }\n\n if (configsError) {\n return (\n <PageLayout\n title=\"Client Portal\"\n description=\"Manage clients and their projects\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load client portal data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Client Portal\"\n description=\"Manage clients and their projects\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\">\n <Plus className=\"h-4 w-4\" />\n Add Client\n </button>\n }\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Active Clients\"\n value={String(stats?.activeClients ?? 0)}\n icon={<Building2 className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Total Projects\"\n value={String(stats?.totalProjectsShared ?? 0)}\n icon={<FolderOpen className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Total Clients\"\n value={String(stats?.totalClients ?? 0)}\n icon={<DollarSign className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Active\"\n value={String(stats?.activeClients ?? 0)}\n trend={{ value: 0, label: \"clients\" }}\n />\n </div>\n\n <div className=\"rounded-xl border border-border bg-card\">\n <div className=\"divide-y divide-border\">\n {clients.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-muted-foreground\">\n No clients configured yet. Add your first client to get started.\n </div>\n ) : (\n clients.map((client: ClientPortalFieldsFragment) => {\n const totalTrackedHours = client.projects.reduce(\n (sum: number, p: { trackedHours: number }) =>\n sum + p.trackedHours,\n 0,\n );\n return (\n <div\n key={client.id}\n className=\"flex items-center justify-between p-4 hover:bg-muted/50 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10 text-sm font-medium text-primary\">\n {getInitials(client.clientName)}\n </div>\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n {client.clientName}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {client.projects.length} projects &middot;{\" \"}\n {totalTrackedHours}h tracked\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-4\">\n {client.contactEmail && (\n <span className=\"text-xs text-muted-foreground\">\n {client.contactEmail}\n </span>\n )}\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(client.isActive ? \"active\" : \"inactive\")}`}\n >\n {client.isActive ? \"active\" : \"inactive\"}\n </span>\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,IAAmB;CACjC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,GAAiC,EAC/B,EAAE,MAAM,GAAW,SAAS,MAChC,GAA8B,EAE1B,IAAU,GAAa,qBAAqB,SAAS,EAAE,EACvD,IAAQ,GAAW;AA0BzB,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,aAErB;;YAPb,CAUE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,iBAAiB,EAAE;KACxC,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;KACvC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,uBAAuB,EAAE;KAC9C,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,gBAAgB,EAAE;KACvC,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,iBAAiB,EAAE;KACxC,OAAO;MAAE,OAAO;MAAG,OAAO;MAAW;KACrC,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAQ,WAAW,IAClB,kBAAC,OAAD;KAAK,WAAU;eAAgD;KAEzD,CAAA,GAEN,EAAQ,KAAK,MAAuC;KAClD,IAAM,IAAoB,EAAO,SAAS,QACvC,GAAa,MACZ,IAAM,EAAE,cACV,EACD;AACD,YACE,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAY,EAAO,WAAW;QAC3B,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAO;QACN,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAO,SAAS;SAAO;SAAmB;SAC1C;SAAkB;SACjB;UACA,EAAA,CAAA,CACF;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACG,EAAO,gBACN,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAO;QACH,CAAA,EAET,kBAAC,QAAD;QACE,WAAW,4DAA4D,EAAe,EAAO,WAAW,WAAW,WAAW;kBAE7H,EAAO,WAAW,WAAW;QACzB,CAAA,CACH;SACF;QA7BC,EAAO,GA6BR;MAER;IAEA,CAAA;GACF,CAAA,CACK"}
1
+ {"version":3,"file":"ClientPortalPage.js","names":[],"sources":["../../../../src/timecampus/pages/client-portal/ClientPortalPage.tsx"],"sourcesContent":["import { Building2, Plus, DollarSign, FolderOpen } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport {\n getStatusColor,\n formatCurrency,\n getInitials,\n} from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListClientPortalConfigsQuery,\n useGetClientPortalStatsQuery,\n type ClientPortalFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function ClientPortalPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: configsData,\n loading: configsLoading,\n error: configsError,\n } = useListClientPortalConfigsQuery();\n const { data: statsData, loading: statsLoading } =\n useGetClientPortalStatsQuery();\n\n const clients = configsData?.clientPortalConfigs?.items ?? [];\n const stats = statsData?.clientPortalStats;\n\n if (configsLoading) {\n return (\n <PageLayout\n title=\"Client Portal\"\n description=\"Manage clients and their projects\"\n >\n <LoadingSkeleton variant=\"list\" count={4} />\n </PageLayout>\n );\n }\n\n if (configsError) {\n return (\n <PageLayout\n title=\"Client Portal\"\n description=\"Manage clients and their projects\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load client portal data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Client Portal\"\n description=\"Manage clients and their projects\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n <Plus className=\"h-4 w-4\" />\n Add Client\n </button>\n }\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Active Clients\"\n value={String(stats?.activeClients ?? 0)}\n icon={<Building2 className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Total Projects\"\n value={String(stats?.totalProjectsShared ?? 0)}\n icon={<FolderOpen className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Total Clients\"\n value={String(stats?.totalClients ?? 0)}\n icon={<DollarSign className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Active\"\n value={String(stats?.activeClients ?? 0)}\n trend={{ value: 0, label: \"clients\" }}\n />\n </div>\n\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop\">\n <div className=\"divide-y divide-border\">\n {clients.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-text-secondary\">\n No clients configured yet. Add your first client to get started.\n </div>\n ) : (\n clients.map((client: ClientPortalFieldsFragment) => {\n const totalTrackedHours = client.projects.reduce(\n (sum: number, p: { trackedHours: number }) =>\n sum + p.trackedHours,\n 0,\n );\n return (\n <div\n key={client.id}\n className=\"flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-action-primary-bg/10 text-sm font-medium text-primary\">\n {getInitials(client.clientName)}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {client.clientName}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {client.projects.length} projects &middot;{\" \"}\n {totalTrackedHours}h tracked\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-4\">\n {client.contactEmail && (\n <span className=\"text-xs text-text-secondary\">\n {client.contactEmail}\n </span>\n )}\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(client.isActive ? \"active\" : \"inactive\")}`}\n >\n {client.isActive ? \"active\" : \"inactive\"}\n </span>\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,IAAmB;CACjC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,GAAiC,EAC/B,EAAE,MAAM,GAAW,SAAS,MAChC,GAA8B,EAE1B,IAAU,GAAa,qBAAqB,SAAS,EAAE,EACvD,IAAQ,GAAW;AA0BzB,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,aAErB;;YAPb,CAUE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,iBAAiB,EAAE;KACxC,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;KACvC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,uBAAuB,EAAE;KAC9C,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,gBAAgB,EAAE;KACvC,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,iBAAiB,EAAE;KACxC,OAAO;MAAE,OAAO;MAAG,OAAO;MAAW;KACrC,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAQ,WAAW,IAClB,kBAAC,OAAD;KAAK,WAAU;eAA8C;KAEvD,CAAA,GAEN,EAAQ,KAAK,MAAuC;KAClD,IAAM,IAAoB,EAAO,SAAS,QACvC,GAAa,MACZ,IAAM,EAAE,cACV,EACD;AACD,YACE,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAY,EAAO,WAAW;QAC3B,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAO;QACN,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAO,SAAS;SAAO;SAAmB;SAC1C;SAAkB;SACjB;UACA,EAAA,CAAA,CACF;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACG,EAAO,gBACN,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAO;QACH,CAAA,EAET,kBAAC,QAAD;QACE,WAAW,4DAA4D,EAAe,EAAO,WAAW,WAAW,WAAW;kBAE7H,EAAO,WAAW,WAAW;QACzB,CAAA,CACH;SACF;QA7BC,EAAO,GA6BR;MAER;IAEA,CAAA;GACF,CAAA,CACK"}
@@ -1,50 +1,50 @@
1
1
  import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
- import { PageLayout as t } from "../../components/PageLayout.js";
3
- import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
- import { useGetFocusScoreSummaryQuery as r, useGetTimeEntryStatsQuery as i, useGetWorkPatternSummaryQuery as a } from "../../../generated/wspace-operations.js";
2
+ import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
3
+ import { useGetFocusScoreSummaryQuery as n, useGetTimeEntryStatsQuery as r, useGetWorkPatternSummaryQuery as i } from "../../../generated/wspace-operations.js";
4
+ import { PageLayout as a } from "../../components/PageLayout.js";
5
5
  import { BarChart3 as o } from "lucide-react";
6
6
  import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
7
  //#region src/timecampus/pages/dashboard/AnalyticsPage.tsx
8
8
  function l() {
9
- let { workspaceId: l = "" } = e(), { data: u, loading: d, error: f } = i({ skip: !l }), { data: p, loading: m } = r({ skip: !l }), { data: h, loading: g } = a({ skip: !l }), _ = u?.timeEntryStats, v = p?.focusScoreSummary, y = h?.workPatternSummary;
10
- return d || m || g ? /* @__PURE__ */ s(t, {
9
+ let { workspaceId: l = "" } = e(), { data: u, loading: d, error: f } = r({ skip: !l }), { data: p, loading: m } = n({ skip: !l }), { data: h, loading: g } = i({ skip: !l }), _ = u?.timeEntryStats, v = p?.focusScoreSummary, y = h?.workPatternSummary;
10
+ return d || m || g ? /* @__PURE__ */ s(a, {
11
11
  title: "Analytics",
12
12
  description: "Insights into your time tracking and productivity",
13
- children: /* @__PURE__ */ s(n, {
13
+ children: /* @__PURE__ */ s(t, {
14
14
  variant: "card",
15
15
  count: 4
16
16
  })
17
- }) : f ? /* @__PURE__ */ s(t, {
17
+ }) : f ? /* @__PURE__ */ s(a, {
18
18
  title: "Analytics",
19
19
  description: "Insights into your time tracking and productivity",
20
20
  children: /* @__PURE__ */ s("div", {
21
- className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
21
+ className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
22
22
  children: "Failed to load analytics. Please try again later."
23
23
  })
24
- }) : /* @__PURE__ */ s(t, {
24
+ }) : /* @__PURE__ */ s(a, {
25
25
  title: "Analytics",
26
26
  description: "Insights into your time tracking and productivity",
27
27
  children: /* @__PURE__ */ c("div", {
28
28
  className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
29
29
  children: [/* @__PURE__ */ c("div", {
30
- className: "rounded-xl border border-border bg-card p-6",
30
+ className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6",
31
31
  children: [/* @__PURE__ */ c("div", {
32
32
  className: "mb-4 flex items-center gap-2",
33
33
  children: [/* @__PURE__ */ s(o, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ s("h3", {
34
- className: "text-sm font-semibold text-foreground",
34
+ className: "text-sm font-semibold text-text-primary",
35
35
  children: "Productivity Trends"
36
36
  })]
37
37
  }), /* @__PURE__ */ s("div", {
38
- className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
38
+ className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle",
39
39
  children: /* @__PURE__ */ c("div", {
40
40
  className: "text-center",
41
41
  children: [
42
42
  /* @__PURE__ */ s("p", {
43
- className: "text-sm text-muted-foreground",
43
+ className: "text-sm text-text-secondary",
44
44
  children: v ? `Focus Score: ${Math.round(v.averageScore)}/100 (${v.trend ?? "stable"})` : "No focus score data"
45
45
  }),
46
46
  y && /* @__PURE__ */ c("p", {
47
- className: "mt-1 text-xs text-muted-foreground",
47
+ className: "mt-1 text-xs text-text-secondary",
48
48
  children: [
49
49
  y.averageFocusHours.toFixed(1),
50
50
  "h avg focus ·",
@@ -54,29 +54,29 @@ function l() {
54
54
  ]
55
55
  }),
56
56
  v?.improvementArea && /* @__PURE__ */ c("p", {
57
- className: "mt-1 text-xs text-muted-foreground",
57
+ className: "mt-1 text-xs text-text-secondary",
58
58
  children: ["Improve: ", v.improvementArea]
59
59
  })
60
60
  ]
61
61
  })
62
62
  })]
63
63
  }), /* @__PURE__ */ c("div", {
64
- className: "rounded-xl border border-border bg-card p-6",
64
+ className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6",
65
65
  children: [/* @__PURE__ */ c("div", {
66
66
  className: "mb-4 flex items-center gap-2",
67
67
  children: [/* @__PURE__ */ s(o, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ s("h3", {
68
- className: "text-sm font-semibold text-foreground",
68
+ className: "text-sm font-semibold text-text-primary",
69
69
  children: "Time Distribution"
70
70
  })]
71
71
  }), /* @__PURE__ */ s("div", {
72
- className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
72
+ className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle",
73
73
  children: /* @__PURE__ */ c("div", {
74
74
  className: "text-center",
75
75
  children: [/* @__PURE__ */ s("p", {
76
- className: "text-sm text-muted-foreground",
76
+ className: "text-sm text-text-secondary",
77
77
  children: _ ? `${Math.round(_.totalHours)}h total · ${Math.round(_.billableHours)}h billable · ${_.totalEntries} entries` : "No time entry data"
78
78
  }), _ && _.activeTimers > 0 && /* @__PURE__ */ c("p", {
79
- className: "mt-1 text-xs text-muted-foreground",
79
+ className: "mt-1 text-xs text-text-secondary",
80
80
  children: [_.activeTimers, " timer(s) running"]
81
81
  })]
82
82
  })
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/dashboard/AnalyticsPage.tsx"],"sourcesContent":["import { BarChart3 } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useGetFocusScoreSummaryQuery,\n useGetWorkPatternSummaryQuery,\n} from \"@/generated/wspace-operations\";\n\nexport function AnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetTimeEntryStatsQuery({\n skip: !workspaceId,\n });\n\n const { data: focusData, loading: focusLoading } =\n useGetFocusScoreSummaryQuery({\n skip: !workspaceId,\n });\n\n const { data: patternData, loading: patternLoading } =\n useGetWorkPatternSummaryQuery({\n skip: !workspaceId,\n });\n\n const stats = statsData?.timeEntryStats;\n const focus = focusData?.focusScoreSummary;\n const pattern = patternData?.workPatternSummary;\n\n if (statsLoading || focusLoading || patternLoading) {\n return (\n <PageLayout\n title=\"Analytics\"\n description=\"Insights into your time tracking and productivity\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (statsError) {\n return (\n <PageLayout\n title=\"Analytics\"\n description=\"Insights into your time tracking and productivity\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load analytics. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Analytics\"\n description=\"Insights into your time tracking and productivity\"\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-primary\" />\n <h3 className=\"text-sm font-semibold text-foreground\">\n Productivity Trends\n </h3>\n </div>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border\">\n <div className=\"text-center\">\n <p className=\"text-sm text-muted-foreground\">\n {focus\n ? `Focus Score: ${Math.round(focus.averageScore)}/100 (${focus.trend ?? \"stable\"})`\n : \"No focus score data\"}\n </p>\n {pattern && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {pattern.averageFocusHours.toFixed(1)}h avg focus ·{\" \"}\n {pattern.averageMeetingHours.toFixed(1)}h avg meetings\n </p>\n )}\n {focus?.improvementArea && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Improve: {focus.improvementArea}\n </p>\n )}\n </div>\n </div>\n </div>\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-primary\" />\n <h3 className=\"text-sm font-semibold text-foreground\">\n Time Distribution\n </h3>\n </div>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border\">\n <div className=\"text-center\">\n <p className=\"text-sm text-muted-foreground\">\n {stats\n ? `${Math.round(stats.totalHours)}h total · ${Math.round(stats.billableHours)}h billable · ${stats.totalEntries} entries`\n : \"No time entry data\"}\n </p>\n {stats && stats.activeTimers > 0 && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {stats.activeTimers} timer(s) running\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,IAAgB;CAC9B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAA0B,EAC5B,MAAM,CAAC,GACR,CAAC,EAEI,EAAE,MAAM,GAAW,SAAS,MAChC,EAA6B,EAC3B,MAAM,CAAC,GACR,CAAC,EAEE,EAAE,MAAM,GAAa,SAAS,MAClC,EAA8B,EAC5B,MAAM,CAAC,GACR,CAAC,EAEE,IAAQ,GAAW,gBACnB,IAAQ,GAAW,mBACnB,IAAU,GAAa;AA0B7B,QAxBI,KAAgB,KAAgB,IAEhC,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAW,WAAU,wBAAyB,CAAA,EAC9C,kBAAC,MAAD;MAAI,WAAU;gBAAwC;MAEjD,CAAA,CACD;QACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,KAAD;QAAG,WAAU;kBACV,IACG,gBAAgB,KAAK,MAAM,EAAM,aAAa,CAAC,QAAQ,EAAM,SAAS,SAAS,KAC/E;QACF,CAAA;OACH,KACC,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAQ,kBAAkB,QAAQ,EAAE;SAAC;SAAc;SACnD,EAAQ,oBAAoB,QAAQ,EAAE;SAAC;SACtC;;OAEL,GAAO,mBACN,kBAAC,KAAD;QAAG,WAAU;kBAAb,CAAkD,aACtC,EAAM,gBACd;;OAEF;;KACF,CAAA,CACF;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAW,WAAU,wBAAyB,CAAA,EAC9C,kBAAC,MAAD;MAAI,WAAU;gBAAwC;MAEjD,CAAA,CACD;QACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,IACG,GAAG,KAAK,MAAM,EAAM,WAAW,CAAC,YAAY,KAAK,MAAM,EAAM,cAAc,CAAC,eAAe,EAAM,aAAa,YAC9G;OACF,CAAA,EACH,KAAS,EAAM,eAAe,KAC7B,kBAAC,KAAD;OAAG,WAAU;iBAAb,CACG,EAAM,cAAa,oBAClB;SAEF;;KACF,CAAA,CACF;MACF;;EACK,CAAA"}
1
+ {"version":3,"file":"AnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/dashboard/AnalyticsPage.tsx"],"sourcesContent":["import { BarChart3 } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useGetFocusScoreSummaryQuery,\n useGetWorkPatternSummaryQuery,\n} from \"@/generated/wspace-operations\";\n\nexport function AnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetTimeEntryStatsQuery({\n skip: !workspaceId,\n });\n\n const { data: focusData, loading: focusLoading } =\n useGetFocusScoreSummaryQuery({\n skip: !workspaceId,\n });\n\n const { data: patternData, loading: patternLoading } =\n useGetWorkPatternSummaryQuery({\n skip: !workspaceId,\n });\n\n const stats = statsData?.timeEntryStats;\n const focus = focusData?.focusScoreSummary;\n const pattern = patternData?.workPatternSummary;\n\n if (statsLoading || focusLoading || patternLoading) {\n return (\n <PageLayout\n title=\"Analytics\"\n description=\"Insights into your time tracking and productivity\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (statsError) {\n return (\n <PageLayout\n title=\"Analytics\"\n description=\"Insights into your time tracking and productivity\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load analytics. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Analytics\"\n description=\"Insights into your time tracking and productivity\"\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-primary\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Productivity Trends\n </h3>\n </div>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle\">\n <div className=\"text-center\">\n <p className=\"text-sm text-text-secondary\">\n {focus\n ? `Focus Score: ${Math.round(focus.averageScore)}/100 (${focus.trend ?? \"stable\"})`\n : \"No focus score data\"}\n </p>\n {pattern && (\n <p className=\"mt-1 text-xs text-text-secondary\">\n {pattern.averageFocusHours.toFixed(1)}h avg focus ·{\" \"}\n {pattern.averageMeetingHours.toFixed(1)}h avg meetings\n </p>\n )}\n {focus?.improvementArea && (\n <p className=\"mt-1 text-xs text-text-secondary\">\n Improve: {focus.improvementArea}\n </p>\n )}\n </div>\n </div>\n </div>\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-primary\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Time Distribution\n </h3>\n </div>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle\">\n <div className=\"text-center\">\n <p className=\"text-sm text-text-secondary\">\n {stats\n ? `${Math.round(stats.totalHours)}h total · ${Math.round(stats.billableHours)}h billable · ${stats.totalEntries} entries`\n : \"No time entry data\"}\n </p>\n {stats && stats.activeTimers > 0 && (\n <p className=\"mt-1 text-xs text-text-secondary\">\n {stats.activeTimers} timer(s) running\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,IAAgB;CAC9B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAA0B,EAC5B,MAAM,CAAC,GACR,CAAC,EAEI,EAAE,MAAM,GAAW,SAAS,MAChC,EAA6B,EAC3B,MAAM,CAAC,GACR,CAAC,EAEE,EAAE,MAAM,GAAa,SAAS,MAClC,EAA8B,EAC5B,MAAM,CAAC,GACR,CAAC,EAEE,IAAQ,GAAW,gBACnB,IAAQ,GAAW,mBACnB,IAAU,GAAa;AA0B7B,QAxBI,KAAgB,KAAgB,IAEhC,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAW,WAAU,wBAAyB,CAAA,EAC9C,kBAAC,MAAD;MAAI,WAAU;gBAA0C;MAEnD,CAAA,CACD;QACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,KAAD;QAAG,WAAU;kBACV,IACG,gBAAgB,KAAK,MAAM,EAAM,aAAa,CAAC,QAAQ,EAAM,SAAS,SAAS,KAC/E;QACF,CAAA;OACH,KACC,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAQ,kBAAkB,QAAQ,EAAE;SAAC;SAAc;SACnD,EAAQ,oBAAoB,QAAQ,EAAE;SAAC;SACtC;;OAEL,GAAO,mBACN,kBAAC,KAAD;QAAG,WAAU;kBAAb,CAAgD,aACpC,EAAM,gBACd;;OAEF;;KACF,CAAA,CACF;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAW,WAAU,wBAAyB,CAAA,EAC9C,kBAAC,MAAD;MAAI,WAAU;gBAA0C;MAEnD,CAAA,CACD;QACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,IACG,GAAG,KAAK,MAAM,EAAM,WAAW,CAAC,YAAY,KAAK,MAAM,EAAM,cAAc,CAAC,eAAe,EAAM,aAAa,YAC9G;OACF,CAAA,EACH,KAAS,EAAM,eAAe,KAC7B,kBAAC,KAAD;OAAG,WAAU;iBAAb,CACG,EAAM,cAAa,oBAClB;SAEF;;KACF,CAAA,CACF;MACF;;EACK,CAAA"}
@@ -1,29 +1,29 @@
1
1
  import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
- import { PageLayout as t } from "../../components/PageLayout.js";
3
- import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
- import { useGetFocusScoreSummaryQuery as r, useGetTimeEntryStatsQuery as i, useGetWorkPatternSummaryQuery as a } from "../../../generated/wspace-operations.js";
2
+ import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
3
+ import { useGetFocusScoreSummaryQuery as n, useGetTimeEntryStatsQuery as r, useGetWorkPatternSummaryQuery as i } from "../../../generated/wspace-operations.js";
4
+ import { PageLayout as a } from "../../components/PageLayout.js";
5
5
  import { Download as o, FileText as s, Plus as c } from "lucide-react";
6
6
  import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
7
  //#region src/timecampus/pages/dashboard/ReportsPage.tsx
8
8
  function d() {
9
- let { workspaceId: d = "" } = e(), { data: f, loading: p, error: m } = i({ skip: !d }), { data: h, loading: g } = a({ skip: !d }), { data: _, loading: v } = r({ skip: !d }), y = f?.timeEntryStats, b = h?.workPatternSummary, x = _?.focusScoreSummary;
10
- if (p || g || v) return /* @__PURE__ */ l(t, {
9
+ let { workspaceId: d = "" } = e(), { data: f, loading: p, error: m } = r({ skip: !d }), { data: h, loading: g } = i({ skip: !d }), { data: _, loading: v } = n({ skip: !d }), y = f?.timeEntryStats, b = h?.workPatternSummary, x = _?.focusScoreSummary;
10
+ if (p || g || v) return /* @__PURE__ */ l(a, {
11
11
  title: "Reports",
12
12
  description: "Generate and view time tracking reports",
13
13
  actions: /* @__PURE__ */ u("button", {
14
- className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
14
+ className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
15
15
  children: [/* @__PURE__ */ l(c, { className: "h-4 w-4" }), "Generate Report"]
16
16
  }),
17
- children: /* @__PURE__ */ l(n, {
17
+ children: /* @__PURE__ */ l(t, {
18
18
  variant: "list",
19
19
  count: 4
20
20
  })
21
21
  });
22
- if (m) return /* @__PURE__ */ l(t, {
22
+ if (m) return /* @__PURE__ */ l(a, {
23
23
  title: "Reports",
24
24
  description: "Generate and view time tracking reports",
25
25
  children: /* @__PURE__ */ l("div", {
26
- className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
26
+ className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
27
27
  children: "Failed to load reports data. Please try again later."
28
28
  })
29
29
  });
@@ -56,39 +56,39 @@ function d() {
56
56
  status: "ready"
57
57
  }] : []
58
58
  ];
59
- return /* @__PURE__ */ l(t, {
59
+ return /* @__PURE__ */ l(a, {
60
60
  title: "Reports",
61
61
  description: "Generate and view time tracking reports",
62
62
  actions: /* @__PURE__ */ u("button", {
63
- className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
63
+ className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
64
64
  children: [/* @__PURE__ */ l(c, { className: "h-4 w-4" }), "Generate Report"]
65
65
  }),
66
66
  children: /* @__PURE__ */ l("div", {
67
- className: "rounded-xl border border-border bg-card",
67
+ className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop",
68
68
  children: /* @__PURE__ */ l("div", {
69
69
  className: "divide-y divide-border",
70
70
  children: S.length === 0 ? /* @__PURE__ */ l("div", {
71
- className: "p-8 text-center text-sm text-muted-foreground",
71
+ className: "p-8 text-center text-sm text-text-secondary",
72
72
  children: "No report data available yet."
73
73
  }) : S.map((e) => /* @__PURE__ */ u("div", {
74
- className: "flex items-center justify-between p-4 hover:bg-muted/50 transition-colors",
74
+ className: "flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors",
75
75
  children: [/* @__PURE__ */ u("div", {
76
76
  className: "flex items-center gap-3",
77
- children: [/* @__PURE__ */ l(s, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
78
- className: "text-sm font-medium text-foreground",
77
+ children: [/* @__PURE__ */ l(s, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
78
+ className: "text-sm font-medium text-text-primary",
79
79
  children: e.name
80
80
  }), /* @__PURE__ */ l("p", {
81
- className: "text-xs text-muted-foreground",
81
+ className: "text-xs text-text-secondary",
82
82
  children: e.period
83
83
  })] })]
84
84
  }), /* @__PURE__ */ u("div", {
85
85
  className: "flex items-center gap-3",
86
86
  children: [/* @__PURE__ */ l("span", {
87
- className: "inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400",
87
+ className: "inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium bg-status-success-bg text-status-success-text",
88
88
  children: e.status
89
89
  }), /* @__PURE__ */ l("button", {
90
- className: "rounded-md p-1.5 hover:bg-muted",
91
- children: /* @__PURE__ */ l(o, { className: "h-4 w-4 text-muted-foreground" })
90
+ className: "rounded-md p-1.5 hover:bg-bg-sunken",
91
+ children: /* @__PURE__ */ l(o, { className: "h-4 w-4 text-text-secondary" })
92
92
  })]
93
93
  })]
94
94
  }, e.id))
@@ -1 +1 @@
1
- {"version":3,"file":"ReportsPage.js","names":[],"sources":["../../../../src/timecampus/pages/dashboard/ReportsPage.tsx"],"sourcesContent":["import { FileText, Plus, Download } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useGetWorkPatternSummaryQuery,\n useGetFocusScoreSummaryQuery,\n} from \"@/generated/wspace-operations\";\n\nexport function ReportsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetTimeEntryStatsQuery({\n skip: !workspaceId,\n });\n\n const { data: patternData, loading: patternLoading } =\n useGetWorkPatternSummaryQuery({\n skip: !workspaceId,\n });\n\n const { data: focusData, loading: focusLoading } =\n useGetFocusScoreSummaryQuery({\n skip: !workspaceId,\n });\n\n const stats = statsData?.timeEntryStats;\n const pattern = patternData?.workPatternSummary;\n const focus = focusData?.focusScoreSummary;\n\n const isLoading = statsLoading || patternLoading || focusLoading;\n\n if (isLoading) {\n return (\n <PageLayout\n title=\"Reports\"\n description=\"Generate and view time tracking reports\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\">\n <Plus className=\"h-4 w-4\" />\n Generate Report\n </button>\n }\n >\n <LoadingSkeleton variant=\"list\" count={4} />\n </PageLayout>\n );\n }\n\n if (statsError) {\n return (\n <PageLayout\n title=\"Reports\"\n description=\"Generate and view time tracking reports\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load reports data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n // Build dynamic reports from available analytics data\n const reports = [\n ...(stats\n ? [\n {\n id: \"time-summary\",\n name: \"Time Tracking Summary\",\n type: \"time\",\n period: `${Math.round(stats.totalHours)}h total · ${stats.totalEntries} entries`,\n status: \"ready\" as const,\n },\n {\n id: \"billable-summary\",\n name: \"Billable Hours Report\",\n type: \"billing\",\n period: `${Math.round(stats.billableHours)}h billable · ${stats.activeTimers} active`,\n status: \"ready\" as const,\n },\n ]\n : []),\n ...(pattern\n ? [\n {\n id: \"work-pattern\",\n name: \"Work Pattern Analysis\",\n type: \"team\",\n period: `${pattern.averageFocusHours.toFixed(1)}h avg focus · ${Math.round(pattern.averageProductivity)}% productivity`,\n status: \"ready\" as const,\n },\n ]\n : []),\n ...(focus\n ? [\n {\n id: \"focus-score\",\n name: \"Focus Score Report\",\n type: \"productivity\",\n period: `Avg: ${Math.round(focus.averageScore)} · High: ${Math.round(focus.highestScore)} · Low: ${Math.round(focus.lowestScore)}`,\n status: \"ready\" as const,\n },\n ]\n : []),\n ];\n\n return (\n <PageLayout\n title=\"Reports\"\n description=\"Generate and view time tracking reports\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\">\n <Plus className=\"h-4 w-4\" />\n Generate Report\n </button>\n }\n >\n <div className=\"rounded-xl border border-border bg-card\">\n <div className=\"divide-y divide-border\">\n {reports.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-muted-foreground\">\n No report data available yet.\n </div>\n ) : (\n reports.map((report) => (\n <div\n key={report.id}\n className=\"flex items-center justify-between p-4 hover:bg-muted/50 transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <FileText className=\"h-5 w-5 text-muted-foreground\" />\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n {report.name}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {report.period}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400\">\n {report.status}\n </span>\n <button className=\"rounded-md p-1.5 hover:bg-muted\">\n <Download className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,IAAc;CAC5B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAA0B,EAC5B,MAAM,CAAC,GACR,CAAC,EAEI,EAAE,MAAM,GAAa,SAAS,MAClC,EAA8B,EAC5B,MAAM,CAAC,GACR,CAAC,EAEE,EAAE,MAAM,GAAW,SAAS,MAChC,EAA6B,EAC3B,MAAM,CAAC,GACR,CAAC,EAEE,IAAQ,GAAW,gBACnB,IAAU,GAAa,oBACvB,IAAQ,GAAW;AAIzB,KAFkB,KAAgB,KAAkB,EAGlD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAErB;;YAGX,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA;AAIjB,KAAI,EACF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA;CAKjB,IAAM,IAAU;EACd,GAAI,IACA,CACE;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,GAAG,KAAK,MAAM,EAAM,WAAW,CAAC,YAAY,EAAM,aAAa;GACvE,QAAQ;GACT,EACD;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,GAAG,KAAK,MAAM,EAAM,cAAc,CAAC,eAAe,EAAM,aAAa;GAC7E,QAAQ;GACT,CACF,GACD,EAAE;EACN,GAAI,IACA,CACE;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,GAAG,EAAQ,kBAAkB,QAAQ,EAAE,CAAC,gBAAgB,KAAK,MAAM,EAAQ,oBAAoB,CAAC;GACxG,QAAQ;GACT,CACF,GACD,EAAE;EACN,GAAI,IACA,CACE;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,QAAQ,KAAK,MAAM,EAAM,aAAa,CAAC,WAAW,KAAK,MAAM,EAAM,aAAa,CAAC,UAAU,KAAK,MAAM,EAAM,YAAY;GAChI,QAAQ;GACT,CACF,GACD,EAAE;EACP;AAED,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAErB;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAQ,WAAW,IAClB,kBAAC,OAAD;KAAK,WAAU;eAAgD;KAEzD,CAAA,GAEN,EAAQ,KAAK,MACX,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,iCAAkC,CAAA,EACtD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAO;OACN,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAO;OACN,CAAA,CACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAO;OACH,CAAA,EACP,kBAAC,UAAD;OAAQ,WAAU;iBAChB,kBAAC,GAAD,EAAU,WAAU,iCAAkC,CAAA;OAC/C,CAAA,CACL;QACF;OAtBC,EAAO,GAsBR,CACN;IAEA,CAAA;GACF,CAAA;EACK,CAAA"}
1
+ {"version":3,"file":"ReportsPage.js","names":[],"sources":["../../../../src/timecampus/pages/dashboard/ReportsPage.tsx"],"sourcesContent":["import { FileText, Plus, Download } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useGetWorkPatternSummaryQuery,\n useGetFocusScoreSummaryQuery,\n} from \"@/generated/wspace-operations\";\n\nexport function ReportsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetTimeEntryStatsQuery({\n skip: !workspaceId,\n });\n\n const { data: patternData, loading: patternLoading } =\n useGetWorkPatternSummaryQuery({\n skip: !workspaceId,\n });\n\n const { data: focusData, loading: focusLoading } =\n useGetFocusScoreSummaryQuery({\n skip: !workspaceId,\n });\n\n const stats = statsData?.timeEntryStats;\n const pattern = patternData?.workPatternSummary;\n const focus = focusData?.focusScoreSummary;\n\n const isLoading = statsLoading || patternLoading || focusLoading;\n\n if (isLoading) {\n return (\n <PageLayout\n title=\"Reports\"\n description=\"Generate and view time tracking reports\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n <Plus className=\"h-4 w-4\" />\n Generate Report\n </button>\n }\n >\n <LoadingSkeleton variant=\"list\" count={4} />\n </PageLayout>\n );\n }\n\n if (statsError) {\n return (\n <PageLayout\n title=\"Reports\"\n description=\"Generate and view time tracking reports\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load reports data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n // Build dynamic reports from available analytics data\n const reports = [\n ...(stats\n ? [\n {\n id: \"time-summary\",\n name: \"Time Tracking Summary\",\n type: \"time\",\n period: `${Math.round(stats.totalHours)}h total · ${stats.totalEntries} entries`,\n status: \"ready\" as const,\n },\n {\n id: \"billable-summary\",\n name: \"Billable Hours Report\",\n type: \"billing\",\n period: `${Math.round(stats.billableHours)}h billable · ${stats.activeTimers} active`,\n status: \"ready\" as const,\n },\n ]\n : []),\n ...(pattern\n ? [\n {\n id: \"work-pattern\",\n name: \"Work Pattern Analysis\",\n type: \"team\",\n period: `${pattern.averageFocusHours.toFixed(1)}h avg focus · ${Math.round(pattern.averageProductivity)}% productivity`,\n status: \"ready\" as const,\n },\n ]\n : []),\n ...(focus\n ? [\n {\n id: \"focus-score\",\n name: \"Focus Score Report\",\n type: \"productivity\",\n period: `Avg: ${Math.round(focus.averageScore)} · High: ${Math.round(focus.highestScore)} · Low: ${Math.round(focus.lowestScore)}`,\n status: \"ready\" as const,\n },\n ]\n : []),\n ];\n\n return (\n <PageLayout\n title=\"Reports\"\n description=\"Generate and view time tracking reports\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n <Plus className=\"h-4 w-4\" />\n Generate Report\n </button>\n }\n >\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop\">\n <div className=\"divide-y divide-border\">\n {reports.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-text-secondary\">\n No report data available yet.\n </div>\n ) : (\n reports.map((report) => (\n <div\n key={report.id}\n className=\"flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <FileText className=\"h-5 w-5 text-text-secondary\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {report.name}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {report.period}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium bg-status-success-bg text-status-success-text\">\n {report.status}\n </span>\n <button className=\"rounded-md p-1.5 hover:bg-bg-sunken\">\n <Download className=\"h-4 w-4 text-text-secondary\" />\n </button>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,IAAc;CAC5B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAA0B,EAC5B,MAAM,CAAC,GACR,CAAC,EAEI,EAAE,MAAM,GAAa,SAAS,MAClC,EAA8B,EAC5B,MAAM,CAAC,GACR,CAAC,EAEE,EAAE,MAAM,GAAW,SAAS,MAChC,EAA6B,EAC3B,MAAM,CAAC,GACR,CAAC,EAEE,IAAQ,GAAW,gBACnB,IAAU,GAAa,oBACvB,IAAQ,GAAW;AAIzB,KAFkB,KAAgB,KAAkB,EAGlD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAErB;;YAGX,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA;AAIjB,KAAI,EACF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA;CAKjB,IAAM,IAAU;EACd,GAAI,IACA,CACE;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,GAAG,KAAK,MAAM,EAAM,WAAW,CAAC,YAAY,EAAM,aAAa;GACvE,QAAQ;GACT,EACD;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,GAAG,KAAK,MAAM,EAAM,cAAc,CAAC,eAAe,EAAM,aAAa;GAC7E,QAAQ;GACT,CACF,GACD,EAAE;EACN,GAAI,IACA,CACE;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,GAAG,EAAQ,kBAAkB,QAAQ,EAAE,CAAC,gBAAgB,KAAK,MAAM,EAAQ,oBAAoB,CAAC;GACxG,QAAQ;GACT,CACF,GACD,EAAE;EACN,GAAI,IACA,CACE;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,QAAQ,KAAK,MAAM,EAAM,aAAa,CAAC,WAAW,KAAK,MAAM,EAAM,aAAa,CAAC,UAAU,KAAK,MAAM,EAAM,YAAY;GAChI,QAAQ;GACT,CACF,GACD,EAAE;EACP;AAED,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAErB;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAQ,WAAW,IAClB,kBAAC,OAAD;KAAK,WAAU;eAA8C;KAEvD,CAAA,GAEN,EAAQ,KAAK,MACX,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA,EACpD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAO;OACN,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAO;OACN,CAAA,CACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAO;OACH,CAAA,EACP,kBAAC,UAAD;OAAQ,WAAU;iBAChB,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA;OAC7C,CAAA,CACL;QACF;OAtBC,EAAO,GAsBR,CACN;IAEA,CAAA;GACF,CAAA;EACK,CAAA"}