@burdenoff/microfe-timecampus 2026.529.2 → 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 (107) hide show
  1. package/dist/timecampus/components/ErrorBoundary.js +2 -2
  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 +2 -2
  6. package/dist/timecampus/components/PageLayout.js.map +1 -1
  7. package/dist/timecampus/components/StatCard.js +6 -6
  8. package/dist/timecampus/components/StatCard.js.map +1 -1
  9. package/dist/timecampus/pages/HomePage.js +31 -31
  10. package/dist/timecampus/pages/HomePage.js.map +1 -1
  11. package/dist/timecampus/pages/applets/AppletStorePage.js +7 -7
  12. package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
  13. package/dist/timecampus/pages/applets/InstalledAppletsPage.js +8 -8
  14. package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
  15. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +10 -10
  16. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
  17. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +10 -10
  18. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -1
  19. package/dist/timecampus/pages/channels/ChannelsPage.js +6 -6
  20. package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
  21. package/dist/timecampus/pages/client-portal/ClientPortalPage.js +8 -8
  22. package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
  23. package/dist/timecampus/pages/dashboard/AnalyticsPage.js +11 -11
  24. package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -1
  25. package/dist/timecampus/pages/dashboard/ReportsPage.js +10 -10
  26. package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
  27. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +5 -5
  28. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -1
  29. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +13 -13
  30. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -1
  31. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +8 -8
  32. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
  33. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +8 -8
  34. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
  35. package/dist/timecampus/pages/focus-score/FocusScorePage.js +7 -7
  36. package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
  37. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +10 -10
  38. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -1
  39. package/dist/timecampus/pages/geofencing/GeofencingPage.js +7 -7
  40. package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
  41. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +9 -9
  42. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -1
  43. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +7 -7
  44. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
  45. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +12 -12
  46. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -1
  47. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +8 -8
  48. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
  49. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +4 -4
  50. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
  51. package/dist/timecampus/pages/meetings/MeetingCreatePage.js +12 -12
  52. package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
  53. package/dist/timecampus/pages/meetings/MeetingDetailPage.js +15 -15
  54. package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
  55. package/dist/timecampus/pages/meetings/MeetingsPage.js +11 -11
  56. package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
  57. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +8 -8
  58. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
  59. package/dist/timecampus/pages/pomodoro/PomodoroPage.js +8 -8
  60. package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
  61. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +20 -20
  62. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -1
  63. package/dist/timecampus/pages/projects/ProjectCreatePage.js +14 -14
  64. package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
  65. package/dist/timecampus/pages/projects/ProjectDetailPage.js +8 -8
  66. package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
  67. package/dist/timecampus/pages/projects/ProjectsPage.js +11 -11
  68. package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
  69. package/dist/timecampus/pages/projects/TasksPage.js +7 -7
  70. package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
  71. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +8 -8
  72. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
  73. package/dist/timecampus/pages/team/TeamAnalyticsPage.js +10 -10
  74. package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
  75. package/dist/timecampus/pages/team/TeamMembersPage.js +10 -10
  76. package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
  77. package/dist/timecampus/pages/team/TeamPage.js +4 -4
  78. package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
  79. package/dist/timecampus/pages/team-activity/TeamActivityPage.js +6 -6
  80. package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
  81. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +11 -11
  82. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -1
  83. package/dist/timecampus/pages/templates/TemplateApplicationPage.js +6 -6
  84. package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -1
  85. package/dist/timecampus/pages/templates/TemplateDetailPage.js +10 -10
  86. package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
  87. package/dist/timecampus/pages/templates/TemplatesPage.js +6 -6
  88. package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
  89. package/dist/timecampus/pages/time/TimeEntriesPage.js +16 -16
  90. package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
  91. package/dist/timecampus/pages/time/TimeTrackingPage.js +9 -9
  92. package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
  93. package/dist/timecampus/pages/time/TimerPage.js +12 -12
  94. package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
  95. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +8 -8
  96. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
  97. package/dist/timecampus/pages/widgets/WidgetDetailPage.js +10 -10
  98. package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
  99. package/dist/timecampus/pages/widgets/WidgetsPage.js +7 -7
  100. package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
  101. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +9 -9
  102. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
  103. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +10 -10
  104. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -1
  105. package/dist/timecampus/pages/workflows/WorkflowsPage.js +8 -8
  106. package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
  107. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MeetingAnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingAnalyticsPage.tsx"],"sourcesContent":["import { BarChart3, CalendarDays, Clock, DollarSign } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useGetMeetingStatsQuery } from \"@/generated/wspace-operations\";\nimport { formatCurrency } from \"../../utils/helpers\";\n\nexport function MeetingAnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetMeetingStatsQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const stats = data?.meetingStats;\n\n if (loading) {\n return (\n <PageLayout\n title=\"Meeting Analytics\"\n description=\"Insights into meeting time and cost\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Meeting Analytics\"\n description=\"Insights into meeting time and cost\"\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 meeting analytics. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalHours = Math.round((stats?.totalDuration ?? 0) / 60);\n const avgDuration = Math.round(stats?.averageDuration ?? 0);\n\n return (\n <PageLayout\n title=\"Meeting Analytics\"\n description=\"Insights into meeting time and cost\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Total Meetings\"\n value={String(stats?.totalMeetings ?? 0)}\n icon={<CalendarDays className=\"h-5 w-5\" />}\n trend={{\n value: stats?.actionItemsCompleted ?? 0,\n label: \"actions completed\",\n }}\n />\n <StatCard\n title=\"Meeting Hours\"\n value={`${totalHours}h`}\n icon={<Clock className=\"h-5 w-5\" />}\n trend={{ value: stats?.totalDuration ?? 0, label: \"total minutes\" }}\n />\n <StatCard\n title=\"Meeting Cost\"\n value={formatCurrency(stats?.totalCost ?? 0)}\n icon={<DollarSign className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Avg. Duration\"\n value={`${avgDuration} min`}\n icon={<BarChart3 className=\"h-5 w-5\" />}\n trend={{ value: stats?.averageRating ?? 0, label: \"avg rating\" }}\n />\n </div>\n\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-foreground\">\n Meeting Time Distribution\n </h3>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border\">\n <p className=\"text-sm text-muted-foreground\">\n {stats\n ? `${stats.totalMeetings} meetings · ${stats.actionItemsTotal} action items (${stats.actionItemsCompleted} completed)`\n : \"Chart will render here\"}\n </p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,IAAuB;CACrC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAwB;EACvD,WAAW,EAAE,gBAAa;EAC1B,MAAM,CAAC;EACR,CAAC,EAEI,IAAQ,GAAM;AAEpB,KAAI,EACF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,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;CAIjB,IAAM,IAAa,KAAK,OAAO,GAAO,iBAAiB,KAAK,GAAG,EACzD,IAAc,KAAK,MAAM,GAAO,mBAAmB,EAAE;AAE3D,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAFd,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,iBAAiB,EAAE;KACxC,MAAM,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;KAC1C,OAAO;MACL,OAAO,GAAO,wBAAwB;MACtC,OAAO;MACR;KACD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAW;KACrB,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,OAAO;MAAE,OAAO,GAAO,iBAAiB;MAAG,OAAO;MAAiB;KACnE,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAe,GAAO,aAAa,EAAE;KAC5C,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAY;KACtB,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;KACvC,OAAO;MAAE,OAAO,GAAO,iBAAiB;MAAG,OAAO;MAAc;KAChE,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAA6C;IAEtD,CAAA,EACL,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,KAAD;KAAG,WAAU;eACV,IACG,GAAG,EAAM,cAAc,cAAc,EAAM,iBAAiB,iBAAiB,EAAM,qBAAqB,eACxG;KACF,CAAA;IACA,CAAA,CACF;KACK"}
1
+ {"version":3,"file":"MeetingAnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingAnalyticsPage.tsx"],"sourcesContent":["import { BarChart3, CalendarDays, Clock, DollarSign } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useGetMeetingStatsQuery } from \"@/generated/wspace-operations\";\nimport { formatCurrency } from \"../../utils/helpers\";\n\nexport function MeetingAnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetMeetingStatsQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const stats = data?.meetingStats;\n\n if (loading) {\n return (\n <PageLayout\n title=\"Meeting Analytics\"\n description=\"Insights into meeting time and cost\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Meeting Analytics\"\n description=\"Insights into meeting time and cost\"\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 meeting analytics. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalHours = Math.round((stats?.totalDuration ?? 0) / 60);\n const avgDuration = Math.round(stats?.averageDuration ?? 0);\n\n return (\n <PageLayout\n title=\"Meeting Analytics\"\n description=\"Insights into meeting time and cost\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Total Meetings\"\n value={String(stats?.totalMeetings ?? 0)}\n icon={<CalendarDays className=\"h-5 w-5\" />}\n trend={{\n value: stats?.actionItemsCompleted ?? 0,\n label: \"actions completed\",\n }}\n />\n <StatCard\n title=\"Meeting Hours\"\n value={`${totalHours}h`}\n icon={<Clock className=\"h-5 w-5\" />}\n trend={{ value: stats?.totalDuration ?? 0, label: \"total minutes\" }}\n />\n <StatCard\n title=\"Meeting Cost\"\n value={formatCurrency(stats?.totalCost ?? 0)}\n icon={<DollarSign className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Avg. Duration\"\n value={`${avgDuration} min`}\n icon={<BarChart3 className=\"h-5 w-5\" />}\n trend={{ value: stats?.averageRating ?? 0, label: \"avg rating\" }}\n />\n </div>\n\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Meeting Time Distribution\n </h3>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle\">\n <p className=\"text-sm text-text-secondary\">\n {stats\n ? `${stats.totalMeetings} meetings · ${stats.actionItemsTotal} action items (${stats.actionItemsCompleted} completed)`\n : \"Chart will render here\"}\n </p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,IAAuB;CACrC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAwB;EACvD,WAAW,EAAE,gBAAa;EAC1B,MAAM,CAAC;EACR,CAAC,EAEI,IAAQ,GAAM;AAEpB,KAAI,EACF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,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;CAIjB,IAAM,IAAa,KAAK,OAAO,GAAO,iBAAiB,KAAK,GAAG,EACzD,IAAc,KAAK,MAAM,GAAO,mBAAmB,EAAE;AAE3D,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAFd,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,iBAAiB,EAAE;KACxC,MAAM,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;KAC1C,OAAO;MACL,OAAO,GAAO,wBAAwB;MACtC,OAAO;MACR;KACD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAW;KACrB,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,OAAO;MAAE,OAAO,GAAO,iBAAiB;MAAG,OAAO;MAAiB;KACnE,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAe,GAAO,aAAa,EAAE;KAC5C,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAY;KACtB,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;KACvC,OAAO;MAAE,OAAO,GAAO,iBAAiB;MAAG,OAAO;MAAc;KAChE,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAA+C;IAExD,CAAA,EACL,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,KAAD;KAAG,WAAU;eACV,IACG,GAAG,EAAM,cAAc,cAAc,EAAM,iBAAiB,iBAAiB,EAAM,qBAAqB,eACxG;KACF,CAAA;IACA,CAAA,CACF;KACK"}
@@ -30,63 +30,63 @@ function c() {
30
30
  title: "Schedule Meeting",
31
31
  description: "Create a new meeting",
32
32
  actions: /* @__PURE__ */ s("button", {
33
- className: "inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-foreground hover:bg-muted/50",
33
+ className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
34
34
  children: [/* @__PURE__ */ o(a, { className: "h-4 w-4" }), "Back"]
35
35
  }),
36
36
  children: /* @__PURE__ */ o("div", {
37
- className: "mx-auto max-w-2xl rounded-xl border border-border bg-card p-6",
37
+ className: "mx-auto max-w-2xl rounded-xl border border-border-subtle bg-bg-surface p-6",
38
38
  children: /* @__PURE__ */ s("div", {
39
39
  className: "space-y-4",
40
40
  children: [
41
41
  /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("label", {
42
- className: "block text-sm font-medium text-foreground",
42
+ className: "block text-sm font-medium text-text-primary",
43
43
  children: "Meeting Title"
44
44
  }), /* @__PURE__ */ o("input", {
45
45
  type: "text",
46
46
  placeholder: "Enter meeting title",
47
47
  value: d,
48
48
  onChange: (e) => f(e.target.value),
49
- className: "mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground"
49
+ className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary"
50
50
  })] }),
51
51
  /* @__PURE__ */ s("div", {
52
52
  className: "grid grid-cols-2 gap-4",
53
53
  children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("label", {
54
- className: "block text-sm font-medium text-foreground",
54
+ className: "block text-sm font-medium text-text-primary",
55
55
  children: "Date"
56
56
  }), /* @__PURE__ */ o("input", {
57
57
  type: "date",
58
58
  value: p,
59
59
  onChange: (e) => m(e.target.value),
60
- className: "mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground"
60
+ className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
61
61
  })] }), /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("label", {
62
- className: "block text-sm font-medium text-foreground",
62
+ className: "block text-sm font-medium text-text-primary",
63
63
  children: "Duration (minutes)"
64
64
  }), /* @__PURE__ */ o("input", {
65
65
  type: "number",
66
66
  value: h,
67
67
  onChange: (e) => g(Number(e.target.value)),
68
- className: "mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground"
68
+ className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
69
69
  })] })]
70
70
  }),
71
71
  /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("label", {
72
- className: "block text-sm font-medium text-foreground",
72
+ className: "block text-sm font-medium text-text-primary",
73
73
  children: "Description"
74
74
  }), /* @__PURE__ */ o("textarea", {
75
75
  placeholder: "Meeting agenda...",
76
76
  rows: 3,
77
77
  value: _,
78
78
  onChange: (e) => v(e.target.value),
79
- className: "mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground"
79
+ className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary"
80
80
  })] }),
81
81
  /* @__PURE__ */ s("div", {
82
82
  className: "flex justify-end gap-2 pt-4",
83
83
  children: [/* @__PURE__ */ o("button", {
84
- className: "rounded-md border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-muted/50",
84
+ className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
85
85
  children: "Cancel"
86
86
  }), /* @__PURE__ */ o("button", {
87
87
  onClick: y,
88
88
  disabled: u || !d || !p,
89
- className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50",
89
+ className: "rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50",
90
90
  children: u ? "Scheduling..." : "Schedule"
91
91
  })]
92
92
  })
@@ -1 +1 @@
1
- {"version":3,"file":"MeetingCreatePage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingCreatePage.tsx"],"sourcesContent":["import { useState, useCallback } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useCreateMeetingMutation } from \"@/generated/wspace-operations\";\n\nexport function MeetingCreatePage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const [createMeeting, { loading: creating }] = useCreateMeetingMutation();\n\n const [title, setTitle] = useState(\"\");\n const [date, setDate] = useState(\"\");\n const [duration, setDuration] = useState(30);\n const [description, setDescription] = useState(\"\");\n\n const handleSubmit = useCallback(async () => {\n if (!workspaceId || !title || !date) return;\n const startTime = new Date(date).toISOString();\n await createMeeting({\n variables: {\n input: {\n workspaceId,\n title,\n meetingType: \"TEAM\" as never,\n startTime,\n duration,\n notes: description || undefined,\n },\n },\n refetchQueries: [\"ListMeetings\"],\n });\n setTitle(\"\");\n setDate(\"\");\n setDuration(30);\n setDescription(\"\");\n }, [workspaceId, title, date, duration, description, createMeeting]);\n\n return (\n <PageLayout\n title=\"Schedule Meeting\"\n description=\"Create a new meeting\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-foreground hover:bg-muted/50\">\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </button>\n }\n >\n <div className=\"mx-auto max-w-2xl rounded-xl border border-border bg-card p-6\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-foreground\">\n Meeting Title\n </label>\n <input\n type=\"text\"\n placeholder=\"Enter meeting title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-foreground\">\n Date\n </label>\n <input\n type=\"date\"\n value={date}\n onChange={(e) => setDate(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-foreground\">\n Duration (minutes)\n </label>\n <input\n type=\"number\"\n value={duration}\n onChange={(e) => setDuration(Number(e.target.value))}\n className=\"mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground\"\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-foreground\">\n Description\n </label>\n <textarea\n placeholder=\"Meeting agenda...\"\n rows={3}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground\"\n />\n </div>\n <div className=\"flex justify-end gap-2 pt-4\">\n <button className=\"rounded-md border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-muted/50\">\n Cancel\n </button>\n <button\n onClick={handleSubmit}\n disabled={creating || !title || !date}\n className=\"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50\"\n >\n {creating ? \"Scheduling...\" : \"Schedule\"}\n </button>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,IAAoB;CAClC,IAAM,EAAE,iBAAc,OAAO,GAAe,EACtC,CAAC,GAAe,EAAE,SAAS,OAAc,GAA0B,EAEnE,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAU,KAAe,EAAS,GAAG,EACtC,CAAC,GAAa,KAAkB,EAAS,GAAG,EAE5C,IAAe,EAAY,YAAY;AACvC,GAAC,KAAe,CAAC,KAAS,CAAC,MAE/B,MAAM,EAAc;GAClB,WAAW,EACT,OAAO;IACL;IACA;IACA,aAAa;IACb,WAPY,IAAI,KAAK,EAAK,CAAC,aAAa;IAQxC;IACA,OAAO,KAAe,KAAA;IACvB,EACF;GACD,gBAAgB,CAAC,eAAe;GACjC,CAAC,EACF,EAAS,GAAG,EACZ,EAAQ,GAAG,EACX,EAAY,GAAG,EACf,EAAe,GAAG;IACjB;EAAC;EAAa;EAAO;EAAM;EAAU;EAAa;EAAc,CAAC;AAEpE,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,OAE1B;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAA4C;MAErD,CAAA,EACR,kBAAC,SAAD;MACE,MAAK;MACL,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAS,EAAE,OAAO,MAAM;MACzC,WAAU;MACV,CAAA,CACE,EAAA,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAA4C;OAErD,CAAA,EACR,kBAAC,SAAD;OACE,MAAK;OACL,OAAO;OACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;OACxC,WAAU;OACV,CAAA,CACE,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAA4C;OAErD,CAAA,EACR,kBAAC,SAAD;OACE,MAAK;OACL,OAAO;OACP,WAAW,MAAM,EAAY,OAAO,EAAE,OAAO,MAAM,CAAC;OACpD,WAAU;OACV,CAAA,CACE,EAAA,CAAA,CACF;;KACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAA4C;MAErD,CAAA,EACR,kBAAC,YAAD;MACE,aAAY;MACZ,MAAM;MACN,OAAO;MACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;MAC/C,WAAU;MACV,CAAA,CACE,EAAA,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,UAAD;OAAQ,WAAU;iBAAkG;OAE3G,CAAA,EACT,kBAAC,UAAD;OACE,SAAS;OACT,UAAU,KAAY,CAAC,KAAS,CAAC;OACjC,WAAU;iBAET,IAAW,kBAAkB;OACvB,CAAA,CACL;;KACF;;GACF,CAAA;EACK,CAAA"}
1
+ {"version":3,"file":"MeetingCreatePage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingCreatePage.tsx"],"sourcesContent":["import { useState, useCallback } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useCreateMeetingMutation } from \"@/generated/wspace-operations\";\n\nexport function MeetingCreatePage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const [createMeeting, { loading: creating }] = useCreateMeetingMutation();\n\n const [title, setTitle] = useState(\"\");\n const [date, setDate] = useState(\"\");\n const [duration, setDuration] = useState(30);\n const [description, setDescription] = useState(\"\");\n\n const handleSubmit = useCallback(async () => {\n if (!workspaceId || !title || !date) return;\n const startTime = new Date(date).toISOString();\n await createMeeting({\n variables: {\n input: {\n workspaceId,\n title,\n meetingType: \"TEAM\" as never,\n startTime,\n duration,\n notes: description || undefined,\n },\n },\n refetchQueries: [\"ListMeetings\"],\n });\n setTitle(\"\");\n setDate(\"\");\n setDuration(30);\n setDescription(\"\");\n }, [workspaceId, title, date, duration, description, createMeeting]);\n\n return (\n <PageLayout\n title=\"Schedule Meeting\"\n description=\"Create a new meeting\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\">\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </button>\n }\n >\n <div className=\"mx-auto max-w-2xl rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Meeting Title\n </label>\n <input\n type=\"text\"\n placeholder=\"Enter meeting title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Date\n </label>\n <input\n type=\"date\"\n value={date}\n onChange={(e) => setDate(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Duration (minutes)\n </label>\n <input\n type=\"number\"\n value={duration}\n onChange={(e) => setDuration(Number(e.target.value))}\n className=\"mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Description\n </label>\n <textarea\n placeholder=\"Meeting agenda...\"\n rows={3}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary\"\n />\n </div>\n <div className=\"flex justify-end gap-2 pt-4\">\n <button className=\"rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\">\n Cancel\n </button>\n <button\n onClick={handleSubmit}\n disabled={creating || !title || !date}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {creating ? \"Scheduling...\" : \"Schedule\"}\n </button>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,IAAoB;CAClC,IAAM,EAAE,iBAAc,OAAO,GAAe,EACtC,CAAC,GAAe,EAAE,SAAS,OAAc,GAA0B,EAEnE,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAU,KAAe,EAAS,GAAG,EACtC,CAAC,GAAa,KAAkB,EAAS,GAAG,EAE5C,IAAe,EAAY,YAAY;AACvC,GAAC,KAAe,CAAC,KAAS,CAAC,MAE/B,MAAM,EAAc;GAClB,WAAW,EACT,OAAO;IACL;IACA;IACA,aAAa;IACb,WAPY,IAAI,KAAK,EAAK,CAAC,aAAa;IAQxC;IACA,OAAO,KAAe,KAAA;IACvB,EACF;GACD,gBAAgB,CAAC,eAAe;GACjC,CAAC,EACF,EAAS,GAAG,EACZ,EAAQ,GAAG,EACX,EAAY,GAAG,EACf,EAAe,GAAG;IACjB;EAAC;EAAa;EAAO;EAAM;EAAU;EAAa;EAAc,CAAC;AAEpE,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,OAE1B;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAA8C;MAEvD,CAAA,EACR,kBAAC,SAAD;MACE,MAAK;MACL,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAS,EAAE,OAAO,MAAM;MACzC,WAAU;MACV,CAAA,CACE,EAAA,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAA8C;OAEvD,CAAA,EACR,kBAAC,SAAD;OACE,MAAK;OACL,OAAO;OACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;OACxC,WAAU;OACV,CAAA,CACE,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAA8C;OAEvD,CAAA,EACR,kBAAC,SAAD;OACE,MAAK;OACL,OAAO;OACP,WAAW,MAAM,EAAY,OAAO,EAAE,OAAO,MAAM,CAAC;OACpD,WAAU;OACV,CAAA,CACE,EAAA,CAAA,CACF;;KACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAA8C;MAEvD,CAAA,EACR,kBAAC,YAAD;MACE,aAAY;MACZ,MAAM;MACN,OAAO;MACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;MAC/C,WAAU;MACV,CAAA,CACE,EAAA,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,UAAD;OAAQ,WAAU;iBAA+G;OAExH,CAAA,EACT,kBAAC,UAAD;OACE,SAAS;OACT,UAAU,KAAY,CAAC,KAAS,CAAC;OACjC,WAAU;iBAET,IAAW,kBAAkB;OACvB,CAAA,CACL;;KACF;;GACF,CAAA;EACK,CAAA"}
@@ -60,56 +60,56 @@ function d() {
60
60
  }), /* @__PURE__ */ u("div", {
61
61
  className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
62
62
  children: [/* @__PURE__ */ u("div", {
63
- className: "rounded-xl border border-border bg-card p-6",
63
+ className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
64
64
  children: [/* @__PURE__ */ l("h3", {
65
- className: "mb-4 text-sm font-semibold text-foreground",
65
+ className: "mb-4 text-sm font-semibold text-text-primary",
66
66
  children: "Participants"
67
67
  }), g.participants.length > 0 ? /* @__PURE__ */ l("div", {
68
68
  className: "space-y-2",
69
69
  children: g.participants.map((e) => /* @__PURE__ */ u("div", {
70
- className: "flex items-center justify-between rounded-lg border border-border px-3 py-2",
70
+ className: "flex items-center justify-between rounded-lg border border-border-subtle px-3 py-2",
71
71
  children: [/* @__PURE__ */ l("span", {
72
- className: "text-sm text-foreground",
72
+ className: "text-sm text-text-primary",
73
73
  children: e.userId
74
74
  }), /* @__PURE__ */ u("div", {
75
75
  className: "flex items-center gap-2",
76
76
  children: [/* @__PURE__ */ l("span", {
77
- className: "text-xs text-muted-foreground",
77
+ className: "text-xs text-text-secondary",
78
78
  children: e.role
79
79
  }), /* @__PURE__ */ l("span", {
80
- className: "inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground",
80
+ className: "inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
81
81
  children: e.status
82
82
  })]
83
83
  })]
84
84
  }, e.id))
85
85
  }) : /* @__PURE__ */ l("div", {
86
- className: "flex h-32 items-center justify-center rounded-lg border border-dashed border-border",
86
+ className: "flex h-32 items-center justify-center rounded-lg border border-dashed border-border-subtle",
87
87
  children: /* @__PURE__ */ l("p", {
88
- className: "text-sm text-muted-foreground",
88
+ className: "text-sm text-text-secondary",
89
89
  children: "No participants added"
90
90
  })
91
91
  })]
92
92
  }), /* @__PURE__ */ u("div", {
93
- className: "rounded-xl border border-border bg-card p-6",
93
+ className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
94
94
  children: [/* @__PURE__ */ l("h3", {
95
- className: "mb-4 text-sm font-semibold text-foreground",
95
+ className: "mb-4 text-sm font-semibold text-text-primary",
96
96
  children: "Action Items"
97
97
  }), g.actionItems.length > 0 ? /* @__PURE__ */ l("div", {
98
98
  className: "space-y-2",
99
99
  children: g.actionItems.map((e) => /* @__PURE__ */ u("div", {
100
- className: "flex items-center justify-between rounded-lg border border-border px-3 py-2",
100
+ className: "flex items-center justify-between rounded-lg border border-border-subtle px-3 py-2",
101
101
  children: [/* @__PURE__ */ l("span", {
102
- className: "text-sm text-foreground",
102
+ className: "text-sm text-text-primary",
103
103
  children: e.title
104
104
  }), /* @__PURE__ */ l("span", {
105
- className: "inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground",
105
+ className: "inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
106
106
  children: e.status
107
107
  })]
108
108
  }, e.id))
109
109
  }) : /* @__PURE__ */ l("div", {
110
- className: "flex h-32 items-center justify-center rounded-lg border border-dashed border-border",
110
+ className: "flex h-32 items-center justify-center rounded-lg border border-dashed border-border-subtle",
111
111
  children: /* @__PURE__ */ l("p", {
112
- className: "text-sm text-muted-foreground",
112
+ className: "text-sm text-text-secondary",
113
113
  children: "No action items"
114
114
  })
115
115
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"MeetingDetailPage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingDetailPage.tsx"],"sourcesContent":["import { useParams } from \"react-router-dom\";\nimport { CalendarDays, Users, Clock, Video } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetMeetingQuery,\n type MeetingParticipantFieldsFragment,\n type MeetingActionItemFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { formatCurrency } from \"../../utils/helpers\";\n\nexport function MeetingDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetMeetingQuery({\n variables: { id: id ?? \"\", workspaceId },\n skip: !workspaceId || !id,\n });\n\n const meeting = data?.meeting;\n\n if (loading) {\n return (\n <PageLayout title=\"Meeting Details\" description={`Meeting ID: ${id}`}>\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error || !meeting) {\n return (\n <PageLayout title=\"Meeting Details\" description={`Meeting ID: ${id}`}>\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 {error\n ? \"Failed to load meeting details. Please try again later.\"\n : \"Meeting not found.\"}\n </div>\n </PageLayout>\n );\n }\n\n const pendingActions = meeting.actionItems.filter(\n (a: MeetingActionItemFieldsFragment) => a.status !== \"COMPLETED\",\n ).length;\n\n return (\n <PageLayout title=\"Meeting Details\" description={meeting.title}>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Duration\"\n value={`${meeting.duration ?? 0} min`}\n icon={<Clock className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Participants\"\n value={String(meeting.participants.length)}\n icon={<Users className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Cost\"\n value={meeting.cost != null ? formatCurrency(meeting.cost) : \"N/A\"}\n description=\"Based on participant rates\"\n />\n <StatCard\n title=\"Action Items\"\n value={String(meeting.actionItems.length)}\n description={`${pendingActions} pending`}\n />\n </div>\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 <h3 className=\"mb-4 text-sm font-semibold text-foreground\">\n Participants\n </h3>\n {meeting.participants.length > 0 ? (\n <div className=\"space-y-2\">\n {meeting.participants.map(\n (p: MeetingParticipantFieldsFragment) => (\n <div\n key={p.id}\n className=\"flex items-center justify-between rounded-lg border border-border px-3 py-2\"\n >\n <span className=\"text-sm text-foreground\">{p.userId}</span>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">\n {p.role}\n </span>\n <span className=\"inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {p.status}\n </span>\n </div>\n </div>\n ),\n )}\n </div>\n ) : (\n <div className=\"flex h-32 items-center justify-center rounded-lg border border-dashed border-border\">\n <p className=\"text-sm text-muted-foreground\">\n No participants added\n </p>\n </div>\n )}\n </div>\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-foreground\">\n Action Items\n </h3>\n {meeting.actionItems.length > 0 ? (\n <div className=\"space-y-2\">\n {meeting.actionItems.map(\n (item: MeetingActionItemFieldsFragment) => (\n <div\n key={item.id}\n className=\"flex items-center justify-between rounded-lg border border-border px-3 py-2\"\n >\n <span className=\"text-sm text-foreground\">\n {item.title}\n </span>\n <span className=\"inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {item.status}\n </span>\n </div>\n ),\n )}\n </div>\n ) : (\n <div className=\"flex h-32 items-center justify-center rounded-lg border border-dashed border-border\">\n <p className=\"text-sm text-muted-foreground\">No action items</p>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,IAAoB;CAClC,IAAM,EAAE,UAAO,GAA2B,EACpC,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAmB;EAClD,WAAW;GAAE,IAAI,KAAM;GAAI;GAAa;EACxC,MAAM,CAAC,KAAe,CAAC;EACxB,CAAC,EAEI,IAAU,GAAM;AAEtB,KAAI,EACF,QACE,kBAAC,GAAD;EAAY,OAAM;EAAkB,aAAa,eAAe;YAC9D,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA;AAIjB,KAAI,KAAS,CAAC,EACZ,QACE,kBAAC,GAAD;EAAY,OAAM;EAAkB,aAAa,eAAe;YAC9D,kBAAC,OAAD;GAAK,WAAU;aACZ,IACG,4DACA;GACA,CAAA;EACK,CAAA;CAIjB,IAAM,IAAiB,EAAQ,YAAY,QACxC,MAAuC,EAAE,WAAW,YACtD,CAAC;AAEF,QACE,kBAAC,GAAD;EAAY,OAAM;EAAkB,aAAa,EAAQ;YAAzD,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAQ,YAAY,EAAE;KAChC,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,EAAQ,aAAa,OAAO;KAC1C,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAQ,QAAQ,OAAsC,QAA/B,EAAe,EAAQ,KAAK;KAC1D,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,EAAQ,YAAY,OAAO;KACzC,aAAa,GAAG,EAAe;KAC/B,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA6C;KAEtD,CAAA,EACJ,EAAQ,aAAa,SAAS,IAC7B,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAQ,aAAa,KACnB,MACC,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,QAAD;OAAM,WAAU;iBAA2B,EAAE;OAAc,CAAA,EAC3D,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAE;QACE,CAAA,EACP,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAE;QACE,CAAA,CACH;SACF;QAZC,EAAE,GAYH,CAET;KACG,CAAA,GAEN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBAAgC;MAEzC,CAAA;KACA,CAAA,CAEJ;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA6C;KAEtD,CAAA,EACJ,EAAQ,YAAY,SAAS,IAC5B,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAQ,YAAY,KAClB,MACC,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAK;OACD,CAAA,EACP,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAK;OACD,CAAA,CACH;QATC,EAAK,GASN,CAET;KACG,CAAA,GAEN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBAAgC;MAAmB,CAAA;KAC5D,CAAA,CAEJ;MACF;KACK"}
1
+ {"version":3,"file":"MeetingDetailPage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingDetailPage.tsx"],"sourcesContent":["import { useParams } from \"react-router-dom\";\nimport { CalendarDays, Users, Clock, Video } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetMeetingQuery,\n type MeetingParticipantFieldsFragment,\n type MeetingActionItemFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { formatCurrency } from \"../../utils/helpers\";\n\nexport function MeetingDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetMeetingQuery({\n variables: { id: id ?? \"\", workspaceId },\n skip: !workspaceId || !id,\n });\n\n const meeting = data?.meeting;\n\n if (loading) {\n return (\n <PageLayout title=\"Meeting Details\" description={`Meeting ID: ${id}`}>\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error || !meeting) {\n return (\n <PageLayout title=\"Meeting Details\" description={`Meeting ID: ${id}`}>\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 {error\n ? \"Failed to load meeting details. Please try again later.\"\n : \"Meeting not found.\"}\n </div>\n </PageLayout>\n );\n }\n\n const pendingActions = meeting.actionItems.filter(\n (a: MeetingActionItemFieldsFragment) => a.status !== \"COMPLETED\",\n ).length;\n\n return (\n <PageLayout title=\"Meeting Details\" description={meeting.title}>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Duration\"\n value={`${meeting.duration ?? 0} min`}\n icon={<Clock className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Participants\"\n value={String(meeting.participants.length)}\n icon={<Users className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Cost\"\n value={meeting.cost != null ? formatCurrency(meeting.cost) : \"N/A\"}\n description=\"Based on participant rates\"\n />\n <StatCard\n title=\"Action Items\"\n value={String(meeting.actionItems.length)}\n description={`${pendingActions} pending`}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Participants\n </h3>\n {meeting.participants.length > 0 ? (\n <div className=\"space-y-2\">\n {meeting.participants.map(\n (p: MeetingParticipantFieldsFragment) => (\n <div\n key={p.id}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle px-3 py-2\"\n >\n <span className=\"text-sm text-text-primary\">{p.userId}</span>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary\">\n {p.role}\n </span>\n <span className=\"inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {p.status}\n </span>\n </div>\n </div>\n ),\n )}\n </div>\n ) : (\n <div className=\"flex h-32 items-center justify-center rounded-lg border border-dashed border-border-subtle\">\n <p className=\"text-sm text-text-secondary\">\n No participants added\n </p>\n </div>\n )}\n </div>\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Action Items\n </h3>\n {meeting.actionItems.length > 0 ? (\n <div className=\"space-y-2\">\n {meeting.actionItems.map(\n (item: MeetingActionItemFieldsFragment) => (\n <div\n key={item.id}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle px-3 py-2\"\n >\n <span className=\"text-sm text-text-primary\">\n {item.title}\n </span>\n <span className=\"inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {item.status}\n </span>\n </div>\n ),\n )}\n </div>\n ) : (\n <div className=\"flex h-32 items-center justify-center rounded-lg border border-dashed border-border-subtle\">\n <p className=\"text-sm text-text-secondary\">No action items</p>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,IAAoB;CAClC,IAAM,EAAE,UAAO,GAA2B,EACpC,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAmB;EAClD,WAAW;GAAE,IAAI,KAAM;GAAI;GAAa;EACxC,MAAM,CAAC,KAAe,CAAC;EACxB,CAAC,EAEI,IAAU,GAAM;AAEtB,KAAI,EACF,QACE,kBAAC,GAAD;EAAY,OAAM;EAAkB,aAAa,eAAe;YAC9D,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA;AAIjB,KAAI,KAAS,CAAC,EACZ,QACE,kBAAC,GAAD;EAAY,OAAM;EAAkB,aAAa,eAAe;YAC9D,kBAAC,OAAD;GAAK,WAAU;aACZ,IACG,4DACA;GACA,CAAA;EACK,CAAA;CAIjB,IAAM,IAAiB,EAAQ,YAAY,QACxC,MAAuC,EAAE,WAAW,YACtD,CAAC;AAEF,QACE,kBAAC,GAAD;EAAY,OAAM;EAAkB,aAAa,EAAQ;YAAzD,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAQ,YAAY,EAAE;KAChC,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,EAAQ,aAAa,OAAO;KAC1C,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAQ,QAAQ,OAAsC,QAA/B,EAAe,EAAQ,KAAK;KAC1D,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,EAAQ,YAAY,OAAO;KACzC,aAAa,GAAG,EAAe;KAC/B,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA+C;KAExD,CAAA,EACJ,EAAQ,aAAa,SAAS,IAC7B,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAQ,aAAa,KACnB,MACC,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,QAAD;OAAM,WAAU;iBAA6B,EAAE;OAAc,CAAA,EAC7D,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAE;QACE,CAAA,EACP,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAE;QACE,CAAA,CACH;SACF;QAZC,EAAE,GAYH,CAET;KACG,CAAA,GAEN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA;KACA,CAAA,CAEJ;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA+C;KAExD,CAAA,EACJ,EAAQ,YAAY,SAAS,IAC5B,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAQ,YAAY,KAClB,MACC,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAK;OACD,CAAA,EACP,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAK;OACD,CAAA,CACH;QATC,EAAK,GASN,CAET;KACG,CAAA,GAEN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAAmB,CAAA;KAC1D,CAAA,CAEJ;MACF;KACK"}
@@ -18,7 +18,7 @@ function u() {
18
18
  title: "Meetings",
19
19
  description: "Schedule and track meetings",
20
20
  actions: /* @__PURE__ */ l("button", {
21
- 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",
21
+ 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",
22
22
  children: [/* @__PURE__ */ c(o, { className: "h-4 w-4" }), "Schedule Meeting"]
23
23
  }),
24
24
  children: /* @__PURE__ */ c(r, {
@@ -36,28 +36,28 @@ function u() {
36
36
  title: "Meetings",
37
37
  description: "Schedule and track meetings",
38
38
  actions: /* @__PURE__ */ l("button", {
39
- 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",
39
+ 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",
40
40
  children: [/* @__PURE__ */ c(o, { className: "h-4 w-4" }), "Schedule Meeting"]
41
41
  }),
42
42
  children: /* @__PURE__ */ c("div", {
43
- className: "rounded-xl border border-border bg-card",
43
+ className: "rounded-xl border border-border-subtle bg-bg-surface",
44
44
  children: /* @__PURE__ */ c("div", {
45
45
  className: "divide-y divide-border",
46
46
  children: m.length === 0 ? /* @__PURE__ */ c("div", {
47
- className: "p-8 text-center text-sm text-muted-foreground",
47
+ className: "p-8 text-center text-sm text-text-secondary",
48
48
  children: "No meetings found."
49
49
  }) : m.map((e) => /* @__PURE__ */ l("div", {
50
- className: "flex items-center justify-between p-4 hover:bg-muted/50 transition-colors cursor-pointer",
50
+ className: "flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors cursor-pointer",
51
51
  children: [/* @__PURE__ */ l("div", {
52
52
  className: "flex items-center gap-3",
53
- children: [/* @__PURE__ */ c(a, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("div", {
53
+ children: [/* @__PURE__ */ c(a, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("div", {
54
54
  className: "flex items-center gap-2",
55
55
  children: [/* @__PURE__ */ c("p", {
56
- className: "text-sm font-medium text-foreground",
56
+ className: "text-sm font-medium text-text-primary",
57
57
  children: e.title
58
- }), e.recordingUrl && /* @__PURE__ */ c(s, { className: "h-3.5 w-3.5 text-muted-foreground" })]
58
+ }), e.recordingUrl && /* @__PURE__ */ c(s, { className: "h-3.5 w-3.5 text-text-secondary" })]
59
59
  }), /* @__PURE__ */ l("p", {
60
- className: "text-xs text-muted-foreground",
60
+ className: "text-xs text-text-secondary",
61
61
  children: [
62
62
  t(e.startTime),
63
63
  " ·",
@@ -72,10 +72,10 @@ function u() {
72
72
  }), /* @__PURE__ */ l("div", {
73
73
  className: "flex items-center gap-2",
74
74
  children: [/* @__PURE__ */ c("span", {
75
- className: "inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground",
75
+ className: "inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
76
76
  children: e.meetingType
77
77
  }), /* @__PURE__ */ c("span", {
78
- className: "inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground",
78
+ className: "inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
79
79
  children: e.endTime ? "completed" : "scheduled"
80
80
  })]
81
81
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"MeetingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingsPage.tsx"],"sourcesContent":["import { CalendarDays, Plus, Video } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatDate } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListMeetingsQuery,\n type MeetingFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function MeetingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListMeetingsQuery({\n variables: { workspaceId, limit: 20 },\n skip: !workspaceId,\n });\n\n const meetings = data?.meetings ?? [];\n\n if (loading) {\n return (\n <PageLayout\n title=\"Meetings\"\n description=\"Schedule and track meetings\"\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 Schedule Meeting\n </button>\n }\n >\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout title=\"Meetings\" description=\"Schedule and track meetings\">\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 meetings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Meetings\"\n description=\"Schedule and track meetings\"\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 Schedule Meeting\n </button>\n }\n >\n <div className=\"rounded-xl border border-border bg-card\">\n <div className=\"divide-y divide-border\">\n {meetings.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-muted-foreground\">\n No meetings found.\n </div>\n ) : (\n meetings.map((meeting: MeetingFieldsFragment) => (\n <div\n key={meeting.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 <CalendarDays className=\"h-5 w-5 text-muted-foreground\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-foreground\">\n {meeting.title}\n </p>\n {meeting.recordingUrl && (\n <Video className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {formatDate(meeting.startTime)} &middot;{\" \"}\n {meeting.duration ?? 0}min &middot;{\" \"}\n {meeting.participants.length} participants\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {meeting.meetingType}\n </span>\n <span className=\"inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {meeting.endTime ? \"completed\" : \"scheduled\"}\n </span>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,IAAe;CAC7B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAqB;EACpD,WAAW;GAAE;GAAa,OAAO;GAAI;EACrC,MAAM,CAAC;EACR,CAAC,EAEI,IAAW,GAAM,YAAY,EAAE;AA6BrC,QA3BI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,mBAErB;;YAGX,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAW,aAAY;YACvC,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,mBAErB;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAS,WAAW,IACnB,kBAAC,OAAD;KAAK,WAAU;eAAgD;KAEzD,CAAA,GAEN,EAAS,KAAK,MACZ,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAc,WAAU,iCAAkC,CAAA,EAC1D,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAQ;QACP,CAAA,EACH,EAAQ,gBACP,kBAAC,GAAD,EAAO,WAAU,qCAAsC,CAAA,CAErD;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAW,EAAQ,UAAU;QAAC;QAAU;QACxC,EAAQ,YAAY;QAAE;QAAa;QACnC,EAAQ,aAAa;QAAO;QAC3B;SACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAQ;OACJ,CAAA,EACP,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAQ,UAAU,cAAc;OAC5B,CAAA,CACH;QACF;OA7BC,EAAQ,GA6BT,CACN;IAEA,CAAA;GACF,CAAA;EACK,CAAA"}
1
+ {"version":3,"file":"MeetingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingsPage.tsx"],"sourcesContent":["import { CalendarDays, Plus, Video } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatDate } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListMeetingsQuery,\n type MeetingFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function MeetingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListMeetingsQuery({\n variables: { workspaceId, limit: 20 },\n skip: !workspaceId,\n });\n\n const meetings = data?.meetings ?? [];\n\n if (loading) {\n return (\n <PageLayout\n title=\"Meetings\"\n description=\"Schedule and track meetings\"\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 Schedule Meeting\n </button>\n }\n >\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout title=\"Meetings\" description=\"Schedule and track meetings\">\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 meetings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Meetings\"\n description=\"Schedule and track meetings\"\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 Schedule Meeting\n </button>\n }\n >\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface\">\n <div className=\"divide-y divide-border\">\n {meetings.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-text-secondary\">\n No meetings found.\n </div>\n ) : (\n meetings.map((meeting: MeetingFieldsFragment) => (\n <div\n key={meeting.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 <CalendarDays className=\"h-5 w-5 text-text-secondary\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-text-primary\">\n {meeting.title}\n </p>\n {meeting.recordingUrl && (\n <Video className=\"h-3.5 w-3.5 text-text-secondary\" />\n )}\n </div>\n <p className=\"text-xs text-text-secondary\">\n {formatDate(meeting.startTime)} &middot;{\" \"}\n {meeting.duration ?? 0}min &middot;{\" \"}\n {meeting.participants.length} participants\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {meeting.meetingType}\n </span>\n <span className=\"inline-flex rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {meeting.endTime ? \"completed\" : \"scheduled\"}\n </span>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,IAAe;CAC7B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAqB;EACpD,WAAW;GAAE;GAAa,OAAO;GAAI;EACrC,MAAM,CAAC;EACR,CAAC,EAEI,IAAW,GAAM,YAAY,EAAE;AA6BrC,QA3BI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,mBAErB;;YAGX,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAW,aAAY;YACvC,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,mBAErB;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAS,WAAW,IACnB,kBAAC,OAAD;KAAK,WAAU;eAA8C;KAEvD,CAAA,GAEN,EAAS,KAAK,MACZ,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAc,WAAU,+BAAgC,CAAA,EACxD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAQ;QACP,CAAA,EACH,EAAQ,gBACP,kBAAC,GAAD,EAAO,WAAU,mCAAoC,CAAA,CAEnD;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAW,EAAQ,UAAU;QAAC;QAAU;QACxC,EAAQ,YAAY;QAAE;QAAa;QACnC,EAAQ,aAAa;QAAO;QAC3B;SACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAQ;OACJ,CAAA,EACP,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAQ,UAAU,cAAc;OAC5B,CAAA,CACH;QACF;OA7BC,EAAQ,GA6BT,CACN;IAEA,CAAA;GACF,CAAA;EACK,CAAA"}
@@ -74,32 +74,32 @@ function u() {
74
74
  }), /* @__PURE__ */ l("div", {
75
75
  className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
76
76
  children: [/* @__PURE__ */ l("div", {
77
- className: "rounded-xl border border-border bg-card p-6",
77
+ className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
78
78
  children: [/* @__PURE__ */ l("div", {
79
79
  className: "mb-4 flex items-center gap-2",
80
80
  children: [/* @__PURE__ */ c(o, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ c("h3", {
81
- className: "text-sm font-semibold text-foreground",
81
+ className: "text-sm font-semibold text-text-primary",
82
82
  children: "Sessions per Day"
83
83
  })]
84
84
  }), /* @__PURE__ */ c("div", {
85
- className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
85
+ className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle",
86
86
  children: /* @__PURE__ */ c("p", {
87
- className: "text-sm text-muted-foreground",
87
+ className: "text-sm text-text-secondary",
88
88
  children: _.length > 0 ? `${x} completed out of ${_.length} sessions` : "No session data available"
89
89
  })
90
90
  })]
91
91
  }), /* @__PURE__ */ l("div", {
92
- className: "rounded-xl border border-border bg-card p-6",
92
+ className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
93
93
  children: [/* @__PURE__ */ l("div", {
94
94
  className: "mb-4 flex items-center gap-2",
95
95
  children: [/* @__PURE__ */ c(o, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ c("h3", {
96
- className: "text-sm font-semibold text-foreground",
96
+ className: "text-sm font-semibold text-text-primary",
97
97
  children: "Focus Distribution"
98
98
  })]
99
99
  }), /* @__PURE__ */ c("div", {
100
- className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
100
+ className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle",
101
101
  children: /* @__PURE__ */ c("p", {
102
- className: "text-sm text-muted-foreground",
102
+ className: "text-sm text-text-secondary",
103
103
  children: g ? `${g.streakDays} day streak · ${g.averageSessionMinutes}m avg session` : "No data available"
104
104
  })
105
105
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"PomodoroAnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/pomodoro/PomodoroAnalyticsPage.tsx"],"sourcesContent":["import { BarChart3, Target } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetPomodoroStatsQuery,\n useListPomodoroSessionsQuery,\n type PomodoroSessionFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function PomodoroAnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetPomodoroStatsQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const { data: sessionsData, loading: sessionsLoading } =\n useListPomodoroSessionsQuery({\n variables: { workspaceId, limit: 50 },\n skip: !workspaceId,\n });\n\n const stats = statsData?.pomodoroStats;\n const sessions = sessionsData?.pomodoroSessions ?? [];\n\n if (statsLoading || sessionsLoading) {\n return (\n <PageLayout\n title=\"Pomodoro Analytics\"\n description=\"Track your focus sessions and productivity\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (statsError) {\n return (\n <PageLayout\n title=\"Pomodoro Analytics\"\n description=\"Track your focus sessions 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 pomodoro analytics. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalFocusH = Math.floor((stats?.totalFocusMinutes ?? 0) / 60);\n const totalFocusM = (stats?.totalFocusMinutes ?? 0) % 60;\n const avgSessions = stats?.totalSessions\n ? (stats.totalSessions / 30).toFixed(1)\n : \"0\";\n const completedCount = sessions.filter(\n (s: PomodoroSessionFieldsFragment) => s.completed,\n ).length;\n\n return (\n <PageLayout\n title=\"Pomodoro Analytics\"\n description=\"Track your focus sessions and productivity\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Total Sessions\"\n value={String(stats?.totalSessions ?? 0)}\n trend={{\n value: stats?.completionRate ?? 0,\n label: \"completion rate\",\n }}\n />\n <StatCard\n title=\"Total Focus Time\"\n value={`${totalFocusH}h ${totalFocusM}m`}\n trend={{\n value: stats?.averageSessionMinutes ?? 0,\n label: \"avg min/session\",\n }}\n />\n <StatCard\n title=\"Avg. Sessions/Day\"\n value={avgSessions}\n description={`Target: ${stats?.totalSessions ?? 0} total`}\n />\n <StatCard\n title=\"Completion Rate\"\n value={`${stats?.completionRate ?? 0}%`}\n icon={<Target className=\"h-5 w-5\" />}\n trend={{ value: stats?.streakDays ?? 0, label: \"day streak\" }}\n />\n </div>\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 Sessions per Day\n </h3>\n </div>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border\">\n <p className=\"text-sm text-muted-foreground\">\n {sessions.length > 0\n ? `${completedCount} completed out of ${sessions.length} sessions`\n : \"No session data available\"}\n </p>\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 Focus Distribution\n </h3>\n </div>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border\">\n <p className=\"text-sm text-muted-foreground\">\n {stats\n ? `${stats.streakDays} day streak · ${stats.averageSessionMinutes}m avg session`\n : \"No data available\"}\n </p>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAWA,SAAgB,IAAwB;CACtC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAAyB;EAC3B,WAAW,EAAE,gBAAa;EAC1B,MAAM,CAAC;EACR,CAAC,EAEI,EAAE,MAAM,GAAc,SAAS,MACnC,EAA6B;EAC3B,WAAW;GAAE;GAAa,OAAO;GAAI;EACrC,MAAM,CAAC;EACR,CAAC,EAEE,IAAQ,GAAW,eACnB,IAAW,GAAc,oBAAoB,EAAE;AAErD,KAAI,KAAgB,EAClB,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,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;CAIjB,IAAM,IAAc,KAAK,OAAO,GAAO,qBAAqB,KAAK,GAAG,EAC9D,KAAe,GAAO,qBAAqB,KAAK,IAChD,IAAc,GAAO,iBACtB,EAAM,gBAAgB,IAAI,QAAQ,EAAE,GACrC,KACE,IAAiB,EAAS,QAC7B,MAAqC,EAAE,UACzC,CAAC;AAEF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAFd,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,iBAAiB,EAAE;KACxC,OAAO;MACL,OAAO,GAAO,kBAAkB;MAChC,OAAO;MACR;KACD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAY,IAAI,EAAY;KACtC,OAAO;MACL,OAAO,GAAO,yBAAyB;MACvC,OAAO;MACR;KACD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO;KACP,aAAa,WAAW,GAAO,iBAAiB,EAAE;KAClD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,GAAO,kBAAkB,EAAE;KACrC,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;KACpC,OAAO;MAAE,OAAO,GAAO,cAAc;MAAG,OAAO;MAAc;KAC7D,CAAA;IACE;MAEN,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,KAAD;MAAG,WAAU;gBACV,EAAS,SAAS,IACf,GAAG,EAAe,oBAAoB,EAAS,OAAO,aACtD;MACF,CAAA;KACA,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,KAAD;MAAG,WAAU;gBACV,IACG,GAAG,EAAM,WAAW,gBAAgB,EAAM,sBAAsB,iBAChE;MACF,CAAA;KACA,CAAA,CACF;MACF;KACK"}
1
+ {"version":3,"file":"PomodoroAnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/pomodoro/PomodoroAnalyticsPage.tsx"],"sourcesContent":["import { BarChart3, Target } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetPomodoroStatsQuery,\n useListPomodoroSessionsQuery,\n type PomodoroSessionFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function PomodoroAnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetPomodoroStatsQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const { data: sessionsData, loading: sessionsLoading } =\n useListPomodoroSessionsQuery({\n variables: { workspaceId, limit: 50 },\n skip: !workspaceId,\n });\n\n const stats = statsData?.pomodoroStats;\n const sessions = sessionsData?.pomodoroSessions ?? [];\n\n if (statsLoading || sessionsLoading) {\n return (\n <PageLayout\n title=\"Pomodoro Analytics\"\n description=\"Track your focus sessions and productivity\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (statsError) {\n return (\n <PageLayout\n title=\"Pomodoro Analytics\"\n description=\"Track your focus sessions 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 pomodoro analytics. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalFocusH = Math.floor((stats?.totalFocusMinutes ?? 0) / 60);\n const totalFocusM = (stats?.totalFocusMinutes ?? 0) % 60;\n const avgSessions = stats?.totalSessions\n ? (stats.totalSessions / 30).toFixed(1)\n : \"0\";\n const completedCount = sessions.filter(\n (s: PomodoroSessionFieldsFragment) => s.completed,\n ).length;\n\n return (\n <PageLayout\n title=\"Pomodoro Analytics\"\n description=\"Track your focus sessions and productivity\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Total Sessions\"\n value={String(stats?.totalSessions ?? 0)}\n trend={{\n value: stats?.completionRate ?? 0,\n label: \"completion rate\",\n }}\n />\n <StatCard\n title=\"Total Focus Time\"\n value={`${totalFocusH}h ${totalFocusM}m`}\n trend={{\n value: stats?.averageSessionMinutes ?? 0,\n label: \"avg min/session\",\n }}\n />\n <StatCard\n title=\"Avg. Sessions/Day\"\n value={avgSessions}\n description={`Target: ${stats?.totalSessions ?? 0} total`}\n />\n <StatCard\n title=\"Completion Rate\"\n value={`${stats?.completionRate ?? 0}%`}\n icon={<Target className=\"h-5 w-5\" />}\n trend={{ value: stats?.streakDays ?? 0, label: \"day streak\" }}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface 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 Sessions per Day\n </h3>\n </div>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle\">\n <p className=\"text-sm text-text-secondary\">\n {sessions.length > 0\n ? `${completedCount} completed out of ${sessions.length} sessions`\n : \"No session data available\"}\n </p>\n </div>\n </div>\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface 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 Focus Distribution\n </h3>\n </div>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle\">\n <p className=\"text-sm text-text-secondary\">\n {stats\n ? `${stats.streakDays} day streak · ${stats.averageSessionMinutes}m avg session`\n : \"No data available\"}\n </p>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAWA,SAAgB,IAAwB;CACtC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAAyB;EAC3B,WAAW,EAAE,gBAAa;EAC1B,MAAM,CAAC;EACR,CAAC,EAEI,EAAE,MAAM,GAAc,SAAS,MACnC,EAA6B;EAC3B,WAAW;GAAE;GAAa,OAAO;GAAI;EACrC,MAAM,CAAC;EACR,CAAC,EAEE,IAAQ,GAAW,eACnB,IAAW,GAAc,oBAAoB,EAAE;AAErD,KAAI,KAAgB,EAClB,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,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;CAIjB,IAAM,IAAc,KAAK,OAAO,GAAO,qBAAqB,KAAK,GAAG,EAC9D,KAAe,GAAO,qBAAqB,KAAK,IAChD,IAAc,GAAO,iBACtB,EAAM,gBAAgB,IAAI,QAAQ,EAAE,GACrC,KACE,IAAiB,EAAS,QAC7B,MAAqC,EAAE,UACzC,CAAC;AAEF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAFd,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,iBAAiB,EAAE;KACxC,OAAO;MACL,OAAO,GAAO,kBAAkB;MAChC,OAAO;MACR;KACD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAY,IAAI,EAAY;KACtC,OAAO;MACL,OAAO,GAAO,yBAAyB;MACvC,OAAO;MACR;KACD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO;KACP,aAAa,WAAW,GAAO,iBAAiB,EAAE;KAClD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,GAAO,kBAAkB,EAAE;KACrC,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;KACpC,OAAO;MAAE,OAAO,GAAO,cAAc;MAAG,OAAO;MAAc;KAC7D,CAAA;IACE;MAEN,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,KAAD;MAAG,WAAU;gBACV,EAAS,SAAS,IACf,GAAG,EAAe,oBAAoB,EAAS,OAAO,aACtD;MACF,CAAA;KACA,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,KAAD;MAAG,WAAU;gBACV,IACG,GAAG,EAAM,WAAW,gBAAgB,EAAM,sBAAsB,iBAChE;MACF,CAAA;KACA,CAAA,CACF;MACF;KACK"}
@@ -108,21 +108,21 @@ function _() {
108
108
  }), /* @__PURE__ */ h("div", {
109
109
  className: "mx-auto max-w-md",
110
110
  children: /* @__PURE__ */ g("div", {
111
- className: "rounded-xl border border-border bg-card p-8 text-center",
111
+ className: "rounded-xl border border-border-subtle bg-bg-surface p-8 text-center",
112
112
  children: [
113
113
  /* @__PURE__ */ h("div", {
114
114
  className: "mb-2",
115
115
  children: /* @__PURE__ */ h("span", {
116
- className: "inline-flex rounded-full bg-primary/10 px-3 py-1 text-xs font-medium text-primary",
116
+ className: "inline-flex rounded-full bg-action-primary-bg/10 px-3 py-1 text-xs font-medium text-primary",
117
117
  children: D ? "Focus Session" : "Ready"
118
118
  })
119
119
  }),
120
120
  /* @__PURE__ */ h("p", {
121
- className: "text-7xl font-mono font-bold text-foreground",
121
+ className: "text-7xl font-mono font-bold text-text-primary",
122
122
  children: M(O)
123
123
  }),
124
124
  /* @__PURE__ */ h("p", {
125
- className: "mt-2 text-sm text-muted-foreground",
125
+ className: "mt-2 text-sm text-text-secondary",
126
126
  children: E ? `${E.completedSessions} of ${E.totalSessions} sessions` : "No sessions yet"
127
127
  }),
128
128
  /* @__PURE__ */ g("div", {
@@ -130,21 +130,21 @@ function _() {
130
130
  children: [
131
131
  A ? /* @__PURE__ */ g("button", {
132
132
  onClick: () => j(!1),
133
- className: "inline-flex items-center gap-2 rounded-md bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90",
133
+ className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-6 py-3 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
134
134
  children: [/* @__PURE__ */ h(d, { className: "h-4 w-4" }), "Pause"]
135
135
  }) : /* @__PURE__ */ g("button", {
136
136
  onClick: N,
137
- className: "inline-flex items-center gap-2 rounded-md bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90",
137
+ className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-6 py-3 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
138
138
  children: [/* @__PURE__ */ h(f, { className: "h-4 w-4" }), "Start"]
139
139
  }),
140
140
  /* @__PURE__ */ g("button", {
141
141
  onClick: P,
142
- className: "inline-flex items-center gap-2 rounded-md border border-border px-4 py-3 text-sm font-medium text-foreground hover:bg-muted/50",
142
+ className: "inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
143
143
  children: [/* @__PURE__ */ h(m, { className: "h-4 w-4" }), "Skip"]
144
144
  }),
145
145
  /* @__PURE__ */ g("button", {
146
146
  onClick: F,
147
- className: "inline-flex items-center gap-2 rounded-md border border-border px-4 py-3 text-sm font-medium text-foreground hover:bg-muted/50",
147
+ className: "inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
148
148
  children: [/* @__PURE__ */ h(p, { className: "h-4 w-4" }), "Reset"]
149
149
  })
150
150
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"PomodoroPage.js","names":[],"sources":["../../../../src/timecampus/pages/pomodoro/PomodoroPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { Play, Pause, SkipForward, RotateCcw } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetActivePomodoroSessionQuery,\n useGetPomodoroStatsQuery,\n useStartPomodoroSessionMutation,\n useCompletePomodoroSessionMutation,\n} from \"@/generated/wspace-operations\";\n\nexport function PomodoroPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetPomodoroStatsQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const {\n data: activeData,\n loading: activeLoading,\n error: activeError,\n } = useGetActivePomodoroSessionQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const [startSession] = useStartPomodoroSessionMutation();\n const [completeSession] = useCompletePomodoroSessionMutation();\n\n const stats = statsData?.pomodoroStats;\n const activeSession = activeData?.activePomodoroSession;\n\n const [timerSeconds, setTimerSeconds] = useState(25 * 60);\n const [isRunning, setIsRunning] = useState(false);\n\n useEffect(() => {\n if (activeSession && !activeSession.completed) {\n const elapsed = Math.floor(\n (Date.now() - new Date(activeSession.startTime).getTime()) / 1000,\n );\n const duration = activeSession.duration ?? 25 * 60;\n const remaining = Math.max(0, duration - elapsed);\n setTimerSeconds(remaining);\n setIsRunning(remaining > 0);\n }\n }, [activeSession]);\n\n useEffect(() => {\n if (!isRunning || timerSeconds <= 0) return;\n const interval = setInterval(() => {\n setTimerSeconds((prev) => {\n if (prev <= 1) {\n setIsRunning(false);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n return () => clearInterval(interval);\n }, [isRunning, timerSeconds]);\n\n const formatTimer = (seconds: number) => {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n };\n\n const handleStart = useCallback(async () => {\n if (!workspaceId) return;\n if (activeSession && !activeSession.completed) {\n setIsRunning(true);\n return;\n }\n await startSession({\n variables: { input: { workspaceId, type: \"FOCUS\" as never } },\n refetchQueries: [\"GetActivePomodoroSession\", \"GetPomodoroStats\"],\n });\n setTimerSeconds(25 * 60);\n setIsRunning(true);\n }, [workspaceId, activeSession, startSession]);\n\n const handleComplete = useCallback(async () => {\n if (!activeSession || !workspaceId) return;\n await completeSession({\n variables: { id: activeSession.id, workspaceId },\n refetchQueries: [\"GetActivePomodoroSession\", \"GetPomodoroStats\"],\n });\n setIsRunning(false);\n setTimerSeconds(25 * 60);\n }, [activeSession, workspaceId, completeSession]);\n\n const handleReset = () => {\n setIsRunning(false);\n setTimerSeconds(25 * 60);\n };\n\n if (statsLoading || activeLoading) {\n return (\n <PageLayout\n title=\"Pomodoro Timer\"\n description=\"Focus with the Pomodoro Technique\"\n >\n <LoadingSkeleton variant=\"card\" count={3} />\n </PageLayout>\n );\n }\n\n if (statsError || activeError) {\n return (\n <PageLayout\n title=\"Pomodoro Timer\"\n description=\"Focus with the Pomodoro Technique\"\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 pomodoro data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalFocusH = Math.floor((stats?.totalFocusMinutes ?? 0) / 60);\n const totalFocusM = (stats?.totalFocusMinutes ?? 0) % 60;\n\n return (\n <PageLayout\n title=\"Pomodoro Timer\"\n description=\"Focus with the Pomodoro Technique\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <StatCard\n title=\"Sessions Today\"\n value={String(stats?.completedSessions ?? 0)}\n description={`Total: ${stats?.totalSessions ?? 0} sessions`}\n />\n <StatCard\n title=\"Focus Time\"\n value={`${totalFocusH}h ${totalFocusM}m`}\n trend={{\n value: stats?.completionRate ?? 0,\n label: \"completion rate\",\n }}\n />\n <StatCard\n title=\"Current Streak\"\n value={`${stats?.streakDays ?? 0} days`}\n description={`Avg: ${stats?.averageSessionMinutes ?? 0}m per session`}\n />\n </div>\n\n <div className=\"mx-auto max-w-md\">\n <div className=\"rounded-xl border border-border bg-card p-8 text-center\">\n <div className=\"mb-2\">\n <span className=\"inline-flex rounded-full bg-primary/10 px-3 py-1 text-xs font-medium text-primary\">\n {activeSession ? \"Focus Session\" : \"Ready\"}\n </span>\n </div>\n <p className=\"text-7xl font-mono font-bold text-foreground\">\n {formatTimer(timerSeconds)}\n </p>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {stats\n ? `${stats.completedSessions} of ${stats.totalSessions} sessions`\n : \"No sessions yet\"}\n </p>\n <div className=\"mt-6 flex items-center justify-center gap-3\">\n {!isRunning ? (\n <button\n onClick={handleStart}\n className=\"inline-flex items-center gap-2 rounded-md bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <Play className=\"h-4 w-4\" />\n Start\n </button>\n ) : (\n <button\n onClick={() => setIsRunning(false)}\n className=\"inline-flex items-center gap-2 rounded-md bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <Pause className=\"h-4 w-4\" />\n Pause\n </button>\n )}\n <button\n onClick={handleComplete}\n className=\"inline-flex items-center gap-2 rounded-md border border-border px-4 py-3 text-sm font-medium text-foreground hover:bg-muted/50\"\n >\n <SkipForward className=\"h-4 w-4\" />\n Skip\n </button>\n <button\n onClick={handleReset}\n className=\"inline-flex items-center gap-2 rounded-md border border-border px-4 py-3 text-sm font-medium text-foreground hover:bg-muted/50\"\n >\n <RotateCcw className=\"h-4 w-4\" />\n Reset\n </button>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PomodoroPage.js","names":[],"sources":["../../../../src/timecampus/pages/pomodoro/PomodoroPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { Play, Pause, SkipForward, RotateCcw } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetActivePomodoroSessionQuery,\n useGetPomodoroStatsQuery,\n useStartPomodoroSessionMutation,\n useCompletePomodoroSessionMutation,\n} from \"@/generated/wspace-operations\";\n\nexport function PomodoroPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetPomodoroStatsQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const {\n data: activeData,\n loading: activeLoading,\n error: activeError,\n } = useGetActivePomodoroSessionQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const [startSession] = useStartPomodoroSessionMutation();\n const [completeSession] = useCompletePomodoroSessionMutation();\n\n const stats = statsData?.pomodoroStats;\n const activeSession = activeData?.activePomodoroSession;\n\n const [timerSeconds, setTimerSeconds] = useState(25 * 60);\n const [isRunning, setIsRunning] = useState(false);\n\n useEffect(() => {\n if (activeSession && !activeSession.completed) {\n const elapsed = Math.floor(\n (Date.now() - new Date(activeSession.startTime).getTime()) / 1000,\n );\n const duration = activeSession.duration ?? 25 * 60;\n const remaining = Math.max(0, duration - elapsed);\n setTimerSeconds(remaining);\n setIsRunning(remaining > 0);\n }\n }, [activeSession]);\n\n useEffect(() => {\n if (!isRunning || timerSeconds <= 0) return;\n const interval = setInterval(() => {\n setTimerSeconds((prev) => {\n if (prev <= 1) {\n setIsRunning(false);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n return () => clearInterval(interval);\n }, [isRunning, timerSeconds]);\n\n const formatTimer = (seconds: number) => {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n };\n\n const handleStart = useCallback(async () => {\n if (!workspaceId) return;\n if (activeSession && !activeSession.completed) {\n setIsRunning(true);\n return;\n }\n await startSession({\n variables: { input: { workspaceId, type: \"FOCUS\" as never } },\n refetchQueries: [\"GetActivePomodoroSession\", \"GetPomodoroStats\"],\n });\n setTimerSeconds(25 * 60);\n setIsRunning(true);\n }, [workspaceId, activeSession, startSession]);\n\n const handleComplete = useCallback(async () => {\n if (!activeSession || !workspaceId) return;\n await completeSession({\n variables: { id: activeSession.id, workspaceId },\n refetchQueries: [\"GetActivePomodoroSession\", \"GetPomodoroStats\"],\n });\n setIsRunning(false);\n setTimerSeconds(25 * 60);\n }, [activeSession, workspaceId, completeSession]);\n\n const handleReset = () => {\n setIsRunning(false);\n setTimerSeconds(25 * 60);\n };\n\n if (statsLoading || activeLoading) {\n return (\n <PageLayout\n title=\"Pomodoro Timer\"\n description=\"Focus with the Pomodoro Technique\"\n >\n <LoadingSkeleton variant=\"card\" count={3} />\n </PageLayout>\n );\n }\n\n if (statsError || activeError) {\n return (\n <PageLayout\n title=\"Pomodoro Timer\"\n description=\"Focus with the Pomodoro Technique\"\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 pomodoro data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalFocusH = Math.floor((stats?.totalFocusMinutes ?? 0) / 60);\n const totalFocusM = (stats?.totalFocusMinutes ?? 0) % 60;\n\n return (\n <PageLayout\n title=\"Pomodoro Timer\"\n description=\"Focus with the Pomodoro Technique\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <StatCard\n title=\"Sessions Today\"\n value={String(stats?.completedSessions ?? 0)}\n description={`Total: ${stats?.totalSessions ?? 0} sessions`}\n />\n <StatCard\n title=\"Focus Time\"\n value={`${totalFocusH}h ${totalFocusM}m`}\n trend={{\n value: stats?.completionRate ?? 0,\n label: \"completion rate\",\n }}\n />\n <StatCard\n title=\"Current Streak\"\n value={`${stats?.streakDays ?? 0} days`}\n description={`Avg: ${stats?.averageSessionMinutes ?? 0}m per session`}\n />\n </div>\n\n <div className=\"mx-auto max-w-md\">\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-8 text-center\">\n <div className=\"mb-2\">\n <span className=\"inline-flex rounded-full bg-action-primary-bg/10 px-3 py-1 text-xs font-medium text-primary\">\n {activeSession ? \"Focus Session\" : \"Ready\"}\n </span>\n </div>\n <p className=\"text-7xl font-mono font-bold text-text-primary\">\n {formatTimer(timerSeconds)}\n </p>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {stats\n ? `${stats.completedSessions} of ${stats.totalSessions} sessions`\n : \"No sessions yet\"}\n </p>\n <div className=\"mt-6 flex items-center justify-center gap-3\">\n {!isRunning ? (\n <button\n onClick={handleStart}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-6 py-3 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Play className=\"h-4 w-4\" />\n Start\n </button>\n ) : (\n <button\n onClick={() => setIsRunning(false)}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-6 py-3 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Pause className=\"h-4 w-4\" />\n Pause\n </button>\n )}\n <button\n onClick={handleComplete}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n <SkipForward className=\"h-4 w-4\" />\n Skip\n </button>\n <button\n onClick={handleReset}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n <RotateCcw className=\"h-4 w-4\" />\n Reset\n </button>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}